OmniAICreator/Qiita-1.07M huggingface dataset:
常微分方程式と伝達関数による系の解析


## はじめに

常微分方程式（ODE）は、力学系、回路、制御系の数学モデルとして現れる。本稿では、基本的な微分方程式を **時間領域のODE** として定式化した後、それを **周波数領域（ラプラス変換）** に移して **伝達関数（transfer function）** を導出する。

---
## 例1: 一階線形常微分方程式（定数係数）
$$

\frac{dy}{dt} = a \quad (a \text{ は定数})
$$

両辺を積分して、

$$
y = at + C \quad (C \text{ は積分定数})
$$

初期条件 $y(0) = 0$ が与えられているとき、$C = 0$ より、

$$
y = at
$$

が特解となる。

---

## 例2: 二階定数係数常微分方程式

$$
\frac{d^2y}{dt^2} = a \quad (a \text{ は定数})
$$

まず一階の積分：

$$
\frac{dy}{dt} = at + C_1
$$

さらに積分して：

$$
y = \int (at + C_1)\,dt = \frac{1}{2}at^2 + C_1t + C_2
$$

初期条件 $y(0) = 0, \frac{dy}{dt}\big|_{t=0} = b$ のとき、

$$
C_1 = b,\quad C_2 = 0
$$

したがって特解は、

$$
y = \frac{1}{2}at^2 + bt
$$

---

## 例3: 減衰型一次微分方程式

$$
\frac{dy}{dt} = a - by \quad (a, b \text{ は定数},\ b \ne 0)
$$

両辺を分離変数法で整理：

$$
\frac{dy}{a - by} = dt
$$

積分して：

$$
- \frac{1}{b} \log\left|a - by\right| = t + C
$$

変形すると：

$$
y = \frac{a}{b} + Ae^{-bt}
$$

初期条件 $y(0) = 0$ より $A = -\frac{a}{b}$、
したがって特解は：

$$
y = \frac{a}{b}(1 - e^{-bt})
$$

---

## 例4: 指数関数的成長・減衰

$$
\frac{dy}{dt} = -a \frac{y}{t} \quad (a \text{ は定数})
$$

両辺を分離して積分：

$$
\frac{dy}{y} = -a \frac{dt}{t}
\Rightarrow \log|y| = -a \log|t| + C
$$

よって：

$$
y = A t^{-a} \quad (A = \pm e^C)
$$

---

## 例5: 単振動（調和振動子）

$$
\frac{d^2y}{dt^2} = -a y \quad (a > 0)
$$

この2階線形微分方程式の一般解は：

$$
y = A \sin(\sqrt{a}t + \theta)
$$

ここで $A$, $\theta$ は積分定数であり、初期条件に応じて定まる。

## 例1: 一階積分系（加速度 → 速度）

### 時間領域：

$$
\frac{dy}{dt} = a \quad (a \text{ は定数})
$$

### ラプラス変換：

$$
sY(s) = \frac{a}{s}
\Rightarrow G(s) = \frac{Y(s)}{U(s)} = \frac{1}{s}
$$

※ここで入力 $u(t) = a$ を定数ステップ入力とみなす。

---

## 例2: 二階積分系（加速度 → 位置）

### 時間領域：

$$
\frac{d^2y}{dt^2} = a
$$

### ラプラス変換：

$$
s^2Y(s) = \frac{a}{s} \Rightarrow G(s) = \frac{Y(s)}{U(s)} = \frac{1}{s^2}
$$

※ここでも $u(t) = a$ をステップ入力とみなしている。

---

## 例3: 一階遅れ系（減衰付き一次系）

### 時間領域：

$$
\frac{dy}{dt} + b y = a
$$

### ラプラス変換：

$$
sY(s) + bY(s) = \frac{a}{s}
\Rightarrow G(s) = \frac{Y(s)}{U(s)} = \frac{1}{s + b}
$$

定常応答は：

$$
Y(s) = \frac{a}{s(s + b)} = \frac{a}{b}\left(\frac{1}{s} - \frac{1}{s + b}\right)
\Rightarrow y(t) = \frac{a}{b}(1 - e^{-bt})
$$

---

## 例4: 指数減衰付き変数係数系

### 時間領域：

$$
\frac{dy}{dt} = -a \frac{y}{t}
$$

この式はラプラス変換では取り扱いに注意が必要（係数が $t$ の関数）なため、**伝達関数の定義が困難**。代わりに変数分離によって：

$$
y = A t^{-a}
$$

このように時間依存係数を持つ非LTI（線形時不変）系では、伝達関数が定義できないことがある。

---

## 例5: 単振動系（2階線形振動系）

### 時間領域：

$$
\frac{d^2y}{dt^2} + a y = 0
$$

### ラプラス変換：

$$
s^2Y(s) + aY(s) = 0
\Rightarrow G(s) = \frac{Y(s)}{U(s)} = \frac{1}{s^2 + a}
$$

逆変換により：

$$
y(t) = A \sin(\sqrt{a}t + \theta)
$$

---

## 伝達関数による一般的な見通し

| 種別    | 微分方程式                            | 伝達関数 $G(s)$         |
| ----- | -------------------------------- | ------------------- |
| 積分系   | $\frac{dy}{dt} = a$              | $\frac{1}{s}$       |
| 積分2階  | $\frac{d^2y}{dt^2} = a$          | $\frac{1}{s^2}$     |
| 一階遅れ系 | $\frac{dy}{dt} + b y = a$        | $\frac{1}{s + b}$   |
| 単振動系  | $\frac{d^2y}{dt^2} + a y = 0$    | $\frac{1}{s^2 + a}$ |
| 変数係数系 | $\frac{dy}{dt} = -a \frac{y}{t}$ | 定義不可（非LTI）          |

---

## おわりに

伝達関数は常微分方程式を系の「ブラックボックス表現」として扱う強力な手段であり、応答解析・安定性評価・設計において広く用いられる。特に線形時不変系（LTI系）においては、周波数領域での解析により直感的かつ効率的な理解が可能になる。

---
WindowsでEMLファイルをOutlook PSTファイルに一括変換する方法

これまでEML形式でメールを扱っていて、Microsoft Outlookに移行する場合、EMLファイルをPST形式に一括で素早く変換する方法を知りたいと思うかもしれません。Windows Live Mail、Thunderbird、Outlook ExpressなどのメールプログラムからMS Outlookに移行するユーザーは、EMLメールをPST形式に変換する必要があります。
この記事では、高く評価されているTrustVare EML to PST Converterを使用して、WindowsでEMLファイルをOutlook PSTファイルに一括変換する最も高速で信頼性の高い方法を解説します。また、このツールがメール移行に最適な理由と、EMLコンバーターを選ぶ際に注意すべき点についても説明します。

EMLをPSTに変換する理由
• Outlookへの移行：OutlookはEMLファイルではなくPSTファイルを使用します。
• データ管理：PSTは複数のEMLファイルを1つのファイルに結合します。
• 互換性の向上：PSTは主にMicrosoft環境で使用されます。
• バックアッププロセス：PST へのアーカイブ化により、データ保存性が向上します。
•
EML ファイルを Outlook PST ファイルに一括変換する最適なソリューション

