OmniAICreator/Qiita-1.07M huggingface dataset:
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIを使った感情分析で顧客満足度を見える化



## 1. はじめに：なぜ「感情分析」が今、重要なのか？

「最近のお客様の声、なんとなくネガティブな印象が多い気がする…でも、数字で示せないからチームに共有しにくい」

そんな経験、ありませんか？

現代のビジネスでは、**「定量化された顧客の感情」＝カスタマーセンチメントの可視化** が大きな差別化要因となっています。SNSやレビュー、カスタマーサポートの会話ログには、実に多くの「感情」が詰まっています。

そこで登場するのが\*\*AIを使った感情分析（Sentiment Analysis）\*\*です。本記事では、この技術を現場で活かすための方法、ツール、そしてリアルな導入Tipsを解説していきます。

---

## 2. 感情分析とは？〜技術概要と仕組み〜

### ✅ 感情分析とは

テキストデータからポジティブ・ネガティブ・ニュートラルなどの感情を自動で判定する自然言語処理（NLP）の一技術です。

### ✅ 主な手法

| 手法           | 特徴                  | 活用例                        |
| ------------ | ------------------- | -------------------------- |
| ルールベース       | 単語辞書やスコアで判定         | 小規模な分析、カスタム辞書の精度が高い場合      |
| 機械学習ベース      | SVM, ロジスティック回帰などで分類 | 中規模〜大規模、モデルのチューニングで柔軟性あり   |
| ディープラーニングベース | BERTなどの事前学習モデルを活用   | 高精度、大規模データ対応、ファインチューニングが必要 |

本記事では、\*\*Hugging Faceの事前学習済みBERTモデル（日本語対応）\*\*を使って、実際に顧客の声を感情分析するデモを行います。

---

## 3. 実装編：日本語レビューの感情分析をやってみよう

### 🛠 使用技術

* Python 3.x
* Hugging Face Transformers
* `cl-tohoku/bert-base-japanese` モデル
* Streamlit（デモ用UI）

### 📦 依存ライブラリインストール

```bash
pip install transformers torch fugashi ipadic streamlit
```

### 📄 コード例：シンプルな感情分析スクリプト

```python
import torch
from transformers import BertJapaneseTokenizer, BertForSequenceClassification
import streamlit as st

# モデルとトークナイザーの読み込み
tokenizer = BertJapaneseTokenizer.from_pretrained("cl-tohoku/bert-base-japanese")
model = BertForSequenceClassification.from_pretrained(
    "daigo/bert-base-japanese-sentiment")

# 推論関数
def predict_sentiment(text):
    inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
    with torch.no_grad():
        outputs = model(**inputs)
    probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
    labels = ["ネガティブ", "ニュートラル", "ポジティブ"]
    return dict(zip(labels, probs[0].tolist()))

# StreamlitでUI化
st.title("🎭 顧客レビュー感情分析デモ")
input_text = st.text_area("顧客レビューを入力してください:")

if st.button("分析する") and input_text:
    result = predict_sentiment(input_text)
    st.write("📊 分析結果:")
    st.json(result)
```

### 🧪 実行例

* 入力: `「サポートがとても親切で助かりました！」`
* 出力: `ポジティブ: 89.3%, ニュートラル: 9.1%, ネガティブ: 1.6%`

---

## 4. 実務でのTipsと落とし穴

### 💡 現場で活きるTips

* **レビューの前処理**（絵文字削除・正規化）は必須
* **大量の短文（Twitterなど）でも動くモデル**を選定すべし
* **感情スコアの閾値設定**（例：60%以上なら強ポジティブ）で意思決定が明確になる

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

| 失敗例           | 原因と対策                           |
| ------------- | ------------------------------- |
| 意図と逆の分類結果     | 文脈が特殊 → ファインチューニング必要            |
| ユーザー辞書未登録で誤判定 | ニッチな専門用語 → 独自辞書作成 or カスタムBERT訓練 |
| データ量が少なく偏っている | スクラップやクラウドソーシングで多様性確保           |

---

## 5. 応用編：ダッシュボードで感情トレンドを可視化する

StreamlitやLooker Studioと連携し、感情分析の結果を**時系列トレンドグラフ**や**部門別集計**として可視化することで、マーケティングやCSチームと「同じ言語」で議論できるようになります。

例：

* 月次で「ポジティブ率」が落ちた → UIの改善案を練る
* サポート窓口Aはネガティブ率が高い → 教育・応対見直し

---

## 6. まとめ：感情の可視化は、顧客体験の第一歩

### ✅ 本記事のまとめ

* 感情分析は、顧客満足度を「見える化」する強力な武器
* Hugging Faceモデルを活用すれば、短期間でPoC構築が可能
* 実務では、前処理・モデル選定・可視化が鍵

### ✅ 向いている業務

* コールセンター分析
* ECサイトのレビュー分析
* SNS・口コミモニタリング
* 顧客体験(CX)向上プロジェクト

---

## 🚀 今すぐPoCしてみよう！

「うちの顧客って、本当はどう感じてるのか？」
気になったら、まずは本記事のサンプルコードをベースに自社データでPoCしてみてください。
それが、**感情に寄り添うプロダクト作りの第一歩**になります。
unity　アニメーションをつくりたい

unityのアニメーションの基本要素
AnimatorコンポーネントがAnimatorControllerとAnimationClipを管理する関係

イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737482/51ed5174-67d6-473d-9ee5-456c70c3213e.png)




１　オブジェクトを作成

２　AnimationClipを作成し、オブジェクトにドラッグ
    AnimationClipはこんなの↓三角形のもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737482/7d80d83c-74ce-4440-9e52-e274790f3a28.png)


AnimationClipは右クリック→create→animation　で作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737482/580e8bbb-7098-446e-a41b-ae912087a797.png)


ドラッグアンドドロップされたオブジェクトにはAnimatorがセットされる
それと同時にAnimatorControllerが自動で生成される
生成されたAnimatorControllerはオブジェクトと同じ名前になる
【Python初心者】elseの使い方まとめ｜if・for・while・tryの意味の違いを整理

Pythonでは `else` がさまざまな構文で使われますが、それぞれの意味が違っていて混乱しやすいと感じました。

自分の学習のために、`else` の使い方と意味の違いを整理してみました。

## 1. `if ... else`（基本の条件分岐）

まずは最も基本的な条件分岐です。これは他の言語と同じような感覚で使えます。

```python
x = 10

if x > 5:
    print("5より大きい")
else:
    print("5以下")
```

### 補足：1行で書ける `if ... else`

条件に応じて値を1行で代入したい場合、次のような書き方ができます。

```python
x = 10
result = "大きい" if x > 5 else "小さい"
print(result)  # 出力: 大きい
```

このような書き方は「三項演算子」と呼ばれることもあります。

## 2. `for ... else`（ループが最後まで実行されたときの処理）

`for` 文に `else` をつけると、「`break` されずに最後までループが終わったとき」に `else` 節が実行されます。

```python
for num in [1, 2, 3, 4, 5]:
    if num == 3:
        break
else:
    print("ループを最後まで回りました")  # これは実行されません
```

`num == 3` で `break` されたため、`else` は実行されません。

逆に `break` されなかった場合は `else` が実行されます。

```python
for num in [1, 2, 3]:
    print(num)
else:
    print("ループを最後まで回りました")  # 実行されます
```

## 3. `while ... else`（ループが最後まで実行されたときの処理）

`while` 文にも `else` を使うことができます。意味は `for` と同じで、`break` されずにループが終わった場合に `else` が実行されます。

```python
i = 0
while i < 3:
    print(i)
    i += 1
else:
    print("正常終了")  # 実行されます
```

ただし、`break` されると `else` は実行されません。

```python
i = 0
while i < 3:
    if i == 1:
        break
    print(i)
    i += 1
else:
    print("正常終了")  # 実行されません
```

## 4. `try ... else`（エラーが出なかったときの処理）

`try` 文の中でエラーが発生しなかった場合に、`else` が実行されます。

```python
try:
    result = 10 / 2
except ZeroDivisionError:
    print("ゼロ除算エラーが発生しました")
else:
    print("正常に計算できました：", result)
```

エラーが起きると `else` は実行されません。

```python
try:
    result = 10 / 0
except ZeroDivisionError:
    print("ゼロ除算エラーが発生しました")
else:
    print("正常に計算できました：", result)  # 実行されません
```

※補足：`finally` は例外の有無に関係なく**常に実行される**ブロックで、`else` とは役割が異なります。

## 5. `else` の使い方まとめ表

| 文法             | `else` の意味                             | よくある用途                     |
|------------------|-------------------------------------------|----------------------------------|
| `if ... else`     | 条件により処理を分ける                    | 基本の分岐                       |
| `for ... else`    | `break` されなければ実行される             | ループで「見つからなかった」時など |
| `while ... else`  | `break` されなければ実行される             | ループ抜けのチェック             |
| `try ... else`    | 例外がなければ実行される                   | 正常処理後の追加処理             |

## 覚え方のコツ（`else` がいつ実行されるか）

構文ごとに `else` の意味が違うので、自分なりに以下のように覚えると整理しやすいと思いました。

| 構文             | `else` が実行される条件              | 覚え方のコツ                 |
|------------------|--------------------------------------|------------------------------|
| `for ... else`    | `break` されなかったら               | 「**breakしなかったら**」    |
| `while ... else`  | `break` されなかったら               | 「**breakしなかったら**」    |
| `try ... else`    | エラーが出なかったら                 | 「**エラーが出なかったら**」 |

## おわりに

こうして整理してみると、Python の `else` は構文ごとに意味が違っていてややこしいと感じました。

