OmniAICreator/Qiita-1.07M huggingface dataset:
ISMAP監査の概要

## 1. はじめに

ISMAP（Information System Security Management and Assessment Program）は、日本政府が定めるクラウドサービスのセキュリティ評価制度であり、政府機関が利用するクラウドサービスの適格性を判断するための基準を提供します。

---

## 2. ISMAPの概要

### 2.1 制度の目的

ISMAPは、政府機関が安全にクラウドサービスを利用できるよう、事前にセキュリティ基準を満たしているかを評価し、認定することを目的としています。これにより、政府機関の調達プロセスが効率化され、セキュリティリスクの低減が期待されます。

### 2.2 認証プロセス

ISMAPの認証プロセスは以下のステップで構成されています。

1. **事前準備**: クラウドサービス提供事業者（CSP）は、ISMAP要求事項に適合するように管理策を整備。
2. **監査の実施**: 認定された監査法人がCSPの管理策を監査し、適合性を評価。
3. **審査および登録**: ISMAP運営主体であるISMAP運営委員会が監査結果を審査し、適合していれば登録。
4. **継続的な監査**: 登録後も定期的な監査が求められ、基準適合性を維持する必要がある。

---

## 3. ISMAP監査の実施

### 3.1 監査プロセス

ISMAP監査は、ISO/IEC 27001やNIST SP 800シリーズの基準を参照しつつ、ISMAP独自の要件を満たしているかを評価します。監査プロセスは以下の流れで進行します。

- **事前評価（Pre-assessment）**: CSPの準備状況を確認し、ギャップ分析を実施。
- **本監査（Formal Audit）**: ISMAP基準に基づいた詳細な監査を実施し、文書・プロセス・技術的管理策を評価。
- **報告書作成（Audit Report）**: 監査結果をまとめ、ISMAP運営委員会へ提出。

### 3.2 監査の主要ポイント

ISMAP監査では、以下の領域が重点的に評価されます。

1. **情報セキュリティ管理**: ISMS（情報セキュリティマネジメントシステム）が適切に運用されているか。
2. **アクセス管理**: 適切なアクセス制御が設定され、不正アクセスが防止されているか。
3. **データ保護**: データの暗号化、バックアップ、消去プロセスが適切に運用されているか。
4. **インシデント対応**: セキュリティインシデントの検知、対応、報告プロセスが確立されているか。
5. **コンプライアンス管理**: 政府調達基準や法規制を満たしているか。

---

## 4. 監査実施時の課題

ISMAP監査の実施には以下のような課題が伴います。

- **要求事項の厳格性**: ISMAPの基準は詳細であり、CSPにとって適合のハードルが高い。
- **証跡管理の負担**: 各管理策の実施状況を証明するためのドキュメント作成が負担となる。
- **継続的な改善要求**: 認定後も定期監査が必要であり、基準変更に対応し続ける必要がある。

---

## 5. 改善提案

1. **CSP向けの準備ガイドラインの充実**: ISMAP要求事項の解釈を明確にし、CSPが準備を効率的に進められるようにする。
2. **監査プロセスの標準化**: 監査法人間での評価基準のバラつきを減らし、一貫性を持たせる。
3. **クラウド特有のセキュリティリスク対応の強化**: ゼロトラストアーキテクチャなど最新のセキュリティモデルをISMAP基準に組み込む。

---

## 6. 結論

ISMAPは、政府機関が利用するクラウドサービスのセキュリティを担保する重要な制度であり、監査法人にとっても高い専門性が求められます。今後、監査プロセスの効率化やCSPの負担軽減を図ることで、ISMAPの有効性をさらに高めていくことが求められます。
コーディングAIツール比較 ２０２５年３月

2025年3月時点で、市場で最高のコーディングAIツールを選ぶのは、開発者のニーズやプロジェクトの要件によって異なりますが、現在のトレンドや評価に基づいて、いくつかの有力候補を挙げて比較します。以下は、市場で最も優れているとされるコーディングAIツールとその特徴です。

### 1. **GitHub Copilot**
- **概要**: OpenAIとGitHubが共同開発したAIコーディングアシスタント。コード補完や提案に特化し、VS CodeやJetBrainsなどの主要IDEに統合可能。
- **強み**:
  - リアルタイムでコンテキストを理解したコード提案（単一行から関数全体まで）。
  - 多言語対応（Python、JavaScript、C++など）。
  - Copilot Chatで自然言語による対話が可能。
- **弱点**: 複雑なプロジェクト全体のコンテキスト理解がやや弱く、提案コードに時折調整が必要。
- **料金**: 個人$10/月、ビジネス$19/ユーザー/月（学生やOSS貢献者は無料）。
- **評価**: 初心者からプロまで幅広く支持され、導入の手軽さと信頼性で市場をリード。

### 2. **Cursor**
- **概要**: VS CodeをベースにしたAI特化型エディタ。プロジェクト全体のコンテキスト理解と自然言語指示でのコード生成が特徴。
- **強み**:
  - 複数ファイルにまたがる編集や高度なコード補完（タブ補完や自動インポート機能）。
  - Composer機能で自然言語による大規模なコード変更が可能。
  - 高速レスポンス（例: 補完速度がCopilotより速いとの報告）。
- **弱点**: 新しいエディタへの適応が必要で、リソース消費がやや多い。
- **料金**: 無料プラン（月2,000回補完）、Pro $20/月、ビジネス $40/ユーザー/月。
- **評価**: 複雑なプロジェクトや革新的なワークフローを求める開発者に人気急上昇中。

### 3. **Claude (Sonnet 3.5 by Anthropic)**
- **概要**: Anthropicが開発したAIモデルで、コーディング支援にも優れる。精度と安全性が強調されている。
- **強み**:
  - 高い精度と「ハルシネーション（誤った提案）」の少なさ。
  - マルチファイル処理やタスク計画に強い。
  - 自然言語でのコード生成やデバッグがスムーズ。
- **弱点**: 専用IDEではなく、APIやチャット経由での利用が主。
- **料金**: 無料版あり、Pro $20/月、APIはカスタム料金。
- **評価**: 精度重視の開発者やセキュリティを気にするチームに支持され、汎用性が高い。

### 4. **OpenAI o1**
- **概要**: OpenAIの最新モデルで、複雑な問題解決とデバッグに特化。
- **強み**:
  - 高度な論理的推論による複雑なコード生成とエラー修正。
  - マルチファイルや大規模プロジェクトに対応。
  - Pythonなどでのパフォーマンスが際立つ。
- **弱点**: 処理速度が遅く、コストが高い。
- **料金**: ChatGPT Plus $20/月、Pro $200/月（優先アクセス）。
- **評価**: 高難度タスクに挑む上級者向けで、パフォーマンスはトップクラス。

### 5. **Codeium**
- **概要**: GitHub Copilotの無料代替として注目されるAIコード補完ツール。
- **強み**:
  - 無料プランでも高品質な提案（個人利用は無制限）。
  - リファクタリングや多言語サポートが充実。
  - 軽量で高速。
- **弱点**: CopilotやCursorほどの知名度やエコシステムがない。
- **料金**: 個人無料、チーム$12/ユーザー/月、エンタープライズはカスタム。
- **評価**: コストを抑えたい個人開発者や小規模チームに最適。

---

### 比較とおすすめ
| ツール          | ベストユースケース                  | コストパフォーマンス | 総合評価       |
|-----------------|-------------------------------|---------------------|----------------|
| GitHub Copilot  | 手軽さと汎用性                  | ★★★★☆              | 初心者～中級者向け |
| Cursor          | プロジェクト全体の効率化         | ★★★★★              | 上級者向け        |
| Claude Sonnet 3.5 | 精度と安全性                   | ★★★★☆              | 汎用性重視       |
| OpenAI o1       | 複雑な問題解決                  | ★★★☆☆              | 専門家向け       |
| Codeium         | 無料で高品質なコーディング       | ★★★★★              | 予算重視         |

---

### 結論: 市場で「最高」は何か？
- **総合的に最も優れている**: **Cursor**  
  理由: プロジェクト全体のコンテキスト理解、高速な補完、自然言語での柔軟な操作性が2025年のトレンドにマッチ。開発者コミュニティでも「次世代のCopilot」と評されることが多い。
- **コストパフォーマンス最高**: **Codeium**  
  理由: 無料でCopilot並みの機能を提供し、小規模プロジェクトや個人開発者に最適。
- **初心者におすすめ**: **GitHub Copilot**  
  理由: 既存IDEへの簡単な統合と直感的な操作性で、学習コストが低い。

最終的な選択は、あなたの具体的なニーズ（予算、プロジェクト規模、使用言語、チーム環境など）次第です。例えば、単純なコード補完ならCopilot、複雑な編集や革新性を求めるならCursor、無料で試したいならCodeiumが有力候補です。まずは無料プランやトライアルを活用して、自分のワークフローに合うか試してみることをお勧めします！
Unity+MCP(Claude)：自然言語でゲーム作成を試してみた（Vibeコーディング）

こんにちは。bamboo-houseです。
Unity+MCP(Claude)で人型カプセルがトランポリンの上でぴょんぴょん跳ねるシーンを一瞬で作れたので、環境構築等を共有します！

## 動作動画

![unity-mcpトランポリン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/ad12aa43-f436-4572-b8f3-30ededdd070d.gif)


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

## Unity+MCPライブラリ
https://github.com/justinpbarnett/unity-mcp

## バージョン
- Unity 2020.3 LTS or 最新（⚠️ 必ずURPを使ってください）
- Python 3.12 or 最新
- uv package manager

## 1. Pythonのインストール
python.org から Python 3.12 以降をダウンロードしてインストールしてください。  
インストール時に、Python をシステムの PATH に追加することをお忘れなく。


#### Mac
```bash
brew install python@3.13
```

## 2. uvのインストール
`uv` は依存関係管理を簡素化する Python パッケージマネージャーです。  
以下のコマンドを使用して、OS に応じた方法でインストールしてください。

#### Mac
```bash
brew install uv
```

#### Windows
```bash
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
その後、uv を PATH に追加します:
```bash
set Path=%USERPROFILE%\.local\bin;%Path%
```

#### Linux
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

その他のインストール方法については、[uvのインストールガイド](https://docs.astral.sh/uv/getting-started/installation/)をご参照ください。
重要: uvをインストールせずに先に進まないでください。

## 3. Unity パッケージのインストール
1. Unity を開き、メニューから Window > Package Manager を選択します。

2. プラス（+）ボタンをクリックし、「Add package from git URL」を選びます。

3. urlを入力してEnter押します: ```https://github.com/justinpbarnett/unity-mcp.git```

