OmniAICreator/Qiita-1.07M huggingface dataset:
Github Copilotでブラウザを制御しテストスクリプトを生成する。

# Github Copilotでブラウザを制御する

Playwright MCPというものが出たようなので、Copilotから使用してみました。
実際の設定方法や、少し使ったところをレビューしました。
設定方法など、すぐ古くなるかもしれません。

## 前提技術、ツール

* VSCode Insiders
    * VSCのInsidersバージョンを使用しました。現時点で、Copilotのエージェントモードを使用するためです。またInsidersバージョンでしかMCPは使えないようです。
* nodejs
    * Playwrightを動かすため
* Playwright
    * コードでブラウザを制御するライブラリです。
    * プロジェクトで使用できるようにしてください。
* Github Copilot
    * Github Copilotも必要です。Insidersを使用すると、拡張機能は最初からインストールされています。
    * 使用できるように設定等お願いします。
* MCP(Model Context Protocol)
    * LLMがAPIとして制御する方式です。今回は、Playwright MCPになります。
    * Playwright MCPはサーバ側になります。
    * ユーザがCopilotに指示を出し、CopilotがMCPを通じて、Playwright MCPにアクセスし、ブラウザを制御します。
    * Playwright MCPが？Playwrightのスクリプトを作成してくれます。


## 設定方法

https://github.com/microsoft/playwright-mcp

* 上記を参考に設定しましたが、ところどころ、違いました。今後も変わるかもしれません。

* まず、`.vscode\mcp.json`を以下のように作成しました。


```
{
  "servers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    }
  }
}

```

* `@playwright/mcp@latest`のインストール

```
npm install -D @playwright/mcp@latest
```

* Playwright MCPサーバの起動は`Start`ボタンを押してください。起動後`Runnning`に変更されます。エラーになった場合は、ログを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/2cc4cb04-4d78-4654-aedb-1c526d924286.png)

* Copilot Chatの設定ボタンを押し、Playwrightが接続できているか確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/0f3e6582-729b-4b0f-8edd-3ca28f680d98.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/9feac138-7fbb-49e5-97b8-4f812c6ef587.png)

## 実際に動かしてみる

* Copilotをエージェントモードに設定し、下記を入力する。

```
playwrightで`https://www.yahoo.co.jp/`を開き、天気を確認してください。
```

* 下記のような結果が出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/829ec215-2b8d-443a-bf3c-271aa596409c.png)
* Playwrightのスクリプトを自動で作成してくれました。
* 実行したところエラーになりました。残念
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/5aeabe89-ad39-45c0-b639-a708f704f6f3.png)


* 作成されたファイルの内容`tests\checkWeather.spec.ts`

```
import { test, expect } from '@playwright/test';

test('Check weather on Yahoo Japan', async ({ page }) => {
  // Yahoo! JAPANのトップページを開く
  await page.goto('https://www.yahoo.co.jp/');

  // 天気情報のセクションを探す
  const weatherSection = await page.locator('text=天気');

  // 天気情報が存在することを確認
  await expect(weatherSection).toBeVisible();

  // 天気情報をクリックして詳細を確認
  await weatherSection.click();

  // 詳細ページで天気情報が表示されていることを確認
  const weatherDetails = await page.locator('text=天気予報');
  await expect(weatherDetails).toBeVisible();
});
```

### 別の結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371938/d1dde05f-3698-4c5a-8805-4328b4ff37ed.png)


## 結果

* Github Copilotでブラウザを制御することが確認できた。
* @playwright/mcpはPlaywrightコードをLLMから作成できます。
* 可能性を大いに感じる結果になった。
* プロンプトを改良すれば、良いテストも作れそう。
* 今後、テストはマークダウンを使用し、日本語で記述し、テストを生成することができる。
* @playwright/mcpを使用しそのテスト自体も生成AIで作成することもできそう。
保護されたマテリアル検出: 著作権保護の強化（Azure AI Content Safety）

## 保護されたマテリアルのテキスト検出とは

Azure AI Content Safetyの重要な機能の1つである保護されたマテリアルのテキスト検出について、詳しく解説します。この機能は、AI生成コンテンツの増加に伴う著作権侵害リスクに対応するための強力なツールです。

https://learn.microsoft.com/ja-jp/azure/ai-services/content-safety/concepts/protected-material

## 機能の概要

保護されたマテリアルのテキスト検出API は、大規模な言語モデルの出力をスキャンして、既知の保護されたマテリアルを識別し、フラグを設定します。具体的には、以下のような既知のテキストコンテンツがAI生成テキスト内に含まれていないかを検査します：

- 曲の歌詞
- 記事
- レシピ
- 選択されたWebコンテンツ

この機能は、著作権で保護されたテキストまたはコードと密接に一致するコンテンツの生成を組織が防ぐのに役立つよう設計されています[^1]。

## 機能の重要性

保護されたマテリアルのテキスト検出機能は、以下の理由から非常に重要です：

1. **著作権侵害リスクの軽減**: AI生成コンテンツが既存の著作物を不適切に使用するリスクを大幅に減少させます。
2. **知的財産権の保護**: 創作者や企業の知的財産を守り、独創性を維持することができます。
3. **法的問題の予防**: 著作権侵害に関連する法的トラブルを未然に防ぎ、組織の評判を守ります。
4. **コンテンツの品質管理**: オリジナルで高品質なコンテンツの作成を促進します。

## 保護されたマテリアルのカテゴリ

Azure AI Content Safetyの保護されたマテリアルのテキスト検出機能は、主に以下の4つのカテゴリを対象としています：

1. **レシピ**: レシピに関連する著作権で保護されたコンテンツ
2. **Webコンテンツ**: 特定のドメイン（例：webmd.com）に含まれる著作権で保護されたコンテンツ
3. **ニュース**: ニュースに関する著作権で保護されたコンテンツ
4. **歌詞**: 曲に関する著作権で保護されたコンテンツ

これらのカテゴリは、API呼び出し時に自動的に適用されます。

## 適用シナリオ

保護されたマテリアルのテキスト検出機能は、様々な場面で活用できます：

1. **コンテンツ作成プラットフォームでの著作権侵害防止**
    - ブログプラットフォームやSNSでのユーザー投稿のチェック
    - AIライティングツールの出力の検証
2. **出版社や創作者による自社コンテンツの保護**
    - 書籍や記事の無断転載検出
    - オリジナルコンテンツの保護と管理
3. **教育機関での盗用検出**
    - 学生のレポートや論文のチェック
    - 学術誠実性の維持
4. **メディア企業のコンテンツ管理**
    - ニュース記事や報道内容の独自性確保
    - 他社コンテンツの不適切な使用防止

## 実装のポイント

保護されたマテリアルのテキスト検出機能を効果的に活用するためのポイントは以下の通りです：

1. **事前予防**: 著作権を侵害するようなデータの使用や学習プロセスを事前に防止し、適法なデータのみを利用するように管理します。
2. **定期的なスキャン**: 生成されたコンテンツを定期的にスキャンし、潜在的な著作権侵害を早期に発見します。
3. **フィードバックループの構築**: 検出結果をAIモデルの改善や学習データの精選に活用します。
4. **ユーザー教育**: コンテンツ作成者に著作権の重要性と適切な引用方法を教育します。

## 今後の展望

生成AIの進化に伴い、保護されたマテリアルのテキスト検出技術も進化を続けると予想されます。今後は以下のような発展が期待されます：

- より広範なコンテンツタイプへの対応
- リアルタイム検出能力の向上
- 多言語対応の拡大
- AIによる「創造的な改変」の検出能力の向上


## まとめ

保護されたマテリアルのテキスト検出機能は、AI時代における著作権保護の重要なツールです。この機能を適切に活用することで、組織は知的財産法に確実に準拠し、コンテンツの独創性を維持し、評判を守ることができます。AI生成コンテンツの利用が増加する中、この機能の重要性はますます高まっていくでしょう。
プリザンターの一覧画面の「ソート状態」を見やすくする方法

## はじめに
プリザンターの一覧画面、ヘッダーをクリックすることでソートを行うことが出来ます。ソートが適用されているときは小さなアイコンで昇順・降順が表示されています。このアイコン、ちょっとサイズが小さく見にくいので、今回はそれを改善する方法を紹介します。

## 要素を見てみる
ヘッダーの実際の要素を見てみます。

```html
<!--昇順-->
<th data-name="TitleBody" class="sortable">
    <div data-id="ViewSorters__TitleBody" data-order-type="desc" data-action="GridRows" data-method="post">
        <span>タイトル/内容</span>
        <span class="ui-icon ui-icon-triangle-1-n"></span>
        <span></span>
    </div>
</th>

<!--降順-->
<th data-name="TitleBody" class="sortable">
    <div data-id="ViewSorters__TitleBody" data-order-type="" data-action="GridRows" data-method="post">
        <span>タイトル/内容</span>
        <span class="ui-icon ui-icon-triangle-1-s"></span>
        <span></span>
    </div>
</th>

<!--解除-->
<th data-name="TitleBody" class="sortable">
    <div data-id="ViewSorters__TitleBody" data-order-type="asc" data-action="GridRows" data-method="post">
        <span>タイトル/内容</span>
    </div>
</th>

