OmniAICreator/Qiita-1.07M huggingface dataset:
個人的備忘録：ECS タスク定義を JSON と Terraform で書き比べた自分用メモ

## はじめに

ECS（Elastic Container Service）でアプリケーションをデプロイする際には、タスク定義（Task Definition）を作成する必要があります。

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

今回は、FastAPI アプリケーションを Fargate 上で動かすためのタスク定義を JSON 形式と Terraform 形式の2種類で整理しました。

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

受講しているITスクールのハッカソンの開発の一環でECSとFargateを利用したアプリケーションのデプロイを行っており、作業中に得た知識を忘れないように備忘録としてまとめました。

## 内容（あくまでサンプル）

### ✅ JSON形式（CLI / API用）

AWS CLIやAPI経由で登録する際に使用できるJSON形式のタスク定義です。

```json
{
  "family": "fastapi-task",
  "taskRoleArn": "arn:aws:iam::xxx:role/ecsTaskRole",
  "executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [
    {
      "name": "fastapi",
      "image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/hackathon:latest",
      "essential": true,
      "cpu": 0,
      "portMappings": [
        {
          "containerPort": 8000,
          "hostPort": 8000,
          "protocol": "tcp"
        }
      ],
      "environment": [],
      "mountPoints": [],
      "volumesFrom": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/aws/ecs/reverse-proxy-cluster",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "systemControls": []
    }
  ],
  "volumes": [],
  "placementConstraints": [],
  "tags": []
}
```

### ✅ Terraform形式

Terraformを使ってIaC（Infrastructure as Code）で管理するためのタスク定義リソースです。

```hcl
resource "aws_ecs_task_definition" "fastapi" {
  family                   = "fastapi-task"
  task_role_arn            = "arn:aws:iam::xxx:role/ecsTaskRole"
  execution_role_arn       = "arn:aws:iam::xxx:role/ecsTaskExecutionRole"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "256"
  memory                   = "512"

  container_definitions = jsonencode([
    {
      name      = "fastapi"
      image     = "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/hackathon:latest"
      cpu       = 0
      essential = true
      portMappings = [
        {
          containerPort = 8000
          hostPort      = 8000
          protocol      = "tcp"
        }
      ]
      environment       = []
      mountPoints       = []
      volumesFrom       = []
      systemControls    = []
      logConfiguration = {
        logDriver = "awslogs"
        options = {
          awslogs-group         = "/aws/ecs/reverse-proxy-cluster"
          awslogs-region        = "ap-northeast-1"
          awslogs-stream-prefix = "ecs"
        }
      }
    }
  ])

  tags = {}
}
```

## まとめ

FastAPIをFargateで動かすにあたって必要なタスク定義のフォーマットを、CLI用とTerraform用の2パターンで整理しました。

:::note warn
***インフラの自動化や再利用性を高めるために、Terraform形式での管理がおすすめです。***
:::

今後も似た構成を使う際に素早く再利用できるよう、今回の定義をベースにしていきます...！
Difyのナレッジを利用したチャットボット

# Difyのチャットフローで、ナレッジを指定して、チャットボットアプリを作成する手順を示します。

# 前提条件
Difyの設定は済んでいる状態で話を進める

# 目次
- 概要
- ノードの説明
  - 開始
  - 知識検索
  - LLM
  - 回答


# 概要
DifyでChatBotを作成する方法を解説する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/b1e8049b-3185-4dfb-b2d9-a2d70ee91fe1.png)

# ノードの説明
Difyはノードを組み合わせてRAGの情報を検索して回答を返す生成AIのChatBotを作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/54628532-bf71-4db7-a3ff-373ee59be478.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/3acc2324-f03d-4034-a453-0fa588b8ab40.png)


## 開始
ノードとしては開始を表し、初期設定で変数を設定できる。
今回は特に指定は無しです。
変数の設定できる種類は以下です。
- 短文
- 段落
- 選択
- 数値
- 単一ファイル
- ファイルリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/dc2eab43-01d8-47f6-8394-42bec70d03c8.png)
よく使われるシステム変数
- sys.query 入力された質問です。
- sys.files 入力されたファイルです。主に画像認識で利用する。


## 知識検索
ナレッジ(RAG)に登録した名前を選択する。
ナレッジベースの部分に検索したいナレッジを指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/894ec2be-ff74-455f-8487-c67e61421260.png)
検索変数に指定する変数は通常sys.queryです。
ただし、ナレッジベースの検索に引っかかるような質問にしたい。
## LLM
ここで、生成AIのモデルを指定する。ChatGPT 4oや4.1、 o3などClaude,Geminiなど指定できる。
ここではGPT 4oを指定する。
回答のためのシステムプロンプトで以下の要素を記述する。
- 役割
- 指示
- 出力形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/523a8b01-e8a8-4ff8-82ed-74634cc96f64.png)
SYSTEMにシステムプロンプトを記述する。

## 回答
回答を出力します。通常、終了ノードを意味します。
ノードの組み合わせで途中に組み入れることも可能です。その場合、途中経過の表示で利用できる。
応答部分に前のノードの出力変数が指定されていること。
この指定で生成AIの回答を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783239/4bb743e2-6ae3-430e-8256-0a314e64d14e.png)

----
【Tensorflow】グラフ実行ってなんやねん。

## はじめに

TensorFlow のグラフ実行のイメージがわかずあれこれ調べて、
大まかな仕組みを理解できたので共有します。


## 1. 「設計図」をつくる（グラフの構築）

- `@tf.function` を付けた関数内で行う演算を記録し、ノード（演算）とエッジ（テンソルの流れ）からなる**計算グラフ**を作成
- まだ実際の計算は実行せず、「何をどう計算するか」のレシピだけを宣言している段階

```python
@tf.function
def recipe(x):
    y = x * 2      # ノード①：スケーリング
    return y + 1   # ノード②：加算

```

---

## 2. 自動最適化（Grappler）

- 作成したグラフに対して TensorFlow が自動的に最適化を適用
    - **定数折り畳み**：`2*const` のような計算を事前にまとめる
    - **演算融合**：連続する演算をひとつの高速処理にまとめる
    - **不要ノード削除**：使われない部分を切り捨てる
- 必要に応じて XLA（JIT コンパイラ）も有効化でき、さらに高度な最適化が可能

---

## 3. 一気に「調理」する（グラフの実行）

- 最適化済みグラフをまとめて一度に実行
- GPU／TPU 等、割り当てられたデバイス上で高速に動く
- 同じグラフは何度でも再利用できるため、大量データを高速に処理可能

```python
# 実際に入力テンソルを渡してまとめて計算
result = recipe(tf.constant([3.0, 4.0]))
print(result.numpy())  # → [7. 9.]

```

---

### メリット・注意点

- **メリット**
    - 一度最適化されたグラフは繰り返し高速実行できる
    - 本番投入時の性能・移植性が高い
- **注意点**
    - 初回のトレース＆最適化に時間がかかる
    - デバッグ時は中身が見えにくいので、開発中は Eager モード（即時実行）で動作確認するのがおすすめ

---

**使い分けの流れ**

1. **Eager 実行** で「１行ずつ」動きを確認 →
2. 安定したら `@tf.function` を付けてグラフ実行 →
3. Grappler／XLA による最適化で性能アップ

このように「先に設計図を作って自動最適化→まとめて実行」する仕組みが、
TensorFlow のグラフ実行の大きな特徴です。
Tensorflowの前処理レイヤーいつ使うの？


## Tensorflowの前処理レイヤー

モデル構築時に前処理も同じモデルグラフに含めるアプローチです。

`tf.keras.layers.experimental.preprocessing` にある正規化、カテゴリーエンコーディング、テキストトークナイズ、画像前処理などのレイヤーを使い、
トレーニング・推論ともに同じ処理を保証できます。
しかし個人的にいつ使うの？これと感じたので調べてみました。

参考: https://www.tensorflow.org/tutorials/load_data/csv?hl=ja

## 一緒にするのが良い時

- **エンドツーエンドのデプロイを想定**
TensorFlow Serving、TFLite、TF.js などにモデルを載せる際、
前処理も一体化するとクライアント側の実装がシンプルに。
- **ワンステップ推論パイプライン**
生データ → `model.predict()` だけで完結し、運用負担を軽減できる。
- **トレーニング⇔推論の一貫性担保**
同一グラフ内で前処理を行うことで、環境差異やコードズレによる精度低下を予防。
- **プロトタイピング／少量データ**
データ量が少なく、パフォーマンス問題が起きにくいケースなら手早く試せる。

## 別々で切り出したほうが良い時

- **大規模データのバッチ処理**
数百万〜数億レコード規模のETLには、Apache Beam/Spark や Dask といった専用基盤のほうが高効率。
- **複雑な前処理ロジック**
外部データ参照、複雑な条件分岐、時系列加工などは TensorFlow レイヤーでは実装困難・パフォーマンス劣化の恐れ。
- **前処理の再利用性**
フレームワーク横断で同じ前処理を使いたい場合、独立したETLパイプラインにして共通化したほうがメンテしやすい。
- **パフォーマンス最適化が必須**
キャッシュ戦略や並列度の細かな制御が必要なときは、NumPy/Pandas/Dask などでチューニングするほうが柔軟。

## 個人の感想

実務で大規模データを扱う場合、前処理は専用のETL基盤で一括処理し、
保存済み特徴量をモデルに供給する運用が現実的だと感じます。