これでMCPサーバーの準備はOKです。


## 4. Claude Desktopをダウンロード
[こちらのページ](https://claude.ai/download)からClaude for Desktopをダウンロードしましょう。

https://claude.ai/download



## 5. ClaudeとUnityを接続
1. Unityを開き、メニューから Window > Unity MCPを選択します。
2. MCP Editorの「Auto Configure Claude Desktop」を押します。
![](https://storage.googleapis.com/zenn-user-upload/9e7363619e6c-20250325.png)
緑のポチになればOKです。

3. Claudeを一度閉じて開きなおして、ハンマーマークの値が増えていることを確認します。
![](https://storage.googleapis.com/zenn-user-upload/c09eb7ffae64-20250325.png)


## 6. 試してみる
実際にCluadeで、「固定のトランポリンを設置して、その上で人型のオブジェクトをバウンドさせて」と送ってみましょう。
「"unityMCP"（ローカル）からのツールを許可しますか？」と表示されたら「このチャットを許可」を押していきます。
数秒ほどで自動で作成できたかと思います！

## 最後に
以上で、Unity+MCP(Claude)で簡単なシーンを作成できました！
MCP自体はまだまだ新しい概念になるので、これからの発展に期待大です。
私自身、ゲーム開発の実務経験はないのですが、Vibeコーディングを駆使してゲームを開発してみたいと思いました😊
Claudeではなく、Cursorでも動作するので気になる人は試してみてください。

# 宣伝
私たちのチームではWebXR技術を利用したVRゲーム配信プラットフォーム事業を行なっています。
また、直近ではAIとVRゲームを融合した今までにないゲーム開発も進行中です。
ご興味がありましたら、こちらのお問い合わせフォームからご連絡ください！

https://docs.google.com/forms/d/e/1FAIpQLSc0U1_wbds__1D8P3zr2AIbrbUIT0CuUysKOj1eSofj5erwqA/viewform?usp=dialog

## 参考
https://modelcontextprotocol.io/quickstart/server
https://github.com/justinpbarnett/unity-mcp
特定の文字列を含む配列、オブジェクトの型エラーを解決する【as const】

特定の文字列を含む配列やオブジェクトについて、`as const`をつけることで型エラーを解決できる場合があります。

## 例

```TypeScript
const fruit = {
  name: "apple",
  color: "red",
};

function printFruit(fruit: { name: "apple"; color: "red" }) {
  console.log(`name: ${fruit.name}, color: ${fruit.color}`);
}

printFruit(fruit); // エラー: 引数の型が一致しない
```

https://www.typescriptlang.org/ja/play/?#code/MYewdgzgLgBAZgJwK4EtYF4YG8CwAoGGMAQwFsBTALhgCJiAHegG3JoBp9DQmQFqaE5ACbt8AXwDc+fHCRhgUFOBj0EKMFABiyNAApEqKNSxEyVWg2asJMbr36CRMMQEpsnW+AggWAOh4A5roABiQU1AAkWAZovmHkYmyePHwwUTFQvnYIYsEuUnhi0niq6lo6UPoV+TAA9LUwgBUMgJcMgD8M1ICo+oAOpoB2DIDR6oAyDIAAcoAvgYDqDIBWDIAiDEA


```TypeScript
const fruit = {
  name: "apple",
  color: "red",
} as const;

function printFruit(fruit: { name: "apple"; color: "red" }) {
  console.log(`name: ${fruit.name}, color: ${fruit.color}`);
}

printFruit(fruit);
```

https://www.typescriptlang.org/ja/play/?#code/MYewdgzgLgBAZgJwK4EtYF4YG8CwAoGGMAQwFsBTALhgCJiAHegG3JoBp9DQmQFqaE5ACbt8AXxjEIMUJCgBufPjhIwwKCnAx6CFGCgAxZGgAUiVFGpYiZKrQbNW8mSB59agkTDEBKbJxdIV3IAOh4AcxMAAxIKagASLHM0ENjyMTYXNwSk4ygQ7l4xKJ9FPDElPB09QzyzPNKgA

## なぜこうなった？

TypeScript の `as const` は不変な値を示す型アサーションです。

`as const` を使用せずに配列やオブジェクトを定義した場合、その値はあとから変更されることを想定してリテラル型としてではなくより一般的な型（ `string` や `number` など）に推論されます。

一方で `as const` を使用した場合は変更しないことを明示するため、リテラル型として推論されます。

なので、特定の値を持つことが要求される場面では `as const` を使用することで型エラーを回避する事ができます。
GitHub Copilot vs Cursor

GitHub CopilotとCursorは、どちらもAIを活用したコーディング支援ツールとして人気がありますが、それぞれ異なるアプローチと特徴を持っています。以下に両者の比較を詳しく説明します。

### 1. **概要**
- **GitHub Copilot**: GitHubとOpenAIが共同開発したAIコーディングアシスタント。既存のIDE（VS Code、JetBrains、Visual Studioなど）にプラグインとして統合され、リアルタイムでコード補完や提案を行います。主にOpenAIのCodexモデルをベースにしています。
- **Cursor**: VS Codeをフォークして作られたスタンドアロン型のAI特化コードエディタ。AI機能が深く統合されており、コード補完だけでなく、プロジェクト全体のコンテキスト理解や自然言語での指示に基づくコード生成が強みです。

### 2. **主な特徴**
#### GitHub Copilot
- **コード補完**: 入力中にインラインでコードを提案。特に単一行や関数単位での補完が得意。
- **幅広いIDE対応**: VS Codeだけでなく、他の主要IDEにも対応しており、既存の開発環境に簡単に追加可能。
- **GitHub連携**: GitHub上の膨大なコードベースを活用し、実世界のコードパターンに基づく提案が強み。
- **チャット機能**: Copilot Chatを通じてコードの説明や改善提案を求めることができる。

#### Cursor
- **プロジェクト全体の理解**: コードベース全体を解析し、コンテキストを考慮した提案が可能。複数ファイルにまたがる編集も得意。
- **自然言語処理**: チャット機能（Cmd + L）やComposerを通じて、「この機能を追加して」といった自然言語の指示でコードを生成・編集。
- **タブ補完**: 複数行のコードを予測し、タブキーで簡単に適用。未インポートなシンボルも自動インポートする機能あり。
- **カスタマイズ性**: `.cursorrules`ファイルでプロジェクト固有のルールを設定可能。

### 3. **使いやすさ**
- **GitHub Copilot**: 既存のIDEにプラグインとして追加するだけなので、導入が簡単。初心者や既存のワークフローを変えたくない人に向いている。
- **Cursor**: スタンドアロン型のため、新しいエディタに慣れる必要がある。ただし、VS Codeベースなので移行は比較的スムーズ。高度なAI機能を求める場合、初期の学習コストがある。

### 4. **パフォーマンス**
- **GitHub Copilot**: 小規模なタスクやボイラープレートコードの生成で高速かつ正確。ただし、複雑なプロジェクトではコンテキスト理解が不足する場合がある。
- **Cursor**: 大規模プロジェクトや複雑な編集で優位性があり、提案の精度やスピードがCopilotより高いとの声も（例: コード補完のレスポンスが320ms vs Copilotの890msという報告あり）。ただし、リソースを多く使う可能性がある。

### 5. **料金**
- **GitHub Copilot**:
  - 個人プラン: $10/月または$100/年
  - ビジネスプラン: $19/ユーザー/月
  - 無料枠: 学生やオープンソース貢献者に提供。
- **Cursor**:
  - 無料プラン: 月2,000回の補完（制限あり）
  - Proプラン: $20/月（無制限補完＋高速リクエスト）
  - ビジネスプラン: $40/ユーザー/月（チーム向け機能追加）

### 6. **メリットとデメリット**
#### GitHub Copilot
- **メリット**: 手軽に始められ、幅広い言語や環境に対応。GitHubエコシステムとの親和性が高い。
- **デメリット**: プロジェクト全体のコンテキスト理解が弱く、複雑なタスクでは手動調整が必要な場合がある。

#### Cursor
- **メリット**: プロジェクト全体を把握した提案や高度な自動化が可能。AIとの対話性が強く、カスタマイズ性が高い。
- **デメリット**: スタンドアロン型のため、既存ツールとの統合が限定的。Copilotよりコストが高い。

### 7. **どちらを選ぶべきか**
- **GitHub Copilotが向いている人**:
  - 既存のIDEをそのまま使いたい人
  - 小規模なタスクや素早いコード補完を求める人
  - 予算を抑えたい人（$10/月で十分な機能）
- **Cursorが向いている人**:
  - 大規模プロジェクトや複雑な編集を効率化したい人
  - 自然言語でAIと対話し、コードを柔軟に生成・修正したい人
  - VS Codeベースの新しいエディタを試したい人

### 結論
2025年3月時点では、どちらも高い性能を発揮しますが、用途で使い分けが可能です。単純な補完や手軽さを求めるなら**GitHub Copilot**、プロジェクト全体を意識した高度なAI支援を求めるなら**Cursor**が適しています。両者を試してみて、自分のワークフローに合う方を選ぶのがおすすめです。特にCursorの無料プランを試すと、その違いが体感しやすいでしょう。
【PowerShell】WinMergeの結果を自動判定してExcelに出力する方法

# 【PowerShell】WinMergeの結果を自動判定してExcelに出力する方法

## 🏆 はじめに  
ある日、上司からこんな指示が飛んできました。

---

👨‍💼 **上司：「これ、700本分のコンペア結果、確認しておいて」**  

👨‍💻 **「……はい？」**  

👨‍💼 **上司：「WinMergeで差異チェックして、OKとNGを確認してまとめておいてね」**  

👨‍💻 **「えっ、700本ですよ？」**  

👨‍💼 **上司：「そうそう、すぐ終わるでしょ？」**  

👨‍💻 **「（いや、終わるわけないだろ…）」**  

---

WinMergeで700本の比較結果を手動で確認しろと言われたけれど、**そんなの現実的に無理**。  
目視で確認すると、**ミスや見落とし** も避けられない。  
そこで、**PowerShellで自動化** して解決することにしました。  

---

## 🎯 課題  
- WinMerge の差異チェックを手動で確認している  
- A列とB列がオレンジの場合に NG と判定したい  
- コメント行（`*` で始まる行）はOKとして無視したい  
- **700本ものファイルを手作業で確認するのは無理がある**  
- 最終的に結果をExcelに出力してまとめたい  

---

## 💡 解決策  
- **WinMergeの比較結果をExcelに出力**  
   → WinMerge で差異を比較し、その結果をExcel形式（またはCSV形式）で保存  
- PowerShellのCOMオブジェクト (`Excel.Application`) を使用してExcelを操作  
- セルの背景色を取得してオレンジ色（RGB(239, 203, 5)）を識別  
- `*` で始まる行は自動的に「OK」として無視  
- 結果をExcelにまとめて出力  

---

## 🛠️ コード  

### 📌 ExcelのCOMオブジェクトを使用してExcelを開く  
**WinMergeの結果をExcelに保存した後、そのExcelを開いて処理を行います**。

```powershell
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open($excelFile.FullName)
$Sheet = $Workbook.Sheets.Item(1)
```
### 📌 オレンジ色の判定（RGB値を使用）
```powershell
# RGB(239, 203, 5) を10進数に変換
$orangeRGB = 5 + (203 * 256) + (239 * 256 * 256)  

$leftBgColor = $Sheet.Cells.Item($row, 1).Interior.Color
$rightBgColor = $Sheet.Cells.Item($row, 2).Interior.Color

$isLeftOrange = ($leftBgColor -eq $orangeRGB)
$isRightOrange = ($rightBgColor -eq $orangeRGB)
```
### 📌 コメント行（* で始まる行）を無視
```powershell
if (($leftCell -match "^\*") -or ($rightCell -match "^\*")) {
    continue
}
```
### 📌 A列とB列が両方オレンジの場合はNG判定
A列とB列のどちらもオレンジの場合は「差異あり（NG）」と判定します。
```powershell
if ($isLeftOrange -and $isRightOrange) {
    $hasNG = $true
}
```
### 📌 A列がB列の先頭部分に一致している場合はOK
A列の文字列がB列の文字列の先頭部分に一致している場合はOKとします。
```powershell
if ([string]$rightCell.StartsWith([string]$leftCell)) {
    continue
}
```
### 📌 結果をExcelに出力
```powershell
$summaryResults | Out-File -FilePath $outputFilePath -Encoding UTF8
```
```yaml

---

## ✅ 動作マトリクス  
| 左オレンジ  | 右オレンジ  | 左*始まり   | 右*始まり  | 判定             
|------------|------------|------------|------------|------------------
| TRUE       | FALSE      | TRUE       | 気にしない  | コメント行としてOK
| TRUE       | FALSE      | FALSE      | 気にしない  | 差異としてNG      
| FALSE      | TRUE       | 気にしない  | TRUE       | コメント行としてOK 
| FALSE      | TRUE       | 気にしない  | FALSE      | 差異としてNG      
| TRUE       | TRUE       | 気にしない  | 気にしない  | **差異としてNG**  
| FALSE      | FALSE      | 気にしない  | 気にしない  | スキップ (対象外)  
---
```
## 🏁 実行結果  
Book1.xlsx OK
Book2.xlsx OK
Book3.xlsx NG
Book4.xlsx NG

## 🚨 注意点・ハマりどころ  
- `ImportExcel` モジュールは不要  
- Excelが閉じられない場合、Excelプロセスが残る可能性がある  
- RGB値の確認（Excelのカラーピッカーでチェック可能）  
- WinMergeの結果をExcelに出力する際、形式は一貫性を持たせる  

---

## 🏆 まとめ  
- **無茶な指示もPowerShellで秒で終わらせる**  
- 700本でも1000本でも対応可能  
- 目視チェックなしで確実な確認が可能
保全の現場に自由を：無線デバッグボックス「ICF（仮称）」の構成と運用

# はじめに
製造現場において、PLCなどの機器のデバッグやモニタリング作業を行う際、
接続ケーブルの長さによる移動制限や、物理的な作業負荷は地味ながらも確実にストレスの原因となります。

特に「PCをPLCに接続したまま、離れた場所のセンサやアクチュエータを確認したい」といったシチュエーションでは、
ケーブルの長さがネックとなり、現場とPCを何度も往復する必要が生じます。

本記事では、そうした問題を解消するために筆者が構築した、
**モバイル型の無線デバッグボックス「ICF（仮称）」**について、その構成と実運用の所感を紹介します。

# 解決したかった課題
PCがLANやUSBケーブルで機械に接続されているため、自由に動き回れず作業効率が低下していた

ケーブル延長では対応できない距離があり、デバッグやトラブル対応の即応性が著しく損なわれていた

特に、PLCとPCをオンライン接続した状態でセンサ確認が必要な際に、物理的な往復移動のコストが高かった

# 解決策：「ICF（仮称）」の構成
使用構成機器（抜粋）
無線LANルータ：GL.iNet製 [GL-AR300M-Ext]
↳ Wi-Fi環境を構築し、PCと無線接続

スイッチングハブ：ロジテック製 [LAN-SW03PSWE]
↳ PLCやHMIなどのLAN接続機器の中継

USBデバイスサーバ：サイレックス製 [DS-510]
↳ USB機器を無線でPCに接続可能に

モバイルバッテリー：Anker製 [PowerCore Essential 20000]
↳ 5V/2A出力で長時間駆動が可能（約14〜15時間）

筐体：タカチ電気工業製 [BCAP162113T]
↳ 可搬性・防塵性を考慮した樹脂ボックス

![xx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044224/3933f6e1-1bdb-4829-871f-4a898576d9c6.png)


## その他使用部材（簡易記載）
USB A-A ケーブル（25cm、1m）

USB A-microB 三股ケーブル

USB A-DCジャック変換ケーブル

USB変換コネクタ（KAUMO KM-UC210 / KM-UC179）

防水USBコネクタ（ANMBEST製）

LANケーブル（Cat6 フラット15cm）

Panasonic製のウォールプレート、LANジャック類

![nse-6154775839450002585-IMG_20250328_074930764.jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044224/5e191b1a-8252-47a1-97be-7685499c0aeb.jpeg)


![uploading...0]()


![image8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044224/c5b59611-6593-4105-a158-15d8cd788302.jpeg)


# 運用フロー
モバイルバッテリーを接続し、ICFを起動

ノートPCをWi-Fi経由でICFに接続

GX Works2/3、または任意のCOMポートソフトを起動

USB接続が必要な場合は、SX Virtual Link（サイレックス製）でデバイス割り当て

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044224/fab4737a-fb42-46de-885d-ef4b712ca391.png)


# 実運用で得られた効果
PC片手に機械周辺を移動しながらのデバッグが可能に

リアルタイムモニタリング中のセンサ確認・修正作業がスムーズに

古いPLC（例：三菱 Aシリーズ、富士電機 F120、東芝 T3 など）も
USBシリアル変換器を介せば使用可能 → 汎用性が非常に高い構成

筆者はこの構成を 5年間継続運用 していますが、
安定した電波環境下では「PLC全書き込み」や「RUN中書き込み」も問題なし。
安全性を優先するならモニタ専用と割り切るのも選択肢です。

# 従来構成との比較：USBの価値
従来の「Wi-Fiアクセスポイントのみの設置」と比較すると、
本構成では USB機器との接続を無線で維持できる 点が大きな強みです。

たとえば、HMIとPLCがイーサネットケーブルで直結されていて、
制御盤内にHUBが存在しない構成でも、
このボックスを経由すれば、物理USB接続と同じ感覚 でモニタ操作が可能です。

要するに、LANポートもUSBポートも、「自分のPCの物理位置」に縛られず使える のです。

# 運用上の注意点と工夫
USBデバイスサーバにはわずかな遅延の可能性があります
↳ 通信頻度の高い用途では注意（ただし実用上は問題なし）

Wi-Fiの干渉対策として、チャンネルの変更や電波調整が有効

樹脂ボックスは防塵性・電波透過性を考慮し、
外部端子から電源・接続ケーブルを扱えるように加工しています

# おわりに
この「ICF（仮称）」は、市販の部材と少しの工夫で構築できるにもかかわらず、
現場作業のストレスを大きく削減してくれる実践的なツールです。

「ケーブルからの解放」は、思った以上に技術者の集中力と判断力を取り戻してくれます。

同じような課題に直面している方へ、少しでも参考になれば幸いです。
Linux : cat コマンド

今回は「catコマンド」について紹介します。

1. [catコマンドとは？](#catコマンドとは)
1. [ファイルの中身を確認する](#ファイルの中身を確認)
1. [ファイルの中身を結合する](#ファイルの中身を結合)
1. [オプション](#オプションについて)

## catコマンドとは
catコマンドは**ファイルの中身を確認したり、ファイルの中身を結合したり**することができるコマンドです。

### 補足
例にて登場するテキストファイルの中身一覧
|ファイル名|ファイルの中身|
|:---:|:---:|
|sample.txt|sample|
|sample-2.txt|sample-2|


## ファイルの中身を確認
コマンドは、次のようになります。
```linux
$ cat 中身を確認したいファイル名
```

:::note warn
注意
中身を確認したいファイル名には、拡張子まで入力してください。
:::

> 例：sample.txtの中身を確認する場合
> ```
> cat sample.txt
> sample # 出力
> ```


## ファイルの中身を結合
コマンドは、次のようになります。

```
$ cat 結合したいファイル1 結合したいファイル2
```
> 例：sample.txtとsample-2.txtの中身を結合した場合
> ```bash
> cat sample.txt sample-2.txt # 以下が出力
> sample
> sample-2
> ```

catは、「concatenate（連結する）」の略称でもある。


## オプションについて

今回は触れないが、catコマンドには以下のようなオプションがある。

```bash
$ cat オプション 中身を確認したいファイル
```

|オプション|処理内容|
|:---:|:---:|
|-n|行番号を表示|
|-b|空白行を飛ばし、行番号を表示|
|-A|非表示文字を表示|
|-s|連続する空白行を1行に変換して表示|
|-E|各行の最後に「$」を表示|


## 終わりに
間違い等あれば、コメントしていただけると幸いです。
JetBrains社IDEを使用してデバッグ(ステップ実行)をしてみよう

## はじめに
エンジニアの皆さんは、プログラムが正しく実行されているかを確認する時に、どの様な手段でデバッグされているでしょうか？

## 手段として
大まかに以下の2つの手段が一般的ですかね。
1. コンソールに吐き出す
1. ログに出力

## 問題点
私が思いつく限りでは以下のケースですかね。
1. バグの発生源を探る時に、何処で発生しているかを特定するのに、時間が掛かってしまう
1. コンソールに吐き出したり・ログに吐き出したりして、デバッグしていると、デバッグ時に仕込んだ命令文を取り忘れて、本番にリリースしてしまう

2.について悪意を持ったエンドユーザーに、重要な情報を元にハッキング(大げさ)されてしまうかも知れません。

## そこで
JetBrains社IDEを使用してデバッグしてみましょう

## 環境
環境は以下の通り(今回はPyCharm Professionalを使用します)
Python：3.12.4(※)
PyCharm Professional：[2024.3.3](https://www.jetbrains.com/ja-jp/pycharm/)
OS：Windows10

※…前提条件としてPythonの新しめのバージョンをインストールしておきましょう。(今回はPython 3.12.4を使用しています。)

## デバッグの実施方法
1. Jupyter Notebookの2行目(①)にマウスカーソルを合わせます。すると赤い「●」が薄っすらと見えるのでその位置でマウスの右クリックをしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/5f463f1f-5dad-4fbe-9677-e7cbb9a0f4bf.png)
2. 赤い「●」が強調(①)されましたね。此方はブレークポイントと言ってプログラムが停止する場所になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/bed1c99e-3846-48f5-adcc-f7fb16ad9911.png)
3. セルのデバッグ(虫のアイコン)を押下(①)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/2d0bb083-4ad3-4e4a-83ff-5327aecafcf1.png)
4. プログラムが所定の位置で停止(①)して、変数の現在値(②)も表示される様になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/a1ed8cef-daba-4c64-a4be-a112d843483b.png)
5. デバッグを再開する場合にはデバッグアクション(①)→再開(②)と押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/8903cca4-7dbb-492f-bfa8-729a8d2c914f.png)
6. デバッガが終了(①)して、処理結果が表示されましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1117785/b4e97785-f461-4fe2-bca6-5094b5437e45.png)

## さいごに
如何でしょうか？
JetBrains社のIDEを使用する事によって、プログラムの処理途中でも知りたい情報が得られる様になり
コンソール出力やログ出力に頼らなくても、効率の良いデバッグが出来る事が分かりましたね。

皆様もIDEを便利な道具として上手く活用してみましょう。
Power QueryでのJSON型の動的な展開

## 概要
PowerQueryでJSONの展開をしているときに躓いたので記録。
組成がJSON列で表現された5000行のCSV(JSON列compのキーは1000種類あります)があったとして、これをPowerQueryで展開し、クロス表にしようとしていました。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/461a5baa-eadf-4d4a-b4a3-617247fb4818.png">


PowerQuery エディタでJSON列を解析すると出てくる[Record]列をさらに展開することでクロス表が得られますが、詳細エディターでコードをよくみると、展開するためのキーがハードコーディングされています。このままだと、キーの組み合わせが変わったときに対応しきれませんでした。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/b0e3449b-9b52-4981-831a-b2406139508d.png">
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/0d675503-6fdf-415a-9ae7-cb49684fcf2a.png">




```:power query UIで展開した場合のコード
let
    ソース = Csv.Document(File.Contents("csvのパス.csv"),[Delimiter=",", Columns=4, Encoding=932, QuoteStyle=QuoteStyle.None]),
    昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true]),
    #"解析された JSON" = Table.TransformColumns(昇格されたヘッダー数,{{"comp", Json.Document}}),
    #"展開された comp" = Table.ExpandRecordColumn(#"解析された JSON", "comp", {"391", "727", "28", "828", "53", "234", "838", "268", "997", "965"}, {"comp.391", "comp.727", "comp.28", "comp.828", "comp.53", "comp.234", "comp.838", "comp.268", "comp.997", "comp.965"})
in
    #"展開された comp"
```

## 解決法

[Record]列を展開するためのリストAllKeysListを「JSON列のキーの、一意な値のリスト」で定義します。


```powershell
let
    Source = Csv.Document(File.Contents("csvのパス.csv"), [Delimiter=",", Columns=4, Encoding=932, QuoteStyle=QuoteStyle.None]),
    PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),

    ParsedJSON = Table.TransformColumns(PromotedHeaders, {{"comp", Json.Document}}),

    AllKeysList = List.Distinct(List.Combine(List.Transform(ParsedJSON[comp], Record.FieldNames))),
    
    ExpandedComp = Table.ExpandRecordColumn(ParsedJSON, "comp", AllKeysList, AllKeysList)
in
    ExpandedComp
```

これで動的に展開されるようになりました。めでたし。
ところで、リストを結合して一意にする処理が入ったために、そこまで多くない行数にもかかわらず展開に1分くらいの時間がかかりました。当たり前ですが、ある程度行数が多いデータ or キーの種類が多いデータを扱いたいときはデータ構造を縦持ちにするなどしたほうがよいですね。

### 追記

行方向に展開してピボットするほうが早かったです。10秒くらいになりました。

```powershell
let
    Source = Csv.Document(File.Contents("csvのパス.csv"), [Delimiter=",", Columns=4, Encoding=932, QuoteStyle=QuoteStyle.None]),
    PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),

    ParsedJSON = Table.TransformColumns(PromotedHeaders, {{"comp", Json.Document}}),
    
    ExpandedToRows = Table.AddColumn(ParsedJSON, "ExpandedComp", each Record.ToTable([comp])),
    
    RemovedOriginalComp = Table.RemoveColumns(ExpandedToRows, {"comp"}),
    
    FlattenedTable = Table.ExpandTableColumn(RemovedOriginalComp, "ExpandedComp", {"Name", "Value"}),

    RenamedColumns = Table.RenameColumns(FlattenedTable, {{"Name", "Key"}, {"Value", "Value"}}),
    
    PivotedTable = Table.Pivot(
        RenamedColumns, 
        List.Distinct(RenamedColumns[Key]), // ユニークなKeyのリストを列として展開
        "Key",  // ピボットの基準となる列
        "Value", // セルの値となる列
        List.Sum // 値が重複する場合は合計（必要に応じて変更）
    )
in
    PivotedTable
```
World-writable config file 'hoge' is ignored.　を回避する(linux)

# 概要

mysqlコマンドで用いるdefaults-extra-fileのパーミッションが777のときに出るエラーを、パーミッション変更をせずに回避したい。

# エラー

```
$ mysql --defaults-extra-file=mysql_env_dev.txt
mysql: [Warning] World-writable config file 'mysql_env_dev.txt' is ignored.
```

# 普通の回避策

パーミッションを664とかにすればいけます。

# 普通の回避策が取れない事情の例

vagrantの共有フォルダ内での作業だったので、chmodが効きません。

# 回避

```
$ mysql --defaults-extra-file=<(echo mysql_env_dev.txt)
```

プロセス置換を用いることで回避できました。

# ポエム１

vagrantの共有フォルダ内のパーミッションの自由度の低さはどうにかならないのだろうか

# ポエム２

設定ファイル、そこまで厳重にしなきゃだめなものなのかしら

# ポエム３

プロセス置換って滅多に使わないので、使おうと思ったときにプロセス置換という名前すら記憶に残ってません。
毎回探すのに苦労します🥺
今回は「linux ファイル名のかわりにecho」で見つかりました

# 参考サイト

https://sc.megabank.tohoku.ac.jp/ph3-doc/howto/linux/shell-advanced.html
GigEカメラのポイント



GigEカメラのポイント

> IPアドレス
まず、GigEカメラとホスト側パソコンのイーサネットポートのIPアドレスの設定が必要です。大抵、各カメラメーカが配布しているビューワーソフトで設定できます。
（カメラの中にdipスイッチとは、シリアル接続で設定を行うなどの作業はありません。）

GigEカメラを選ぶ場合
10GBASE-T(10Gbps) 以上のHubを用いる。
あるいはGigE Visionフレームグラバーボードを用いる。


## トリガー信号
- 産業のカメラでは、画像を撮影するタイミングが重要になる。
- そのため、トリガー信号を利用できるようになっている。
- トリガー信号を利用することで、データ処理が必要なタイミングでだけ、画像を撮影すればよくなる。それ以外の画像を扱う必要がなくなるので、データ処理が単純になる。
- トリガー信号は、フラッシュとの連動でも必要だ。
- GigEの分野は産業用カメラであり、ワークの移動速度が高い場合もある。そのため、移動による動きブレを減らすために、露光時間を短くする。そこで、フラッシュで明るくすることが意味を持っている。
]()


