OmniAICreator/Qiita-1.07M huggingface dataset:
一次遅れ微分方程式の一般解と多様な解法の総まとめ



## ▶️ 対象方程式と目的

一次遅れ微分方程式（first-order lag ODE）は次の形で表される：

$$
\tau \frac{dy(t)}{dt} + y(t) = K u(t)
$$

ここで、

* $\tau$：時定数（time constant）
* $K$：ゲイン（定常利得）
* $u(t)$：入力関数
* $y(t)$：出力関数

目的は、この方程式の**一般解**をさまざまな方法で導出・理解し、適用場面ごとに最適な手法を選択できるようにすること。

---

## ✅ 一般解の公式

最も基本となる一般解は以下のように表現される：

$$
\boxed{
    y(t) = e^{-t/\tau} y(0) + \int_0^t \frac{K}{\tau} e^{-(t - \xi)/\tau} u(\xi) \, d\xi
}
$$

* 第1項：**自然応答（初期値に依存）**
* 第2項：**強制応答（入力に依存、畳み込み積分）**

これは以下のように導出される：

1. 元の方程式：

$$
\tau \frac{dy}{dt} + y = K u(t)
$$

2. 両辺を $\frac{1}{\tau}$ で割る：

$$
\frac{dy}{dt} + \frac{1}{\tau} y = \frac{K}{\tau} u(t)
$$

3. 積分因子をかける：

$$
\mu(t) = e^{\int \frac{1}{\tau} dt} = e^{t/\tau}
$$

$$
\frac{d}{dt}(e^{t/\tau} y) = \frac{K}{\tau} e^{t/\tau} u(t)
$$

4. 両辺を積分：

$$
e^{t/\tau} y(t) = y(0) + \int_0^t \frac{K}{\tau} e^{\xi/\tau} u(\xi) d\xi
$$

$$
y(t) = e^{-t/\tau} y(0) + \int_0^t \frac{K}{\tau} e^{-(t - \xi)/\tau} u(\xi) d\xi
$$

---

## ✅ 解法一覧と特徴

| 解法              | 方法                            | 向いている入力        | 特徴               |
| --------------- | ----------------------------- | -------------- | ---------------- |
| **1. ラプラス変換**   | $Y(s) = G(s) U(s)$ に変換し代数的に解く | 任意の入力          | 工学の標準手法。伝達関数と直結  |
| **2. 積分因子法**    | 線形ODEへの積分因子を使う                | ステップ・ランプなど基本関数 | 教科書的・初学者向き       |
| **3. グリーン関数法**  | インパルス応答の畳み込みで表現               | 任意の連続入力        | 系の物理的応答がわかりやすい   |
| **4. 変数分離法**    | 限られた形に適用（例：ステップ）              | 単純な定数入力        | 手早く計算できるが汎用性低い   |
| **5. 数値解法**     | オイラー法・Runge-Kuttaなど           | 入力が複雑、非連続      | プログラムによる逐次的評価に適す |
| **6. 状態空間法**    | $\dot{x} = Ax + Bu,\ y = Cx$  | 制御設計・ロボティクス    | 行列指数と畳み込みで厳密な表現  |
| **7. 遅れ作用素法**   | 離散時間の伝達関数で近似                  | デジタル制御系        | 離散化に適し、Z変換と連携可   |
| **8. オペレータ法**   | $D = \frac{d}{dt}$ の演算代数として処理 | 古典理論の記述・教育     | 形式的操作で直観的理解      |
| **9. ニューラルODE** | ODEをニューラルネットで学習               | 実験データの近似       | データ駆動・AIベースの柔軟性  |

---

## ⚡️ 代表例：入力$u(t)$別の特解

| 入力$u(t)$           | 特解 $y(t)$                                                                             | 解法            |
| ------------------ | ------------------------------------------------------------------------------------- | ------------- |
| $U_0$（ステップ）        | $y(t) = K U_0 (1 - e^{-t/\tau})$                                                      | 積分因子法、ラプラス変換  |
| $A t$（ランプ）         | $y(t) = K A (t - \tau(1 - e^{-t/\tau}))$                                              | 積分因子法         |
| $\delta(t)$（インパルス） | $y(t) = \frac{K}{\tau} e^{-t/\tau}$                                                   | グリーン関数、ラプラス変換 |
| $e^{\alpha t}$     | $y(t) = \frac{K}{1 + \tau \alpha} e^{\alpha t}$                                       | 積分因子法、変数変換    |
| $\sin(\omega t)$   | $y(t) = \frac{K}{\sqrt{1 + (\omega \tau)^2}} \sin(\omega t - \tan^{-1}(\omega \tau))$ | ラプラス変換、フーリエ変換 |

---
「#100日チャレンジ」を読んだ感想

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391109/b6484589-577f-4136-818a-c22e36d9775e.png" width="400">


## この本を読むことで自分に不足している点に気づくかも

- 作品を短期間で多数作ることで開発・設計手法を確立する
- メモは自分の引き出しとして保存して再利用する
- その他、何度か読み返して取り込んでいきたい

## 本の概要

- エッセイ形式の作品
- 222ページ
- 2~3時間もあれば読める
- 実際に100日間で作成した作品のリストが載っている
- 25年1月14日第1版第1刷発行
- 25年7月25日第1版第7刷発行 ←!?

## 大学4年生の大塚さん

- 手を抜くことに本気を出す、年配の方から見たら「現代的な若者」という性格・価値観
- 経済学部だがVBAを授業で使ったことがある

## 物語が始まるきっかけ

- パソコンの授業で「ChatGPTに何をさせたい」というレポート作成を機にChatGPTの利用を始める
- 授業中にオセロゲームを開発し、講師の佐々木先生の目に留まる
- X(旧Twitter)で見かけた「#いいねの数だけ勉強する」に触発される形で「#100日チャレンジ」がスタート

## 印象に残った点

100日チャレンジを始めようと決めた場面でこんな言葉が出てきました

> Fake it till you make it. 「成功するまで成功者のふりを装う」

「とにかくやってみよう」という気持ちで、自分も共感したのでこの言葉を胸に頑張ろうと思う。

**あと大塚さんがぐぅ有能な件、IT業界というかプログラマー向きというか\
自分とは根本的に性能が違う、自分から見たら「なるべくしてなった」という印象**

## 業務に活かせそうなこと

- ちょっとした観点など散りばめられているように感じたので、何度か読んでキャッチアップしたい
- 実際のプロンプトが書かれているのでAI初心者には良いかも（100日間のプロンプトもおそらく公開してある）
Pythonを用いた楽曲分析(BPM編)

# はじめに
どーも！！！！deoxyです！
音楽分析がしたい！と思いlibrosaを勉強してみました。
ゆくゆくは曲のコード分析やキー分析をしたい！！！

:::note info
Python3.12以上はlibrosaとの依存関係が不安定であり、うまく作動しないことがあります
:::

# 実行環境
- Google Chrome 137.0.0.0
- Google Colaboratory
    - Python 3.11.12
    - librosa 0.11.0

# Librosa
librosaとは、音楽とオーディオ分析のためのPythonパッケージです。
[公式ドキュメント](https://librosa.org/doc/latest/index.html
)


Windowsの場合は、terminalを起動して
```terminal
$　pip install librosa
```
と打てばlibrosaがインストールされます。
Pythonのバージョンによってはちゃんと動かないこともあるから注意！

# BPM検出
まずはBPMの検出を試してみます。
使った音源はこちら
Mrs.GREENAPPLE様のインフェルノです。