```
タイトルの隣接要素にソート状態を示すアイコンが設定されていることが分かります。が、`data-order-type`にはヘッダーをクリックしたときの次に選択されるソートオーダーが設定されていたりと要素だけで今の状態を判断するのは難しそうです。アイコンのクラスを直接参照する方法もありますが、今後のデザイン変更などで変更される可能性もあるため可能なら避けたい方法です。

## サーバスクリプトの`View`を使用する

サーバスクリプトでビューを設定する時に使用するViewオブジェクトですが、実はビュー情報を取得する時にも使用できます。ちょっと中身を見てみましょう。次のようなサーバスクリプトを作ってみて、画面表示の前で表示させてみます。

```js
context.Log($ps.JSON.stringify(view.Sorters));
```

ここで、`ClassA`と`TitleBody`にソートをかけてみます。デバッグコンソールには次の様な結果が表示されます。

```
{"TitleBody":"asc","ClassA":"desc"}
```

フィルタがかかっているという情報が取得出来ました。これは使えそうですね。



## 使うアイコンを考えてみる
プリザンターでは標準でGoogle Iconsが組み込まれています。今回はその中のアイコンを使ってみます。

|用途|アイコン|アイコン名|
|--|--|--|
|昇順|![stat_3_24dp_000000_FILL0_wght400_GRAD0_opsz24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/e14ccd06-214c-43d6-8f96-531b623f2be1.png)|`stat_3`|
|降順|![stat_minus_3_24dp_000000_FILL0_wght400_GRAD0_opsz24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/5597472e-5a2d-4626-9c0e-21c30b8d1437.png)|`stat_minus_3`|

これが良さそうですね。

## サーバスクリプトで実装してみる
では実装をサーバスクリプトで行っていきます。`context.AddResponse`の出番です。コードを書いてみると次の様になります。

```js
if (['index', 'gridrows', 'newongrid', 'copyrow'].includes(context.Action)) {
	for (const [key, value] of Object.entries(view.Sorters)) {
		switch (value) {
			case "asc":
				context.AddResponse('ReplaceAll', `th[data-name="${key}"] div .ui-icon`,
					'<span class="material-symbols-outlined">stat_3</span>');
				break;
			case "desc":
				context.AddResponse('ReplaceAll', `th[data-name="${key}"] div .ui-icon`,
					'<span class="material-symbols-outlined">stat_minus_3</span>');
				break;
		}
	}
}
```
実行されるときの条件を`['index', 'gridrows', 'newongrid', 'copyrow'].includes(context.Action)`[^修正]に限定することで、ブラウザの画面遷移のタイミングと一覧の表が書き換えられるタイミング、一覧画面編集での行追加と行コピーのタイミング[^修正]に限定しています。
これを拡張サーバスクリプトやスクリプトに「画面表示の前」の条件で設定します。実行してみるとこのようになります。

![レコーディング-2025-03-26-104957.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/f54a2411-8ab4-4533-ac64-a8a3379063ac.gif)

いい感じで表示できました。

## まとめ
プリザンターのヘッダーでのソートで、今どの項目にソートが設定されているかをよりわかりやすく表示させることができました。項目に対して直感的な表示となるため非常にオススメのカスタマイズです。皆さんも是非試してみてください。

[^修正]:一覧画面編集モード時の`Action`指定に漏れがあると指摘をいただき修正しました。
[UE5]WFMだと再生できないPCでもmp4を再生したい

# 結論

WMFメディアプレイヤーを使うな、Electra Playerを使え

# Electra Playerの有効化の仕方
プラグインのMedia Players からElectraPlayerをオンにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/ea0b11ae-2a9f-4efc-8557-6ac3ee65cd40.png)
mp4ならElectra playerだけでも行けるのかな？


ファイルメディアソースからプラットフォームでElectraPlayerを指定します(指定しないとおそらくWFMが自動で選択される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/ab8f9684-cff3-4b8c-b515-7cb1013b3a33.png)

関係あるかはわかりませんが、メディアプレイヤーの再生オプションも変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/b3cbfd3b-34f0-48bb-b6c7-72d011624aba.png)

以上


# 経緯

GPUが入っていないPCで動画が再生できないという事件が発生（真っ黒で読み込まれない）
CPUやメモリの使用状態がやばいなどの問題もなく、一般的なゲーム開発向けPCでは普通に再生ができる状態

試したこと

・Bink Video 
→再生できるがパッケージ化時.pakにすると再生ができなくなる、断念

・メモリ割り当て増やしたり
→足りないわけではないので意味なし

・WMFプレイヤーの再生を早くするようなオプションみたいなやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/3ef16837-0bf1-4203-93a6-9fd0f34deca4.png)
→ハードウェアのはGPU前提なので当然意味なし、低レイテンシーも意味なし

・純粋に動画の品質を落とす
→FullHD・30FPS・500kbpsまでビットレートを落とすも意味なし
グラウンデッドネス検出：AI回答の信頼性を確保する技術（Azure AI Content Safety）

## グラウンデッドネス検出とは

Azure AI Content Safetyの重要な機能の一つであるグラウンデッドネス検出（プレビュー）は、大規模言語モデル（LLM）の出力の信頼性を高めるための革新的なツールです。この機能は、AIが生成したテキスト応答が、ユーザーが提供したソース資料に忠実であるかどうかを検証します。

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

## グラウンデッドネス検出の重要性

AIの「幻覚」、つまり事実に基づかない情報の生成は、AI技術の大きな課題の一つです。グラウンデッドネス検出は、この問題に対処し、AIシステムの信頼性と実用性を大幅に向上させます。

特に以下の分野で重要な役割を果たします：

- **医療**: 患者の診断や治療に関する正確な情報提供
- **法律**: 法的助言や判例解釈の正確性確保
- **金融**: 投資アドバイスや市場分析の信頼性向上
- **教育**: 学習材料の事実確認と信頼性の保証


## グラウンデッドネス検出の仕組み

グラウンデッドネス検出は、AIが生成したコンテンツを提供されたデータソースと比較し、不正確な部分や根拠のない部分を特定します。

### 主な機能

1. **検出**: 根拠のない内容を自動的に識別
2. **修正**: 「correction」機能により、検出された不正確な部分をリアルタイムで修正
3. **フィードバック**: 検出結果の詳細な分析と説明を提供

### 検出オプション

Azure AI Content Safetyは、ユーザーのニーズに合わせて以下のオプションを提供しています：

1. **ドメイン選択**:
    - MEDICAL: 医療分野に特化
    - GENERIC: 一般的な用途
2. **タスク仕様**:
    - QnA（質問と回答）
    - 要約
    - その他特定のタスク
3. **モード選択**:
    - 非推論モード: 高速検出、オンラインアプリケーションに適合
    - 推論モード: 詳細な説明付き、解釈と改善に有用

## 適用シナリオ

グラウンデッドネス検出は、様々な分野で活用できます：

1. **企業の知識ベースを用いたAIチャットボット**
    - 社内文書や製品マニュアルに基づく正確な回答の保証
    - 顧客サポートの品質向上
2. **学術研究における引用の正確性確認**
    - 論文や報告書の引用の適切性チェック
    - 研究の信頼性向上
3. **ニュース記事や報告書の事実確認**
    - ジャーナリズムの品質管理
    - フェイクニュースの防止
4. **顧客サポートシステムでの情報提供**
    - 製品情報やサービス詳細の正確な伝達
    - カスタマーエクスペリエンスの向上

## 実装と利用

グラウンデッドネス検出APIの利用は比較的簡単です。Azure portalでContent Safetyリソースを作成し、APIキーとエンドポイントを取得するだけで開始できます。

### APIレスポンスの例

```json
{
  "ungroundedDetected": true,
  "ungroundedPercentage": 1,
  "ungroundedDetails": [
    {
      "text": "12/hour.",
      "offset": {
        "utf8": 0,
        "utf16": 0,
        "codePoint": 0
      },
      "length": {
        "utf8": 8,
        "utf16": 8,
        "codePoint": 8
      },
      "reason": "None. The premise mentions a pay of \"10/hour\" but does not mention \"12/hour.\" It's neutral. "
    }
  ]
}
```

このレスポンスは、検出された非根拠的な内容、その割合、具体的な詳細を提供します。

### 具体例で見る判定プロセス

**ソース資料**
"基本給与は10/hourです"

**AI回答**
"当社の基本給与は12/hourです"

**検出結果の意味**：

1. 数値「12」がソースの「10」と不一致
2. 給与情報という重要な数値の誤りを厳格に検出
3. 誤差範囲（±2）ではなく厳密な比較を実施
4. 数値だけでなく単位「/hour」の整合性も確認

### 実務での活用例

1. **顧客対応の品質管理**：
    - チャットボットがマニュアルにない情報を発言した場合、即座に検出可能
    - 例）「返品期間は30日」と回答→ソースが「14日」と規定の場合に警告
2. **金融レポートの検証**：
    - 株価データや経済指標の数値誤りを自動チェック
    - 例）「GDP成長率3.2%」と記載→ソースデータが「2.8%」の場合に指摘
3. **医療情報の正確性確保**：
    - 処方薬の用量や禁忌事項の誤記を防止
    - 例）「1日4錠」と説明→ガイドラインが「2錠」の場合に警告

このレスポンス形式を分析することで、AIシステムの出力品質を段階的に改善可能です。特に`reason`フィールドの自然言語による説明は、開発者だけでなく非技術部門の関係者も問題を理解しやすい点が特徴です。


## 結論

グラウンデッドネス検出は、AI技術の信頼性と実用性を大きく向上させる重要なツールです。企業や組織は、この技術を活用することで、より正確で信頼性の高いAIシステムを構築し、ユーザーに価値ある情報を提供することができます。

Azure AI Content Safetyの一部として提供されるこの機能は、AIの未来を形作る重要な要素となるでしょう。継続的な改善と新機能の追加により、グラウンデッドネス検出はさらに強力になり、AIの信頼性向上に大きく貢献することが期待されます。
抽象クラスの必要性が腑に落ちなかった話

プログラミングを学ぶ中で、関数やクラスの作り方は理解できてきたけど、「抽象クラスってなんで必要なんだろう？」と長らくモヤモヤしていた。

### 関数との違いに着目してみた

関数って、同じ処理が複数箇所に出てきた時に「共通化しよう」と思って使う。コード量も減るし、実際にその関数を呼び出すから恩恵がすぐに見える。だからこそ「関数化しよう」という意識は自然に持てる。

でも抽象クラスは、定義してもインスタンス化して直接使うことはできない。しかも、クラスの構造を縛るだけ。だから「これ、今作って意味ある？」と感じてしまう。


## 視点の変換がカギだった

じゃあ、どうやったら「抽象クラスを作ろう」と自然に思えるようになるのか。

### 例：ArrayListとLinkedList

配列ベースのリスト（ArrayList）と、ポインタベースのリスト（LinkedList）を考えてみると、それぞれにメリット・デメリットがある。

- ArrayList：ランダムアクセスが速い
- LinkedList：挿入・削除が速い

状況によって使い分けたいが、使うときのインターフェース（add, get など）は統一されていた方が使いやすい。

ここで次のような関数を考えてみる。

```java
void processList(MyList list) {
    list.add(1);
    list.add(2);
    System.out.println(list.get(0));
}

