OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder ABC411 振り返り(緑コーダーがPythonでABC問題)

## ABC411を振り返ります

https://atcoder.jp/contests/abc411

今回はABCまで3問解答(1ミス)でした。久々に灰色パフォーマンスでした。
C問題でなかなか解法がわからず、時間がかかった上に1ミスしてしまいました。
前回(ABC410)はいい成績だったのですけど、安定して好成績を出すのは難しいですね...

## [A - Required Length](https://atcoder.jp/contests/abc411/tasks/abc411_a)

文字列長がL以上かどうかを判定する問題です。素直に解きました。

``` python
P = input()
L = int(input())
# 文字列長がL以上かどうかを判定する
print("Yes" if len(P) >= L else "No")
```

## [B - Distance Table](https://atcoder.jp/contests/abc411/tasks/abc411_b)

スタート地点を固定して、そこから後ろの点への距離を計算します。

``` python
N = int(input())
D = list(map(int, input().split()))
D.insert(0, 0)

# スタート地点をiに固定して、そこから後ろの点への距離を計算する
for i in range(N - 1):
    distance = 0
    answers = []
    for j in range(i + 1, N):
        distance += D[j]
        answers.append(distance)
    print(*answers)
```

## [C - Black Intervals](https://atcoder.jp/contests/abc411/tasks/abc411_c)

最初は「Union-Findを使うのか?」とか、色々迷ってしまって誤答してしまいました。

その後、黒いマスが増えたとき/減ったときのエリア数の変化だけに注目すれば良いことに気づき、解けました。

``` text
白いマス=0, 黒いマス=1として考えます。真ん中が0→1になったとき、両隣のマスによって、黒エリアの数がどう変わるかを考えます。

両隣が0であれば、エリア数が1増えます。
0 0 0 → 0 1 0

どちらか1つが1であれば、エリア数は変わりません。(既存エリアにくっつくので)
1 0 0 → 1 1 0

両隣が1であれば、エリア数は1減ります。（既存の2エリアを1つに統合するので）
1 0 1 → 1 1 1
```

1→0になったときも、同じようにエリア数の増減を考えます。


``` python
N, Q = map(int, input().split())
A = list(map(int, input().split()))

boxes = [0] * (N + 2)
area_count = 0

for i in range(len(A)):
    index = A[i]
    new_value = 1 if boxes[index] == 0 else 0
    boxes[index] = new_value

    # 黒いマスが増えたとき
    if boxes[index] == 1:
        # 両隣が0であれば、エリア数が1増える
        if boxes[index - 1] == 0 and boxes[index + 1] == 0:
            area_count += 1
        # 両隣が1であれば、エリア数が1減る
        elif boxes[index - 1] == 1 and boxes[index + 1] == 1:
            area_count -= 1

    # 黒いマスが減ったとき
    if boxes[index] == 0:
        # 両隣が1であれば、エリア数が1増える
        if boxes[index - 1] == 1 and boxes[index + 1] == 1:
            area_count += 1
        # 両隣が0であれば、エリア数が1減る
        if boxes[index - 1] == 0 and boxes[index + 1] == 0:
            area_count -= 1

    print(area_count)
```
【備忘録】sysモジュールの使い方まとめ（Python）

## はじめに

datetimeモジュールを使ってカレンダーを実装する課題で、ターミナルから引数を受け取るためにsysモジュールを使用しました。
備忘録として、基本的な使い方をまとめました。

## 使う前に import

```python
import sys
```
sysは標準ライブラリ含まれるモジュールで、print() や len()などのbuilt-in functionとは異なり使う前に import が必要です。

## sys.argv

```python
import sys
print(sys.argv)
```

sys.argv はコマンドライン引数のリストです。sys.argv[0] はスクリプト自身のファイル名で、sys.argv[1] 以降が実際の引数になります。

実行例：

```bash
python myscript.py -m 2
```

```python
['myscript.py', '-m', '2']
```

## sys.exit()

```python
if not 1 <= month <= 12:
    print(f"{month} is neither a month number (1..12) nor a name")
    sys.exit(1)
```
引数に終了コードを入れることで、プログラムが終了されます。
sys.exit(0) は正常終了、sys.exit(1) はエラー終了を意味します。


## sys.path

```python
import sys
print(sys.path)
```

importされたときに、built-inモジュール以外のモジュールを検索するパスの一覧を取得できます。スクリプトの中で使いたいモジュールはsys.pathの中に記載されている必要があります。
別のプロジェクトで作ったモジュールのパスは、sys.path.append(PATH)で追加できます。



## カレンダー作成の際の月指定オプションの例

```python
import sys

if "-m" in sys.argv:
    if len(sys.argv) < 3:
        print("Please specify 1~12 after the -m option")
        sys.exit(1)
    try:
        month = int(sys.argv[2])
    except ValueError:
        print("Please specify 1~12 after the -m option")
        sys.exit(1)
    if not 1 <= month <= 12:
        print(f"{month} is neither a month number (1..12) nor a name")
        sys.exit(1)

        
```

## 参考リンク
https://docs.python.org/ja/3/library/sys.html

## おわりに
今回はsysモジュールについてまとめました。
コマンドライン引数処理やエラーハンドリングの際に使用できるモジュールとして抑えておきます。
これからも少なくとも実装で使ったモジュールについてはしっかり抑えるクセをつけておこうと思います。
stability matrix で comfy ui faceswap

facesawap.json を
https://github.com/dataleveling/ComfyUI-Reactor-Workflow/blob/main/faceswap.json

からダウンロード。

comfyui にインポート

1 ReActor ノード本体をインストール
Stability Matrix 左ペイン Extensions を開く。

検索に

コピーする
編集する
comfyui-reactor
と入力 → ComfyUI-ReActor（作者 Gourieff）を Install。


1 に、元画像
2 に、イメージチェンジ後の参考画像（i2i）
3 に、1の画像を動画にしたい動画(i2v)

とそれぞれ入力。

4,5のモデルを変更
（赤枠エラーが出たら、そこを修正。）

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/137425e2-1fc0-473e-aa6b-36db4703ef97.png)

これで動画が生成できる。

# 生成時間は？

RTX4060
メモリ128GBで

i2i
画像が1分30秒

i2v（約15秒の動画を指定）
16分18秒

しかも、フレームレートを初期値なので、若干カクカクするが、
表情までしっかり再現されるのでこれはやばいと思う。


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/6d54f7c9-2668-4282-a3a2-f8332996fb20.png)
プログラミング初心者の決意表明

## 決意表明

プログラミング向いてるんじゃない！？と知人に言われた言葉を信じてやってみようと思います。
前の職場は、スキルが身につかないかつ適正がないので、どうにか今より年収が高くて、ずっと在宅で完結する仕事がしたいと思って頑張りたいなと思います。

## 目標
2025年10月：働きはじめる！
9月：転職活動開始
7月～8月：15:30~19:30まで勉強

## めんどいなと思う自分へ
ごにょごにょあーでもないこーでもないってやらず、とりあえず仕上げる！

朝起きたら、パソコンのロックを解除してから朝ごはん食べる！

とりあえず1日1記事完成させる！

ラジオ聞きながらでいいからパソコンと向き合う！

10本目から、30分かからず書けるようになるといいな！

## 学習予定

本を読んで理解する

記事を書く
┗　HTTPでやり取りする仕組み
　┗　①HTTPメッセージ、HTTPメソッド　（01~03）2025年6月23日（月）
　┗　②代表的なステータスコード (57p)
　┗　③HTTPS/SSL、TLS、暗号化について (10~11、68p)
　┗　④ステートフルとステートレスについて (12)
　┗　(13)
　┗　(15)

 続く。。。。。。。

 がんばれーーーーー
なぜKotlinにもOption<A>が必要なのか

簡潔なタイトルにしたかったのでいろいろ情報が足りていない。順を追って説明していく。

ここでの前提として、Kotlinで関数型プログラミングをしようとしている。

# `Option<A>`とは

関数型プログラミングでしばしば使われる型のことだ。`Option<A>`の存在意義を語るには必然的にnullについて触れる必要がある。関数型プログラミングの思考を突き詰めれば純粋関数を常に作る・扱うことに行き着く。ひとまず純粋関数の定義を復習する。

- 戻り値は常に一つ
- 関数は引数にのみ基づいて戻り値を計算する
- 関数は既存の値を変更しない

では一つ問おう。このScalaのコードは嘘をついているか？

```scala
def extractYear(date: String): String = {
  if (date != null && date.matches("\\d{4}-\\d{2}-\\d{2}")) date.substring(0, 4)
  else null
}
```

答えはYesである。この関数はStringを返すと言っていながら、実は`null`を返す可能性もある。では嘘をつかせないためにどうするかというと、関数型プログラミングでは往々にして`Option`という型を使う。上記のコードを`Option`型を使って直すとこうなる。

```kotlin
def extractYear(date: String): Option[String] = {
  if (date == null || !date.matches("\\d{4}-\\d{2}-\\d{2}")) {
    None
  } else {
    Some(date.substring(0, 4))
  }
}
```

Optionでは`Some`と`None`というサブタイプを用いる。値が取得できれば`Some`を。取得できなければ`None`という値を返す。この状態であればシグネチャは嘘をついていない。

# Kotlinにおける`null`

さて、ここまでの話を聞いてKotlinを知っている人であれば「？？？」となっているだろう。それもそのはず。Kotlinでは`Option`などと長々と書かずとも?と書けばそれで「`null`を返すかもよ」と表現できるからだ。これがJavaやScalaにはないKotlinの強みと言って良い。

```kotlin
fun extractYear(date: String?): String? {
    return if (date != null && date.matches(Regex("\\d{4}-\\d{2}-\\d{2}"))) {
        date.substring(0, 4)
    } else {
        null
    }
}
```

# ネストされたnull許容性の問題

以上から、「Kotlinでは`Option`なんてものは必要ない。便利だね！」 …という話になると思っただろうか？残念ながらそうはならないのだ。結論から言うとKotlinにおいても`Option`が必要になる場面がある。

さて、以下のようなコードがある。このテストは成功するだろうか？