特に `for ... else` や `try ... else` は他の言語では見かけない形なので、しっかり使い分けられるように練習していきたいです。
# Unityで自作ゲームを開発中！制作過程をYouTubeショートで毎日タイムラプス公開しています

現在、Unityで2D戦略パズルゲーム「弾律 -Danritsu-」を開発しています。  
その制作過程を**タイムラプス形式のYouTubeショート動画**として毎日1本ずつ公開しています。

[YouTubeショート一覧はこちら](https://www.youtube.com/@syunpp_8413/shorts)

---

## 投稿しているショート動画の内容

- 毎日1動画（20〜80秒）を継続投稿
- Unityエディタでの開発作業を高速タイムラプスで収録
- 実装単位で1動画に分けて投稿しているので見やすい構成

### 投稿例
- ツールチップ機能の追加
- アーティファクトUIの改修
- 敵の攻撃演出の実装　など
## 実際のショート動画（タイムラプス）

https://www.youtube.com/shorts/WzHHshZ3cow

---

## なぜYouTubeショート形式にしたのか？

以下のような課題と向き合っていた中で、ショート動画が最適だと判断しました。

- 開発の地道な積み重ねが「形になる過程」を残しておきたい
- SNSでの拡散を狙う上で、動画形式のほうが反応を得やすい
- 長時間の動画編集に工数を割きたくない

結果として、**Unityの実装風景を20〜80秒に圧縮するタイムラプス形式**はちょうどよく、継続しやすいアウトプット手段になっています。

---

## 開発ログを動画で残すことのメリット

- 実装の区切りごとに意識が明確になり、振り返りやすい
- 他の開発者への共有・相談時にも役立つ（画面を見せれば済む）
- 投稿の習慣が「開発のモチベーション維持」にもつながる

---

## 投稿スケジュールと今後の予定

- 毎日1本ペースで継続中（現在9本以上ストックあり）
- 実装テーマごとに再生リストを整理予定
- リリースが近づいたらPV風のまとめ動画も予定

---

## Unityや個人開発に興味のある方へ

今後もYouTubeショートと併せて、**Zennやブログでも開発に関する記事を投稿**していく予定です。

少しでも興味を持っていただけたら、ぜひフォロー・チャンネル登録・ブログもチェックしていただけたら嬉しいです！

---

## ブログでもUnityや個人開発ネタを発信中です！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど  
より深掘りした内容をブログにまとめています。  
▶ https://syunpp.com

## 公開中のアプリ一覧はこちら！
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。  
▶ https://syunpp.com/公開中のアプリ一覧/
静的サイト vs 動的サイト」初心者向けの明快な違い解説

こんにちは！今回は Web 開発の基礎である「静的サイト」と「動的サイト」の違いについて、初心者の方にも分かりやすく解説していきます。私自身も、勉強し始めた頃にはこの違いがよく分からず混乱していました。この記事が同じような悩みを持つ方の助けになれば嬉しいです！

## はじめに：Webサイトの2つの世界

Webサイトを訪れるとき、私たちはブラウザでページを見ていますが、そのページがどのように作られ、表示されているかについては普段あまり意識しませんよね。実は、Webサイトには大きく分けて「静的サイト」と「動的サイト」という2つのタイプがあります。

それぞれの特徴を簡単に言うと：

- **静的サイト**：あらかじめ作られた固定のHTMLファイルをそのまま表示する
- **動的サイト**：ユーザーのリクエストごとにサーバー側でコンテンツを生成して表示する

では、それぞれについて詳しく見ていきましょう！

## 静的サイト（Static Website）とは？

### 基本的な仕組み

静的サイトは、事前に用意されたHTMLファイル、CSS、JavaScript、画像などのファイルで構成されています。サーバーはこれらのファイルをそのままの形でブラウザに送信します。

例えるなら、**本屋さんで既に印刷された本を手に取る**ようなものです。本の内容は印刷された時点で固定されていて、読者が開くたびに内容が変わることはありません。

### 特徴

1. **シンプルな構造**：HTMLファイル、CSS、JavaScript、画像などのファイルをサーバーに置くだけ
2. **高速表示**：処理が少ないため、ページの読み込みが速い
3. **セキュリティ性が高い**：サーバー側の複雑な処理がないため、攻撃の対象になりにくい
4. **低コスト**：サーバーの負荷が少なく、安価なホスティングでも運用可能

### 向いているケース

- 情報提供が主な目的のサイト（会社の紹介ページ、ブログなど）
- コンテンツの更新頻度が低いサイト
- シンプルなポートフォリオサイト
- 小規模なプロジェクトサイト

### 制限・デメリット

- ユーザーごとにコンテンツをカスタマイズすることが難しい
- 更新するたびにHTMLファイルを再作成する必要がある
- リアルタイムのデータ表示には向いていない
- ユーザー認証などの複雑な機能の実装が難しい

## 動的サイト（Dynamic Website）とは？

### 基本的な仕組み

動的サイトは、ユーザーがアクセスしたタイミングでサーバー側でHTMLを生成し、ブラウザに送信します。データベースからの情報取得やユーザー情報に基づいた処理などが行われます。

例えるなら、**レストランでシェフが注文を受けてから料理を作る**ようなものです。同じメニューでも、お客さんの好みや食材の状況によって、その場で内容が変わることがあります。

### 特徴

1. **データベース連携**：ユーザー情報、記事データなどをデータベースから取得して表示
2. **ユーザーごとのカスタマイズ**：ログイン状態や過去の行動に基づいてコンテンツを変更可能
3. **インタラクティブ性**：ユーザーの操作に応じてリアルタイムに内容を変更できる
4. **管理のしやすさ**：CMSを使用することで、技術知識が少なくてもコンテンツ更新が可能

### 向いているケース

- ECサイト（オンラインショップ）
- SNSやコミュニティサイト
- ニュースサイトや頻繁に更新が必要なサイト
- ユーザー登録・ログイン機能が必要なサイト
- データ検索・フィルタリング機能が必要なサイト

### 制限・デメリット

- サーバーへの負荷が大きい
- ホスティングコストが比較的高い
- 表示速度が静的サイトより遅くなりがち
- セキュリティリスクが増加（SQLインジェクションなど）

## 具体例で理解する

### 静的サイトの例
個人ブログを考えてみましょう。毎回記事を書くたびに、HTMLファイルを作成してサーバーにアップロードします。読者がブログにアクセスすると、そのHTMLファイルがそのまま表示されます。何か記事を修正したい場合は、HTMLファイルを修正してアップロードし直す必要があります。

### 動的サイトの例
同じくブログでも、動的システムの場合、記事はデータベースに保存されます。読者がブログにアクセスすると、データベースから記事を取得し、テンプレートと組み合わせてHTMLを生成します。記事を修正したい場合は、管理画面からデータベース内の記事内容を修正するだけでOKです。

## 最近のトレンド：ハイブリッドアプローチ

最近のWeb開発では、静的と動的の良いとこ取りをした手法も人気です。例えば：

### JAMstack
静的サイトジェネレーター（GatsbyやNext.jsなど）を使って、ビルド時に動的コンテンツを静的ファイルに変換します。これにより、速度と柔軟性の両方を得られます。

### SSG（Static Site Generation）とSSR（Server Side Rendering）
Next.jsなどのフレームワークでは、ページの性質に応じて静的生成やサーバーサイドレンダリングを選択できるようになっています。


## まとめ

- **静的サイト**：事前に作られたHTMLファイルをそのまま配信。シンプル・高速・低コスト・更新に手間がかかる
- **動的サイト**：リクエスト時にサーバーでHTMLを生成。柔軟性が高い・カスタマイズ可能・やや遅い・コストが高め

どちらが「良い」というわけではなく、プロジェクトの要件に合わせて適切な方を選ぶことが大切です。最近は両方のメリットを取り入れたアプローチも増えてきています。

この記事が皆さんのWeb開発の理解の助けになれば嬉しいです。質問やコメントがあればぜひ教えてください！

## 補足：代表的な開発ツール/フレームワーク

### 静的サイト向け
- HTML/CSS/JavaScript（素のファイル）
- Jekyll
- Hugo
- Gatsby
- 11ty (Eleventy)

### 動的サイト向け
- PHP（WordPress, Laravel）
- Ruby on Rails
- Django (Python)
- Express (Node.js)
- ASP.NET

ぜひ自分のプロジェクトに合ったアプローチを選んでみてください！
NotebookLMで特許侵害リスクを音声要約でチェックする手法

![Screenshot 2025-05-21 at 10.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/59260739-a8d8-48f2-bd8d-ba46bca6fd4b.png)

## 概要
J-PlatPatから取得した特許PDFをNotebookLMにアップロードし、音声要約機能で「自社アプリに侵害リスクがあるか」を重点的に解説してもらう一連の流れを紹介します。

## 利用するもの
- J-PlatPat（https://www.j-platpat.inpit.go.jp/）
- GoogleアカウントでログインしたNotebookLM
- 対象特許PDF（例：特開2024-055734）

---

## 手順

### 1. 特許PDFをダウンロード  
1. J-PlatPatにアクセス  
2. 公開番号を検索  
3. PDFボタンをクリックして保存  

### 2. NotebookLMにPDFを登録  
1. NotebookLMで新規ノートを作成  
2. 「Add source」→「Upload file」からPDFを選択  
3. アップロード完了を確認  

### 3. Audio Overviewを設定  
1. 右ペイン「Audio Overview」→「Customise」をクリック  
2. フォーカス内容欄に以下を貼り付け  
3. 「Generate」をクリック  

```text
特許「特開2024-055734（情報処理装置、方法、プログラム、およびシステム）」について、弊社のアプリ開発において特許侵害のリスクがあるかを重点的に検討してください。

特に以下の点を明確にしてください：

1. 特許の技術的なポイントと保護されている内容  
2. 弊社アプリの機能と類似・関連する部分があるか  
3. 侵害の可能性がある場合、その具体的な理由  
4. リスク回避のために実装で工夫できる点があるか  

専門用語はなるべく避け、開発担当者にも理解しやすい言葉で解説してください。
```

---
### 4. 音声要約の活用  
- 自動生成されたナレーションを再生  
- キーフレーズ（侵害、回避、設計変更）をノートに保存  
- 社内レビュー用に重要箇所をテキストコピー  

---

## ポイント・コツ
- **自社アプリ機能概要**を先にメモしておくと精度アップ  
- 請求項や図面もPDFに含めると詳細な分析が得られる  
- 再生成オプションで解説の深度や例の追加が可能  

---

## おわりに
設計初期段階で特許侵害の予備調査を音声要約で手軽に実行できるため、開発リスクを大幅に低減できます。ぜひ社内ワークフローに組み込んでください。
c puzzle book basic type 3

```c:bt3.c
#include <stdio.h>
 
#define PR(x) printf("x = %g\t",(double)(x))
#define NL putchar('\n') 
#define PRINT1(x1) PR(x1); NL 
#define PRINT2(x1,x2) PR(x1); PRINT1(x2) 

int main() 
{ 
	double d=3.2,x; 
	int i=2, y;

	x = (y=d/i)*2; PRINT2(x,y); 
	y = (x=d/i)*2; PRINT2(x,y); 

	y = d * (x=2.5/d); PRINT1(y); 
	x = d * (y = ((int)2.9+1.1)/d); PRINT2(x,y);

	return 0;

}
```

```shell-session:bash
 gcc bt3.c
inst19@teachB:~$ ./a.out
x = 2   x = 1
x = 1.6 x = 3
x = 2
x = 0   x = 0
```

```c:bt3a.c
#include <stdio.h>

#define PR(x) printf(#x" = %g\t",(double)(x))
#define NL putchar('\n')
#define PRINT1(x1) PR(x1); NL
#define PRINT2(x1,x2) PR(x1); PRINT1(x2)

int main()
{
        double d=3.2,x;
        int i=2, y;

        x = (y=d/i)*2; PRINT2(x,y);
        y = (x=d/i)*2; PRINT2(x,y);

        y = d * (x=2.5/d); PRINT1(y);
        x = d * (y = ((int)2.9+1.1)/d); PRINT2(x,y);

        return 0;

}
```

```shell-session:bash
x = 2   y = 1
x = 1.6 y = 3
y = 2
x = 0   y = 0
````
7.2.1 ポインタ型レシーバと値型レシーバに関する考察

型Aをレシーバとした際に、値型を選択することの制限が以下のように書いてある。

```
あるポインタインスタンスに対しては、ポインタレシーバも値レシーバもそのポインタインスタンスのメソッドセットに含まれます。これに対して、値型インスタンスの場合、値レシーバのメソッドだけがメソッドセットに含まれます。
```

これはもう少し正確に言うと、`値が アドレス指定可能（addressable）かどうか」 によって挙動が変わる`となる。
例えば以下のようにコンパイラがアドレスを判別できれば、自動的に&をつけてくれるのでポインタメソッドを呼ぶことは可能

```go
type A struct{ x int }

func (a A)        valueMethod()  { fmt.Println("value", a.x) }
func (a *A)       pointerMethod() { a.x++; fmt.Println("pointer", a.x) }

func main() {
    var ap *A = &A{1}
    ap.valueMethod()   // OK
    ap.pointerMethod() // OK

    var av A = A{10}
    av.valueMethod()   // OK

    av.pointerMethod() // OK  ← アドレス取得が自動で挿入される
                       //      (実質 (&av).pointerMethod())
}
```

ただし、以下のようにアドレス指定ができない場合は、呼び出すことが出来ない

```go
A{3}.pointerMethod()       // リテラルは addressable でない
getA().pointerMethod()     // 戻り値は一時値で addressable でない
```
c puzzle book basic type 2.c


```c:bt2.c
#define PR(x)	printf("x = %.8g\t",(double)x)
#define NL	putchar('\n'):
#define PRINT4(x1,x2,x3,x4)     PR(x1); PR(x2); PR(x3); PR(x4)

void main(void)
{
        double d;
        float f;
        long l;
        int i;

        i = l = f = d = 100/3; PRINT4(i,l,f,d);         /* Basic Types 1.1 */
        d = f = l = i = 100/3; PRINT4(i,l,f,d);         /* Basic Types 2.1 */
        i = l = f = d = 100/3.; PRINT4(i,l,f,d);        /* Basic Types 2.2 */
        d = f = l = i = (double)100/3;
        PRINT4(i,l,f,d);                                /* Basic Types 2.4 */

        i = l = f = d = (double)(100000/3);
        PRINT4(i,l,f,d);                                /* Basic Types 2.5 */

        d = f = l = i = 100000/3; PRINT4(i,l,f,d);      /* Basic Types 2.6 */
}



/*
$ gcc bt2.c
bt2.c:7:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
    7 | main()
      | ^~~~~~
*/
```

```shell-session:bash
x = 33  x = 33  x = 33  x = 33  x = 33  x = 33  x = 33  x = 33  x = 33  x = 33  x = 33.333332   x = 33.333333   x = 33 x = 33   x = 33  x = 33  x = 33333       x = 33333       x = 33333       x = 33333       x = 33333       x = 33333      x = 33333        x = 33333   
```
異常終了について


異常終了（return 1; などを使って終了）すると、プログラムは 正常に動作しなかったことをシステムに伝える ことになります。

✅ 異常終了の影響
プログラムの途中で終了する

return 1; を実行した時点で、それ以降のコードは実行されずにプログラムが終わる。

例えば、ファイルを開けなかった場合、異常終了を使うとその後の処理（ファイルの読み込みや出力）は一切実行されない。

シェルやスクリプトから異常終了を検知できる

Cプログラムが異常終了すると、終了コード 1（または他の値）をシェルに返す。

シェルスクリプトやバッチファイルなどで エラーチェック をする際に使える。

sh
./program
echo $?
$? は直前のコマンドの終了コードを取得するもので、異常終了なら 1 が返る。

エラーメッセージを表示できる

perror() を使えば、異常終了時に適切な エラーメッセージ を表示できる。

ユーザーに何が問題だったのか伝えるための デバッグ情報 にもなる。

✅ 異常終了の実例
例えば、ファイルが存在しない場合に 異常終了をさせる 場合：

c
#include <stdio.h>

int main() {
    FILE *file = fopen("missing.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;  // 異常終了
    }

    printf("ファイルを正常に開きました！\n");
    fclose(file);

    return 0;
}
missing.txt が 存在しない場合 → perror("ファイルを開けませんでした"); のメッセージとともに return 1; により異常終了

存在する場合 → printf("ファイルを正常に開きました！\n"); が実行される

✅ まとめ
🔹 異常終了をすると、プログラムの途中で終了する 🔹 シェルやスクリプトは異常終了を検知できる（エラー処理に便利） 🔹 適切なエラーメッセージを表示できる（デバッグに役立つ）
Java spring 資格どっちを優先するべきか？

Javaで実務に入る前に、springの勉強をするのと、 javaのシルバーの勉強をするのではどちらを優先したほうがいいと思いますか？
それぞれの勉強の目的が異なるので、どちらを優先すべきかは大家さんの目指す方向によりますね。

Java Silver（認定試験） Javaの基本文法やオブジェクト指向の概念を体系的に学べるため、言語の基礎をしっかり固めるのに役立ちます。特に、CからJavaに移行する際、異なるメモリ管理や例外処理の概念を理解するのに有益です。資格取得はスキルの証明にもなり、就職や転職の際に評価されやすいです。

Spring（フレームワーク） 実務ではほぼ必須の知識ですが、Springを使うにはJavaの基本文法を理解していることが前提になります。データベース操作やDI（依存性注入）などの高度な概念を扱うため、Javaの基礎が固まっていれば、よりスムーズに習得できます。

どちらを優先すべきか？

Javaの基礎がまだ完全に固まっていない場合 → まず Silver の勉強を優先。

すでに Java の基本が理解できていて、実務を意識した学習をしたい場合 → Spring を優先。
c puzzle book basic type 1


```shell-session:bash
$ gcc b51.c
bt1.c:11:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
   11 |         PRINT(d, string);           // ポインタを %d で表示 → 型不一致のため %p で表示
      |                  ~~~~~~^
      |                  |
      |                  char *
bt1.c:3:34: note: in definition of macro ‘PRINT’
    3 | #define PRINT(format, x) printf(#x " = %" #format "\n", x)
      |     
```

```c:bt1.c
#include <stdio.h>

#define PRINT(format, x) printf(#x " = %" #format "\n", x)

int main()
{
	int integer = 5;
	char character = '5';       // ASCII 53
	char *string = "5";

	PRINT(p, string);           // ポインタを %d で表示 → 型不一致のため %p で表示 
	PRINT(d, character);        // character = 53
	PRINT(d, integer);          // integer = 5

	PRINT(s, string);           // string = 5
	PRINT(c, character);        // character = 5
	PRINT(c, integer = 53);     // integer = 5 (ASCII)

	PRINT(d, ('5' > 5));        // '5' (53) > 5 → 1

	int sx = -8;
	unsigned int ux = -8;

	PRINT(o, sx);               // sx = 37777777770（2の補数）
	PRINT(o, ux);               // ux = 37777777770（unsignedでも同じビット表現）

	PRINT(o, sx >> 3);          // 算術シフト（符号あり）
	PRINT(o, ux >> 3);          // 論理シフト（符号なし）

	PRINT(d, sx >> 3);
	PRINT(d, ux >> 3);

	return 0;
}

/*
nagai@compB05:~/Conpairu$ ./a.out
string = 0x564be7928004
character = 53
integer = 5
string = 5
character = 5
integer = 53 = 5
('5' > 5) = 1
sx = 37777777770
ux = 37777777770
sx >> 3 = 37777777777
ux >> 3 = 3777777777
sx >> 3 = -1
ux >> 3 = 536870911
```
c puzzle book op6.c 

```c:op6.c
#define PRINT3(x,y,z) printf("x=%d\ty=%d\tz=%d\n",x,y,z)
void main(void)
{ int x,y,z;
        x=y=z=1;
        ++x || ++y && ++z; PRINT3(x,y,z);
        x = y = z = 1;
        ++x && ++y || ++z; PRINT3(x,y,z);
        x=y=z=1;
        ++x && ++y && ++z; PRINT3(x,y,z);
        x=y=z=-1;
        ++x && ++y || ++z; PRINT3(x,y,z);
        x=y=z=-1;
        ++x || ++y && ++z; PRINT3(x,y,z);
        x=y=z=-1;
        ++x && ++y && ++z; PRINT3(x,y,z);
}

```

```shell-session:bash
x=2     y=1     z=1
x=2     y=2     z=1
x=2     y=2     z=2
x=0     y=-1    z=0
x=0     y=0     z=-1
x=0     y=-1    z=-1
```
AWSのIAMって何？

# 何を書いている？

AWSのIAMロールの仕組みをシンプルに理解するための解説。
IAMロールって何？という方向けです！

## IAMロールの設定手順


1. IAMロールを作成（ただの箱）
　
2. 信頼ポリシーを設定
   → このIAMロールがどのリソースに適用できるのかを定義
   （例：EC2に適用できるものであることを定義）
　
3. 信頼ポリシーを1のIAMロールに紐付け
　
4. ロールポリシーアタッチの設定
   → 任意のポリシーを1のIAMロールに紐付ける
   → ポリシーは権限みたいなものでS3のファイルを読み取れるようにするポリシーなどがある
   （逆にこれをしないと他のリソースにアクセスできない）


## 出来上がったIAMロール

上記により、IAMロールは以下のような中身となります：


- EC2に適用できる
- 適用することでS3のファイルを読み取る権限が付与される
　

**このIAMロールをインスタンスプロフィールを使ってEC2に紐づける**
→ これにより初めてそのEC2がS3を読み取れるようになる👍


## まとめ
IAMロールは「誰が」「何を」できるかを明示的に設定できる仕組みのこと。
- 信頼ポリシー → 誰が（EC2）このロールを使えるか
- アクセスポリシー → 何を（S３内のファイル読み取り）することができるか


## 感想
わざわざこんな設定しやなアクセスできひんのk、、とも思いましたが、確かに明示的に許可されたものしかアクセスできないのは安全。
【VRChat】Udon Sharpの開発環境をvscodeで構築する

## はじめに
皆さんこんにちは初めまして一ノ瀬です。
VRChatを2024年5月に始め、そろそろ1年が経とうとしています。
今回は自分の備忘録も兼ねて、Udon Sharp(以下:U#)の開発環境をvscodeで構築する方法を紹介したいと思います。
プロジェクトの作り方や、コードの書き方までは説明しませんのであくまで準備方法の説明と捉えていただければ幸いです。

## 1. 拡張機能のインストール
まず最低限必要な拡張機能が「[Unity](https://marketplace.visualstudio.com/items/?itemName=VisualStudioToolsForUnity.vstuc)」です。
![](https://storage.googleapis.com/zenn-user-upload/450a9d231813-20250510.png)
こちらをインストールすることによって、vscodeでC#を書くのに必要な拡張機能[^1]がインストールされます。必ずインストールしておいてください。
[^1]: [C# Dev Kit](https://marketplace.visualstudio.com/items/?itemName=ms-dotnettools.csdevkit)と[C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)

そしてU#の補完をしてくれる便利な拡張機能「[Udon Sharp Snippets](https://github.com/ChrisFeline/vscode-usharp-snippets)」もインストールしておきましょう。かなり便利な拡張機能です。
![](https://storage.googleapis.com/zenn-user-upload/1d3f536563b3-20250510.png)
しかし1つ注意点があり、VSIXファイルをgithubからインストールし、そのファイルをvscodeに入れるといった方法でインストールを行います。
詳しい方法はREADMEに記載がありますのでご覧ください。
Releasesページは[こちら](https://github.com/ChrisFeline/vscode-usharp-snippets/releases)

## 2. Unity側の設定
先ほどまででvscodeの設定は完了したので、今度はUnity側を設定していこうと思います。
まずは適当にワールドプロジェクトを1つ作成してください。
そうしたら、設定を開いてください。
(筆者はMacユーザーのため、Macの画面しか出せませんがWindowsの方は頑張ってください。)
![](https://storage.googleapis.com/zenn-user-upload/ba744ee0acb7-20250513.png)
設定を開けたら、「外部ツール」を選択し「外部のスクリプトエディター」から「Visual Studio Code」を選択します。
![](https://storage.googleapis.com/zenn-user-upload/9b01f70177fb-20250513.png)
こうすることによって、UnityでC#ファイルをダブルクリックして開こうとするとvscodeが立ち上がります。
これで完成です。

## 終わりに
わからないことがあったらChatGPTに聞きましょう。
簡単なことであれば結構ちゃんと答えてくれます。
あとは調べる力をつけることも大切ですね。何でもかんでも人に聞くのではなくまず調べる。
そしてリファレンスを読む。
以上です。
【ハンズオン】AWS DataSyncでオンプレ→S3にデータ転送するタスクを作成してみる

# 【ハンズオン】AWS DataSyncでオンプレ→S3にデータ転送するタスクを作成してみる

前回の記事で紹介した [AWS DataSync](https://aws.amazon.com/jp/datasync/) を使って、実際に**オンプレミス（NFSサーバ）からS3へデータを転送するタスクを作成する手順**を解説します。

GUIベースで簡単に設定できますので、AWS初心者の方でも試しやすいです！

---

## 🔧 前提条件

- AWSアカウントを保有している  
- S3バケットが作成済み（転送先）  
- オンプレまたはEC2上に **NFS共有** または **SMB共有** がある  
- DataSyncエージェント（仮想マシン or EC2）がデプロイ済み  
  - [エージェントのデプロイ手順はこちら](https://docs.aws.amazon.com/datasync/latest/userguide/deploy-agents.html)

---

## ✅ 手順概要

1. DataSyncエージェントの登録  
2. ソースロケーション（NFSなど）の設定  
3. 宛先ロケーション（S3など）の設定  
4. タスクの作成とオプション設定  
5. タスクの実行・確認

---

## ① エージェントの登録

1. AWSコンソールから「AWS DataSync」サービスを開く  
2. 左メニュー「エージェント」→「エージェントの作成」  
3. エージェントのIPアドレスを入力（HTTPS:ポート443で通信）  
4. VPCやセキュリティグループが適切に設定されていれば、自動で検出されます

---

## ② ソースロケーションの作成（例：NFS）

1. 「ロケーション」→「ロケーションを作成」  
2. ロケーションタイプで「NFS」を選択  
3. NFSサーバーのホスト名/IP、エクスポートパスを指定  
4. 接続に使用するエージェントを選択し、保存

---

## ③ 宛先ロケーションの作成（例：S3）

1. 同じく「ロケーションを作成」→「Amazon S3」を選択  
2. 対象のS3バケットとプレフィックス（オプション）を指定  
3. 使用するIAMロールを選択（S3書き込み権限が必要）  
   - または自動生成するオプションも選べます

---

## ④ タスクの作成

1. 「タスク」→「タスクを作成」  
2. ソースロケーションと宛先ロケーションを指定  
3. 転送設定を構成（例：同一ファイルを上書きするか？削除するか？など）  
4. タグやCloudWatchログの設定も任意で可能  
5. 「タスクを作成」をクリック

---

## ⑤ タスクを実行・監視する

1. 作成済みタスクを選択して「実行」  
2. 初回転送の進行状況が表示される（数分〜数時間）  
3. 転送結果・ログはCloudWatchやタスクの詳細から確認可能

---

## 📌 よくあるオプション設定

| 設定項目                     | 説明                                           |
|--------------------------|----------------------------------------------|
| ファイル更新ルール             | 上書きのみ／新規のみ／すべて転送などが選べる                     |
| メタデータの保持               | 所有者・パーミッション情報を保持するかどうか                      |
| 転送除外パターン               | 一部の拡張子やフォルダを除外する設定が可能（例：`*.tmp`）         |
| スケジュール実行               | 定期実行（cron形式）も設定可能で、夜間バックアップなどに便利         |

---

## 🔗 公式ドキュメントリンク

- [AWS DataSync User Guide](https://docs.aws.amazon.com/datasync/latest/userguide/what-is-datasync.html)
- [タスク作成ガイド（NFS → S3）](https://docs.aws.amazon.com/datasync/latest/userguide/create-nfs-to-s3-task.html)

---

## 📝 まとめ

AWS DataSyncは、GUIベースで直感的に使えるため、**オンプレからの移行やバックアップ自動化に非常に便利**です。  
大容量データを扱うプロジェクトでの**第一歩のクラウド連携**にも最適です。

今後の記事では、**S3転送コストの最適化Tips**や**転送失敗時のトラブルシュート**も取り上げていく予定です。興味のある方はぜひフォロー＆いいねお願いします！
AWSアラートにChatGPTで即時対応：Slackとメールにエラー原因を通知する仕組みを作った

## はじめに
普段の業務でAWSを用いた開発・運用をしています。
AWSの勉強を兼ねて、自分で手を動かしつつ普段のお困りごとを解消できる手立てを探るべく、システムでアラートが発生した際に役立つ仕組みを作ってみたのでまとめます。

## 記事の概要
- AWS環境で発生したエラーに即座に対応するため、生成AI（ChatGPT）を活用した自動通知システムを構築
- この記事では、CloudWatch Alarm、SNS、Lambdaを使って、エラーを検出し、その内容をChatGPTに確認してSlackやメールで担当者に通知する仕組みについて紹介
- この記事は、システム障害やアラートの初動対応を自動化したい運用者やSRE、AWSを使いこなしている技術者向け

## やりたいこと
- アラート発生時にChatGPTを使って自動的にエラーの概要と対処法を取得し、通知する
- 通知はメールとSlackを利用する

## 構成概要
- 主要AWSサービス：
    - Amazon CloudWatch Alarm
    - Amazon SNS（Simple Notification Service）
    - AWS Lambda
- 生成AI：OpenAI API (ChatGPT)
- 通知：SNSを使ってメール通知、WebhookでSlack通知

### 全体の流れ：
1. CloudWatch AlarmでLambdaのエラーを検知
2. LambdaがSNSに通知を送信
3. SNSからLambdaをトリガーし、エラー詳細をCloudWatch Logsから抽出
4. OpenAI APIにエラー内容を送信し、エラー概要と対処法を取得
5. 得られた結果をSNSでメール通知、SlackにWebhookで通知

## 実装詳細

### 1. CloudWatch Alarmの設定
- **アラーム対象：** Lambda関数で発生するエラー
- **設定手順：**
  - AWSマネジメントコンソールでCloudWatchに移動
  - 「アラーム」を作成し、Lambdaエラーのメトリクスを選択
  - 通知先としてSNSを設定

### 2. 通知先のLambdaトリガー
- **Lambdaの役割：**
  - CloudWatch Alarmが発生した際にSNSから通知を受け取り、エラーの詳細をCloudWatch Logsから抽出
  - OpenAI APIにリクエストを送り、エラーの概要と解消方法を取得
  - SNSを通じて、担当者にメール通知およびSlack通知を送信

### 3. Lambdaで実行する処理
- **CloudWatch Logsからエラーの抽出：**
  - Lambda関数内で、CloudWatch Logsからエラーメッセージをパースして抽出
- **OpenAI APIへのリクエスト：**
  - エラー内容を元に生成AI（ChatGPT）に問い合わせ、エラー概要と解消方法を取得
  - プロンプトの例：
    ```text
    エラー内容: {エラーメッセージ}
    解決策を教えてください。
    ```
- **結果の整形：**
  - 得られた回答をパースし、メールやSlackで通知できる形式に整形

### 4. 通知の仕組み
- **メール通知（SNS経由）：**
  - SNSトピックを通じて、エラーの概要と解消方法を担当者にメールで通知
- **Slack通知（Webhook）：**
  - Webhookを利用して、Slackにエラーメッセージと解決策を通知

## 実行例
### 例：エラー発生時のログ
- エラー発生時のCloudWatch Logsから抽出されたエラー内容：
Error: Lambda function failed due to timeout.

### 例：ChatGPTの回答
- OpenAI APIから得られたエラー概要と解決策：
エラー概要: Lambda関数がタイムアウトして失敗しました。 解決策: タイムアウト時間を延長するか、関数の処理時間を短縮するためにコードの最適化を行う必要があります。

### 例：Slack通知
- 通知内容（Slackスクリーンショット例）：
【エラー発生】Lambdaタイムアウト エラー概要: Lambda関数がタイムアウトしました。 解決策: タイムアウト時間を延長または処理時間の短縮が必要です。

## 工夫したポイント・ハマりどころ
- **エラー抽出の制限：**
    - CloudWatch Logsの中でも、特定のロググループに絞ってエラーを検出するようにした
    - 大量にエラーが発生しているときに全てをAPIで投げるとコストや性能に影響するため、直近○件のエラーなど件数に制限をつけた
- **ChatGPTへのプロンプト：**
    - 抽出したエラーの中からエラー文言を整形して適切なプロンプトを設計し、明確な回答が得られるよう調整した
- **通知内容の整形：**
    - Slackやメールでの通知が見やすく、わかりやすい形式になるようにフォーマットを整えた

## 今後の展望
- **DBへのエラーデータ保存：**
    - 今後は、エラー詳細や解決策をデータベースに保存し、後から振り返りや再利用できるようにする予定
    - 過去の似たエラーとその解消方法を蓄えていくことでより迅速な対応を可能にしたい
- **通知する先を自動で識別：**
    - エラー文言やその対処法をもとに、通知先を自動で変える仕組みを導入
    - より的確な対応を取れる担当者にいち早く知らせたい

## まとめ
本記事では、AWS CloudWatch AlarmとLambda、そしてOpenAI APIを使って、システム運用におけるエラー検知から通知までの自動化を実現しました。生成AIを活用することで、システム運用の初動対応が迅速化され、より効率的な運用が可能となります。

### 感想
普段は実装まですることがないので、コーディングだけでなくマネコンでの設定方法やレイヤーの使い方など、文章でやり方を勉強することがほとんどでした。
今回実際にやってみたというところまで経験できたことで、AWSサービスそれぞれの理解が深まりましたし、今後の開発業務でもどの工程でどんなことに困るのか想像しやすくなりました。
今後も継続的に自分の手で試していきます。

Lambdaのコードやその他AWSサービス利用時のマネコンでの設定などは別記事でまとめます。
KubernetesでLimitedSwapを使用する設定方法

## 前提条件
- Kubernetes v1.22以降が必要（v1.28でベータ、最新のv1.32では機能改善あり）
- cgroup v2が必須（cgroup v1ではサポートされていない）
- ノード上にスワップが有効かつプロビジョニングされていること

## kubelet設定

kubelet設定ファイルにおける表現:

```yaml
failSwapOn: false  # スワップが有効な場合でもkubeletを起動可能にする
memorySwap:
  swapBehavior: LimitedSwap  # スワップポリシーを設定
```

**swapBehaviorのオプション**:
- `UnlimitedSwap`: (v1.32で削除) Kubernetesワークロードはシステム制限までスワップメモリを無制限に使用可能
- `LimitedSwap`: Burstable QoSのポッドのみスワップ使用可能で、使用量は制限される
- `NoSwap` (デフォルト): Kubernetesワークロードはスワップを使用不可

## QoSクラスとスワップの関係

### QoSクラスの説明
1. **Guaranteed**:
   - すべてのコンテナがメモリとCPUの`requests`と`limits`を指定し、両方が同じ値
   - 最も高い優先度を持ち、リソース不足時に最後に削除される
   - スワップ: 通常はスワップを使用しない

2. **Burstable**:
   - 少なくとも1つのコンテナがメモリまたはCPUの`requests`を指定
   - `requests`と`limits`が異なるか、`limits`が指定されていない場合
   - スワップ: `LimitedSwap`設定時のみスワップ使用可能

3. **BestEffort**:
   - どのコンテナも`requests`も`limits`も指定していない
   - リソース不足時に最初に削除される最低優先度

### LimitedSwapモードでのBurstable QoSの動作

- Burstable QoSのポッドのみがスワップメモリを使用可能
- ポッドに割り当てられるスワップ量は、そのポッドが要求するメモリ量とノードの総メモリ量の比率に基づいて自動的に決定される
- Burstable QoSでもメモリの`requests`と`limits`を同じ値に設定すれば、そのコンテナはスワップを使用しない

## Pod仕様での関連表現

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: app
    image: example/app
    resources:
      requests:
        memory: "128Mi"  # メモリリクエスト
      limits:
        memory: "256Mi"  # メモリ制限
```

このPodはメモリの`requests`と`limits`が異なるため、**Burstable** QoSクラスとなり:
- kubeletが`LimitedSwap`モードの場合: スワップメモリを使用可能
- kubeletが`NoSwap`モードの場合: スワップメモリは使用不可

## セキュリティ上の注意点
- セキュリティリスクを軽減するため、暗号化されたスワップを使用することが推奨されています
- 重要な情報（Kubernetesのシークレットなど）がディスクにスワップアウトされる可能性があるため

## 注意点

- 現在のところ、各ワークロードごとに個別のスワップ制限を設定するAPIはサポートされていない
- スワップ使用許可は、kubeletレベルで全体的に設定される
- メモリ使用量とスワップ使用量に関する指標はkubeletの`/metrics/resource`と`/stats/summary`エンドポイントから取得可能
自分用メモ: Karpenterでスワップ自動設定：EC2インスタンスに20GBスワップ領域を追加する方法

注意: 未検証

## ユーザーデータスクリプトの指定方法

EC2NodeClassリソースの`userData`フィールドにスクリプトを指定します。

## 20GBスワップファイル設定用のユーザーデータスクリプト

### 設定例

```yaml
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: default-with-swap
spec:
  amiFamily: AL2
  role: "KarpenterNodeRole-${CLUSTER_NAME}"
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}"
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}"
  userData: |
    #!/bin/bash
    
    # 20GBのスワップファイルを作成
    dd if=/dev/zero of=/swapfile bs=1M count=20480 status=progress
    
    # スワップファイルに適切なパーミッションを設定
    chmod 600 /swapfile
    
    # ファイルにスワップ領域を設定
    mkswap /swapfile
    
    # スワップファイルを有効化
    swapon /swapfile
    
    # fstabに追加して永続化
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
    
    # スワップ使用度の調整（オプション）
    echo 'vm.swappiness=10' >> /etc/sysctl.conf
    
    # sysctlの変更を適用
    sysctl -p
```
品質が低すぎるか<中略>1 個の時系列が除外されます(SPSS Modeler データ加工逆引き12-11)

# 品質が低すぎるか<中略>1 個の時系列が除外されます（時系列モデル）

![スクリーンショット 2025-05-15 8.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/16bddb07-ba9f-4147-a2c9-1f2b22c0e73e.png)

エラーメッセージ：AEQTD0021W: 品質が低すぎるか、品質が定数か近似定数であるため、1 個の時系列が除外されます

## 1.想定される利用目的

・時系列モデル作成時にエラーが起きる

*予測対象である将来の時系列を空白やnullにした状態でモデリングした場合に生じるエラーのハンドリング

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/trendmodel_null_ng.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-05-15 8.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/78718b6b-0031-4d19-a929-d93e213e794d.png)

a.入力するデータは以下のとおりです。予測対象は特定店舗の販売数を示す[実績]です。説明変数として店舗エリアの[降水量][最高気温][日照時間]に加え販売数へ影響する近隣大学の開講時期を意味する[大学講義]および店舗での[特売]の有無が準備されています。
[2023-11-16]以降は未来の値であるため実績にはnullが、説明変数には気象予報および計画が記されています。

![スクリーンショット 2025-05-15 8.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1db26f5-feef-4a1c-bfd3-8816f78321c3.png)

b.[データ型]ノードを編集します。ロールを画面のように設定して、予測対象と入力変数を定義します。

![スクリーンショット 2025-05-15 8.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ef3c247f-c339-4faf-a73a-67241a5ace5c.png)


#### エラーの現象を確認する

c.[時系列モデル]ノードを編集します。[データ指定]タブの[観測]項目で日付の定義を行います。

![スクリーンショット 2025-05-15 8.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b325ca2a-5d1f-4422-87ef-e324b36d001c.png)

[時系列モデル]ノードを実行します。エラーメッセージが表示されモデルは生成されません。

![スクリーンショット 2025-05-15 8.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/012e87c5-cd8b-4583-b724-f89408e9e5ef.png)

#### モデルに学習させる時系列の区間を設定する

d.[時系列モデル]ノードを編集します。実績が含まれていない最後の7日間のデータを除外します。

![スクリーンショット 2025-05-15 8.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/663d7e47-9669-42ba-ad3c-26f37e1ad105.png)

[時系列モデル]ノードを実行します。[時系列モデル]ナゲットeが生成されます。

e.[時系列モデル]ナゲットを配置します。

[テーブル]を実行します。予測と95%上限/下限の３つのフィールドが追加されています。

![スクリーンショット 2025-05-15 8.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3cb9f64c-49a4-470c-9a2e-d843726706f1.png)


#### 注意点

学習時には過去データのみを利用し、将来値を含んだデータをスコアリングすることも可能です。運用に適した方法を検討してください。

## 4.参考情報

#### 時系列モデル

https://qiita.com/416nishimaki/items/f7842af5af1d6410526d

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
モジュール '"@prisma/client"' にエクスポートされたメンバー 'PrismaClient' がありません。で詰まったログ

# 背景
「AI駆動開発や！」と息巻いて環境構築からAIに頼って理解なく進んだ結果、公式ドキュメントを追っていれば引っかからないような問題に直面してしまいました。
初歩的内容になるが、同じようなところで詰まる人が少なくなるように以下にログを残します。

以下、
`@prisma/client` が存在するのに `PrismaClient` やモデルが import できない現象に悩まされたので、解決パターンを整理。

## 結論

Prisma の `schema.prisma` で **`generator client` に `output` を指定していた** のが原因。  
これにより `@prisma/client` に Prisma Client のコードが生成されず、型エラーが発生していた。

---

## 環境構成
* 技術スタック
    * pnpm
    * prisma
    * NextJs （今回はあまり関係ないかも）

以下のような構成です。
```plaintext
projectName/
├── pnpm-workspace.yaml
├── backend/  ← Prisma 定義・使用場所
│   ├── prisma/
│   │   └── schema.prisma
│   ├── src/
│   │   └── tasks.service.ts （← PrismaClient を使いたい）
├── frontend/
└── infra/
```

---

## 起きていた問題

```ts
import { PrismaClient } from '@prisma/client'
```

のように書いているのに、以下のようなエラーが発生：

```bash
Cannot find module '@prisma/client' or its corresponding type declarations.
```


---

## 原因

`schema.prisma` に以下のような設定があった：

```prisma
generator client {
  provider = "prisma-client-js"
  output   = "../node_modules/.prisma/client"
}
```

これは Prisma Client を通常の `@prisma/client` ではなく、別フォルダ（`.prisma/client`）に出力する指定です。

結果として：

- `@prisma/client` は存在するが、中身が空に近い状態
- 型定義も `PrismaClient` の実体も import できない
- tsconfig やパス設定をいくら調整しても解決しない

---

## 解決策

### 1. `schema.prisma` を修正する

```diff
generator client {
  provider = "prisma-client-js"
- output   = "../node_modules/.prisma/client"
}
```

output 行を削除。

問題解決のために以下を再実行、と検索結果として出たりするのですが、私の場合は関係ありませんでした（問題の本質をちゃんと見極めるためにも、使っているものの理解は大事ですね💦）。

```bash
pnpm install
npx prisma generate
```


---

### 2. Prisma Client を再生成

```bash
cd backend
pnpm prisma generate
```

これで正しく `@prisma/client` に PrismaClient とモデルの型が出力された。

---

## outputの用途は？
- Prisma Client を複数のサービスで共有したい場合のみ `output` を活用すべき。

---

## 📝 まとめ

| 問題 | 原因 | 解決方法 |
|------|------|-----------|
| `@prisma/client` はあるのに使えない | `output` によって生成先が変わっていた | `output` を削除して `prisma generate` |

---

## 補足

この問題とは直接関係ないのですが、以下の修正も必要だったので補足として記載しておきます。

ts.config.jsonのcompilerOptionsに以下を追加
```json
{
    "compilerOptions" : {
        "baseUrl": ".",
        "paths": {
          "@prisma/client": ["node_modules/@prisma/client"]
        }
    }
}
```


同じ問題で悩んでいる方の参考になれば幸いです！
【Claude 3.7sonnet】フィットネスアプリ開発レポート!

## はじめに
現在、Claude 3.7 sonnet を色々と試してみようということで
Claude 3.7 sonnet を使ってアプリ開発を行っております

今回は第5弾！Claude 最終回です（今のところ）！フィットネスアプリです！

これまでの記事はこちら

https://qiita.com/shimizu_432/items/0c8a8e91365b79164e33

https://qiita.com/shimizu_432/items/b5bf6de705056b9a19d4

https://qiita.com/shimizu_432/items/2a90c338fc03c763de82

https://qiita.com/shimizu_432/items/404ce15be58b4e5606ba

## フィットネスアプリを作っていく！

これまでアプリを作ってもらうとReactで作ってくれていました
ということで、他の言語で作ってもらえないかということをお願いしてみようと思います！

まずはアプリを作ってもらおうと思います。プロンプトはこちら
```ruby:プロンプト
以下のアプリを作って
　フィットネス追跡アプリ
　　機能: トレーニングプランの作成、運動の記録、進捗のトラッキング、目標設定など。
　　特徴: ユーザーがフィットネス目標を達成できるようにサポートします。
```
【TOP】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/19e280b0-67fa-491b-be6a-ae84d640d358.png)

【ワークアウト】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/cd83486d-ed38-4d7c-8d65-6ed30cd97ae2.png)

【トレーニングプラン】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/c1161545-7a05-4991-8c72-2cec3f91f400.png)

【プロフィール】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/70660566-6e47-481f-bdf9-8b0527515c8e.png)


シンプルで見やすいアプリを作ってくれました！
トレーニングプランのところは変更しても何も反映されませんが、他は動きそうです！
今回はReact以外の言語で作ってほしいのがメインなため、こちらをお願いします！


```ruby:プロンプト
react以外の言語で作ることは可能？
```

```ruby:生成AIの回答
もちろん、React以外の言語でもフィットネス追跡アプリを作成することが可能です。別の選択肢をいくつか紹介します。HTML、CSS、JavaScriptを使った純粋なWebアプリケーションバージョンを作成しましょう。
```
ということで作ってくれるそうです！

楽しみに待っていたのですが、エラーが何度も続き、完成しませんでした
コードを見た感じ、<script>, <Body>, <html>すべて終わりしか記載されておらず、
行数もあまりにも短いなど他の言語は苦手なように感じました


## 今回の気づき
・Reactのアプリ作成は得意そう
・React以外の言語では苦手そう
Semantic Issue (Xcode): Use of undeclared identifier 'FIRVectorValue'の解決方法

## 環境
- macOS Sequoia 15.3
- Flutter 3.27.3
- Xcode 16.2

## エラー本文
```
Could not build the precompiled application for the device.
Semantic Issue (Xcode): Use of undeclared identifier 'FIRVectorValue'
/Users/user-name/.pub-cache/hosted/pub.dev/cloud_firestore-5.6.7/ios/cloud_firestore/Sources/cloud_firestore/FLTFirebaseFirestoreReader.m:40:15
```

## 原因
おそらく`Podfile`で指定しているfirestoreのパッケージと`pubspec.yaml`で使っているfirestoreのバージョンが不整合になっている

## 解決
リリースノートを読むと`FIRVectorValue`は[v11.1.0](https://firebase.google.com/support/release-notes/ios?_gl=1*1587ezt*_up*MQ..*_ga*NzM3MDcxNTU4LjE3NDc3MTQ4MzA.*_ga_CW55HF8NVT*czE3NDc3MTQ4MzAkbzEkZzAkdDE3NDc3MTQ4MzAkajAkbDAkaDAkZHBnRkQ4MlFiTHlvbWhHVEtlSHY5dFhEUEcyUnpHSGlLc1E.#version_1110_-_august_19_2024)からサポートされているので以下のような記述がある場合は削除またはコメントアウトする

```podfile
# 以下のような記述があればコメントアウト
# $FirebaseSDKVersion = '10.29.0' 
```
```puspec.yaml
  firebase_core: ^3.13.0 # 最新に近いバージョンにしておく
```

あとは適当にいつものコマンドをして
```shell
flutter clean
rm -rf ios/Pods/
rm -rf ios/Podfile.lock
flutter pub get
cd ios
pod install --repo-update
flutter pub cache repair
flutter pub cache clean
```
【備忘録】データ交換フォーマット選定比較   JSON・YAML・XML から Protobuf・Parquet まで

## はじめに

API 設計、CI/CD、IoT、ビッグデータ──システム開発をしていると “**データをどうやってやり取りするか**” という問題が必ず出てきます。  

ところが **「結局どのフォーマットを選べばいいの？」** は意外と忘れがち。そこで、業務でよく登場する代表的フォーマットを **可読性・スキーマ管理・ライブラリ対応・用途** の観点でまとめました。  

---

## 1. 主要フォーマット早見表

| フォーマット | カテゴリ | 可読性 | スキーマ管理 | 主な特徴 | 代表ライブラリ／言語 | 想定ユースケース |
|--------------|----------|-------|--------------|----------|---------------------|------------------|
| **YAML** | 階層テキスト | ★★★★★ | JSON Schema / YAML Schema | インデントで直感的。コメントOK。 | PyYAML / gopkg.in/yaml.v2 | K8s マニフェスト<br>GitHub Actions |
| **XML** | 階層テキスト | ★★★☆☆ | XSD / RELAX NG | タグ＋属性。名前空間◎。 | Java JAXB / .NET System.Xml | SOAP / レガシー連携 |
| **JSON** | 階層テキスト | ★★★★☆ | JSON Schema | 軽量 & パース高速。コメント×。 | JS 標準 / Python `json` | REST API / Front 設定 |
| **CSV / TSV** | フラットテーブル | ★★★★☆ | なし | 表形式に特化。 | Python `csv` / Pandas | データ入出力 / ETL |
| **INI** | 設定ファイル | ★★★★☆ | なし | `[section]` + `key=value` | Python `configparser` | 軽量アプリ設定 |
| **TOML** | 設定ファイル | ★★★★★ | 型付き | Rust 標準。配列・日付◎。 | `toml` (Py) / Cargo | Rust プロジェクト設定 |
| **Protocol Buffers** | バイナリ (IDL) | ★☆☆☆☆ | .proto | gRPC 標準。超コンパクト。 | 多言語 (protoc) | マイクロサービス RPC |
| **Apache Avro** | バイナリ (スキーマ込み) | ★☆☆☆☆ | Avro Schema | スキーマ進化に強い。 | `fastavro` / Kafka | ストリーム処理 |
| **MessagePack** | バイナリ (スキーマレス) | ★☆☆☆☆ | なし | JSON のバイナリ版。 | `msgpack` (Py/JS) | モバイル / IoT |
| **CBOR** | バイナリ (スキーマレス) | ★☆☆☆☆ | なし | IoT に最適化。 | `cbor2` / libcbor | 組み込み |
| **Parquet** | 列指向ストレージ | ☆☆☆☆☆ | メタデータ | 列圧縮。分析特化。 | PyArrow / Spark | ビッグデータ分析 |
| **EDIFACT／X12** | EDI 標準 | ☆☆☆☆☆ | 標準定義 | 企業間取引。 | Smooks 等 | 受発注・請求書 |
| **RDF / Turtle** | グラフデータ | ★★☆☆☆ | OWL / SHACL | トリプルで関係を表現。 | rdflib / Jena | ナレッジグラフ |

> ⭐️ **可読性スコア**: ★★★★★ = 人間が楽に読める / ☆☆☆☆☆ = 基本バイナリ

---

## 2. 選定フローチャート（ライト版）

1. **手動でしょっちゅう編集する？**  
   → **Yes** : YAML / TOML / INI  
   → **No** → 2 へ

2. **低レイテンシ or 帯域制限がキツい？**  
   → **Yes** : Protocol Buffers / MessagePack / CBOR  
   → **No** → 3 へ

3. **大量データを分析基盤で扱う？**  
   → **Yes** : Parquet / ORC  
   → **No** → 4 へ

4. **Web API？**  
   → **Yes** : JSON（一択と言っていい）  
   → **No** → XML か EDI など業界標準に合わせる

---

## 3. 具体的なシナリオ別おすすめ

| シナリオ | ベストチョイス | 理由 |
|----------|---------------|------|
| **マイクロサービス間 RPC** | Protocol Buffers + gRPC | スキーマ安全 & 転送コスト最小 |
| **Kubernetes マニフェスト管理** | YAML | コメント・アンカーで DRY |
| **フロント〜バックの JSON API** | JSON + OpenAPI | JavaScript との親和性|
| **Raspberry Pi ↔ クラウド** | CBOR / MessagePack | 低帯域で省電力 |
| **Hive/Spark 解析用ログ** | Parquet | 列圧縮＆スキーマ進化 |
| **EDI 受発注** | EDIFACT / X12 | 業界標準プロトコル |

---

## 4. スキーマ管理ベストプラクティス

- **JSON** → `AJV` や `jsonschema` でバリデーション  
- **XML** → `XSD` を CI に組み込み自動検証  
- **Protobuf / Avro** → スキーマレジストリ（Confluent など）でバージョン管理  
- **YAML** も実は **JSON Schema** で検証可能（`yaml-language-server` が便利）

---

## 5. まとめ

- **人が読む設定** : YAML / TOML  
- **機械間通信** : JSON or バイナリ系  
- **データウェアハウス** : Parquet / ORC  
- 迷ったら **「誰が読み書きする？」「どの言語で処理する？」** をまず考える  
- **スキーマ管理** と **テスト自動化** を忘れずに！

---

### 参考リンク

- [Official JSON Schema](https://json-schema.org/)
- [Protocol Buffers Documentation](https://developers.google.com/protocol-buffers)
- [Apache Parquet](https://parquet.apache.org/)
内示・在庫・資材集約を使って購買コストを下げる：業務フローとロジック設計のアプローチ

# 製造業における購買戦略の整理と設計：在庫・発注・資材の最適化をどう進めるか

最近、ある製造業系の購買部門で、資材調達コストの継続的な削減を目的とした構想整理と複数プロジェクトの横断設計に関わる機会がありました。

業務改善や仕組み構築に関心のある方向けに、「どういう考え方で整理していったのか」を中心にまとめてみます。業界やテーマが近い方の参考になればうれしいです。

---

## 背景と目的

この企業の購買部門では、調達コストを前年比10%以上削減するという中期目標が掲げられていました。

これを達成するために、単発の改善ではなく「調達構造そのものを見直すプロジェクト」を立ち上げ、以下の3テーマが並行して走る体制となりました。

---

## 構想フェーズで整理した3つのアプローチ

```text
1. 発注点数の削減と購買ロットの最適化
2. 需要予測を活用した前倒し購買判断
3. 在庫情報のリアルタイム取得と発注判断の自動化
```

これらをそれぞれプロジェクトに分解すると、以下のようになります。

---

## 各プロジェクトとその目的

| プロジェクト名 | 主な狙い | 手段 | 担当する役割 |
|----------------|-----------|------|----------------|
| 資材仕様統合と発注数削減 | バラつきのあるサイズ・規格を統一して発注数とSKU数を削減 | 吸収可能な資材を代表仕様に再定義 | 仮説立案〜検証ロジック設計を担当 |
| 需要データ活用と発注前倒し | 将来の需要見込みを使って発注タイミングを最適化 | 顧客からの予告情報（内示）を基にした購買設計 | ユーザーヒアリングと活用方法の再定義を担当 |
| 在庫可視化とセンサー連携 | 現場に行かずに在庫状況を把握し、欠品/過剰リスクを減らす | 重量センサーデバイス（SmartMat）導入 | システム要件整理と分析項目の洗い出しを担当 |

---

## 担当した範囲の整理

### ① 資材仕様の集約ロジック策定

資材間で「どこまで仕様を吸収・統合できるか？」を判断するために、以下のようなステップでロジックを構築しました：

- 【命題】類似資材の吸収可能性を“仕様面”と“寸法面”から評価できるか？
- 【仮説】同一厚み・切り出し可能・指定材以外であれば代表化可能
- 【検証】使用予定データと組み合わせて切り出し係数ベースで吸収可能性を判定

→ 各資材を「代表サイズ／配下資材／対象外」に分類し、発注対象を再構成する検証を担当。AIとロジックフローを確定させて、Python/AIで集計をするという感じ。

---

### ② 在庫可視化PJ：センサーデバイス導入に向けた要件整理

重量センサーを使って、以下のような情報をリアルタイムで取得する構想を担当：

- 総重量 → 個数変換（基準重量で割る）＝在庫数量のリアルタイム管理
- 発注点到達時にアラート通知を出すような仕組みを実装。
- 各SKUの回転率や安全在庫量の動的計算
- 中長期データの蓄積後は、BIツールなどを使ったダッシュボード化を検討

実際にセンサーを設置するのは物理現場ですが、「どれを記録対象とし、発注判断につなげるには記録データのどの要素が必要になるか」という要件面の整理をはじめています。

---

### ③ 内示データ活用のためのヒアリングと活性化設計

別部門（営業・製造）で扱っていた「受注予告データ」を購買でも活用するため、以下のような検討を実施：

- 現状の受注予告制度・データ精度の棚卸し
- どの粒度・単位で内示を見ると購買判断に使えるか？
- どういう風に活用するか
- 活用精度を改善するための“評価ロジック”も視野に入れて検討

---

## 最終的な全体構造の整理（戦略的つながり）

```text
[仕様集約ロジック] ← 発注はこの前提で進行
       ↑
[在庫情報（SmartMat）] ← リアルタイム在庫数と発注点管理
       ↑
[内示情報] ← 数か月先の使用量を予測
       ↓
[必要発注数の判断]
```

- 「どれくらい必要か？」は在庫＋内示
- 「どう買うべきか？」は集約ロジックで判断
- この2軸で発注最適化を支援

---

## これから

プロジェクトは始まったばかりで、まだKickoffできていないサブプロジェクトもあります。
これからどのようにアプローチしていくかの検討にはなりますが、中期目標の戦略立案に対する具体的なプロジェクト構想の提案という意味では、PMOとしてまずはスタートできそうだなという感じです。
一方で、これから具体的な要件策定を進めていくことになるので、その中で悩んだことや課題解決法についてはまた書いていければなとおもってます

---

**お読みいただきありがとうございました！**  
類似の構想支援や業務設計を行いたい方、ご興味のある方はお気軽にコメント・DMください。
windows11で、sketchup6 その112

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
タートルグラフィックスを見つけたのでやってみた。

# 参考にしたページ

https://qiita.com/mikecat_mixc/items/206a73a632656b9b8cac

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f6814784-1aa1-4158-8d5a-aab44d725bd8.png)

# サンプルコード

```

class Kame4
	def initialize
		model = Sketchup.active_model
		@entities = model.active_entities
		@ANGLE = 0
		@LX = 10
		@LY = 10
		@pen = 1
		run()
	end
	def fmod(a, b)
		x = (a / b).floor
		return a - b * x
	end
	def pen(i)
		if i == 0
			@pen = 0
		else
			@pen = 1
		end
	end
	def turn(a)
		@ANGLE = fmod(@ANGLE + a, 360.0)
	end
	def move(l)
		p = []
		rd = Math::PI / 180.0
		x = l * Math::cos(rd * @ANGLE)
		y = -l * Math::sin(rd * @ANGLE)
		px = @LX
		py = @LY
		p << [px, py, 0]
		@LX += x
		@LY += y
		p << [@LX, @LY, 0]
		if @pen == 1
			@entities.add_curve(p)
		end
	end
	def run()
move 80
pen 0
turn -165
move 40
turn -105
pen 1
move 15
turn 45
move 40
pen 0
turn 180
move 40
turn 90
pen 1
move 40
pen 0
turn -95
move 50
turn 50
pen 1
move 80
pen 0
turn 180
move 40
turn -45
pen 1
move 50
pen 0
turn 180
move 24
turn 135
pen 1
move 20
pen 0
turn 180
move 20
turn 90
pen 1
move 40
turn 90
move 20
pen 0
turn 90
move 40
turn 180
pen 1
move 40
pen 0
turn -30
move 100
turn 165
pen 1
move 10
pen 0
turn 45
move 40
turn -90
pen 1
move 20
pen 0
turn 180
move 20
turn 90
pen 1
move 80
turn 90
move 20
pen 0
turn 97
move 81
turn 173
pen 1
move 80
pen 0
turn 173
move 81
turn -173
pen 1
move 80
pen 0
turn 180
move 40
turn -90
pen 1
move 50
turn 120
move 15
pen 0
turn 20
move 35
turn 130
pen 1
move 35
turn 145
move 40
pen 0
turn -165
move 70
turn 190
pen 1
move 32
turn -125
move 30
turn -45
move 10
pen 0
turn 177
move 250
turn -177
pen 1
move 60
pen 0
turn -155
move 25
turn -115
pen 1
move 30
for i in (1..36)
	turn 10
	move 2
end
move 15
turn 50
move 30
pen 0
turn -170
move 100
turn 20
pen 1
move 50
pen 0
turn 165
move 50
turn -165
pen 1
move 50
pen 0
turn -140
move 35
turn -140
pen 1
move 40
turn 110
move 10
pen 0
turn -30
move 20
turn -110
pen 1
move 15
turn -40
move 40
	end
end





```

以上。
検証： AzFW上は暗黙で既定DNSの利用を許可し、診断ログも記載しないです。

### 結論の要約
- **Azure 既定DNS (168.63.129.16)** を使用する場合：
  - AzFW 上で明示的な許可ルールは不要。
  - 名前解決 (nslookup) は成功。
  - AzFW の診断ログ (`networkrule`) に 168.63.129.16 への通信記録は残らない。
  - 理由：AzuFWが内部的に 168.63.129.16 への通信を暗黙的に許可し、ログにも記録しない。

- **カスタム DNS (例: 8.8.8.8)** を使用する場合：
  - AzFW 上で明示的な許可ルールが必要。
  - 許可ルールがない場合、nslookup はタイムアウト。
  - 診断ログ (`networkrule`) に 8.8.8.8 への通信がブロックされた記録が残る。

---

### 検証通信の解説
1. **Azure VM が既定DNS (168.63.129.16) を使用する場合**：
   - **挙動**：
     - AzFW に 168.63.129.16 への許可ルールを設定しなくても、nslookup が成功。
     - 例: `nslookup www.google.com 168.63.129.16` で正しい応答 (`142.251.42.164` など) が返る。
     - 対照的に、8.8.8.8 を指定するとタイムアウトが発生。
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/d4346025-4792-4a2f-9d2f-1083e46035b1.png)

   - **ログ**：
     - AzFW の `networkrule` ログに 8.8.8.8 へのブロック記録が確認される。
     - 168.63.129.16 への通信はログに記録されない。
     - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/0eb8e3b6-a2a2-48a8-abc1-ffece43a34c6.png)


2. **Azure VM がカスタム DNS (8.8.8.8) を使用する場合**：
   - **挙動**：
     - AzFW に 8.8.8.8 への許可ルールがない場合、nslookup がタイムアウト。
     - 168.63.129.16 を明示的に指定すると、名前解決が成功。
     -![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/8b4b3f66-3275-491f-a197-02bf85aedc67.png)

 　　-![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/8de159d9-9489-456e-9c04-4b4ed66459fa.png)

     
   - **ログ**：
     - AzFW の `networkrule` ログに 8.8.8.8 への通信がブロックされた記録が残る。
     - 168.63.129.16 への通信は引き続きログに記録されない。
     -![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/0309ea70-af05-42d6-ac25-0f52546a3014.png)

   - **理由**：
     - カスタム DNS (8.8.8.8) は外部エンドポイントであるため、AzFW の明示的な許可ルールが必要。
     - ルールがない場合、AzFW がデフォルトでトラフィックをブロック。
     - 168.63.129.16 を使用することで、Azure 内部の DNS を利用し、通信が成功。

---

### 補足と技術的背景
- **168.63.129.16 の特別な扱い**：
  - 168.63.129.16 は Azure プラットフォームが提供する「仮想パブリック IP アドレス」で、DNS 解決やメタデータサービスなどに使用される。
  - AzFW はこのトラフィックをプラットフォームレベルで例外処理するため、許可ルールやログ記録が不要。
  - これは Azure の内部アーキテクチャによるもので、ユーザーが管理するファイアウォールルールとは独立。

- **カスタム DNS の要件**：
  - 8.8.8.8（Google Public DNS）など外部 DNS サーバーを使用する場合、AzFW のネットワークルールで UDP ポート 53（DNS）への通信を明示的に許可する必要がある。
  - 例: ネットワークルールで送信元（VM のサブネット）から宛先（8.8.8.8、ポート 53、UDP）を許可。
  - 許可がない場合、AzFW のデフォルト動作（すべてのトラフィックをブロック）が適用され、タイムアウトが発生。

- **診断ログの挙動**：
  - AzFW の `networkrule` ログは、明示的なルールに基づくトラフィック（許可/拒否）を記録。
  - 168.63.129.16 への通信はプラットフォームレベルで処理されるため、ログに現れない。
  - 8.8.8.8 への通信はユーザーが管理するルールの対象となり、ブロックされるとログに記録される。

---

### 推奨事項
1. **既定 DNS の利用**：
   - Azure VM での名前解決には、特別な理由がない限り 168.63.129.16 を使用することを推奨。
   - AzFW の設定が簡素化され、ログ管理も効率的。

2. **カスタム DNS の場合**：
   - 8.8.8.8 などの外部 DNS を使用する場合は、AzFW に以下のネットワークルールを設定：
     - **プロトコル**: UDP
     - **送信元**: VM のサブネット
     - **宛先**: 8.8.8.8（または該当の DNS サーバー）
     - **ポート**: 53
     - **アクション**: 許可
   - ログ監視を強化し、ブロックされたトラフィックを確認。

3. **ログ分析**：
   - `networkrule` ログを定期的に確認し、意図しないブロックがないか検証。
   - カスタム DNS を使用する場合、ログにブロック記録が残るため、トラブルシューティングに活用可能。

---


### 補足リソース
- 168.63.129.16 の役割: [Azure インスタンスメタデータサービス](https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows/instance-metadata-service)