```

この `processList` 関数は、MyList 型のオブジェクトに対して要素を追加・取得している。重要なのは、この関数が「ArrayListなのかLinkedListなのかを気にせず」使えている点。

これは、`MyList` が **抽象クラス（もしくはインターフェース）** として、`add()` や `get()` という共通のメソッドを定義しているから実現できること。


## 抽象クラスがなかったら？

もし抽象クラス（またはインターフェース）がなかったとしたら、次のようなことが起こります：

- `ArrayList` は `addTo()`、`getByIndex()` を使う
- `LinkedList` は `append()`、`fetch()` を使う

すると、`processList` のような汎用的な関数は書けない。以下のように、リストの種類ごとに処理を分ける必要が出てくる。

```java
void processArrayList(ArrayList arrayList) {
    arrayList.addTo(1);
    arrayList.addTo(2);
    System.out.println(arrayList.getByIndex(0));
}

void processLinkedList(LinkedList linkedList) {
    linkedList.append(1);
    linkedList.append(2);
    System.out.println(linkedList.fetch(0));
}

```

クラスの数が増えるほど、使う側のコードも複雑になってしまう。


## 抽象クラスで解決！

共通のメソッド名・引数・戻り値の型などを**抽象クラスで統一**しておけば、実装の中身が違っても使う側は気にせずコードを書ける。

```java
abstract class MyList {
    abstract void add(int value);
    abstract int get(int index);
}

class ArrayList extends MyList {
    // 内部は配列で実装
    void add(int value) { /* 実装 */ }
    int get(int index) { /* 実装 */ }
}

class LinkedList extends MyList {
    // 内部はノードで実装
    void add(int value) { /* 実装 */ }
    int get(int index) { /* 実装 */ }
}

```

使う側はこう書ける：

```java
void run() {
    MyList list = new ArrayList();
    list.add(10);
    list.add(20);
    System.out.println(list.get(1));
}

```

このように「使う側」が内部実装を意識せずに済むようになるのが、抽象クラスの大きな恩恵。


## 利用者視点に立った設計

この経験を通じて感じたのは、「抽象クラスの価値は、**クラスを使う側の視点に立つことで初めて実感できる**」ということだった。

普段は「作る側」になりがちだけど、実際には「使いやすさ」こそが良い設計を分けるポイント。

この気づきは、今後の設計力を高める上で非常に大事な視点だと感じた。


## おわりに

「抽象クラスって意味あるの？」と思っていた自分が、「めちゃくちゃ助かるじゃん！」と実感できたのは、「ちょっとした視点の変換」だった。

物事の見方が変わると、理解速度もぐっと上がる。そう実感した出来事だった。

同じようにモヤモヤしてる人の参考になれば嬉しい。
【AWS】ムームードメインで取得したドメインをRoute53に登録する

# 前提
+ ドメインはムームードメインで購入済み
+ AWSアカウントは作成済み

# やり方

## ホストゾーンを作成する＠Route53
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/c34ffe11-79eb-4b12-ac13-6fb6f731fcfa.png)

ドメイン名は購入したドメインを入力します。
説明は空白でも構いません。
インターネット上で公開するパブリックホストゾーンを、
限定されたネットワーク内で使用する場合はプライベートホストゾーンを選択します。

## NSレコードを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/5c4776ba-3c89-4812-b796-432fa9866574.png)
作成したホストゾーンのNSレコードを確認します。
**値/トラフィックのルーティング先**に4つレコードが表示されています。

## NSレコードをムームードメインに登録する＠ムームードメイン
ドメイン管理＞ネームサーバ設定変更から、購入したドメインを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/8af3f6a1-6fff-4368-a7d8-3cb157a714c0.png)

**取得したドメインで使用する**のネームサーバ１〜４に前項で確認したNSレコードを1つずつ入力して保存します。

登録手順は以上です。

# ドメインのネームサーバ確認
```
nslookup -type=NS example.com
```
nslookupコマンドで登録したドメインのネームサーバを確認します。

<br>
<br>
<br>

```
% nslookup -type=NS example.com
Server:		192.168.11.1
Address:	192.168.11.1#53

Non-authoritative answer:
example.com	nameserver = ns-vvv.awsdns-aa.zzz.
example.com	nameserver = ns-xxx.awsdns-bb.zzz.
example.com	nameserver = ns-yyy.awsdns-cc.zzz.
example.com	nameserver = ns-zzz.awsdns-dd.xx.yy.

Authoritative answers can be found from:
```
登録したNSレコードが出力されれば登録完了が確認できています。

:::note warn
ムームードメインでのNSレコード登録からnslookupコマンドでの確認完了まで、
30分〜1時間くらいかかります。
:::
windows11で、sketchup6

# 概要
windows11に、sketchup6を入れてみた。

# 環境
windows11
sketchup v6

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/253b0736-10c5-4dc0-b159-00102a821860.png)

# 手順

ウィンドウ＞rubyコンソール

```
print RUBY_VERSION
1.8.0nil


```
以上。
【個人開発】MCバトル情報アプリを作った話 


## 🔥 作ったもの：MCバトル情報アプリ
URLはこちら 👉 [https://battleflow.vercel.app/](https://battleflow.vercel.app/)

イイ感じにMCの情報とか大会ごとの動画とか、ランキングとかがあって一括で参照できるようなアプリが欲しいので作ってみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/2625f48f-7972-4f1f-81cc-35e0df8cb3a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/43fc3353-a8ab-409c-8098-2e573d428a44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/66078f48-7f86-4dbf-bfb4-c55fc974e1f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/7594afc0-204d-4235-9f42-4023b27138bc.png)


### 主な機能

#### 🧑‍🎤 MC一覧画面
- 各MCにコメントができる掲示板風機能
- 「イイね」ボタンで共感をシェア

#### 🎤 バトル動画まとめ
- 大会ごとに動画をまとめて閲覧可能
- YouTube埋め込みでシームレス再生

#### 🗳 MCランキング投票
- ユーザーによる投票機能
- **ベイズ推定**を用いたランキング生成で信頼性UP！
- 単なる得票数ではなく、"母数が少ないが票率が高い"もちゃんと評価

---

## 🛠 技術スタック

| 技術 | 内容 |
|------|------|
| フロント | TypeScript + Next.js |
| 認証 | NextAuth |
| デプロイ | Vercel |
| DB | AWS RDS (MySQL) |

---

## 💡 なぜ作ったのか？

MCバトルファンとして、
- 「誰が人気あるのか、定量的に見たい！」
- 「大会ごとの動画、もっと整理されてると嬉しい」
- 「MCごとに語りたい...！」

そんな思いを形にしたくて、開発しました。

---

## 🧠 MCランキング：ベイズ推定の活用

MCランキング機能には、**ベイズ推定（ベイズ平均）**を使いました。

### なぜベイズ？

「得票数が1票だけど満点」みたいなMCが上位に来ないように、
**全体平均と個別得点をバランスよく加味する**必要があったためです。

### 式（簡略）

```math
Bayes平均 = (全体平均 * m + 得点合計) / (m + 投票数)
```

- `m`は事前の強さ（＝最低限の投票数のつもり）
- 投票が多いほど、個別評価の比重が増えます

---


## 🎯 今後の展望

- MCプロフィール編集（Wiki的にユーザー参加型にするかどうか）
- 通知機能（推しMCにコメントがついたら通知）
- 大会などの情報掲載
- スケジューラによる動画情報自動取得（現在上手くいかなくて苦戦中）
- どうやって普及するのか

---

## 🙌 最後に

MCバトルがもっと盛り上がるような場所にしたいと思って作りました。

気になる方は、ぜひ使ってみてください！  
推しMCに「イイね」やコメントで熱をぶつけましょう🔥

👉 [https://battleflow.vercel.app/](https://battleflow.vercel.app/)
【Next.js】ビルドIDの設定が必要なとき

## はじめに
Next.jsのアプリケーションをビルド(`next build`)すると一定の識別子(`build_id`)が自動的に生成され、アプリケーションのバージョンが識別されます。通常ならばNext.jsの自動生成に任せておいて問題はないのですが、下記のように複数サーバ構成かつ各サーバで `next build` が行われるパターンでは注意が必要です。
```mermaid
graph TD
    LB[ロードバランサー]:::lb
    LB --> S1[サーバ1]:::server
    LB --> S2[サーバ2]:::server
    classDef lb fill:#f9c74f,stroke:#333,stroke-width:2px;
    classDef server fill:#90be6d,stroke:#333,stroke-width:2px;