TrustVare [EML to PST Converter](https://www.trustvare.com/eml/pst/) は、Windows で EML ファイルを PST 形式に一括変換するための最も信頼できる方法です。この変換ツールは、技術レベルを問わず、非技術者から IT 専門家まで、最もシンプルで手間のかからない方法を提供します。ユーザーは、ニーズに応じてバッチ変換を使用して、無制限の数の EML ファイルを 1 つまたは複数の PST ファイルに変換できます。変換プロセス中、プログラムは元のメールの構造とフォルダ階層を保持します。また、100% の精度を保証し、宛先、CC、BCC、件名など、メールのすべての特性を保持します。このアプリケーションは、MS Outlook をインストールする必要がなく、独立した使いやすいユーティリティであるため、非常に便利です。さらに、このプログラムは基本的な GUI を備えているため、誰でも簡単に使用できます。

TrustVare EML to PST Converter を使って EML を PST に移行する方法

ステップ 1: Windows で TrustVare EML to PST Converter を起動します。

ステップ 2: 参照オプションを使用して EML ファイルまたはフォルダをアップロードします。

ステップ 3: 「エクスポート」オプションをクリックし、PST ファイル形式を選択します。

ステップ 4: 出力ファイルの保存場所を指定します。

ステップ 5: 「今すぐ変換」をクリックし、変換を開始します。

このソフトウェアを使用するメリット

1. ファイルサイズ制限はありません。
2. Outlook 2021、2019、2016、2013 など、最新バージョンと以前のバージョンをサポートしています。
3. 変換プロセスは安全に使用できます。
4. 無料のデモ版とテクニカルサポートが提供されます。
5. Windows 11、10、8.1、8、7、XP、Vista、およびそれ以前のバージョンに簡単にダウンロードできます。

結論

Outlookを個人用でもビジネス用でも、EMLからOutlookへの変換プロセスは難しくありません。Windowsシステムの場合、EMLファイルと添付ファイルをOutlookに変換する安全な方法は、TrustVare EML to PST Converterを使用することです。
今すぐ無料トライアルをご利用いただき、WindowsでEMLファイルをOutlook PSTファイルに一括変換する最も簡単な方法を見つけてください。
Spring AI入門

# Spring AI入門

## はじめに

Spring AIは、AIエンジニアリングのためのアプリケーションフレームワークです。Springエコシステムの設計原則（移植性やモジュラー設計）をAIドメインに適用し、POJOをアプリケーションの基本構成要素として使用することを促進することを目標としています。

## 1. Spring AIの主な特徴

### サポートされているAIモデルプロバイダー
- Anthropic
- OpenAI
- Microsoft
- Amazon
- Google
- Ollama

### サポートされているモデルタイプ
- チャット補完
- 埋め込み
- テキストから画像生成
- 音声文字起こし
- テキストから音声変換
- モデレーション

### その他の主要機能
- 同期・非同期APIのサポート
- 構造化出力（AIモデルの出力をPOJOにマッピング）
- 主要なベクトルデータベースのサポート
- ツール/関数呼び出し機能
- 可観測性
- ドキュメント注入ETLフレームワーク
- AIモデル評価ユーティリティ

## 2. 基本的な使用方法

### 依存関係の追加

```groovy
dependencies {
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
```

### アプリケーションの設定

```properties
spring.ai.openai.api-key=<YOUR_OPENAI_KEY>
```

### 基本的な実装例

```java
@SpringBootApplication
public class SpringAiDemoApplication {
    @Bean
    public CommandLineRunner runner(ChatClient.Builder builder) {
        return args -> {
            ChatClient chatClient = builder.build();
            String response = chatClient.prompt("ジョークを教えてください").call().content();
            System.out.println(response);
        };
    }
}
```

## 3. 主要な機能の詳細

### チャットクライアントAPI
```java
@Service
public class ChatService {
    private final ChatClient chatClient;

    public ChatService(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    public String getResponse(String prompt) {
        return chatClient.prompt(prompt).call().content();
    }
}
```

### ベクトルストアの使用
```java
@Service
public class VectorStoreService {
    private final VectorStore vectorStore;

    public void storeEmbedding(String text, float[] embedding) {
        vectorStore.add(text, embedding);
    }

    public List<String> searchSimilar(float[] queryEmbedding) {
        return vectorStore.search(queryEmbedding);
    }
}
```

## 4. 実践的な使用例

### ドキュメントQ&Aシステム
```java
@Service
public class DocumentQAService {
    private final ChatClient chatClient;
    private final VectorStore vectorStore;

    public String answerQuestion(String question) {
        // 質問の埋め込みを生成
        float[] questionEmbedding = generateEmbedding(question);
        
        // 関連ドキュメントを検索
        List<String> relevantDocs = vectorStore.search(questionEmbedding);
        
        // コンテキストを構築
        String context = String.join("\n", relevantDocs);
        
        // 質問に回答
        return chatClient.prompt(
            "以下のコンテキストに基づいて質問に答えてください：\n" +
            "コンテキスト：" + context + "\n" +
            "質問：" + question
        ).call().content();
    }
}
```

## 5. ベストプラクティス

1. **APIキーの管理**
   - 環境変数や設定ファイルで安全に管理
   - 本番環境では適切な認証情報管理システムを使用

2. **エラーハンドリング**
   - 適切な例外処理の実装
   - レート制限への対応

3. **パフォーマンス最適化**
   - キャッシュの活用
   - 非同期処理の適切な使用

4. **セキュリティ考慮事項**
   - 入力の検証
   - 出力のサニタイズ
   - 適切なアクセス制御

## まとめ

Spring AIは、AI機能をSpringアプリケーションに統合するための強力なフレームワークです。その柔軟性と拡張性により、様々なAIユースケースに対応することができます。

## 参考資料

- [Spring AI公式ドキュメント](https://spring.io/projects/spring-ai)
- [Spring AI GitHubリポジトリ](https://github.com/spring-projects/spring-ai)
- [Spring Boot公式ドキュメント](https://spring.io/projects/spring-boot)
2025年6月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2025年6月2日の検索結果 (広告(スポンサー))

![スクリーンショット 2025-06-02 145811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/2b9147cb-d358-4af5-a428-cf47e25aa7a1.png)

* Dynatrace
* Splunk
* Datadog

今月は Dynatrace が TOP で、Splunk と Datadog が続いています。

先月の結果はこちら --> [2025年5月 AIOps 定点観測](https://qiita.com/mkodera/items/0458fa0adc1307593bbe)



# 2025年6月2日の検索結果 (広告以外)

![スクリーンショット 2025-06-02 145846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/baeb2efd-70c0-4859-bcc1-a8e7c60b9847.png)

* AWS
* Palo Alto Networks
* HPE
* 日立ソリューションズ・クリエイト

今月は AWS が TOP で、Palo Alto Networks と HPE が続いています。

先月の結果はこちら --> [2025年5月 AIOps 定点観測](https://qiita.com/mkodera/items/0458fa0adc1307593bbe)
化学と物理の基本公式まとめ（pH, 電離度, 波動関数, 反応速度）


## 1. 🔬 水素原子の波動関数（量子化学）

水素原子の基底状態（n=1, 1s軌道）における波動関数は以下の通り：

```math
\psi(r) = \frac{1}{\sqrt{\pi a_0^3}} e^{-r / a_0}
```

* $a_0 = 0.053 \, \text{nm}$（ボーア半径）
* 確率密度（存在確率 × 球殻面積）：

```math
P(r) = 4\pi r^2 |\psi(r)|^2
```

---

## 2. 🧪 pHと水のイオン積

### ● pHの定義：

```math
\text{pH} = -\log_{10}[H^+]
```

### ● 水のイオン積（Kw）:

```math
K_w = [H^+][OH^-] = 1.0 \times 10^{-14} \quad (\text{at } 25^\circ C)
```

### ● pHとpOHの関係：

```math
\text{pH} + \text{pOH} = 14
```

---

## 3. 🧪 酸の電離と電離度

### ● 酢酸などの弱酸の電離定数（Ka）：

```math
K_a = \frac{[CH_3COO^-][H^+]}{[CH_3COOH]}
```

### ● 電離度 α と濃度 c の関係式（近似）：

```math
\alpha = \sqrt{\frac{K_a}{c}}, \quad [H^+] = c\alpha = \sqrt{K_a c}
```

※ 濃度 $c$ が小さくなる（希釈される）と、電離度 $\alpha$ は大きくなる。

---

## 4. ⏱️ 一次反応の速度論（反応速度式）

### ● 微分形（一次反応）：

```math
\frac{d[A]}{dt} = -k[A]
```

### ● 積分形（濃度と時間の関係）：

```math
[A] = [A]_0 e^{-kt}
```

### ● 対数形（直線グラフに変換）：

```math
\log_{10} \left( \frac{[A]}{[A]_0} \right) = - \frac{k}{2.303} t
```

### ● 半減期（half-life）：

```math
t_{1/2} = \frac{\log 2}{k} \approx \frac{0.693}{k}
```
🖼️ フレーム問題ってなに？中学生でも分かるようにわかりやすく解説！

こんにちは！  

今日は「**フレーム問題**」という、AIやロボットがかしこくなるときに**ぶつかる難しい問題**について、中学生にもわかりやすく説明します！

---

## 🤖 AIやロボットは「考える」力が必要！

AIやロボットが動くとき、ただ単にプログラム通りに動くだけじゃなく、**いろんな場面で判断する力**が求められます。

たとえば、ロボットが**コップを運ぶ**とき：

- コップをつかむ  
- 落とさないように運ぶ  
- 他のものにぶつからないようにする  

こういう判断が必要ですよね！

でも実は、**「どこまで考えたらいいのか？」がとても難しい**んです…。  
それが「フレーム問題」につながります。

---

## 🖼️ フレームってなに？

「**フレーム**」とは、**「考えるべきことの枠（わく）」**という意味です。  
つまり、「**何を考えて、何は考えなくていいのか？**」という**境界線**のこと。

---

## 🎮 たとえ話で考えてみよう

### 🍽️ 食器を片づけるロボット

あなたがロボットに「**テーブルの上の食器を片づけて**」と命令したとします。

でもロボットはこう考えてしまいます：

- 食器を片づけたら… テーブルはどうなる？  
- テーブルクロスはどうなる？  
- 床のホコリは関係ある？  
- 家の照明は？  
- 家全体の電気代は？  

…と、**無限に考え始めてしまう**のです！💦

人間なら「**今回は食器だけでいいや**」とパッと判断できますが、ロボットは「**どこまで考えるべきか？**」が分からなくなりがちなのです。

---

## 🚪 フレーム問題とは？

### 👉 まとめると…

**「AIやロボットが、何を考えて何を無視すべきかを自動で決めるのが難しい」問題**  
これが「**フレーム問題**」です！

---

## 🤔 どうしてむずかしいの？

現実の世界は、とても**複雑**です。  
たとえば：

- 机の上にあるもの  
- 周りの音や光  
- 他の人の行動  
- 天気や気温  

こういった**全部のこと**を**いちいち考えていたらキリがない**ですよね。  
でも **「今回はここまで考えればいい」** という線引き（フレーム）を作るのは、とてもむずかしいんです。

---

## 🛠️ AIはどうやって工夫しているの？

最近のAIでは、次のような工夫をしています：

| 工夫 | 内容 |
|------|------|
| ルールを先に決める | 「このタスクでは〇〇だけ考える」と事前に決めておく |
| 学習して覚える | 過去の経験から「だいたいこういう場面ではこれくらい考えればOK」と学ぶ |
| 環境をシンプルにする | ロボットが動く世界（環境）をシンプルにして、考えることを減らす |

でも、**完全に解決されたわけではありません！**  
AIが本当に人間のように「柔軟に考える」には、まだまだ研究が必要なのです✨

---

## ✅ まとめ

| 用語 | 意味 |
|------|------|
| フレーム問題 | AIが「何を考えて、何を無視すべきか」を決めるのが難しい問題 |
| 例 | 食器を片づけるロボットが、必要ないことまで考え始めてしまう |
| なぜ大事？ | AIやロボットが「かしこく、素早く」判断するには、この問題を乗り越える必要がある |
EBPMってデータサイエンスとどのような関係あるの？

理想：**データ分析に基づいてPDCAサイクル**を回していくし、Pythonなどを使って必要なデータをガンガン取りに行く
現実：予算はシーリングがあるから決まってる。その中で**出てきた数字に合わせてパワポ＆エクセル資料で定量的っぽく資料**作る

# EBPMって何
EBPMとは、**「Evidence-Based Policy Making（エビデンスに基づく政策立案）」の略**です。行政事業レビュー、政策評価制度の見直し、政策効果の可視化（KPIの設定等）、行政のデータ利活用（EBPMポータルなど）などが進められています。

■具体的な特徴
| 項目 | 内容 |
|:-:|:-:|
|目的|  政策の透明性・合理性・効果性の向上 | 
|活用するもの| 統計データ、調査結果、実験・評価の結果、海外事例など  | 
|プロセス| ①課題の特定 → ②エビデンスの収集 → ③分析・評価 → ④政策立案・実行 → ⑤効果検証  | 

# 現場の実態
**会議の場とか通知文書とかでEBPMしっかりやれとハッパ**かけられています。EBPMという単語を見ない日はありません。予算の財務省主査説明とかでもEBPM！って口酸っぱく言われます。で、**実際作る資料はエクセルで加工したデータをグラフにしてパワポ**で作ってきます。別に間違ってないのですが、Pythonとか出番全くないですね、そもそも別途申請して承認されなければインストールできませんし。

# データサイエンスの出番はあるか？
**データをプログラミング言語を使って分析するという場面は全くありません**。tableau、Power BIが少し使えるだけで尊敬されます。うちの省は結構データ分析リスクの研修とか金かけてやっていますが、その結果の優良事例としてホームページにも載っていますが、過去の農産物の価格変動（学習データ）から将来の価格（テストデータ）を推計するとかを決定木で回帰して的中率よかったですとか、**それモデル違くありませんかと思ったりするとこあります。**

# 現場からは以上でした
とはいえ、統計データや役所の保有しているそれ以外の情報をAPIで提供するとかは地道にやっていく必要ありますし、AIや機械学習のリテラシーがないともはや世の中ついていけないので、学習する必要はマストだと思います。でも、**霞が関管理職以上はAI使ったことありませんとかそんな人ばっか**ですね。
kind で MetalLB いらず の LoadBalancer を体験せよ！

「ローカル開発なのに `Service: LoadBalancer` がそのまま動く⁉︎」――そう、**Cloud Provider KIND** を起動するだけで、kind環境で metallb をセットアップする手間は完全に消え去ります。 ([Kind][1])

---

## 1️⃣ Cloud Provider KIND をインストール

```bash
go install sigs.k8s.io/cloud-provider-kind@latest
```

([Kubernetes Kind][2])

---

## 2️⃣ kind クラスタを用意

```bash
kind create cluster
```

クラスタはいつもの作り方で OK。特別な設定は一切不要！

---

## 3️⃣ Cloud Provider KIND を起動

```bash
# 低番号ポートを開けるので sudo 推奨
sudo cloud-provider-kind
```

プロセスが走ると、`Service: LoadBalancer` を検知して ホストからアクセスできる様にしてくれます。 ([GitHub][2])

## 4️⃣ まとめ — もう「ローカルだと ClusterIP…」とは言わせない！

* **インストールは 1 コマンド**
* **クラスタ設定ゼロ**で即利用
* **Pod 追加もスケールもそのまま LB 配下**
* ホストから直叩き可能

次の `kind create cluster` から、ぜひ Cloud Provider KIND を仕込んで `kind + metallb 構成から卒業` しましょう！

✍️ **さあ、あなたのプロジェクト README に「kind × LoadBalancer 対応済み！」の一行を追加だ！**

[1]: https://kind.sigs.k8s.io/docs/user/loadbalancer "kind – LoadBalancer - Kubernetes"
[2]: https://github.com/kubernetes-sigs/cloud-provider-kind "Kubernetes Cloud Provider for KIND - GitHub"
米国留学、基礎自治体（市役所）、日本大使館などを経験した霞が関管理職が発信する役所の仕事の醍醐味

近年、東大生離れ＆若手の早期離職が問題となっている国家一種（現総合職）です。これまで働いたことがあるのは、親元省庁を除き、内閣官房、復興庁、貿易関係省庁、公共政策米国修士、市役所管理職、日本大使館、管区行政局など結構広い部類ではないのかと思っています。そんな経験から、役所の仕事のおもしろかったところ（だけ）発信したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020495/1635fcd7-fd53-47d1-9f18-65d2ff23c878.png)

# 日の丸を背負って仕事できる。
**日の丸を背負うってオリンピック選手じゃないだろ、とツッコミ来る**かもしれませんが、国際交渉の仕事でかつマイナーな条約とかだと外務省も誰もこないで、**日本の交渉ヘッドが自分**になるとかそんなこともあるので、結構緊張感あります。そんな中で、自分が言った意見にに対して、インドから「I suport Japan's opinion」とか言われたときはビックリしました！インドから支持されたんか！？と。こういう仕事は霞が関の醍醐味ですよね。

# 早くに責任あるポストで仕事できる。
市役所は東日本大震災からの復興の支援で産業系の部署にいました。30前半で次長・部長と経験させてもらいました。**市役所の次長・部長なんてプロパー職員の選び抜かれた一部の人が最後のポスト**としてなるところに、半分くらいの年齢の人間がついちゃうんですから。300人は部下がいたと思います。今でもその時一緒に働いた人たちは官民問わず仲良くしています。

# 形に残る仕事。
法令事務官ですので、法改正は何度もやりましたし、何なら新規立法もいくつかやっています。法律はその後もどんどん変えられるので、自分がやった改正や立法も跡形もなく変わっていることとか普通ですが、基本理念は基本的にかわらないので、自分が手掛けたある立法の基本理念はまだ手付かずのままです。昔大手ゼネコンが地図に残る仕事、としてテレビCMやっていましたが、**霞が関は六法に残る仕事**です

# タクシーあらゆる路線コンプリート。
**めっちゃ忙しいです。法令改正タコ部屋とかぶち込まれるとタクシー帰り連続**でした。自分はちょこちょこ引越しもしてたので、いろんな経路で深夜タクシーがえりを経験しています。ベイブリッジ、レインボーブリッジ、東京タワー、森ビル、渋谷、新宿、池袋、スカイツリーなどいろんな夜景見ましたが、**自分的に一番きれいだと思ったのは上野駅**。KK線閉鎖されたのでアクセスは今どう行くんだろう。

# 留学制度が充実
**海外留学とか、旅費・給料もらいながら修士課程**に通えますし、国内留学制度もあります。**ドクターも１年研究専念（給料でる）して、３年間は学費出してもらえるという制度**もあり、これを利用して今横浜市立大学に在籍しています。ただ研究専念していないので、フルタイムワークと両立で大変ですけど。でもこういう制度があるだけありがたいですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020495/2fe5c878-3f07-48e3-a15f-4f94e5ecae0e.png)

現場からは以上でした。
test

```sql
SELECT
  CK.RIYO_CD,
  CK.CONSENT_ID,
  CK.CONSENT_VERSION,
  CK.START_DATE,
  CK.END_DATE
FROM
  (
    SELECT
      RIYO_CD,
      CONSENT_ID,
      MAX(CONSENT_VERSION) AS CONSENT_VERSION
    FROM
      CONSENT_STATE_KNR
    WHERE
      RIYO_CD = :riyoCd
    GROUP BY
      RIYO_CD, CONSENT_ID
  ) CSK
JOIN CONSENT_KNR CK
  ON CK.RIYO_CD = CSK.RIYO_CD
 AND CK.CONSENT_ID = CSK.CONSENT_ID
 AND CK.CONSENT_VERSION = CSK.CONSENT_VERSION
WHERE
  TO_DATE(CK.START_DATE, 'YYYYMMDD') <= TRUNC(SYSDATE)
  AND TO_DATE(CK.END_DATE, 'YYYYMMDD') >= TRUNC(SYSDATE)
  AND CK.RIYO_CD = :riyoCd;


```
【個人開発】幼児向け 乗り物お絵かきアプリ

## はじめに
以下の記事を拝見して、これまで描画系の実装経験が無いことに気づいたのをきっかけに、今回の「乗り物お絵かきアプリ」を作りました。

https://qiita.com/yukinonyukinon/items/4cc4b0a36dfa20723c0d

[`react-konva`](https://konvajs.org/docs/react/index.html)というライブラリを使った記事で、ライブラリの説明がとても分かりやすく大変参考になりました。

今回筆者の個人開発も`react-konva`を用いてお絵かき機能を実装しています。

- 技術構成
```bash
@eslint/js@9.28.0
@tailwindcss/vite@4.1.8
@types/react-dom@19.1.5
@types/react@19.1.6
@vitejs/plugin-react@4.5.0
eslint-plugin-react-hooks@5.2.0
eslint-plugin-react-refresh@0.4.20
eslint@9.28.0
globals@16.2.0
konva@9.3.20
react-dom@19.1.0
react-konva@19.0.4
react@19.1.0
tailwindcss@4.1.8
typescript-eslint@8.33.0
typescript@5.8.3
use-image@1.1.4
vite@6.3.5
```

## 作成したもの

https://k2webservice.xsrv.jp/r0105/gogo/

これは「タップ（クリック）すると色々な乗り物アイコンが表示されて、タップ（クリック）し続けている間は自由に線を引いてお絵かきできる」というシンプルなものです。

![449311609-338dc9fd-5db0-4114-80e7-8e5eaebc87c9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/fb869e87-5522-474d-80fc-c6e247f74efd.gif)

シール帳にシールを張るように、タップするだけで色々な乗り物を表示できます。

![449311690-6d6592be-d951-4c62-a526-94e505777606.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/8caa0d1a-2e0d-4f69-9d37-1d40e505250b.gif)

ちなみに、地味な機能ですがお絵かき中（ドライブ中）は乗り物のエンジン音が再生されます。

次項では、上記の音声再生などを含めて今回の実装で少し詰まった部分などを書いていきたいと思います。

## 自動再生ポリシー
自動再生ポリシーの影響でユーザーアクションが一度もないものは再生できないようになっています。
実装時、ログに当該エラーが出力されて気づくとともに、別の個人開発で同じような状況に遭遇したことがあったのでそれにならって今回対処しました。

オーディオ要素は非制御コンポーネントとして`useRef`で扱い、DOM操作を行っています。
サイトの初期表示時に音声再生の注意喚起ボタンを用意していて、それを押下することで以下の処理が行われる仕組みです。

```tsx
// 初回のユーザー操作で音声を再生するための関数
// ブラウザの自動再生ポリシーにより、ユーザーの操作がないと音声が再生されないため
const firstInteractionForAudio: () => void = () => {
    setAudioPlayOn(true);

    // サンプル再生なのでBGMは即時終了
    audioRef_mov.current?.play();
    audioRef_mov.current?.pause();
}
```

これにより、自動再生ポリシーの問題はクリアしました。

https://webfrontend.ninja/js-audio-autoplay-policy-and-delay/#google_vignette

## `react-konva`のコンポーネント内にはDOM要素は配置できない
上記の自動再生ポリシーの問題は解消しましたが、修正時に`audio`タグを含んだ乗り物コンポーネントを`Stage`内に入れて実装を進めていたところエラーで画面が真っ白（レンダリング不可）になりました。

理由としては「`react-konva`の`Stage`は内実`canvas`要素であり、その中にDOM要素は置けない」というものでした。

`react-konva`ライブラリでは、`Stage`というコンポーネントをベースに、Adobe Ai や Ps のレイヤーのような`Layer`コンポーネント、線の描画などを担う`Line`など固有コンポーネントがいくつかあります。

今回筆者は以下のような実装をしようとしており、レンダリングエラーが出ていたのです。
（※説明用の極端な実装例です）

```tsx
<Stage>
  <Layer>
    <audio src="sound.mp3" /> {/* DOM要素なので不可 */}
    <figure><img src={sampleImg} alt="sample画像" /></figure> {/* DOM要素なので不可 */}
  </Layer>
</Stage>
```

先の説明通り`react-konva`の対象エリア内ではDOM要素は扱えないので、`audio`や一部画像データは別々の要素（コンポーネント）として切り分けました。

ちなみに、描画時に表示される各種乗り物アイコンに関しては`react-konva`の`Image`コンポーネントを使っています。
`Image`のデータローディングに伴う非同期処理には`use-image`を使っていて、これを使うことでシンプルに画像描画を実装できました。（※別に使わなくとも`useEfeect`や`useState`でも実装できます）

## さいごに
今まで使ったことがないようなものは個人開発で実装してみると良い経験になりますね。
簡単な個人開発でしたが、自動再生ポリシーや`react-konva`（`canvas`要素）の制約などを学べて勉強になりました。

あとAI協業での学びで言えば、今回`GitHub Copilot`を主に使用しましたが、実装はAIが担っていくのを前提としてその**実装方針・アプローチを決めるための設計に関する知見（設計力）** が重要だと実感しました。
具体的には、各種乗り物アイコンの`Line`をState管理しているのですが、各種オブジェクト型の内容はこちらで指定（方針決め）して、描画部分など関連ロジックを含めた具体的な実装は`GitHub Copilot`に行ってもらいました。

--- 

今回の個人開発GitHubを以下に置いておきますので、関心のある方はご自由に使ってください。

https://github.com/Benjuwan/gogo-vehicle
3種類の機械学習完全未経験から機械学習学んでみたpt.１

### はじめに

私は東京科学大学の3年で、物理学を専攻しています。ここでは、私が機械学習の勉強を通じて学んだことを整理し、アウトプットしていきます。

### 教師あり学習

最初に紹介するのは教師あり学習です。これは、人間がラベル（正解）付きの訓練データを与えることで、機械がそのパターンを学習し、未知のデータに対して予測を行う手法です。

### 教師あり学習の種類

教師あり学習は、出力値の性質によって大きく2つに分けられます：

- 分類（Classification）：出力値が離散的な場合。  
  例：メールがスパムか否かを判定する問題は二値分類にあたります。また、A, B, C や 0, 1, 2 のような複数クラスに分ける場合は、多クラス分類と呼ばれます。

- 回帰（Regression）：出力値が連続的な場合。  
  例：数学のテストの点数を、勉強時間から予測する問題は回帰です。このとき、勉強時間が入力変数である特徴量、点数が出力変数である目的変数です。

### 強化学習

次に、強化学習について説明します。強化学習では、システム（エージェント）が環境と繰り返し相互作用しながら、報酬を最大化するように行動を学習していきます。

ここでの報酬とは、エージェントの行動の良し悪しを数値で表したものです。報酬はすぐに得られることもあれば、遅延フィードバックとして後になって得られることもあります。

例えば将棋AIでは、試合に勝てば正の報酬、負ければ負の報酬が与えられます。このようにして、エージェントは長期的により良い行動戦略を学習していきます。

### 教師なし学習

最後に教師なし学習について説明します。
教師なし学習は、正解がないデータを複数与えて目的変数や報酬を使うことなくデータの構造を分析する手法です。

**クラスタリング**という手法を使えば、大量の情報を意味のあるグループ（クラスタ）に分類することが出来ます。この分類の事を**教師なし分類**といいます。

また、教師なし学習には**次元削減** というフィールドがあります。これは、データの前処理に使われることが多く高次元のデータをノイズを取り除いて次元を圧縮することを指します。
set の概要、配列との違い

## 配列Arrayと似ていると言われる集合setだが何が配列と違うのか。
配列には順番がある
setには順番は保証されない

配列は重複を許す
setは重複を許さない
数学の集合を思い出すと理解しやすい

## どんな時にsetを使えばいいのか
### 演算を高速に行いたい場合。
配列はハッシュのような仕組みを使っているためsetより低速

### 集合演算を行いたい場合
両方の集合に共通している人を抜き出す
片方の集合には属しているがもう片方の集団には属していない人を抜き出す。

##  setの配列と同じ使い方
.add
.delete
.size
.emply?
.include?
等が配列と同じく使える

## setの配列とは違う使い方　実践　
### 定義の仕方
```ruby
require 'set'
a = Set[]
```

### 重複は許可されない
```ruby
set = Set[]
set.add("kome")
set.add("pan")
set.add("pan") 

p a   #=> #<Set: {"pan","kome"}> 
```
### 和集合( rubyの||と間違いえないように注意)
```ruby
set_a = Set[1, 2, 3]
set_b = Set[3, 4, 5]
p (set_a | set_b)  #=> #<Set: {1, 2, 3, 4, 5}>
```
### 積集合(rubyの&&と間違いえないように注意)
```ruby
set_a = Set[1, 2, 3]
set_b = Set[3, 4, 5]
p (set_a & set_b)  #=> #<Set: {3}>
```

その他　差集合等、集合に関する演算を使用できる。
Github入門

## githubアカウント作成
1. フォルダを指定
```
cd C:\Users\MikworkPC-020\Documents\work
```
1. リモートリポジトリをローカルにコピーする(URL指定する）
```
git clone https://github.com/mik-organization/edu-kuroda.git
```
1. リモートリポジトリとローカルリポジトリの同期
※フォルダ用確認
```
git pull
```
4.「新規ファイル、更新などがあったときに、ステージングする」
```
git status　でフォルダの状態を確認する
git add kuroda_add.txt
git commit -m "新しいファイル" (必ず名前をつける)
git push リモートに差分をおくる
```

復習
・ファイル新規作成→同期
・ファイル更新→同期
[Swift]SwiftDateライブラリを使用し特定の日付範囲かチェックさせる

# SwiftDateについて
今回は日付・時間処理ライブラリ SwiftDate について紹介します。
Swift には様々なライブラリがありますが、SwiftDate は 日付、時刻、タイムゾーン を解析、検証、操作、比較、表示するための便利なライブラリです。


## 参考文献
https://github.com/malcommac/SwiftDate

https://qiita.com/ENIX/items/eb08e47d3f229240ca3b

## 実際に使ってみる

CocoaPodsでインストールします。
```swift:
pod 'SwiftDate'
```


指定された期間内かどうかを判定し、該当期間なら画像を表示し、そうでなければラベルを表示する という処理を行います。

```swift:

import UIKit
import SwiftDate

class ViewController: UIViewController {

    @IBOutlet private weak var outOfPeriodLabel: UILabel!
    @IBOutlet private weak var dateRangeBackgroundImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        bind()
    }

}

extension ViewController {
    func bind() {
        outOfPeriodLabel.isHidden = Date().isWithinVisibleDateRange()
        dateRangeBackgroundImageView.isHidden = !Date().isWithinVisibleDateRange()
    }
}

extension Date {
    func isWithinVisibleDateRange() -> Bool {
        return isInRange(
            date: DateInRegion("2025/06/01 10:00:00", region: .JST)!.date,
            and: DateInRegion("2025/06/30 23:59:59", region: .JST)!.date,
            orEqual: true,
            granularity: .second
        )
    }
}

extension Region {
    static let JST = Region(calendar: Calendars.gregorian, zone: Zones.asiaTokyo, locale: Locales.japanese)
}

```

### isInRange(...) の引数解説
date:
→ 範囲の開始日

and:
→ 範囲の終了日

orEqual: 
→ trueにすると開始日や終了日と同じであっても範囲内と見なすという意味です。falseにすると開始・終了と一致する値は除外されます。

granularity
→ `.second`を指定。秒単位まで比較するという意味。

### ⏱️ `granularity` に指定できる単位一覧

| 値               | 意味                     |
|------------------|--------------------------|
| `.era`           | 紀元（例：西暦など）     |
| `.year`          | 年                       |
| `.month`         | 月                       |
| `.weekOfYear`    | 年単位の週               |
| `.weekOfMonth`   | 月単位の週               |
| `.day`           | 日                       |
| `.hour`          | 時                       |
| `.minute`        | 分                       |
| `.second`        | 秒                       |
| `.nanosecond`    | ナノ秒（最も細かい単位） |



### RegionでJSTの設定
RegionはSwiftDate によって提供される構造体で、カレンダー（暦）、タイムゾーン、ロケール（言語・地域設定）を1つにまとめたものです。

SwiftDate を使って日時を操作する際、「どの地域基準で処理するか」を明示的に指定することができます。

| 要素名     | 説明                     | 例                         |
|------------|--------------------------|----------------------------|
| `calendar` | 暦（カレンダーの種類）   | グレゴリオ暦 (`.gregorian`) |
| `timeZone` | タイムゾーン（時間帯）   | 日本標準時 (`Asia/Tokyo`)   |
| `locale`   | 地域と言語（文化設定）   | 日本語 (`ja_JP`)            |

これを指定範囲内のチェックメソッドで利用し判定を行うようにしてます。

## まとめ
実務では、キャンペーンやイベントに合わせたバナーの表示タイミングの制御などでよく使われます。
覚えておいて損はないライブラリです。
GCPでプロジェクトを削除したい場合

## 課金を無効にする

* 課金を無効にすることで、プロジェクト内の全てのリソースが一括で削除される。

## プロジェクトの削除

* 「IAMと管理」→「設定」→「プロジェクトを削除」からプロジェクトIDを入力して削除を実行
「手探りでCUI OS作成に挑む」手稿篇 SS:SPの変化とスタックの中身

## 「手探りでCUI OS作成に挑む」連載

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

## 内容
![b4561cf8b8ead27107a4dc47599d8dd5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/3c329df8-41e5-48e6-bebc-b04a5e4e97a6.jpeg)

![402491c33b8b6e9d569120ae38119402.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/60472830-85ea-45dc-be43-1192cad1bfec.jpeg)
「手探りでCUI OS作成に挑む」手稿篇  DSの初期化

## 「手探りでCUI OS作成に挑む」連載

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

## 内容
![3bae7db7f1d609c9d5c4285418d0a0cd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/cb2f0b90-e032-4e2c-978e-b0ecc64bb91a.jpeg)
ATOMS3R のPSRAMをPlatformIOから使いたい

少し前に入手していた M5AtomS3R というデバイスがあります。

https://docs.m5stack.com/en/core/AtomS3R


これの前機種に当たる [M5AtomS3](https://docs.m5stack.com/en/core/AtomS3) がとても使いやすく愛用しています。なのでPSRAM搭載版と聞いて喜び勇んで買ってみたのですが、肝心のPSRAMをPlatformIOからサクッと使うことができませんでした…
ネット検索してもピンポイントな情報を見つけられなかったのですが、ヒントになるいくつかのX投稿のおかげで何とかビルド＆実行できるようになりました。ありがとうございました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ATOMS3Rは8MBのPSRAMが付いたのが売りのようですのでせっかくなら使っていきたい。<br>-DBOAD_HAS_PSRAM=1ではだめなのだろうか?<br>boadをm5stack-atoms3にしているのですがatoms3rというのは見つけられませんでした。🤔 <a href="https://t.co/VaoBWzOBbm">pic.twitter.com/VaoBWzOBbm</a></p>&mdash; つゆきぱぱ (@tsuyukipapa) <a href="https://twitter.com/tsuyukipapa/status/1897491125734400078?ref_src=twsrc%5Etfw">March 6, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AtomS3R のPSRAMはOPIという種類なので、設定は以下であってそう。ただしM5Unifiedと組み合わせて使おうとすると、QPSI PSRAMの設定にしないとリブート繰り返す感じになる気がする。なぜに。 <a href="https://t.co/8juJ23tVQZ">https://t.co/8juJ23tVQZ</a></p>&mdash; しげき (@shi78ge) <a href="https://twitter.com/shi78ge/status/1840353949024727059?ref_src=twsrc%5Etfw">September 29, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> ATOMS3Rで色々ググってPSRAM認識させたけどあっているだろうか(´・ω・`)<br>platform = espressif32@^6.9.0<br>getPsramSizeは十進で8386231でした <a href="https://t.co/0BPiszGCc2">pic.twitter.com/0BPiszGCc2</a></p>&mdash; 紅熊(隣の素子屋のひとりごと) (@9PEO0xNd) <a href="https://twitter.com/9PEO0xNd/status/1839870292145103157?ref_src=twsrc%5Etfw">September 28, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


***

キモは platformio.ini でした。次にPSRAMを触りたくなったとき、またネット検索しなくても済むように、GitHubにサンプルプロジェクト一式を入れておきました。
https://github.com/tarmn3/AtomS3R_PSRAM_simple_sample
（用意した2枚のPNGをPSRAMに入れて、ボタン押すたびに切り替える単純なサンプルコードです）


でも、いちいちリポジトリ覗かなくてもいいように貼っておきます。

```
[env:m5stack-atoms3r]
platform    = espressif32
board       = m5stack-atoms3
framework   = arduino

; ファイルシステム
board_build.filesystem = littlefs

; PSRAM 有効化
board_build.arduino.memory_type = qio_opi
board_build.flash_mode         = qio
board_build.psram_type         = opi

build_flags =
  -DESP32S3
  -DBOARD_HAS_PSRAM
  -mfix-esp32-psram-cache-issue
  -DARDUINO_USB_CDC_ON_BOOT=1      ; USB CDC を起動時から有効化
  -DARDUINO_USB_MODE=1             ; USB シリアルポートを使う
  -DCORE_DEBUG_LEVEL=5

lib_deps =
  m5stack/M5Unified@0.2.7          ; 0.2.8 は動作未確認
  m5stack/M5GFX
```


（公式の iniファイルそのままで動かなかったのが謎のまま… 誰か教えてください…）
HSPでAWS Lambdaを作成する（その2）

OpenHSPでAWS Lambdaを作る記事です。[以前の記事](https://qiita.com/kijuky/items/fffac99c93fef2382866)から進展したので、その報告です。

# 0. Lambdaでカスタムランタイムを作るには

https://goropikari.hatenablog.com/entry/aws_lambda_custom_runtime

上の記事に書いてありますが、AWSが提供していない言語をLambdaで使いたい場合、bootstrapを用意する必要があります。

# 1. bootstrap を用意する。

```diff_shell:bootstrap
#!/bin/sh
set -e

: "${HSP_SOURCE_NAME:=sample}"
HSP_OBJECT_FILE=${HSP_SOURCE_NAME}.ax

RUNTIME_URL="http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01"

post() {
    request_id="$1"
    response="$2"
    url="${RUNTIME_URL}/runtime/invocation/${request_id}/response"
    curl -X POST "${url}" -d "${response}"
}

while true
do
    HEADERS="$(mktemp)"
    EVENT_DATA=$(curl -sS -LD "${HEADERS}" -X GET "${RUNTIME_URL}/runtime/invocation/next")
+   RESPONSE=$(echo "${EVENT_DATA}" | hsp3cl "${HSP_OBJECT_FILE}" | tr -d '\r' | sed '1d')
    REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "${HEADERS}" | tr -d '[:space:]' | cut -d: -f2)
    post "${REQUEST_ID}" "${RESPONSE}"
done
```

コードはほとんどサンプルと同じです。肝はここで

```sh
    RESPONSE=$(echo "${EVENT_DATA}" | hsp3cl "${HSP_OBJECT_FILE}" | tr -d '\r' | sed '1d') # 1行目のエラー(gpiod initalize failed.)を消す
```

- `echo "${EVENT_DATA}"` - ランタイムの標準入力にラムダの引数を設定
- `hsp3cl "${HSP_OBJECT_FILE}"` - HSPの実行
- `tr -d '\r'` - HSPは改行を`\r\n`で出力するのですが、Linux(Ubuntu)で動くcurlはこの改行を認識できないようです。`\r`を消すことでLinuxの改行に適合します。
- `sed '1d'` - HSP3.7betaから[GPIO](https://ja.wikipedia.org/wiki/GPIO)の初期化が実行されるようになり、起動すると1行目に`gpiod initalize failed.`と出力されます。LambdaでGPIOは使わないので出力を消します。

# 2. Dockerfileの修正

```Dockerfile:Dockerfile
FROM --platform=linux/amd64 ghcr.io/kijuky/hsp:3.7beta10

ENV LAMBDA_RUNTIME_DIR=/var/runtime \
    LAMBDA_TASK_ROOT=/var/task

# HSPソースコードのビルド
WORKDIR ${LAMBDA_TASK_ROOT}
ARG HSP_SOURCE_NAME=sample
ENV HSP_SOURCE_NAME=${HSP_SOURCE_NAME}
COPY ${HSP_SOURCE_NAME}.hsp ./
RUN hspcmp --compath=/OpenHSP-3.7beta10/common/ -d -i -u ${HSP_SOURCE_NAME}.hsp

# bootstrapの起動
COPY bootstrap ${LAMBDA_RUNTIME_DIR}/bootstrap
RUN chmod +x ${LAMBDA_RUNTIME_DIR}/bootstrap
ENTRYPOINT ["${LAMBDA_RUNTIME_DIR}/bootstrap"]
```

[前回](https://qiita.com/kijuky/items/fffac99c93fef2382866#2-docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90)はHSPスクリプトを起動していましたが、今回はbootstrapを起動します。

# 3. 実行する

テスト実行してみます。

```
START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
Segmentation fault (core dumped)
response: 
```

[aws-lambda-rie](https://aws.amazon.com/jp/builders-flash/202104/new-lambda-container-development-2/)だと実行できましたが、実際のlambdaで実行すると`Segmentation fault (core dumped)`が出てしまいました。残念。。（やっぱりGPIOまわりがまずいのかなぁ？）

# 補足

テスト用のリポジトリを用意しておきます。興味が出た方はフォークして調査研究してみてください...

https://github.com/kijuky/hsp-lambda
GA4ならファイルのダウンロード数がデフォルトで取れる！

こんにちは！今までのGoogle Analytics（UA）を割と使っていた方だと、ファイルのダウンロード数をカウントする場合、「イベントトラッキング」でイベントとして送信して…みたいなことをやっていたと思うのですが、GA4では特定条件ならデフォルトでカウントできてますよ、というお話です。

## ダウンロード数が取得できる条件
1. aタグのリンク先がtarget="_blank"になっている(同タブの場合download属性をついている) 
2. リンク先が.pdf, .docx, .xlsx, .zip などの拡張子形式になっている
3. GA4の拡張計測機能がONになっている（通常はデフォルトでON）
:::note info
リンクがaタグではなくJSの場合はデフォルト取得されませんのでお気を付けください！
:::

## レポートの作成方法
1. GA4画面左の「探索」へ
2. 新規 → 「空白」選択
3. 「ディメンション」に以下を追加してインポート
　・ファイル名
　・イベント名
4. 「指標」に 「イベント数」 を追加
5.「行」に 「ファイル名」を設定
    「フィルター」に イベント名「file_download」 を設定

    ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924179/87f1e6ac-9ea0-444e-b6d3-04d98d304e83.png)

:::note info
このキャプチャの場合、フィルタでパスを指定して特定のディレクトリ配下のURLをカウントしています！
:::

DL数は意外と重要な指標なので余さずレポートしていきたいですね！
【制作記録】LINE×QRコードで、受付システムを自作してみた話

こんにちは、株式会社LiemPiaのたんぽぽです。

イベントや展示会、ちょっとした説明会でも「受付業務」って地味に大変だったりしますよね。
紙に名前を書いてもらう → 主催者が確認 → スプレッドシートに手動転記…
この作業、正直、無駄が多すぎる。
「もっとスマートに、でも大掛かりなシステムじゃなくて、サクッと使える受付ツールがほしい」
そう思って、LINEとGoogle Apps Scriptで作る受付QRコードシステムを自作してみました。

# 🧾 どんな仕組み？
一言で言うと、
**「LINEで完結する受付システム」** です。

参加者はQRコードをスマホで読み込んで、LINEで受付。
主催者はGoogleスプレッドシートに自動記録されたログを見ればOK。
PCも専用機材も不要。スマホ1つで回せるのが強みです。

# 🔧 技術構成
フロントエンド：HTML/CSS（Cloudflare Pagesでホスティング）

バックエンド：Google Apps Script（Webhook処理、データ保存）

データベース：Google スプレッドシート

通信：LINE公式アカウント（Messaging API）

今回はサーバーレス構成なので、全て無料で運用可能です。
(Messaging APIの課金は掛かるかも)

# 🖼️ 実際の画面イメージ
![スクリーンショット 2025-06-02 12.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901203/47220f0c-0a92-434c-bbd9-3f69088b59d4.png)

受付端末にはQRコードが表示されていて
↓
参加者はLINEでそのQRコードを読み取り
↓
自動で「確認コード」が返ってきて
↓
それを入力すれば受付完了

めっちゃシンプル。

# 🔄 流れ（裏側）
フロント（index.html）でイベントIDとLINEアカウントIDを入力
↓
JSでQRコードを生成
↓
参加者が読み込む → LINEで受付メッセージ送信
↓
Google Apps Script（backend.gs）でメッセージを処理
↓
確認コードを自動返信
↓
その確認コードを入力すれば受付完了
↓
Googleスプレッドシートに記録

これだけ。

# ✨ 個人的に気に入ってるポイント
誰でも使えるUI：スマホでLINEが使えればOK
導入ハードルゼロ：インストール不要、端末に依存しない
完全無料：Cloudflare Pages × GAS × スプレッドシートでコストゼロ

# 🛠️ 今後追加したいこと
・受付番号の自動リセット
・管理者向けのリアルタイム受付状況表示
・CSVエクスポート機能


📎 ソースコードについて
このプロジェクトは MITライセンス で公開しています。
「ちょっと真似してみたい」「うちでも使ってみたい」という方、大歓迎です！
https://github.com/liempia/line-reception

使いたいけどホスティングめんどくさい方はこちらをお使いください。
https://line-reception.liempia.app/

# 🤝 最後に
今回は「受付業務をLINEで完結させる仕組み」をテーマに自作してみました。

開発時間はざっくり半日ほど。
GASとLINE Bot、思ったより相性良かったです。

「小規模イベントを効率化したい」
「GASやLINE Botを使ってみたい」
という方の参考になれば嬉しいです！

この記事が役に立ったら、スキ♡やコメント、フォローをいただけると励みになります。

ご質問などあれば、お気軽にどうぞ！
品質評価のため、ステップ数出してみた

# はじめに
現在担当している案件にて総合試験が完了し品質評価報告をする際に、ステップ数に対してバグ密度を算出しようとした
しかし、今回の案件で初めて、Swift、Kotlinを使ってスマホアプリを開発したため、ステップ数の出し方がわからなかった
備忘として導入から利用までを記載することとする

# 使用するエディタ


1. VSCode
1. Android Studio

※普段は、VSCodeを使っていますが、Kotlinについて今回うまくいかなかったのでAndroid Studioで行いました。
※Windowsにて、作業しています。

# VSCodeを使ったステップ数算出方法

1. 拡張機能より「VSCode Counter」をインストール
※VSCode Counterとは、VSCode上で動作する拡張機能。有効行、空行、コメント行をカウントしてくれる機能
1. VSCode起動
1. VSCodeにて「Ctrl」＋「Shift」＋「P」キーを入力し、「VSCodeCounter：ディレクトリ内のコード行を数える」を選択
1. コード行が算出され、結果がMarkdown形式で出力される
　
# Android Studioを使ったステップ数算出方法
1. プラグインのインストール 
   https://plugins.jetbrains.com/plugin/4509-statistic
1. Android Studioを起動
1. Statisticタブが表示されていることを確認（表示されていなければ、ツールバーのView>Tool Window>Statisticを選択)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871565/9c6fdd64-881b-4bed-b28c-270fe85ee409.png)

1. 何も表示されていない場合は、「Refresh」ボタンを押下し、数秒待つと、ステップ数が算出される

# 最後に
今回、初めてスマホアプリ構築の案件に携わり、品質評価の段階で開発メンバーに確認したところ、誰も算出したことがないということで、個人的に調査して試したものを載せております。
今後のために、個人的な備忘としても残しておこうと思い、記事を投稿いたします。
【rails】mailerのテストで発生したエラーと対処法


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在、Rails チュートリアルのアウトプットとしてアプリを製作しています。
Devise の実装が完了し、Mailer のテストコードを書いていたのですが、エラーが出てきて困っていました。
その時に私がとった対策を記事にしておこうと思いました。

## 問題のコード

```ruby
class DeviseMailerTest < ActionMailer::TestCase
  test 'confirmation_instructions' do
    @user = users(:user1)
    raw_token, enc_token = Devise.token_generator.generate(User, :confirmation_token)
    @user.update(confirmation_token: enc_token)

    mail = Devise::Mailer.confirmation_instructions(@user, raw_token) # メールを送信

    assert_equal [@user.email], mail.to
    assert_equal '（重要）アカウントの有効化について', mail.subject
    assert_equal [Devise.mailer_sender], mail.from # from は config/initializers/devise.rb 内の config.mailer_sender を参照
    assert_match @user.name, mail.body.encoded
    escaped = CGI.escapeHTML(raw_token) # raw_token を HTML エンコード
    assert_match escaped, mail.body.encoded
  end
end
```

## どこでエラーになるか？

このテストで `include Rails.application.routes.url_helpers` を書かない場合、

```ruby
mail = Devise::Mailer.confirmation_instructions(@user, raw_token)
```

この行でエラーが発生します。

### エラー内容の例

- `undefined method 'confirmation_url' for #<Devise::Mailer:...>`
- `NoMethodError: undefined method 'confirmation_url'`

これは Devise の Mailer が確認メール本文を生成する際、内部で `confirmation_url` などの**ルートヘルパー**を呼び出しているためです。

---

## ルートヘルパー(url_helpers)とは？

Rails では `routes.rb` で定義されたルートごとに `user_confirmation_url` などのヘルパーメソッドが自動生成されます。

これらのヘルパーをコントローラやビューで使う場合は何も意識する必要はありませんが、
**Mailer クラスやテストクラスで使いたい場合**は `Rails.application.routes.url_helpers`を include する必要があります。

### 例

```ruby
include Rails.application.routes.url_helpers
```

これをテストクラスや Mailer クラスに書くことで、

- `user_confirmation_url`などのメソッドが使えるようになります。

---

## まとめ

- Devise::Mailer がメール本文を生成する際、ルートヘルパー（confirmation_url など）を内部で呼び出す
- そのため、テストやカスタム Mailer では `include Rails.application.routes.url_helpers`を忘れると NoMethodError になる
- テストや Mailer を実装するときは必ず include することを意識しよう

---

## 参考リンク

https://techracho.bpsinc.jp/hachi8833/2021_03_05/104476
GitHubアカウント名は本名？ハンドルネーム？

# ざっくり所感
どっちもいるから好きにしてよさそう。
- 本名じゃないと困る、というケースはほぼなさそう
- **そもそも氏名なんて簡単に名前衝突する**
- GitHubはポートフォリオツールではなくソース管理・共有プラットフォームなのだからハンドルネームで問題ない
- 大事なのは他のPublicサービス(X、Qiita等)との一貫性

# 見解スクラップ

https://x.com/snakajima/status/1435754177708249089?s=46&t=3ZRRL4XcziL3uyyVMGKAbQ

https://x.com/akabekobeko/status/1436164183393857540?s=46&t=3ZRRL4XcziL3uyyVMGKAbQ

https://x.com/danna_2010/status/1435938836303863814

https://x.com/Taillook/status/1435929002473000961

https://x.com/basuke/status/1435876056414572544

https://x.com/sigma_signature/status/1435893093929140229

https://x.com/lembryo_/status/1436266002392621062
[ABC408] ABC 408(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# [ABC408] ABC 408(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

# A問題
- `T` の差分が `S` を超えたら、長老は寝てしまう。
- `T_-1` を導入して、`0` 秒目に肩を叩く番兵を作る。
```A.py
"""
<方針>
- `T` の差分が `S` を超えたら、長老は寝てしまう。
- `T_-1` を導入して、`0` 秒目に肩を叩く番兵を作る。
"""
# 入力
N, S = map(int, input().split())
T = list(map(int, input().split()))

# 番兵
T = [0] + T

# 差分を順番に見る。
for i in range(N):
  # `T` の差分が `S` を超えたら、
  if(S < (T[i+1] - T[i])):
    # 寝て、プログラムを終了する。
    print("No")
    exit()

# 長老は寝なかった。
print("Yes")
```

# B問題
- `set` に入れて、重複を消す。
- `.sort()` して、小さい順にする。
- アンパック `*` して、出力する。
```B.py
"""
<方針>
- `set` に入れて、重複を消す。
- `.sort()` して、小さい順にする。
- アンパック `*` して、出力する。
"""
# 入力
N = int(input())
A = list(map(int, input().split()))

# 重複を消し、リストに戻す。
C = list(set(A))

# 小さい順にする。
C.sort()

# 出力
print(len(C))
print(*C)
```

# C問題
## 方針
- それぞれの壁が幾つの砲台に守られているか `P` を計算できれば、後は、その中で最小の数字を返せば良い。
- しかし、素朴にそれぞれの `L`, `R` に対して、一つずつ `P` を構築すると、`O(MN)` かかってしまう。
- そこで、累積和を考えると、計算量が `O(M+N)` になる。
- 全体でも計算量は `O(M+N)` 程度になるだろう。
## 前提
- `C`問題あたりで，`TLE`になる人は，制約条件を見る癖をつけよう．
- `A`と`B`問題では，基本的に制約条件を見ずにやっても解ける．
- しかし，`C`問題以降では，制約条件を見ないと必ず`TLE`すると思っても良い．
- 詳しい話は私の[352回の記事](https://qiita.com/mattsunkun/items/837444254f03e6105922) の`C`問題の解説に記したので，是非参照してほしい．
```C.py
"""
<方針>
- それぞれの壁が幾つの砲台に守られているか `P` を計算できれば、後は、その中で最小の数字を返せば良い。
- しかし、素朴にそれぞれの `L`, `R` に対して、一つずつ `P` を構築すると、`O(MN)` かかってしまう。
- そこで、累積和を考えると、計算量が `O(M+N)` になる。
- 全体でも計算量は `O(M+N)` 程度になるだろう。
"""
N, M = map(int, input().split())
P = [0]*(N+2) # 累積和のためのマージンもとっておく

# フラグを立てる
for _ in range(M):
  L, R = map(int, input().split())
  P[L] += 1
  P[R+1] -= 1

# 累積する。
for i in range(len(P)-1):
  P[i+1] += P[i]

# 端っこは含まない
ans = min(P[1:-1])

print(ans)
```

# D問題
- ユーザー（AngrySadEight）公式解説と一緒です。
```D.py
"""
- ユーザー（AngrySadEight）公式解説と一緒です。
"""
T = int(input())
for _ in range(T):
  N = int(input())
  S = list(map(int, list(input())))
  
  # dp
  dp = [[None]*3 for _ in range(N+1)]
  dp[0] = [0]*3 # 初期値
  
  # 遷移
  for i in range(N):
    dp[i+1][0] = dp[i][0] + int(S[i] != 0)
    dp[i+1][1] = min(dp[i][0] + int(S[i] != 1), dp[i][1] + int(S[i] != 1))
    dp[i+1][2] = min(dp[i][1] + int(S[i] != 0), dp[i][2] + int(S[i] != 0))
  
  # 答え
  ans = min(dp[N])
  
  print(ans)
```

# 補足
### 関係するリンク(参考文献など)
- [今回のコンテスト](https://atcoder.jp/contests/abc408)
- [D問題のユーザー（AngrySadEight）公式解説](https://atcoder.jp/contests/abc408/editorial/13174)
### 筆者について
- [Atcoderアカウント](https://atcoder.jp/users/mattsunkun)
- *今回も不参加のため，成績なし．*
- [解説で示したA問題の提出](https://atcoder.jp/contests/abc408/submissions/66394746)
- [解説で示したB問題の提出](https://atcoder.jp/contests/abc408/submissions/66394705)
- [解説で示したC問題の提出](https://atcoder.jp/contests/abc408/submissions/66395552)
- [解説で示したD問題の提出](https://atcoder.jp/contests/abc408/submissions/66395959)
### その他
- **間違いを含んでいる可能性があります．**
- 方針と言いつつ，方針ではない感想などを書いている可能性があります．
- A問題から解説がだんだん省略されます．
- コードに書かれている解説の文言と，その上に書いてある解説の文言を変えている場合があります．
### 最後に一言
- 晴れ時々 `ヘビー・ウェザー`
Upgrade to Dynamic Related Lists



https://trailhead.salesforce.com/content/learn/projects/upgrade-to-dynamic-related-lists

# Get Started with Dynamic Related Lists

United Oil & Gas Corpを使わなくても問題なかった。


# Customize Dynamic Related Lists

何もしないで検証ボタンをクリックする

:::note alert
We can’t find a related list called 'Open Opportunities by Stage'.
:::

あっさり完了してしまった...
＜大嶋淑之＞なぜ新潟で仕事を選んだのか

こんにちは。動画編集とクリエイティブ制作を中心にフリーランスで活動している大嶋淑之です。普段は新潟を拠点にしていますが、「なぜわざわざ地方の新潟で仕事をしているの？」とよく聞かれます。今回はその理由を技術的な側面や生活面から整理してお伝えします。

まず第一に、新潟のITインフラ環境が整っていること。光回線は市街地はもちろん郊外でも高速で安定しており、大容量ファイルのやりとりやリモート会議も問題なく行えます。クラウドサービスやコラボツールを活用した分散型の働き方に最適な環境が整っているのです。

第二に、新潟の生活コストの低さがクリエイティブワークにプラスに働いていること。動画編集やソフトウェア開発では、時間と心の余裕が質の高いアウトプットに直結します。家賃や日常の支出が抑えられる分、最新の機材やソフトに投資したり、新しい技術の勉強に回せるのは大きなメリットです。

第三に、自然豊かで静かな環境が集中力を高めてくれること。都会の喧騒や満員電車から解放され、仕事に没頭できる環境は、コードを書く時間や映像編集の細かい作業には不可欠です。自然に囲まれた環境がストレス軽減と創造力向上に貢献しています。

さらに、地方にいながら全国のプロジェクトに参加できる技術の進歩も後押ししています。リモートワークの普及により、場所に縛られない働き方が可能になりました。私も新潟から東京や大阪のクライアントとオンラインで繋がり、多様な案件に携わっています。

最後に、地元の魅力やコミュニティに参加しながら、地域に貢献できること。動画制作を通じて新潟の企業や文化を発信する仕事は、単なる作業以上の意味があります。地方の活性化に少しでも寄与できることは、個人的にも大きなモチベーションになっています。

こうした理由から、新潟という場所が私にとって「働きやすく、創造的になれる環境」として最適なのです。もし「地方での仕事」や「リモートクリエイターの働き方」に興味があれば、ぜひチャレンジしてみてください。
DHCPとは

# Dynamic Host Configuration Protocol（ダイナミック ホスト コンフィギュレーション プロトコル、DHCP）
### Ipv4ネットワークで使用、ネットワークに接続するための設定情報を割り当てを行う
`IPv4ネットワークで使用されるネットワーク管理プロトコル`であり、`コンピュータがネットワークに接続する際に必要な設定情報を自動的に割り当てるために使用`する。 BOOTPにリース機能を追加してDHCPとなっている。

### IPを動的に割り当て、IPアドレスの管理をする 
DHCPサーバは、IPアドレス等のネットワーク構成設定を`ネットワーク上の各デバイスに動的に割り当て、他のIPネットワークと通信できるようにする`[1]。DHCPサーバを使用すると、コンピュータは`自動的にIPアドレスとネットワーク設定を要求でき`、`ネットワーク管理者やエンドユーザが全てのネットワークデバイスに手動でIPアドレスを割り当てる必要がなくなる`[1]。

### ローカルネットワーク内のIPアドレスの割り当てを行う
DHCPは、ホームネットワーク（英語版）から大規模なキャンパスネットワーク（英語版）、地域のインターネットサービスプロバイダネットワークまで、様々な規模のネットワークに実装できる[2]。`ほとんどのルータまたはホームゲートウェイは、DHCPサーバとして機能`させることができ、ローカルネットワーク内において、`ネットワークに接続されている各デバイスにローカルIPアドレスを割り当てる`ことができる。

https://ja.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#:~:text=Dynamic%20Host%20Configuration%20Protocol%EF%BC%88%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF,%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82

## Bootstrap Protocol（ブートストラップ プロトコル、BOOTP)
### IPアドレスやホスト名、サブネットマスク等を自動的に取得する役割を果たす元のプロトコル
コンピュータネットワークに接続されたクライアントが、`IPアドレスやホスト名、サブネットマスク等を自動的に取得するためのプロトコル`である。元々は RFC 951 で定義された。主に、オペレーティングシステムがブート（起動）する際に用いられる。

### OSが起動するとBOOTPメッセージをブロードキャストすることでIPアドレスを要求する
ネットワークに接続されているコンピュータの電源を入れてオペレーティングシステムを起動すると、`システムソフトウェアはBOOTPメッセージをネットワークにブロードキャストで送信し、IPアドレスの割り当てを要求`する。BOOTP設定サーバは、要求に基づいて、管理者によって設定されたアドレスプールからIPアドレスを割り当てる。

### ポート番号は67（要求）、68（応答）はDHCPと同じ
BOOTPは転送プロトコルとしてUDPを使用する。`サーバがクライアントの要求を受信するためにポート番号67を、クライアントがサーバからの応答を受信するためにポート番号68`が使用される。なお、これらのポート番号はDHCPと同じである。BOOTPはIPv4でのみ動作する。

https://ja.wikipedia.org/wiki/Bootstrap_Protocol#%E6%AD%B4%E5%8F%B2:~:text=Bootstrap%20Protocol%EF%BC%88%E3%83%96%E3%83%BC,%E3%81%AE%E3%81%BF%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E3%80%82
【脱・JavaScript】CSSだけで作る！リッチに動くハンバーガーメニュー完全ガイド

## はじめに
ハンバーガーメニュー作るとき、
「結局JavaScript書かないと無理でしょ？」って思ってないです？

いやいや、CSSだけでけっこうイケるんです。

最近のCSSはかなり進化していて、アニメーション・状態管理もわりとサクッと書けます。
この記事では「CSSオンリーでリッチに動くハンバーガーメニュー」を作る方法を、コピペOKな完全コード付きでわかりやすくまとめます。

- JS書きたくない人
- シンプルに軽量なコードで作りたい人
- HTML+CSSだけでできることを極めたい人

におすすめです。

## 完成イメージ
![chrome-capture-2025-6-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622932/cf8f88aa-41ce-4e7e-8091-3ce64ec5a5d9.gif)

完全CSSのみですよ。


## なぜCSSだけで作れるの？
ポイントは以下。
- input[type="checkbox"] を状態管理に使う
- 兄弟セレクタ（~） で他要素を制御
- transition / transform / opacity で自然なアニメーション
- position: fixed で重ね順を自在に制御

これだけで「押すと開く」「押すと閉じる」が成立します。
実際のコードを見たほうが早いので早速いきます。

## HTML（超シンプル）
```
<div class="menu-wrapper">
  <input type="checkbox" id="menu-toggle" hidden>
  
  <label class="menu-icon" for="menu-toggle">
    <span></span>
    <span></span>
    <span></span>
  </label>
  
  <div class="overlay"></div>
  
  <nav class="menu">
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Service</a></li>
      <li><a href="#">Contact</a></li>
    </ul>
  </nav>
</div>
```
- input hidden → 状態保持用の隠しチェックボックス
- label for → クリック可能なボタンを実現
- 兄弟要素に影響を与える仕組みの土台

## CSS（ここがキモ）
```
.menu-wrapper {
  position: relative;
}

.menu-icon {
  width: 40px;
  height: 30px;
  position: fixed; /* ← fixedにして常に左上固定 */
  top: 20px;
  left: 20px;
  cursor: pointer;
  z-index: 3;
  display: inline-block;
}

.menu-icon span {
  display: block;
  height: 4px;
  margin: 6px 0;
  background: #333;
  border-radius: 2px;
  transition: 0.4s;
}

/* ハンバーガーがXに変形 */
#menu-toggle:checked + .menu-icon span:nth-child(1) {
  transform: translateY(10px) rotate(45deg);
}
#menu-toggle:checked + .menu-icon span:nth-child(2) {
  opacity: 0;
}
#menu-toggle:checked + .menu-icon span:nth-child(3) {
  transform: translateY(-10px) rotate(-45deg);
}

/* オーバーレイ背景 */
.overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.5);
  opacity: 0;
  pointer-events: none;
  transition: 0.4s;
  z-index: 1;
}

#menu-toggle:checked ~ .overlay {
  opacity: 1;
  pointer-events: auto;
}

/* メニュー本体（左から出す） */
.menu {
  position: fixed;
  top: 0;
  left: -250px; /* ← 初期位置を左へ */
  width: 250px;
  height: 100%;
  background: #fff;
  box-shadow: 2px 0 8px rgba(0,0,0,0.2);
  transition: left 0.4s ease;
  z-index: 2;
}

#menu-toggle:checked ~ .menu {
  left: 0; /* ← 開いたときは左0へ */
}

.menu ul {
  list-style: none;
  padding: 60px 20px;
}

.menu li {
  margin: 20px 0;
}

.menu a {
  text-decoration: none;
  color: #333;
  font-size: 1.2rem;
  transition: color 0.3s;
}

.menu a:hover {
  color: #007bff;
}
```
## 補足Tips
✅ アクセシビリティ
ガチ運用なら以下も足すと良い：
- aria-controls 付与
- role="navigation" 付与
- フォーカス制御（Tabキー対応など）

✅ SEO・パフォーマンス
- JSなしだから軽い
- 初期ロードが速い
- SPAでも全然組み込める

✅ ブラウザ対応
- 主要ブラウザは全対応（has()は使ってないので安心）
- IEはもう気にしなくていい時代

## まとめ
- CSSだけでここまで動く時代になってる
- 意外とプロダクトでも使える
- 状態管理はinputと兄弟セレクタが超便利

JS書く前に「これCSSでいけない？」って一回考えてみると、開発がだいぶラクになる。

## もし役立ったらいいね・LGTMもらえると嬉しいです！
Qiitaもアルゴリズムでおすすめに出やすくなるのでぜひ！(がめつい)

### 関連ワード（SEO用）
CSSだけ ハンバーガーメニュー
JavaScript不要 メニュー開閉
CSSアニメーション ハンバーガー
input type="checkbox" ハンバーガー
CSS兄弟セレクタ メニュー作成
猿でもわかるAIプログラミングシリーズ 🐵💻 ChatGPT APIをPythonから使ってみよう！

 

# 🐵💻 猿でもわかるAIプログラミングシリーズ

## ChatGPT APIをPythonから使ってみよう！

---

### 1. はじめに：業務に“AIの頭脳”を組み込む時代へ

近年、ChatGPTをはじめとする大規模言語モデル（LLM）が爆発的に普及し、Webサービスだけでなく、業務ツール・スクリプトにも組み込まれるようになってきました。

「手作業でやっていたExcel関数の自動生成をAIにやらせたい」
「問い合わせメールの下書きをAIが作ってくれたら楽になるのに」
「ログを解析して異常を検知する処理に自然言語理解を取り入れたい」

そんなニーズに、**ChatGPT API**は非常に強力な選択肢です。

本記事では、PythonからChatGPT APIを簡単に利用する方法を、**業務現場でも“すぐ使える”レベルの実装例**とともに丁寧に紹介します。

---

### 2. ChatGPT APIとは？ざっくり基礎理解

ChatGPT APIは、OpenAIが提供するREST APIで、OpenAIの大規模言語モデル（GPT-4、GPT-3.5など）をプログラムから呼び出して利用できます。

#### 💡 用語解説

| 用語            | 意味                                  |
| ------------- | ----------------------------------- |
| LLM（大規模言語モデル） | 大量の文章を学習した自然言語処理AI。GPTもその一種。        |
| API           | プログラム同士の通信手段。PythonなどからHTTPで呼び出し可能。 |
| エンドポイント       | APIを叩くためのURLのこと。                    |

ChatGPT APIは以下のような特徴があります：

* `chat/completions`エンドポイントを利用して、会話形式のプロンプトを送れる
* モデルは `gpt-4` や `gpt-3.5-turbo` を指定可能
* レスポンスは自然な日本語・英語のテキスト

---

### 3. Pythonでの実装：ChatGPT APIを使ってみよう

では、早速PythonからChatGPT APIを呼び出す実装を見ていきましょう。

#### 🧰 前提：必要なもの

* Python 3.7+
* `openai` ライブラリ（インストール必要）
* OpenAIのAPIキー（[こちら](https://platform.openai.com/account/api-keys) から取得）

```bash
pip install openai
```

#### 🧪 基本コード例：ChatGPTに質問してみる

```python
import openai

# OpenAIのAPIキーを設定（環境変数推奨）
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",  # GPT-4に切り替えも可能
    messages=[
        {"role": "system", "content": "あなたは有能なPythonエンジニアです。"},
        {"role": "user", "content": "PythonでCSVファイルを読み込むには？"}
    ]
)

print(response.choices[0].message["content"])
```

実行すると、以下のような自然な回答が返ってきます：

````txt
PythonでCSVファイルを読み込むには、pandasライブラリを使うと便利です：
```python
import pandas as pd
df = pd.read_csv("ファイル名.csv")
````

````

---

### 4. 実践Tips：業務で使う上での注意点と失敗例

#### ✅ 使えるTips

- **systemロールの活用**：AIの振る舞いを制御できます（例：「あなたは法律の専門家です」）。
- **プロンプトは具体的に**：曖昧な指示だと期待と違う出力に。
- **ログ記録を必ず**：APIレスポンスをログに残すことでトラブル対応が容易に。

#### ❌ よくある失敗

- **APIキーの漏洩**：GitHubにうっかりコミットしてしまうミスはよくある。環境変数に設定しよう。
- **無限ループ的なプロンプト依存**：複数回のAPI呼び出しにプロンプトの履歴を含めすぎてtoken超過。
- **料金の過剰請求**：開発中は`gpt-3.5-turbo`を使って節約しよう。

---

### 5. 応用編：Excel自動化やSlackボットへの組み込み

#### 📊 Excelの関数生成を自動化する例

```python
prompt = "A列にある売上を合計するExcel関数を教えて"

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)

excel_formula = response.choices[0].message["content"]
print("生成された関数:", excel_formula)
````

結果：

```
=SUM(A:A)
```

これをExcelのマクロやVBAと連携すれば、**非エンジニアでも使えるAIツールの原型**になります。

#### 💬 Slack BotにChatGPTを組み込む

Slack APIと組み合わせることで、社内QAボットも簡単に構築可能です（詳細は別記事で解説予定！）

---

### 6. まとめ：ChatGPT APIで業務を“賢く”する第一歩を

| 観点       | 内容                                 |
| -------- | ---------------------------------- |
| 👍 メリット  | 柔軟な自然言語処理、Pythonから簡単に連携、生成タスクの自動化  |
| 👎 デメリット | 応答の安定性に注意、料金制モデル、セキュリティ意識が必要       |
| 🔮 将来性   | RAG（検索拡張生成）や社内ナレッジ連携との統合でさらに可能性拡大中 |

ChatGPT APIは、「魔法のような自動応答機能」を**誰でも手軽に業務に組み込めるツール**として注目されています。
まずはこの記事のコードをコピペして動かし、**自分の業務にどう使えるか**をぜひ考えてみてください！

---

📌 **次回予告無料で使えるAIツール一覧（非エンジニア向け）：**

> Googleスプレッドシートと連携してChatGPTにデータ処理をやらせてみる！
Dev Containers 内の Bash で補完

VSCode + Dev Containers 内のターミナル (Bash) で補完が効かなかったので効くようにした。

``` Dockerfile:Dockerfile
RUN apt-get update && apt-get install -y bash-completion \
  && echo 'source /etc/bash_completion' >> /etc/bash.bashrc
```

- 上記は Debian ベースのイメージで Dev Containers を起動している前提
- はじめは `/etc/profile` に書き込んでいたが反映されなかった → コンテナが起動するときのシェルはデフォルトでは非ログインシェルなので `/etc/bash.bashrc` の方に書き込むのが正解だった