OmniAICreator/Qiita-1.07M huggingface dataset:
Git怖くないシリーズその4(全5回)：.gitignoreを知る

## .gitignoreとは

* プロジェクトディレクトリの中に置く必要があるが履歴管理したくないファイルがある
* ここに書かれたパターンのファイルやディレクトリはGitから無視される

----
## Git管理の対象とは？

* 開発の対象
* 開発者に共通の設定

----
## 管理対象から外すべきもの

* 依存ライブラリの実体：例えば ```node_modules```
* 開発者単位の設定：エディタの設定など。例えば ```.vs```
* ビルドの成果物：```bin```/```obj```/```dist``` など
* 機密情報：例えば```.env```

----
## 外すかどうか悩むもの

* 自動生成するソースコード
  ビルド時に生成し直す、という戦略もあり。この場合.gitignoreに書く
  どちらかと言えばバージョン管理したい
* ビルドの成果物
  管理しておきたい場合もある！

----
## 機密情報の管理について

* 環境変数から取得（値はGit以外の方法で共有）
  ```dotenv```などのツールを利用すると環境毎の切り替えがらく
* KeyVaultなどのサービスを利用

----
## .gitignoreの生成

* プロジェクトを最初の作成するときに、どこかからかサンプルを持ってくるのが吉
  使っている言語やツールでだいたい.gitignoreの内容は定まる
* でも、一度はゼロから書くのがおすすめ！

----
## うっかりGit管理してしまったら

* 過去の履歴は消せないのであきらめる
* .gitignoreに追記
* ```git rm xxxx```で管理から外す

----
## 最後に

* .gitignoreを書くと開発環境の知識が深まる
10分でChromeのプラグインを作成する

## はじめに
Chromeのプラグインを作成してみたいなと思い、サンプルで作ってみました！
背景色を変更する超簡単なやつです！
![chrome plugin .gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/19e5f8b3-b8a2-4270-b9ee-c6f720b96199.gif)

## 成果物
今回作ったファイルは下記リポジトリから取得できます。

https://github.com/kouji0705/chrome_plugin_jisaku

## ソースコード
```shell:ディレクトリ構成
~/develop/chrome_plugin_jisaku  (main)$ tree
.
├── icon128.png
├── icon16.png
├── icon48.png
├── manifest.json
├── popup.html
└── popup.js

1 directory, 6 files
```

```json:manifest.json
{
	"manifest_version": 3,
	"name": "Background Color Changer",
	"version": "1.0",
	"description": "ウェブページの背景色を変更します。",
	"permissions": ["scripting", "activeTab"],
	"host_permissions": ["<all_urls>"],
	"action": {
		"default_popup": "popup.html",
		"default_icon": {
			"16": "icon16.png",
			"48": "icon48.png",
			"128": "icon128.png"
		}
	}
}
```

```js:popup.js
function changeBackgroundColor() {
    document.body.style.backgroundColor = "lightblue";
}

document.addEventListener("DOMContentLoaded", () => {
    const button = document.getElementById("changeColor");
    if (button) {
        button.addEventListener("click", () => {
            console.log("ボタン押された！");
            chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
                chrome.scripting.executeScript(
                    {
                        target: { tabId: tabs[0].id },
                        function: changeBackgroundColor,
                    },
                    (results) => {
                        if (chrome.runtime.lastError) {
                            console.error("実行エラー:", chrome.runtime.lastError.message);
                        } else {
                            console.log("実行結果:", results);
                        }
                    }
                );
            });
        });
    } else {
        console.error("changeColor ボタンが見つかりませんでした。");
    }
});
```

```html:popup.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>背景色変更</title>
    <script src="popup.js"></script>
  </head>
  <body>
    <button id="changeColor">背景色を変更</button>
  </body>
</html>
```


## 公開手順
1. Pluginのリンクにアクセス
　→[chrome://extensions/](chrome://extensions/)

2. デベロッパーモードをオンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8f17c65a-c1d1-417e-b73e-91d620caaab0.png)

3. 「パッケージ化されていない拡張機能を読み込む」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3fc6764c-ecb2-4611-9914-ce102d0af5d4.png)

4. 作成したディレクトリを設定する

:::note info
これで完成です！！！めっちゃ簡単ですね！！
:::
ChatGPT（GPT-4o）にシンギュラれった小話

ちょっとした「アーキテクチャ」の PoC、というか導入サンプルのため、モデルを書いた。