```
サーバ1とサーバ2で `build_id` が異なっていると動作に支障が生じる可能性もあるため、両者の `build_id` が一致するように設定しなければなりません。

## ビルドIDの設定
`next.config.js` に `generateBuildId` 関数を追加します。この関数の返り値が `build_id` となります。例示したコードでは各サーバが共通して参照する環境変数に `build_id` を定義し、その値を呼び出しています。
なお、ビルド時には別の値にする必要がある点に注意が必要です。最新のコミットハッシュを使ったりするケースが多いようですね。

```diff_typescript:next.config.js
module.exports = {
+ generateBuildId: async () => {
+   // このコードでは環境変数でbuild_idを管理 ビルド時に環境変数は変更
+   return process.env.BUILD_ID
+ }
}
```

## まとめ
複数サーバ構成を組んでいる場合は、同じ `build_id` が割り当てられるように注意をしましょう。特に「開発環境では大丈夫だったのに検証/本番環境で動かなくなった」といったケースの場合、もしかしたら冗長構成が取られていることによりサーバ間で `build_id` が異なってしまった結果かもしれません。

## 参考
https://nextjs-ja-translation-docs.vercel.app/docs/api-reference/next.config.js/configuring-the-build-id
Microsoft Defender for Endpoint のネットワーク保護機能を Wireshark で覗く

## はじめに
この記事は、業務で Microsoft のセキュリティ製品を扱うセキュリティ初心者の私が、気になったことを検証してその結果をまとめた備忘録の位置づけです。
同じく Microsoft のセキュリティ製品に関わる方のヒントになればと思い、Qiita にも検証した内容を残したいと思います。

:::note warn
本記事には、間違いや曖昧な表現が含まれている可能性があります。
また、内容については、私が所属する組織とは一切関係なく、私個人の検証と結果になります。
間違いを見つけましたら、ぜひご指摘いただけますと幸いです。
:::

### 想定読者
:::note info
- Microsoft のセキュリティ製品を扱う人
- なんとなくセキュリティ製品の中身に興味がある人
:::

### この記事を読んだら分かること
- Microsoft Defender for Endpoint (MDE) の **ネットワーク保護**という機能が働くときの通信について

## ネットワーク保護とは
Microsoft の公式ドキュメントを抜粋させていただきます。
>ネットワーク保護は、悪意のあるサイトや疑わしいサイトへの接続を防ぐことで、特定のインターネット ベースのイベントからデバイスを保護するのに役立ちます。

>ネットワーク保護は、特定のドメインまたはホスト名をブロックするために使用できる カスタム インジケーター と連携します。

https://learn.microsoft.com/ja-jp/defender-endpoint/network-protection#overview-of-network-protection

## やったこと
MDE のカスタム インジケーターに登録した URL へアクセスする際、どうやってそのアクセスをブロックしているのかを調べる。
そのためのツールとして、Wireshark というパケットキャプチャ ツールを使用した。

1.  **Microsoft Defender ポータルで、特定の URL をブロックする指標（カスタム インジケーター）を設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762983/8c842fcf-dc08-4866-b9ee-2ab6712ba1ac.png)
<br><br>

2. **MDE にオンボードされたデバイスでアクセスするとブロックされるようになる**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762983/03782301-17f3-4321-b277-d7cf759c3573.png)

    **ではこの時、MDE はどうやって通信をブロックしているのか？**<br><br>


3. **デバイスの通信時のパケットを Wireshark で比較してみる**

    通常時のアクセスでは 3-way handshake (SYN, SYN-ACK, ACK) が確立し、GET リクエストが開始されている。ブロック時のアクセスでは、3-way handshake (SYN, SYN-ACK, ACK) が確立した後、FIN によって接続を終了。
    ネットワーク保護により、TCP の段階で通信を終わらせる（トランスポート層で接続を終了する）ことで、その先のアプリケーション層の HTTP リクエストがそもそも発生しないようになる。
    
    具体的には、以下の通り。（10.50.0.4 ：クライアント 、222.158.205.72 インジケーターに登録した URL のサーバー）
    
    パケットの比較（左：通常時、右：ブロック時）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762983/46d6d6c3-5e2a-47b2-ad07-18a44d1875a0.png)
    
    
    http パケットの有無（左：通常時、右：ブロック時）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762983/5303d9fd-4ae4-4938-9a32-ba0e24926996.png)


Microsoft の公式ドキュメントでも、3-way handshake が完了した後に、アクセスをブロックすると記載がある。

>3 方向ハンドシェイクが完了すると、ネットワーク保護によってサイトへのアクセスが許可またはブロックされます。

https://learn.microsoft.com/ja-jp/defender-endpoint/network-protection#network-protection-and-the-tcp-three-way-handshake


## まとめ
**ネットワーク保護では、通信の終了に TCP フラグの FIN が使用されている**ことが分かった。
【Goの備忘録】設定ファイルを用いて環境変数を外出ししたい

# 前提
SQLiteを用いたTODOアプリを作成する過程で環境変数の設定方法を新しく学んだので、自分の備忘録として記載しています。

# 行うこと
設定ファイルを用いて環境変数を外出しする。

# 手順
## 1.config.goを作成する
configディレクトリ配下にconfig.goを作成します。

## 2.設定項目を管理する構造体と各設定項目のフィールドを定義する
各設定項目を管理する構造体とフィールドを定義します。
今回はサーバとDBの設定項目として以下を定義します。
- Port：サーバのポート番号
- SQLDriver：使用するドライバーの名前
- DBName：使用するデータベースの名前
- LogFile：ログを出力するファイル名


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/38ff7522-c11f-4b63-8f8e-ab7c2b75c25c.png)

## 3.構造体をグローバルに宣言する
2.で定義した構造体を外部から呼び出せるようにグローバルで宣言します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/52bf573a-1e22-4439-8dfa-b302be1c3fb7.png)

## 4.iniファイルを作成する
config.iniという設定ファイルを作成します。
外出ししたい設定項目はconfig.iniファイル内に記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/857c3bb6-eb1d-44c4-a422-4d47fcb4bb5b.png)

## 5.設定項目を読み込む関数を作成する
以下のように、config.go内で、config.iniに記載した各設定項目を読み込む関数を作成します。
```go
func LoadConfig() {
	cfg, err := ini.Load("config.ini")
	if err != nil {
		log.Fatalln(err)
	}
	Config = ConfigList{
		Port:      cfg.Section("web").Key("Port").MustString("8080"),
		SLQDriver: cfg.Section("db").Key("driver").String(),
		DBName:    cfg.Section("db").Key("name").String(),
		LogFile:   cfg.Section("web").Key("logfile").String(),
	}
}
```

## 6.コンストラクタで5.で作成した関数を実行するように設定する
config.go内にinit関数を作成し、その中で5.で作成した関数を実行します。
これにより、main関数が実行される前に各設定項目を初期化することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/b7245e7f-71c6-4a13-abab-2277b584f603.png)

# 確認
main関数で各設定項目を表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/64e6dd2d-06c5-4b52-801d-c6ec4914776c.png)

# ※補足
## 各設定項目をログファイルに出力する方法
utils配下にlogging.goというファイルを作成し、その中にログファイルの出力先やフォーマットを定義します。

```go
func LoggingSettings(logFile string) {
	logfile, err := os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) // 適当な権限を与えて読み込み
	if err != nil {
		log.Fatalln(err)
	}
	multiLogFile := io.MultiWriter(os.Stdout, logfile) // 出力先を標準出力とログファイルに指定
	log.SetFlags(log.Ldate|log.Ltime|log.Lshortfile) // ログのフォーマットを指定
	log.SetOutput(multiLogFile)
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/64f4553c-3428-47c8-bc96-e4f64d47847f.png)

以下のように指定したフォーマットで標準出力にログが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/729038ae-d529-4b53-9102-9154dd4fd539.png)

同様のフォーマットでログファイルにもログが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/cfd1618a-9d02-4367-890c-77fa2feb9059.png)
まとめ　基本情報技術者　ヒューマンインターフェースとマルチメディアについて

### インターフェース

- ユーザビリティー
    - 使いやすさ
    - 効果、効率、満足
    - どれだけストレスなく、目標とする要求を達成できるか
- ユーザビリティーの評価
    - インタビュー法
        
        満足かユーザーに聞く
        
    - ヒューリスティック評価
        
        専門家が評価
        
    - ユーザビリティテスト
        
        利用者に使ってもらい、その様子を観察
        
    - ログデータ分析法
        
        ログを見て評価
        
- 入力チェック
    - 論理的チェック
    - 重複チェック
    - フォーマットチェック
    - シーケンスチェック（正しい順序か）
- undo機能
    
    直前の操作を取り消し、元に戻せる
    
- マクロ機能
    
    一連の操作を記憶させ、呼び出すだけで処理を行う（操作数を少なく）
    
- ショートカットキー
    
    頻繁に行う操作を効率化
    

### マルチメディア技術

- 複数の媒体を利用できること
- 文字
    - ビットマップフォント
        - 正方形のドットで文字を表したもの
        - 高速
    - アウトラインフォント
        - 曲線のデータとして文字を保持
        - 拡大する場合ギザギザならない
        - 「ラスタライズ（表示の際はビットマップに変換すること）」が必要なので、処理が遅い
- 音声
    - PCM
        - アナログ信号→デジタル信号に変換する方式
        
        1. アナログデ信号を「標本化（サンプリング）」
        一定の間隔で区切る
        2. 区切られた信号を「量子化」
        値をつける
        3. 値が付与されたデータを「符号化」
        ビット列に変換
        - 計算方法
            
            PCM変換後のデータ量 ＝ 標本化周波数 ✖️ 量子化ビット数 ✖️ 秒数
            
- 静止画
    - クリッピング
        - 画像の一部を切り抜くこと
    - アンチエイリアシング
        - 画像処理の際に生じるギザギザを目立たなく（なめらか）させる
    - テクスチャマッピング
        - 物体の表面に「模様などの画像を貼り付け」て質感を出すこと
- 動画
    - H.264/MPEG-4 AVC
        - 画像圧縮する技術
        - ワンセグ放送で利用
fedoraでディスプレイサイズの取得(物理)

3パターンある
# xrandr
例)
```shell
tyano ~$ xrandr --verbose | grep -i connected
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 connected 1920x1080+0+0 (0x48) normal (normal left inverted right x axis y axis) 527mm x 296mm
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
```

# hwinfo

例)
```shell
tyano ~$ hwinfo --monitor | grep -i size
  Size: 527x296 mm
```

# edid-decode
例)
```shell
tyano ~$ cat /sys/class/drm/*/edid | edid-decode | grep DTD
    DTD 1:  1920x1080   60.000000 Hz  16:9     67.500 kHz    148.500000 MHz (527 mm x 296 mm)
    DTD 2:  1920x1080i  60.000000 Hz  16:9     33.750 kHz     74.250000 MHz (527 mm x 296 mm)
    DTD 3:  1280x720    60.000000 Hz  16:9     45.000 kHz     74.250000 MHz (527 mm x 296 mm)
    DTD 4:   720x480    59.940060 Hz   3:2     31.469 kHz     27.000000 MHz (527 mm x 296 mm)
```