> 6ピンコネクタからの外部電源供給またはPoE給電(Power over Ethernet)となります。
[引用元](https://sentech.co.jp/information/faq/gige-vision-m/3074)


## Cマウントのレンズ

[産業用カメラのレンズ規格　Cマウントとは](https://www.klv.co.jp/corner/industry-camera-c-mount.html)


[c マウントレンズ通販・販売特集](https://jp.misumi-ec.com/vona2/s_cate/c%20%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%83%AC%E3%83%B3%E3%82%BA/)


## GigEカメラの接続
[GigEカメラの接続設定は意外と難しい？](https://note.com/takizo540/n/na5f8b792291c)


[GigEカメラ接続時の注意点](https://ads-img.co.jp/mv/technical-data/gige/)

[ネットワークの設定（GigEカメラ）](https://ja.docs.baslerweb.com/network-configuration-(gige-cameras))

https://ja.docs.baslerweb.com/network-configuration-(gige-cameras)

## GigEカメラを使う産業用カメラシステムの特徴
- 産業用カメラは、ファクトリーオートメーションの用途の中で使われている。
- その分野で需要なプロトコールであるPLCとの連動性がよいシステムが必要になる。

## 産業用カメラの見つかる展示会
[画像センシング展](https://www.adcom-media.co.jp/iss/)

[国際画像機器展](https://www.adcom-media.co.jp/ite/)

### High Dynamic Rangeが必要な用途では
最近のイメージセンサでは、内部的な画像深度を8bitではなく、12bitで扱っているのが増えてきている。
12bitになっていることを適切に使いこなせば、画像が白飛びすることも黒つぶれすることもない撮影が可能になる。

以下のサイトはそのようなセンサの1例です。

[セキュリティカメラ用　イメージセンサー [製品]](https://www.sony-semicon.com/ja/products/is/security/security.html)

![](https://www.sony-semicon.com/files/62/p-3_lineup__graph.png)
図：　画像の解像度がどれだけ大きいセンサがあるのか、イメージセンサのセンサ面の大きさはどうなのかを示しています。
目的とする解像度でセンサを選んだときに、そのイメージセンサの大きさは決まります。そのイメージセンサに適したレンズを選ぶことになります。

## 使い方によって適切なセンサ・適切なレンズは変わる。
- 撮像したカメラで何をしたのかをはっきりさせる。
- どの距離から、どれくらいの大きさのものを撮影するのか
- どれくらいの細かさで撮影するのか


> 工場や物流において、従来人に頼っていた工程を、産業用カメラを用いてうまく効率化するには、それぞれの用途にあった画素サイズや画質を持つイメージセンサーをカメラに搭載する必要があります。

> 一般的に画素数を増やせばチップサイズが大型化し、結果としてカメラサイズも大きくなります。一方、カメラを小さくするために画素サイズを小さくすると、一画素当たりの集光面積が小さくなり、感度も飽和信号量も低くなり、画質劣化につながります。

[引用元](https://www.sony-semicon.com/ja/products/is/industry/global-shutter.html)

![Screenshot from 2025-06-07 15-45-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/51391620-ad97-4e10-a0d7-3ddb6b188ad8.png)

## マシンビジョンに求められること
- 処理の高速性。
- そのため、動的に処理内容が変化するAWB(auto white balance)やAGC(auto gain control) 、オートフォーカスなどの処理は嫌われる

## 産業用カメラとガンマ特性
- 産業用カメラの分野だと画像計測の意味合いが強いので、ガンマ補正を加えない画像を出力している場合が多い。
- 他方、デジタルカメラやスマートフォンでは、標準でガンマ補正が入った出力がされている。
- ガンマ補正がどのような効果などなのかについては、以下の記事が参考になる。
[ガンマ補正のうんちく](https://qiita.com/yoya/items/122b93970c190068c752)
生成AIを使ったコードか見分ける簡単な方法コメントをチェック

私もプログラミング勉強中で時々わからないところとかChatGPTに質問してコードを直したりします。ふと、おもいました

自分が各コードと生成AIが書いたコードって結構曲が違うよなと

そこでおもったのが2パターン

## コメントの書き方にクセがでる

生成AIでコードをかいていると細かくコードにコメントを入れてくれます。関数の上になんの処理か、関数を変数にいれるときの横にコメントを書いたり、人間だと書いたり書かなかったり

あとコメントが自分の書いたコード生成AIが書いたコードを入れていくとコメントのタイプが混在していきます #だったり　''' ''' や//だったりこれらが混在してたりします。

こんな感じでプログラミング初心者はコードに統一感がなくなってくるので、コードを見られると生成AIで書いたでしょって簡単にばれちゃいますね

試しにAIで上記の条件でコードを書いてもらいました

```

import random

# ランダムな数値のリストを生成する関数
def generate_random_numbers(count):
    """この関数は指定された数のランダムな数値を生成します。"""
    numbers = []  # 数値を格納するリスト
    for i in range(count):  # 指定回数ループ
        numbers.append(random.randint(1, 100))  # 1から100のランダムな数値を追加
    return numbers

"""
数値のリストを昇順にソートする関数
組み込みの sorted 関数を使用
"""
def sort_numbers(numbers):
    return sorted(numbers)  # リストをソート

# 平均値を計算する関数
def calculate_average(numbers):
    """数値のリストの平均を計算します。"""
    total = sum(numbers)  # 数値の合計を求める
    count = len(numbers)  # 数値の個数を取得
    return total / count  # 平均を計算

# メイン処理
if __name__ == "__main__":
    num_list = generate_random_numbers(10)  # 10個のランダムな数値を生成
    sorted_list = sort_numbers(num_list)
    avg = calculate_average(sorted_list)  # 平均値を計算

    # 結果を出力
    print("生成された数値:", num_list)
    print("ソートされた数値:", sorted_list)
    print("平均値:", avg)


```

こんな感じになるので、処理は問題ないですがコードが美しくないですよね

成長するコツはこういったコードを書いたあとに自分できれいに書き直すことが大事かなって思いました

ある程度プログラミング初心者がコードを書けるようになると、AIに書いてもらったコードが実は冗長的だったり効率が悪い処理などがあったりします。そいうのを見つけて、自分で買い直す練習をするのも楽しいものですよね

コメントは非常に重要なので、きれいに各クセをつける
ただコピペしないってことを意識して、この人自分でコードかけない人だとおもわれないようにしたいものです
VPNの仕組みと脆弱性、その対策

📝 はじめに

リモートワークや企業のシステム接続に広く利用されるVPN（Virtual Private Network）ですが、近年、VPNの脆弱性を突いたサイバー攻撃が増加しています。特にランサムウェア攻撃やゼロデイ攻撃の手口としても悪用されており、VPN＝安全という考えは通用しなくなっています。

本記事では、VPNの基本的な仕組み・脆弱性・攻撃事例・セキュリティ対策 について解説します。応用情報技術者試験（午後試験）の対策にも役立ててください！

✅ VPNの仕組み

🔹 VPNとは？
VPN（Virtual Private Network）とは、インターネットなどの公衆回線上に仮想的な専用回線を構築し、安全な通信を行う技術 です。

📌 主な用途：
	•	リモートワーク（自宅や外出先から社内ネットワークに接続）
	•	拠点間接続（異なるオフィス間で安全なデータ通信）
	•	プライバシー保護（インターネット通信を暗号化）

🔹 VPNの基本構成
[リモートPC] --(インターネット)-- [VPNサーバー] -- [社内ネットワーク]

🔑 ポイント：
	1.	暗号化されたトンネル（トンネリング）を作成
	2.	認証（ID/パスワード or 証明書）を経て接続
	3.	社内ネットワークに内部端末としてアクセス可能


🔍 VPNの主なプロトコル
VPNにはいくつかの種類があり、それぞれ暗号化方式や用途が異なります。
| プロトコル | 特徴 | セキュリティリスク |
|:-:|:-:|:-:|
| PPTP（Point-to-Point Tunneling Protocol）  | 古い方式、設定が簡単  | 脆弱な暗号化（MS-CHAPv2の脆弱性）  |
| L2TP/IPsec（Layer 2 Tunneling Protocol）  | IPsecと組み合わせた暗号化  | IPsec設定ミスによる攻撃  |
| OpenVPN  | TLSを使用し、比較的安全  |証明書管理ミスによるリスク   |
| WireGuard  | 高速で安全なVPN  |  比較的新しいため、採用企業が少ない |

📌 特に古いPPTPや設定ミスの多いL2TP/IPsecは攻撃の対象になりやすい！

❌ VPNの主な脆弱性と攻撃手法

VPNは安全な通信手段とされていますが、以下のような脆弱性が悪用されることがあります。

1️⃣ VPNのゼロデイ脆弱性を狙う攻撃

🔻 攻撃手法：
	•	VPN製品の未修正の脆弱性（ゼロデイ攻撃）を悪用
	•	Pulse Secure、Fortinet、Cisco VPN などの企業向けVPNが標的
	•	「VPN経由で企業ネットワークに侵入 → ランサムウェア展開」 という流れ

📌 対策：
✅ VPN製品の脆弱性情報を常に確認し、すぐにパッチ適用
✅ VPNを常時稼働させるのではなく、必要なときだけ有効化

⸻

2️⃣ VPNアカウントの流出・不正利用

🔻 攻撃手法：
	•	フィッシング攻撃でVPNのID・パスワードを盗む
	•	ダークウェブでVPNアカウントが売買される
	•	盗まれたアカウントで企業VPNに不正接続 → 社内システムを攻撃

📌 対策：
✅ 多要素認証（MFA）の導入（ID/パスワード + ワンタイムパスワード）
✅ パスワードの定期変更と管理徹底
✅ VPNアクセスログの監視（異常なログイン試行を検知）

⸻

3️⃣ VPNの設定ミス（IPsecや証明書の管理不備）

🔻 攻撃手法：
	•	IPsecの暗号鍵や証明書が漏洩
	•	VPNの設定ミスで平文データが流出
	•	脆弱な暗号アルゴリズム（例：DES, MD5）を使用し、攻撃される

📌 対策：
✅ 強力な暗号方式（AES-256, SHA-2）を使用
✅ VPNサーバーの設定を定期的に監査し、不要な設定を削除

⸻

4️⃣ VPNのトラフィック解析攻撃（ワイヤーシャークを使った盗聴）

🔻 攻撃手法：
	•	VPNの通信をワイヤーシャークなどでキャプチャし、脆弱な暗号を解析
	•	DNSリークにより、ユーザーのアクセス履歴が外部に漏れる

📌 対策：
✅ VPNの「DNSリーク防止設定」を有効化
✅ ワイヤーシャークでVPN通信の暗号化が適切か検証
✅ セキュアなDNS（DoH/DoT）を利用

⸻

✅ 企業でVPNを安全に運用する方法

VPNのリスクを低減し、安全に利用するためのベストプラクティスを紹介します。

1️⃣ VPNに依存しすぎない

🔻 従来の考え方：
	•	「VPNで接続すれば安全」 → 内部ネットワーク全体が攻撃対象になる

✅ 代替策（ゼロトラストモデル）
	•	VPN接続後も、アプリごとにアクセス制御を行う
	•	ZTNA（Zero Trust Network Access）の導入を検討

⸻

2️⃣ VPNの脆弱性情報を常に監視し、パッチ適用
	•	VPN製品のCVE情報を定期的にチェック
	•	管理者がVPNサーバーの設定ミスを防ぐ
	•	脆弱なプロトコル（PPTP, L2TP単独）の使用を避ける

⸻

3️⃣ VPN利用時のセキュリティ強化

✅ MFA（多要素認証）の導入
✅ VPNのアクセスログを監視し、不審なログインを検知
✅ 不要なユーザーのVPNアカウントを定期的に削除

⸻

🎯 まとめ

✅ VPNは便利だが、脆弱性を狙った攻撃が多発
✅ ゼロデイ攻撃・パスワード流出・設定ミスに注意
✅ 多要素認証やログ監視でセキュリティを強化
✅ VPNだけに依存せず、ゼロトラストの考え方も導入する
Hilbert曲線のインデックスと配置座標

こんにちは。
二次元[Hilbert曲線](https://ja.wikipedia.org/wiki/ヒルベルト曲線)のインデックスと配置座標との関係を求めました。

```console
$ ./hilbert.py 1
 0 1
 3 2
$ ./hilbert.py 2
  0  3  4  5
  1  2  7  6
 14 13  8  9
 15 12 11 10
$ ./hilbert.py 3
  0  1 14 15 16 19 20 21
  3  2 13 12 17 18 23 22
  4  7  8 11 30 29 24 25
  5  6  9 10 31 28 27 26
 58 57 54 53 32 35 36 37
 59 56 55 52 33 34 39 38
 60 61 50 51 46 45 40 41
 63 62 49 48 47 44 43 42
```

### Source code

```hilbert.py
#!/usr/bin/env python3

def hilbert(n):
    result = []
    range_j = [2**i for i in reversed(range(n))]
    for i in range(4**n):
        U = [[0, 0], [0, 1], [1, 1], [1, 0]]
        x, y = 0, 0
        for j in range_j:
            k = i // (j*j) % 4
            if k == 0:
                U[1], U[3] = U[3], U[1]
            elif k == 3:
                U[0], U[2] = U[2], U[0]
            x += U[k][0] * j
            y += U[k][1] * j
        result.append((x, y))
    return result

def hilbert_lookup(n):
    dict_ = dict(zip(hilbert(n),range(4**n)))
    return [[dict_[(i, j)] for j in range(2**n)] for i in range(2**n)]

import sys, math
n = 2 if len(sys.argv) == 1 else int(sys.argv[1])

n_digit = math.floor(math.log(4**n-1, 10)) + 1
for w in hilbert_lookup(n):
    for i in w:
        print(str(i).rjust(n_digit + 1, ' '), end="")
    print()
```
ゼロトラストとは？VPNとの違いと安全な運用方法

📝 はじめに
情報セキュリティ分野では、「ゼロトラスト」という概念が重要視されています。特に近年ではVPNの脆弱性を突いた攻撃やリモートワークの普及により、従来の境界防御型セキュリティが限界を迎えています。

本記事では、応用情報技術者試験（午後試験）対策として、ゼロトラストの概要・VPNとの違い・具体的な運用方法について解説します！

✅ ゼロトラストとは？

ゼロトラスト（Zero Trust）とは、「誰も信用しない」前提でセキュリティ対策を行うモデルです。従来の「社内は安全」「社外は危険」という考えではなく、すべてのアクセスを常に検証し、必要最小限のアクセス権のみ許可することを目的としています。

🔹 従来のセキュリティ（VPNベース）との違い
| 項目 | 従来のVPNセキュリティ | ゼロトラスト |
|:-:|:-:|:-:|
| 基本思想  | 社内ネットワーク内は信頼  | すべてのアクセスを検証  |
| アクセス制御  | VPN接続後は自由に社内システムにアクセス可能  | 必要なアプリ・システムのみアクセス可能  |
| 認証方式  | ID・パスワード＋VPN証明書  | ID・デバイス・行動を考慮した多層認証  |
| リスク管理  | 内部に侵入されると被害拡大  | 継続的なアクセス監視  |

📌 ゼロトラストでは、「社内だから安全」という考えを捨て、すべての通信・ユーザーを検証します！

🔍 なぜゼロトラストが必要なのか？
ゼロトラストが注目される理由として、以下の課題があります。

❌ VPNベースのセキュリティの限界
	1.	VPNの脆弱性を突いた攻撃が増加
→ VPNアカウントが流出すると、社内システム全体が危険
	2.	リモートワーク増加でVPNがボトルネック
→ アクセス集中でVPNが遅くなる問題
	3.	クラウドサービス（SaaS）との相性が悪い
→ VPNを通すとパフォーマンス低下

✅ ゼロトラストの解決策
	•	すべてのアクセスを検証（Never Trust, Always Verify）
	•	VPNではなく、ユーザー単位で細かいアクセス制御
	•	クラウド・SaaSを直接安全に使える仕組み

📌 ゼロトラストは、リモートワークやクラウド利用が増えた現代に適したセキュリティモデル！

⸻

🔹 ゼロトラストを実現する技術

ゼロトラストは 1つの技術ではなく、複数のセキュリティ技術を組み合わせて実現 します。

1️⃣ ID管理と多要素認証（MFA）
	•	シングルサインオン（SSO）: Okta, Azure AD, Google Workspace
	•	多要素認証（MFA）: パスワード + 指紋認証 / ワンタイムパスワード

📌 「正しいユーザーか？」を厳しく確認！

2️⃣ デバイスのセキュリティチェック
	•	EDR（Endpoint Detection and Response）
	•	MDM（Mobile Device Management）で端末管理

📌 「安全な端末からのアクセスか？」をチェック！

3️⃣ ネットワークのアクセス制御（ZTNA: Zero Trust Network Access）
	•	VPNの代替として ZTNAを導入
	•	ユーザーごとにアクセスできるサービスを限定

📌 「必要最低限のアクセスだけ許可！」

4️⃣ セキュリティログの監視と異常検知
	•	SIEM（Security Information and Event Management）でログ監視
	•	AIによる異常行動検知（UEBA: User and Entity Behavior Analytics）

📌 「普段と違う動きをしたら即ブロック！」

⸻

🔹 企業でのゼロトラスト導入方法

ゼロトラストは一気に導入するのではなく、段階的に移行 することが推奨されます。

✅ 1. VPNをゼロトラストに置き換える

従来:
🔻 社員はVPNに接続後、全社内システムにアクセス可能

ゼロトラスト:
✅ ユーザーごとに許可されたアプリだけアクセス

📌 例:
営業チーム → Salesforceのみアクセス許可  
開発チーム → GitHub + AWSへのアクセス許可  

✅ 2. クラウドサービス（SaaS）のセキュリティ強化

従来:
🔻 社員が個人PCからGoogle WorkspaceやAWSにログイン → セキュリティリスク

ゼロトラスト:
✅ 認証時にデバイスチェック（会社PC以外はログイン不可）
✅ 多要素認証（MFA）を必須化

📌 例:
- 会社PC（MDM登録済み）のみアクセス許可  - Google Workspace + AWSのログインにMFA必須

✅ 3. 内部ネットワークのセキュリティ強化

従来:
🔻 VPNが突破されたら社内ネットワーク全体が危険

ゼロトラスト:
✅ 各サービス・サーバーにゼロトラスト認証を導入
✅ 業務ごとにアクセス権を分離（最小権限の原則）
📌 例:
- 社員A → 社内のデータベースにはアクセス不可  
- 社員B → データベースの「売上データ」にはアクセスOK  

🎯 まとめ

✅ ゼロトラスト = すべてのアクセスを信用せず、常に検証する
✅ VPNに依存せず、ユーザー単位で細かいアクセス制御を行う
✅ クラウド・SaaSのセキュリティも考慮した設計が重要
✅ 「MFA, デバイス管理, ZTNA」がゼロトラスト導入のカギ
(2025/3/25) Jetson orin nanoのセットアップからReal Senseまで


# Jetson Orin Nano セットアップ手順とRealSense SDK導入方法

本記事では、**Jetson Orin Nano** 開発キットのセットアップ手順および **RealSense SDK** のインストール方法について解説します。  
Jetson Orin Nanoは、NVIDIAが提供する高性能なエッジAI向け開発ボードです。画像処理や推論処理に優れており、組み込みAI開発に最適です。

---

## 🧰 Jetson Orin Nano セットアップの前提準備

### 必要なもの

- DisplayPort to HDMI の変換ケーブル（モニター出力用）
- FC REC 端子と GND 端子をショート（起動設定）
  - **ジャンパー線**（メスーメス）または **ジャンパーピン** を使用  
- SSD または SDカードを Jetson Orin Nano の背面に装着
- Linux OSのPC
---

## 🖥️ Jetson に OS をインストールする手順

### ① SDK Manager のインストール（ホストPC側）

Jetson にOSをインストールするには、Linux PCに **NVIDIA SDK Manager** を導入する必要があります。

- [SDK Manager ダウンロードページ](https://developer.nvidia.com/sdk-manager)

---

### ② Jetson に OS を書き込む

- SDK Manager を起動し、Jetson Orin Nano を選択して OS をインストール
- 詳細手順はこちら：  
  [Jetson OSのインストール手順（NVIDIA公式）](http://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html)

---

### ③ インストール中の注意点

- OSインストール中に **複数回パスワード設定や確認** が求められますので、手動で対応してください。
- 数十分ほど時間が必要です。

---

## ⚠️ OSセットアップ後の重要な注意点

Jetson の初回セットアップ時、**OSの言語は必ず英語（English）** を選択してください。  
**日本語にすると `sudo apt update` に失敗します。**

### ❌ 失敗例（日本語の場合）

![日本語OS失敗例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/02200d4f-2aa9-420c-a690-bd707b4031a0.png)

### ✅ 成功例（英語の場合）

![英語OS成功例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/a408c0bf-044c-4ddd-b20e-a30b3719532d.png)

---

## 📦 RealSense SDK の導入手順

JetsonにIntel RealSenseカメラを利用するために、**librealsense SDK** を導入します。

### 🔑 公開鍵の登録

```bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || \
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
```

※取得に失敗した場合、以下のようにプロキシを指定してください：

```bash
export http_proxy="http://<proxy>:<port>"
```

---

### 📥 リポジトリの追加

```bash
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
```

---

### 🛠️ SDK のインストール

```bash
sudo apt-get install librealsense2-utils
sudo apt-get install librealsense2-dev
```

### 🛠️ SDK の実行

```bash
realsense-viewer
```
---

### ⚠️ エラーが出た場合の対処

インストールに失敗し、複数リポジトリの重複が原因となっている場合は以下を確認してください：

```bash
ls /etc/apt/sources.list.d/
```

`realsense` 関連のファイルを削除して再試行してください。

---

## 📸 各種ハードウェアの設置例

### Jetson Orin Nano セットアップ完了の様子

![全てを取り付けた状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/e578470c-e3f8-4721-8294-b35636cfc648.png)

---

### SDカードの取り付け場所（参考）

出典：[公式ガイド](https://developer.nvidia.com/embedded/learn/get-started-jetson-orin-nano-devkit#setup)  
![SDカードのスロット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/689ccc4d-e15f-4042-b618-aeb257f081ed.png)

---

### SSDの取り付け場所（ドライバーが必要）

![SSDのスロット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/121ec8a8-2543-452a-b159-69a42113021d.png)

---

## ✅ まとめ

| 項目 | 内容 |
|------|------|
| 必須ケーブル | DisplayPort to HDMI |
| 初期設定 | FC REC 端子とGND端子をショート |
| OS言語 | **英語推奨（日本語非推奨）** |
| RealSense SDK | apt-key ＆ リポジトリ設定から導入 |
| トラブル時 | `sources.list.d` の中身を確認・削除 |
【読書感想】夜と霧

ランニングしながらAudibleで聴いた本の感想です。
本のまとめというより、自分が心に残ったことを3つだけ書いてます。
とりあえず思ったことをメモするのが大切と思い、なるべく30分以内で書き上げています。

> 引用で書かれている内容は、本書の要約です

# 読んだ本

夜と霧　新版
ヴィクトール・E・フランクル (著), 池田 香代子 (翻訳)

ナチスの強制収容所の実体験記録です。前半はグロテスクな話が多いですが、極限状態であるからこそ、「真の人間の姿」のようなものを感じ取ることができます。
個人的には名著だなと感じました（個人的満足度３／３、一般的なおすすめ度３／３）

# 心に残ったこと

## 環境次第で人は堕落するが、環境に抗って自分を貫く人もいる

> 強制収容所では、多くの被収容者（≒投獄された人）が自己中心的で堕落した醜い人間性であった。普段は温厚な人間でも、そういう状態になる者もいた。
> ただし、そういう環境で人間の100%が堕落するのではなく、それに抗って自己の信念を貫いた人もいた。そういう人間は、「未来への希望」を持っていることが多かった。

今の時代、何か悪いことが起きても、「人間が悪いのではなく、環境・システムが悪い」と思うことが多い世の中だと思います。
それはそれで正しいのですが、ごく一部、環境・システムが悪くても、それに抗って「自分が思う正しい自分」を貫いて、這い上がってくる人もいます。
この社会的性質を、筆者は強制収容所で目にしています。

おそらくですが、他人に強いるときは「環境が悪い→人間が悪い」をベースとしつつ、自分の中での信念は「環境が悪い→人間が悪いとはならない」を持っておくとよいのかなと思いました。

## 立場が人を決めるのではなく、人間を見る必要がある

> 被収容者を監視する役割の監視兵は、多くの被収容者を手下のように扱うため、残虐・非合理的・自己中心的な人が多かった。そういう人間だからこそつける立場なのであろう。
> ただし、その中でも、身銭を切って被収容者のために薬を買ってきたり、心温かい者もいた。

現代社会でも「部長だから偉い」「社長だから偉い」という立場への概念は薄れてきて、「どういう人間で、何をしているか」が重要になってきているかと思います。
もちろん、傾向としては「こういう人が、こういう立場につくことが多い」ということはありますが、それは傾向であり、その人の人間性は実際に触れてみないとわからない、ということを述べていると思います。

## 未来への希望は人から奪えない

> 人間がどんな環境にあろうが、未来への希望と、過去の経験というものは奪えない

強制収容所で、着ているものを全部取られ、毛髪も全部剃られ、睡眠不足で過酷な労働に従事させられるような状態でも、例えば「生きて帰って、家族の顔を見る」というような希望を強く持っている者は、生命力が高かったそうです。
私も、仕事で上長がどんどん休職していったような辛い時期に、数カ月後の東京マラソンの予定を想像し「この日を健康で迎えたい」という思いで病まずに過ごすことができた、という経験がありました。
なお、過去の経験は宝物と述べていますが、これに固執しすぎると良くない、というような内容を同時に述べています。

> 未来への希望を無くしたものは急激に抵抗力をなくし亡くなった
> たとえば、「3月で戦争が終わる」という夢を見た者は、3月が終わるにつれて体調が悪くなっていき、3月31日に亡くなった

未来への希望の反動で、それが無くなると、抵抗力が無くなるという側面もあります。
そのため、確度の低い希望は、あまり強く抱かないほうが良いのかなと思いました。。

## その他

### 苦しみは他人が引き受けて解決したりできない。自分の中にあるものを見つめ直して解決するしかない

収容所で医者として働いた経験から、筆者はこう述べています。
強制収容所には様々な心身的に不健康な人がいますが、最終的には、本人の中にある「悪い状態」をその人が解消することでしか、健康になることはできず、医師や周囲の人が「代わりに引き受ける」などはできない、と述べています

### 残酷な環境は解放された後も大変だった

収容所では親切だった人が、収容所を出た途端「こんな大変な経験をしたから多少の悪は問題ない」と豹変して、例えば他人の畑の真ん中を歩いて作物をダメにしたり、家庭内暴力を振るったりしたものもいたそうです。
環境が人を変える面はありますが、良い環境になるから良い人間になるとも限らないのです。
強制収容所のような劣悪な環境は、そのときは生きながらえてもその後に悪い影響をもたらすため、やっぱり無い方が良いなと思いました。

### 戦時下の東ドイツの話であるが、日本でも全くの他人事ではない

あとがきで述べられています。
この話は全くの他人事ではなく「日本では全く無かった」とも言えないですし、過去の話ではなく、戦争が起きれば再発する（している？）可能性もあります。
#0079（2024/03/25）データベースにおけるB-treeインデックス

# データベースにおけるB-treeインデックスとは？

データベースのパフォーマンスを最適化するために広く使われているのが「B-treeインデックス」です。本記事では、B-treeインデックスの仕組みや特性、メリット・デメリットを具体例と共に解説します。

---

## 🔹 B-treeインデックスとは？

B-tree（Balanced-tree、バランス木）は、データベース内で大量のデータから迅速に目的のデータを探し出すために使われるツリー構造です。データはソートされた状態で保持され、検索やソート処理を効率よく行うことができます。

---

## 🔹 B-treeインデックスの構造

B-treeは主に以下の3つのノードから構成されています。

- **ルートノード (Root Node)**：最上位に位置し、検索の起点。
- **内部ノード (Internal Node)**：ルートと葉の間に位置し、データ検索を左右のノードへ誘導。
- **葉ノード (Leaf Node)**：実際のデータまたはデータへのポインタを格納。

以下の図は簡略化したB-treeの構造例です。

```
            [50]
           /     \
 [10, 20, 30]    [60, 70, 80]
```

全ての葉ノードが同じ深さを持つことで、検索性能が安定します。

---

## 🔹 B-treeインデックスの検索の仕組み（具体例）

例えば、以下のデータを考えます。

```
[10, 20, 30, 40, 50, 60, 70, 80]
```

B-treeインデックスで整理すると、以下のようになります。

```
         [40]
        /    \
[10,20,30] [50,60,70,80]
```

ここで、「70」を検索すると、

1. まずルートの「40」を見て、70は40より大きいため右側のノードへ。
2. 次のノードで即座に「70」を見つけられます。

この仕組みにより、大量のデータでも非常に高速に目的のデータを見つけられます。

---

## 🔹 B-treeインデックスのメリットとデメリット

### メリット
- 完全一致検索が高速になる。
- 範囲検索（例：日時の範囲指定など）にも非常に有効。
- データがソートされているため、並べ替え処理にも効率的。

### デメリット
- 部分一致検索（LIKE '%abc%'など）や全文検索には適さない。
- 更新頻度が非常に高い場合、インデックスの再構築に伴うオーバーヘッドが発生。

---

## 🔹 B-treeインデックスの使用例（SQL）

実際にSQLでインデックスを作成する例を見てみましょう。

```sql
-- インデックスを作成する例
CREATE INDEX idx_employee_name ON employees (name);
```

このインデックスにより、以下のようなクエリの実行速度が向上します。

```sql
SELECT * FROM employees WHERE name = '佐藤';
```

```sql
SELECT * FROM employees WHERE name BETWEEN 'あ' AND 'か';
```

---

## 🔹 まとめ

B-treeインデックスはデータベースの検索やソート性能を大幅に向上させるための重要な仕組みです。特に、大規模データベースや検索処理の多いシステムでの利用に適しています。B-treeインデックスの特性を理解して、データベース設計やパフォーマンスチューニングに役立てましょう。
GoでJsonShcemaを利用する

## はじめに
表題通り、GoでJsonShcemaを利用します。

## 実装
```shell:
~/go/go_json_schema  $ tree 
.
├── go.mod
├── go.sum
├── schema.go
└── schema_test.go

1 directory, 4 files
```

```go:schema.go
package main

import (
	"encoding/json"
)

// JSONをGoの構造体に変換するための定義
type Person struct {
	FirstName string `json:"firstName"`
	LastName  string `json:"lastName"`
	Age       int    `json:"age,omitempty"`
	Email     string `json:"email,omitempty"`
}

// JSONデータを構造体に変換する関数
func ParsePerson(data []byte) (Person, error) {
	var person Person
	err := json.Unmarshal(data, &person)
	return person, err
}
```

```go:schema_test.go
package main

import (
	"encoding/json"
	"fmt"
	"strings"
	"testing"

	"github.com/santhosh-tekuri/jsonschema/v5"
)

// JSON Schemaの定義
var personSchema = []byte(`{
	"$schema": "http://json-schema.org/draft-07/schema#",
	"title": "Person",
	"type": "object",
	"properties": {
		"firstName": { "type": "string" },
		"lastName": { "type": "string" },
		"age": { 
			"type": "integer",
			"minimum": 0
		},
		"email": { 
			"type": "string",
			"format": "email"
		}
	},
	"required": ["firstName", "lastName"]
}`)

// 有効なJSONデータ
var validPersonData = []byte(`{
	"firstName": "太郎",
	"lastName": "山田",
	"age": 30,
	"email": "taro@example.com"
}`)

// 無効なJSONデータ（必須フィールドがない）
var invalidPersonData = []byte(`{
	"firstName": "太郎"
}`)

func TestPersonSchema(t *testing.T) {
	// スキーマのコンパイル
	compiler := jsonschema.NewCompiler()
	if err := compiler.AddResource("person.json", strings.NewReader(string(personSchema))); err != nil {
		t.Fatalf("スキーマの追加エラー: %v", err)
	}
	schema, err := compiler.Compile("person.json")
	if err != nil {
		t.Fatalf("スキーマのコンパイルエラー: %v", err)
	}

	// テストケース
	tests := []struct {
		name    string
		data    []byte
		isValid bool
	}{
		{
			name:    "有効なデータ",
			data:    validPersonData,
			isValid: true,
		},
		{
			name:    "無効なデータ（必須フィールドがない）",
			data:    invalidPersonData,
			isValid: false,
		},
	}

	// 各テストケースを実行
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// JSONをインターフェースに変換
			var personObj interface{}
			if err := json.Unmarshal(tt.data, &personObj); err != nil {
				t.Fatalf("JSONのパースエラー: %v", err)
			}

			// スキーマに対して検証
			err := schema.Validate(personObj)
			if tt.isValid && err != nil {
				t.Errorf("有効なはずのデータが無効と判定: %v", err)
			}
			if !tt.isValid && err == nil {
				t.Errorf("無効なはずのデータが有効と判定")
			}
			fmt.Println("============== personObj", personObj)

			// エラーの内容を表示（デバッグ用）
			if err != nil {
				fmt.Printf("検証エラー (%s): %v\n", tt.name, err)
			}
		})
	}
}

```
#0077（2024/03/25）データベース設計の「親ソート」

# データベース設計における「親ソート」とは

データベース設計や運用の際によく耳にする「親ソート」という概念があります。本記事では、親ソートの意味やその重要性、具体的な利用シーンについて詳しく解説します。

---

## 🔹 親ソートとは？

親ソートとは、データベースにおいて「親テーブル（参照される側）にデータを先に登録しておかなければ、子テーブル（参照する側）にデータを登録できない」という性質のことを指します。

この性質は、リレーショナルデータベースにおける外部キー制約に関連しています。外部キー制約は、データ間の整合性を保つために設定されるものであり、これによって「親→子」の順番でデータを登録する必要が生まれます。

---

## 🔹 具体的な例で理解する親ソート

以下の例で具体的に説明しましょう。

### 親テーブル：「部署」

| 部署ID | 部署名 |
|--------|--------|
| D01    | 営業部 |
| D02    | 開発部 |

### 子テーブル：「社員」

| 社員ID | 氏名 | 部署ID（外部キー） |
|--------|------|--------------------|
| 1001   | 山田 | D01                |
| 1002   | 田中 | D02                |

- 「社員」テーブルの「部署ID」列は、「部署」テーブルの「部署ID」を参照する外部キーです。
- そのため、「部署」テーブルに「D01」や「D02」のデータが存在していなければ、「社員」テーブルには該当する社員情報を登録できません。
- これが、データ登録順序の「親ソート」の例です。

---

## 🔹 親ソートが必要な理由

親ソートは、データの整合性や一貫性を維持するために非常に重要です。主なメリットとしては以下が挙げられます。

- 存在しない参照を防ぎ、データベースの整合性を維持する。
- 親子関係の構造が明確になり、管理・保守が容易になる。

一方、親ソートを意識しないと以下のような問題が発生します。

- データベースへの登録時にエラーが発生する。
- 不整合データの混入リスクが高まる。

---

## 🔹 親ソートを意識したデータベース設計・運用

データベースを設計・運用する際は、以下のポイントを意識して進めましょう。

- **設計段階で親子関係を明確にする**
  - 親テーブルと子テーブルを明確に定義し、外部キー制約を適切に設定します。

- **データの登録順序を徹底する**
  - 親テーブルにデータが存在してから、子テーブルにデータを投入するようにします。

- **データ移行やバッチ処理の際の注意**
  - 一括処理の場合、親テーブルのデータを必ず先にインポートし、子テーブルを後にします。

---

## 🔹 まとめ

「親ソート」は、データベースの正しい動作やデータの整合性を保つために欠かせない概念です。外部キー制約が存在するリレーショナルデータベースを利用する際には、必ず親ソートを意識した運用・設計を心掛けましょう。
視点を第三者視点に切り替える処理のサンプルについて



使われている技術についてわかっていることを執筆中。

BumpUp Racerで使われていた技術を改造して実装したため、作った本人もわかっていない箇所あり。

# わかっている範囲での大まかな処理原理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/66bc9916-9553-46a9-b7d7-b52ea55985c8.png)

Ancherに入ると、ViewHoldahのSlotをコピーして座ったUserのRootSlotの子にします。
このViewHoldahとAncherに仕込まれてるDV(Anchor/isAnchored)をうまく活用して
AvatarRootをオーバーライドして視点をハックして切り替えてしまうというのがこのアイテムのかなり大雑把な構造です。

DeskcamのSlot内にカメラなどが仕込まれていてこれが第三者視点のカメラとなっているみたいです。


AncherについてはDVを仕込んでいる以外は特に改造していません。
お好きなAncherに入れ替えてDVのコンポーネントをコピーしても動作に支障はないと思います。

# 活用方法など
BumpUp Racerのような第三者視点のゲームを作ったり、演出として一時的に第三者視点にする使い方も出来ると思います。
Ancherに入っていても、固定しない限り頭や手(固定を外せば足も)を自由に動かせます。
またAncherを使わずに視点だけ切り替えることも可能ですが、その場合何もしないとプレイヤーは自由に動けます。
ただし操作はできるものの視点ｄは第三者視点なのでめちゃくちゃコントロールしづらくなります。
【無料で本が読める】GitHubリポジトリ「free-programming-books」

## はじめに

プログラミング学習を始める際に、手頃な書籍を探すのは一つのハードルですよね。しかし、世界中の有志が協力して作り上げている「**free-programming-books**」というGitHubリポジトリを使えば、無料で入手できるプログラミングの電子書籍を簡単に見つけられます。

この記事では、その**free-programming-booksリポジトリ**の概要・特徴・使い方・貢献方法などを詳しく解説します。

## 1. free-programming-booksとは？

### 1.1 概要

**free-programming-books** は、プログラミングやコンピュータサイエンスに関する無料の書籍やドキュメント、チュートリアル、教材などを集めたリストです。GitHubの [EbookFoundation](https://github.com/EbookFoundation) によってホストされ、オープンソースとして世界中のコントリビューターの協力で維持・更新されています。

https://github.com/EbookFoundation/free-programming-books

- **スター数（Star）:**  
  GitHub上でも大変人気のリポジトリで、35万以上のスターを獲得しています（2025年時点）。  
  Starが多いということは、それだけ多くの開発者から高い評価と注目を集めている証拠です。

### 1.2 どんな本があるのか？

- 多種多様なプログラミング言語 (Python, Java, C++, JavaScript, Go, Rust, etc.)
- OSや特定のツールに関連した解説書
- アルゴリズム、データ構造、ネットワーク、セキュリティ関連の教科書  
- Web開発やモバイルアプリ開発、データベース、クラウド、機械学習など各種ドメインに特化した書籍

基本的に、**無料で公開されている良質なリソース**が一覧になっています。書籍はPDFやHTML、EPUB形式など、さまざまな形で提供されている場合があります。

## 2. free-programming-booksの特徴

### 2.1 自国語で検索できる

このリポジトリは、英語だけでなく多数の言語別に整理されています。日本語のリソースが欲しい場合も、`free-programming-books-ja.md` というファイルなどから探すことができます。自分の母国語で探せるため、英語が苦手な方でも利用しやすいのが特長です。

### 2.2 最新の情報が集まりやすい

オープンソースで世界中の人が随時プルリクエスト（Pull Request）を送って更新しているので、比較的新しい技術や書籍の情報が取り込まれやすく、常に鮮度が高い状態が維持されています。

### 2.3 多種多様なカテゴリ

分類がしっかりしているので、探したい技術領域を素早く見つけられます。大きな目次から言語や分野を選んでいくことで、必要な無料の書籍に辿り着けます。

## 3. free-programming-booksの使い方

### 3.1 基本の閲覧方法

1. GitHubのリポジトリにアクセス  
   → [https://github.com/EbookFoundation/free-programming-books](https://github.com/EbookFoundation/free-programming-books)

2. **`README.md`** やリポジトリ内のメインファイルを確認  
   リポジトリのトップページでは、各種言語やカテゴリへのリンクがまとめられています。  

3. 自分が探したい技術や言語をリストから選択  
   例：[`free-programming-books-ja.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/books/free-programming-books-ja.md) には日本語の資料リストがまとめられています。  

4. リンク先（オリジナルサイトやPDFなど）から、書籍を無料で入手  

### 3.2 リストの検索

GitHubのUI上で、キーワード検索を使うことでリポジトリ内部を検索できます。「Rust」「React」など、気になるトピックを入力してみましょう。

## 4. どういった本が見つかるのか？ 例のご紹介

ここでは、日本語に限らず人気のある本の一部を例としてご紹介します。

- **Python入門書**  
  Pythonの基礎から解説している無料のテキストやチュートリアル。  
  （日本語訳付きのチュートリアルも存在します）

- **JavaScriptリファレンス**  
  ECMAScriptやJavaScriptのベストプラクティスをまとめた資料。

- **アルゴリズムとデータ構造**  
  大学の教科書レベルのPDFが無料で公開されていることも。

- **Git / GitHub解説書**  
  Gitの概念から、GitHubの使い方、コマンドラインの操作法まで解説する書籍。

- **システムプログラミングやOSの基礎**  
  大学や専門機関が公開している講義ノート、研究資料など。

本当に多彩な資料があるため、学びたい分野が決まっている人はもちろん、「次に何を学ぼうか迷っている人」も眺めているだけで新しいアイデアを得られるかもしれません。

## 5. まとめ

- **free-programming-books** は、GitHub上で最も有名な無料学習書リストの一つ  
- 世界中の幅広いプログラミング書が集まり、カテゴリも多数  
- コミュニティによる随時アップデートで常に最新情報が得られる  
- 日本語だけでなく多言語の書籍もまとまっている  

無償で良質なリソースが手に入るので、個人学習からチームでの勉強会のネタ探しまで、幅広く活用できます。「**今日何を学ぼう？**」と迷ったときは、ぜひ一度リポジトリをのぞいてみてください。自分の知りたい分野を発見できるかもしれませんよ。

## 参考リンク

- [EbookFoundation/free-programming-books GitHub](https://github.com/EbookFoundation/free-programming-books)
- [EbookFoundation 公式サイト](https://ebookfoundation.org/) (EbookFoundationの紹介ページ)