「サンプル」プロジェクトのモデルを何にするか、というのは、一つの考え事となる事項ではあるが、あくまで「サンプル」のテーマであるから、最小、かつ（サンプル内での）拡張性を示すため、[デジタル回路](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E5%9B%9E%E8%B7%AF)の[NANDゲート](https://ja.wikipedia.org/wiki/NAND%E3%82%B2%E3%83%BC%E3%83%88)を書いてみた。

本質的には[関数完全性](https://en.wikipedia.org/wiki/Functional_completeness)を持つ最小情報量単位の「モデル」ではないかと考えたからだ。

イメージとしては、一応、「デジタル回路」の話なので、```bool``` ではなく、それらしい定義をして、

```CSharp
/// <summary>
/// 入出力端子の状態
/// </summary>
public enum TerminalState
{
    LOW = 0,        // LOW
    HIGH = 1,       // HIGH
    HIGH_Z = 2,     // HIGH Impedance
    UNDEFINED = 3   // 未定義
}
```

後はインタフェイスやeventなどを実装し、演算自体のロジックも書いた。

```CSharp
/// <summary>
/// 入力が変わったら出力を更新するイベントハンドラ
/// </summary>
private void InputsStateChangedHandler(object? sender, EventArgs arg)
{
    OutputsInternal[0].State
        = (
               InputsInternal[0].State == TerminalState.HIGH
            && InputsInternal[1].State == TerminalState.HIGH
          ) ? TerminalState.LOW : TerminalState.HIGH;
}
```

「アーキテクチャ」のサンプルだから、単体テストも書くか、でも GPT君に書いてもらおう、ということで、上記のロジックも見せつつ書いてもらい、テスト実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041503/380657f0-cd5c-49db-825f-059b6d958d82.png)

むむむ…。出力が 3 (```TerminalState.UNDEFINED```) になるようなロジックは今のところ書いていないが…。

GPT君が記述した単体テストを見てみる。

```CSharp
    // NANDロジックに合わせる
    if (input1 == TerminalState.HIGH && input2 == TerminalState.HIGH)
    {
        return TerminalState.LOW;
    }
    else if (input1 == TerminalState.HIGH_Z || input2 == TerminalState.HIGH_Z)
    {
        return TerminalState.UNDEFINED; // High-Zは未定義扱い
    }
    else if (input1 == TerminalState.UNDEFINED || input2 == TerminalState.UNDEFINED)
    {
        return TerminalState.UNDEFINED; // UNDEFINEDは未定義扱い
    }
    else
    {
        return TerminalState.HIGH; // それ以外はNAND=HIGH
    }
```


うっ…、「テストケース書いて」と言っただけなはずなのに、__「俺より厳密でちゃんとした演算ロジック」__ 書いてきてやがるっっっっ…。


いつのまにかTDDに…(笑)



おしまい
【SQL】Sort Merge

# はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。
現在、SQLを勉強しており、その中でも内部結合や外部結合などを学習しています。
これらの結合では、Nested Loops、Hash、Sort Merge といったアルゴリズムが採用されることがあります。
本記事では、その中でもSort Mergeについて解説していきます。

# Sort Merge結合とは？

Sort Merge結合（Sort Merge Join）は、SQLにおける結合アルゴリズムの一種です。特に、結合対象のデータ量が多く、結合条件に不等号（<、>、<=、>=）を含むようなケースで有効となることがあります。

## アルゴリズムの流れ

Sort Merge結合は、大きく以下の2つのステップで構成されます。

1. **AテーブルとBテーブルを結合キーでソートする**
2. **ソート済みの2つのテーブルをマージ処理でマッチングさせる**

マージ処理では、ソート済みのデータを先頭から順に比較していくため、線形的な効率で結合処理を進められます。

## 特徴

- **両テーブルをソートする必要がある**ため、Nested Loops結合よりも**多くのメモリを消費**する傾向があります。
- Hash結合と比較すると、Hash結合は**片方のテーブルのみ**をハッシュ化するため、状況によっては**Sort Mergeの方がメモリ消費が多くなる**可能性があります。
- メモリ不足が発生すると、一時ファイル（TEMP）をディスクに書き出す「TEMP落ち」が起こり、**ディスクI/Oによる遅延**が発生するリスクがあります（これはHash結合と同様）。
- **等値結合（=）だけでなく、不等号（<、>、<=、>=）を使った結合**にも対応しています（Hash結合では不可）。ただし、**否定条件（<>）には対応していません**。
- テーブルがすでに**結合キーでソート済み**であれば、ソートステップをスキップすることができます。ただし、SQLはテーブルの物理的配置に依存しないため、これは**DBMSの実装依存**となります。
- ソートされたデータを使用するため、**一方のテーブルを全スキャンした時点で、結合を終了**することができます。

## Sort Mergeが有効なケース

- **結合する行数が多い**場合でも、マージ処理自体は高速に行えます。
- **結合キーでソート済み**のテーブルが存在する場合、ソート処理をスキップできれば大きなメリットになります。
- **不等号による結合条件**が含まれている場合、Hash結合では対応できないため、Sort Mergeが選ばれることがあります。

## ただし注意点

- 通常は、**Nested Loops結合やHash結合の方が優先**されます。特に、インデックスが使える場合のNested Loopsは非常に効率的です。
- **ソート処理には時間とリソースを要する**ため、テーブルが未ソートの場合はパフォーマンス上のコストが大きくなります。

## まとめ

Sort Merge結合は、特定の条件下で非常に有効な結合方法ですが、メモリやソートコストの面で注意が必要です。特に以下のようなケースで有力な選択肢になります：

- 結合キーがすでにソートされている
- 不等号を使った結合条件が必要
- 対象データが非常に大きい

普段のSQLチューニングでは、まずNested LoopsやHash結合のパフォーマンスを確認し、必要に応じてSort Merge結合を検討するのが良いでしょう。
Azure OpenAI Embeddings Models 比較メモ

[Azure OpenAI Developers Seminar 2025](https://youtu.be/jHW6zcIzm7g) で触れた内容のメモ。

Azure OpenAI Service でデプロイ可能な3つの Embeddings モデルの性質をいまさらながら比較、可視化したやつ。PCA で次元削減を行って単語ベクトルを3次元空間で可視化。

まぁデータは[いつものやつ](https://github.com/nohanaga/busho-index/blob/main/TextChunking_Embeddings_RegisterIndex.ipynb)を使用して、文章中でよく使われる単語の上位 1,000 個を形態素解析器を用いて抽出している（生成 AI 使ってもいいけど）。

事前に私がグループごとに色分けしてるので、それがクラスタ化によって近くに集まれば精度が高いということになる。元の次元を3次元まで削減しているので、非常に損失の多いプロセスであることに注意しつつ見て欲しいが、やはり v3 モデルは事前に色分けした分類ごとにしっかり近くに集まってくれていることが分かる。

![スクリーンショット 2025-04-09 9.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/2464dcf1-5bf1-43d8-80f8-ef35c8cde721.png)

`text-embedding-ada-002` はぎゅっと狭い領域に集められているように見えるが、分類ごとに近づいてくれてはいる。実際に OpenAI 社が実施した精度評価結果は以下のようになる。

![スクリーンショット 2025-04-09 10.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/12dbee06-14b5-435c-a101-2a7960e7516d.png)
<sup>[OpenAI](https://openai.com/ja-JP/index/new-embedding-models-and-api-updates/) によるベンチマーク結果</sup>

また、各 Embeddings モデルには異なる類似性の値の範囲があるため、あるモデルにおける類似性が 0.5 であるからといって、別のモデルにおける類似性が 0.5 と同じであると想定すべきではない。使用しているモデルの類似性の値の範囲を必ず確認しておく。


![スクリーンショット 2025-04-09 9.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0c20446a-a343-46d1-a162-ba55d7d395f7.png)

特に `text-embedding-ada-002` ベクトルは類似性の値の範囲が非常に狭く（0.65～0.85）、角度にすると約49°～32°の間になる。一方 `text-embedding-3-small` は範囲が広く（0.20～0.70）、角度にすると約78°～46°の間、「1」が「非常に類似している」を意味し、「0」が「類似していない」を意味するという直感に近いのでは。

この現象は、[OpenAI Developer Community](https://community.openai.com/t/expected-angular-differences-in-embedding-random-text/28577/10) で Curt.Kennedy 氏が報告した内容と極めて類似している。同氏は `text-embedding-ada-002` を用いて 80,000 件以上の英語メッセージのEmbeddings を取得した際、最も離れたベクトル同士でも角度が約50°以内に収まっていたという観察結果を報告している。そして、それに基づき「Embeddings ベクトルが単位球面（hypersphere）のごく限られた領域に密集しているのではないか」と考えた。

この考えに基づけば、私の観察した日本語単語同士のベクトル角度分布が 約49°～32°の狭い範囲に集中していたことも、「`text-embedding-ada-002` が生成するベクトルは、意味的に十分に異なる内容であっても、球面全体を使って広がるのではなく、局所的な領域に集中する」という構造的制約を示していると解釈できる。

# MRL による削減効果
OpenAI の `text-embedding-3-large` と `text-embedding-3-small` では、MRL(Matryoshka Representation Learning)という技術を使用している。この手法では、ベクトルの先頭部分に向けて情報密度が高まるようにモデルが学習されているため、先頭から一部の次元だけを取り出しても重要な情報を保持できる。


![スクリーンショット 2025-04-09 9.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/1456c731-15ee-4672-8a52-46e2b45e5d4f.png)

元の 1,536 次元から768 次元に切り詰め。さらに 256 次元に切り詰め。Microsoft としては元の 1/2〜1/3 くらいまでを推奨している。これにより、用途に応じてフルサイズの 3,072 次元のベクトルだけでなく、256 次元や 512 次元のサブベクトルも柔軟に活用でき、性能を大幅に損なうことなく効率的な検索や分析が可能になる。

ちなみに Assistants API の [File Search Tool](https://learn.microsoft.com/azure/ai-services/openai/how-to/file-search?tabs=python#how-it-works) は 256 次元の `text-embedding-3-large` を使っている。

## MRL on Azure AI Search 
Azure AI Search 上で MRL を利用した時の精度評価とベクトルインデックスのサイズ削減効果についてはすでに解説済み。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/77c475d2-2dd1-423a-a45a-b1f4bdd79316.png)

https://qiita.com/nohanaga/items/e0dad274be662863ea6a


# GitHub
https://github.com/nohanaga/vector-embeddings-test

当記事は英語データの分析をされた Microsoft Pamela Fox 氏のコードをベースにしています。感謝。

https://github.com/pamelafox/vector-embeddings-demos
【ChatGPT＋4o Image Generation】で間取り図を3Dにします。


　どうも、カーブミラーです。

　今回は、4o Image Generationで間取り図を3Dにします。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はあります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　それから
　　著作権法については
　　　こちらを参照するのが
　　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　では、【本題】です。

　今回は、
　　4o Image Generationで
　　　間取り図を3Dにします。

　間取り図は
　　アパート・マンション、
　　　それから家の購入や引っ越しで
　　　　必ず見ます。

　さまざまなことが
　　間取りからわかります。

　でも平面図なので　
　　なんとなく想像するしかありません｡

　まぁ、とりあえず
　　立体にしてみれば、
　　　イメージをふくらませられる
　　　　かもしれませんよね。

　そこで今回は、
　　間取り図を渡して
　　　立体にしてもらうことにしました｡
***
　こちらが、
　　試した間取り図と
　　　その3Dになります。
![file_00000000404851f78761d85dd7427b26_conversation_id=67f3b9f9-a600-8007-ba3e-74718bc4052f&message_id=956ba9e1-ed54-4f97-9aed-80b2b1fe3fb7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/bf31048a-2e7b-4c09-9431-bcc634f91493.png)


　手順は、
　❶GPT-4oであることを確認
　❷間取り図をアップロード
　❸下記Promptを入力
```Text:間取り図→3DにするPrompt
この間取り図に従って、3Dにして
```
　❹送信する

　生成してみると
　　窓がなかったりと
　　　変なところはあります。

　それでも
　　間取り図を見るだけよりは
　　　参考になることでしょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
システム運用の3分類

## システム運用の3分類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/6bf30b10-6d52-4eda-9df5-5d51ad656459.png)


 ## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
AWS運用入門 押さえておきたいAWSの基本と運用ノウハウ 単行本（ソフトカバー） – 2023/4/1
佐竹 陽一 (著), 山﨑 翔平 (著), 小倉 大 (著), 峯 侑資 (著)
p.7
バイナリとCPUの深い関係を理解する

## はじめに
仮想化技術について理解を深める中でモヤモヤするのは、そもそもコンピュータの仕組みの理解不足だと感じた。そこで、「コンピュータはなぜ動くのか」という本をきっかけに色々理解を深めてみた。

---

## 1. バイナリコードはCPUに依存する

CPUには「命令セットアーキテクチャ」という仕様があり、各命令がどのようなバイナリ（0と1の列）で表されるかが決まっている。

- **x86**（Intel、昔のMac）
- **ARM**（Apple Silicon）

同じ処理でも、CPUが違えば命令の形もバイナリ列も異なる。

たとえば、「レジスタに1を入れる」という処理でも：

- x86では `0xB8 0x01 0x00 0x00 0x00`
- ARMではまったく異なる命令とバイト列

つまり、**バイナリコードは「どのCPU向けか」が明確に決まっている**。

---

## 2. OSの正体：OSも結局はバイナリ

OS（Operating System）とは、基本的には **カーネルというソフトウェア本体** を指す。これはCなどで書かれたプログラムで、最終的に **CPUが理解できるバイナリコードにコンパイルされる。**

たとえば：

- macOS（Intel用）
- macOS（Apple Silicon用）
- Ubuntu（x86用）
- Ubuntu（ARM用）

など、それぞれ別のバイナリとして存在している。だからこそ、**違うCPUにOSを移植するには「命令を理解できるように作り直す」必要がある。**

---

## 3. コンパイラ言語とインタプリタ言語の違い（CPUとの関係）

### コンパイラ言語

- ソースコード → コンパイラ → **そのCPU用のバイナリに変換**
- CPUが違えば再コンパイルが必要

例：C, C++, Rust, Go

### インタプリタ言語

- ソースコード → **インタプリタ（バイナリ）** が1行ずつ実行
- スクリプト自体はCPU非依存
- ただし **インタプリタはCPU依存のバイナリ**（Python自身がARM用 or x86用）

例：Python, Ruby, Bash, PHP

---

## 4. 仮想化とエミュレーション：CPUの違いを吸収する技術

### 仮想化（Virtualization）

- **CPUアーキテクチャが同じ**前提で、仮想マシン上に別のOSをインストール
- 命令はそのまま物理CPUで実行（＝高速）

例：

- Intel Mac上にVirtualBoxでWindows（x86）を動かす → 仮想化でOK

### エミュレーション（Emulation）

- **CPUが異なる**場合、命令が通じない
- QEMUなどが **1命令ずつ読み取り、翻訳して実行**（＝遅いが動く）

例：

- Apple Silicon Mac（ARM）でx86用Windowsを動かす → エミュレーションが必要

---

## 5. まとめ：重要なのは「誰がCPUの違いを吸収するか」

| 項目 | 誰が命令を変換・吸収するか |
| --- | --- |
| コンパイラ言語 | コンパイラ（ビルド時） |
| インタプリタ言語 | インタプリタ（実行時） |
| 仮想化 | OSそのまま、変換不要（CPU一致） |
| エミュレーション | QEMUなどが命令を変換（CPU不一致） |

---

## 6. 補足：OSインストールとISOファイルについて

仮想化環境でOSを動かすには、ISOファイルを使う。これは、

> OSインストール用のCD/DVDの中身を、丸ごと1ファイルにしたもの
> 


### 仮想化の手順（例：Intel Mac）
```
1. 仮想マシンを作成（名前：Windows）
2. 仮想ハードディスクを作成（例：50GB）
3. WindowsのISOファイルを読み込む
4. 仮想マシンを起動 → インストーラが走る
5. 仮想ディスクにOSをインストール

```

---
なぜREST APIはHTTPを使うのか？ ― Webの仕組みを活かしたAPI設計の背景


## はじめに

APIについて学んでいると、よく「REST API」や「HTTPメソッド」といった言葉に出会います。  
特に「REST APIはHTTPを使っている」と聞くと、

> 「そもそもAPIはコンピューター同士の通信なのに、Webページ用のHTTPをわざわざ使う必要ある？」

と疑問に感じる人もいるかもしれません。

この記事では、そんな素朴な疑問に向き合いながら、HTTPメソッドの役割やREST APIとの関係をわかりやすく整理します。

---

## HTTPメソッドとは何か？

HTTPメソッドとは、Webブラウザなどのクライアントがサーバーに対して「どんな操作をしたいか」を伝える命令です。  
たとえば：

- `GET`：データを取得したい（例：Webページを表示）
- `POST`：新しいデータを送信したい（例：フォーム送信）
- `PUT`：データを更新したい
- `DELETE`：データを削除したい

これらのメソッドは、HTTPリクエストの最初の行（リクエストライン）に書かれて送られます。

普段私たちがWebサイトを見るとき、ブラウザは自動的に `GET` メソッドを使ってサーバーからページを取得し、サーバーは「200 OK」というステータスとともにHTMLを返します。

---

## APIにHTTPを使う必要はあるのか？

API（Application Programming Interface）は、コンピューター同士がデータをやり取りするための仕組みです。  
これは人間が見るWebページとは違い、単にデータを送受信するだけなので、**わざわざHTMLやHTTPといったWeb向けの仕組みを使う必要はない**ようにも思えます。

実際、専用のプロトコル（たとえばgRPCや独自TCP通信など）を使ったAPIも存在します。  
それでもREST APIのように、**HTTPをベースにしたAPI設計**が広く使われているのには理由があります。

---

## REST APIとは？ なぜHTTPを使うのか？

REST（Representational State Transfer）は、Webの仕組み（URIやHTTPメソッド）を活用して、リソースにアクセスするという設計思想です。  
REST APIとは、その考え方に従ってHTTPを使って設計されたAPIです。

例として、あるユーザー情報を取得・作成・更新・削除するAPIは以下のようになります：

| 操作       | HTTPメソッド | URL            | 意味                         |
|------------|--------------|----------------|------------------------------|
| 情報を取得 | `GET`        | `/users/123`   | ユーザー123番の情報を取得   |
| 新規作成   | `POST`       | `/users`       | 新しいユーザーを作成        |
| 情報を更新 | `PUT`        | `/users/123`   | ユーザー123番の情報を更新   |
| 情報を削除 | `DELETE`     | `/users/123`   | ユーザー123番を削除         |

このように、**URL（リソース）＋HTTPメソッド（操作）**というWebの基本構造を流用して、APIをわかりやすく設計できるのがRESTの特徴です。

---

## なぜREST APIが広まったのか？

REST APIが広く使われている理由は、単に「HTTPを使えるから」だけではありません。

- **既存のインフラ（Webサーバー、ブラウザ、プロキシ、ファイアウォール）に乗れる**
- **学習コストが低く、直感的**
- **URLとメソッドを組み合わせることで、意味の通った設計ができる**
- **ツール（curl、Postman、ブラウザの開発者ツールなど）で簡単に扱える**

たとえば、TwitterのAPI（Twitter API）などもRESTベースで作られており、簡単なツールで自動ツイートや検索ができるようになっています。

---

## おわりに

REST APIは、一見遠回りに見える「HTTP」という手段をあえて使っていますが、そこには**Webの仕組みを最大限に活用し、わかりやすく・使いやすいAPIを設計する**という狙いがあります。

「Webページを取得するための仕組み」だったHTTPが、いまや**データのやり取りにも活用されている**という点は、Web技術の柔軟さと拡張性の象徴ともいえるでしょう。

---

## 付録：関連キーワード

- RESTとRESTfulの違い
- GraphQLやgRPCとの比較
- ステータスコード（200 OK、404 Not Found、500 Internal Server Error など）
- HTTPヘッダー、リクエストボディ／レスポンスボディ
クリップボードへ文字列を設定 ／ クリップボードの文字列を取得

```
' クリップボードへ文字列を設定
Sub SetClipboardText(ByVal Text As String)
    With New DataObject
        .SetText Text
        .PutInClipboard
    End With
End Sub
```
```
' クリップボードの文字列を取得
Function GetClipboardText() As String
    On Error Resume Next
    With New DataObject
        .GetFromClipboard
        GetClipboardText = .GetText
    End With
End Function
```
システムとは

## システムとは
　ハードウェア、ソフトウェア、ネットワーク、データなど様々な要素を上手く組み合わせることで、全体として機能（サービス）を提供する仕組みをシステムと呼ぶ。

 ## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
AWS運用入門 押さえておきたいAWSの基本と運用ノウハウ 単行本（ソフトカバー） – 2023/4/1
佐竹 陽一 (著), 山﨑 翔平 (著), 小倉 大 (著), 峯 侑資 (著)
p.2
[Javascript]クロージャについて[初心者]

JavaScriptにおけるクロージャを学んだので備忘録として
# クロージャとは
- 関数とその関数が作成されたスコープの組み合わせを指す
- クロージャを利用することで関数外部から内部のデータを秘匿できる
- クロージャ関数が実行された後も関数内のローカルスコープへの参照を保持する
# なぜクロージャが重要なのか、実際の現場でどんなふうに使えるか
- データをプライベートなデータとして秘匿できる為、外部からの意図しないアクセスをブロックできる
- ローカルスコープを保持し独立した状態を持つ関数を生成できる為、再利用性が向上する
# クロージャの例
```javascript:sample.js
function countCreator(counter = 0){
  return function(){
    return counter += 1;
  };
};

const countA = countCreator(0); // 0から始まるカウンタ関数
const countB = countCreator(5); // 5から始まるカウンタ関数
const countC = countCreator(); // 実引数がない場合はデフォルト値(0)から始まるカウンタ関数

console.log(countA()) // 1
console.log(countA()) // 2
console.log(countA()) // 3

console.log(countB()) // 6
console.log(countB()) // 7
console.log(countB()) // 8

console.log(countC()) // 1
console.log(countC()) // 2
console.log(countC()) // 3
```
Amazon WorkSpacesのデジレクトリが消せない場合の対処

## 問題

Amazon WorkSpaces にて検証が終わったのでディレクトリを削除しようと思ったのですが、ID をクリックしたりディレクトリを選択しようとするとエラーが起きて触れなくなるという事象に遭遇しました。

エラー文は以下

> エラーが発生しました。
> 問題が解決しない場合は、コミュニティフォーラムや AWS Premium Support (AWS Support Center ) から AWS サポートチームにお問い合わせください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/c30c65c2-b3b7-4a51-ab7d-492eddf9286c.png)

## 解決方法

Amazon WorkSpaces がディレクトリを正常に登録解除されていない状態になってしまっているため削除できない状態になってしまっているようです。

AWS CLI から以下のコマンドを実行することで登録解除することができます。

```shell
aws workspaces deregister-workspace-directory --directory-id ディレクトリID（d-XXXXXXXXXX or wsd-XXXXXXXXXX）
```

d-XXXXXXXXXX のディレクトリ（Simple AD 等）を利用した場合は以下のコマンドで AWS DirectoryService のディレクトリも削除しておきましょう。

```shell
aws ds delete-directory --directory-id d-XXXXXXXXXX
```

以上です。

## 参考資料

- [AWS WorkSpaces 管理ガイド - ディレクトリの登録解除](https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/register-deregister-directory.html)
- [AWS CLI コマンドリファレンス - workspaces deregister-workspace-directory](https://docs.aws.amazon.com/cli/latest/reference/workspaces/deregister-workspace-directory.html)
家計簿アプリを作る＃３１

![スクリーンショット 2025-04-09 110826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/3be7aab2-a335-4028-bcb0-651bfbc431eb.png)
サイドバーのtext,path,iconをmenuItemのインターフェースを型定義します。

![スクリーンショット 2025-04-09 111021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/fa771e47-ac1a-4cdc-9243-fccc715ad1d5.png)
![スクリーンショット 2025-04-09 111106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/6dcd9e6f-fede-4ca5-9386-b900b1f1e661.png)
![スクリーンショット 2025-04-09 111045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/0f8f55df-fddb-48a8-9213-56f24b9a73be.png)
Homeを一つのメニューとして、定義👆する。
また、HomeIconもインポートします。
【Javascript】クロージャについて【初心者】

# クロージャとは
* スコープ内で定義された変数同じスコープ内の関数などで参照できる状態。
# なぜクロージャが重要なのか、実際の現場でどんなふうに使えるか
* スコープ内で変数を定義することで、スコープ外からの不要なアクセスを防ぐことができる。
* カウンターや在庫管理などをするときに変数の値を保持し続けなければならないときに有効。
# クロージャの例
```javascript:sample.js
const stockManeger = () => {
    const stock = {}
    return {
        add: (merchandise, value) => {
            stock[merchandise] === undefined ? stock[merchandise] = value : stock[merchandise] +=  value;
            console.log(stock);
        },
        remove: (merchandise, value) => {
            if (stock[merchandise] <= value){
                delete stock[merchandise];
                console.log(stock);
            } else if (stock[merchandise] === undefined) {
                console.log(stock);
            } else {
                stock[merchandise] -= value;
                console.log(stock);
            }
        }
    }
}

let operate = stockManeger();
operate.add("banana", 3); //{banana: 3}
operate.remove("banana", 1); //{banana: 2}
operate.add("apple", 2); //{banana: 2, apple: 2}
operate.remove("banana", 2); //{apple: 2}
```
【Rust】Command Launcher

# GitHub
https://github.com/mniyk/command-launcher

# ScreenShot
![Command-Launcher.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498946/a630ebed-8b72-48e1-ae34-99d3844b0bf0.gif)

# Motive
就職活動が全く順調ではないため、息抜きに.

# Use Case
シェルを開いて、毎回コマンドやスクリプトを実行したりするのって、意外とめんどくさいので、その場面を想定しました。

# Tech Stack
- Rust
- Tauri 2.0

# Difficulty
新しいウィンドウを開くことと、開いたあとにDOMを操作する箇所に躓きました.
0.5秒のスリープを入れたら、新しいウィンドウのスクリプトが実行されたのですが、それだと0.6秒以上かかったら、実行されないんですよね...
perplexityのお力を借りて、なんとか解決しました。
新しいウィンドウでロード->emit->Rustでemitを検知といった感じですね.
```confirmation.ts
// ウィンドウのロード完了を通知
// ウィンドウのロードを完了を待って、#commandの書き換えを行うため
window.addEventListener("DOMContentLoaded", () => {
  emit(
    "confirmation-window-loaded", 
    "confirmation"
  );
});
```
```lib.rs
// confirmationウィンドウを開く
#[tauri::command]
async fn open_confirmation_window(
    app: tauri::AppHandle,
    command: String,
) -> tauri::Result<()> {
    let new_window = WebviewWindowBuilder::new(
        &app,
        "confirmation",
        WebviewUrl::App("confirmation.html".into()),
    )
    .inner_size(600.0, 160.0)
    .center()
    .build()?;

    // ウィンドウのロード完了を受信
    // ウィンドウのロードを完了を待って、#commandの書き換えを行うため
    // フラグを Box でラップして可変性を持たせる
    let has_processed = std::sync::Arc::new(std::sync::Mutex::new(false));
    let has_processed_clone = has_processed.clone();

    app.listen("confirmation-window-loaded", move |event| {
        let mut flag = has_processed_clone.lock().unwrap();
        if *flag {
            return;
        }
        let payload = event.payload();
        if payload == "\"confirmation\"" {
            new_window.emit("update-command", &command).unwrap();
            *flag = true;
        }
    });
    
    Ok(())
}
```
【もう映画選びに迷わない】配信サービス別に絞り込める、映画チョイスアプリを作りました。

まずは成果物。
https://suggestmovie.netlify.app

## このアプリを作るに至った経緯
### こんな経験ありませんか？？
- ネットフリックスを開いたは良いものの、中々決められずに2時間半が経った。
- 製作国や公開年でも絞り込みたい。
- 観ようとした映画が自分の登録しているサブスクに無かった。

上記のような悩みから、次のようなアプリを作りたいと考えました。
  - 映画選びをサポートするアプリ
  - 配信サービスを絞り込める
  - 単純に一覧表示するのではなく、映画が一つずつ出てきて気に入れば右スワイプ、興味なければ左スワイプ、みたいにしたら楽しそう

同じ悩みを持っている方は、ぜひ一度使ってみて下さい。↓↓
[シネマピッカー](https://suggestmovie.netlify.app/)

そして、些細なことでも構いませんので改善要望を頂けると幸いです！

## 仕様とプログラムの詳細
ここから先は、TMDB APIの使い方を知りたい人向けの内容です。
OR条件、AND条件を使用でき、高度な絞り込みができます。

#### そもそもなぜTMDB APIを選んだのか
次の条件を満たしているAPIがTMDBくらいしか無かったからです。（他にあればコメントで教えてください！）
- 配信サービスを指定できること。
- 対象地域も指定できること。
（日本とネトフリとアメリカのネトフリでは視聴可能な作品が異なるため）
- 取得できる情報が日本語であること。
- 無料であること。

#### APIの仕様
今回はTMDB APIの中でも、「Discover」というAPIを使用します。

##### 各パラメータの仕様
- include_adult
  - 条件
  成人向けコンテンツの取得可否
  - 値
  trueもしくはfalse
- include_video
  - 条件
  TMDBに予告編が有るか
  - 値
  trueもしくはfalse
- language
  - 条件
  取得結果の言語
  - 値
  ISOの国名コード　※大文字
- page
  - 条件
  取得結果のうち何ページ目を取得するか
  ※このAPIでは、一度のリクエストで最大20件取得できます。
  つまり、pageでは検索結果のうち、「1」を指定すると1件目から20件目
  - 値
  数値（整数）
- primary_release_year
  - 条件
  主要公開年
  ※日本での公開年とは別です。
  - 値
  数値（整数４ケタ）
- primary_release_date.gte
  - 条件
  主要公開年（下限）
  ※日本での公開年とは別です。
  - 値
  数値（整数４ケタ）
- primary_release_date.lte
  - 条件
  主要公開年（上限）
  ※日本での公開年とは別です。
  - 値
  数値（整数４ケタ）
- region
  - 条件
  映画が公開されている地域
  ※取得結果のソートに関係してきます。
  例えば、ソートを人気順に指定している場合、このパラメーターで指定した地域での人気順となります。
  ※取得結果の「公開日」に関係してきます。
  指定しない場合:主要公開日
  指定した場合:その地域での公開日
  - 値
  ISOの国名コード　※大文字
- release_date.gte
  - 条件
  公開日（下限）
  - 値
  yyyy-MM--dd
- release_date.lte
  - 条件
  公開日（上限）
  - 値
  yyyy-MM-dd
- release_date.gte
  - 条件
  公開日（下限）
  - 値
  数値（整数4ケタ）
- sort_by
  - 条件
  ソート
  - 値
  [リファレンスのsort_byを参照](https://developer.themoviedb.org/reference/discover-movie)
  ※regionと組み合わせることが可能
- vote_average.gte
  - 条件
  平均投票スコア（下限）
  ※TMDBでのユーザースコア
  - 値
  浮動小数
- vote_average.lte
  - 条件
  平均投票スコア（上限）
  - 値
  浮動小数
  ※TMDBでのユーザースコア
- vote_count.gte
  - 条件
  ユーザースコアの投票数（下限）
  - 値
  浮動小数
- vote_count.lte
  - 条件
  ユーザースコアの投票数（上限）
  - 値
  浮動小数
- watch_region
  - 条件
  視聴可能地域
  ※with_watch_providers、with_watch_monetization_typesと組み合わせて使用可能
  - 値
  ISOの国名コード
Parameter 0 of constructor in xxxs required a bean of type 'java.lang.String' that could not be found. on Spring Properties Bean / Kotlin data class.

```
implementation(kotlin("reflect"))
```

これがはいってないと

```
Parameter 0 of constructor in xxxs required a bean of type 'java.lang.String' that could not be found.
```

こうなる。

---

下書きから拾ってきたけどこれ何のエラーだろう笑、まぁいいや。
bashの終了ステータスの範囲は0~255で、範囲外の整数がexitに渡された場合、終了ステータスは256の剰余になる

# 問題の概要

だれがいつ作ったのか、よくわからないC言語のソースコードが発端。

```main.c
int main(int argc, char *argv[]) {
  // ----------------------------
  // よくわからないとても長い処理
  //-----------------------------
}
```

このプログラムの設計書を見ると、以下のように記載されているわけです。

- 正常終了の場合 … 終了ステータス0
- 異常終了の場合 … 終了ステータス999

これを試験するため、C言語を気合でコンパイル。異常終了となるようなインプットを与えて実行したところ、終了ステータスが255となり、設計書とは異なる挙動となりました。

```
$ gcc main.c
$ ./a.out WRONG_INPUT
$ echo $?
231
```

# 原因と対策

ソースコードを読み解いたところ、main関数の終了ステータスが999となっていました。

```main.c
int main(int argc, char *argv[]) {
  // ----------------------------
  // よくわからないとても長い処理
  //-----------------------------
  int status;
  // ----------------------------
  // よくわからないとても長い処理
  //-----------------------------
  status = 999;
  // ----------------------------
  // よくわからないとても長い処理
  //-----------------------------
  return status;
}
```

bashの終了ステータスの範囲は0から255の間で、範囲外の整数がexitに渡された場合、終了ステータスは256の剰余となります (`status & 0xFF`)

C言語のバージョン・環境にもよりますが、main関数の戻り値はそのまま終了ステータスとなります。今回の場合、main関数の戻り値が999で、0~256の範囲外ですから、`999%256=231`が戻り値となっています。

# 環境情報

```
$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
coc-tailwindcss3がtailwindcssv4に対応して最高すぎる

愛用している[coc-tailwindcss3](https://github.com/yaegassy/coc-tailwindcss3)プラグインが、Tailwind CSS v4に対応しました！

## tailwindcss v4の主な変更点

まずtailwindcss v4の変更点ですが、設定方法など大きな変更がありました。[公式アップグレードガイド](https://tailwindcss.com/docs/upgrade-guide)によると、主な変更点として下記があります：

- デフォルトで`tailwind.config.js`ファイルが不要になった
- 設定ファイルがJavaScriptからCSSへと移行
- `@tailwind`ディレクティブから通常の`@import`文への変更
- モダンブラウザの機能に依存する新しい実装

## coc-tailwindcss3の対応内容

GitHubをみると、[@yaegassy](https://github.com/yaegassy) さんのcoc-tailwindcss3では以下の修正が行われました：

- `package.json`の`activationEvents`を変更：
   ```diff
   -    "workspaceContains:**/?(tailwind|tailwind.config|tailwind.*.config|tailwind.config.*).?(js|cjs|ts|mjs)"
   +    "*"
   ```

以前はtailwind設定ファイルが存在する場合のみプラグインが有効化されていましたが、v4での仕様変更に対応するため、常に有効化されるようになりました。

## 使い方

coc-tailwindcss3のインストールは以下のコマンドで行えます：

```vim
:CocInstall @yaegassy/coc-tailwindcss3
```

![Screenshot 2025-04-09 at 9.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/03ff46f5-aaf2-4ac6-9dbc-674743947680.png)

:::note info
クラス名に対応するCSSを表示してくれるのが最高すぎます！
:::

詳細については、[GitHubリポジトリ](https://github.com/yaegassy/coc-tailwindcss3)を参照してください。

## おわりに

tailwindcssで開発していると「クラス名が合っているか」「どのような挙動をするかCSSで知りたい」ということに悩まされがちですが、coc-tailwindcss3を使うことでtailwindcssの開発体験は大きく改善します。**Vim + tailwindcss を使っている方には激おすすめのプラグインです！**

---

参考リンク:
- [coc-tailwindcss3 GitHub](https://github.com/yaegassy/coc-tailwindcss3) - メインリポジトリ
- [Tailwind CSS v4公式アップグレードガイド](https://tailwindcss.com/docs/upgrade-guide) - 公式の移行ガイド
- [Tailwind CSS v4.0](https://tailwindcss.com/blog/tailwindcss-v4) - v4の公式発表記事
- [@tailwindcss/language-server](https://www.npmjs.com/package/@tailwindcss/language-server) - 言語サーバーパッケージ
【統計検定3級】一覧

# Part1
- [質的変数と量的変数](https://qiita.com/osshy/items/fc26bee19d05bb7dcc5a)
- [質的変数の要約]()
- [グラフの種類](https://qiita.com/osshy/items/bd301dd32d964a6c4f52)
【統計検定3級】質的変数と量的変数

# 質的変数と量的変数

## summary
データの種類の分類方法

```mermaid
graph TD;
    データの種類-->質的変数;
    データの種類-->量的変数;
    質的変数-->名義尺度;
    質的変数-->順序尺度;
    量的変数-->分類A;
    分類A-->間隔尺度;
    分類A-->比例尺度;
    量的変数-->分類B;
    分類B-->離散変数;
    分類B-->連続変数;
```

## 質的変数
質的変数はカテゴライズ（分類）である。
カテゴリ間に順序が存在する場合としない場合がある。

入力インターフェースがラジオボタン、チェックボックスなどの選択式になる。

### 名義尺度
順序が存在しないものを名義尺度と呼ぶ。
大小、高低、良し悪し、などが判断できないもの。
> 例：性別、出身地など。

### 順序尺度
順序が存在するものを順序尺度と呼ぶ。
大小、高低、良し悪し、などが判断可能なもの。
> 例：通知表の5段階評価、病状の進行度合い

## 量的変数
数値で表現される変数。
間隔尺度と比例尺度に分かれる。

入力インターフェースがスライダーや数値の直接入力になる。

### 間隔尺度
数値の間隔に意味があり、比例に意味はないもの。
> 例：西暦、摂氏温度

### 比例尺度
0に絶対的な意味（0はそれが存在しないということを示す）のあるもの。
> 例：身長、距離

※量的変数にはもう1通りの分類もある

### 離散変数
一定間隔の整数値（離散値）を取る変数。
> 例：世帯人数、居室の数、１週間に運動を行った日数

### 連続変数
連続した実数値を取る変数。
> 例：時間、身長・体重、距離

100点満点の試験の点数は厳密的には0点から100点までの離散変数であるが、変数の取りうる値が多いため連続変数として扱うことが多い。
どの程度値が多いと連続変数として扱うかは解析の目的等によって決められる。
【📝メモ】解析目的等とはどう考えるのか不明瞭
windows11で、sketchup6 その63

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
rendering_optionsを調査してみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9ad7895b-494b-42ec-8ce0-c29dce9a10e0.png)



# サンプルコード

```

def testinfo1
	model = Sketchup.active_model
	renderop = model.rendering_options
	ie = UI::WebDialog.new("WEBDialog", true, "WEBDialog", 600, 480, 150, 150, true)
	html = "<html><head><meta http-equiv='content-type' content='text/html; charset=Shift_JIS' /></head><body><h2>rendering_options</h2><textarea cols=75 rows=38>"
	renderop.each { |key, value|
		html += "\n " + key + ": " + value.to_s 
	}
	html += "</textarea></body></html>"
	ie.set_html html
	ie.show
end


```

以上。
PHP/Laravelでよく出てくる「オーバーライド」とは？protectedメソッドの意味も含めて解説

# はじめに

Laravelのクラスやフレームワーク内部のコードを見ていると、こんなメソッドを見かけることがあります。

```php
protected function formatDate($time)
{
    return Carbon::parse($time)->format('Y年n月j日 H時i分');
}
```
このようなメソッドに対して「オーバーライドする」といった表現をよく使いますが、そもそも**オーバーライド」とは何か？**
本記事では、PHPのオブジェクト指向におけるオーバーライドの概念と、protected の意味について整理します。

# ①オーバーライド（override）とは？
**親クラスで定義されたメソッドを、子クラスで再定義（上書き）すること。**
```php
class BaseClass {
    protected function formatDate($time) {
        return $time;
    }
}

class ChildClass extends BaseClass {
    protected function formatDate($time) {
        return Carbon::parse($time)->format('Y年n月j日 H時i分');
    }
}
```
このように、**同じ名前・同じ引数のメソッドを子クラスで再定義することを「オーバーライド」と呼びます。**

## なぜオーバーライドするのか？
- **処理の一部だけを自分用にカスタマイズしたい**
- **Laravelのようなフレームワークで、既存の挙動を少しだけ変更したい**
- **再利用性と柔軟性を両立したい**

# ②protected の意味
protectedは、PHPのアクセス修飾子の一つです。

![IMG_7770.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/d47e96ea-31ec-4400-b254-3b4b400d2899.jpeg)

したがって、protected function formatDate() は、**外部からは呼び出せないけれど、継承先では自由に上書き（オーバーライド）できる**メソッド、ということになります。

# ③Carbonを使ったカスタム日付フォーマットの実装例
```php
use Carbon\Carbon;

class BaseClass {
    protected function formatDate($time) {
        return $time;
    }
}

class MyClass extends BaseClass {
    protected function formatDate($time) {
        return Carbon::parse($time)->format('Y年n月j日 H時i分');
    }

    public function showDate($rawDate) {
        return $this->formatDate($rawDate);
    }
}

$instance = new MyClass();
echo $instance->showDate('2025-04-09 13:45:00');
// => 2025年4月9日 13時45分
```

# ④オーバーライドのポイントまとめ
![IMG_7771.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/c23670f6-150f-41a6-90df-154fd97ad2c8.jpeg)

# ⑤オーバーライドのポイントまとめ
![IMG_7772.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/3286e2a0-2351-4462-8dd4-70f8fce7effe.jpeg)

# ⑥おまけ：Laravelでのオーバーライドの実例

たとえば、FormRequest クラスで failedValidation() メソッドをオーバーライドして、バリデーションエラー時のレスポンスをカスタマイズすることができます。
```php
protected function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json([
        'errors' => $validator->errors()
    ], 422));
}
```

# ⑦まとめ
- protected function formatDate() のようなメソッドは、**クラス内部** **or 継承先で使うための上書き可能な処理**として定義されています。
- オーバーライドは、フレームワークの挙動を一部変更したいときに非常に便利。
- Laravelの深い理解にもつながるので、ぜひ使いながら慣れていきましょう！
windows11で、sketchup6 その62

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
shadow_infoを調査してみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a5e4d3ca-1c32-4859-8e4d-b38e6d5c89d3.png)

# サンプルコード

```
def testinfo0
	model = Sketchup.active_model
	shadowinfo = model.shadow_info
	ie = UI::WebDialog.new("WEBDialog", true, "WEBDialog", 600, 480, 150, 150, true)
	html = "<html><head><meta http-equiv='content-type' content='text/html; charset=Shift_JIS' /></head><body><h2>shadow_info</h2><textarea cols=75 rows=25>"
	shadowinfo.each { |key, value|
		html += "\n " + key + " : " + value.to_s 
	}
	html += "</textarea></body></html>"
	ie.set_html html
	ie.show
end

```

以上。
ワイ「AIちゃん！ワイのタスク全部やっといて！」#MCP

# ある日の我が家
![娘「パパ、あのさ ChatGPTって とっても賢いじゃん？」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/f1f0c932-2e72-432f-a283-d52875ed8196.png)

ワイ「ああ、せやな」
ワイ「ChatGPT君は、なんでも答えてくれるもんな」

娘「でもさ、質問に答えるだけじゃなくて」
娘「プレゼン資料を作ってくれたりはしないの？」
娘「資料のファイル丸ごと作ってくれたら超便利なのに」

ワイ「おお、ええ発想やな」
ワイ「実はな、もうできる時代になってきてるみたいやで！」

娘「え、そうなの？」

ワイ「ああ」
ワイ「最近**MCP**っていうプロトコルがIT界隈で話題沸騰中でな？」
ワイ「ChatGPTのデスクトップアプリも、その**MCP**への対応を進めてるらしいんや」[^1]

娘「へぇ〜」
娘「その**MCP**とやらにChatGPTが対応すると、何が嬉しいの？」

ワイ「例えばな？」

- PowerPointを操作できるMCPサーバ
- Google Driveを操作できるMCPサーバ

ワイ「↑こういったものを使って─」

> ワイ「ヘイ、ChatGPT！」
> ワイ「必要な資料を読んで、プレゼン資料のスライドを作って！」
> ワイ「それをGoogle Driveに保存しておいて！」

ワイ「─なんてことができるみたいやで！」

娘「え、ChatGPTがPowerPointやGoogle Driveを使ってくれるの？」
娘「やってみたい！どうやるの？」

ワイ「いや、現時点ではChatGPTアプリは未対応やけど」[^3]
ワイ「たぶん、今後のアップデートで─」

> MCPサーバを使用して外部サービスと接続する

ワイ「↑こんな設定項目がChatGPTアプリに増えるんやろな」
ワイ「そこに、MCPサーバのURLなんかを設定する形になると思うで」
ワイ「もしくは、自分のPC内で起動したMCPサーバを使う感じやな」

娘「へぇ〜！」
娘「早く使ってみたいな！」

ワイ「せやな〜」
ワイ「でも、アクセストークンを預けることになるやろうから」
ワイ「怪しげなソフトだったり、サードパーティ製のMCPサーバとかを使うのは」
ワイ「セキュリティ的な懸念もあるけどな」

娘「そっか、確かに」
娘「下手したら、乗っ取られ放題だもんね...」

ワイ「せや」
ワイ「全権限を持ったアクセストークンを使わないで」
ワイ「読み取り専用のアクセストークンを使うとか」
ワイ「そういうことも考えんとな」

# MCPって何？

娘「ところでパパ、その**MCP**って何？」

ワイ「MCPってのはな」
ワイ「AI君が、言葉で答えてくれるだけじゃなくて」
ワイ「Google Driveを操作したり、GitHubを操作したり」
ワイ「そんな風に、AI君が外界に効率的にアクセスできるようになるための仕組みやで」
ワイ「そのためのプロトコル、つまり約束事・規格やな」

娘「へ〜、じゃあ、その規格に沿って作られたものたちは、互換性があるってことだね！」

ワイ「せや！」
ワイ「標準的な規格ができて、開発する側もやりやすくなったことやし」
ワイ「今後は各種サービスがMCPサーバを提供してくれたり」
ワイ「サードパーティ製のMCPサーバもどんどん増えたりして」
ワイ「それをAI経由で使う時代になりそうやな！」
ワイ「ってかもう、なり始めてるな！」

娘「すご〜い！」
娘「じゃあ、今後もしアレクサがMCPに対応したら─」

> ワイ「アレクサ！ワイのタスク全部やっといて！」

娘「─なんてお願いすれば」
娘「アレクサが、AI経由でいろんなサービスを駆使して仕事してくれたり」
娘「そんな時代が、もう目の前に迫ってるね！」

ワイ「ほんまやな〜」

娘「そうなったらもう、会社がパパを雇う意味ないね！」

ワイ「せや！」

# でも、今までだって可能だったのでは？

娘「でもさ、パパ」
娘「MCPなんてなくてもさ」
娘「AIが、HTTPリクエストとブラウザ操作だけできればいいんじゃないの？」
娘「それだけできれば、APIも叩けるし、Webページも見るんだから」
娘「ほとんどのことはAIができちゃうよね？」
娘「なんでわざわざMCPサーバなんてものが必要なの？」

ワイ「おお、ええ質問やな」
ワイ「確かに、できるっちゃできるんやけど」
ワイ「それってメッチャ非効率なんや」
ワイ「たとえばブラウザ操作やと」
ワイ「AI君がWebページの中を探し回って、目的の機能がどこにあるかを見つけなあかん」
ワイ「そうすると、AI君の頭がいっぱいになってしまって」
ワイ「少し前のことを忘れてもうたりするんや」[^2]

娘「へぇ〜」
娘「AIも、非効率なことをさせると上手く結果を出せないんだね」

ワイ「せや」
ワイ「APIとの通信も同じでな」
ワイ「AIがドキュメント読み込んでHTTP通信するより」
ワイ「MCPのほうが、**AIにとってのユーザー体験**が良いらしいで」

> AIくん「なぁ、MCPサーバはん！」
> AIくん「アンタ、どんなことができるの？」
> 
> MCPサーバ「ワイのできることリストはこれやで！」
> MCPサーバ「この機能は、こんな風に使ってくれや！」

ワイ「↑こんな風に、AIに優しい仕組みやねん」
ワイ「せやから、わざわざREST APIをラップしただけのMCPサーバも多いねん」

娘「へぇ〜」

ワイ「MCPは、AIが使うことを前提に設計されてるから」
ワイ「AIにとって『何ができるか』『どう使うべきか』が分かりやすい設計になってるんやって」

娘「なるほど〜」
娘「AIさんから見た使いやすさ、を意識する時代なんだね」
娘「つまり、MCPサーバは『AIが使いやすい専用リモコン』って感じ？」

ワイ「ええこと言うやん、その通りや」
ワイ「Webサイトなんかは基本的に人間向けに作られてるけど」
ワイ「MCPは**AI向け**に作られてるからな！」

娘「AIが本気で仕事するには」
娘「人間向けじゃなくて、AI向けの道具が必要なんだね！」

ワイ「そういうことや！」

# まとめ

- **MCP**（Model Context Protocol）
    - AIが外部サービスに効率よくアクセスするための方式
- AIは、MCPサーバを介し、統一された方法で外部リソースに接続できる
- 従来のHTTPリクエストやブラウザ操作よりも、AIにとって分かりやすく扱いやすい設計
- 既にいくつものソフトウェアにMCP連携機能が搭載されている
    - Cursorエディタなど
- MCP経由で利用できるサービスも増えている（サードパーティ経由も含む）
    - MCPサーバを自分で起動して使うものが多い
    - エンドポイントのURLが公開されているサービスはまだ少ない
- 今後は更に沢山のサービスやツールがMCP対応し、AIによる自動化の幅が広がると期待されている


[^1]:[OpenAI DevelopersのX投稿](https://x.com/OpenAIDevs/status/1904957755829481737)
[^2]:トークン数の上限に達してしまうという意味です
[^3]:OpenAI Agents SDKではすでに利用可能です
pyotp を使ったワンタイムパスワードの実装

pythonのライブラリである pyotp を使うと簡単にワンタイムパスワードが実装できます。

1. まずは環境を構築します
    ```
    $ apt-get update
    $ apt-get install -y curl wget vim
    $ python3 python3.12-venv
    $ python3 -m venv /work/python
    $ /work/python/bin/pip install flask
    $ /work/python/bin/pip  install pyotp 
    $ /work/python/bin/pip  install qrcode
    $ /work/python/bin/pip install pillow
    $ /work/python/bin/pip install BytesIO
    ```

1. アプリを作成します。本来はキー情報はDBに格納が必要ですが、今回はJSONファイルに書き出しています。
    ```
    from flask import Flask, render_template, request
    import pyotp
    import qrcode
    import os
    import json
    import base64
    from io import BytesIO

    app = Flask(__name__)

    # 初期画面
    @app.route('/index')
    def index():
        return render_template('index.html')

    # 登録画面
    @app.route('/regist', methods=['POST'])
    def regist():
        userid = request.form['userid']
        key = pyotp.random_base32()    

        with open('/work/data/test.json') as f:
            d = json.load(f)

            d[userid] = key
            data_str = json.dumps(d)
        with open('/work/data/test.json', mode='w') as f:
            f.write(data_str)

        totp = pyotp.TOTP(key)
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=5,
            border=2,
        )
        qr.add_data(totp.provisioning_uri(name=userid, issuer_name="KstoneriverSampleApp"))
        qr.make(fit=True)
        img = qr.make_image(fill_color="black", back_color="white")
        buffered = BytesIO()
        img.save(buffered, format="JPEG")
        img_str = base64.b64encode(buffered.getvalue()).decode("ascii")
        return render_template('regist.html', img=img_str, userid=userid)

    # 登録結果
    @app.route('/validate', methods=['POST'])
    def validate():
        userid = request.form['userid']
        otp = request.form['otp']

        with open('/work/data/test.json') as f:
            d = json.load(f)
            key = d[userid]

        totp = pyotp.TOTP(key)
        result = totp.verify(otp)
        if result:
            ret_str = "Success!!"
        else:
            ret_str = "Failed..."

        return render_template('result.html', ret = ret_str)

    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=5000, debug=True)

    ```

1. 実行します
    ```
    /work/python/bin/python app.py
    ```
    - ユーザIDの登録画面が表示されます
    ![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752007/58ad6bd1-ac40-4d17-acfd-259f0bc0af19.png)
    - ユーザIDを入力して送信ボタンをクリック
    ![index_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752007/3f785a16-74c1-4cb1-98e5-237e7cb32dc1.png)
    - QRコードが表示されます。
    ![regist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752007/6f3ddd8c-79ed-4285-980f-e52a7fa833d5.png)
    - QRコードをGoogle Authenticatorなどで読み取り登録し、6桁の数字を入力します。
    ![regist_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752007/0084e7c5-d6a1-4fc5-9930-637442fd4956.png)
    - 送信ボタンをクリックして、「Success!」と表示されれば成功
    -
C_TS422_2023 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（2/100）

【2日目】
トピック 1：SAPS/4HANAサプライチェーン計画の概要（2/6）

≪問題2≫
需要計画サイクルの予測に含まれているものはどれですか。
（3つ選んでください）
▢マーケット情報
▢過去の見積数量
▢過去の生産計画数量
▢過去の受注数量
▢1回限りのイベント

≪解答≫
■マーケット情報
▢過去の見積数量
▢過去の生産計画数量
■過去の受注数量
■1回限りのイベント

≪解説≫
需要計画サイクルの予測には、市場の動向や顧客の注文履歴、特定の一度きりのイベントなど、さまざまなデータが含まれます。これにより、より正確で柔軟な需要予測を行うことが可能になります。
【Python】AWS S3へのアップロード/ダウンロード

## アップロード
```
import boto3

access_key = XXXX
secret_key = XXXX
bucket_name = XXXX

s3 = boto3.client('s3', aws_access_key_id=dl_access_key, aws_secret_access_key=dl_secret_key)

with io.open(local_file_path, 'rb') as f:
    try:
        s3.upload_fileobj(f, bucket_name, s3_file_path)
    except Exception as e:
        raise e
```


## ダウンロード
```
import boto3

dl_access_key = XXXX
dl_secret_key = XXXX
bucket_name = XXXX

s3 = boto3.client('s3', aws_access_key_id=dl_access_key, aws_secret_access_key=dl_secret_key)

return s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': bucket_name, 'Key': s3_file_path}
)
```
個人的備忘録：Fargate × awsvpc モードとは？ネットワーク設計のポイントを整理してみた

## はじめに

AWS Fargate は、インフラ管理不要でコンテナを実行できるサーバーレスなコンテナ実行環境です。

:::note alert
**Fargate を活用する際、タスクのネットワーク構成を理解することは、セキュリティや可観測性の観点で重要です。**
:::

本記事では、Fargate 起動タイプの Amazon ECS タスクにおけるネットワークの仕組みを簡潔に紹介します。

## Fargate 起動タイプの Amazon ECS タスクにおけるネットワークオプション

### ENI（Elastic Network Interface）の割り当て
Fargate の ECS タスクには、プライマリプライベート IP を備えた ENI が自動で割り当てられます。

- **パブリックサブネット**: ENI にパブリック IP 割り当て可
- **IPv6 対応サブネット**: IPv6 アドレス割り当て可
- **1 タスクに 1 ENI**: 単一の ENI を持つ

### コンテナ間通信
同一タスク内のコンテナ間では `localhost` を用いて通信が可能です。

### インターネット接続
- **パブリックサブネット**: パブリック IP を通じて直接接続
- **プライベートサブネット**: NAT ゲートウェイ経由
- **ECR 利用時**: PrivateLink によるプライベート通信が可能

### VPC フローログ
ENI 単位での通信を監視可能。トラフィックの可視化に活用できます。

### AWS PrivateLink
Amazon ECS API への通信をインターネットに依存せず、Amazon ネットワーク内で完結できます。

### ENI 管理と IAM
ENI の作成は AWS が自動管理。対応する IAM ポリシー設定も必要です。

#### プラットフォームバージョン別挙動
| アクション | v1.3.0 以下 | v1.4.0 | Windows v1.0.0 | IAM 権限 |
|------------|-------------|--------|----------------|-----------|
| ECR 認証 | Fargate ENI | タスク ENI | タスク ENI | 実行ロール |
| イメージプル | タスク ENI | タスク ENI | タスク ENI | 実行ロール |
| ログ送信 | タスク ENI | タスク ENI | タスク ENI | 実行ロール |
| FireLens | タスク ENI | タスク ENI | タスク ENI | タスク IAM |
| Secrets 取得 | Fargate ENI | タスク ENI | タスク ENI | 実行ロール |
| EFS | - | タスク ENI | タスク ENI | タスク IAM |
| アプリ通信 | タスク ENI | タスク ENI | タスク ENI | タスク IAM |

---

### ネットワークモード
- **パラメータ**: `networkMode`
- **型**: 文字列
- **必須**: はい

:::note warn
**Fargate タスクは `awsvpc` モードが必須です。**
:::

このモードでは以下の特徴があります：

- ENI を通じて EC2 と同様のネットワーク機能が利用可能
- ポートは ENI に直接マッピング（動的ホストポートマッピング不可）
- `NetworkConfiguration` の指定が必要

`none` モードの場合、外部通信不可・ポートマッピング不可となります。

---

## まとめ

Fargate タスクでは、ネットワークモードに `awsvpc` を使用し、ENI による分離・可視化が基本設計です。

:::note info
***パブリック IP、NAT、PrivateLink などのネットワーク構成に応じて設計を最適化することが重要です。***
:::

***タスク単位のセキュリティ制御や監査が可能になるため、要件に応じたネットワーク設計の参考になれば幸いです！***

## 参考文献

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-networking.html

https://zenn.dev/fdnsy/articles/43b7f4d745ed1f
【Azure】Entra ID カスタムドメイン追加時のお作法

みなさん、こんにちは！
EntraIDでのカスタムドメイン追加に関する掟やお作法を記載します。
まず、Entra IDにreqtc.comというドメインを追加したいと考えているとします。

## 例1
1. sample01@onmicrosoft.com
2. sample01@reqtc.com

ドメインを追加すると上記のようになります。 更に追加でサブドメインを追加していきます。

## 例2
1. sample01@onmicrosoft.com
2. sample01@reqtc.com
3. sample01@pre.reqtc.com

はい、追加できました。
ここでEntraID上でカスタムドメインを追加した際の掟として覚えていただきたいのは、最初に登録した親ドメインに対する子ドメインは親ドメインの認証方式を受け継ぎます。
例えば、@reqtc.comで外部IdPへのフェデレーションを構成していたとします。
そうすると、@pre.reqtc.comのサブドメインで構成したIDでログインした場合にも、外部IdPへフェデレーションされます。

ただし追加した子ドメインが親ドメインの認証方式を受け継いでしまう事を避ける場合には、先に@pre.reqtc.comをサブドメインとして追加する必要があります。
順番的には下記です。

## 例3
1. sample01@onmicrosoft.com
2. sample01@pre.reqtc.com
3. sample01@reqtc.com

このように登録の順番を変更すると、@reqtc.comの認証方式は引き継がれずに、@pre.reqtc.comで独自の認証方式を構成する事が可能になります。
どんな時に使うんだと思われるかもしれませんが、認証の構成は様々存在しておりますので、環境によっては@reqtc.comは特定のIdPを経由する事を必須としている構成である場合など、別途環境を用意する際の弊害になる場合がありますので、EntraIDでのドメインの考え方を覚えておくと便利です。

文字ばかりだとわかりづらいので、通常のDNSの考え方と混合すると理解が難しくなるので図を添付します。
ご参考ください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/f9ad88a6-8dd2-44f0-bdc3-65a4dce65df0.png)
windows11で、sketchup6 その61

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
Geom::Transformationを調査してみた。

# Geom::Transformation

16個のフロートのアレイらしい。クォータニオンか？

## Geom::Transformation.translation [5, 5, 5]

    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    5.0, 5.0, 5.0, 1.0
	
## Geom::Transformation.rotation copy_group.bounds.center, X_AXIS, 90.degrees
	1.0, 0.0, 0.0, 0.0,
    0.0, -3.82858892158944e-016, 1.0, 0.0,
    0.0, -1.0 -3.82858892158944e-016 0.0,
    0.0, 17, -17.0, 1.0

## Geom::Transformation.axes ORIGIN, X_AXIS, Y_AXIS, Z_AXIS
	1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0

## Geom::Transformation.scaling 2
	1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.5

以上。
個人的備忘録：EC2ベースのECSにおけるネットワーク構成の選び方を整理してみた

## はじめに

Amazon ECS（Elastic Container Service）は、コンテナ化されたアプリケーションのデプロイと管理を簡素化するサービスです。

:::note info
**特に、Amazon EC2 上で動作する ECS タスクでは、タスクごとに異なるネットワークモードを選択できるため、アーキテクチャ設計において重要な要素となります。**
:::

本記事では、ECS タスクにおけるネットワークモードの違いと、それぞれの特徴について解説します。

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

過去のハッカソンにおいて ECS を利用した際、タスク間通信や外部アクセスの要件に応じてネットワークモードを選定する必要がありました。

:::note warn
***しかし、ネットワークモードごとの仕様や制約についての情報が散在しており、明確な判断が難しいと感じました。***
:::

そこで、自身の整理も兼ねて各ネットワークモードの違いを分かりやすくまとめようと思ったのがきっかけです。

## ECSにおけるネットワークモードの概要

Amazon EC2 インスタンスでホストされる Amazon ECS タスクのネットワーク動作は、タスク定義におけるネットワークモードの設定に依存します。Amazon ECS では、特別な理由がない限り、`awsvpc` ネットワークモードの使用が推奨されています。

以下は、Amazon ECS で利用可能なネットワークモードとその特徴をまとめたものです。

**参考文献**

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-networking.html

https://zenn.dev/fdnsy/articles/43b7f4d745ed1f

### 1. awsvpc（推奨）
- **Linux コンテナ対応**: はい
- **Windows コンテナ対応**: はい
- **特徴**: 
  - タスクごとに独自の Elastic Network Interface (ENI) とプライベート IPv4 アドレスが割り当てられます。
  - EC2 インスタンスと同じレベルのネットワーク構成が可能になります。
  - セキュリティグループ単位で細かなアクセス制御が可能です。

### 2. bridge
- **Linux コンテナ対応**: はい
- **Windows コンテナ対応**: いいえ
- **特徴**:
  - タスクは、EC2 インスタンス内の Docker の組み込み仮想ネットワーク上で実行されます。
  - `bridge` ドライバを使用。
  - Linux の ECS タスクにおいて、ネットワークモードが未指定の場合のデフォルト。

### 3. host
- **Linux コンテナ対応**: はい
- **Windows コンテナ対応**: いいえ
- **特徴**:
  - Docker の仮想ネットワークをバイパスし、EC2 インスタンスの ENI を直接使用。
  - ダイナミックポートマッピングは使用不可。
  - `hostPort` を明示的に指定する必要があり、複数のタスクが同じポートを共有できないため、同一タスク定義を複数インスタンス上で同時に実行することが困難。

### 4. none
- **Linux コンテナ対応**: はい
- **Windows コンテナ対応**: いいえ
- **特徴**:
  - 外部ネットワーク接続なし。
  - セキュリティの観点から、完全に分離された環境を構築したい場合に利用されます。

### 5. default（Windows のみ）
- **Linux コンテナ対応**: いいえ
- **Windows コンテナ対応**: はい
- **特徴**:
  - Windows 上での Docker 組み込み仮想ネットワーク（`nat` ドライバ）を使用。
  - Windows タスクでネットワークモード未指定時のデフォルト設定。

---

## まとめ

ECS におけるネットワークモードの選択は、アプリケーションの通信要件やセキュリティ、可観測性の設計に直結します。

:::note warn
**特に `awsvpc` モードは、ENI をタスク単位で割り当てることで、セキュリティグループの活用やネットワーク構成の柔軟性が高まるため、デフォルトでの選択肢として非常に優れています。**
:::

一方で、パフォーマンスやポート制約、接続要件に応じて他のモードが有効な場合もあるため、プロジェクトごとに要件を明確化し、最適なネットワークモードを選ぶことが重要です！
AuroraMySQLでPerformance Insightsを自動管理したい

## はじめに
- Performance Insightsで以下のエラーが発生したので、自動管理する必要がありました。

> Performance Insights is unable to collect SQL Digest statistics on new queries because the table events_statements_summary_by_digest is full. 
Please truncate events_statements_summary_by_digest table to clear the issue. Check the User Guide for more details.

## AWS公式ドキュメント
- AWS公式ドキュメントをみると、対応策が書いてあります。

https://docs.aws.amazon.com/ja_jp/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights.UsingDashboard.AnalyzeDBLoad.AdditionalMetrics.MySQL.html

> 自動管理の場合、performance_schema パラメータを 0 に設定する必要があります。

けど、この`パラメータを 0`っていうのが曲者です。

## ダメな設定
```terraform
resource "aws_db_parameter_group" "default" {
  name   = "sample"
  family = "mysql8"

  parameter {
    name  = "performance_schema"
    value = "0" # 明示的に0にしてしまっている。
  }
}
```

## 正しい設定
```terraform
resource "aws_db_parameter_group" "default" {
  name   = "sample"
  family = "mysql8"

  # performance_schemaの設定をしないっていうのが正解です。要はデフォルト値にしろってことです。
}
```

## 確認
- AWS CLIで確認して、`Source: system`になっていることを確認できました。
```
$aws rds describe-db-parameters \
  --profile xorder_stg \
  --db-parameter-group-name xorder-aurora-mysql8 \
  --query "Parameters[?ParameterName=='performance_schema']"

[
    {
        "ParameterName": "performance_schema",
        "ParameterValue": "0",
        "Description": "Enables or disables the Performance Schema",
        "Source": "system",
        "ApplyType": "static",
        "DataType": "boolean",
        "AllowedValues": "0,1",
        "IsModifiable": true,
        "ApplyMethod": "pending-reboot"
    }
]
```
windows11で、sketchup6 その60

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
rubyスクリプトでセレクトしたグループを大きくせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2a9a999c-4992-4cfe-9dec-4a5d013a7257.png)

# サンプルコード

```
def movec
	ss = Sketchup.active_model.selection
	sents = []
	ss.each { |e|
		sents.push(e)
	}
	copy_group = Sketchup.active_model.active_entities.add_group(sents)
	trans = Geom::Transformation.scaling 2
	copy_group.transform! trans
end
```

以上。
windows11で、sketchup6 その59

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
rubyスクリプトでセレクトしたグループを回転せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d0fa3357-a698-4d30-a989-31a426df8ac5.png)

# サンプルコード

```
def moveb
	ss = Sketchup.active_model.selection
	sents = []
	ss.each { |e|
		sents.push(e)
	}
	copy_group = Sketchup.active_model.active_entities.add_group(sents)
	trans = Geom::Transformation.rotation copy_group.bounds.center, X_AXIS, 90.degrees
	copy_group.transform! trans
end
```

以上。