# 計算

1inch = 25.4mmなので

[https://www.wolframalpha.com/input?i==sqrt(527^2+296^2)/25.4
](https://www.wolframalpha.com/input?i==sqrt(527^2+296^2)/25.4
)

firefoxだとurlエンコードは勝手にやってくれる
ほかのブラウザだと分かりません

もしくは[https://www.wolframalpha.com/](https://www.wolframalpha.com/)にアクセスして以下のように入力
```
=sqrt(527^2+296^2)/25.4
```
まとめ　基本情報技術者　ハードウェアについて

### 半導体メモリ

- 半導体
    
    電気を通す「導体」と、電気を通さない「絶縁体」の中間の性質を持つ物質
    
- RAM
    - Random Access Memory
    - 揮発性メモリ
    - 電源を切るとデータが消滅する
    - DRAM
        - Dynamic RAM
        - 絶えず「リフレッシュ」を繰り返すRAM
        - リフレッシュを継続することで、データを保持
        - 安価
        - 主記憶装置に利用
    - SDRAM
        - Synchronous DRAM
        - 「クロックと同期」して動作するメモリ
    - SRAM
        - リフレッシュをする必要がないRAM
        - 非常に高速
        - 高価
        - キャッシュメモリに利用
- ROM
    - Read Only Memory
    - 不揮発性メモリ
    - 電源を切ってもデータが保持される
    - フラッシュメモリ
        - 電気的に「データの書き換え」ができるROM
        - ブロック＞ページ＞ビット
        - 読み書きはページ単位
        - 削除はブロック単位

### 電子回路

- メモリセル
    - 半導体の中で「0」または「1」という情報を保存する入れ物
    - 半導体メモリの最小単位
    - コンデンサ（メモリセル）
        - DRAMで利用
        - 電気を蓄えることができる電子部品
        - リフレッシュ必要。安い。
    - フリップフロップ回路（メモリセル）
        - SRAMに利用
        - 「0」または「1」を保存できる順序回路
        - 電圧を保持し続けられる
        - リフレッシュが必要ない。高速
- チャタリング
    
    意図していないスイッチのオン・オフが何度も繰り返される現象
    
- 7セグメントLED
    
    8個のLEDを組み合わせて数値を表現するディスプレイ
    
    - アノードコモン型
        
        ポートからの出力される電圧が低い時に光る
        
    - カソードコモン型
        
        ポートからの出力される電圧が高い時に光る
【超簡単】mkcertを用いたルート証明書、サーバ証明書の作成手順

# 前提
Windows環境を想定しています。

# 手順
## 1. mkcertのインストール
PowerShellで以下のコマンドを実行してmkcertをインストールする。
その後PowerShellを再起動する。

`winget install mkcert`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/a885a6ca-e4ad-489f-bc2b-95ebfe3a2e2b.png)

## 2. ルート証明書の作成
PowerShellにて以下のコマンドを実行する。

`mkcert --install`

以下のポップアップが表示されるので「はい」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/734afe09-c3a4-440f-9e23-bf18b4efe2c0.png)

これで自己認証局とルート証明書が作成される。
さらにブラウザに自動でルート証明書を信頼する証明書リストに登録される。

作成されたルート証明書と秘密鍵へのパスは以下のコマンドで確認できる。
`mkcert -CAROOT`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/678571cb-e2e5-451f-a1b9-92a1f9e33804.png)

以下のファイルが作成されている。
- rootCA.pem （ルート証明書）
- rootCA-key.pem （秘密鍵）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/33dfa739-02c3-4d75-a4b0-3fcda9609526.png)

## 3. サーバ証明書の作成
手順2で作成したルート証明書と秘密鍵のペアを用いて指定のドメインに対してサーバ証明書を作成する。
今回はlocalhostに対してサーバ証明書を作成する。
サーバ証明書と秘密鍵のペアを作成したいディレクトリに移動し、以下のコマンドを実行する。

`mkcert localhost`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/b843ab2e-7f09-469a-b653-d3ae986df609.png)

これで完了。あとはサーバ側に作成したサーバ証明書と秘密鍵を設定し、クライアント側にルート証明書を信頼できる証明書として登録すればOK。（ブラウザで挙動確認を行う場合、後者は手順2で自動的に行われる。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/2010706a-60d1-4351-92a7-282f92dd7946.png)

# 補足：クライアント証明書を作成したい場合
サーバ証明書の代わりにクライアント証明書を作成したい場合はルート証明書を作成した後に以下のコマンドを実行する。

`mkcert -client client-cert.pem client-key.pem`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/280e84ff-18a8-48c6-af7d-a5de9fad74f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933650/2c6b9e4b-42cb-4a05-b96a-0de9ae29e8d8.png)
まとめ　基本情報技術者　処理の仕方によるシステムの分類について

### 分類

- 集中処理
    
    一台の大型コンピューター（ホストコンピューター）に複数のコンピュータを繋ぐ
    
- 分散処理
    - クライアントサーバシステム
        
        - クライアントが処理要求をサーバーに出し、サーバーが処理を行う
        
        ※クライアントサーバシステムはクライアントの端末に専用のソフトウェアをインストール得る必要あり
        
    - 3層クライアントサーバシステム
        
        DBも追加
        
    - Webシステム
        - インターネットとWebブラウザを利用するシステム
        - クライアントソフトに「Webブラウザ」を使用する

### システム構成

※デュプレックスシステムとデュアルシステムの違いが出る

- シンプレックスシステム
    
    1つのコンピュータだけのシステム構成
    
- デュプレックスシステム
    
    メインで動作するコンピュータと、**故障に備えて待機しているコンピュータ**の2つからなるシステム構成
    
    - ホットスタンバイ
        
        現用系（メイン）と待機系（サブ）どちらにも電源を入れとくパターン。
        障害時、すぐに対応できる。コスト高め。
        
    - コールドスタンバイ
        
        待機系を停止した状態で運用する
        コスト低め。
        
- デュアルシステム
    
    **2つのコンピュータが同じ処理を行い**、結果を照合して正しいことを確認する構成
    

### 信頼性

- **フォールトトレラント**
    
    システムが**部分的に故障**しても、システム全体として必要な機能を維持する設計
    
- フェールソフト
    
    障害が起きた時、性能が落ちても、システム全体は動作させる設計
    
- フェールセーフ
    
    障害が起きても、システムを止めてでも、安全を優先させる設計
    
- フールプルーフ
    
    人間が間違った使い方をしても、システムに異常が起きないようにする設計
    

### RAID（Redundant Array of Inexpenive Disks）

- とは
    
    複数のハードディスクを**あたかも1つのハードディスクであるかのように扱う**技術の総称
    
- レベル
    - RAID 0
        
        **「ストライピング」**
        
        - データを複数のハードディスクに分散して書き込む方法
        - システムの信頼性は上がらない
        - データの**読み書きは高速化できる**
    - RAID 1
        
        **「ミラーリング」**
        
        - 複数のハードディスクに同じデータを書き込む方法
        - システムの**信頼性が上がる**
        - 処理速度は下がる

## システムの性能指標

### 性能指標

- **スループット**
    
    システムが単位時間当たりに処理する仕事量
    
    - プリンタの枚数など
- **ターンアラウンドタイム**
    
    「入力」➕「処理」➕「出力」
    
    - レスポンスタイム
        
        「処理」のみ
        
    
- テスト（**ベンチマークテスト**）
    
    システムの性能を「比較」するためのテスト
    
    - **標準的な**プログラム、データを使用してテストする

### キャパシティプランニング

- とは
    
    「システムの稼働状況」を継続的に評価して、システムに求められる「処理能力」を計画すること
    
- システム全体の処理能力を向上させる2つの手段
    - スケールアウト
        
        サーバの**台数を増やす。**
        
    - スケールアップ
        
        **個々のサーバの処理能力を向上**させる。
        

### 信頼性の指標

※稼働率を求める問題が出る

- RASIS
    
- MTBF（Mean Time Between Failures）
    
    「平均故障間隔」
    
    - システムが故障せずに正しく動作した時間の平均値
    - 計算式
        
        MTBF ＝ 「稼働時間の合計」÷「故障回数」
        
- MTTR（Mean Time To Repair）
    
    「平均修理時間」
    
    - システムが稼働していなかった時間の平均値
    - 計算式
        
        MTTR ＝ 「故障時間の合計」÷「故障回数」
        
- **稼働率**
    
    「システムが故障せずに動いていた時間の割合」
    
    - 稼働率が高いほど「可用性が高い」
    - 稼働率が1の場合、1回も故障せず動いている
小児敗血症の早期発見と発熱を伴う高リスク患者のケア改善に関する研究~NAMヘルスケアレポート



## はじめに

小児敗血症（セプシス）は世界中の子どもたちに重大な健康リスクをもたらす生命を脅かす感染症反応です。今回は、デューク大学小児病院で行われた2つの重要な研究について解説します。1つ目は小児敗血症の早期発見のためのデジタルフェノタイプ（特徴パターン）開発に関するもの、2つ目は小児救急部門における高リスク患者への迅速な抗生物質投与を実現するための通知システムに関するものです。

## 研究1：小児敗血症の早期認識のためのデジタルフェノタイプの評価

### 背景
敗血症は子どもたちの入院と死亡の重要な原因となっています。2004年から2012年の間、米国の小児入院の約3.1%が敗血症によるもので、その死亡率は8.2%に達しました。国際的なガイドラインでは、敗血症認識後1時間以内に抗生物質投与を開始することが推奨されています。しかし、デューク小児病院では、敗血症の子どもたちのうち時間内に認識されるのは38%、時間内に治療を受けるのはわずか28%でした。