↓クリックでYouTubeに飛びます。
[![インフェルノ](https://i.ytimg.com/vi/wfCcs0vLysk/maxresdefault.jpg)](https://www.youtube.com/watch?v=wfCcs0vLysk)

インフェルノのBPMをネットで調べたところ92と180~189という２通りが出てきました。ちょうど倍になっているので取り方の違いですかね。
まあそれっぽい数字が出たらよしとしましょう

## 実装
```Python
import librosa

# 音声ファイルの読み込み（適切なサンプリングレートに設定）
music, hz = librosa.load("sample.wav", hz=22050)

# テンポとビートの検出
tempo, beats = librosa.beat.beat_track(y=music, sr=hz)

print(tempo)
```

```terminal
[92.28515625]
```
なんとこんなに簡単に実装ができます。
検出されたBPMは92なので大体あっていますね。

### 音声ファイルの読み込み
`music`はnumpy配列で、22050kHzにサンプリングされた音声波形データが格納されています。
`hz`はサンプリング周波数を格納します。サンプリングを行わない場合は、`hz = none`としてください。
`librosa.load`はタプル型を返します。そのため変数が二個入っています。

### BPM検出
`librosa.beat`がBPMやビートを検出するためのモジュールです。このモジュールもタプル型を返します。
librosaの中にある`beat_track`関数は引数として`y`と`sr`を持っています。そのため、関数の引数y, srに音声ファイルの読み込み時に使ったmusicとhzを渡してあげます。
今回はBPM(テンポ)が知りたいので、テンポを出力します。

これで簡単にBPMが求まります。

# ちょっと脱線
Librosaはローカルのファイルしか読み込めないらしいです。
YouTubeやニコニコから曲を取ってきたいなっていうときは一度ダウンロードしてあげる必要があります。不便;;
`moviepy`というパッケージを使えばPythonのプログラム内でYouTubeから音声をダウンロードし一時的に保存することが可能になります。
気が向いたら試してみます。

# 参考

https://librosa.org/doc/latest/index.html

# おわりに
有名どころであればBPMは調べたら出てくるのですが、ちょっとマイナーな曲だと出てこなかったりします。練習するときにメトロノームは必須なのでBPMがわかると便利です。

今回は公式ドキュメント(英語;;)とChatGPT君を頼りに作りました。
ドキュメントを読みながらコードを自分なりに書いてみて、エラーがでてどうしようもなければGPT君にお願いしていました。GPT君に丸投げはよくないけどコード理解のために使うのはいいですね。便利です。

deoxyでした！
【考え方 / JavaScript】diffTime（ミリ秒）を「何日分か」に変換したい

JavaScriptでは、日付を引き算すると ミリ秒（1/1000秒） で出てきます。
でも「何日間か」が欲しい場合、ミリ秒 → 日数 に変換する必要があります。


# 1日は何ミリ秒？
1秒 = 1000ミリ秒
↓
1分 = 60秒 = 1000 × 60
↓
1時間 = 60分 = 1000 × 60 × 60
↓
1日 = 24時間 = 1000 × 60 × 60 × 24

つまり：
```js
1日 = 86,400,000 ミリ秒（＝1000 × 60 × 60 × 24）
```


# 例で見ると…
たとえば「1月1日〜1月3日」の差は 2日間。
```js
const startDate = new Date("2024-01-01");
const endDate = new Date("2024-01-03");

const diffTime = endDate - startDate;  // ミリ秒で 172,800,000
```

これを日数にするには、さっきの「1日＝86400000ミリ秒」で割ればOK：
```js
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
```
↓
```js
diffDays = Math.floor(172800000 / 86400000) = 2（日）
```



# 要点だけまとめ
| 変換  | 値                                   |
| --- | ----------------------------------- |
| 1秒  | 1000ミリ秒                             |
| 1分  | 60秒                                 |
| 1時間 | 60分                                 |
| 1日  | 24時間                                |
| 合計  | `1000 × 60 × 60 × 24 = 86400000ミリ秒` |

なので、ミリ秒 ÷ 86400000 で「何日分か」がわかる
GENIAC：第4部 明細書、特許請求の範囲又は図面の補正

https://www.jpo.go.jp/system/laws/rule/guideline/patent/tukujitu_kijun/index.html

GENIAC-PRIZE（NEDO 懸賞金活用型プログラム）
～官公庁等における審査業務等の効率化に資する生成ＡＩ開発～

# 特許審査業務：第IV部に関するざっくり解説

## 💡そもそも「補正」って何？

特許の書類って、最初に出すときに **完璧でなくてもOK** なんです。

でもあとで「ちょっとここ直したい」と思うことがありますよね。
たとえば：

* 間違ってるところがある
* 表現がわかりにくい
* 説明が足りない

そんなときに書類を直すことを「補正（ほせい）」って言います。



## 📘どういう時に補正できるの？

補正できるタイミングは決まっています。たとえば：

| タイミング               | できる？             |
| ------------------- | ---------------- |
| 出願した直後              | ✅ OK             |
| 最初の「拒絶理由通知」を受け取ったあと | ✅ OK（期限内なら）      |
| 最後の「拒絶理由通知」のあと      | ⚠️ 限られた目的のときだけOK |
| 不服の審判を出すとき          | ✅ OK（同時に出せば）     |



## ⚠️どんな補正でもOKなの？

いいえ、「なんでもアリ」ではありません。以下のような**NG補正**があります：

### ❌ NGな補正（ダメな例）

| 名前              | ダメな理由              |
| --------------- | ------------------ |
| 新しい内容を足す        | 最初に出した内容から変わるからズルい |
| 技術の根本を変える       | 審査が振り出しに戻って混乱する    |
| 許されていない目的の補正をする | 決められたルールに違反        |



## ✅ OKな補正（目的が大事）

特に「最後の拒絶通知」以降に補正する場合は、**次の4つだけ**がOKです：

1. **いらない請求項を消す**（＝スリムにする）
2. **限定的に直す**（＝「車」→「赤い車」みたいに、より具体的にする）
3. **単純な間違いを直す**（＝タイプミスや表記ミス）
4. **わかりにくい表現をわかりやすくする**（＝誤解がないように説明）



## 💬たとえばどういうイメージ？

### ❌ NGな例：「追加してる」

> 最初は「おにぎりのレシピ」だったのに、補正で「ラーメンの作り方」も書く
> → これは新しい発明を追加してるからダメ！

### ✅ OKな例：「具体的にしてる」

> 「おにぎり」→「梅干し入りおにぎり」
> → 最初から梅干しの話は出てたし、内容を詳しくしただけだからOK！



## 👩‍⚖️補正がダメだったらどうなるの？

* タイミングによっては「**拒絶理由**」になる（まだチャンスはある）
* それ以降は「**補正が却下される**」＝その直しは無効！



## 📝まとめ（ポイント）

| 覚えておくべきこと | 内容                   |
| --------- | -------------------- |
| 補正って？     | 出した書類を直すこと           |
| いつでもできる？  | タイミングによって制限あり        |
| 何でも直せる？   | 目的や内容によって制限あり        |
| NG補正は？    | 新しい内容を足す、内容の根本を変えるなど |
| OKな補正は？   | 削除、限定、誤字修正、明確化など     |

以下の5つのPDFは、いずれも特許出願における「補正」に関する要件を詳細に解説した資料です。それぞれの内容を簡潔に説明します：

---

### 📄【04\_0100bm.pdf】第1章 補正の要件（総論）

* **補正とは何か？**
  出願後、特許請求の範囲や明細書、図面を訂正・修正できる制度。
* **補正の時期的要件**
  どのタイミングで補正できるか（例：最初の拒絶理由通知の期間内、審判請求と同時など）。
* **補正の実体的要件**
  どのような補正が許されるか。例えば、新規事項の追加や特別な技術的特徴の変更はNG。
* **拒絶理由 or 却下の違い**
  補正のタイミングによって、実体的要件を満たさないと「拒絶理由」または「補正却下」となる。

---

### 📄【04\_0200bm.pdf】第2章 新規事項を追加する補正

* **概要**
  出願後に新たな技術内容を追加することは禁止（先願主義の観点から）。
* **判断基準**
  「当初明細書等に記載した事項」内であれば補正OK。明示記載、自明な記載ならOK、それ以外はNG。
* **具体例多数**
  請求項の記載変更や限定の補正が許されるか否かについて、数値例・除くクレーム・マーカッシュ形式等、豊富な具体例あり。
* **審査官の判断進め方**
  許容される補正とされない補正を明確に分類し、それに基づき拒絶理由通知や却下決定を行う手順を示す。

---

### 📄【04\_0300bm.pdf】第3章 発明の特別な技術的特徴を変更する補正

* **概要**
  特許請求範囲の補正で、特別な技術的特徴が変わるとNG（発明の単一性要件に抵触するため）。
* **判断方法**
  補正前と補正後の発明が、同じ「一群の発明」として扱えるかどうか（＝第37条の単一性要件）で判断。
* **図解・具体例あり**
  実際の請求項構成の例を用いて、どのような補正がOKか/NGかを説明。

---

### 📄【04\_0400bm.pdf】第4章 目的外補正

* **補正の「目的」が重要**
  一定のタイミング（例：最後の拒絶理由通知後）では、補正の目的が厳しく制限される。
* **補正が認められる目的**（第17条の2第5項）

  1. 請求項の削除
  2. 特許請求範囲の限定的減縮
  3. 誤記の訂正
  4. 明瞭でない記載の釈明
* **限定的減縮の場合の追加要件**
  「独立特許要件（第17条の2第6項）」を満たす必要あり＝補正後の発明が独立して特許を受けられるか。
* **補正の審査進行の仕方**
  審査官の補正内容の認定基準や却下判断のフローを丁寧に整理。

---

### 📄【04\_9900bm.pdf】関連条文集（特許法・施行規則）

* **第17条の2**：補正の時期、範囲、目的に関する中心的条文。
* **第37条**：発明の単一性についての要件。
* **第53条、第126条**：補正の却下や訂正審判の根拠規定。
* **施行規則 第25条の8**：発明の「特別な技術的特徴」や「技術的関係」の定義。
Word2Vecでベクトル化してみた(日記)



## 📝 ASIAN KUNG-FU GENERATIONをWord2Vecでベクトル化してみた（Google Colabで簡単実装）

### 1. 必要なライブラリをインストール / Install Required Libraries

```python
!pip install gensim --quiet
!wget -q "https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz"
```

### 2. ライブラリのインポート / Import Libraries

```python
import gensim
import numpy as np
```

### 3. 学習済みWord2Vecモデルのロード / Load Pre-trained Word2Vec Model

```python
# Google News の学習済みモデル（約3GB）をロード
model_path = 'GoogleNews-vectors-negative300.bin.gz'
model = gensim.models.KeyedVectors.load_word2vec_format(model_path, binary=True)
```

### 4. 対象のアーティスト名をトークン化 / Tokenize Artist Name

```python
# アーティスト名を単語に分割 / Split into words
artist_name = "ASIAN KUNG-FU GENERATION"
tokens = artist_name.upper().replace("-", " ").split()  # → ['ASIAN', 'KUNG', 'FU', 'GENERATION']
```

### 5. 各単語をベクトル化し平均 / Vectorize and Average

```python
# 各単語のベクトルを取得（存在しない単語は除外） / Get vectors of known words
vectors = [model[word] for word in tokens if word in model.key_to_index]

# 平均ベクトルを計算 / Compute average vector
if vectors:
    vector_avg = np.mean(vectors, axis=0)
    print("Vector shape:", vector_avg.shape)
    print("Sample (first 10 dims):", vector_avg[:10])
else:
    print("No known tokens found in the model.")
```

---

### 🔍 補足解説

* **GoogleNews-vectors-negative300.bin.gz**：Googleが公開している3億語を含むWord2Vecモデル。
* `"ASIAN KUNG-FU GENERATION"` はトークン `['ASIAN', 'KUNG', 'FU', 'GENERATION']` に分解され、各単語ベクトルを平均することでアーティスト名全体を300次元ベクトルとして表現。
* `model.key_to_index` で未知語チェックが可能。

---

### 💡 応用アイディア

* 類似アーティスト検索：

  ```python
  model.most_similar(positive=[vector_avg], topn=5)
  ```
* 他のバンドとのコサイン類似度：

  ```python
  other = "RADWIMPS".split()
  other_vec = np.mean([model[w] for w in other if w in model], axis=0)
  sim = np.dot(vector_avg, other_vec) / (np.linalg.norm(vector_avg) * np.linalg.norm(other_vec))
  print("Cosine similarity:", sim)
  ```

---
ポケモンで学ぶ！A/Bテスト統計検定4選：Z検定・t検定・カイ二乗検定・Mann-Whitney U検定



# ポケモンで学ぶ！A/Bテスト統計検定4選：Z検定・t検定・カイ二乗検定・Mann-Whitney U検定

A/Bテストとは、2つの選択肢（AとB）を比較し、どちらが統計的に有意な違いを持つかを検定によって評価する手法です。この記事では、**ポケモンの種族値**を題材に、以下の4つの代表的な統計検定を解説・実装していきます。

---

## 対象データ：ポケモン種族値

サンプルデータは以下の通りです：

| Name      | Group | HP  | Attack | Sp. Atk | Total |
| --------- | ----- | --- | ------ | ------- | ----- |
| Pikachu   | A     | 35  | 55     | 50      | 320   |
| Charizard | A     | 78  | 84     | 109     | 534   |
| Gengar    | A     | 60  | 65     | 130     | 500   |
| Alakazam  | A     | 55  | 50     | 135     | 500   |
| Blastoise | B     | 79  | 83     | 85      | 530   |
| Venusaur  | B     | 80  | 82     | 100     | 525   |
| Machamp   | B     | 90  | 130    | 65      | 505   |
| Snorlax   | B     | 160 | 110    | 65      | 540   |

---

## 1. Z検定：母比率の差の検定

**目的：**「Group Aのポケモンのうち、特攻(Sp. Atk)が100を超える割合がGroup Bより高いか？」

```python
from statsmodels.stats.proportion import proportions_ztest
count = [2, 1]  # 100超え：Aに2体、Bに1体
nobs = [4, 4]   # 各群の標本数
stat, pval = proportions_ztest(count, nobs)
print(f"Z = {stat:.3f}, p = {pval:.3f}")
```

→ **解釈：** p < 0.05 なら、Aのほうが特攻が高い傾向に有意。

---

## 2. t検定：平均の差の検定

**目的：**「Group AとGroup Bで合計種族値の平均に差があるか？」

```python
from scipy.stats import ttest_ind
group_a = [320, 534, 500, 500]
group_b = [530, 525, 505, 540]
stat, pval = ttest_ind(group_a, group_b, equal_var=False)
print(f"t = {stat:.3f}, p = {pval:.3f}")
```

→ **解釈：** 平均値の差が有意かを検定。

---

## 3. カイ二乗検定：カテゴリーデータの分布差

**目的：**「Attackが80以上かどうかの分布に差があるか？」

```python
from scipy.stats import chi2_contingency
import pandas as pd

data = {'Group': ['A']*4 + ['B']*4, 'Attack': [55, 84, 65, 50, 83, 82, 130, 110]}
df = pd.DataFrame(data)
df['AttackHigh'] = df['Attack'] >= 80
contingency = pd.crosstab(df['Group'], df['AttackHigh'])
chi2, pval, _, _ = chi2_contingency(contingency)
print(f"Chi2 = {chi2:.3f}, p = {pval:.3f}")
```

→ **解釈：** Attackが高いポケモンの分布に差があるか。

---

## 4. Mann-Whitney U検定：順位和検定（ノンパラメトリック）

**目的：**「Total種族値に順序的な差（中央値の違い）はあるか？」

```python
from scipy.stats import mannwhitneyu
u_stat, pval = mannwhitneyu(group_a, group_b, alternative='two-sided')
print(f"U = {u_stat:.3f}, p = {pval:.3f}")
```

→ **解釈：** 正規性を仮定せず中央値の差を評価可能。

---

## まとめ：どの検定を使うべき？

| 検定手法             | データ型   | 仮定              | 目的                 |
| ---------------- | ------ | --------------- | ------------------ |
| Z検定              | 比率（2値） | 母比率の正規近似        | 特性の割合比較（例：特攻100超え） |
| t検定              | 連続変数   | 正規分布（または近似）     | 平均値の差の検定（例：合計値）    |
| カイ二乗検定           | クロス集計  | 十分な頻度数が必要       | カテゴリの独立性検定         |
| Mann-Whitney U検定 | 順序・連続型 | ノンパラメトリック（非正規可） | 中央値や順位の差の検定        |

---

## おわりに

ポケモンの種族値は、攻撃力や特攻などさまざまな数値で構成されており、統計的検定を学ぶ素材としても最適です。A/BテストはWeb業界だけのものではなく、データに基づいた意思決定全般に応用できます。ポケモン×統計で、楽しく分析力を鍛えましょう。

---
AWS Amplify でのバックエンド（DBへの接続）に苦労した話


## はじめに
私は個人製作のWebサイトをAmplifyで作成し、運用まで載せてみることを目標にしています。AWSの他機能は業務で触れたことがありますが、Amplifyは初なので慣れた人から見たら「何を言っているの？」というところもあるかもしれませんがご了承ください。
https://everyit.net/ (宣伝です。デザインは整っていませんが依頼登録まで行えます。)

### この記事でわかること
- 誰かが詰まるかもしれない場所について、助けになるかもしれないと思いました。


### この記事の対象者
- AWS Amplify をこれから触り始める方

### 動作環境・使用していた機能など
- VSCode
- React ＋ Typescript
- Gtihub連携
- DynamoDB

## 結論
Amplifyの「バックエンド」と「フロントエンド」は、
__バックエンドのデプロイを先に行ったほうがやりやすいと思います。__

## Amplifyアプリケーションが重複してしまう
AWS Amplifyの利用者は、基本的にバックエンドも利用したいと思いますので、もしかしたら普通の人は詰まらない場所かもしれません。

私の場合、先に目に見える画面のほうを優先して作りたい性格のため、
__コードをGithubへプッシュし、GithubからAmplifyプロジェクト作成（AWSでの操作）__ という順にしてしまいました。

しかしながら、後でバックエンドの作成をして気づいたのですが、
__バックエンドのデプロイを行っても新しくAmplifyアプリケーションを作成してしまいます。__ これにより元々Githubに紐づけて作成したAmplifyアプリケーションと重複してしまいました。

バックエンドを先に行って作成したAmplifyアプリケーションの場合、「AmplifyアプリケーションのホスティングをGithubに紐づける」という選択肢ができます。このため、無駄に詰まることなくスムーズに進められるのではないかと思います。

## 対処方法（私の場合）
1. Ampifyプロジェクト（バックエンドのみ）
1. Ampifyプロジェクト（フロントのみ、Github連携済み）
 
の2プロジェクトが存在している状態ですが、
- 2のGithub連携を解除
- 1のプロジェクトにGithub連携を付ける
- 2のプロジェクトを削除する

という対処を行うことで解消しました。
方法はシンプルですが、Amplifyに触るのが初めてな中で、「連係解除」や「削除」の操作を行うことに、とても気を張ってしまったので可能なら避けた方がいいなと思います。
atomicで別スレッドと同期をとる

```c++
#include <unistd.h>
#include <atomic>
#include <iostream>
#include <thread>

// 引数でatomicの変数を参照型で受け取る
void thread_func(std::atomic<bool>& alive_flg)
{
    for (int i = 0; i < 1000; ++i) {
        usleep(1000);
    }
    alive_flg = false;
}

int main()
{
    std::atomic<bool> alive_flg{0};
    std::uint32_t loop_counter = 0;
    while(true)
    {
        static bool initailized = false;
        static std::thread thread_ins;
        if(initailized == false)
        {
            alive_flg = true;
            // スレッド作成：参照型の引数はstd::ref(変数)で渡す
            std::thread t1{thread_func, std::ref(alive_flg)};
            thread_ins.swap(t1);
            initailized = true;
        }
        else if(alive_flg == false)
        {
            thread_ins.join();
            break;
        }
        loop_counter++;
    }
    std::cout << "loop counter : " << loop_counter << std::endl;

    return 0;
}
```

#### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53743/2e32530e-20a8-4d49-8cd7-0dcec5213c1b.png)


<HR>

### 失敗例：
```c++
#include <unistd.h>
#include <atomic>
#include <iostream>
#include <thread>


void thread_func(std::atomic<bool>& alive_flg)
{
    for (int i = 0; i < 1000; ++i) {
        usleep(1000);
    }
    alive_flg = false;
}

int main()
{
    std::atomic<bool> alive_flg{0};
    std::uint32_t loop_counter = 0;
    while(true)
    {
        static bool initailized = false;
        // インスタンスを自動変数で定義すると
        // 確保したスレッドコンテキストが破棄され例外が発生
        std::thread thread_ins;
        if(initailized == false)
        {
            alive_flg = true;
            std::thread t1{thread_func, std::ref(alive_flg)};
            thread_ins.swap(t1);
            initailized = true;
        }
        else if(alive_flg == false)
        {
            thread_ins.join();
            break;
        }
        loop_counter++;
    }
    std::cout << "loop counter : " << loop_counter << std::endl;

    return 0;
}
```
#### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53743/7b35cf40-20a3-4e13-a88a-b89f05582839.png)
AWS一番最初やったこと

# 前提自分１人かつメアド一つの時
## ①必要なプロジェクトの分だけメールアドレスのエイリアスを作る
## ②AWS Organizations
先ほど作ったメールアドレスのエイリアス達を使って、その数分のAWSアカウントを作成する。
多分これがテナントみたいなイメージかな？
それぞれのプロジェクトごとに作る感じ。
## ③IAM Identity Center
（これがアクセスポータルの管理見たいなとこ）

ユーザーを作成する。（※これはなんでもOKっぽいAWS始めるってやった時のメールアドレスで大丈夫だと思う。）

許可セットを作成する。
この許可セットはプロジェクト？テナント？とりあえず②で作ったものに対してアクセスポータルからログインするときにどのような権限でログインできるかというルールを作成する。
一旦用意されているものを使う。

AWSアカウントから作ったユーザーと許可セットを紐づけるために割り当てを開始する。

②で作ったもの分やる。

## 終わり
後はアクセスポータルからログインしてそれぞれに対してawsの構成を組んでいく。

これがあっているのか間違っているのかは追々わかるだろう。
インフラは勉強してないし会社の業務で触れてないから全然わからない。
むずすぎ。
勉強しないと。
Python 入門カリキュラム



## 🐍 Python 入門カリキュラム（基礎～実践）

### 第1章：Pythonの基本構文と実行環境

* **1.1** Pythonとは何か
* **1.2** 実行環境の準備（JupyterLab / VSCode / Google Colab）
* **1.3** Hello Worldとprint文
* **1.4** コメントとインデントの重要性
* **1.5** 変数と代入、データ型（int, float, str, bool）

### 第2章：基本的なデータ構造

* **2.1** リスト（list）
* **2.2** タプル（tuple）
* **2.3** 辞書（dict）
* **2.4** セット（set）
* **2.5** 内包表記（list/dict comprehension）

### 第3章：制御構文

* **3.1** if文（条件分岐）
* **3.2** for文（ループ）
* **3.3** while文（ループ）
* **3.4** break, continue
* **3.5** 条件式（論理演算、比較演算）

### 第4章：関数とモジュール

* **4.1** 関数の定義と呼び出し（`def`）
* **4.2** 引数と戻り値
* **4.3** モジュールのimport
* **4.4** ライブラリの活用（math, random, datetime など）

### 第5章：ファイル操作と例外処理

* **5.1** ファイルの読み書き（`open`, `with`構文）
* **5.2** CSVの読み書き（`csv`モジュール）
* **5.3** 例外処理（`try-except`）

### 第6章：クラスとオブジェクト指向入門

* **6.1** クラス定義（`class`）
* **6.2** コンストラクタ（`__init__`）
* **6.3** インスタンス変数とメソッド
* **6.4** 継承とポリモーフィズム

### 第7章：ライブラリによるデータ操作

* **7.1** NumPyによる配列演算
* **7.2** pandasによるデータフレーム処理
* **7.3** matplotlibによるグラフ作成

### 第8章：実践課題とプロジェクト

* **8.1** 家計簿アプリ（ファイル入出力 + 集計）
* **8.2** 天気データの可視化（pandas + matplotlib）
* **8.3** 簡単なWebスクレイピング（requests + BeautifulSoup）
* **8.4** ランダムゲーム（じゃんけん、数当てなど）

---

### 📦 学習補助・参考ツール

* [Python公式ドキュメント](https://docs.python.org/ja/3/)
* [paizaラーニング（入門コース）](https://paiza.jp/works/python)
* [ドットインストール Python入門](https://dotinstall.com/lessons/basic_python_v3)

---
デジタル回路における遅延・消費電力・発熱の関係（MOSFET基盤）



### ✅ 1. 遅延時間（Propagation Delay）

#### 🔹 RCモデルによる基本式：

$$
t_{pd} = R_{on} \cdot C_L
$$

* $R_{on}$：MOSFETオン抵抗（PMOS/NMOS）
* $C_L$：出力ノードの負荷容量（配線 + 次段ゲート）

#### 🔹 ドレイン電流ベースの式：

$$
t_{pd} = \frac{C_L \cdot V_{DD}}{I_{drive}}
\quad \text{where} \quad
I_{drive} \approx \mu C_{ox} \frac{W}{L} (V_{GS} - V_{th})^2
$$

---

### ✅ 2. 上昇遅延 / 下降遅延（非対称性）

* $t_{PLH}$：Low → High（PMOSがオン）
* $t_{PHL}$：High → Low（NMOSがオン）

通常：

$$
R_{on}^{(P)} \neq R_{on}^{(N)} \quad \Rightarrow \quad t_{PLH} \neq t_{PHL}
$$

→ PMOSは移動度 $\mu_p \ll \mu_n$ のため**幅Wを広く**する設計

---

### ✅ 3. 寄与要素まとめ

| 要素           | 物理的意味                               | 備考            |
| ------------ | ----------------------------------- | ------------- |
| $R_{on}$     | $\propto \frac{1}{\mu (W/L)}$       | $\mu$：キャリア移動度 |
| $C_L$        | $C_L = C_{wire} + C_{gate-next}$    | ファンアウト、配線長依存  |
| $W \uparrow$ | $R_{on} \downarrow$, $C_L \uparrow$ | 遅延減・電力増       |

---

## ✅ 4. 消費電力（Power Dissipation）

---

### 🔹 動的消費電力（スイッチング損失）

$$
P_{dynamic} = \alpha \cdot C_L \cdot V_{DD}^2 \cdot f
$$

* $\alpha$：スイッチング確率（0〜1）
* $f$：クロック周波数

---

### 🔹 静的消費電力（リーク電流損失）

$$
P_{static} = I_{leak} \cdot V_{DD}
$$

* $I_{leak}$：サブスレッショルド、BTBT、ゲートリークなどによる

---

### 🔹 バイアス電流損失（アナログMOS）

$$
P_{bias} = I_D \cdot V_{DS}
$$

* 特に**小信号MOSFET**の定常動作ではこれが支配的

---

## ✅ 5. 発熱（温度上昇）

---



### 🔹 目安（小信号MOSの場合）：

$$
P_{total} \sim 1~\mu\text{W} \quad \Rightarrow \quad \Delta T \sim \text{数mK〜K}
$$

---

## ✅ 6. 総括：数式一覧表

| 項目     | 数式                                                         |
| ------ | ---------------------------------------------------------- |
| 遅延時間   | $t_{pd} = R_{on} \cdot C_L = \frac{C_L V_{DD}}{I_{drive}}$ |
| ドライブ電流 | $I_{drive} = \mu C_{ox} \frac{W}{L} (V_{GS} - V_{th})^2$   |
| 動的電力   | $P_{dynamic} = \alpha C_L V_{DD}^2 f$                      |
| 静的電力   | $P_{static} = I_{leak} V_{DD}$                             |
| バイアス損失 | $P_{bias} = I_D V_{DS}$                                    |
| 発熱     | $\Delta T = \theta_{JA} \cdot P_{total}$                   |

---
高校生がUnityでゲーム制作に挑戦してみた。

# はじめに

学校の中間テストが終わり（二つの意味で）、少し落ち着いてきましたので記事を書こうと思います。  
校内順位が低すぎたため、予備校に入ろうかどうか迷っています('_')

前置きはこのくらいにして、本記事は簡単で分かりやすくまとめました。  
少しでも目を通していただければ幸いです！

> **※ このゲームは初めて外部公開した作品です。**  
> クオリティはまだまだですが、これからさらに良いゲームを作れるよう日々精進していきます！  
> [Easy 3D Zombie](https://unityroom.com/games/easy3dzombie)

---

## 🎮 ゲーム概要

今回作成した **3Dタワーディフェンス風ゲーム** は、以下の4点で簡潔にまとめられます。

1. **フェーズ制でのゾンビ襲来**  
   - 大量のゾンビが四方からランダムに攻めてくる

2. **配置フェーズ**  
   - **ゾンビ誘導＆足止め用の壁** と **迎撃用タレット** を自由に配置可能

3. **タレットによる攻撃**  
   - タレットが自動でゾンビを狙い撃ちする

4. **勝敗条件**  
   - 中央の基地を **5フェーズ** 守り切れば勝ち  
   - 一定回数基地がゾンビに触れられたら敗北  

---

## 🔧 各要素の実装と苦労した点

### 1️⃣ フェーズ制で大量のゾンビ襲来  
**苦労度:** ★★⭐︎⭐︎⭐︎  

3Dゲームとして **NavMesh** を活用し、ゾンビに中央基地までの最短ルートをたどらせました。  
NavMesh には **Bake** 機能があり、どの地形を通るかを定義できますが、タレットなどの建築物を配置した際、Bake を更新しなければゾンビがタレットの位置を認識できず、詰まる問題が発生しました。  

✅ **解決策:**  
フェーズ開始直前に **Bake を更新** することで、正しい経路が確保されるようにしました。

---

### 2️⃣ 壁とタレットの自由配置機能  
**苦労度:** ★★★★⭐︎  

この機能では、特定のキーを押すと **プレイヤーの視線先に壁やタレット（以下「建築物」）を配置** できるようにしています。  
ただし、配置前にどこにどう置かれるかが分からないと不便なので、  
**フォートナイト** の建築のように **半透明プレビュー** を表示する仕組みを実装しました。

#### 🏗 実装の流れ

1. **Ray をプレイヤーの視線先から発射**  
2. **Ray が床に当たった座標を取得**  
3. **半透明の建築物をその座標に表示**  
4. **Ray の座標を追従しつつ設置可能か判断**  
5. **設置可能なら実物を配置**

#### 🚧 主な苦労と解決策

- **問題①: Ray が目的の座標ではなく、Player や半透明プレビューの座標を取得してしまう**  
  → ✅ **解決:** レイヤーマスクを使用し、Player や半透明の建築物のレイヤーを除外

- **問題②: 建築物のコードが見づらい**  
  → ✅ **解決:** 以下の方法で整理  
  1. **Ray で取得した視線先に Empty オブジェクトを追加し追尾**  
  2. **Y座標を若干高く設定し、地面へのめり込みを防止**  
  3. **Trigger をアタッチし、箱型に変更して接触判定**  
  4. **Empty に配置可否の判断コードを組み込み**  
  5. **設置スクリプトには可否情報のみを伝達し、冗長性を削減**  

この方法により、スパゲッティ気味だったコードの整理が進み、**管理しやすいコード設計**が実現しました。

---

### 3️⃣ タレットがゾンビを打ちまくる  
**苦労度:** ★★★★★  

タレットは設置するだけで **自動索敵＆最適な敵を狙撃** します。  
ただし、大量のゾンビがいる状況での**パフォーマンス最適化**が難題でした。  

#### 🎯 実装のポイント
- 敵の座標を全探索せず **【射線が通っている】条件でフィルタ** し、  
  **ユークリッド距離の計算負荷を削減** してパフォーマンス向上。

- **具体的なコード例:**
  ```csharp
  foreach (GameObject enemy in enemies)
  {
      Vector3 directionToEnemy = (enemy.transform.position - firePoint.position).normalized;

      if (Physics.Raycast(firePoint.position, directionToEnemy, out RaycastHit hit, Mathf.Infinity))
      {
          if (hit.collider.gameObject == enemy)
          {
              float distance = Vector3.Distance(transform.position, enemy.transform.position);

              if (distance < minDistance)
              {
                  minDistance = distance;
                  closestEnemy = enemy;
              }
          }
      }
  }
  ```

- **後悔ポイント:**  
  偏差射撃の実装は、敵の進行方向・速度、弾速、発射タイミングなど、膨大な計算が必要だったため断念。  

---

## 🎭 UX向上のための演出追加

### 💥 爆発エフェクトの改善
タレットが撃った弾が **壁に当たると爆発** する演出を追加しました。  
爆発時の光が **瞬間的に発生し、徐々に消える** ことで、よりリアルな表現に。

---

### 🎞 エンドロールの実装
ゲームを最後までプレイしてくれた方へ **感謝の気持ちを込めてエンドロール** を追加。  
ワンクリックで即終了ではなく、**クリア画面からエンドロールへ遷移** でき、途中スキップも可能にしました。

---

# 🔚 結び
このゲーム制作を通じて、  
**ゲーム内のオブジェクトが密に連携するシステムの奥深さ** を実感しました。  

培ったノウハウを **次回作に活かしていきたい** と思います。  
最後まで読んでいただき、ありがとうございました！  

📌 [ゲームはこちら](https://unityroom.com/games/easy3dzombie)  

🖼 **没になったサムネイルを供養…**  
![Thumbnail](https://storage.googleapis.com/zenn-user-upload/0897d95e3900-20250604.png)
【React入門】Reactにおけるコンポーネントとは？どのように動作するのか？


**コンポーネントはReactアプリケーションの構成要素**であり、複雑なユーザーインターフェースを小さく管理しやすい単位に分割することで、大規模なアプリの開発や保守を容易にしてくれます。

---

### コンポーネントの種類

Reactには主に以下の2種類のコンポーネントがあります：

* **関数型コンポーネント（Functional Components）**
* **クラスベースコンポーネント（Class-based Components）**

現在のReactでは、**関数型コンポーネントが主流**です。本記事でもすべて関数型の例を用いています。

---

### コンポーネントの基本的な考え方

コンポーネントは、**UIを記述する要素を返すJavaScript関数のようなもの**です。このUIは、**JSX**というJavaScriptの拡張構文で表現されます。JSXはHTMLに似ていますが、より宣言的な記述が可能です。

---

### コンポーネントの例

```jsx
function Greeting() {
  const name = "John";
  {/* 結果：Hello John */}
  return <h1 className="title">Hello {name}</h1>;
}
```

この例では、`Greeting` というコンポーネントを定義しています。`h1`タグの中の `{}` はJavaScriptの式を埋め込むために使われており、`name` 変数の値が表示されます。

`class`ではなく `className` を使っているのは、`class`がJavaScriptの予約語だからです。

また、JSX内のコメントは `{/* コメント */}` の形式で書く必要があります。

---

### コンポーネント名は大文字で始める理由

Reactでは、**大文字で始まる名前を「カスタムコンポーネント」として認識**します。一方で、小文字で始まるタグ（例：`<div>` や `<span>`）はHTMLの標準要素として扱われます。この区別によって、ReactはHTMLタグと開発者が定義したコンポーネントを区別します。

---

### コンポーネントの使い方

`Greeting` コンポーネントを使用するには、次のように記述します：

```jsx
<Greeting />
```

`<Greeting />` とスラッシュで閉じているのは、JSXではすべてのタグが**明示的に閉じられている必要がある**ためです。子要素がないコンポーネントやタグでも、`/>` が必要です。

---

### 複数要素の返却とFragmentの使い方

以下のように複数の要素を返そうとすると、エラーになります：

```jsx
function Greeting() {
  const name = "John";
  return <h1>Hello {name}</h1>
  <p>Nice to meet you.</p>
}
```

エラーメッセージ：

> Adjacent JSX elements must be wrapped in an enclosing tag
> （隣接するJSX要素は囲むタグでラップする必要があります）

このエラーを解消するには、`<div>`などの親要素で囲むか、**React Fragment**を使います。

```jsx
import { Fragment } from 'react';

function Greeting() {
  const name = "John";
  return (
    <Fragment>
      <h1>Hello {name}</h1>
      <p>Nice to meet you.</p>
    </Fragment>
  );
}
```

省略記法として、空のタグ `<>` と `</>` を使うこともできます：

```jsx
function Greeting() {
  const name = "John";
  return (
    <>
      <h1>Hello {name}</h1>
      <p>Nice to meet you.</p>
    </>
  );
}
```

---

### まとめ

Reactコンポーネントは、UIを小さな部品に分割して再利用可能にするための仕組みです。JSXを使って見た目を定義し、`props`や`state`によって動的な振る舞いを実現します。**現代のReactでは関数型コンポーネントが主流**であり、JSXと組み合わせることで直感的かつ強力なUI開発が可能になります。
NetBSD 10.1 を発表 (2024年 12月 16日)

# 「はじめに」
以下は https://www.netbsd.org/releases/formal-10/NetBSD-10.1.html の翻訳です。

また、恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

では、以下、翻訳です。

:::note info
せっかちな人向けのクイックリンク

私たちの CDN から 10.1 をダウンロードしてください: amd64 USB、amd64 CD、さまざまな ARM デバイス、その他すべての完全なリリースディレクトリ。

NetBSD セキュリティオフィサーの PGP 鍵で署名された、ディストリビューション中のすべてのファイルのハッシュ。
:::

# はじめに
NetBSD プロジェクトは、NetBSD 10 安定版ブランチの最初のポイントリリースである NetBSD 10.1 を発表しました。

# アップグレード手順
既存のインストールは、インストールイメージを起動してアップグレードオプションを選択することでアップグレードできます。

他の更新方法を使用している場合は、まずカーネルとモジュールを更新し、それから再起動してユーザ空間を更新してください。パッケージリポジトリの URL を調整し、すべてのサードパーティパッケージを更新することが必要です。sysinst(8) で個別にインストールする必要があるかもしれない、 新しい gpufw セットの追加にも注意してください。

# NetBSD 10.0 からの変更
## カーネル
- compat_netbsd32: SIOCGIFDATA と SIOCZIFDATA ioctl のサポートを追加。
- dtrace: x86 で Supervisor Mode Access Prevention のサポートを追加。
- zvol: DIOCCACHESYNC を実装し、Xen domU 上の ZFS のパフォーマンスを改善。
- socket(2): パフォーマンスの低下を修正。
- bridge(4): いくつかのルータ製品の "protected-port" や "isolation" に似た機能であるインタフェース保護を実装。フレームが保護されたインタフェースに到着し、別の保護されたインタフェースに転送される場合、フレームは破棄されます。
- raid(4): スペアおよびコンポーネントのホットな取り外しを実装。
- raidctl(8): シンプルな RAID セットの単一のコマンドライン設定を実装。
- shmif(4): リンク状態の変更をサポート。
- wg(4): ドキュメンテーションの改善と種々の修正。
- NFS: 32GB 以上の RAM を持つサーバの修正と、64 ビット time_t への移行で残っていたマイナーなバグを修正。
- DRM: さまざまな修正。
- NPF: bpf コード生成の修正。

## デバイスドライバ
- acpiout(4): 特定のマシンの輝度コントロールを修正。
- re(4): Realtek/Killer E2600 Ethernet のサポートを追加。
- uftdi(4): さまざまな Brainboxes USB シリアルアダプタのサポートを追加。
- ure(4): TP-Link UE300 USB Ethernet デバイスのサポートを追加。
- urtwn(4): Mercusys MW150USV2 Wi-Fi アダプタのサポートを追加。
- viac7temp(4): amd64 GENERIC にドライバを追加。
- virtio(4): さまざまな修正。
- apei(4): ACPI プラットフォームエラーインタフェースの新しいドライバ。

## ユーザー空間
- shmif_pcapin(1): shmif(4) のテストのための新しいユーティリティプログラム。
- pax(1): 特にファイル作成時のさまざまなエッジケースを修正。
- xsetwallpaper(1): マニュアルページをインストール。
- envstat(8): powerd(8)、traceroute(8): クランチされたバイナリとしてランプ化されたプログラムのビルドを可能にするため、CRUNCHOPS のサポートを追加。
- httpd(8): モバイルフレンドリーなディレクトリ一覧を生成。
- ifconfig(8): lagg(4) : インタフェース用のパラメータを記載。
- sshd(8): シグナルハンドラの安全ではない関数の使用を修正 (CVE-2024-6387)。
- getentropy(3): POSIX.1-2024 アプリケーションに、現在では標準化されたインタフェースを公開。
- ftp(1): バージョン 20241129 に更新。

## ポート
- libsa [各種ブートローダー]: NFSv3 のサポートを追加 (失敗した場合は NFSv2 にフォールバック)。
- aarch64: Ampere Altra/Altra Max の修正。
- aarch64: GENERIC64 にいくつかのシンプルな PCI オーディオデバイスを追加（QEMU で使用するため）。
- evbppc: WII カーネルの設定で GPT dk(4) ウェッジを自動的に検出。
- i386: CD-ROM に再び収まるように ISO イメージのサイズを縮小。
- hp300: ブート可能な CD-ROM イメージを作成。
- mac68k、macppc: ブート可能なインストール CD-ROM イメージを作成するためのツール mkhybrid(8) を追加。
- x86: VIA CPU 用の各種修正。
- x86: AMD CPU の errata 778, 1474 を緩和。
- x86: amdzentemp(4) に Zen 5 のサポートを追加。

## システム
- getentropy(3) および arc4random(3): VM がクローンされた場合に自動的に再シード。
- Mozilla のルート証明書を 2024-08-23 に更新。

## ライブラリ
- stat(2): - ドキュメントの改善。
- err(3): - ドキュメントの改善。
- strcpy(3): - ドキュメントの改善。
- usleep(3): - useconds >= 1000000 での呼び出しを許容。
- libarchive をセキュリティ修正のため 3.7.7 に更新。
- Xserver を 21.1.14 に更新。

## ビルドシステム
- ntpd(8) の再現性を修正。
- FreeBSD 14 のツールのブートストラップを修正。
ViteでElectron環境を立ち上げる備忘録

# モチベーション
- Viteを使うとElectronでのデスクトップアプリ開発は捗る（という噂を聞いた）
    - ビルドがめちゃくちゃ軽いので、動作確認が楽
- Electronは環境構築が面倒なのでなるべく楽したい
- TailwindCSSも一緒に使いたい

# 前提
- Nodejs導入済み
    - 今回はnvmでv22.14.0を利用

# Electron環境構築
- 日本語情報だと@quick-start/electron@latestとかも出てくるが、これはサードパーティー製
- 基本的に公式へ従っておくが吉なので、以下の手順で実施

```bash
npm create vite@latest my-electron-vite-project

# インストールは以下の順で選択
# Select: Others
# Select: Electron (create-electron-vite)
# Select: React

cd my-electron-vite-project
npm install
```

# Electronの動作確認

```bash
npm run dev
```

# (Option) TailwindCSSインストール
- 最新バージョンはv4
- ネットにはv3の構築方法が蔓延っているので、公式に従ってインストール

```bash
npm install tailwindcss @tailwindcss/vite
```

- 以下のように各ファイルを編集する

```:vite.config.ts
import { defineConfig } from 'vite'
import path from 'node:path'
import electron from 'vite-plugin-electron/simple'
import react from '@vitejs/plugin-react'
[+] import tailwindcss from '@tailwindcss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
[+]     tailwindcss(),
    react(),
    electron({
      main: {
        // Shortcut of `build.lib.entry`.
        entry: 'electron/main.ts',
      },
(以下省略)
```

- どちらにしろデフォルトのcssは一度すべて削除すると思うので、追記・新規作成どちらでもよい
```:index.css
[+] @import "tailwindcss";
```

- Reactflowなど他コンポーネントでTailwindCSSを使う場合、important記述が必要になることがある
- ネットにはv3の記述が蔓延っているが、v4では設定方法が根本的に異なる
- v4のimportant記述は以下の通り

```:index.css
[+] @import 'tailwindcss' important;
```

# 参考
- https://stackoverflow.com/questions/79562593/electron-vite-react-tailwindcss-v4
- https://github.com/tailwindlabs/tailwindcss/discussions/15803
AIエージェント同士が商談する世界がきたら、流通はどう変わる？

# はじめに
最近、AIエージェントを使った情報収集や意思決定支援のサービスがいろいろ登場してきました。
ふと思ったのですが、もしこうしたAIエージェント同士が商品の提案や価格交渉といった「商談」までやり取りできるようになったらどうなるでしょうか？

今はまだそういう技術やサービスの話題はあまり見かけませんが、
最近の技術トレンドを見ていると、例えば：

・LLM（大規模言語モデル）による柔軟な対話生成
・RAG（Retrieval-Augmented Generation）で商品情報や在庫情報を動的に参照
・API連携（REST / GraphQL）でリアルタイムな価格・在庫取得
・LangChain / AutoGen などを使った AIエージェント間プロトコル設計
・マルチエージェントシステム（MAS）系の研究成果

こうした技術を組み合わせたら、AIエージェント商談サービス のプロトタイプくらいはもう作れそうな気がします。

誰か本気でこういうサービスを作り始めたら面白いなあ、と思いながら、
今回は もしそんなサービスが普及したら流通や買い物の世界はどう変わっていくのか？ をちょっと想像してみました。

## AIエージェント同士が商談する買い物
##### 今の買い物の流れ

1️.  検索窓にキーワードを入れて
2️.  自分で色々なサイトを巡って情報を集め
3️.  価格や在庫を確認し
4️.  購入手続きを進める

だいたいこんな流れですよね。
##### AIエージェント時代の買い物

もしAIエージェントが普及すると、こんな風になるかもしれません：

1. ユーザーは「こういうのが欲しい」と自然言語でリクエスト
2. ユーザー側のAIエージェントがその意図を理解
3. 各販売側の AIエージェントに問い合わせて
4. 価格・在庫・配送条件などを収集・交渉
5. 条件が整ったものをまとめてユーザーに提案
6. ユーザーはOKを出すだけ

## 価格のあり方も変わる？

こうなってくると、今の「定価」という概念はだんだん変わってきそうです。
AI同士が商談している間に、価格はリアルタイムに調整されていくでしょう。
例えばこんな価格モデルが一般的に？

|モデル|内容|
|:-:|:-:|
|ダイナミックプライシング	| 需要やタイミングで変動|
|パーソナライズドプライシング	| ユーザーごとに価格が変わる|
|エージェント間自動交渉 |	AI同士がリアルタイムで価格交渉|
|サブスクリプション＋変動課金 |	定額＋オプション料金|

## もし流通全体がAIエージェント化したら？

さて、もしこういう AIエージェントによる商談 が当たり前になったら、
当然 ECだけでなく流通全体にも波及していきそうです。

#### 主に変わっていきそうな部分

① 卸売業者の役割の変化
② 物流企業の役割の変化
③ メーカーと消費者の関係性（今より近くなる？）
④ AIエージェントを提供するプラットフォームの台頭

今回は特に 卸売業者 と 物流企業 のところを少し詳しく考えてみます。
##### 卸売業者はどうなる？
従来、卸は「情報」や「価格調整」の部分で価値を出していました。

でもAIエージェント同士が直接価格や在庫をやり取りできるなら、
その役割は薄れます。
じゃあ全滅か？というとそうでもなく：

・AIエージェント同士をつなぐためのAPIやデータ基盤を整備する側に回る（IT企業化）
・物流面や品質保証のハブになる（物理的な問題はまだ解決されない）

など、新しい価値の出し方は十分にあります。
##### 物流企業はどうなる？

一方で、今度は物流企業側に「物理的な商流の課題」がどんどん集まってきそうです。
例えば：

・メーカーはロット単位でしか出荷できない → ロット崩しは誰がやる？
・複数メーカーの商品をまとめて小口配送したい → どこでやる？
・返品対応や品質管理は誰が担う？

こうしたところは今後 物流企業が担う領域が増えていくのではと考えました

## まとめ

#### AIエージェント同士の商談が当たり前になったら

・価格はもっと柔軟・動的になる
・情報の仲介はAIで済む時代に
・卸売業者は IT企業化／AIインフラ提供側 に
・物流企業は 物理的な問題解決側 に進化
・商流全体が今よりも シームレス になっていく

## おわりに

AIエージェント同士が商談する未来は、技術的にはもう 手の届くところにあります。
もしこの流れが加速したら、私たちの買い物体験はもちろん、
物流や流通の仕組みそのものも大きく変わるかもしれません。

そうなると、新しいAIの使い方やサービスの形もいろいろ出てきそうです。
今後の動きがとても楽しみですね。
【Rails備忘録】「@」で始まるインスタンス変数と「:」で始まるシンボルの違い

現在テックキャンプの短期集中コースを受講しているKengineerです。

5月上旬に短期集中コースで受講を開始して、ここまで駆け足で進めてきました。
アウトプットが全然できていないことを反省し、カリキュラムで学んだことや、最終課題、オリジナルアプリ開発に関連した内容を、投稿していきたいと思います。

まずはにフォーム実装でよく出てくる「@」で始まるインスタンス変数と「:」で始まるシンボルの違いや、コントローラーはじめ、html.erbの中での記述方法が最初学んだときに全然頭に入ってこなかったので、今の自分の理解を備忘録としてまとめてみます。


## 1. 「@」で始まるインスタンス変数とは？
- コントローラーで定義する**インスタンス変数**
- たとえば「@categories」「@user」など
- **ビュー（HTML）にデータを渡したいとき**に使う
- インスタンス変数をコントローラーで定義し忘れると、ビューでエラーになるので注意

**例：コントローラーでの定義**
```ruby
# app/controllers/items_controller.rb
def new
  @categories = Category.all
  @item = Item.new
end
```
このように定義すると、`@categories`や`@item`はビュー（erbファイル）で使えるようになる

## 2. 「:」で始まるシンボルとは？

- これは **「シンボル」と呼ばれるRubyのデータ型**
- たとえば「:name」「:id」「:category_id」など
- 主に「属性名」や「カラム名」などを指定する時に使う
- シンボルはイミュータブル（変更不可）で、メモリ効率が良いという特徴

**例：ActiveHashのモデル**
```ruby
class Category < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' },
    { id: 2, name: 'メンズ' },
    { id: 3, name: 'レディース' }
  ]
end
```
この場合、`:name`や`:id`は「name」や「id」という属性名を指します。


## 3. フォームでの使い分け例
フォームで「カテゴリーを選択」できるようにするには、`collection_select` というヘルパーを使う

**例：**
```erb
<%= f.collection_select(:category_id, @categories, :id, :name, {prompt: "---"}) %>
```

### それぞれの意味

| 部分                        | 意味・役割                                                                 |
|-----------------------------|----------------------------------------------------------------------------|
| `:category_id`              | 保存先のカラム名（ここに選択したidが入る）                                 |
| `@categories`               | 選択肢として渡す配列（コントローラーで用意したインスタンス変数）           |
| `:id`                       | 選択肢のvalue属性に使うカラム名（ここではCategoryのid）                    |
| `:name`                     | 選択肢の表示名に使うカラム名（ここではCategoryのname）                     |
| `{prompt: "---"}`           | 先頭に「---」という選択肢を表示するオプション                              |

## 4. まとめ

- **「@」で始まるもの（@categoriesなど）**  
  → コントローラーで用意した「データそのもの」（配列やオブジェクト）。ビューに渡すために使う

- **「:」で始まるもの（:nameや:category_idなど）**  
  → 「属性名」や「カラム名」などをシンボルで指定。RubyやRailsでよく使う書き方
    Pythonなど他の言語と違うので最初は違和感があるかも


## 5. さいごに

まだRails学習始めたばかりですが、「@」で始まるインスタンス変数と「:」で始まるシンボルの違いを意識しながら記述することで、理解が深まりやすくなった気がします。

もし間違いや補足があればコメントで教えてください！
【React入門】Reactとは？そして一般的な用途は？

**React**は、ユーザーインターフェース（UI）やWebアプリケーションを構築するための、最も人気のあるJavaScriptライブラリの一つです。もともとFacebookによって開発・保守されており、その**効率性・柔軟性・豊富な機能**から、Web開発の現場で広く使われています。

---

### Reactの基本概念

Reactの中心的な考え方は、**再利用可能なUIコンポーネントの作成**です。

* たとえば、ボタン・カード・アバターなどのコンポーネントを作成し、それらをアプリ内のさまざまな場所で再利用できます。
* コンポーネントは **入れ子（ネスト）** にして複雑なUIも構築可能です。

---

### Reactの主な特徴と利点

* **独立して更新されるコンポーネント**
  各コンポーネントは、データ（state）の変更に応じて個別に更新・再描画されるため、**効率的でパフォーマンスが高いUI**を実現できます。

* **仮想DOM（Virtual DOM）** の活用
  従来のJavaScriptのようにDOMを直接操作するのではなく、Reactは仮想DOMを使って変更点だけを反映させるため、**高速で無駄の少ない描画**が可能です。

* **状態管理（State Management）** が容易
  コンポーネントがどう表示され、どう動作するかを決める「状態（state）」を管理しやすく、**常に最新のデータに基づいたUI表示が可能**になります。

---

### Reactは何に使われているのか？

Reactは以下のような用途に広く使われています：

* シングルページアプリケーション（SPA）
* 管理画面やダッシュボードのUI
* SNS、Eコマース、チャットなどのインタラクティブなWebアプリ
* モバイルアプリ開発（React Native）

---

###  まとめ

Reactは、再利用可能なコンポーネント構造・仮想DOMによる高速描画・状態管理のしやすさといった特徴を持ち、**効率的かつスケーラブルなフロントエンド開発**を実現する強力なツールです。初心者からプロフェッショナルまで、幅広く使われています。
【GitHub Copilot】を使って開発効率を爆上げしよう！

## 選択中のコードを解説してもらう
```
#selection
/explain 
```

## コード全体の解説をしてもらう

```
#codebase
/explain 
```


## 選択中の範囲を指定
```
#selection
```

## 修正してもらう
```
/fix
```

## 説明してもらう
```
/explain 
```



## 履歴の削除
```
/clear
```


## コードレビューをしてもら
```
#changes 
コードレビューして。
特に気になる点や改善提案があれば教えて！
```
※「#changes 」の指定でコミット前の変更中のファイルをcopilotに認識してもらえる。
BIOS割り込み ( INT 0x10 AH=0x0E ) を再現する

## 「手探りでCUI OS作成に挑む」連載
この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は[「手探りでCUI OS作成に挑む」連載目次](https://qiita.com/earthen94/items/b5d77f98f0cf85a13346)を御覧下さい。

## 目的
将来BIOSを作るに当たり、標準BIOSの割り込みは使えなくなるので、先ずはVRAMへ直接書き込み文字を出力する部分の処理を自分で書きました。
文字は緑にしてみました。
出力する文字のASCIIコードをALレジスタへ格納し、以下のように呼び出すと画面上に緑でが表示されます。
```
    mov al, 'H'
    int 0x2F
```

## 検証コード
```
org 0x7C00
bits 16

start:
    ; IVTの0x2F番地にハンドラを登録
    mov ax, cs            ; 現在のコードセグメントを取得
    mov ds, ax            ; DSをコードセグメントに設定
    mov si, 0x2F * 4      ; IVTの0x2F番地に移動

    ; IVT[0x2F] にハンドラのアドレスを設定
    lea dx, int10_handler  ; ハンドラのアドレスを取得
    mov word [si], dx      ; オフセットを設定（低位）
    mov word [si + 2], cs  ; セグメントを設定（高位）
        
    ; VRAMを黒背景で初期化
    mov ax, 0xB800
    mov es, ax
    xor di, di
    mov cx, 2000          ; 80x25x2 = 4000バイト
    mov ax, 0x0720        ; 空白 + 黒背景/灰色文字
    rep stosw             ; 一気にVRAMを埋める

    ; 自作した呼びだしでHを出力する
    mov al, 'H'
    int 0x2F
    
    ; カーソル位置を左上(0,0)に移動
    mov dx, 0x3D4    ; VGAコントローラ
    mov al, 0x0F     ; 低位バイト
    out dx, al
    inc dx
    mov al, 0x00
    out dx, al
    dec dx
    mov al, 0x0E     ; 高位バイト
    out dx, al
    inc dx
    mov al, 0x00
    out dx, al

    cli
loop:
    hlt
    jmp loop 

; int 0x2F ハンドラ（空いている番号に追加）
int10_handler:
    push ax

    ; セグメントレジスタを設定（VRAMへのアクセス用）
    mov ax, 0xB800
    mov es, ax      ; ES = 0xB800（VRAMセグメント）
    
    pop ax

    ; 画面左上（1行目1列目）に 'H' を緑色で表示
    mov byte [es:0], al    ; 文字
    mov byte [es:1], 0x02   ; 属性（緑色）

.iret:
    iret                 ; 中断処理を終了
    
times 510-($-$$) db 0
dw 0xAA55
```

## 動作確認
```
nasm -f bin boot.asm -o boot.bin
qemu-system-i386 -fda boot.bin
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/a2f4fbe3-1e71-4267-b9d2-61a18ef92d6a.png)

## 8086実機での動作
コンパクトフラッシュへ書き込む命令
```
sudo dd if=boot.bin of=/dev/sdc bs=512 count=1 conv=notrunc
```
![微信图片_2025-06-04_223815_160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/d04dba0f-8b3b-4fdf-8728-d5744e8a2331.png)
![微信图片_2025-06-04_223837_208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/77662c5c-ab65-41c9-87a1-9b433dc5e358.png)
シングルページアプリケーション（SPA）とは？また、それに伴う課題は？


シングルページアプリケーション（SPA）は、従来のマルチページ型Webサイトとは異なり、**最初に1つのHTMLページを読み込み、その後のコンテンツはJavaScriptによって動的に更新**されます。ページ全体をリロードする必要がないため、**高速かつ応答性の高いユーザー体験**を提供できます。

---

### ✅ SPAの特徴

* アプリケーションの状態管理やDOMの操作はJavaScriptで行う
* 新しいページをサーバーから取得せず、非同期通信（AJAX）でデータを取得し、ページを動的に更新する
* React, Vue, Angular などのライブラリ・フレームワークがよく使われる

---

### ⚠️ SPAにおける代表的な課題

#### 1. **アクセシビリティの問題**

画面の一部だけが動的に更新されるため、**スクリーンリーダーが変更内容を読み上げない場合がある**。その結果、視覚に頼らないユーザーがページの更新に気づけないことがある。

#### 2. **ナビゲーションと履歴管理**

* ブラウザの「戻る」や「進む」ボタンが期待通りに動作しないことがある
* URLが更新されないと、**特定のページをブックマークできない**問題が発生
* ページをリロードすると、**アプリの状態が初期化される**場合もある

#### 3. **SEO（検索エンジン最適化）の問題**

* 初回のHTMLに必要な情報が含まれていないと、**検索エンジンがJavaScriptを正しく実行できず、内容をインデックス化できない**場合がある
* SSR（サーバーサイドレンダリング）やプリレンダリング、SEO対応URLを活用することで改善可能

#### 4. **パフォーマンスの懸念**

* 初期ロード時にアプリ全体のスクリプトやリソースを読み込むため、**表示までに時間がかかることがある**
* 通信環境が遅いユーザーにとっては、**空白画面が長く表示され、体験が悪化**

---

### ✅ まとめ

SPAは、**高速な操作性とスムーズなユーザー体験**を実現できる一方で、

* アクセシビリティ
* ナビゲーション
* SEO対応
* 初期ロードのパフォーマンス

といった課題を抱えています。

これらの問題に配慮しながら、**適切な設計と対策（例：SSRや動的ルーティング管理）を施すことで、使いやすくアクセシブルなSPAを構築することが可能**です。開発者は、ユーザー全体を考慮した設計を心がける必要があります。
EXCEL VBA 大量字段排序

下面的代码执行大量的排序，
排序范围为第一列开始，到指定的列为止（最多可以到BL列（也可能是BM列））。
需要配合下面的ColNameToColNumber函数使用
```
Option Explicit
Sub SortCode_AllTitle()
    Dim ws As Worksheet
    Dim num As Integer
    Dim i As Integer
    
    '执行对象表的设定
    Set ws = ThisWorkbook.Worksheets("工作表名")

    '设置参与排序的最终的列名
    num = ColNameToColNumber("Z")
    With ws
        With .Sort.SortFields
            .Clear '清除排序条件
            For i = 1 To num
                DoEvents
                Debug.Print ws.Cells(1, i)
                .Add Key:=ws.Cells(1, i), Order:=xlAscending
            Next i
        End With
        '执行排序
        .Sort.SetRange .Range("A1:Z100")
        .Sort.Header = xlYes
        .Sort.Apply
    End With

End Sub
```

下面的函数执行指定列名的排序
将需要参与排序的列设置到arrs里面即可
```
Sub SortCode_SetTitle()
    Dim ws As Worksheet
    Dim num As Integer
    Dim i As Integer
    Dim arrs As Variant
    Dim arr As Variant
    
    '设定工作表
    Set ws = ThisWorkbook.Worksheets("工作表名")

    '设置参与排序的列的名称
    arrs = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O")
    With ws
        With .Sort.SortFields
            .Clear '清除排序条件
            For Each arr In arrs
                DoEvents
                Debug.Print arr
                Debug.Print ws.Cells(1, arr)
                .Add Key:=ws.Cells(1, arr), Order:=xlAscending
            Next arr
        End With
        '执行排序
        .Sort.SetRange .Range("A1:Z100")
        .Sort.Header = xlYes
        .Sort.Apply
    End With

End Sub
```

下面的代码能够将列名转换成数字，供计数使用
```
'将列名转换成数字
Function ColNameToColNumber(TargetColumn As String) As Integer
    Dim Result As Integer
    Result = Cells(1, TargetColumn).Column
    Debug.Print "Function : ColNameToColNumber return is " & Result
    ColNameToColNumber = Result
End Function
```
Blazor网页页面跳转

Blazor制作网页的时候，会有点击按钮然后跳转到另一个页面的操作
这个时候，可以使用NavigationManager.NavigateTo语句来执行跳转程序
具体代码如下
```
@inject NavigationManager NavigationManager //跳转页面用
@rendermode InteractiveServer //按钮动作用

<button class="btn btn-primary" @onclick="jumpPage">跳转按钮</button>

@code {
    
    //跳转页面
    private void jumpPage() => NavigationManager.NavigateTo("/跳转页面的@page后面的名称");
}
```

注意：
`@inject NavigationManager NavigationManager 是跳转页面的指令所需要的运行库，如果不导入这个库，则没有办法执行 NavigationManager.NavigateTo 指令`
`@rendermode InteractiveServer 是按钮动作所需要的运行库，如果不导入这个库，则会出现点击按钮但是程序捕获不到的问题（即使在@code里面打断点，也无法进入断点）`
JavaScriptライブラリとフレームワークの役割と開発で採用理由

JavaScriptのライブラリやフレームワークは、開発プロセスを効率化するためのあらかじめ用意されたコードを提供します。どちらも生産性を向上させ、コーディングの標準化に貢献しますが、アプローチや開発者に与える自由度に違いがあります。

---

### ライブラリの役割

ライブラリは、DOMの操作、イベントの処理、AJAXリクエストの管理といった**特定のタスクに対する解決策を提供**することに焦点を当てています。

代表的なライブラリの一つに **jQuery** があります。

jQueryは2010年代初頭に非常に人気があり、DOM操作、イベント処理、アニメーション、エフェクトなどを簡単にするために広く使われていました。また、jQueryには多くのプラグインが存在し、日付ピッカーやスライダー、モーダルダイアログといった共通コンポーネントの実装も容易でした。

現在ではjQueryの利用は減少していますが、**かつてはバニラJavaScriptで複雑だった処理を簡単に実装できる手段**として、開発者にとって非常に助けとなっていました。

---

### フレームワークの役割

一方でフレームワークは、**アプリケーション構築のためのより明確な構造やルールを提供**します。開発者が従うべき慣習や設計パターンが定められていることが多く、「意見のある（opinionated）」設計といえます。

たとえば **Angular** は、コンポーネントベースのアーキテクチャを推奨し、状態管理、ルーティング、サービスとのやり取りなどを体系立てて設計するためのツールやルールを提供します。

他のフレームワークの例には **Remix** や **Next.js** などがあります。

対照的に **React** は「UIライブラリ」であり、アーキテクチャに対してあまり制約を課しません。Reactは「ビュー層」に特化しており、アプリケーションの設計に関して多くの判断を開発者に委ねています。

---

### 業界で使われる理由

ライブラリやフレームワークは、プロジェクトの規模に関係なく広く使用されています。その理由には以下があります：

* **開発スピードの向上**：よくある課題に対する解決策がすでに用意されているため、ゼロから作るよりも迅速に開発できます。
* **共通の課題への対応**：たとえば「日付やタイムゾーンの扱い」はJavaScriptでよくある悩みですが、専用のライブラリ（例：date-fns、Luxon、Day.jsなど）を使えば簡単に処理できます。
* **品質と信頼性**：人気のあるライブラリやフレームワークは、活発なコミュニティによって保守・検証されており、安全かつ実用的です。
* **ベストプラクティスの採用**：現場で実証された設計パターンやコーディングルールに従うことで、堅牢で拡張性の高いアプリケーションを構築しやすくなります。

---

### 結論

ライブラリとフレームワークは、よくある課題の迅速な解決策を提供し、開発を加速させ、ベストプラクティスに基づいた設計を促します。両者の違いを理解し、状況に応じて適切に使い分けることは、JavaScript開発者にとって非常に重要なスキルです。
AITRIOS デバイス登録時のQRcode読取りのコツ

:::note
本記事は過去記事のアーカイブです。
:::
こんにちは！
ソニーセミコンダクタソリューションズ の森川と申します。

# 要約
この記事では、エッジAIデバイスをConsoleにEnrollするときに必要な "QRcode読取り" のコツをお伝えします。
簡単に言ってしまうと "なるべく大きく表示して、その分すこし画面から離してね。" です。
本記事は3分くらいで読み終わります。

# 前提
AITRIOSに触れるには以下の作業やモノの購入が必要となります。
* AITRIOS Portalへのアカウント登録
* 対応するデバイスの購入
* AITRIOS Portal 上で新規プロジェクト申請を実施
* Console Developer Edition / Enterprise Edition の購入  
  
また、現時点(2024年3月)ではAITRIOSは法人向けのサービスとなっております。  
  
**本記事は2024年3月12日時点の情報に基づいて作成されています。**

# 本文
AITRIOSのエッジAIデバイスを使うには、まずご登録いただいたProjectにエッジAIデバイスをEnroll(エンロール)することが必要です。  
このEnrollの際には、ConsoleからダウンロードしたEnrollment QRcode（以下単にQRcodeとします）をエッジAIデバイスで読み込むわけですが、  
今ご用意しているエッジAIデバイスのレンズの性質上、読み取りにちょっとしたコツが必要になります。 
  
ダウンロードしたQRcodeを画面に表示した状態で(本稿では手順は省略)、エッジAIデバイスをQRcode読み取りモード  
(Reset Buttonを5秒程度押し続けてPowerLEDが黄色の点滅になった状態）に切り替えたあと、エッジAIデバイスを画面にかざしますが、  
**表示されているQRcodeの大きさに合わせて、エッジAIデバイスとQRcodeの距離を調整する必要があります。**  
  
基本となるQRcodeの一辺の長さとエッジAIデバイスとの距離の関係は、QRcodeの一辺の長さ90mmに対して距離が約110mm* となります。  
以下の表に、PCの画面のサイズ、ブラウザの表示倍率とそのときのQRcodeの一辺の長さに対応する、推奨距離を記載しました。  
そして経験上**QRcodeをなるべく大きく表示し、距離の調整をゆっくり行うと読み込みが早く終わる**傾向があります。  
  
|画面サイズと解像度|Chromeブラウザの表示倍率|QRcodeの一辺の長さ|推奨距離|
|----|----|----|----|
|13.3inch 1920x1080|200%|約90mm|約180mm*|
|24inch 1920x1080|400%|約210mm|約410mm*|
|27inch 1920x1080|300%|約200mm|約400mm*|

![QRcode_reading.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/c67ebc26-5df4-48cb-adcd-f2ee423a94c4.png)

*推奨距離を更新しました 2025/03/27

# 困った時は
もし、記事の途中でうまく行かなかった場合は、この記事にコメントをいただく他、
以下のサポートページもご覧ください。
コメントへのお返事にはお時間を頂くこともございます。

- [Support (FAQ)](
https://developer.aitrios.sony-semicon.com/edge-ai-sensing/support)
 
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
- [Contact Us](
https://developer.aitrios.sony-semicon.com/edge-ai-sensing/contact-us)

AITRIOS についての最新情報は X および LinkedIn で配信中です。こちらのフォローも是非！

X: https://twitter.com/AITRIOSbySony

LinkedIn: https://www.linkedin.com/company/aitrios-by-sony/
AITRIOS | AIH-IVRW2を別のアクセスポイントに接続する方法 

:::note info
本記事は過去記事のアーカイブです。
:::



ソニーセミコンダクタソリューションズの森川です。

無線LANでの接続が可能な AIH-IVRW2 ですが、小型でスクエアな形状とUSB給電の手軽さもあり、持ち出した先々の無線LANに接続することも多いと思います。
ということで本記事では、AIH-IVRW2の無線LAN設定の変更方法について説明します。
本記事ではConsole Developer Editionを利用しています。
数分で読み終わります。

## 前提
　本記事の内容は、以下の状態にあることを前提にしています。
- Console Developer Editionを利用中で、お持ちのAIH-IVRW2が既にConsoleへの接続できていること。
- Consoleを操作できる環境にあること。
- 新たに接続する無線LANが2.4GHzに対応していて、Internet接続が可能であること。

## 無線LAN設定を切り替える
  それでは説明します。
1. Console の 左側にある**Manage Device**をクリックし、表示されたウインドの上部にある**Setup Device**をクリックします。  
   <!-- 
   ![QP31_fig5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/d4b933f0-f043-8303-adc4-d9822683febf.png)
   -->
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/d4b933f0-f043-8303-adc4-d9822683febf.png" width="300">  
   
1. **Setup Device**ウインドに、NTPと接続したい無線LANのSSIDおよびPasswordを設定します (必要な場合は、その他の設定もおこなってください) 。  
   <!--
   ![QP31_fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/51d330bc-ce82-2692-6122-65a939727093.png)  
   -->  
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/51d330bc-ce82-2692-6122-65a939727093.png" 
width="300">
  
1. **Setup Device**ウインドの下部にある Generate ボタンを押し、QRcodeを表示します。
1. AIH-IVRW2の側面にあるリセットボタンを5秒程度押し続け、QRcode読み込みモード (三つあるLEDのうち一番上と下が橙色の点滅、真ん中が橙色で点灯) に切り替えます。
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/92341cc7-c556-c04e-9cde-2492df06d7e4.png" width="300">
   
1. 表示されているQRcodeをAIH-IVRW2にかざして読み込ませてください。  
もしうまくいかない場合は[AITRIOSデバイス登録時のQRcode読取りのコツ](https://qiita.com/SSS-keijimorikawa/items/240e6243eb9178c59457)を参照してみてください。

1. 無線LANへの接続に成功すると、一番下のLEDが緑点灯になります。これで新しい無線LANへの接続に成功しました。
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724648/c0a24ff0-1bbc-0a61-da62-4ccbe045a049.png" width="300">  
  
   その後、一番上のLEDが赤点滅から緑点灯に切り替わり、最後に真ん中のLEDが緑点灯に切り替わると、Consoleへの接続も無事に終了したことになります。
  ConsoleでConnectedになっているかを確認しましょう。  
  ちなみにAIH-IVRW2のLEDですが、上の画像で上から順番に"Power Indicator", "Service Indecator", "Wireless Indicator"となります。参考までに。

これで説明は終わりです。ポイントは**再Enrollmentは不要** で **Manage Device** の **Setup Device** を使うことです。

# 困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントください。  
コメントのお返事にはお時間を頂く場合がありますことをご了承ください。
また以下のサポートのページもご覧ください。

- [Support (FAQ)](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/support)

また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
- [Contact Us](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/contact-us)