```kotlin
    fun <A> List<A>.firstOrElse(default: () -> A): A = firstOrNull() ?: default()

    @Test
    fun `リストの先頭がnullの場合、firstOrElseはnullを返す`(){
        assertEquals(null, listOf(null, 2, 3).firstOrElse { -1 })
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/3f7a288c-877b-44d5-9a6a-3e0c4d0d3d6f.png)

そう、この場合テストは成功しない。これがいわゆる**ネストされたnull許容性の問題**である。

# 問題を解決するための道具: Arrow

では以上の問題を解決するにはどうするか。要はリスト自体が存在すればその一番目の要素を`Some`。リストが`null`ならば`None`と扱えればよいのだ。そして一番目の要素が`null`ならば、それは`Some(null)`として扱うのである。しかし、これを実現する道具はKotlin本体に標準で備わっていない。よって`Arrow`というライブラリを使う。

https://arrow-kt.io/

これを使うことで以下のような表現が可能になり、テストが通るようになる。

```kotlin
    fun <A> List<A>.firstOrElse(default: () -> A): A =
        when(val option = firstOrNone()) {
            is Some -> option.value
            None -> default()
        }

    @Test
    fun `リストの先頭がnullの場合、firstOrElseはnullを返す`(){
        assertEquals(null, listOf(null, 2, 3).firstOrElse { -1 })
    }
```

あとは各種Option関係の関数の使い方を覚えれば良い。といっても関数型プログラミングを知っていれば出てくるアイツらだ。`isSome`, `isNone`, `getOrNull`, `getOrElse`である。

# おわりに

ArrowはKotlinで関数型プログラミングをする上で必須というか、事実上標準の地位を固めつつある。JetBrainsの公式ブログでもKtor×Arrowの事例を紹介してるくらいなので、ここから先Arrowも前提知識としてある程度知っておくほうがいいのかもしれない
未経験からの奮闘記１

こんにちは！無職から転職活動中のものです！
html、css、javascriptの学習を超高速で履修し、ReactとTypeScriptを学習し始めました。なんとなくわかってきたので早速、React,TypeScript,Next.jsを使った簡単なTodoアプリを作ってみようと思います。

##  使用技術

- フレームワーク：Next.js
- 言語：TypeScript
- その他：React Hooks（useState）

---
## プロジェクト構成

my-todo-app/
├─ pages/
│ └─ index.tsx
├─ tsconfig.json
├─ package.json
└─ ...

 Todo アプリのコード
Pages/todo.tsx

import { useState } from "react";

type Todo = {
  text: string;
  completed: boolean;
};

export default function TodoApp() {
  const [todos, setTodos] = useState<Todo[]>([]);
  const [input, setInput] = useState("");

  const addTodo = () => {
    if (input.trim() === "") return;
    const newTodo: Todo = { text: input, completed: false };
    setTodos([...todos, newTodo]);
    setInput("");
  };

  const toggleTodo = (index: number) => {
    const updated = [...todos];
    updated[index].completed = !updated[index].completed;
    setTodos(updated);
  };

  return (
    <div>
      <h1>Todo アプリ</h1>
      <input
        type="text"
        value={input}
        onChange={(e) => setInput(e.target.value)}
        placeholder="新しいタスクを入力"
      />
      <button onClick={addTodo}>追加</button>

      <ul>
        {todos.map((todo, i) => (
          <li
            key={i}
            onClick={() => toggleTodo(i)}
            style={{ textDecoration: todo.completed ? "line-through" : "none", cursor: "pointer" }}
          >
            {todo.text}
          </li>
        ))}
      </ul>
    </div>
  );
}


useState で Todo の配列と入力値を管理し、タスクの追加と完了機能の実装。
スタイルをにて完了したものに線を入れるなど少し見やすくしてみました。
pages/index.tsxからこのフォルダにルーティングし、そのページから動くよう設定し、Next.jsの便利機能の確認も行いました。

まとめ
Next.js のプロジェクト内でも、React の基本である状態管理（useState）とイベント処理で、簡単なアプリを実装できます。
TypeScript を使うことで、Todo の型定義なども明確にできました。

おわりに
このような活動は初めてなので大変緊張しました。そろそろ面接などの対策もしなくてはならないので不安で仕方がありません。同じような境遇にいる方、一緒に頑張りましょう。
次回は useReducer や localStorage を使った状態永続化など、Todo アプリを少し強化していく予定です。
この記事が少しでも参考になれば、LGTM やコメントいただけると励みになります！
AIでコード書くけど、あとで見つからない問題に悩んで「コード保管帳」を自作してみた話


最近、AIでコードを書くことが増えてきました。ChatGPTやClaudeにちょっとした処理をお願いすると、いい感じのコードがサッと出てきてすごく便利です。

### でも、便利すぎて、どこに保存したかわからなくなる問題が起きてこまっていました

**記憶力とフォルダ整理の限界!!　　趣味でちょこちょこコーディングしてると・・・**

- 「あれ、あのいい感じのやつどこだっけ…？」

- 「なんか雰囲気は覚えてるけど、細かい構文が出てこない」

- 「VSCodeに入れたのか、メモ帳に貼ったのか、AIの履歴に残ってたのか…」

　ってことが結構あって。

**しかも中年にもなると、新しく覚えたことがスルスル抜けていく感覚があります。**

## スニペットアプリを探したけど…

ちゃんとしたスニペット管理アプリもいろいろ試しました。でも、「プロ用は実務向けで学習向きじゃないなー」とか設定が複雑だったり、ショートカットを忘れてしまったりで、結局あまり使わなくなってしまいました。



### 自分がほしいのはもっとシンプルなもの。
- マウスで操作できて

- 見た目もわかりやすくて

- **自分用のメモも一緒に残せて**

- **タグとかで整理しやすくて**

- 完全オフラインで安心して使えるやつ

**そんなわけで、「コードスニペット帳」を自作してみました。**

## 作ったもの：　「ワンクリックMyコード」

HTML / CSS / JS だけで動く、シンプルなコード保存アプリです。

特にこだわったのは：

- コードをワンクリックで保存

-  **自由**にタグをつけて分類・**並び替え**

-  自由にコメントをつけて登録できる

-  コードをクリックするだけで**クリップボードにコピー**できる！！


-  登録したコードはいつでも再編集可



- 言語ごとに**ハイライト**します

**自分だけの「コード辞典」として使える!!**

他にも



-  保存はブラウザのローカルストレージ

-  JSONでバックアップ＆復元もOK

- 登録したコードの配布もできる

- バックアップからの復元もドラッグ&ドロップでOKコードの説明や、検索タグも自分で入れられます


## UIはこんな感じ

🔗 体験版はこちら - github版（UIお試し版）
https://taro-mura.github.io/code-snippet-app_jp/

- タグをドラッグして並び替え

- タグで検索して目的のコードをすぐ表示

- 「COPY」ボタンでコードを即コピー



🔗 **フル機能はこちら** - github版
https://taro-mura.github.io/code-snippet-app_full/

- **コードを登録できる**　※自由に説明を書いて自分の理解を残すことができる
- 登録した内容をjsonでバックアップできる
- jsonをドラッグ&ドロップでアップロードできる
- **注意**：バックアップしないとキャッシュクリアで全て消えます

## 活用方法はこんな感じをイメージしています

- 日々のコードメモ帳として

- AIからもらったコードの保管庫として

- 学習の記録・自分用リファレンスとして

- 「コピペじゃないけど、自分で書き直すほどじゃないコード」の置き場に

## 販売ページも作ってみました

もし、**「オフラインで使いたい」「自分でもっとカスタマイズしたい」** と思った方は、ぜひ覗いてみてください。


 オフラインでも使えるダウンロード版（￥300）→ https://kenji-webapps.booth.pm/items/7049605

 　※html,css,jsが全てzipに入っているので、自分でいくらでもカスタママイズできます。好きな機能を足したり、色を変えたりといい感じにしてください！

## おわりに

最初は「どうせ自分用だし…」という軽い気持ちで作り始めたんですが、気づいたらUIにこだわりすぎて、けっこうちゃんとした見た目になりました。せっかくなので、同じ悩みを持っている人に使ってもらいたいです。

**AIと一緒にコードを書き始めた人**、**プロ用ツールにちょっと抵抗がある人**、にも、ちょっとだけ便利な「相棒」になるかもしれません。

## ご意見・フィードバック歓迎！

「こういう機能があったらいいな」などあれば、ぜひコメントで教えてください。改善のヒントになります！
Azure AI900合格体験記

# 【合格体験記】社内で生成AI担当になって一カ月目でAzure AI Fundamentals (AI-900) に一発合格した話

## 🎯 はじめに

こんにちは、ネギトロです。普段はDX推進室で社内向けの生成AI開発をしています。
今回は **「Azure AI Fundamentals (AI-900)」** に合格したので、その勉強法や試験のポイントについてまとめてみました。

この記事はこんな人におすすめです：

- AzureのAI系試験に初挑戦する人
- G検定などとの違いを知りたい人
- 社会人で時間のない中、効率よく合格したい人

---

## 🧪 AI-900ってどんな試験？

### ✔️ 概要

- **正式名称**：Microsoft Certified: Azure AI Fundamentals  
- **対象者**：AI初学者、業務でAI/MLを扱うビジネス担当、開発者の入門  
- **出題形式**：選択肢・ドラッグアンドドロップなど（CBT形式）  
- **試験時間**：60分（+アンケート含め90分程度）  
- **合格点**：700点（1000点満点）  
- **受験料**：12,500円（税込）

---

## 📚 使用した教材

### ① MCP教科書　Microsoft Azure AI900

-  AIの基礎も学べて、AzureのAIサービスに関してどのようなものがあるか学ぶことができる。クライアントから課題を提示された時に、どのサービスを使うべきかの引出しが増える。
- 初心者にもわかりやすく、試験対策にもバッチリ👌

### ② Udemy 模擬試験

- 『【2024年最新版】Azure AI Fundamentals (AI-900) 模擬試験 
- 模擬試験で本番形式に慣れるのがおすすめ
- 本番同等の難易度
---

## 🕒 勉強時間とスケジュール

| 期間   | 内容                                | 時間 |
|--------|-------------------------------------|------|
| 1週目  | MCP教科書　Microsoft Azure AI900       | 約5時間 |
| 2週目  | 模擬試験（Udemy）＆復習             | 約5時間 |

👉 **合計：約10時間で合格できました。**

---

## 💡 試験のポイント

### 出題の傾向（私が受けたとき）

- **AIの基本概念**：教師あり・教師なし・強化学習の違い  
- **Azureサービス**：Cognitive Services、Azure Machine Learning、Bot Service など  
- **実用例の理解**：「画像から感情を読み取るサービスは？」のようなケース問題  
- **責任あるAI**：公平性・説明性・プライバシーなどのAI原則も出題されました  

---

## 🧠 難易度と感想

正直、**IT初心者でもちゃんと勉強すれば受かります。**  
これからAzureを使っていく生成AI担当の方は全員受けてもいい資格だと思いました。

- G検定よりも**Azure実務に近い内容**
- Azureポータルの操作は問われませんが、サービス名の理解は必須
- 責任あるAIの項目が意外と多め

---

## 🎁 これから受ける方へ

- Microsoft Learnは**無料なのに超優秀**なので絶対やるべきです  
- 模擬試験は全てやっておくと安心です  
- 試験直前は、もう一度解くのがおすすめです  

---

## 📝 最後に

AI-900は、Azureを使ったAIサービスの**入門資格として最適**です。  
私自身もこの資格をきっかけに、Azure OpenAIやRAG開発に業務で関われるようになりました。

次は「DP-100」や「AI-102」など、さらにステップアップした資格にも挑戦したいと思います。
Geminiでカンガルーと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでカンガルーと遊ぶ魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
氷のカンガルーと遊ぶ魔法少女を描いてください。
```