### 研究方法
研究チームは2016年11月から2023年4月までのデューク小児病院における28,399件の小児入院データを分析しました。彼らはDuke Pediatric Sepsis Phenotype（DPSP）と呼ばれる新しい診断基準を開発しました。これは「Real-Time Weiss」と「Duke Children's Trigger Tool」という2つの既存の診断ツールを組み合わせたものです。

### 結果
* 28,399件の入院のうち、3,104人（10.9%）がDPSPの基準を満たしていました
* DPSPは敗血症のICD診断コードに対して0.79の感度と0.18の陽性的中率を示しました
* 完全なWeiss定義に対しては0.95の感度と0.30の陽性的中率を示しました
* DPSPを満たす患者は他の患者と比較して：
  * 入院期間が有意に長い（23.48日 vs 6.72日）
  * 死亡率が高い（5.67% vs 0.74%）
  * 平均年齢が低い（6.99歳 vs 7.79歳）
  * 男児が多い（54% vs 52%）
  * 黒人/アフリカ系アメリカ人の割合が高い（36% vs 31%）

### 結論
開発されたDPSPは、リアルタイムで敗血症のリスクが高い患者を正確に特定できることが示されました。次のステップとしては、前向き検証、臨床的妥当性の確認、実際のベッドサイドでの展開などが計画されています。

## 研究2：小児救急部門における発熱を伴う高リスク患者のための情報通知システムの実装

### 背景
高リスク状態（HRC）にある患者が発熱とともに小児救急部門（ED）を受診した場合、全身感染症や敗血症を発症するリスクが大幅に高まります。ガイドラインでは、これらの患者には理想的には来院後1時間以内に抗生物質を投与することが強調されています。デューク小児病院では、2016年から2023年の間、高リスク状態+発熱の基準を満たした患者のうち、1時間以内に抗生物質を投与されたのは42%でした。

### 研究目的
この研究の主な目的は、デューク小児救急部門に発熱で来院した高リスク状態の患者を即座に特定し、抗生物質投与までの時間を短縮するための情報駆動型システムを実装することでした。

### 研究方法
2024年1月から7月までの間にデューク小児救急部門に発熱で来院した高リスク状態のすべての患者が研究対象となりました。高リスク状態には、活動性の化学療法を受けている患者、臓器移植チームによるフォローアップを受けている患者、鎌状赤血球症の患者が含まれます。発熱は救急部門で測定された38℃以上の体温、または発熱の主訴と定義されました。

高リスク状態+発熱の基準を満たし、まだ抗生物質が投与されていない各患者に対して、救急部門の担当看護師と薬剤部に自動通知ページが送信され、迅速な評価と治療を調整する仕組みを実装しました。2024年1月から2月までは「サイレント検証」期間として通知は生成されましたが臨床医に送信されず、2月26日から臨床医への通知が開始され、4月13日からは45分経過しても抗生物質が投与されていない場合にリマインダー通知が追加されました。

### 結果
* 2024年1月から7月の間に、高リスク状態+発熱の基準を満たした123人の患者がアラートを生成しました
* 4月13日以降、さらに32件のリマインダー通知が生成されました
* サイレント試験アラートの87.8%と実際に救急部門で発生したアラートの78.0%が「対応可能」でした
* 救急部門入院から抗生物質投与までの中央値は変化しませんでしたが（75分）、通知から抗生物質投与までの中央値は114分から58分に減少しました
* 入院から1時間以内に抗生物質を投与された患者の割合は38.9%から40.3%にわずかに増加し、通知から1時間以内は5.5%から53.7%に大幅に増加しました

### 結論
研究チームは、小児救急部門で発熱を伴う高リスク患者を特定するための情報ベースの通知システムを成功裏に実装しました。全体的な入院から抗生物質投与までの時間と遵守率は大きく変化しませんでしたが、通知から抗生物質投与までの時間は大幅に短縮され、遵守率が向上しました。これは通知が抗生物質投与までの時間短縮に効果的であったことを示唆しています。

## 総括

これら2つの研究は、小児敗血症および高リスク患者の治療における時間的要素の重要性を強調しています。デジタル技術と電子健康記録（EHR）データを活用することで、リスクの高い患者を早期に特定し、適切な介入を迅速に行うことができます。特に注目すべきは、これらのシステムが臨床現場でのリアルタイム意思決定をサポートし、最終的には患者のアウトカム改善につながる可能性があることです。

今後の研究では、これらのツールの前向き検証や臨床的妥当性の確認、さらなるワークフローの改善などが期待されます。敗血症のような時間依存性の高い疾患において、情報技術を活用した早期発見・早期介入システムの開発は、小児医療の質向上に大きく貢献する可能性があります。
mac OS 15.3.2でHHKB Professional Type-S JIS キーボードが突然USキーボードになった話

## キートップが変

HHKB Professiontal Type-S JIS配列を使っています。現用を子供に持って行かれたので、別のHHKBをつなぎました。めでたく、キーボードアシスタント画出てJIS配列と判断されました。

ところが、なぜかUSキーボードとしか認識されない。

暫く我慢して使っていたのですが、次第に発狂しそうになってきたのでトラブルシューティングしてみました。

### 結論
Type-Sのキーボードドライバが無効になっていた。

## 解決方法

* システム設定で「一般」「ログイン項目と拡張機能」と開いて、下のほうにある「ドライバ拡張機能」を選択

![スクリーンショット 2025-03-26 9.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188685/c89fbe9a-c661-41c8-89d4-7c938e873fe7.png)

* HHKBのドライバを有効にする

![スクリーンショット 2025-03-26 9.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188685/5407d41b-d57e-42f1-9220-edd3f86341ab.png)

## 何もしてないのに壊れましたー(?)

キーボード買い換えようかと思ったのですが、解ってしまえば納得。しかしいじった記憶はないんですが・・・あ、キーボードのファームをアップデートしたとかドライバをインストールし直したのが原因かもしれんです。
まとめ　基本情報技術者　コンピューターの構成要素について

## CPU（プロセッサ）

- CPUとは
    
    中央処理装置
    コンピューターの中心で仕事をする機械
    
- **クロック周波数**
    
    - CPUの動作の速さを表す指標
    - 単位「Hz」
    一秒間に一回の信号を発生する場合「1Hz」
    - クロック数
        
        発振機がテンポを刻む回数「1クロック」
        **より早いテンポに対応できるCPUが必要**
        
- **MIPS**
    
    - CPUが一秒間に何百万個に命令を実行できるか
    - MIPS ＝ 1秒 ➗ 平均命令実行時間 ✖️ 10^6
- コア
    
     CPUにある「演算を行う装置」
    

### CPUが処理する流れ

- レジスタ
    - レジスタとは、CPUの中にある、命令やデータを一時的に保存する記憶装置
    
    - プログラムカウンタ
        
        次の命令を格納するレジスタ
        
    - 命令レジスタ
        
        命令を格納するレジスタ
        
    - 命令デコーダ
        
        命令の解読機
        
    - 汎用レジスタ
        
        データを格納するレジスタ
        
    
- アドレス指定方式
    - 直接アドレス指定方式
        
        アドレス部に**有効アドレス**（CPUの処理対象となるデータが格納されているアドレス）が入っている方式
        
    - 間接アドレス方式
        
        アドレス部の値が**主記憶装置上のアドレスを指し**、そのアドレスに有効アドレスが入っている方式
        
        - アドレス部に格納できないような大きなサイズのアドレスを主記憶装置に保存ができるのがメリット。でも遅い。
- 割り込み
    - 割り込みが起こると、プログラムカウンタは、格納されている次の命令を退避させ、割り込み命令を格納する。完了したら、退避した命令を再度格納
    - 内部割り込み
        
        **実行中のプログラムが原因**で発生する割り込み
        
    - 外部割り込み
        
        **実行中のプログラム以外が原因**で発生する割り込み
        
    

## 様々な記憶装置

### 種類

- 主記憶装置
    - 高速、電源を切ると消滅
    - 主記憶装置は、コンピュータ内でデータとプログラムの一時的な格納場所です。
    - 一般的に、主記憶装置は高速でアクセスが可能で、CPUがデータにアクセスするための主要な場所です。
    - 主記憶装置はRAM（ランダムアクセスメモリ）として知られ、プログラムの実行とデータの保持に使用されます。データは電力が供給されている間だけ保持されます。
    
- 補助記憶装置
    - 補助記憶装置は、永続的なデータの保存と長期の記憶に使用される装置です。
    - 代表的な補助記憶装置にはハードディスクドライブ（HDD）、ソリッドステートドライブ（SSD）、光ディスクなどがあります。
    - 補助記憶装置は主記憶装置よりも遅いアクセス速度を持ちますが、大容量でデータの永続性を提供します。
    
- キャッシュメモリ
    - キャッシュメモリは主記憶装置とCPUの間に配置される高速な一時的なメモリです。
    - 目的は、CPUが頻繁にアクセスするデータや命令を高速に提供し、プログラムの実行を高速化することです。
    - キャッシュメモリにはL1キャッシュ（最も高速）やL2キャッシュ（L1よりも大容量でやや遅い）など、複数の階層があります。
    - キャッシュは主記憶装置と比べて小容量ですが、高速でアクセス時間が短いため、CPUの性能向上に寄与します。
- キャッシュメモリの読み込み方法
    - **頻繁に利用するデータをキャッシュメモリに保存し、高速化を図る**
    - ヒット率
        
        キャッシュメモリ上に配置されている確率のこと
        
    - 実行アクセス時間
        - CPUがキャッシュメモリを利用したアクセス時間
        - 「アクセス時間」は主記憶装置を利用した時間
        - 計算式
            
            実行アクセス時間 ＝ （キャッシュメモリへのアクセス時間 ✖️ ヒット率）➕（種記憶装置へのアクセス時間 ✖️ （1ーヒット率））
            
- メモリインタリープ
    
    CPUが主記憶装置へのアクセスを高速化するため、主記憶装置内部を複数のバンク単位に分割し、各バンクに並列にアクセスする方法
    