一方で、エンドツーエンドのシンプルな推論サービスを迅速に立ち上げたい場合は、TensorFlowの前処理レイヤーを使ってモデルと前処理を一体化するメリットも大きいと思います。

もし「一緒にする」側のメリットで他にアイデアがあれば、ぜひコメントで教えてください！
AWS SAP合格体験記｜最小の教材で最大の成果を得た話

# AWS SAP合格体験記｜最小の教材で最大の成果を得た話

本記事の構成：

- [受験の背景](#自己紹介と受験の背景)
- [試験の特徴と所感](#aws-sap試験の特徴と所感)
- [使った教材と選定理由](#使用した教材udemyの模擬試験)
- [勉強方法と工夫](#学習の進め方と工夫したこと)
- [試験本番の印象](#試験本番の印象と結果)
- [アドバイスとまとめ](#これから受験する人へのアドバイス)

---

## はじめに

2025年4月、AWS Solutions Architect – Professional（SAP-C02）に合格できたので、Qiita初投稿します！ 

使用する教材はかなり吟味したうえで、**Udemyで提供されている模擬試験講座1本に絞りました**（選定理由は後述の「使用した教材」セクションにて紹介）。一時的にUdemy Businessを利用できたこともあり、他の講座との比較検討も行いました。

動画講座や参考書のように情報量が多すぎて要点がつかみにくい教材ではなく、**試験と近い形式で繰り返し演習できたことで、自分の理解度や知識の穴を把握しやすかった**ことが、一本に絞る決め手でした。

複数の教材に手を出す方も多いと思いますが、自分には「教材を絞って集中するやり方」が合っていたようで、短期間で仕上げることができました。

本記事では、その教材の活用法や勉強方法、試験本番の印象、そして反省点をお伝えします。

私と同じように**学習効率の良し悪しが気になってしょうがない**という方の参考になれば幸いです。

---

## 自己紹介と受験の背景

IT企業に勤める40代後半。クラウドに本格的に触れたのは約3年前です。  
2023年にAWS SAA（Solutions Architect – Associate）を取得し、今回がプロフェッショナルレベル初挑戦でした。

業務ではIAMやS3、EC2、CloudWatchを日常的に使っている一方で、OrganizationsやControl Tower、Lake Formationなどは未経験に近い状態でした。

---

## AWS SAP試験の特徴と所感

SAP-C02は、**75問／180分**の長丁場。日本語受験も可能です。

SAAと比べて各問題の**シナリオが長く、設問の抽象度も高め**で、明確な「これが正解！」を選ぶのが難しい構成です。

特に難しく感じたのは：

- サービスコントロールポリシー（SCP）
- クロスアカウントアクセスの設計
- コスト最適化を伴う高可用性アーキテクチャ

これらは単なる知識ではなく、**構成設計の思考力＝アーキテクト力**が問われると実感しました。

---

## 使用した教材：Udemyの模擬試験

教材選びにはかなり慎重になりました。最終的に1本に絞ったのは、**事前に公式サンプル問題と照らし合わせて比較調査を行った結果**です。

👉 [AWS公式サンプル問題（SAP-C02）PDF](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Sample-Questions.pdf)

このサンプル問題をもとに、複数のUdemy講座や市販の参考書を比較検討しました。  
ちょうど一時的にUdemy Businessを利用できる環境だったため、動画中心の講座や模擬試験形式の講座など、いくつかの講座を実際に試すことができました。

その中で、最終的に自分が使い込んだのが以下の模擬試験講座です：

👉 [私が最終的に選んだUdemyの模擬試験講座（420問＋解説）](https://www.udemy.com/share/10daFV/)

他のUdemy講座も確認し、受講レビューも一通りチェックしましたが、

- 日本語が不自然で、翻訳ツールを使っているように感じるものがある  
- 解説が簡略的すぎて納得感に欠ける（例：「この選択肢が最もコスト最適なので正解です」だけ）  
- 逆に、解説が長文すぎて読み進めづらい  
- 解説と実際の正解が一致していないケースもあった  

といった点から、最終的には見送りました。

市販の参考書も本屋で立ち読みしましたが、自分にとっては文章量が多く、「どこが試験に関係するのか」を把握しづらいと感じました。その点、この模擬試験講座は解説が箇条書き中心で構成されており、私のように長文が苦手なタイプには合っていました。

「SAA程度の知識があり、効率よく合格を目指したい」という方には、こうした模試ベースの学習も一つの選択肢になるかと思います。

---

## 学習の進め方と工夫したこと

- 学習期間：**約3週間**
- 平日：夜に1セット（75問）  
  週末：復習＋追加セット（2セット）

###  復習スタイル

- 解説は**正解・不正解に関わらず熟読**
- 間違えた問題はNotionでメモ化・要点を自分の言葉で整理
- IAM・VPC・Redshiftなどの主要サービスは、**公式ドキュメントで補足**

特に「選択肢が正解／間違いの理由」を納得することに重点を置きました。

---

## 試験本番の印象と結果

試験は東京のテストセンターで受験。  
終了10分前に全問を解き終え、フラグ付き問題を見直す余裕がありました。

- **得点：822点**（750点が合格ライン）

出題の論点は、Udemy模試とかなり重なる部分が多い印象でした。  
知らないサービス名が出てくることもなく、試験範囲をほぼ網羅されていると思います。ただし、試験では同じサービスについて、異なる観点から問われる場面もあったため、問題を解けるようになったら解説を読み込んで理解を深めるのがいいと思います。

---

## やって良かったこと／やらなくても良かったこと

###  やって良かったこと

- 模擬試験の**解説を丁寧に読む**
- 間違いをそのままにせず、**メモ化・要点整理**
- **1問1問を丁寧に読み解く訓練**を継続

###  やらなくても良かったこと

- Whitepaperの全文読み込み  
  （時間効率が悪い。情報量が多く、出題に直結しない内容も多いため、重点の置きどころがつかみにくかった）
- 動画講座  
  （時間が限られていたこともあり、結果的に不要）

---

## これから受験する人へのアドバイス

- 教材は多くなくてもいい。**「これ」と決めた1本をやり切ることが重要**
- 模試は「点数を取るため」でなく、**思考プロセスを鍛えるため**
- SAPでは、**サービスの組み合わせ方・構成の最適解を見抜く力**が求められる

---

## まとめ

私の場合は、Udemyの模擬試験講座1本でも合格できましたが、やはり大事なのは「選んだ教材を使い込むこと」だと感じました。

教材選びに悩むより、「選んだ教材を信じて最後までやり切る」こと。  
試験中も「ある程度やり切った感」があったことで、焦らず進められた気がします。

これから受験する方の成功を心から願っています！
Go学習記録6日目 同期的なチャットアプリ①

Go言語学習の6日目です。

今回は並列処理の勉強のために、チャットアプリを作成しました。

### ポインタを引数とする関数
```
// 値を変更する関数
func modifyValue(p *int) {
    *p = 20 // ポインタを使って、元の変数の値を変更
}

func main() {
    a := 10
    fmt.Println("Before:", a) // 出力: Before: 10
    modifyValue(&a)           // aのアドレスを渡す
    fmt.Println("After:", a)  // 出力: After: 20
}
```
状右記のようなコードを例として、modifyValueの引数のpの型の役割をきちんと理解しました。modifyValueは*int型のポインタを引数にしています。ポインタを引数として使用することで、関数内で変数の値を直接操作することができ、効率的なメモリ使用とデータの可変性を実現できる。
＊の使いどころとして、(1)変数に付けてポインタを表現する,(2)intやstringなどの型に付けて型のポインタを表現する。
この二つが混在していましたが、今日で上手く整理出来ました。

### 構造体のエクスポート
```
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
```
上記のようなPerson構造体があったとき、フィールド名が大文字か小文字かで挙動が変わります。大文字の時はエクスポートされたフィールドで、小文字の時はエクスポートされていないフィールドです。エクスポートされたフィールドはパッケージ外からアクセスすることが出来ます。JSON操作を行うとき`encoding/json'パッケージを使いましたが、これはパッケージ外からのアクセスです。Person構造体のフィールドを大文字で始めないといけません（自分はこれで詰まりました）
【Tensorflow】Eager実行とグラフ実行

## 1. Eager 実行（デフォルト）

### 概要

- **即時実行**モード。Python の命令をそのまま実行し、
その場で結果（`tf.Tensor` オブジェクト）を返します。
- デバッグや開発がしやすく、NumPy ライクな感覚で手軽に試せます。

### 特徴

- 各演算は呼び出し順にすぐ実行される
- `.numpy()` を使って簡単に NumPy 配列に変換可能
- Python の標準デバッガ（`print`、`pdb`）が有効

### コード例

```python
import tensorflow as tf

# Eager 実行では即座に結果が返る
a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.constant([[5.0, 6.0], [7.0, 8.0]])
c = a + b
print("c =", c)               # tf.Tensor([...], shape=(2,2), dtype=float32)
print("NumPy array:", c.numpy())

```

---

## 2. グラフ実行（Graph Execution）

### 概要

- **計算グラフ**（`tf.Graph`）を事前に組み立て、そのグラフをまとめて実行する方式。
- TensorFlow 1.x の標準モードで、TensorFlow 2.x でも `@tf.function` を付けることで擬似的に利用できます。

### 特徴

- 実行前にグラフを最適化（定数折り畳み、融合など）
- GPU／TPU などハードウェアへの最適化が強力
- 大規模モデルや本番環境でのスループット向上に有利

### コード例

```python
import tensorflow as tf

@tf.function  # このデコレータで関数内の演算が「グラフ」として構築される
def my_matmul(x, y):
    # ここはグラフ化され、最適化・再利用される
    return tf.matmul(x, y)

# 関数を呼び出すと、初回はグラフ構築 → 実行、
# 2 回目以降はキャッシュされたグラフを即実行
x = tf.random.uniform([2, 3])
y = tf.random.uniform([3, 4])
z1 = my_matmul(x, y)  # グラフをビルドして実行
z2 = my_matmul(x, y)  # キャッシュ済みグラフを実行（高速）

```

- `my_matmul.get_concrete_function(x, y)` を呼ぶと、入力シェイプ・型に合わせたグラフが具体化（Concrete Function）されます。

---

## 3. 両モードの使い分け

| 特徴 | Eager 実行 | グラフ実行 (`tf.function`) |
| --- | --- | --- |
| 開発・デバッグ | ◎（直感的、デバッギング容易） | △（中間グラフが見えにくい） |
| パフォーマンス | ◯（小規模実験向き） | ◎（大規模・本番環境向き） |
| 最適化 | なし | 定数折り畳み、演算融合など自動 |
| ハードウェア対応 | 普通 | GPU/TPU 最適化 |
- **開発段階** ではまず Eager 実行で動作確認し、安定したら `@tf.function` を付けてグラフ実行に切り替えてパフォーマンスを上げる、という流れが一般的です。

---

## 4. まとめ

1. **Eager 実行**：即時実行。Python ライクに動かせてデバッグしやすい。
2. **グラフ実行**：計算グラフを最適化／キャッシュしてまとめて実行。大規模学習や本番向き。
3. **実践的流れ**：
    - 最初は Eager で試し、
    - コアとなるトレーニングループや推論関数に `@tf.function` を付けてグラフ化すると、性能向上が得られる。

まずは Eager モードで手を動かし、慣れてきたら `tf.function` でグラフ実行を試してみましょう。
参画に向けたActiveDirectoryの学習

本日は参画に向けたActiveDirectoryとLinuxコマンドの学習を行った。
最初の現場でActiveDirectoryログを習得し、調査チームにログの調査依頼を流すだけしか触れたことがなかったが、一度のログインで複数のサービスにアクセスできる等、初めて知った機能に驚きがあった。
【Tensorflow】ブロードキャストによるエラーを防ぐ

## Tensorflowのブロードキャストを無効化する方法

残念ながら、TensorFlow にブロードキャストを**完全に無効化するグローバル設定**は用意されていません。

しかし、演算の直前に「形状がまったく一致している」ことをチェックすることで、
実質的にブロードキャストを防ぐことができます。主な方法を２つご紹介します。


## 1. 動的（ランタイム）チェック

`tf.debugging.assert_equal` を使って、
実際に演算を行う直前に形状を比較し、異なっていたらエラーにする方法です。

```python
import tensorflow as tf

a = tf.constant([[1, 2, 3],
                 [4, 5, 6]])      # shape=(2,3)
b = tf.constant([10, 20, 30])     # shape=(3,)

# 演算前にランタイムでチェック
with tf.control_dependencies([
    tf.debugging.assert_equal(tf.shape(a), tf.shape(b),
                              message="Shapes must match exactly")
]):
    c = tf.add(a, b)  # ここで異なる shape を検知してエラーになる

```

- **メリット**：動的に shape を検証できるので、データ依存のパスでも確実にチェックできる。
- **デメリット**：実行時オーバーヘッドがある（assert が走る分だけ少し遅くなる）。

---

## 2. 静的（ビルドタイム）チェック

Tensor オブジェクトの持つ `.shape`（`TensorShape`）を使い、
グラフの構築時／`tf.function` のトレース時にチェックする方法です。

```python
import tensorflow as tf

@tf.function
def strict_add(a: tf.Tensor, b: tf.Tensor) -> tf.Tensor:
    # ビルド時に static shape を比較
    a.shape.assert_is_fully_defined()
    b.shape.assert_is_fully_defined()
    if a.shape != b.shape:
        raise ValueError(f"Shape mismatch: {a.shape} vs {b.shape}")
    return a + b

# 使い方
x = tf.zeros((3,4))
y = tf.ones((3,4))
z = strict_add(x, y)   # OK

y2 = tf.ones((4,3))
z2 = strict_add(x, y2) # ビルド時に ValueError

```

- **メリット**：グラフの構築時に不整合を検出できるので、デバッグが早い。
- **デメリット**：`TensorShape` が「不明（None 含む）」だとチェックできない場合がある。

---

### そのほかのテクニック

- **`tf.ensure_shape`**
    
    ```python
    a = tf.ensure_shape(a, [None, 3])
    b = tf.ensure_shape(b, [None, 3])
    
    ```
    
    で「このテンソルは必ず `(?,3)` という形である」と宣言し、違えばエラーにできます。
    
- **`Tensor.set_shape()`**
    
    ```python
    a.set_shape((2,3))
    b.set_shape((2,3))
    
    ```
    
    でビルド時に強制的に形状を固定できます。
    
- **`input_signature` を使った `tf.function`**
    
    ```python
    @tf.function(input_signature=[
        tf.TensorSpec(shape=(None,3), dtype=tf.float32),
        tf.TensorSpec(shape=(None,3), dtype=tf.float32),
    ])
    def f(a, b):
        return a + b
    
    ```
    
    こうすると「必ず `(?,3)` 同士」のみがトレース対象になり、異なる形状を渡すと呼び出し時点でエラーになります。
    

---

### まとめ

- **グローバルにブロードキャストをオフにする仕組みはない**
- **演算前に明示的に shape チェックを入れる** ことで、結果的にブロードキャストを防ぐ
- `tf.debugging.assert_equal`（動的）／`TensorShape.assert_*`（静的）／`input_signature` のいずれかを選んで使ってください。

このように「自分でチェックを入れる」形が現在の TensorFlow での推奨パターンです。
React 19 の RC（Release Candidate）版

皆さん、こんにちは。

今回は「React 19 の RC（Release Candidate）版」について紹介させていただきます。

React 19 の RC（Release Candidate）版は、正式リリース前の最終確認用パッケージとして公開されているテスト版です。実運用環境への導入前に、最新の新機能や破壊的変更が問題なく動作するかを確認するために使われます。

# RC版のリリース日とバージョン

- RCフェーズ開始日：2024年5月15日頃に RC フェーズに移行しています。
- 主なパッケージバージョン例：`react@19.0.0-rc-6f23540c7d-20240528`、`react-dom@19.0.0-rc-6f23540c7d-20240528`といったバージョンが NPM に公開されています。

# インストール方法

```
# npm
npm install --save-exact react@^19.0.0-rc react-dom@^19.0.0-rc

# Yarn
yarn add --exact react@^19.0.0-rc react-dom@^19.0.0-rc

# TypeScript を使っている場合は型定義も更新
npm install --save-exact @types/react@^19.0.0-rc @types/react-dom@^19.0.0-rc
```

この手順は公式のアップグレードガイドにも記載されています。

[参考](https://react.dev/blog/2024/04/25/react-19-upgrade-guide?utm_source=chatgpt.com)

# 主な新機能・変更点

## Actions とトランジションの強化

- `useTransition`で`async`関数を直接ラップし、保留中／エラー状態の管理を自動化
- フォーム向けに`<form action={…}>`と組み合わせて使える新 API
- `useOptimistic`や`React.useActionState`による楽観的 UI 更新サポート

## サーバーコンポーネントの公式統合

- Next.js に先行実装されていた`Server Components`を`React`本体に組み込み
- コンポーネント内で`async/await`が直接利用可能になり、初期ロード高速化や SEO 改善が期待できる

## 新しい JSX トランスフォーム必須化

- React 2020 年に導入されたモダン JSX トランスフォームが前提に
- 従来の`import React from 'react'`を不要にしつつ、より高速なバンドル出力を実現

## アップグレード手順

- まずは互換性チェック用に react@18.3 へアップグレードし、非推奨 API の警告を確認。
- `npx codemod@latest react/19/migration-recipe`で提供される`codemod`を実行し、自動置換を適用。
- テストを通過したら、本番環境で RC を検証しつつ、フィードバックやバグ報告を行う。

[参考](https://react.dev/blog/2024/04/25/react-19-upgrade-guide)

## 注意点

- RC はあくまでテスト用の候補版（正式版ではない）ため、本番環境への早期導入はリスクがあります。
- 型定義`（@types/react）`も合わせて RC 版に揃えないと、TypeScript でエラーになる場合がある点に注意してください。

React 19 RC 版の概要と導入ガイドです。正式リリース前に新機能を試したい場合はぜひ RC をインストールして動作検証できると思います。

新機能の恩恵を受けつつ、安定版リリースまでの開発をお楽しみください！

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
Tensorflowにおけるブロードキャスト

## ブロードキャストとは

TensorFlow におけるブロードキャスト（broadcasting）とは，
形状（shape）の異なるテンソル同士で算術演算（足し算・掛け算など）を行うときに，
内部的に“次元を合わせて”自動的に拡張（broadcast）して計算できる仕組みです。

例えば，行列（2×3）とベクトル（3）の足し算を考えると，
ベクトルの次元を行列の行数分だけ複製して（2×3）に揃えた上で計算を行います。

---

## ブロードキャストの基本ルール

TensorFlow（および NumPy）では，次のルールでブロードキャストを行います。

1. **右詰めで次元を比較**
    
    形状の短い方のテンソルには，左側に長さ 1 の次元を補って比較します。
    
    例：`(2, 3)` と `(3,)` は → `(2, 3)` と `(1, 3)` として扱われる
    
2. **各次元ごとに互換性をチェック**
    - サイズが同じ
    - どちらか一方のサイズが 1
        
        以上のどちらかを満たせば OK。そうでない場合はエラー。
        
3. **拡張**
    
    サイズが 1 の次元は，もう片方に合わせて複製される（＝broadcast される）。
    

---

## 具体例

```python
import tensorflow as tf

# 2×3 の行列
a = tf.constant([[1, 2, 3],
                 [4, 5, 6]])        # shape=(2, 3)

# 長さ 3 のベクトル
b = tf.constant([10, 20, 30])      # shape=(3,)

# ブロードキャストにより b は (1,3) → (2,3) に拡張されてから足し算
c = a + b
print(c)
# tf.Tensor(
# [[11 22 33]
#  [14 25 36]], shape=(2, 3), dtype=int32)

```

この例では，`b`（shape=(3,)）がまず `(1,3)` と見なされ，さらに行数方向に 2 行分複製されて `(2,3)` になります。

---

## 多次元テンソルでの応用

たとえば，形状 `(4, 1, 6)` のテンソルと `(   5, 6)` のテンソルを足し算するときは：

1. `(4, 1, 6)`
2. `( 5, 6)` → `(1, 5, 6)` （左側に長さ 1 の次元を追加）
3. 次元ごとに互換性をチェック → `(4, 1, 6)` と `(1, 5, 6)` は OK
4. ブロードキャスト → `(4, 5, 6)` に揃えたうえで演算

```python
x = tf.zeros((4,1,6))
y = tf.ones((   5,6))
z = x + y   # 結果の shape は (4,5,6)

```

---

## 注意点

- **意図しない拡張**
    
    形状をよく確認せずに演算すると，思わぬ次元拡張が起こりバグの原因になることがあります。
    
- **計算コスト**
    
    ブロードキャストはメモリ上で実際にデータを複製するわけではありませんが，演算時に仮想的に複製して計算するため，大きな次元で多用すると処理が遅くなる場合があります。
    
- **明示的なリシェイプ**
    
    `tf.reshape` や `tf.expand_dims`，`tf.squeeze` を使って，自分で形状を整えてから演算するのもおすすめです。
ルックアップテーブルってなんやねん

自然言語処理の文脈でルックアップテーブルが頻繁に出てくるので何なのかまとめｍ


## どんなときに使うのか

- **文字列→数値ID変換**
自然言語処理で「単語」や「トークン」を ID に置き換えるとき。
- **カテゴリ変数の前処理**
ユーザー属性や商品のカテゴリなどを下流のモデルに渡す前に整数にマッピング。
- **未知語（OOV: Out-Of-Vocabulary）の扱い**
語彙に存在しないキーが来たときにデフォルト値を返して処理を安定化。
- **高速アクセスが必要なとき**
学習中や推論中に何度も同じマッピングを呼び出す場合に効率よくルックアップ可能。

## 作成方法

### 1. 低レベル API (`tf.lookup`)

```python
import tensorflow as tf

# ① キー／値のテンソルを用意
keys   = tf.constant(["apple", "banana", "cherry"])
values = tf.constant([0, 1, 2])

# ② Initializer を作成
initializer = tf.lookup.KeyValueTensorInitializer(
    keys=keys,
    values=values,
    key_dtype=tf.string,
    value_dtype=tf.int64
)

# ③ StaticHashTable を構築（OOV は -1 を返す）
table = tf.lookup.StaticHashTable(
    initializer,
    default_value=-1
)

# ④ 使ってみる
inputs = tf.constant(["banana", "durian"])
ids    = table.lookup(inputs)       # → [1, -1]

```

### 2. 高レベル API (Keras 前処理レイヤー)

- **`StringLookup`**：文字列を整数 ID に自動変換
- **`IntegerLookup`**：整数カテゴリを該当レンジに再マッピング

```python
from tensorflow import keras

# 語彙リストを渡すだけで内部テーブルを自動生成
lookup = keras.layers.StringLookup(
    vocabulary=["apple", "banana", "cherry"],
    mask_token=None,     # マスクトークンを使わない
    oov_token="[UNK]"    # 未知語は [UNK]→ID 1 にマッピング
)

# 変換例
ids = lookup(tf.constant(["banana", "durian"]))
# → [2, 1] ('durian' は OOV として ID=1)

```

## まとめ

- **ルックアップテーブル**は「キー→値」の高速マッピング機構で、文字列やカテゴリをモデルで扱いやすい数値に変換するときに使います。
- **低レベル API**（`tf.lookup.StaticHashTable` など）は柔軟に初期化方法を指定可能。
- **高レベル API**（`StringLookup`／`IntegerLookup`）は語彙リストを渡すだけで簡単に使えて、前処理パイプラインに組み込みやすいです。
- 未登録キーへの対応や、学習済み埋め込み行列の初期化なども含めて、幅広い前処理シナリオで活躍します。
【Tensorflow】パンケーキの焼き方で学ぶHyperband

# Hyperbandとは
Hyperband は「Successive Halving」を拡張したハイパーパラメータ探索アルゴリズムで、限られた計算リソースで効率よく最適な設定を見つけるために以下の数式を用います。
- **$R$**：最大リソース量（例：最大エポック数や焼成時間）
- **$\eta$**：削減率（次のステップに残す割合の逆数）
- **$s_{max}$**：ブランケット数
    
    $s_{max} = \lfloor \log_{\eta} R \rfloor$
    
- **各ブランケット $s$ の初期設定**
    
    $n_s = \left\lceil \frac{s_{max} + 1}{s + 1} \eta^{s}\right\rceil,\quad r_s = \frac{R}{\eta^{s}}$
    
    - $n_s$：試す候補（パンケーキ枚数）
    - $r_s$：最初に割り当てるリソース（焼成時間）
---
# パンケーキの焼き方で例える
1. **たくさんのレシピを一口サイズで試作**
    - 例：27枚の一口パンケーキを各1分ずつ焼いて味見
2. **上位1/η（例：1/3）のレシピだけ残す**
    - 27枚→上位9枚を「本番サイズ（3分）」で再度試作
3. **さらに上位1/ηを絞り込む**
    - 9枚→上位3枚を「フルサイズ（9分）」で再試作
4. **最終評価**
    - 残った3枚から最もおいしい1枚を「じっくり（27分）」焼いて決定
---
# 数式がパンケーキの焼き方のどこに該当するのか
- **$R=27$**：最もじっくり焼くときの時間（分）
- **$\eta=3$**：毎ステップで上位1/3を残す
- **$s_{max}=3$**：ステップ数（一口→本番→フル→最終）
- **$n_s$、$r_s$ の対応**
    
    
    | $s$ | $n_s$（枚） | $r_s$（分） | パンケーキの焼き方 |
    | --- | --- | --- | --- |
    | 0 | $\lceil4/1 \cdot 3^0\rceil=4$ | $27/1=27$ | 4枚を27分じっくり味見 |
    | 1 | $\lceil4/2 \cdot 3^1\rceil=6$ | $27/3=9$ | 6枚を9分でざっくり評価 |
    | 2 | $\lceil4/3 \cdot 3^2\rceil=12$ | $27/9=3$ | 12枚を3分で一口サイズ味見 |
    | 3 | $\lceil4/4 \cdot 3^3\rceil=27$ | $27/27=1$ | 27枚を1分で超高速評価（省リソース） |
---
# まとめ
- **Hyperband の肝**：多くを少しずつ試し、良い候補にリソースを集中する
- **数式**：
    - $s_{max}=\lfloor\log_{\eta}R\rfloor$
    - $n_s=\lceil\frac{s_{max}+1}{s+1}\eta^s\rceil,\;r_s=\frac{R}{\eta^s}$
- **パンケーキ例**：
    1. 一口サイズ→上位1/η
    2. 本番サイズ→再抽出
    3. フルサイズ→最終決定
- **メリット**：無駄な学習を減らし、短時間で最適設定を発見できる！
PowerShellでシステム情報取得

# システム情報取得
・マシン名
・シリアル番号（製造番号）
・システムモデル名
・MACアドレス
を取得して表示する。

※実行前に以下で実行権限を与えておくこと
```powershell
Set-ExecutionPolicy RemoteSigned
```
右クリック -> [PowerShellで実行]を選択して実行

## コード
```powershell:getSystemInfo.ps1
chcp 437
cls

$hostname = hostname
Write-Host("Computer Name : {0}" -f $hostname)

$serialNumber = (wmic bios get serialnumber | Select-Object -Skip 1)[1].Trim()
Write-Host("Serial Number : {0}" -f $serialNumber)

$systemModel = (systeminfo | findstr /C:"System Model:") -replace "System Model:\s+", ""
Write-Host("System Model  : {0}" -f $systemModel)

$physicalAddress = (netsh wlan show interfaces | find "Physical address") -replace "\s+Physical address\s+:\s", ""
Write-Host("MAC address   : {0}" -f $physicalAddress)

pause
```
DockerでNext.jsでSassを使うときの設定

ローカル上のnpm run devのときにSassを使っていても問題はなかったが、
Docker環境にNext.jsを設定し、Sassを使うときにエラーが出たのでその時の解決法を記載しておく。

## インストール方法

```
npm install --save-dev sass
```

`globals.css`を`globals.scss`に
layout.tsxなどに記載されている
`import "./globals.css";`を`import "./globals.scss";`
に変更

`page.module.css`を`page.module.scss`に
page.tsxなどに記載されている
`import styles from "./page.module.css";`を
`import styles from "./page.module.scss";`
に変更

しかしこのまま`docker-compose up`をしてもエラーが出て使えません。

```
Module not found: Can't resolve './globals.scss'

./app/layout.tsx (3:1)

Module not found: Can't resolve './globals.scss' 1 | import type { Metadata } from "next"; 2 | import { Geist, Geist_Mono } from "next/font/google";

3 | import "./globals.scss"; | ^ 4 | 5 | const geistSans = Geist({ 6 | variable: "--font-geist-sans",

https://nextjs.org/docs/messages/module-not-found

```

## Dockerfileの修正

こちらを追加
``` Dockerfile
# 依存関係のインストール（sassを含む）
RUN npm install
RUN npm install sass --save-dev
```


Docker Composeの修正

`build: context: . dockerfile: Dockerfile`を追加


``` docker-compose.yml
services:
  nextjs:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app
      # node_modulesはマウントしない（コンテナ内のものを使用）
      - /app/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
```

## Dockerイメージの再ビルド
変更を適用するには、Dockerイメージを再ビルドします。

```
docker-compose down
docker-compose build
docker-compose up
```

これでエラーは消えSassが使えます。


まだ、エラーが残っていたので。
```
Missing argument $color.
  ┌──> app/page.module.scss
163│     filter: invert();
  │             ^^^^^^^^ invocation
  ╵
  ┌──> sass:color
1 │ @function invert($color, $weight: 100%, $space: null) {
  │           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ declaration
  ╵
  app/page.module.scss 163:13  root stylesheet
```

`filter: invert();`に引数がないためのようなので`filter: invert(1);`などにする。

これですべてエラーが消えました。
git en español

El ORIGEN de GIT
https://www.youtube.com/watch?v=s5YMdrj6gGc

Git se utiliza junto con Github, Gitlab o Bitbucket.
gitは、Github, GitlabまたはBitbucketと連動して使います。

Mi Github está en la siguiente URL:
私のGithubは、次のURLです。
https://github.com/kaizen-nagoya

Curso COMPLETO de GIT y GITHUB desde CERO para PRINCIPIANTES
https://www.youtube.com/watch?v=3GymExBkKjE

# ref
git(0) list
https://qiita.com/kaizen_nagoya/items/da6e6990a569808e9623

git(19)labのメール通知の設定 https://qiita.com/kaizen_nagoya/items/754e88d311cc1985e1c0	
bitbucket/git(16)hub/gitlab連携環境構築 悪戦苦闘 https://qiita.com/kaizen_nagoya/items/87352fe88ceed2c1732d	
unknown option `initial-branch=main', 今日のgit(6) error(34) https://qiita.com/kaizen_nagoya/items/208d538716bea14800cc	
卒業論文、修士論文、博士論文はgit(17)hub/gitlab/bitbacketのprivate利用をお勧め LaTeX(10) https://qiita.com/kaizen_nagoya/items/eb9945a2649f6f3eabd0
アジャイルサムライ & 公開算譜は機敏だ(An Open Source Project is Agile)Git(12)Hub with Docker。仮説(51), Youtube(2) 
https://qiita.com/kaizen_nagoya/items/5dd49a046b5991af3a5e	
「未経験者が認識してなさそうなTIPS」で同意したいこと git(14) 
https://qiita.com/kaizen_nagoya/items/9759de698df880eb1f77	
open な issue がどんどん溜まる現象を解決するために。仮説(96) git(21) 
https://qiita.com/kaizen_nagoya/items/efe22d9a23ad2e9934d6	
今日git(2)でしくったこと: Initialized empty Git repository, warning: adding embedded git repository, error(122) 
https://qiita.com/kaizen_nagoya/items/63ce0be02b20e1860c2a	
Git(13)Hub, bitbucket 事始め＆名古屋のIoTは名古屋のOSで 
https://qiita.com/kaizen_nagoya/items/198c4dc14b12e86d8b3e
設計はgit(5), docker(13)で。
https://qiita.com/kaizen_nagoya/items/5e85a825709f7f5f56ee	
Git(10)hub archive programって何ですか？ 
https://qiita.com/kaizen_nagoya/items/27cb1a6e3529a71b18a9	
Microsoftとの歴史　Basicに始まり、Cコンパイラ、Windows95、Git(9)hubまで 
https://qiita.com/kaizen_nagoya/items/d7c0cc257e99de0573cf	
Git(8)Hub入門 (1) 入門 
https://qiita.com/kaizen_nagoya/items/b6f5b1532fd21fec79c8	
Git(20)Lab入門 (1) 入門 
https://qiita.com/kaizen_nagoya/items/e8b9f4f0619e317db862
Git(11)hubとdocker。docker(59) 
https://qiita.com/kaizen_nagoya/items/f7e142cd283a1c314234	
ありがとうGit(15)lab 
https://qiita.com/kaizen_nagoya/items/05a39cee0eb3a2de1106

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
python en espanñol

El ORIGEN de PYTHON
https://www.youtube.com/watch?v=tf4qLcKk6ZU

Hace 15 años, cuando trabajaba como profesor a tiempo parcial en la Universidad de Gifu, el primer lenguaje de programación que enseñé fue Python.
15年ほど前、非常勤講師をしていた岐阜大学で、最初に教えるプログラミング言語がPythonになりました。

Durante el taller de aprendizaje profundo, descubrimos que el primer obstáculo era incorporar Python a Windows.
深層学習の講習会では、WindowsにPythonを導入するのが最初の障壁であることがわかりました。

Descubrí que Docker era ideal para programar y experimentar con múltiples versiones de Python.
複数の版のpythonでプログラム実験するには、Dockerが最適だとわかりました。

Hablemos de PYTHON
https://www.youtube.com/watch?v=Dwvh96a7Gq0

Python en 8 Minutos
https://www.youtube.com/watch?v=PtBHnMMRI0E

LinuxChad y así sucesivamente, スペイン語でプログラミング
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605

# Ref.
Python(0)記事をまとめたい。
https://qiita.com/kaizen_nagoya/items/088c57d70ab6904ebb53
qiita api python
https://qiita.com/kaizen_nagoya/items/ed9117470c59f7ede416
操作可能なプログラムまはたバッチ　ファイルとして認識されていません。Microsoft WindowsにPython3(7), Anaconda3)を導入する（7つの罠）error(61) 
https://qiita.com/kaizen_nagoya/items/7bfd7ecdc4e8edcbd679	
「直感Deep Learning」Antonio Gulli, Sujit Pal著 dockerで機械学習(3) with anaconda(3) python(13) 
https://qiita.com/kaizen_nagoya/items/483ae708c71c88419c32	
「ゼロから作るDeep Learning ２自然言語処理編」読書会に参加する前に読んで置くとよい資料とプログラム, python(8)　
https://qiita.com/kaizen_nagoya/items/537b1810265bbbc70e73	
M.S.WindowsにPython3(3)を導入する（７つの方法、7つの罠）2024年版 Syntax Error(109) Missing parentheses in call to 'print'. 
https://qiita.com/kaizen_nagoya/items/2b6e7643fb164c287f4e	
なぜdockerでpython/Rを使って機械学習するか 書籍・ソース一覧作成中 docker(18) python(10) 
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2	
「Python(6) 入門」の入門 
https://qiita.com/kaizen_nagoya/items/22c99c5926984ede6573	
言語処理100本ノックをdockerで。python覚えるのに最適。
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4	
python(11) error(91):画像が真っ白 解決 coding(61) 
https://qiita.com/kaizen_nagoya/items/9ef578e44d9fce34a361	
M.S.Windows にAnaconda3(python3(2))を2019年版 
https://qiita.com/kaizen_nagoya/items/c05c0d690fcfd3402534	
「python(5)による機械学習入門」入門 
https://qiita.com/kaizen_nagoya/items/65d51bf78f52383e71ff

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
CHAT-GPTを使った勉強方法

## 技術学習と語学学習の共通点

みなさんこんにちは、aki-kawa(@gukellsikakatan)です。
普段はSES企業で働いているエンジニア3年目です。

技術の勉強と語学（英語）の勉強を趣味としていて、濃い勉強をするためには共通点があるなと感じたので、発信しようと思います。

### 細かいところまで突き詰めて理解する
よく言われていることではあるかもしれませんが、正直これに限るかなと思います。
新しいことを勉強すると、必ずわからないことがたくさん出てきます。

英語の勉強をしていたら、わからない単語が出てきて、それを英語の辞書で調べると、さらにわからない単語が出てきて、またそれを調べて、、、を繰り返します。

`技術の勉強も同じです。`
エンジニア1、2年目の頃、私はとことんこだわりました。
わからない言葉が出てきたらそれをベースにとことん調べました。

例えば、
DDDってなんだろう？ってなった時に

ググったら以下が出てきます。
`DDD は Domain-Driven Design (ドメイン駆動設計) の略で、ソフトウェア開発における設計手法の一つです。業務知識を基盤に、ソフトウェアを設計し、ビジネス要件を直接コードに反映させることで、ソフトウェアの価値を高めることを目指します。`


じゃあ次、ドメイン駆動設計ってなんだろうと調べます。すると以下がでます。
`ソフトウェア開発において、業務知識（ドメイン知識）をソフトウェア設計の中心に据え、ドメインモデルを構築し、ビジネス価値を最大化することを目指す設計手法です。つまり、ソフトウェアが扱う業務領域（ドメイン）の知識を深く理解し、それをコードに忠実に反映させることで、ビジネスニーズに最適なシステムを構築することを目的とします.﻿`

次に、ドメインがよくわからないので、ドメインを調べます。
`ソフトウェアが解決しようとしている、ユーザーの知識や影響力、活動の領域のことを指します。 例えばオンラインショッピングシステムの場合、商品管理や顧客注文処理などがドメインに当たります。 ソフトウェアが扱う特定の問題や関連する業務の領域と言い換えても良いでしょう`

ドメイン駆動設計はについてはかなり難しいため、なかなか概念が理解できませんでした。

そこで使用するのは本です。

「現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法」
https://amzn.to/4lUvcie

こちらの本を読むとかなり理解力が上がりました。

ドメイン設計とデータ中心設計の何が違うのかを本質的かつ実践的に理解できる本でした。

さらに、この本の中でわからないところがあればCHAT-GPTを使って検索をします。

これを繰り返すと、細かいところまで突き詰めて理解するができるようになります。
さらにこの勉強方法のすごいところは、**複利的に知識が広がっていくところ**です。

DDDについて理解しようとすれば、必然的に他のアーキテクチャの言葉が出てきます。
データ中心設計との違いを理解するためには、データ中心設計についても理解しなければいけません。

そして、私が働くSES企業の案件の多くはこの「データ中心設計」でシステムが構築されています。
現場の知識とデータ中心設計の知識、さらにDDDの知識が繋がる瞬間でもあります。

このように**習得した知識が無限に広がっていく**のです。

最初はかなり大変な作業です。なんせ、ところん細部までこだわって、わからない単語をなくしていくのですから、かなり根気はいります。
でも、1年、2年と継続していけば、これはかなりの力を発揮するものだと思います。

これはどの学習においても同じかなと思っています。

皆さんもぜひ、とことんまでこだわる学習をして、技術力を高めていきましょう。
論理演算を用いた計算　 ド・モルガンの法則

Paizaで「論理演算」の最終問題に挑戦！　
「ド・モルガンの法則」を知ったらスマートな式になる！

## <br>🎯問題

問題：A, B, C, D（各0か1）が与えられたとき、


![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/f49ba821-b96a-4db0-b916-51fc41d0662a.png)



の値を出力せよ！

<br>

https://paiza.jp/works/mondai/logical_operation/logical_operation__basic_boss


## <br>💻コード例
### ①そのまま

```js
const rl = require('readline').createInterface({input:process.stdin})

rl.on('line', (input) => {
    const [A,B,C,D] = input.split(' ').map(Number);
    
    console.log( !((!A & !B) | !C) ^ D);
    
    rl.close();
});
```
<br>

### ②ド・モルガン登場！ 簡潔な式に！
```js
const rl = require('readline').createInterface({input:process.stdin})

rl.on('line', (input) => {
    const [A,B,C,D] = input.split(' ').map(Number);
    
    console.log((A | B) & C ^ D);
    
    rl.close();
});
```

#### ✨ 解説

Step変形:
```
!((!A & !B) | !C)
= !(!A & !B) & !!C
= (A | B) & C
```
なので全体は：
```
(A | B) & C ^ D
```

`!!C` は `C` と同じなので省略OK。

## <br>📌 気づきメモ　まとめ

- `!!x = x` は地味だけど覚えとくと便利
- `^`（XOR）は分配法則を持たない。だから `(A | B) & (C ^ D)` みたいな変形は不可
- 論理演算は「数学っぽい」けど、「可読性ファースト」で書くとバグ減る

<br><br>[僕の失敗談(´;ω;｀)と解決法🐈🐻🦁](https://paizabeginner.wordpress.com/2025/05/02/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e3%82%92%e7%94%a8%e3%81%84%e3%81%9f%e8%a8%88%e7%ae%97%e3%80%80%e3%83%89%e3%83%bb/)

<br><br><br>

## おまけ：　💡ド・モルガンの法則とは？

2つの基本形があります：
### ✅ 1. 否定がANDにかかっているとき：
```
!(A && B) ≡ (!A || !B)
```
「AとBの両方じゃない」は、「Aじゃない か Bじゃない」
<br>

### ✅ 2. 否定がORにかかっているとき：
```
!(A || B) ≡ (!A && !B)
```
「AまたはBじゃない」は、「AもBもじゃない」

### 例：
```
元の式:

!((!A & !B) | !C)

変形:

= !(!A & !B) & !!C
= (A | B) & C   ←スッキリ！
```

### 💡 なぜ便利？

- 長い論理式を 簡単に＆読みやすく 書き直せる
- 条件分岐や論理演算問題を 論理的に変形できる
- 回路設計（AND/ORゲート）の基本法則でもある

### 🧪 まとめ

ド・モルガンの法則を覚えると、「条件の否定」や「論理演算の整理」がめちゃくちゃスムーズになる！

覚え方はシンプルに：
「`!`（NOT）が中に入ると、演算子（AND ⇔ OR）が逆になる！」
【Power Apps】ドロップダウン＆コンボボックスの色変更まとめ（FillやColorの扱いについて）②

# はじめに
Power Apps でドロップダウンやコンボボックスを使う時、
見た目を整えたいけどどのプロパティを触れば色が変更するかなどが
初見では分かりづらいと思います:sweat_drops:

本記事では以下のような色・スタイルのプロパティについて
わかりやすくまとめていきたいと思います！

### :arrow_down_small:前編の記事はこちら:arrow_down_small:

https://qiita.com/Sanwa_Paint/items/55caf99eae08246b6c64

## 実際に設定してみる（画像付き）
:six: **PressedFill　クリック時の背景色**
PressedFill はコントロールをクリックしている状態の時の背景色になります。
押したままの色になるので、離せば色は元に戻ります。

`PressedFill` プロパティを `Color.LightBlue` に変更してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/5bd189b5-1c63-42b5-bbe5-f438bd4b4f88.png)

:seven: **BorderColor　境界線の色**
BorderColor はコントロールの枠線のことです。

`BorderColor` プロパティを `Color.LightBlue` に変更してみました。

変化が分かりやすいように色味を変更してますので、配色についてはご容赦ください...笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/bbabb9a2-546a-4a11-b858-2062ab52ebee.png)

:eight: **BorderThickness　境界線の太さ**
BorderThickness はコントロールの枠線の太さのことです。
単位は ピクセル で数値のみを入力します。

`BorderThickness` プロパティを `2 → 6` に変更してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/441fc731-e26d-4689-b1b4-914ec7798532.png)

:nine: **DisabledColor　無効化時のテキスト色**
:one::zero: **DisabledFill　無効化時の背景色**

DisabledColor DisabledFill はコントロールの表示モードが無効状態の場合のテキスト色と背景色のことです。

`DisabledColor` プロパティを `Color.Gray` に変更してみました。
`DisabledFill` プロパティを `Color.LightGray` に変更してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/8562f0cb-4556-4f67-a257-f70e29a4133a.png)

編集ができない状態なので前述していました PressedFill などの操作を行って変更される
色については適用されなくなります。

## さいごに
よく使用するプロパティを覚えておけば、
「あれ？この場合はどこを変更すれば良かったっけ？」などとそういった手間が減ることになります。

:one:**～**:one::zero: までのプロパティを説明しましたが、他にも Color や Fill
そしてコンボボックスならではの色変更もありますので
次の記事ではそちらをまとめていきたいと思います！！




-------------------------------------
2025年5月7日追記
③についての記事も作成しましたのでぜひご覧ください。

https://qiita.com/Sanwa_Paint/items/5efc80bdd0adde8f55f2
Raspberry Pi PicoでPicoMite(MMBasic)を使う〜ADCの利用

Raspberry Pi PicoにはADCが3つ利用できる（31のGP26、32のGP27，34のGP28の各ピン）。ここではアナログ温度センサーLM61CIZで測定した温度をOLEDで表示してみる。

# 使用する部品

秋月電子通商の[高精度IC温度センサーLM61CIZ](https://akizukidenshi.com/catalog/g/g111160/)を使用する。この温度センサーは測定した温度に応じた電圧を出力する。部品自体はトランジスタと同じ形状をしている。
LM61の出力電圧$V_O$と温度$T$との関係はデータシートには次の式で示されている。
$V_O=100mV/^\circ C\times T + 600mV$
この式から温度$T$は次の式で得られる。
$T = 100\times(V_O - 0.6)[^\circ C]$

# 配線

## LM61との接続

Raspberry Pi PicoとLM61CIZとの接続を次の表に示す。

| LM61CIZのピン | Picoのピン(物理ピン) |
| :--------: | :-----------: |
|   +VS(1)   |    3v3(5)     |
|  VOUT(2)   |   GP26(31)    |
|   GND(3)   |    GND(33)    |

## OLEDとの接続

Raspberry Pi PicoとOLEDの接続を次の表に示す。

| OLEDのピン | Picoのピン(物理ピン) |
| :-----: | :-----------: |
|   VDD   |    3V3(36)    |
|   GND   |    GND(3)     |
|   SDA   |   GP14(19)    |
|   SCL   |   GPD15(20)   |

# 配線図

配線図を以下に示す。

<!-- ここに配線図 -->
![OLED-LM61PICO_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72921/29a09374-46c8-49de-a6e4-b56ef4fd6a27.png)

# プログラム

MMBasicでADCを利用するに下記の手順を踏む。
1. `SETPIN`コマンドで3つあるADCのピン(GP26、GP27、GP28)のいずれかをアナログ入力ピン（`AIN`）として設定する
2. `PIN`関数でそのピンの値（電圧）を読み取る
3. 読み取った値から温度を算出する

これはコマンドプロンプトでも確認できる。

```
> SETPIN GP26, AIN
> PRINT PIN(GP26)
 0.8601221001
```
次に、GP26ピンをアナログ入力(AIN)に設定し、5秒ごとにそのピンの電圧を読み取り、上記の変換式で温度を計算し、電圧と温度をOLEDに表示するプログラムを以下に示す。

```BASIC
CLS                                             ' Clear OLED screen
Dim V!, temp!, stemp$                           ' Define variables
SetPin GP26, AIN                                ' Set GP26 pin to analog input

Do
  V! = Pin(GP26)                                ' Get LM61 output voltage
  temp! = 100 * (V! - 0.6)                      ' Convert voltage to temperature
  stemp$ = Str$(temp!, 2, 1) + Chr$(&H60) + "C" ' Make string of temperature
  Text 0,  0, Str$(V!) + "V"                    ' Display LM61 voltage
  Text 0, 15, stemp$,,3                         ' Display temperature string at font #3
  Pause 5000                                    ' wait 5 sec
Loop

End
```

実行結果を以下に示す。
![IMG_0924.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72921/d0297c12-fdf4-41d3-b8a8-7391223421d5.jpeg)

# 参考：定義済み読み取り専用変数

定義済み読み取り専用変数はPicoMiteの稼働しているRaspberry Pi Picoのさまざまな情報を保持している。この変数の内容は`MM.INFO`関数で参照できる。

接続されているLCDパネルとGP26ピンの状態を

```
接続されているLCDパネルを表示
> PRINT MM.INFO(LCDPANEL)
SSD1306I2C

GP26（物理ピン31）の状態を表示
> PRINT MM.INFO(PIN GP26)
AIN
```


# 参考サイトなど

- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)
- [LM61 2.7V、 、SOT-23ま また たは はTO-92温 温度 度セ セン ンサ ](https://www.ti.com/jp/lit/ds/symlink/lm61.pdf?ts=1746158384370&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252Fja-jp%252FLM61)
AWSクラウドプラクティショナー合格の体験記（AWS CLF-C02）

こんにちは、なさです。
AWSクラウドプラクティショナーに合格しましたので、勉強方法や自身の体験などを書きたいと思います。
今後受験する方に少しでも参考になれば幸いです:relaxed:

## はじめに：簡単な自己紹介
とある会社でエンジニアとして日々生きています。
AWSを利用する案件もあり、AWSを全く知らないというわけではないですが、AWSの知識・経験ともにまだまだヒヨコです。
そんな中、しっかり基礎を覚えたいと思ったこと、覚えるならアウトプットしていきたいと思ったことから今回認定資格試験に挑戦を始めた次第です。


## AWSクラウドプラクティショナーとは
>AWSクラウドの基礎的な理解を目的とした知識ベースの認定
>事前の経験は必要ありません。

AWS認定の公式ページで記載されている文章です。
この言葉の通り、複数ある認定資格の中でも最も易しい試験になります。
しかしながら軽くみて受験すると痛い目にあいます。。。
というのも私がまさにそうで１回不合格になっています💦（そのあたりは後述）

試験時間は90分間で、65問の選択式問題が出題されます。
すべてが１問１答ではなく、問題によっては正解が２つ以上の問いもあります。
ですので、事前に必ず問題集などで感覚を掴んでおくことが大事だと思います。


## 勉強方法
私は合計で３つを使用しました。

#### １．AWS Skill Builder　「AWS Cloud Practitioner Essentials (日本語)」
[AWS Cloud Practitioner Essentials (日本語)](https://explore.skillbuilder.aws/learn/courses/1875/aws-cloud-practitioner-essentials-ri-ben-yu)

無料の学習コースで動画を見ながらAWSの基礎を学べます。
最後には認定テストもあり、何から手をつけたらいいのか分からない場合、まずこれから手を出して学習してみるのがオススメです。
動画では例え話に沿って説明してくれるので、AWSで利用できるサービスがどのようなものなのかイメージしやすかったです。

しかしながらこれ１つだけでは合格できませんでした:sweat_smile:
私の物覚えの悪さが原因かもしれませんが・・・


そんな苦い経験から以下の２つを追加で使用しました。

#### ２．AWS教科書 AWS認定クラウドプラクティショナー テキスト＆問題集
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067221/016ef2ab-9f1a-48f8-98f6-37afe780475a.jpeg">

[AWS教科書 AWS認定クラウドプラクティショナー テキスト＆問題集](https://www.amazon.co.jp/AWS%E6%95%99%E7%A7%91%E6%9B%B8-AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%85%A4%E7%94%B0-%E5%BC%98%E6%B3%95/dp/4798183253/)

もう一度基礎から知識を身につけようとこの書籍を使いました。
図や表が豊富で、サービスの特徴や違いが視覚的にも理解しやすかったです。
章末には確認問題もあるため、知識を定着させながら進められました。
最終的にはこのテキストの模擬問題を繰り返し解いたことが、合格への大きな後押しになったと感じています。

#### ３．Udemy 【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）

https://www.udemy.com/course/aws-4260

本番形式に慣れるため、Udemyの模擬試験問題集を活用しました。
時間配分の感覚や出題傾向を掴むことができ、本番でも落ち着いて問題に取り組めました。
**基本レベル**と**本番レベル**の２つがあり、本番レベルを60%以上正答できるまで学習を取り組みました。

## テストセンターでの受験

受験方法には以下があります。
- テストセンターで受験
- オンライン受験

私は２回ともテストセンターで受験しましたので、その体験を記述します。
まず、事前に注意事項は読んでおくことが大切です。
身分確認の持ち物だったり、受付には15分前に着いていることなど書かれています。
受付する部屋と受験する部屋は別れています。
持ち物をすべてロッカーにしまうのですが、ティッシュ数枚を持ち込むことができたのは花粉症の私にとって最高でした👍
必要な人には耳栓も用意してありましたね。

## 終わりに

1度目の不合格という悔しい経験もありましたが、2度目の挑戦で合格できたのは、学習方法を見直し、繰り返しアウトプットしたことが大きかったと感じています。
これから受験を検討している方は、「基礎を理解する」「問題を多く解く」「間違えたところを復習する」という流れを意識するのがおすすめです。

少しでもこの記事が皆さんの学習の参考になれば嬉しいです。
最後まで読んでいただきありがとうございました！
AWS の EC2(Amazon Linux 2023) で Django 実行

AWS の EC2 の Amazon Linux 2023 に python(pyenv) インストールして Django を実行した時の備忘録メモ
実施したのは 2025/05/02 時点です

- ざっくり流れ
    1. EC2インスタンス起動
    1. EC2ログイン
    1. python(pyenv) インストール
    1. Django インストール・作成・起動
    
- 環境情報
    - EC2 (Amazon Linux 2023)
    - pyenv v2.5.5
    - python v3.13.3 (pip v25.0.1)
    - Django v5.2
    - Windows11
    - Tera Term v5.2

# EC2インスタンス起動

AMI は Amazon Linux 2023にして ssh で接続するのでキーペアとかちゃんと設定する
Django で使うポート(デフォルトは 8000 )を外部から接続できるようにセキュリティグループを追加
そのほかは自由でOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/1cb90019-e4e7-66f0-ced6-4d60f20534e3.png)

# EC2ログイン

windows pc でTeraTerm でアクセス
ホストに EC2 の パブリックIP、ユーザ名 `ec2-user`、認証方式を RSA 鍵使うにして秘密鍵に pem ファイルを指定 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/90cc5329-1f0c-5c2b-9942-5060dfeceb8e.png)

- root に変更
    ```terminal
    sudo -i
    ```

# python(pyenv) インストール

python インストールで複数バージョンの切り替えに対応できるように pyenv を使ってインストールする
依存ライブラリのインストールは色んなやつを参考に適当にやってます

- 依存ライブラリインストール
    ```terminal
    yum install -y bzip2 bzip2-devel gcc git libffi-devel readline readline-devel sqlite sqlite-devel zlib-devel libdb-devel gdbm-devel xz-devel tk-devel uuid-devel libuuid-devel openssl-devel 
    ```

- pyenv インストール
    ```terminal
    yum install -y bzip2 bzip2-devel gcc git libffi-devel readline readline-devel sqlite sqlite-devel zlib-devel libdb-devel gdbm-devel xz-devel tk-devel uuid-devel libuuid-devel openssl-devel 
    ```

- pyenv パス設定
    - `~/.bashrc` に以下を追記
        ```:~/.bashrc
        export PYENV_ROOT="$HOME/.pyenv"
        [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
        eval "$(pyenv init -)"
        ```
    - 設定読込
        ```terminal
        source ~/.bashrc
        ```

- pyenv バージョン確認
    ```terminal
    pyenv -v
    ```

- python インストール
    ```terminal
    pyenv install 3.13.3
    ```

- python 使用バージョン設定
    ```terminal
    pyenv global 3.13.3
    ```

- python, pip バージョン確認
    ```terminal
    python -V
    pip -V
    ```

- 補足：pyenv いろいろ
    - インストールするバージョン情報取得
        ```terminal
        pyenv install --list
        ```
    - インストール済バージョン確認
        ```terminal
        pyenv versions
        ```
    - 全体で使用するバージョン指定
        ```terminal
        pyenv global バージョン
        ```

# Django インストール・作成・起動

- Django インストール
    ```terminal
    pip install Django
    ```

- Django プロジェクト作成
    ```terminal
    django-admin startproject projectname
    ```

- Django プロジェクトに移動
    ```terminal
    cd projectname
    ```

- Django 接続許可ホスト設定
    - `settings.py` の `ALLOWED_HOSTS` を設定（とりあえず起動で使ってるサーバIPを設定）
    ```python:./projectname/settings.py
    ALLOWED_HOSTS = ['パブリックIP']
    ```

-  Django アドレス指定実行
    ```terminal
    python manage.py runserver 0.0.0.0:8000
    ```

- アクセス確認
    外からつながるようにしてたらアクセスできるはず．．．
    http://パブリックIP:8000
【2025年問題】1万円以下で買える企業放出PCは、子供に最高の学習ツールかもしれない話

# 【2025年問題】1万円以下で買える企業放出PCは、子供に最高の学習ツールかもしれない話

> **2025年10月、Windows10のサポートが終了します。**

このタイミングで、全国の企業が **Windows11に非対応のパソコンを大量に処分**し始めます。

そして市場には、  
**安全とは言えないが、子供には十分すぎるPCが1万円以下で溢れかえる**のです。

---

## ⚠️ まずは「安全性の話」から

サポートが切れたOSを使うのは危険です。

- ❌ 銀行・証券・マイナンバー関連操作はNG
- ❌ 個人情報を扱う用途にも向きません
- ⚠️ 楽天証券のハッキング事件も、2段階認証を突破されて発生

つまり「家庭用PC」や「仕事用PC」としては、**推奨できません**。

---

## ✅ それでも子供には最高の学習ツール！

制限された用途であれば、むしろ最適！

### 子供が学べること（一部）

| 分野               | 内容例                             | 難易度 |
|--------------------|------------------------------------|--------|
| プログラミング     | Scratch、Python入門                | 初級   |
| ゲーム開発         | Unity、Godotなど                   | 中級   |
| アプリ開発         | Android Studio、PWAなど           | 中級   |
| 動画編集           | OpenShot、Shotcutなど             | 初級   |
| タイピング・文章   | Googleドキュメントやブログ執筆    | 初級   |

> **「使い方を限定する」＝安全で創造的な環境に変える鍵！**

---

## 💰 価格は？ → 1万円、もしくはそれ以下

企業から放出されるPCの多くは次のような構成：

| 項目            | 内容例                              |
|------------------|-------------------------------------|
| CPU              | Intel Core i5 第4〜6世代など         |
| メモリ           | 4GB〜8GB                            |
| ストレージ        | SSD搭載モデルも多い                 |
| 価格帯           | **¥5,000〜¥10,000** が目安           |

- ヤフオク、メルカリ、ジモティー等で大量出品されると予想
- 安全性を「割り切る」ことで、**圧倒的なコスパ**

---

## 🖥 Windows10のまま使っていいの？

> **動くならOK。何もしなければ壊れません。**

もちろん、リスクはあるものの「学習専用PC」であれば許容できるケースが多いです。

### ❌ Linuxなら軽い？→ 必ずしもそうではない

例：Zorin OS を入れた MacBook Air 2015 (Core i5, 4GB)  
→ **動作が重くて実用不可でした**

Linuxは軽いという神話もありますが、**相性やチューニング次第**です。

### 試したZorinOS使用環境
1. SLACKアプリで10チャンネル開く
2. chromeで10タブ開く
2. この状態でSLACKの通知を開いたら固まる
2. Chromeでタブ切り替えた瞬間にも固まる
2. たぶん、Chromeタブ3つぐらいでブラウジングするだけなら固まらない


---

## 💡 どうしても不安な人へ → ChromeOS Flexがおすすめ

もしセキュリティがどうしても気になるなら、

- ✅ Googleが提供する軽量OS
- ✅ 古いPCを「Chromebook化」できる
- ✅ 小学校の端末としても利用されている
- ✅ 基本はWebアプリで完結する設計

```bash
ChromeOS Flex インストール手順（概要）
1. USBメモリを準備（8GB以上）
2. Chromebook Recovery Utilityを使って書き込み
3. 古いPCに挿して起動 → インストール
basic en  Español 

El ORIGEN de BASIC
https://www.youtube.com/watch?v=34hxlKuJbfI

Estudié COBOL, FORTAN y BASIC aproximadamente al mismo tiempo.
COBOL, FORTANとBASICは、ほぼ同時に勉強しました。

En BASIC, adapté un emulador de comunicaciones que había estado usando en la universidad.
BASICでは、大学で利用していた通信エミュレータの移植をしました。

Los 8 Hijos de BASIC
https://www.youtube.com/watch?v=Xfs0iVB7yHA

LinuxChad y así sucesivamente, スペイン語でプログラミング
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605


# Ref.
basic: プログラムジェネレータジェネレータ。構造屋(architect)としての成功事例3失敗事例６,
https://qiita.com/kaizen_nagoya/items/117c7a1b6dad97470ae9

三択、四択、五択クイズソフトの作成
https://qiita.com/kaizen_nagoya/items/7c19ead85cbf80b5aa2a

「項書き換え機能付きプログラム」のディスアセンブラの作成,
https://qiita.com/kaizen_nagoya/items/8b8fe645b06bc7eccefb

通信エミュレータの移植
https://qiita.com/kaizen_nagoya/items/ce505bbea4229b83e93b

dockerでBASIC:docker(116)
https://qiita.com/kaizen_nagoya/items/b08215976bf07c85ca45

basic 気体の体積の変化 プログラムどうやって動かせばいい？
https://qiita.com/kaizen_nagoya/items/676c1eb1c4b9ad0e5be8

Microsoftとの歴史　Basicに始まり、Cコンパイラ、Windows95、Git(9)hubまで
https://qiita.com/kaizen_nagoya/items/d7c0cc257e99de0573cf

C#, Visual Basic and python
https://qiita.com/kaizen_nagoya/items/653f4718f795984f3fb7

IchigoJam普及のためにしたこと 制御(35)
https://qiita.com/kaizen_nagoya/items/b6c0242a29e2f3f991ee

IchigoJam触ろうとしています。
https://qiita.com/kaizen_nagoya/items/2b1363f177645ccbe4ef

HP: 40年(60年）でソフトウェア開発の景色はどのぐらい変わったのか？仮説（165）
https://qiita.com/kaizen_nagoya/items/54c17cf751894eef56f8

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
Snowflakeで数値型カラムに異なる型を挿入するとどうなる？

**Qiita初投稿です！**

業務で **Snowflake** を使っていて、数値型のカラムに異なる型の値を挿入した場合の挙動を確認しました。

例えば：

- 整数型のカラムに小数を入れるとどうなる？
- 小数型のカラムに桁数が多すぎる数を入れるとどうなる？

## テーブル定義と検証コード

```sql
-- テーブル作成
CREATE OR REPLACE TABLE sample_table (
    id VARCHAR,
    quantity INTEGER,
    price NUMBER(10,2)
);

-- 通常の挿入（期待される型で）
INSERT INTO sample_table (id, quantity, price)
VALUES ('A001', 10, 99.99);

-- 整数型カラムに小数を挿入（quantity に 12.34）
INSERT INTO sample_table (id, quantity, price)
VALUES ('A002', 12.34, 49.99);

-- 小数型カラムに整数を挿入（price に 50）
INSERT INTO sample_table (id, quantity, price)
VALUES ('A003', 20, 50);

-- 小数型カラムに小数部の桁数が溢れる小数を挿入（price に 50.12345）
INSERT INTO sample_table (id, quantity, price)
VALUES ('A004', 20, 50.12345);

-- 小数型カラムに整数部の桁数が溢れる小数を挿入（price に 500000000000.01）
-- エラーになり実行不可
INSERT INTO sample_table (id, quantity, price)
VALUES ('A005', 20, 500000000000.01);

-- 結果を確認
SELECT * FROM sample_table;

```

| ID   | QUANTITY | PRICE |
| ---- | -------- | ----- |
| A001 | 10       | 99.99 |
| A002 | 12       | 49.99 |
| A003 | 20       | 50.00 |
| A004 | 20       | 50.12 |


## 考察

- `INTEGER` カラム（`quantity`）に `12.34` を挿入すると  
  → **小数点以下が切り捨てられて `12` に** なった  
- `NUMBER(10,2)` カラム（`price`）に `50` を挿入すると  
  → **自動的に `50.00` と変換されて挿入された**  
- `price` に `50.12345` を挿入すると  
  → **小数第3位以下が切り捨てされて `50.12` に** なった  
- `price` に `500000000000.01` を挿入しようとすると  
  → **定義された精度 `NUMBER(10,2)` を超過しているためエラーとなる**

## まとめ

Snowflakeでは、数値型カラムに異なる形式の数値を挿入した場合でも、  
**可能な限り自動的に型変換や丸め処理が行われる**ため、多少の型の違いであれば許容される！

ただし、以下の点には注意！：

- **整数型カラムに小数を入れると小数点以下は切り捨てられる！**
- **小数型カラムでは定義した小数部の桁数（スケール）を超えると切り捨てられる！**
- **桁数の制約（整数部の桁数超過）はエラーとなる！**