![氷のカンガルーと遊ぶ魔法少女_20250622.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/848a43c4-b2b6-4d14-ab35-e188ebb30ba5.png)

# まとめ

可愛い。何かの役に立てばと。
Amazon Q CLIで作る(恋愛？)シミュレーションゲーム

# 初めに
Tシャツがもらえるというキャンペーンにまんまと釣られて
初めて記事を投稿してみます。
自分で一切スクリプトを書かずにゲームを作ってみる良い経験かなと思い参加しました。
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

# ゲームの概要
今回はAmazon Qを用いてゲームを作ってみるということで、
どうせならAWSを絡めたゲームにしようとの発想と
自分が比較的詳しいといえる恋愛シミュレーションゲーム（ノベルゲー）の要素を組み合わせたゲームにしてます。
AWSに詳しくない人が興味を持ってくれる導線ぐらいの立ち位置を目指しました。

![aws-dating-sim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2191619/b4c70e59-28a1-42cd-be63-3a366913d0ed.gif)

内容としては、自分がスタートアップ企業の偉い人で
3人のアドバイザーのうち誰をプロジェクトマネージャーにするか選ぶという形式です。
今回はEC2、Lambada、Fargateのどれをベースにするか選ぶことになりました。（割と詳細要件は記載せずふわっとさせてｍ）

# 作業内容
事前準備は[公式](https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows?trk=e07eca93-fa2f-4351-b567-f293b83eb635&sc_channel=el_)にて詳細にまとめてくれているので、サクサク終わりました。
AmazonQの方でチャットの履歴を持って無さそう？（一度はできましたがPCの電源を切ってなかったからかも）なので進捗をまとめたテキストを都度作らせるのがよさそうです。
翌日にまた作業を再開する際には、そのテキストを最初に読み込ませたところスムーズに続けられました。

# 作る上で意識した点
ノベルゲーでまず何より重要なのはキャラクター！
ということで3人のキャラクター設計をどうするかという所は割と引っかかるかと思ったんですが
サービスの選定はAmazonQ側で良い感じに選んでくれたのですんなり進みました。
各キャラクターの属性に関しては、ほとんど自分の方でキャラ付けしてます。
ただ最初の設定（語尾だったり雰囲気だったり）だけを渡したところ、セリフ自体はほとんどAmazonQに任せました。
ただ定期的に部分的なキャラ崩壊を起こしていたので都度修正していたのですが、
「キャラクターの設定シートを作れば安定する！」ということにだいぶ終盤で気づきました…
これは序盤にやるべきタスクだったかもしれません。

# 最後に
ゲームを作る上でテキストを読むことで、まるで触ったことのないFargateへの興味がわいたので
今年再取得予定のAWS SAAのモチベーションにつながったかも？
他の人への公開予定は未定ですが、評判が良ければほかのサービスを対象にいろいろ作るかもしれません。
なんにせよ、スクリプト面の技術力不足をまるで意識せずに指示出しするだけでそれっぽいゲームを作れるのは
非常に出来ることの幅が広がったなと思い知らされました。
【NFT入門】備忘録：ERC-721とNFTの基本を整理する


## ✅ ERC-721とは？

* Ethereum上でNFT（非代替性トークン）を実装するための標準インターフェース。
* NFTの**追跡**や**譲渡**など、基本的な機能を提供する**スマートコントラクトのAPI仕様**。
* 公式ドキュメント: [ERC-721: Non-Fungible Token Standard (ethereum.org)](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/)

---

## ✅ NFTの本質とは？

NFTは、以下の2つによって一意に識別されます：

* **コントラクトアドレス**
* **トークンID（tokenId）**

つまり、「このスマートコントラクトで発行されたこのIDのトークンは唯一無二」という意味になります。

> `tokenId` は基本的に不変であり、NFTを一意に識別するための鍵です。

---

## ✅ NFTはコンテンツを持つ必要がある？

厳密には **コンテンツの有無は問われません**。

* NFTは「一意な識別子」さえあれば成立します。
* ただし、一般的なNFT（アート、音楽、ゲームアイテムなど）は**コンテンツを持っていることが多い**です。

---

## ✅ NFTとコンテンツの紐づけ方法

1. `tokenId` ごとに **メタデータ（JSON形式）** を用意
2. JSON内に、画像や動画のURIを記述（例：`image` フィールド）

```json
{
  "name": "My NFT #1",
  "description": "This is a sample NFT.",
  "image": "https://example.com/images/nft1.png"
}
```

---

## ✅ コンテンツの配置場所

* コンテンツ（画像・音声・映像など）はデータサイズが大きくなりがち
* Ethereumのブロックチェーン上に直接格納するのは**非現実的**
* 通常は以下のいずれかの方法で保存：

| 方法     | 特徴                           |
| ------ | ---------------------------- |
| オフチェーン | 通常のWebサーバー、IPFS、Arweaveなどに格納 |
| オンチェーン | 小さいデータ（例：SVG）であれば格納可能。コストが高い |

---

## ✅ メタデータとコンテンツの配置パターン

| メタデータ  | コンテンツ  | 説明                        |
| ------ | ------ | ------------------------- |
| オフチェーン | オフチェーン | 一般的。コストが低く現実的             |
| オンチェーン | オンチェーン | 完全に分散化されるが高コスト            |
| オンチェーン | オフチェーン | メタデータだけオンチェーンに保管するパターンもある |

---

## ✅ オフチェーンNFTの例

1. コンテンツをオフチェーンにアップロード（例：IPFS、S3等）
2. アップロードURLを、メタデータの `image` に記述
3. メタデータをJSON形式で作成し、これもオフチェーンへアップロード
4. NFTのミント時に `tokenId` と `tokenURI` を指定

---

## ✅ オンチェーンNFTの例

* `tokenURI` に直接、Base64エンコードされたJSONを設定
* 画像（例：SVG）も Base64 で埋め込む

```solidity
function tokenURI(uint256 tokenId) public view override returns (string memory) {
    string memory json = Base64.encode(bytes(string(abi.encodePacked(
        '{"name": "OnChain NFT #', tokenId.toString(),
        '", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svgData)),
        '"}'
    ))));
    return string(abi.encodePacked("data:application/json;base64,", json));
}
```

---

## ✅ 所有者情報の管理

NFTの所有者情報はコントラクト内で管理されます：

```solidity
mapping(uint256 => address) private _owners;
```

* トークンIDをキーとして、所有者アドレスを記録します。
* 標準関数 `ownerOf(tokenId)` で所有者を確認できます。

---

## ✅ NFTのミント方法

* 通常は `mint(address to, uint256 tokenId)` のような関数を通じてNFTを発行。
* この時点では**コンテンツを持たないNFT**も作成可能です。
* 実際には、`tokenURI` を渡すことで、**メタデータとの紐づけ**も行います。

例：

```solidity
function mint(address to, uint256 tokenId, string memory uri) public {
    _mint(to, tokenId);
    _setTokenURI(tokenId, uri);
}
```

---

## ❓ 疑問：「ミント関数って何してるの？」

* `_mint(to, tokenId)`：指定されたアドレスに新しいNFTを割り当てます。
* `_setTokenURI(tokenId, uri)`：NFTにメタデータ（URI）を紐づけます。

つまり、NFTの「登録」と「意味づけ（メタデータ）」の2ステップを行っています。

---

## 📚 参考資料