- キャッシュメモリの書き込み方法
    - ライト**スルー**方式
        
        CPUが書き込む際に、キャッシュメモリと主記憶装置、どちらにも同じデータを書き込む
        
        - 仕組みがシンプル
    - ライト**バック**方式
        
        通常はキャッシュメモリに書き込み、キャッシュメモリから不要なデータを追い出す際にそのデータを主記憶装置に書き込む
        
        - 書き込み速度が早い

## 入出力インターフェース

- 有線
    - シリアルインターフェース
        
        一本の信号で一ビットずつ順次にやりとりする
        
        - 主流
    - パラレルインターフェース
        
        複数の信号線で複数のビットを並列にやりとりする規格
        
        - データの同期が取りづらい
- 接続方法
    - スター接続
        
        - PCのコネクタに複数の周辺機器を接続する方法
    - ツリー接続
        
        - **ハブを使って**枝分かれし接続する方法
    - デイジーチェーン接続
        
        周辺機器を**数珠繋ぎ**で接続する方法
        
        - 配線スッキリ、でも遅い
    - デバイスドライバ
        - PCに接続された周辺機器を制御するソフトウェア
    
- ディスプレイ
    - ドット（ピクセル）
        - ディスプレイ上の細かいマス
    - dpi (dot per inch)

        1インチあたりのドット数の単位
        
        - 一インチ（2.54cm）
        - 注意：**1インチにいくつドットが並ぶかを表す**
PythonでFalseとTrueの取り扱い小技

Pythonのリストで `False` の数を数えるには、いくつか方法があります。
今回はこのリストを使って、

```python
l = [False, True, False, False, True]
```

「Falseはいくつある？」を2通りで解いてみます！
BooleanであるTrueとFalseの取り扱いに注目しましょう。

---

### ✅ パターン①：`for`文＋カウント変数

```python
l = [False, True, False, False, True]
count = 0
for i in l:
    if i == False:
        count += 1

print(f"Falseの数: {count}")  # → Falseの数: 3
```

#### ✅ 特徴
- **初心者向けで読みやすい！**
- ロジックが明確で、デバッグしやすい

---

### ✅ パターン②：`sum()`を使うテクニック

```python
l = [False, True, False, False, True]
print(f"Trueの数: {sum(l)}")  # Trueの数: 2
print(f"Falseの数: {len(l) - sum(l)}")  # Falseの数: 3
```

#### ✅ 特徴
- `True`は `1`、`False`は `0` として数えられることを利用
    - pythonではTrueとFalseはそれぞれ1と0と同値であることを利用
- **1行でスマートに計算できる！**

---

### ✅ まとめ

| 方法 | メリット | デメリット |
|------|----------|-------------|
| for文 | 読みやすい・やさしい | 少し長い |
| sum() | スマート・短い | 最初はちょっと分かりにくいかも |

### 参考記事

https://zenn.dev/gomecha/books/4fa32ac5f76af31b2f81/viewer/2e9bba
まとめ　基本情報技術者　アルゴリズムとプログラミングについて

## データ構造

### データ構造の種類

- スタック
    - 最後に格納したデータを最初に取り出すデータ構造
    - push （データの格納）
    - pop（データの取り出し）
    - 後に入れたデータを先に出すアルゴリズム
        
        後入れ先出し（LIFO：Last In First Out）
        
- キュー
    - 最初に格納したデータを最初に取り出すデータ構造
    - enqueue（データの格納）
    - dequeue（データの取り出し）
    - 先に入れたデータを先に取り出すアルゴリズム
        
        先入れ先出し（FIFO：First In First Out）
        
- 配列
    - 配列は参照、更新が早い
        - 値を直接指定できるので、参照や更新が早い
        - 挿入、更新時は他のデータの値の添字が変わるので遅い
    - 添字（0~）
    - 要素（中身）
    - 多次元配列
        - 行と列でデータを格納
        - 配列名(行, 列)で取り出す
- 連結リスト
    - 数珠繋ぎでデータを格納する方法
    データとポインタ（次のデータのアドレス値）が一纏めで格納されている
    - 連結リストは挿入、削除が早い
        - 挿入、削除時は次の前後のポインタの値を書き換えるだけで行える
        - 逆に参照や更新時は、対象データを追わないといけないので遅い。
- 二分探索木
    
    - 左の子孫＜親＜右の子孫
    - データを見つけるのに便利

## アルゴリズムの分類

### 整列アルゴリズム（データを並べるためのアルゴリズム）

※クイックソートが出る可能性大

- バブルソート
    - バブルソートは単純な比較ソートアルゴリズムで、隣接する要素を比較して必要に応じて交換します。
    - リストを一巡りすると、最大の要素が一番後ろに移動します。
    - このプロセスを要素が整列するまで繰り返します。
- 選択ソート
    - 選択ソートは簡単なソートアルゴリズムで、リストから最小の要素を選択し、先頭に配置します。
    - 残りの要素から次に最小の要素を選んで、次の位置に配置する作業を繰り返します。
    - リスト全体が整列するまで続けます。
- 挿入ソート
    - 挿入ソートは、要素を適切な位置に挿入していくアルゴリズムです。
    - リストを整列済みの部分と未整列の部分に分け、未整列の要素を適切な位置に挿入します。
    - リストの先頭から順に要素を取り出し、挿入操作を行って整列します。
- **クイックソート**
    
    1. クイックソートは分割統治法を使用する高速なソートアルゴリズムです。リストを適切な基準値（ピボット）を選び、それを中心に小さい要素と大きい要素に分割します。それぞれの部分リストを再帰的にソートし、結合してソート済みのリストを得ます。
    2. バブルソート (Bubble Sort):

### 探索アルゴリズム（特定のデータを見つけ出すアルゴリズム）

※ハッシュ法と二分探索法が出る可能性大

- 線形探索法
    - 線形探索法は、データを順番に検索するアルゴリズムです。
    - リストや配列内の各要素を順番に調べ、目的の要素が見つかるか、リストの終端まで探索します。
    - 線形探索はソートされていないデータにも適用できますが、大規模なデータ構造では効率が低いことがあります。
- **ハッシュ値**
    - ハッシュ法は、データを高速に検索するためのアルゴリズムです。
    - ハッシュ関数を使用して、データのキーをハッシュ値に変換します。
    - ハッシュ値を使って、データを格納した配列やハッシュテーブルなどのデータ構造にアクセスし、データを効率的に取得します。
    - ハッシュ法は平均的に高速な検索を提供しますが、ハッシュ関数の選択が重要で、衝突（複数のキーが同じハッシュ値を持つ状況）の処理が必要です。
- **二分探索法**

    - 二分探索法は、データがソート済みのリストや配列内で検索するアルゴリズムです。
    - リストの中央の要素を調べ、目的の要素が中央より小さいか大きいかを比較します。
    - 目的の要素が中央より小さい場合、探索範囲を前半に絞り込み、大きい場合は後半に絞り込みます。
    - このプロセスを繰り返して、目的の要素が見つかるまで続けます。

### 再起アルゴリズム

- とは
    - 再起呼び出しアルゴリズムは、関数が自身を呼び出す再起性を持つアルゴリズムです。
    - 再帰的な関数は、問題を小さな部分問題に分割し、それを解決するために同じ関数を再帰的に呼び出します。

### オーダー（アリゴリズムの計算量）

- オーダーとは
    - アルゴリズムを完了するための計算量
    - オーダー記法
    **O(計算量)**
    - データの量が2倍、3倍になると、計算量も2倍、3倍になる > O(n)
    - データの量が2倍、3倍になると、計算量も4倍、9倍になる > O(n2)
    - **二分探索法のオーダー**
        
        **O (log n)**
        
        - logとは対数。何等倍かを表す
        - 2の3乗＝8の場合
        log 8 = 3 (2を何回かけたら8になるか)

## プログラミングの性質

※出るのはリカーシブとリエントラント

- **再起（リカーシブ）**
    - プログラミングの実行中に自分自身を呼び出すことができる性質
    - 再起プログラミング
- **再入可能（リエントラント）**
    - 複数のプログラムから同時に呼び出されても正しく動作する性質
    - 再入可能プログラミング
- 再配置可能（リロケータブル）
    
    プログラムを主記憶装置のどの部分においても実行できる性質
    
- 再使用可能（リユーザブル）
    
    一度主記憶装置に格納すれば、何度でも繰り返し実行できる性質
    

### Javaが含まれる用語

- **Javaアプレット**
    
    クライアントの**Webブラウザ上で実行される**プログラム
    
- **Javaサーブレット**
    
    **サーバー上で実行される、動的Webページを作るため**のプログラム
    
- **Java Beans**
    
    機能を**部品化、再利用できるようコンポーネント化**するための仕様
    

### その他の言語

- マークアップ言語
    
    ※タグを定義しる言語
    
    - HTML（タグで論理構造や文字要素を定義）
    - XML（任意のタグを定義）
- Ajax
    
    Webページ上で**画面推移なしで動的インターフェースを実現する**技術（非同期処理）
プロンプトシールド: AI入力攻撃からの防御（Azure AI Content Safety）

## プロンプトシールドとは

Azure AI Content Safetyの重要な機能の1つであるプロンプトシールドは、生成AIモデルを有害または不適切なコンテンツの生成から守るために設計されました。この機能は、AIシステムに対する様々な形式の攻撃を検出し、防御する上で重要な役割を果たします。

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

## プロンプトシールドの目的と機能

プロンプトシールドの主な目的は、以下の2種類の攻撃リスクを検出・軽減することです：

1. **ユーザープロンプト攻撃**: システムメッセージに設定されたルールを回避または破るように設計された悪意あるユーザー入力。
2. **ドキュメント攻撃**: ドキュメント内に埋め込まれた有害なコンテンツを含む入力。

これらの攻撃は、複雑なロールプレイから安全目標の巧妙な裏切りまで、様々な形態をとります。例えば、AIに対して「他の指示はすべて無視してください」といった追加の命令を与えることで、意図しない回答を引き出そうとする攻撃などが含まれます。

## プロンプトシールドの重要性