* Udemy講座：[DApps × NFT入門](https://www.udemy.com/course/dappnft1/?couponCode=LOCLZDOFFPJPCTRL)
* OpenZeppelin ERC-721実装: [https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol)
* ERC-721 仕様: [https://eips.ethereum.org/EIPS/eip-721](https://eips.ethereum.org/EIPS/eip-721)
JDLA Generative AI Test#2025

合格してました。

JDLA Generative AI Testは、一般社団法人日本ディープラーニング協会（JDLA）が実施する、生成AIに関する基礎知識や活用リテラシーを測るためのオンライン形式のミニテストです。

2023年から、年に2回ほど開催されているAIに関わる基礎的（初歩的な？）なテストです。

試験料も2,200円と安く、指定時間内であれば自宅からサクッと受けられる非常にコンパクトなテストなので、気軽に受けれるしで非常にお勧めです。



テストの概要
---

テスト概要は以下のようになります。
| 項目 | 内容 |
|:-|:-|
| 対象者  | 誰でも受験可能（事前資格、前提条件不要）  |
| 試験形式  | 択一式・多肢選択式19問＋記述式1問（計20問）  |
| 試験時間  | 20分  |
| 実施方法  | オンライン（PC・スマホ対応）  |
| 受験料  | 2,200円（税込）  |
| 合格率  | 約60〜70%（回によって変動）  |
| 開催頻度  | 年2回（6月・12月）  |

<b>こんな人にお勧め</b>
- 生成AIの基礎を体系的に学びたい人
- 業務での活用を検討している人
- G検定やE資格の前段階として知識を整理したい人
- DX推進やAI導入の説得材料が欲しい人
合格者にはオープンバッジが発行され、スキルの証明にも活用できます。




ちなみに今回は1,677名が受験し、1,313名が合格したそうです。（約78%）

https://prtimes.jp/main/html/rd/p/000000226.000028865.html

ただ、こちら年2回開催なのですが、絶賛試験そのもののリニューアルを検討しているようで、次回開催は未定だそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103210/84738d16-5583-4a40-aa25-f790848b84b0.png)

https://www.jdla.org/certificate/generativeai/?utm_source=prtimes&utm_medium=referral&utm_campaign=_202506_009

シラバス
----

シラバスは以下のようになっています。よく出てくる（出てきそうな）キーワードも載せておきます。

<details open><summary><b>1. 生成AIの技術</b></summary>

- 大規模言語モデル（LLM）の構造と学習方法（例：トランスフォーマー、自己教師あり学習、ファインチューニング）
- 生成手法（Zero-Shot、Few-Shot、Chain-of-Thoughtなど）
- 性能評価と効率化（スケーリング則、量子化、LoRAなど）
- マルチモーダル化や外部ツール連携（RAG、エージェント、コード生成）

<b>キーワード</b>
| キーワード| 説明 |
|:-|:-|
| 大規模言語モデル（LLM）  | 膨大なテキストデータを学習し、自然言語を生成するモデル  |
| トランスフォーマー（Transformer）  | LLMの基盤となる深層学習アーキテクチャ  |
| 自己教師あり学習  | ラベルなしデータから特徴を学習する手法  |
| ファインチューニング  | 事前学習済みモデルを特定タスクに最適化  |
| Zero-Shot / Few-Shot / Chain-of-Thought  | プロンプト設計の代表的手法  |
| スケーリング則（Scaling Laws）  | モデル性能とパラメータ数・データ量の関係  |
| 量子化 / LoRA  | モデルの軽量化・効率化技術  |
| RAG（Retrieval-Augmented Generation）  |  外部知識を参照して生成する手法 |
| エージェント  | 複数のタスクを自律的に実行するAI構成  |

</details>

<details open><summary><b>2. 生成AIの利活用</b></summary>

- 活用事例とケイパビリティ（広告、業務効率化、創作支援など）
- プロンプトエンジニアリング
- 業界特化型の応用（ドメイン固有LLM、外部ツール呼び出し）

<b>キーワード</b>
| キーワード| 説明 |
|:-|:-|
| プロンプトエンジニアリング  | 生成AIに適切な出力を促す入力設計技術  |
| ケイパビリティ（Capability）  | 生成AIが持つ能力の範囲  |
| ドメイン特化LLM  | 特定業界・業務に最適化されたモデル  |
| コード生成 / 自然言語生成 / 画像生成  | 代表的な生成タスク  |
| 業務活用事例  | 広告、FAQ自動化、議事録要約、創作支援など  |


</details>

<details open><summary><b>3. 生成AIのリスク</b></summary>

- 技術的・倫理的・法的リスク（ハルシネーション、著作権、プライバシー、プロンプトインジェクション）
- 規制動向と自主対策
- 生成物の商用利用や利用規約の理解

<b>キーワード</b>
| キーワード| 説明 |
|:-|:-|
| ハルシネーション（Hallucination）  | 事実と異なる内容を生成する現象  |
| プロンプトインジェクション  | 意図しない出力を誘導する攻撃手法  |
| 著作権・利用規約  | 生成物の商用利用に関する法的留意点  |
| プライバシー・機密情報  | 個人情報や社内情報の取り扱いリスク  |
| 規制動向  | 国内外のAI規制やガイドライン（例：EU AI Act） |
  
</details>

試験を受けて
----

感想としては、とにかくコンパクトなので気軽に受けられます。
特に試験勉強ということはしておりませんが、最近ではAIに関するニュースや記事も多く、周りにありふれている情報をある程度キャッチアップしていれば非IT人材でも合格できると思います。

皆同じ問題が出ているのかわかりませんが、なんとなくプロンプトテクニック（生成手法）や生成物の扱い（著作権等）が多く問われているような気がしました。

なお、当方のAI関連知識は以下です。
AIとの付き合い方：ただの利用者。しかも無料範囲。開発は皆無（いつかやりたいという夢だけ持つ）
AI関連所有資格：G検定、AI-900（Azure AI Fundamentals）、AI-102（Azure AI Engineer Associate）

ゴリゴリAIの開発をしていたり、最先端で活躍している人たちには物足りないと思いますが、AI知識の導入としてはとても良い（何よりリスクが低い）試験だと思います。
※下手したら都内でちょっといいランチ食べるより安い。

ただ、とにかくリニューアル後の内容がわからないので、公表されてからどのようなものになるのか改めて見てみたいですね。（価格とかの敷居は、、、あまり上げないでほしいですね。）
AWS SAP合格メモ

🔥 権限制御 判定フロー (超重要！)
1. 「Organizations」って単語がある → SCP
2. 「異なるアカウント」「クロスアカウント」 → クロスアカウントIAM
3. 「S3バケット」「特定IP」「公開」 → リソースポリシー
4. 上記以外 → IAMポリシー
呪文：
「オーガニSCP、クロスでAssumeRole、
　S3はバケット、あとはIAM！」
🚀 リアルタイム通信
キーワード: 「リアルタイム」「即座に」「チャット」「ライブ」
→ 問答無用で AppSync + WebSocket
💾 キャッシュ戦略
CloudFront
静的コンテンツ用 = 削除するヘッダー/Cookie:
- User-Agent (両方から削除)
- Authorization (静的のみ削除)
- Session Cookie (静的のみ削除)
- Host (削除すべきだが、選択肢による)
ElastiCache
ランキング・リーダーボード = Redis ZSET
→ 圧倒的に高速、リアルタイム更新
🛡️ セキュリティ対策
WAF + ALB
「ブルートフォース攻撃」「Bot攻撃」
→ レートベースルール
→ CloudFront + WAF + カスタムヘッダー
暗号化
KMS使ってるリソースのクロスアカウント = 3つセット必須:
1. S3バケットポリシー
2. KMSキーポリシー  
3. IAMロールポリシー
📡 ネットワーク
NACL vs セキュリティグループ
NACL = ステートレス:
- インバウンド + アウトバウンド両方設定必要
- エフェメラルポート (1024-65535) 必須
VPCエンドポイント
「同じリージョン」「インターネット禁止」「SaaS連携」
→ PrivateLink (VPCエンドポイントサービス)
NAT Gateway コスト削減
「NAT Gateway高い」「Kinesis/S3/DynamoDBアクセス」
→ VPCエンドポイント作成
🎯 高可用性・DR
RTO/RPO要件
RTO < 5分, RPO < 1分 → Aurora Global Database
RTO/RPO緩い → リードレプリカ
Multi-AZ vs Multi-Region
Multi-AZ: 同一リージョン内の可用性
Multi-Region: 災害復旧・地理的分散
💰 コスト最適化
EC2
「予測可能なワークロード」→ Reserved Instance / Savings Plans
「中断OK」→ Spot Instance  
「バッチ処理」→ Spot + Auto Scaling
EMR
マスター・コア = オンデマンド (安定性)
タスク = スポット (コスト削減)
処理完了後 = クラスター全終了
ストレージ
アクセス頻度低い → S3 IA / Glacier
長期保存 → Glacier Deep Archive
🔄 データ移行
大容量データ (50TB級)
物理的に不可能な帯域 → Snowball + AWS SCT
リアルタイム同期 → DMS
データベース移行
Oracle → Redshift: AWS SCT + Snowball
継続的変更: DMS レプリケーション
📊 モニタリング・ガバナンス
AWS Config
「コンプライアンス」「継続監視」「リソース設定チェック」
→ Config Rules + アグリゲータ
Organizations
「複数アカウント」「アカウント急増」「一元管理」
→ 組織プリンシパル (o-xxxxxxxxx)
🏗️ Infrastructure as Code
CloudFormation
「将来の変更考慮」「自動化」「手順書更新」
→ CloudFormation + ドキュメント更新
AMI管理
「カスタムAMI」「全アカウント配布」
→ Image Builder + Service Catalog
🔐 接続・認証
リモートアクセス
「Bastionホスト問題」「ブルートフォース攻撃」
→ Client VPN + 証明書認証
SAML統合
「社内AD連携」「セッションタグ」「部署別制限」
→ SAML + aws:PrincipalTag 条件
⚡ パフォーマンス
データベース
読み取り集約 → リードレプリカ
キャッシュ → ElastiCache
分析 → Redshift
NoSQL → DynamoDB
CDN
「グローバル配信」「キャッシュ」「エッジ」
→ CloudFront
🎲 試験当日の裏技
迷ったときの判定順序
1. キーワードマッチング (上記フロー)
2. AWSマネージドサービス優先
3. 自動化・運用効率重視
4. セキュリティ・コンプライアンス重視
5. コスト効率重視
確実に間違いな選択肢
❌ 「手動で」「個別に」「毎回」
❌ 「すべて許可」「0.0.0.0/0」
❌ 古いサービス (EC2-Classic等)
❌ 非AWSサービス (Jenkins等) ← AWSサービスある場合
🏆 最終奥義
試験中に唱える呪文：
「マネージドサービス、自動化、セキュア、
　コスト削減、運用効率、スケーラブル！」
選択肢に迷ったら：
「一番AWSらしい、一番自動化されてる、
　一番運用が楽な選択肢はどれ？」
Ubuntu で Kubernetes 三昧その５-１(Weave Net CNI)

[Ubuntu で Kubernetes 三昧その４](https://qiita.com/intrajp/items/9f800a68502a845fd4f1)からの続きです。

[Network Plugins](https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-network-model)をインストールします。
サポートされているのは、[これらのプラグイン](https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy)になります。

ここでは、[Weave Net CNIプラグイン](https://github.com/rajch/weave#using-weave-on-kubernetes)をインストールしてみます。

Weave Net CNIプラグインのインストールは簡単です。マスターで、このコマンドを実行します。

```
@masternode1:~$ kubectl apply -f https://reweave.azurewebsites.net/k8s/v1.29/net.yaml
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
```
Pod が立ち上がったかどうか、確認します。
```
$ kubectl get pods -n kube-system
NAME                                  READY   STATUS    RESTARTS        AGE
coredns-674b8bbfcf-44dwf              1/1     Running   0               16h
coredns-674b8bbfcf-ppcj7              1/1     Running   0               16h
etcd-masternode1                      1/1     Running   2               16h
kube-apiserver-masternode1            1/1     Running   2               16h
kube-controller-manager-masternode1   1/1     Running   2               16h
kube-proxy-9n8hv                      1/1     Running   0               16h
kube-proxy-km2s7                      1/1     Running   0               16h
kube-scheduler-masternode1            1/1     Running   2               16h
weave-net-7jtp6                       2/2     Running   1 (4m10s ago)   4m26s
weave-net-v2fhz                       2/2     Running   1 (4m10s ago)   4m26s
```
ノードの状態はどうでしょうか。CNI をインストールする前は、両ノードとも、NotReady でした。
```
@masternode1:~$ kubectl get nodes
NAME          STATUS     ROLES           AGE   VERSION
masternode1   NotReady   control-plane   78s   v1.33.2
workernode1   NotReady   <none>          11s   v1.33.2
```
今回は、Readyになったでしょうか。
```
@masternode1:~$ kubectl get nodes
NAME          STATUS   ROLES           AGE   VERSION
masternode1   Ready    control-plane   16h   v1.33.2
workernode1   Ready    <none>          16h   v1.33.2
```
Readyになりました！

また、ワーカーノードからkubectl コマンドを実行しても、エラーにはならず、ちゃんと動きました。

[Ubuntu で Kubernetes 三昧その５-２(Weave Net CNI)](https://qiita.com/intrajp/items/c4288fef51988b992ac8)つづく

参考：

https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy
【情報整理用】データ基盤の全体像


### 1. 生成（ソース）

|カテゴリ|具体例|補足|
|---|---|---|
|アプリケーション|トランザクションDB、ログファイル、ユーザー行動データ|CRM、ERPシステムからのデータ（例: Salesforce, SAP）|
|IoT/デバイス|センサーデータ、画像/動画、時系列データ|MQTTプロトコル、エッジコンピューティング|
|外部データ|オープンデータ（政府統計）、SaaSデータ（Google Analytics）、サードパーティAPI|APIレートリミット、OAuth認証|
|ファイル|CSV/JSON/Excel、PDF/ドキュメント、音声ファイル|非構造化データの扱い（NLP処理が必要な場合）|



### 2. 収集（取り込み）

|カテゴリ|技術・ツール例|考慮点|
|---|---|---|
|バッチ収集|ETL（Airflow, Talend）、CDC（Debezium）、スクレイピング（BeautifulSoup）|スケジューリング、差分更新の効率化|
|ストリーミング|Kafka, Pulsar, AWS Kinesis|メッセージ順序保証、Exactly-Once処理|
|API連携|REST/gRPC、GraphQL、Webhook|レートリミット、エラーハンドリング（Exponential Backoff）|
|ファイル転送|SFTP/SCP、AWS S3 Sync、データ転送アプライアンス（AWS Snowball）|大容量データの圧縮/暗号化、転送監査|

### 3. 加工（変換）

|処理タイプ|実施内容|関連技術|
|---|---|---|
|データクレンジング|欠損値補完、異常値検出、重複排除|Pandas, OpenRefine, Great Expectations|
|構造化/モデリング|スキーマ設計（正規化、スタースキーマ）、集計（ROLLUP, CUBE）|dbt, ER図ツール（Lucidchart）|
|分散処理|大規模データの並列処理（Spark, Dask）、UDF（User-Defined Functions）|パーティショニング、シャッフル最適化|
|リアルタイム処理|ウィンドウ集計（Tumbling/Sliding Window）、複合イベント処理（CEP）|Flink, Kafka Streams|

### 4. 保存（ストレージ）

|ストレージタイプ|用途|代表例|
|---|---|---|
|データレイク|生データの保存（構造化/非構造化）|AWS S3, Azure Data Lake Storage|
|データウェアハウス|分析用の構造化データ|Snowflake, BigQuery, Redshift|
|NoSQL|スキーマレスデータ（ドキュメント、キーバリュー）|MongoDB（ドキュメント）, Redis（キーバリュー）, Cassandra（ワイドカラム）|
|キャッシュ|高速アクセスが必要なデータ|Redis, Memcached|

### 5. 提供（活用）

|活用方法|出力形式|ツール/技術例|
|---|---|---|
|分析/BI|ダッシュボード、アドホッククエリ|Tableau, Power BI, Metabase|
|API連携|アプリケーション向けデータ提供（REST, GraphQL）|FastAPI, Apollo Server|
|機械学習|特徴量ストア、モデル推論用データ|Feast（特徴量ストア）, TensorFlow Serving|
|リバースETL|分析結果を業務システムに反映（Salesforce, HubSpot）|Hightouch, Census|
いま文系（エンジニア）こそが日本語プログラミングすべき５つの理由

# はじめに
この記事は一般文系人材向けに書いた　[日本語プログラミング言語Mind40年 - いま文系こそ日本語プログラミングすべき５つの理由](https://sites.google.com/view/humanitieslifewithmind)　というサイトの記事を文系出身のソフトウェアエンジニア向けに書き換えたものです。

基本的にプログラミングが得意ではないシステムエンジニアさんなどを想定していますが、もちろん得意な方が日本語プログラミング言語を第２第３言語として習得されることを否定するものではないです。


# 1 AI時代の必須スキル：プログラミング思考力

ついにAI時代が到来しました。これまでのコンピュータとの対話にはコンピュータに細かく手順を指示するプログラミング言語が必須でしたが、生成AIが英語や日本語などの自然言語を認識して、プログラミング言語のソースコードを自動生成できる世界が現出しました。

では、プログラミング能力やプログラミング思考力は不要となっていくのでしょうか？

いいえ、逆にAIを使う立場で思考するには、プログラミング能力やプログラミング思考力は基盤的なスキルとしてより必須なものとなっていると言えます。

# 2 文系の強み：コミュニケーション言語能力（とプログラミング言語能力）

コミュニケ―ション能力は一般に理系人材より文系人材のが高いと言われています。コミュニケーション能力には言語コミュニケーションと非言語コミュニケーションがあります。この中で言語コミュニケーション能力は言語能力に依存します。

言語能力には１．創造的思考（とそれを支える論理的思考）の側面、２．感情・情緒の側面、３．他者とのコミュニケーションの側面からなると言われています。（文部科学省・資料5言語能力について「整理メモ」より）

一方でプログラミング能力は上記言語能力の中の１．に支えられています。広い意味で他者をコンピュータととらえれば、コンピュータとのコミュニケーションの側面があるとも言えます。

一般にプログラマー職には理系人材が多いとされていますが、システムエンジニアなど顧客とのコミュケーションが重視される職種では、文系人材こそが活躍しやすい職種と言えます。

# 3 プログラミング言語能力とプログラミング思考力

今日のプログラミング言語は英語由来で記号中心の形態のものが百花繚乱という状態であり、その細かい多様なシンタックスルールは、プログラミングを日常的な作業としない方にとって高いハードルとなっています。

実際の個々のプログラミング言語によって記述されるソースコードには、順次進行、条件分岐、反復といったアルゴリズムの基本構造が存在しており、そのパターンを認識抽出し発案することが職業的プログラマには求められます。

アルゴリズムの基本構造は本質的にこれらのプログラミング言語のシンタックスには依存しておらず、前述のアルゴリズムの基本構造はいかなる言語でも記述可能です。

ただし、自然言語のままでは定義の一意性に欠ける面がありますので、一定の形式化された言語、すなわちプログラミング言語が必要となります。

# 4 プログラミング思考力と日本語プログラミング言語

プログラミング言語のほとんどは、英語由来の形式言語または一部自然言語の語彙に依らない完全な人口言語ですが、日本語由来のプログラミング言語も存在します。
ここでは、前記アルゴリズムを表記する言語としては日本語由来のプログラミング言語の習得を文系出身のエンジニアに推奨しています。

なぜならそれは自身が発案したアルゴリズムを言語化する際に必ず役立つからです。そして、内語と同じ言語のプログラミング言語のが習得はしやすいからです。

これは英語由来のプログラミング言語の習得を妨げるものではありません。英語由来の一般的なプログラミング言語と日本語由来のプログラミング言語で同時に言語化（ソースコード化）することができるのであれば、恐らく理系人材のプログラマからも差別化される優位なスキルを確保することとなるでしょう。

日本語プログラミング言語ができる文系エンジニアたとえば顧客要求をとりまとめるシステムエンジニアならば、自分が詳しくないプログラミング言語のプロジェクトでも、理系プログラマに対して日本語プログラミング言語でロジックを正確に伝えることができます。


# 5 AIが日本語を解する時代こそ日本語プログラミング言語

非エンジニアが生成AIと対話してプログラミング言語のソースコードやオブジェクトコードを生成させることは、ある意味、ユーザーがシステムエンジニアやプログラマと対話してプログラミング言語のソースコードを手書きしてもらう関係に近いものがあります。

そして、システムエンジニアの背後に大量のプログラマが細かいアルゴリズムのギャップを考案しながらソースコードを記述しているという点ではその人件費は莫大で、生成AIで自動化された場合手戻りを繰り返したとしてもコストメリットは大きいかもしれません。既に米国のテック大手では大量のプログラマ人材の解雇が始まっているという不穏なニュースも飛び込んできてはいます。

このあたり今後どうなっていくは不透明ではありますが、いずれにしても、ソフトウェアの需要は今後も爆発的に増えていくと予測されますので、自然言語のままの日本語で生成AIと対話するよりは、自然さを損なわないある程度形式化されて構造化されたプログラミング言語で対話した方が手戻りが少なく、より意図したとおりの結果が期待できると考えられます。

日本語プログラミング言語はそのような高度利用も考えられる将来性のあるプログラミング言語です。この点は文系エンジニア限定という意味ではなく万人に通づるメリットですね。

しかしながら、現時点での現状有姿の生成AIが日本語プログラミング言語を詳しく学習しているかというとそうでもない側面もあるので、ローカル生成AIに言語仕様を学習させるなどの準備は必要と考えられます。

# おわりに
主に文系エンジニアのロジカルシンキングにまつわるコア・コンピタンス形成について訴求していますが、本記事での用語の定義は　[ロジカルシンキング（MECE）とプログラミング的思考力（またはCT）とアルゴリズム的思考力の階層構造まとめ](https://qiita.com/mylifewithviolin/items/395bab8caa2c9cfde6a4) をご確認いただけると幸いです。

**祝！日本語プログラミング言語なでしこ生誕２０周年**[^1]
**祝！日本語プログラミング言語Ｍｉｎｄ生誕４０周年**

[^1]:なでしこのバージョン１が正式リリースされた2005年をもって生誕と想定
#0177（2025/06/22）NumPyの`np.matrix` vs `np.array` + `@` 演算子 

# NumPyの`np.matrix` vs `np.array` + `@` 演算子 

## 1. はじめに

NumPyには2種類の行列表現があります：

* `np.matrix` クラス
* `np.array` クラス（と `@` 演算子による行列積）

どちらも行列演算を扱うことができますが、設計思想や振る舞いには大きな違いがあります。
本記事では、**Python中上級者や科学技術計算、機械学習に携わるエンジニア向け**に、これらの違いを詳しく掘り下げ、設計判断に資する知識を提供します。

---

## 2. 結論（先に要点を知りたい人へ）

| 比較軸     | `np.matrix`   | `np.array` + `@` |
| ------- | ------------- | ---------------- |
| 推奨度     | 非推奨（将来的に廃止予定） | 推奨               |
| 挙動      | 2次元固定（常に2次元）  | 任意次元             |
| `*` 演算子 | 行列積           | 要素積              |
| `@` 演算子 | 非対応（未定義）      | 行列積              |
| 可読性     | 高（MATLAB風）    | Pythonic         |
| 拡張性     | 低い（2D限定）      | 高い（テンソル対応）       |
| 実務利用    | 古いコードベースに残る   | 現代的な実装では主流       |

---

## 3. 基本の違い

### 3.1 `np.matrix` の特徴

```python
import numpy as np
A = np.matrix([[1, 2], [3, 4]])
```

* 常に2次元
* `*` 演算子が行列積（線形代数に便利）
* 転置 `.T`、逆行列 `.I`、行列式 `.det()` などが属性で簡単に呼べる

```python
A.T       # 転置
A.I       # 逆行列
A * A     # 行列積（@ と同じ）
```

### 3.2 `np.array` の特徴

```python
B = np.array([[1, 2], [3, 4]])
```

* 任意次元（1D, 2D, 3D...）
* `*` 演算子は要素積
* 行列積は `@` 演算子か `np.dot`, `np.matmul` で明示的に指定

```python
B * B     # 要素ごとの積
B @ B     # 行列積（Python 3.5+）
```

---

## 4. APIレベルでの違い

### 4.1 計算結果の次元性

```python
np.array([[1,2]]) * np.array([[1],[2]])
# => エラー、あるいはブロードキャストによる意図外の結果

np.matrix([[1,2]]) * np.matrix([[1],[2]])
# => [[5]]（内積）
```

### 4.2 転置と逆行列

```python
A = np.matrix([[1,2],[3,4]])
A.T     # 転置（属性）
A.I     # 逆行列（属性）

B = np.array([[1,2],[3,4]])
B.T     # 転置（属性）
np.linalg.inv(B)  # 逆行列（関数）
```

### 4.3 ブロードキャストの扱い

* `np.matrix` ではブロードキャストが制限される
* `np.array` はブロードキャストを柔軟に使える

---

## 5. 実行速度の違い

一般的に、`np.matrix` は内部的に `np.array` に依存しており、速度面での優位性はありません。
むしろ `np.array` を使い `@` や `np.matmul()` によって明示的に操作したほうが高速化の余地があります。

```python
# 比較コード
import numpy as np
import time

A1 = np.matrix(np.random.rand(1000, 1000))
A2 = np.array(A1)

# matrix * matrix
start = time.time()
A1 * A1
print("matrix:", time.time() - start)

# array @ array
start = time.time()
A2 @ A2
print("array:", time.time() - start)
```

結果：差は僅少だが、最適化の自由度は `np.array` のほうが高い

---

## 6. 混在利用によるトラブル

`np.matrix` と `np.array` の混在は**バグの温床**になります。

```python
A = np.matrix([[1, 2], [3, 4]])
B = np.array([[1, 2], [3, 4]])
A * B  # 意図外の挙動になる可能性あり
```

NumPy公式も、明示的に `np.matrix` を廃止方向としています。

---

## 7. 今後の互換性と非推奨化

NumPy公式ドキュメントより：

> The use of `np.matrix` is discouraged, and it may be removed in future versions.

推奨される代替方法：

* `np.array` + `@`
* `np.linalg` モジュールでの線形代数
* `scipy.linalg` の活用

---

## 8. まとめ：使い分け早見表

| 利用目的             | 推奨手法                                      |
| ---------------- | ----------------------------------------- |
| 1次元〜多次元テンソル計算    | `np.array`                                |
| ブロードキャストを使いたい    | `np.array`                                |
| 行列積、転置、逆行列など線形代数 | `np.array` + `@`, `.T`, `np.linalg.inv()` |
| 可読性重視の個人コード（短期）  | `np.matrix` も可（ただし推奨されない）                 |

---

## 9. 終わりに

一見便利に見える `np.matrix` ですが、Pythonのエコシステム（特に機械学習・データ解析・数値計算）ではすでに**時代遅れの選択肢**になっています。
新規開発では **常に `np.array` と `@` を基本とする設計** が推奨されます。

一貫性と将来性を考え、コードベースの移行やリファクタリングのタイミングで `np.matrix` の除去を検討しましょう。
ブランチって何？お絵かきの下書きと清書で考えてみよう！

こんにちは。  
前に「Gitって、作業の記録を残せるよ！」って話をしたよね。  
今回は、その中でもよく出てくる「ブランチ」というものについて、なるべくわかりやすくお話しするよ！

## 絵を描くときの話をしよう

たとえば、君が絵を描いているとするよ。  
まず、ノートに「顔の下書き」を描いた。

でも、「もっとかっこよく描けそう」と思ったとする。  
じゃあ、どうする？

いきなり消して描き直す？  
それだと、**せっかくの絵がなくなっちゃう**よね。

だから、コピーを取って、**別の紙で練習**してみるのが安心！

## Gitの「ブランチ」は、このコピーと同じ考え方！

「ブランチ」は、日本語でいうと「枝」。  
木の枝みたいに、途中から別の道に分かれて作業できる仕組みなんだ。

「この先、こう描いてみようかな？」っていう**試し描きの場所**が作れるってこと！

- 本番のノート：`main`ブランチ
- 練習用のコピー：`feature/new-idea`ブランチ みたいな感じ！

## じゃあ、どうしてブランチを使うの？

- 元の絵をそのまま残しておける！
- いろんなアイデアを同時に試せる！
- 失敗してもやり直せる！

つまり、**「あとからどうにでもできる」安心なやり方**なんだ。

## 最後に、合体（マージ）できる！

「やっぱこの描き方がいい！」と思ったら、  
そのブランチを**本番に戻す**こともできるよ！

これを「マージ」っていうんだ。

```
git switch main
git merge 練習ブランチ名
```

これで、いいとこだけ取り込める！

## まとめ

- ブランチ＝練習用の紙！
- 本番の絵を守りながら、いろんな案を試せる！
- 最後は気に入ったら合体（マージ）できる！

## おまけ：名前のつけ方はこんな感じ！

| 名前 | 意味 |
|------|------|
| `main` | 本番のノート |
| `feature/henshin` | 新しい案（例：変身シーンを追加） |
| `fix/kokuban` | 黒板にミスを見つけたから直す！ |

---

今回はここまで！
それじゃあ、またね！🎨✨
Bash Loops: A Practical Guide

# **Bash Loops: A Practical Guide**  
Loops in Bash allow you to automate repetitive tasks. This document covers:  
1️⃣ **Reading from files vs. direct input**  
2️⃣ **`for` vs `while` loops (key differences)**  
3️⃣ **Nested loops (loop inside a loop)**  

---

## **1. Reading Lists: File vs. Direct Input**  
### **Method 1: Direct Input (Hardcoded List)**  
```bash
for item in "apple" "banana" "cherry"; do
    echo "Fruit: $item"
done
```
**Output:**  
```
Fruit: apple  
Fruit: banana  
Fruit: cherry  
```

### **Method 2: Read from a File**  
```bash
while IFS= read -r line; do
    echo "Line: $line"
done < "fruits.txt"
```
**Assumes `fruits.txt` contains:**  
```
apple  
banana  
cherry  
```

### **Key Notes:**  
- `IFS=` prevents whitespace issues.  
- `-r` avoids interpreting backslashes.  

---

## **2. `for` vs `while` Loops**  
| Feature          | `for` Loop                     | `while` Loop                  |
|-----------------|-------------------------------|-------------------------------|
| **Use Case**    | Iterate over a known list      | Run until a condition is false |
| **Syntax**      | `for var in list; do ...`     | `while [ condition ]; do ...` |
| **Termination** | Ends after list is processed   | Ends when condition is `false` |
| **Example**     | ```for i in {1..3}; do ...``` | ```while [ $i -le 3 ]; do ...``` |

### **Example: `for` Loop (Counting)**  
```bash
for i in {1..3}; do
    echo "Number: $i"
done
```

### **Example: `while` Loop (Condition-Based)**  
```bash
counter=1
while [ $counter -le 3 ]; do
    echo "Count: $counter"
    ((counter++))
done
```

---

## **3. Nested Loops (Loop Inside a Loop)**  
### **Example: Multiplication Table (Nested `for`)**  
```bash
for i in {1..3}; do
    for j in {1..3}; do
        echo "$i x $j = $((i * j))"
    done
done
```
**Output:**  
```
1 x 1 = 1  
1 x 2 = 2  
1 x 3 = 3  
2 x 1 = 2  
...  
3 x 3 = 9  
```

### **Example: `while` Inside `for`**  
```bash
for user in "alice" "bob"; do
    echo "User: $user"
    attempts=1
    while [ $attempts -le 2 ]; do
        echo "  Login attempt #$attempts"
        ((attempts++))
    done
done
```
**Output:**  
```
User: alice  
  Login attempt #1  
  Login attempt #2  
User: bob  
  Login attempt #1  
  Login attempt #2  
```

---

## **Cheat Sheet: When to Use Which Loop**  
| Scenario                          | Recommended Loop          |
|----------------------------------|--------------------------|
| Known list (files, numbers, etc.) | `for`                    |
| Condition-based (e.g., "retry until success") | `while`       |
| Complex iterations (e.g., grids)  | Nested loops (`for`/`while`) |

---

## **Final Tips**  
✔ **Avoid infinite `while` loops** → Always update the condition (e.g., `((counter++))`).  
✔ **Use `break`/`continue`** → Exit early or skip iterations.  
✔ **Quote variables** → Prevents word splitting (e.g., `"$item"`).
ローカルでSakanaAI(TinySwallow-1.5B)を動かしてみる

# 環境
Windsurf：1.10.5
python：3.11.5
pip：25.1.1

# 本題
どうも、たちゅみです。
今回はローカルでSakanaAI(TinySwallow-1.5B-Instruct-Q5_K_M.gguf)を動かすまでの手順を記します。
※仮想環境の準備などは省きます
※最新版のpipでない場合、うまくいかないことがあるようなので必要であればアップデートしてください

### 1.モデルをダウンロードする
まず、モデルをダウンロードするためにhuggingface_hubをインストールします。
pip install -U huggingface_hub

次にSakanaAIをダウンロードします。
※本記事ではモデル「TinySwallow-1.5B-Instruct-Q5_K_M」を指定します
　用途に応じて変更してください
huggingface-cli download tensorblock/TinySwallow-1.5B-Instruct-GGUF TinySwallow-1.5B-Instruct-Q5_K_M.gguf --local-dir ./models --resume-download

### ２.llama-cpp-pythonをインストール
下記コマンドでllama-cpp-pythonをインストールします。
**CPUまたはGPUを使用するかでコマンドが異なるので注意してください。**

**CPUの場合**
```
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
```

**GPUの場合（cu121を指定）**
```
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
```

※CMakeとC/C++ビルド環境がない場合、下記のエラーが出ます。
　ERROR: Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based projects
 　その場合、ビルド環境を整える必要があり、別記事で記載予定です。


### ３.動かしてみる
下記コードを記載し、実行します。
※CPU,GPUに応じてn_gpu_layersの値を変更する必要があります
```python
from llama_cpp import Llama

MODEL = "./models/TinySwallow-1.5B-Instruct-Q5_K_M.gguf"
llm = Llama(
    model_path=MODEL,
    chat_format="qwen",   # TinySwallow は Qwen2 テンプレ互換
    n_ctx=4096,           # 最大トークン長（必要に応じて増減）
    n_gpu_layers=0,      # GPU 全層／CPU のみなら 0
    verbose=False,
)

system_prompt = "あなたは親切な日本語アシスタントです。"
history = [{"role": "system", "content": system_prompt}]

print(">>> TinySwallow チャット (終了: exit)")

while True:
    user_msg = input("🧑‍💻> ")
    if user_msg.lower() in {"exit", "quit", "q"}:
        break

    history.append({"role": "user", "content": user_msg})

    # ② プロンプトを投げる
    response = llm.create_chat_completion(
        messages=history,
        max_tokens=512,
        temperature=0.7,
        top_p=0.95,
    )

    # ③ 応答を取り出して表示
    bot_msg = response["choices"][0]["message"]["content"].strip()
    print(f"🤖> {bot_msg}\n")

    history.append({"role": "assistant", "content": bot_msg})
```
SakanaAIとやりとりすることができるようになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/d39d1b13-89b8-4430-ad0f-11fc281cfac2.png)


以上です！
ローカルで動くものの割にCPUでもレスポンスがはやく、回答精度も悪くありません。
ぜひ試してください！
【読書メモ】会社を変える分析の力


[会社を変える分析の力](https://www.amazon.co.jp/dp/4062882183)

### データ分析とは
データ分析 ≠ 数値計算
データ分析 = データから問題を改名するプロセス

### ステップ：
1、データを収集する
2、数値計算
3、問題を解明する

・意味のあるデータ分析をするためには、ITや分析手法だけでなく、データから問題を解明するプロセスを構想する力が必要。

・分析の価値 = 意思決定の寄与度 ✖️ 意思決定の重要性
例：販売予測の分析を行う場合
意思決定の寄与度：販売予測がどれだけ投資判断に影響を与えるか
（誤差50%よりも誤差3%の方が投資の判断材料としての価値は高いため寄与度が高い）
意思決定の重要性：投資額

### データ分析の成果
**メイン：** 何が分かったか、それは意思決定にどう役立つか
**付帯成果物：** データ分析の説明（結果の正しい解釈に必要）
プレゼン・報告する際は、意識する。

### 良い分析をしても意思決定者が採用するかが重要
**・費用対効果**
システム開発する場合に投資額を回収できるか
人材育成に活用する場合、金銭換算が難しい

**・心理的な壁**
従来のやり方を変えたくないという心情

分析をする能力だけでなく、それをビジネスに使わせていくコミュニケーションが重要。
費用対効果を納得してもらう説明
現場の熟練者に同感してもらう説明
など

### 意思決定者が注意すべきこと
**1、不確実性の軽視**
分析は100%正確ではない。将来を完璧に予測することはできない。

**2、分析への過剰期待**
データ分析で提供できるのは意思決定の一部だけであることが多い。特に定性的な問題の分析には限界がある。
また、分析には前提条件がある。例：過去1年間の販売状況にもとづけば〜
前提条件を無視し、結果だけ解釈するのは危険である。

**3、結果への事前期待**
こういう結果が出て欲しいと思い、結果が思わしくなかった際、やり方を変えるなど恣意的な分析はよろしくない。

### 分析モデル：
現実の複雑な問題を単純な問題に変換したもの。
良い分析モデルは現実をよく再現したものであるが、それでも完全に再現することはできない。

例えば、ビールの売り上げを気温や降水量、曜日など説明変数をどれだけ多くしたとしても人の好みは千差万別であり、全てにあてはまるモデルを作ることは不可能だからである。
また、説明変数が多すぎても過学習のリスクもあるため、闇雲に増やせば良いものでもない。

**ブラックスワン：**
リーマンショックは経済学者でも予想ができなかった。つまり、モデルに組み込めなかった一例であり、ノーベル経済学賞を受賞した学者が参画していたヘッジファンドでさえ、多額の損失を出した。

### ビッグデータ
ビッグデータが取得できるようになって何が変わったか。
部分計測から全数計測へ
データが限られる場合、母集団の一部だけをサンプリングして計測していたが、データが増えたことにより全数を計測することができ、それにより全体現象の挙動パターンを直接理解できるようになった。
プログラムを書くときによく使うショートカット集

## プログラミング効率を上げるショートカット集（VS Code中心）

### 1. `Ctrl + Space`  
**コード補完**を呼び出します。変数名や関数名のサジェストが表示されます。

### 2. `Alt + ↑ / ↓`  
**現在の行を上下に移動**できます。コード整理に便利。

### 3. `Shift + Alt + ↑ / ↓`  
**現在の行を複製**。似た処理の繰り返しに役立ちます。

### 4. `Ctrl + Shift + K`  
**現在の行を削除**。不要なコードをすばやく消せます。

### 5. `Ctrl + /`  
**コメントアウト / コメント解除**の切り替え。複数行にも対応。

### 6. `Ctrl + P`  
**ファイル名検索でファイルを開く**。大規模プロジェクトに最適。

### 7. `Ctrl + Shift + O`  
**シンボルにジャンプ**。関数やクラスに瞬時にアクセス。

### 8. `F12`  
**定義元に移動**。関数や変数の中身をすぐ確認。

### 9. `Alt + Click`  
**複数カーソルを設置**。同時編集が可能。

### 10. `Ctrl + Shift + F`  
**ワークスペース全体を検索**。コード全体の使用箇所を把握できます。

### 11. `Ctrl + B`  
**サイドバーの表示/非表示の切り替え**。作業スペースを広く使えます。

### 12. `Ctrl + Shift + E`  
**エクスプローラーを表示**。ファイル管理にすぐアクセス。

### 13. `Ctrl + Shift + M`  
**問題ビューを表示**。エラーや警告を一覧で確認。

### 14. `Ctrl + (バッククオート)`  
**統合ターミナルの開閉**。ターミナルとの切り替えがスムーズ。

### 15. `Ctrl + Shift + '`  
**新しいターミナルを追加**。複数ターミナルの使い分けに。

### 16. `Ctrl + Shift + L`  
**一致するすべてにカーソル設置**。一括修正が楽になります。

### 17. `F2`  
**リネーム機能**。変数名・関数名を安全に変更。

### 18. `Ctrl + K, Ctrl + S`  
**キーボードショートカット一覧を表示**。自分好みにカスタマイズ可能。

### 19. `Ctrl + Tab`  
**直近のエディタを順に切り替え**。複数ファイル編集に便利。

### 20. `Ctrl + Shift + N`  
**新しいウィンドウを開く**。別プロジェクトを同時進行で扱えます。
エミュレータ起動時に出たエラー「the emulator process for AVD 〜〜〜 has terminated」の対応

# はじめに
今回エミュレータを新たに作成し、起動したところ以下のスクショのようなエラーがAndroidStudio右下に出たのでそれの解消法を一つ記事にしておきます。

![スクリーンショット 2025-06-20 11.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/97aea425-f8e9-4797-b058-2da7c7eff8a7.png)


これをやれば必ず治るというわけではありませんので、参考程度に見ていただければと思います。


# 原因とやったとこ

今回は端末やAPIバージョンごとに動作確認をするべく、多くのエミュレータを作成していたことが原因でした。
特にアプリ内で動画DL再生などを行うためにエミュレータ上で扱う端末の容量を増やしたいたのも大きな原因の一つかと思います。


https://qiita.com/Tsubasa12/items/b784249c6cbb3b64ed15

そこで**動作確認が終わったものから削除**したら、エラーは発生せず、通常通りにエミュレータを起動できました。
Vast.ai活用の例

生成AIを始める際に生じるGPU利用に関する提案：
Certifiedではないというリスク（＊詳細下記）を取ることによる実現できる環境の紹介。

## 何がわかる？
- Certifiedでは無いということ
- Vast.aiできること
- 使い分け：リスクと予算のバランス

## Certifiedでは無いということ
定義：https://docs.vast.ai/faq
抜粋翻訳：機密性の高いワークロードや本番環境のワークロードの場合は「セキュアクラウド」フィルターをチェックすることをおすすめします。青いデータセンターラベルをご確認ください。

ポイント：Vast.aiの仕組み上、GPUを提供するHost側にroot権限があります。　＊意訳：データを覗き見しようと思えばできる権限が存在しているということ

## できること：
リスクを理解した上で、Vast.ai環境を利用するケース
GPUのオンデマンド利用と支払い：使いたい時に使える。使った時間だけの支払い。同じ条件で、世界中の機器から選定できる。
例：公開されたモデルやアプリケーションを用いて生成したい。root権限があるRTX4090環境を5台。世界中から瞬時に手配する

## 使い分け
基本的な考え方：Cloud選定と同じだと考えています。
・機密性の高いワークロードや本番環境のワークロードの場合は、ローカルGPU環境もしくは、メジャーCloud業者(AWS・Azureなど)および国内データセンター業者。　＊Vast.aiのCertifiedを選ぶ理由はないのでは無いでしょうか。
優先度：機密性＞コスト

・リスクを理解した運用。公開されたモデルやアプリケーションを利用した生成
リスクとコストを鑑み、ケースによってはVast.aiの活用を検討
優先度：コスト＞リスク管理
71歳の... M5Stack用ミニキーボード「CardKB」をUNO、ESP32、ESP32-S3で使ってみて解ったこと。

　ESP32ボードなどへの直接文字入力法の選択肢の一つとして購入、３種類のボードで試してみました。

 https://www.switch-science.com/products/8445?srsltid=AfmBOopNBpd2a6JMVZYE8dYLm3tgDop9ircxsY50Rq_qFhy1qnFBmeh-

    １．UNO互換機
    ２．FREENOVE ESP32-WROVER-DEV (with Camera)
    ３．FREENOVE ESP32-S3 WROOM (with Camera)
![CardKB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/18406c61-2e29-423b-b50f-98ed84f2f57a.jpeg)

　結構、簡単に動作しました。ただし、バージョン変更のためか、購入サイトの記載と、記号や大文字の打ち方が違っており戸惑いました。次のようにして出来ました。通常のPCキーボードのように「修飾キーを押しながら」では何も入力できませんでした。

|記号|修飾キー|LED||
|----|----|---|--|
|記号|`Sym`2回連続押し|緑に点灯|Symbol Key?|
|大文字|`↑`2回連続押し|赤に点灯||

　接続に関して。ネットには、I2CのSDA、SCLピンに対し「10KΩでプルアップの必要が」という情報も。しかし、なくても動いてくれました。具体的には次のように接続しました。

|各ライン(2mmピッチコネクタ)|UNO|ESP32|ESP32-S3|
|----|----|---|---|
|SCL(白)|SCL A5|22|1(変更可)|
|SDA(黄)|SDA A4|21|2(変更可)|
|電源(赤)|3.3V|3.3V|3.3V|
|GND(黒)|GND|GND|GND|

　スケッチは、どのボードでもほぼ全く同じものでよかったです。もちろん、接続ピンはそれぞれ上記のようにします。そして、１行のみ次のように変えます。
UNO、ESP32 では、

    Wire.begin();

ESP32-S3 では、

    Wire.begin(2, 1); // (SDA_Pin, SCL_Pin)

私の場合はこれで動作しました。。スケッチ全体は次のようです。

```c:
#include <Wire.h>
#define CARDKB_ADDR 0x5F
void setup() {
  Serial.begin(115200);
  Wire.begin(); // Wire.begin(2,1) // (SDA, SCL) only with ESP32-S3
}

void loop() {
  Wire.requestFrom(CARDKB_ADDR, 1);
  while(Wire.available()) {
    int c = Wire.read(); // receive a byte as characterif
    if (c != 0) {
      Serial.print((char)c);
      Serial.print(":");Serial.println(c, DEC);
    }
  }
}
```
　最後まで見ていただきありがとうございました。
学習18日目

# 今日学んだこと
Rubyの演算子

# 内容
## 比較演算子
a == b ・・・ aとbが等しい
a != b ・・・ aとbが等しくない
a > b ・・・ aはbより大きい
a < b ・・・ aはbより小さい
a >= b ・・・ aはb以上
a <= b ・・・ aはb以下

## 論理演算子
!a (または not a)
・・・ aがfalseならば

a && b (または a and b)
・・・ aがtrue かつ bがtrue ならば

a || b (a or b)
・・・ aがtrue または bがtrue ならば

## 三項演算子
a ? b : c
・・・ aがtrue ならば b、そうでなければ c


# 感想
以前の記事でも書いたが、「等しい」という比較演算子を「a=b」(aにbを代入する)と書いていたため、常にtrueとなってしまい、正しく処理されなかった。
おそらく、普段仕事で使っているVBAやExcel関数では、上記で表現するため誤っていたものと考えられる。
また、「等しくない」を表す比較演算子も、VBAと異なるので注意が必要だと感じた。(VBAでは「a<>b」と記述する)
【コピペでOK】n8nで作る名刺管理ツールのためのコードノードとプロンプトまとめ。

## この記事について
以下の動画で公開している、n8nで作成する名刺管理ツールの中で、コードノードと、OpenAIノードに記載されている情報を格納しておく。
![20250622名刺管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890103/22e067ae-2974-4d54-816c-b469683521f7.png)
**【動画を見た上で】**、この記事の情報を参照して欲しい

## OpenAIノードで`gpt-4o`に添付するプロンプト
```
## 依頼
画像データからテキスト情報を読み取って、以下の形式でJSONを作成して整理して欲しい。
## 出力条件
- JSON形式の結果のみ出力して欲しい
- ないものはnullとして出力して欲しい
- コードユニットのための「```」という表記は必要ない
- 各要素で、複数該当するものがある場合には、代表的な一つを選んで一つのみ記載するようにして。併せて、複数ある旨を留意点に記載して。留意点は特筆事項がなければnullで提出して欲しい。
## 必要なデータ
- 名前
- 会社名
- 役職(ない場合には「ない」)
- 部署
- メールアドレス
- 電話番号
- 住所
- 取得日
- 関係性
- 名刺画像
- 留意点
```
動画を見ていただけるとわかると思うが、名刺が写っている画像を解析して、それをJSON形式で整理して出力する。

なんでこんなことをするのかというと、最後にNotionに情報を送信する際にデータの構築をしやすくするためにこのような出力方式にしている。

## コードノードで添付する内容
```
// 前のノードから返ってきたJSON形式の「文字列」を取得します
const jsonString = $input.first().json.content;

// JSON.parse() を使って、文字列をJSONオブジェクトに変換します
const jsonObject = JSON.parse(jsonString);

// 変換したオブジェクトを配列に入れて返します
// これでn8nが扱える正しいデータ形式になります
return [jsonObject];
```
やっている内容
- `jsonString`にOpenAIノードの出力結果である`content`の内容を入れる
- `content`の内容はJSON形式で記述されているのでそれを`JSON.parse`で解析

## まとめ
もし、「こういうやり方の方がいい」「この部分のやり方がわからない」などがあれば是非ともコメントをしていただきたいです。
AWS EC2上にホスティングしているDifyをアプデートする手順

## 1. 概要

AWS EC2 上で Docker Compose を用いて稼働している Dify アプリケーションを、安全にアップデート・運用するための手順をまとめている。

## 2. 構成前提

* **プラットフォーム**: AWS EC2（Amazon Linux 2）
* **アプリ配置ディレクトリ**: `/home/ec2-user/dify/docker`
* **Docker Compose バージョン**: v2 系推奨
* **データ永続化**: Docker Named Volume（例: `dify_db_data`, `dify_weaviate_data` など）
* **バックアップ手段**: Volume アーカイブ（tar）または EBS スナップショット / AMI

## 3. 更新手順

1. **EC2 に SSH 接続**
   ```
   ssh -i ~/.ssh/your-key.pem ec2-user@<EC2_PUBLIC_IP>
   ```
2. **リポジトリへ移動 & ソース取得**
   ```bash
   cd dify/docker
   git pull origin <main | tag>
   ```
3. **コンテナ停止（Volume は温存）**
   ```bash
   docker compose down       # --volumes は付けない！
   ```
4. **イメージ更新**

   ```bash
   docker compose pull       # 最新イメージ取得
   ```
5. **コンテナ再起動**

   ```bash
   docker compose up -d
   ```
6. **動作確認**

   ```bash
   docker compose ps         # ステータス確認
   docker compose logs -f <service>  # 必要に応じてログ監視
   ```

## 4. バックアップ & リストア

### 4.1 Volume バックアップ（ファイルレベル）

```bash
docker compose down
sudo tar -cvf dify-volumes-$(date +%Y%m%d).tar \
  /var/lib/docker/volumes/dify_*
```

または EC2 停止前に **EBS スナップショット** / **AMI** を取得。

### 4.2 リストア手順

1. 対象 tar を展開 or スナップショット / AMI からリストア。
2. `docker compose up -d` で再起動。

## 5. 設定ファイル同期

アップデート後は `.env.example` と既存 `.env` を比較し、新規変数を追記する。

```bash
diff -u .env.example .env
```

## 6. 障害時ロールバック

```bash
git checkout <previous-tag>   # 直前の安定版へ戻す
docker compose pull
docker compose up -d
```

なお、それでも復旧しない場合は Volume バックアップまたは AMI を戻す。

## 7. EC2 セッション終了

EC2 インスタンスから抜けたい場合は次のいずれかで OK。

```bash
exit      # 一般的
logout    # シェル依存
Ctrl + D  # EOF 送信
```