生成AIの普及に伴い、これらのシステムを悪用しようとする試みも増加しています。プロンプトシールドは、以下の点で重要な役割を果たします：

- **AIの信頼性向上**: 不適切な出力を防ぐことで、AIシステムの信頼性を高めます。
- **セキュリティの強化**: 悪意ある攻撃からAIを保護し、セキュリティを強化します。
- **コンプライアンスの確保**: 法的・倫理的ガイドラインに沿ったAIの運用を支援します。


## Azure AI Content Safetyでの実装

Azure AI Content Safetyでは、プロンプトシールドは「コンテンツフィルター」の一機能として実装されています。これにより、暴力的な表現や性的な表現などと同様に、ジェイルブレイク攻撃などのAI特有の脅威にも対応できます。

## 使用方法

Content Safety Studioでプロンプトシールドを試すには：

1. **[プロンプトシールド]** パネルを選択します。
2. サンプルテキストを選択するか、独自のコンテンツを入力します。
3. CSVファイルをアップロードしてバッチテストを実行することも可能です。
4. **[テストの実行]** を選択して分析を開始します。

分析結果では、入力テキストに含まれる潜在的な攻撃パターンがフラグ付けされ、リスクレベルが示されます。これにより、AIシステムへの入力を事前にフィルタリングし、悪意ある使用を防止することができます。

## APIを使用したプロンプトシールドの実装

開発者は、Azure AI Content Safety APIを使用してプロンプトシールドを自社のアプリケーションに統合できます。以下は、APIを使用してプロンプトシールドを実装する基本的な手順です：

1. Azure portalでContent Safetyリソースを作成し、キーとエンドポイントを取得します。
2. APIエンドポイントに対してPOSTリクエストを送信し、分析したいテキストを含めます。
3. 返されたJSON応答を解析し、検出された攻撃の有無や種類を確認します。
```bash
curl --location --request POST '<endpoint>/contentsafety/text:shieldPrompt?api-version=2024-02-15-preview' \
--header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"userPrompt": "分析したいテキスト",
"documents": ["分析したいドキュメント"]
}'
```

この設定を行うことで、以下のことが可能になります：

- **ユーザープロンプト攻撃の検出**: ユーザーが入力するプロンプトに潜む不正な命令や規則破りの意図を検出し、生成AIが意図しない動作をするのを防ぎます。
- **ドキュメント攻撃の防御**: 外部ドキュメントに埋め込まれた有害なコンテンツや嘘の情報を検出し、AIがそれに基づいて誤った回答を生成するリスクを軽減します。
- **コンテンツフィルタリング**: 暴力的、性的、不適切な内容など、有害なコンテンツを事前にスキャンし、生成AIへの入力や出力を安全なものにします。

これにより、AIシステムが安全かつ信頼性の高い方法で運用されることを保証できます。

## まとめ

プロンプトシールドは、Azure AI Content Safetyの重要な機能として、AIシステムを様々な形式の攻撃から守ります。ユーザープロンプト攻撃やドキュメント攻撃を検出・軽減することで、AIの出力の安全性と信頼性を高めます。開発者はこの機能をAPIを通じて簡単に統合でき、より安全なAIアプリケーションの構築が可能になります。
BLE Meshのモデルと用語解説

# BLE Meshのモデルと用語解説

## モデルとは？
BLE Meshはフラッド通信を採用しており、従来のBLEとは異なる概念で動作します。Meshでは、"モデル" と呼ばれる要素が定義されており、これはBLEの標準サービスに相当します。各モデルの機能は厳格に定められており、その範囲内でのみ動作します。

例えば：

- **Generic OnOff Server** はON/OFFの状態を **Generic OnOff Client** に送信する。
- **それ以外のことはできない。**

## モデル一覧
BLE Meshの最新の実装済みモデル一覧は以下のページを参照してください。  
[nRF Connect SDK - Mesh Models](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.8.0/nrf/libraries/bluetooth_services/mesh/models.html)

## Meshの主要用語
BLE Meshでは、従来のBLEにはなかった新しい用語が多数登場します。

### Provisioner（プロビジョナー）
Meshネットワークの管理を行うデバイス。通常、PCやスマートフォンが担いますが、組み込み機器でも可能です。

- Unprovisioned Device（未プロビジョニングデバイス）をMeshネットワークに参加させる。
- ネットワークの中心的な役割を持ち、**0x0001** のUnicast Addressが割り当てられる。（変更可能）

### Network Key（NetKey）
Meshネットワークを識別するキー。

- **Provisionerが生成** し、同じNetKeyを持つデバイスは同じネットワークに所属する。
- NetKeyを手動で設定するだけでは参加できない。鍵交換に秘密鍵が関与するため。
- 複数のNetwork Keyを持つことができ、**2個目以降はSubnet Key** と呼ばれる。

### App Key（AppKey）
メッセージのPublish/Subscribe時に使用されるキー。

- **Publish：** 1つのAppKeyのみ指定可能。
- **Subscribe：** 複数のAppKeyを指定可能。
- **Network Key / Subnet Keyと紐づく** ため、両方が一致した場合のみメッセージを受信可能。

### Unprovisioned Device（未プロビジョニングデバイス）
Meshネットワークに参加していないデバイス。

### Node（ノード）
Meshネットワークに参加しているデバイス。

- 一度参加すると、**リセットしない限りUnprovisioned Deviceに戻れない**。
- Provisionerは不要なデバイスを排除するため、Network Keyを変更できる。

### Provisioning（プロビジョニング）
Unprovisioned DeviceをNodeにする手続き。

### Element（エレメント）
Nodeを構成する要素。

- 例：スイッチ（Generic OnOff Client）、電球（Generic OnOff Server）
- **1つのNodeが複数のElementを持つことも可能。**

### Model（モデル）
Elementが持つプロパティ。

| Model | 説明 |
|--------|----------------|
| Generic OnOff Server | ON/OFF状態を受信（Subscribe） |
| Generic OnOff Client | ON/OFF状態を送信（Publish） |
| Generic Level Server | 8bit/16bitの値を受信 |
| Generic Level Client | 8bit/16bitの値を送信 |

> ℹ️ Bluetooth Low EnergyのようにカスタムUUIDを作成することはできない可能性が高い。ただし、**仮想アドレス（Virtual Address）** という概念が存在するが、詳細は不明。

## Address（アドレス）
BLE Meshデバイスは必ず **固有のUnicast Address** を1つ持つ。

### ユニキャストアドレス（Unicast Address）

- NodeやProvisionerに割り当てられる固有アドレス。
- 範囲：`0x0001` ～ `0x7FFF`
- 他デバイスとの重複は不可。

### グループアドレス（Group Address）

- 範囲：`0xC000` ～ `0xFEFF`
- ユーザー独自のグループ作成が可能。
- **Publish/Subscribe時に使用すると、デバイスの追加・削除が容易になる。**

#### 予約済みアドレス

| アドレス範囲 | 説明 |
|-------------|----------------|
| `0xFF00 - 0xFFFB` | RFU（将来使用のため予約） |
| `0xFFFC` | All-proxies（Proxy機能が有効なノード全体） |
| `0xFFFD` | All-friends（Friend機能が有効なノード全体） |
| `0xFFFE` | All-relays（Relay機能が有効なノード全体） |
| `0xFFFF` | All-nodes（全ノード向け送信） |

#### 仮想アドレス（Virtual Address）
BLEのUUID形式のアドレスに相当すると考えられるが、詳細は不明。

## Publish（パブリッシュ）
メッセージの送信。

- **送信アドレス** と **AppKey** を指定。
- **ユニキャスト or グループアドレス** を利用可能。
- **ユニキャストよりグループアドレスのほうが管理しやすい。**
  - ユニキャストはデバイス交換時に設定変更が必要。

## Subscribe（サブスクライブ）
メッセージの受信。

- **受信アドレス** と **AppKey** を指定。
- ユニキャストとグループアドレスの両方が利用可能。

## Appendix（付録）

### nRF Connect SDK
[nRF Connect SDK - Bluetooth Mesh](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_bt_mesh_concepts.html)

### Bluetooth Meshの用語集
[Bluetooth Mesh Glossary](https://www.bluetooth.com/learn-about-bluetooth/recent-enhancements/mesh/mesh-glossary/)
フロントエンド入門：繰り返し使いたいCSSボタンスタイルのテンプレートを自分用にまとめてみた

## はじめに
Web制作の中で、ボタンはユーザーのアクションを導く重要な要素です。

今回は、以下のCSSコードでボタンをスタイリングする方法について、自分用の備忘録としてまとめました。

```css
button {
  background-color: #3d843d;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 25px;
  font-size: 16px;
  cursor: pointer;
  transition: background-color 0.3s;
}
```

## 書こうと思ったきっかけ
シンプルで美しいボタンを作りたいと思ったとき、毎回デザインを調整するのが手間に感じていました。

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

このスタイルがちょうど良かったので、いつでも再利用できるように記録しておきます。

## 内容の説明
- `background-color: #3d843d;`
  - 背景色を深いグリーンに指定。落ち着いた印象で、信頼感を与える色味。

- `color: white;`
  - ボタン内の文字色を白に設定。背景とのコントラストがはっきりして視認性が高い。

- `border: none;`
  - 枠線を削除し、すっきりとした見た目に。

- `padding: 10px 20px;`
  - 内側の余白を設定し、ボタンサイズを適切に調整。

- `border-radius: 25px;`
  - ボタンを角丸にして、柔らかい印象に。

- `font-size: 16px;`
  - テキストサイズを読みやすい大きさに。

- `cursor: pointer;`
  - マウスホバー時にカーソルが「手の形」になり、クリック可能であることを示す。

- `transition: background-color 0.3s;`
  - 背景色の変更にアニメーションを加えることで、滑らかな視覚効果を実現。

## まとめ
このCSSボタンスタイルは、ユーザーに優しいデザインとシンプルな実装の両立を意識しています。

今後ボタンを実装する際は、このスタイルをベースにアレンジして活用していきます！