OmniAICreator/Qiita-1.07M huggingface dataset:
【Next.js × S3 Webホスティング】環境変数が読み込まれなかったので、env-cmdで解決した

## はじめに
最近AWSを本格的に触り始めたnaokiです🧑‍💻

案件に入りながら自社（SES）サービスの立ち上げメンバーとして、PM兼テックリードとしてMVP開発を進めていました。

Next.jsでフロントエンドを作成し、S3上で静的Webホスティングを行う構成をとった際に、**クライアントサイドからバックエンドへのAPIコール**でハマったことがあったので、備忘録としてまとめておきます。

## 前提

* フロントエンド: Next.js（静的サイトとしてビルド）
* ホスティング: AWS S3（静的Webホスティング）

## 課題

`NEXT_PUBLIC_API_BASE_URL` という環境変数を設定していたにも関わらず、APIリクエスト時のパスがうまく指定できないという問題が発生しました。

``` .env
NEXT_PUBLIC_API_BASE_URL="https://your-domain/api"
```

具体的には、以下の処理を走らせるときにエラーが発生しました。

``` email-sent.tsx
const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/sign-up`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(payload),
      });
```

本来であれば、APIリクエスト先が以下のパスになっていなければいけませんが、
```
https://your-domain/api/auth/sign-up
```
/apiがundifinedになってしまい、正しくリクエストを送ることができませんでした。
```
https://your-domain/undifined/auth/sign-up
```
 
![next-js-api-request-failed](https://res.cloudinary.com/dcigcmciv/image/upload/v1747473579/api-request-failed_uzghcb.png)


## 原因と解決策

Next.jsで静的出力（`next export`）を行う際、`.env` ファイルが読み込まれていないことが原因でした。

そこで、環境変数を明示的に読み込ませるために [`env-cmd`](https://www.npmjs.com/package/env-cmd) を導入しました。

## 解決方法

以下の手順で解決しました。

### 1. `env-cmd` をインストール

```bash
npm install env-cmd 
```

### 2. プロジェクト直下に `.env.prod` を作成

```env
NEXT_PUBLIC_API_BASE_URL=https://your-domain/xxx
```


### 3. `package.json` にビルドスクリプトを追加

```json
{
  "scripts": {
    "build:prod": "env-cmd -f .env.prod next build && next export"
  }
}
```
静的ファイルを出力する本番環境用のビルドスクリプトを作成します。

### 4. ビルド実行

```bash
npm run build:prod
```

これで `.env.prod` の環境変数が静的ファイルに反映され、APIコールが期待通り動作するようになりました。

## おわりに

静的サイトとしてデプロイする構成では、**ビルド時の環境変数の扱いに注意が必要**です。Next.jsでは `NEXT_PUBLIC_` がついていても、`.env` の読み込みがビルド時に正しく行われていなければ反映されません。

同様の構成を取っている方の参考になれば幸いです。
データ移行とストレージ調整

# 【完全ガイド】Macの移行アシスタントでデータ移行する前にやるべき「ストレージ調整」と使い方

Macの買い替えや新しいMacへのデータ移行で使う「移行アシスタント」は便利ですが、  
移行前にストレージ容量の整理をしておかないと失敗やトラブルの原因になります。  

この記事では、  
- 移行アシスタントでデータ移行する基本的な流れ  
- 移行前にやるべき「ストレージ調整」のポイント  
- 容量が多いフォルダの特定方法と実例  
- 実際に削除して良いフォルダ・ファイル  
- 削除してはいけないフォルダの注意点  

をわかりやすくまとめました。  

## 1. 移行アシスタントを使ったMacデータ移行の基本

- Apple純正の「移行アシスタント」を使うと、  
  古いMacやTime Machineバックアップから簡単に新しいMacへデータや設定を移せます。  
- ネットワークや外付けストレージ経由で接続し、ガイドに従うだけなので初心者でも安心です。  
- ただし移行先のMacに空き容量が十分にないと途中でエラーになることもあります。  

## 2. 移行前にやるべき「ストレージ調整」

### 対象は「ホームフォルダ（`~`）」だけで十分

- 「ホームフォルダ」とは、Macでログインしているユーザーの個人用データや設定が入っているフォルダのことです。  
- ターミナルでは`~`（チルダ）で表されます。  
- 実際のパスは/Users/ユーザー名です。  
- 移行アシスタントはこのホームフォルダの中身を主に移行します。  

### 「ルートフォルダ(`/`)」やシステム関連は絶対に触らない

- 「ルートフォルダ」とはMacのOSが入っている最上位のフォルダのことで、`/`（スラッシュ）で表されます。  
- ここにはシステムや重要な設定ファイルが入っていて、消したり編集するとMacが正常に動かなくなります。
- したがってユーザーが削除すべき対象はホームフォルダ内の不要ファイルのみです。

### ユーザーが意識すべき主な容量の多いフォルダ

ホームフォルダの中で容量が多く、ユーザーが不要なファイルを削除しやすい代表的なフォルダは以下です。

- **Downloads（ダウンロードフォルダ）**  
- **Desktop（デスクトップ）**  
- **Documents（書類）**  
- **ゴミ箱（Trash）**  

これらは日常的にファイルを置く場所で不要なものが溜まりがちです。  



## 3. 容量の多いフォルダを特定するコマンドと意味

Macのターミナルで以下のコマンドを使うと、ホームフォルダ直下の各フォルダの容量を大きい順に確認できます。  

```bash
du -h -d 1 ~ | sort -hr
```
コマンドの意味
- du (disk usage)：ファイル・フォルダのディスク使用量を調べるコマンド。
- h：人間に読みやすい単位（KB, MB, GB）で表示。
- d 1：指定フォルダの直下（1階層目）だけを集計。
- ~：現在ログインしているユーザーのホームフォルダを意味。
- |（パイプ）：左のコマンドの出力を右のコマンドに渡す。
- sort：行を並び替えるコマンド。
- h：人間に読みやすいサイズ単位でのソートを指定。
- r：逆順（大きい順）で表示。

実例

```bash
101G	/Users/yourusername
73G	/Users/yourusername/Library
14G	/Users/yourusername/よくつかうもの
3.1G	/Users/yourusername/XXXX
1.7G	/Users/yourusername/.nodebrew
1.4G	/Users/yourusername/.npm
1.3G	/Users/yourusername/.vscode
```

## まとめ

Macのデータ移行をスムーズに行うためには、移行アシスタントを使う前に必ずストレージの整理を行うことが重要です。  

- ホームフォルダ（`~`）内の不要ファイルを中心に削除し、特にDownloadsやDesktop、Documents、ゴミ箱の中身を重点的に整理しましょう。  
- システム関連のフォルダ（`/Library`や隠しフォルダなど）は消さないように注意してください。  
- ターミナルの`du`コマンドで容量の多いフォルダを特定し、どこに大きなファイルがあるのかを把握してから作業するのがおすすめです。  
- ストレージを空けることで、移行時のエラーを防ぎ、快適な移行が可能になります。  

以下に、ストレージ調整前と調整後のディスク使用状況のスクリーンショットを掲載予定です。  
視覚的にどれだけ容量を空けられたかの参考にしてください。  

ストレージ調整前
![スクリーンショット 2025-05-17 18.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1198550/2e508741-1f63-41ad-9451-8b269877aee1.png)
ストレージ調整後
![スクリーンショット 2025-05-17 18.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1198550/1724cf8c-e602-49d9-a89b-e6849c91b7b1.png)
回文判定

今回はPaizaの「回文判定」に挑戦！前回学んだreverse()が使えそう？！

🧪 問題概要
「文字列Sが回文かどうかを判定せよ」
回文とは「たけやぶやけた」みたいに、前から読んでも後ろから読んでも同じ文字列のこと。
<br>
入力例：

    paizaazzap

出力例：

    NO

<br>
    

https://paiza.jp/works/mondai/string_primer/normal_step11

<br><Br>

## 💥 NGコード例
```js
const firstHalf = text.slice(0, half);
const secondHalf = text.slice(half);
if(firstHalf === secondHalf.reverse()) {
  console.log("YES");
}
```

一見良さそうに見えるけど、reverse()で反転させただけで、ちゃんとjoin(”)しないと配列のまま比較されてしまうので要注意！

<br><br>

## ✅ OKコード例
```js
const rl = require('readline').createInterface({input:process.stdin});

rl.once('line',(input)=>{
    const text = input.split('');
    
    if(text.length % 2 === 0){
        const half = Number(text.length / 2)
        const firstHalf = text.slice(0, half).join('');
        const secondHalf = text.slice(half);
        
        if(firstHalf === secondHalf.reverse().join('')){
            console.log("YES");
        }else{
            console.log("NO");
        }
    
        
    }
    
    else{
        const half = Math.floor(text.length / 2);
        const firstHalf = text.slice(0, half).join('');
        const secondHalf = text.slice(half+1);
        
        if(firstHalf === secondHalf.reverse().join('')){
            console.log("YES");
        }else{
            console.log("NO");
        }
    }
    
    
});
```
💡 解説

- 回文とは「前半」と「後半を逆にしたもの」が等しい文字列のこと。
- 奇数文字列では中央の1文字は無視（`slice(half + 1)`）。
- `.slice(…).reverse().join'')` を使って逆順の文字列を作成。

### <br>✅ 簡単な回文チェック方法
```js
rl.once('line', (input) => {
    const reversed = input.split('').reverse().join('');
    console.log(input === reversed ? 'YES' : 'NO');
});
```

前から読んでも後ろから読んでも同じなんだから、
シンプルに「全部ひっくり返して比べる」が最速。

📝 メモまとめ

- `reverse()` だけじゃ文字列比較できない、配列のままになる
- `join('')` で文字列に戻してから比較が正解
- 奇数長の文字列では中央1文字を無視（`slice`で対応）
- シンプルに全部ひっくり返して、元と比べるのがはやい。


<Br><Br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/05/17/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e5%9b%9e%e6%96%87%e5%88%a4%e5%ae%9a/)
Macからssh経由でラズパイへ直接日本語入力する

<h2>背景</h2>
記事タイトル通り、Mac標準ターミナルアプリからラズパイへsshでログインしてあれこれしてるときに、直接日本語も入力させたくなったときにやった設定変更の記録メモです。

作業したときのmacOS は `Sequoia 15.3.1 (24D70)` です。
Raspberry Pi OS は bookworm12 インストール直後を想定しています。

<h2>設定手順</h2>
<h3>ラズパイのデフォルトロケールをja_JP.UTF-8にする</h3>

`sudo dpkg-reconfigure locales` で画面上で `ja_JP.UTF-8` を選び、これをデフォルト設定にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991231/5e0223b6-f203-48a4-99b1-c9eddfb37b4e.png)

<h3>ラズパイのsshのデフォルトを ja_JP.UTF-8 にする</h3>

ラズパイに  `/etc/ssh/sshd_config` を以下の内容で新規ファイル作成する

```
LANG="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_ALL="ja_JP.UTF-8"
```

<h3>ラズパイへssh接続しなおす</h3>

Mac側の日本語入力がUTF-8になっていれば、nano などで直接入力できるようになっていると思います
WebサービスとWebサイトの違いを解像度高く理解する 〜APIリクエストの流れとサーバー構成を分解解説〜

## ✅ この記事で理解できること

- WebサイトとWebサービスの違い
- ブラウザ → サーバー → DB の実行フロー
- Webサーバー、アプリケーションサーバー、DBサーバーの役割
- FastCGI・php-fpmとは何か？

---

## ✅ 用語の前提整理

| 用語 | 説明 |
|------|------|
| **Webサイト** | 静的なHTML・画像・CSSなどをブラウザに表示（例：企業サイト） |
| **Webサービス（Webアプリケーション）** | ログイン・投稿・購入など、ユーザーの操作で動的に変化するサービス（例：ECサイト、SNS） |
| **API** | フロントエンドとバックエンドが通信するためのインターフェース（URL形式）。JSONを返すことが多い |
| **サーバー** | ソフトウェアやデータを処理・提供するコンピュータまたはプロセス |

---

## ✅ Webサイト vs Webサービスの処理フロー

### 🔷 A. Webサイト（静的HTML）の流れ

```text
[1] ブラウザが https://example.com にアクセス
     ↓
[2] Webサーバー（Apache/Nginx）が HTML ファイルを返す
     ↓
[3] ブラウザが表示（HTML＋CSS＋画像）
```

- HTMLやCSS、画像ファイルは **ファイルとして保存されている**
- PHPやDBなどの動的処理は発生しない（静的）

---

### 🔷 B. Webサービス（動的アプリケーション）の流れ

```text
[1] ブラウザでログインボタンを押す
     ↓
[2] JavaScript が API（例：/api/login）にリクエスト送信
     ↓
[3] Webサーバー（NginxやApache）がリクエストを受ける
     ↓
[4] Webサーバーが FastCGI 経由で php-fpm に処理を渡す
     ↓
[5] PHP（Laravelなど）がリクエストを処理
     ↓
[6] DBサーバーと通信し、ユーザー情報などを取得
     ↓
[7] PHPがJSONで結果を返す
     ↓
[8] Webサーバー → ブラウザへレスポンス返却
     ↓
[9] ブラウザがJavaScriptで画面を更新（Vue, Reactなど）
```

---

## ✅ 関わるサーバーの種類と役割

| サーバーの種類 | 具体例 | 主な役割 |
|----------------|--------|-----------|
| **Webサーバー** | Nginx, Apache | HTTP通信の受付、ルーティング、静的ファイル提供 |
| **アプリケーションサーバー** | php-fpm, Node.js | PHPなどのプログラムを実行 |
| **DBサーバー** | MySQL, PostgreSQL | ユーザー情報・商品データなどを保存・提供 |
| **静的配信サーバー** | S3, Netlify, Vercel | HTML/CSS/JS/画像などの配信（SPAなど） |

※上記でWebサーバーとアプリケーションサーバーとDBサーバーと分けられていますが、これは物理的にサーバーが別れているとは限りません。
分ける場合もありますが（AWSなどを使っていると別けて処理する場合が多い）、プロセスとして分離されている場合もあります。

---

## ✅ Laravel + Vue/Nuxt 構成の場合の流れ

```text
[ ブラウザ ]
     ↓ HTML表示 or API通信
[ Webサーバー（Nginx） ]
     ↓ FastCGI（通信プロトコル）
[ PHP実行エンジン（php-fpm） ]
     ↓ PHPアプリ（Laravelなど）
     ↓ DBアクセス（MySQLなど）
     ↓ 結果をJSONで返す
```

---

## ✅ FastCGI / php-fpm とは？

- **FastCGI**：Webサーバーとアプリケーション（PHPなど）を分離して通信するための仕組み（プロトコル）
- **php-fpm**：PHPをFastCGIとして実行するプロセスマネージャ
- Webサーバー（Nginx等）とは別プロセスでPHPが実行されるため、パフォーマンスと安定性が高い

---

## ✅ なぜ「WebサーバーとPHP」を分離するのか？

| 課題（旧来のmod_php） | 解決策（FastCGI + php-fpm） |
|-----------------------|-----------------------------|
| ApacheがPHPも処理→高負荷で不安定 | PHPを別プロセスに分離し、高速で安定 |
| メンテやスケーリングが難しい | PHPを自由にスケール、独立管理しやすい |
| モダン構成と乖離 | FastCGIは本番構成の標準的手法 |

---

## ✅ 結論まとめ

- Webサイト＝HTML等の静的ファイルを返すだけ
- Webサービス＝JavaScriptがAPIを叩き、PHP（Laravelなど）が動的に処理
- WebサーバーとPHPを分離することで、スケーラビリティと保守性が向上
- FastCGI + php-fpm構成は、Laravel開発や本番運用でのベストプラクティス

---

## ✅ おまけ：どのように使い分ける？

| 条件 | 推奨構成 |
|------|-----------|
| 静的Webサイト（コーポレートなど） | HTML/CSS + Apache or Netlify |
| API付きWebサービス（SPA, Laravel） | Nginx + php-fpm（Laravel） + Vue/Nuxt（SPA） |
| 本番構成と揃えたい | DockerやAWSでFastCGI構成にするのが◎ |

---

理解を深めることで、Docker構成、インフラ設計、Laravel×Vueの連携にも自信が持てるようになります！
GDBでfork後の親子プロセスのデバッグ【備忘録】

# サンプルコード

```c:fork_debug.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    pid_t pid;

    printf("Before fork\n");

    pid = fork();

    if (pid == 0) {
        // 子プロセス
        printf("This is the child process. PID: %d\n", getpid());
    } else if (pid > 0) {
        // 親プロセス
        printf("This is the parent process. PID: %d, child PID: %d\n", getpid(), pid);
    } else {
        // fork失敗
        perror("fork");
        return 1;
    }

    printf("Both processes continue from here.\n");

    return 0;
}

```

# ビルド 〜 デバッグ開始
- ビルドします
`-g` オプションでデバッグ情報を埋め込みます。
```bash:bash
gcc -g -o fork_debug fork_debug.c
```

- デバッガ（GDB）を起動します
```bash:bash
gdb ./fork_debug
```

# 追跡するプロセスの設定
- **set follow-fork-mode 機能** を使用して、fork後に親プロセスと子プロセスどちらのデバッグを実行するか設定します
```bash:bash
(gdb) set follow-fork-mode parent #　親プロセスをデバッグしたい場合
(gdb) set follow-fork-mode child  #　子プロセスをデバッグしたい場合
(gdb) break main
(gdb) run

```

- ステップを実行していき、fork()がある行まで進めます
```bash:bash
(gdb) next                 # fork() に進む
(gdb) next                 # fork後の行へ。ここで分岐が発生
```

- fork後は、デバッグしないプロセスが最後まで実行されてから、デバッグするプロセスに切り替わります。子プロセスをデバッグする場合、以下のように出力されます。（プロセスIDは環境によって変わります。）
```bash:bash
[Attaching after process 8299 fork to child process 9798]
[New inferior 2 (process 9798)]
[Detaching after fork from parent process 8299]
This is the parent process. PID: 8299, child PID: 9798
Both processes continue from here.
[Inferior 1 (process 8299) detached]
[Switching to process 9798]
main () at fork_debug.c:12
12          if (pid == 0) {
(gdb) info inferiors # GDBが現在管理しているプロセスの一覧を表示する
  Num  Description       Executable
  1    <null>            /workspace/fork_debug  # 親プロセスは既に完了しているため、管理対象外となっている
* 2    process 9798      /workspace/fork_debug　# 子プロセス（Num左横の '*' は現在追跡しているプロセス）
```

以上、備忘録でした。
MacでLocal LLMのGemmaにショートカットでタスクを分解させる

## 1行で
MacのAutomatorでOllamaのコマンド叩くQuick Actionを追加し、それで選択中テキストを入れ替えるだけです。

## モチベーション

よく目標設定やらTODOがあっても、なんとなくやりたくないなーとかで後回しにしちゃいがちなので、タスクを分解するコストを限界まで下げたい、、ですよね？

別にGemmaやollamaでなくてもGitHub Copilotの [gh copilot](https://docs.github.com/en/copilot/using-github-copilot/using-github-copilot-in-the-command-line) などなんでも動くと思います。
`タスクを分解する`という用途に関しても英語の校正とか翻訳とかでも使えると思います。

## 作るもの

例えば、`Qiitaの記事を書く`というテキストを選択中に `Command + Shift + T` を押したら以下のようにテキストを入れ替えます。(実際に出したもの)

```
* Qiitaの記事を書く
  * 記事のテーマを決定する
  * 記事の構成を検討する
  * 記事のタイトルを決定する
  * 記事の本文を作成する
  * 適切なタグを選択する
  * 記事をQiitaに投稿する
  * 記事を公開する
  * 記事の内容を確認する
  * 必要に応じて修正する
  * 記事を宣伝する
```


ここを参考にOllamaでGemmaをinstallします。
https://ai.google.dev/gemma/docs/integrations/ollama
-qatってついているモデルが[いい感じに最適化](https://developers.googleblog.com/en/gemma-3-quantized-aware-trained-state-of-the-art-ai-to-consumer-gpus/)されているらしくおすすめです。4bか12bあたりがいいと思います。数字が大きいほど性能が高いですが、スピードが遅いので、スピードと品質のトレードオフがあります。

```shell
ollama pull gemma3:12b-it-qat
ollama list
```

## 方法

### 1. Automatorでタスク分解Quick Actionを作る
Autormatorを開く

Quick Actionを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/6687e98a-19c9-4d31-8a4d-42492c32af2e.png)

次にUtilitiesから `Run Shell Script` をダブルクリックして追加し、シェルスクリプトを入れるだけです。
以下の設定をします。
* シェルスクリプトを入れる

> /usr/local/bin/ollama run gemma3:12b-it-qat "以下のタスクを分解してください。インデントはそのまま維持してください。分解前のタスクの内容と分解したタスクのみを出力ください。\n例:\n<input>   * ある人に権限を追加する</input>\n<output>   * ある人に権限を追加する\n     * 追加する権限一覧を見る \n     * 権限を追加するためのページを開く\n     * 権限を追加する</output> \n---\n分解するタスク:\n$1"

* `Output replaces selected text` にチェックを入れる
* `Pass input:` を`as arguments`に

終わると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/992f9354-03e7-46ad-976e-418c6f9274bf.png)

それをCommand + Sなどで保存します。 `Divide the task`などで保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b2427ee9-cf54-42da-b116-38f2558c0825.png)


## 2. 追加したクイックアクションをMacの設定で登録する
Macの設定の `キーボード` の中に `Keyboard Shortcuts` があるのでそれを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/796b3c28-c4ca-40d8-aca4-56ecaa70401d.png)

`Divide the task` に好きなショートカットを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/176efa83-b5bc-4c22-81b7-1483f37c7b20.png)

### 3. 使う

入力できるテキストボックスなどで分解したいものを選択してCommand + Option + Tでタスクが分解されます。

## トラブルシューティング
Ollamaのログを見る方法(terminal)

```
tail -f ~/.ollama/logs/server.log
```
【M3 Mac】Rancher Desktop の Kubernetes が立ち上がらなくなった

# 起きた事象
ある日突然、`M3 Mac` で使用している `Rancher Desktop` で、 `Kubernetes` が起動しなくなった。
エラー画面に出ていた内容は以下。（スクショとっとけば良かった...）

:::note alert
Error: /Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl exited with code 1
:::

:::note alert
'WARNING: Skipping duplicate certificate in file ca-cert-rd-50.pem\n' +
    'WARNING: Skipping duplicate certificate in file ca-cert-rd-82.pem\n' +
    'WARNING: Skipping duplicate certificate in file ca-cert-rd-79.pem\n' +
    'WARNING: Skipping duplicate certificate in file ca-cert-rd-109.pem\n' +
    'WARNING: Skipping duplicate certificate in file ca-cert-rd-91.pem\n' +
    'run-parts: /etc/ca-certificates/update.d/certhash: exit status 133\n',
  code: 1,
  [Symbol(child-process.command)]: '/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl shell --workdir=. 0 sudo update-ca-certificates'
}
:::

# 解決法
`Rancher Desktop` のUIから `Troubleshooting` -> `factory reset` をして、 `Rancher Desktop` を再起動した

# 原因
正直分かっていないので、詳しい方がいたら教えてほしいです...。

# 教訓
`Factory reset` は最強（？）
MacでGit接続時のURL注意点 完結編

# はじめに
以前よりMacのSourceTreeを使ってSSHでのGitHub接続を行っているが、上手くいったと思ったら、また繋がらなくなることがあった。
（`Permission Denied`が出てしまう）
結局のところgitコマンドにて設定してしまうのが１番手っ取り早いことに落ち着いた。

## gitの接続先確認
gitリポジトリがあるディレクトリで以下のコマンドを実行
``` bash
git remote -v
```
以下のようにsshのURLになっていると接続できない。
``` 接続できないパターン
origin  ssh://git@github.com/fizz-org/buzz.git (fetch)
origin  ssh://git@github.com/fizz-org/buzz.git (push)
```

## 接続先変更
`.ssh/config`に記載の内容をもとに設定を行う。

### configの記載例
```
Host github.com.hoge
	HostName github.com
	User git
	PreferredAuthentications publickey
	IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
	UseKeychain yes
```

### Git接続URL変更
`git remote`にてGitの接続URLを変更する
``` bash
git remote set-url origin git@github.com.hoge:fizz-org/buzz.git
git remote set-url --push origin git@github.com.hoge:fizz-org/buzz.git
```

接続URLが変更になっているはず
``` bash
git remote -v
origin  git@github.com.hoge:fizz-org/buzz.git (fetch)
origin  git@github.com.hoge:fizz-org/buzz.git (push)
```

念の為sshの接続確認を実施
```bash
ssh -T git@github.com.hoge
```
`Hi user! You've successfully authenticated, but GitHub does not provide shell access.`
が表示されればOK！

これでSourceTreeからのアクセスも大丈夫！


:::note
ポイント
- `config`に記載のHost(`github.com.hoge`)が、`git remote`コマンドの`origin`の後のホスト名になる
- `git remote`コマンドの`fizz-org`はGitHubの`organization`
- ホスト名とorganizationの間は`:`(コロン)で区切る
:::
Docker Desktop を使わずに Windows に Docker 環境を構築してみた

## はじめに
私の所属しているチームでは、ローカル開発にXAMPPを利用し、デモ環境や本番環境へのデプロイ時に Docker 対応に切り替えるという流れでプロジェクトを進めていました。

一方で、私自身は個人学習において Docker Desktop を使用していたため、
「最初から Docker Desktop を使えば、デプロイ時の変更も少なくなり、環境構築の手間も減るのでは？」
と考えるようになり、改めて調べたところ、以下の事実が判明しました。

### Docker Desktop のライセンスに関する注意
[Docker デスクトップライセンス契約（公式）](https://www.docker.com/legal/docker-subscription-service-agreement/)より：

> - Docker Desktop は、中小企業（従業員数250人未満、かつ年間収益1,000万ドル未満）、個人利用、教育目的、非営利の OSS 開発であれば無料で利用可能
> - それ以外の 業務用途では有料ライセンスが必要

つまり、個人の学習や趣味の開発用途であれば無料ですが、業務利用かつ企業規模が条件を超える場合には有料となります。

「無料で同様の環境が作れないか？」と調べた結果、
「WSL2 + Docker Engine」を使えば、Docker Desktop を使わずに、Windows上でDocker環境を構築できることがわかりました。
そこで実際にこの構成を試してみることにしました。

## 概要
本記事では、Docker Desktop を使わずに Windows 上で Docker を動作させる方法として、WSL2 + Docker Engine を用いた環境構築手順を紹介します。

## WSL2の構成イメージ
今回構築する環境は以下のようになります。
```
[Windows ホスト]
    └── [WSL2（Linux カーネルを含むサブシステム機能）]
			    ├── docker-desktop   ← Docker Desktop を入れると自動作成される
			    └── Ubuntu           ← 今回インストールするディストリビューション
			          └── Docker Engine
```

## WSL2のセットアップ
### 1. WSLのインストール状況を確認

管理者権限でPowerShellを起動し、以下のコマンドを実行   
```powershell
wsl -l -v
```    
出力例(Docker Desktopが入っている場合):
```powershell
   NAME              STATE           VERSION
 * docker-desktop    Stopped         2
```

### 2. WSLをインストールする(未インストールの場合)

```powershell
wsl --install
```

- 初回起動後にユーザー名・パスワードの設定が求められます

### 3. WSLのバージョンを確認

```powershell
wsl --version
```

出力例:
    
```bash
WSL バージョン: 2.3.24.0
カーネル バージョン: 5.15.153.1-2
```
    
- WSL1だった場合はWSL2に設定:
        
    ```powershell
    wsl --set-default-version 2
    ```
        

### 4. ディストリビューションのインストール

今回はUbuntuをインストールする
    
```powershell
wsl --install -d Ubuntu
```
    
- ユーザ名とパスワードを設定する
        
```powershell
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: username
New password:
Retype new password:
```
    
- 初回起動が完了すると、次のように Ubuntu が起動します：
    
```powershell
This message is shown once a day. To disable it please create the
/home/username/.hushlogin file.
username@DESKTOP-RHDALST:~$
```
    


## Dockerのインストール

### 1. Dockerとdocker composeのインストール

```bash
sudo apt update
curl -fsSL https://get.docker.com | sh
```

- Docker本体と Docker Compose（v2系 Plugin）を一括インストールします


### 2. 正常にインストールされたか確認

```bash
docker -v
docker compose version
```

## systemdを有効化

### 1. 設定ファイルを開く
```bash
sudo vim /etc/wsl.conf
```

### 2. 以下を編集
```
[boot]
systemd=true
```
    
### 3. WSLを再起動
WSLセッションを終了  
```bash
exit
```     

PowerShellからWSLを再起動     
```powershell
wsl --shutdown
wsl -d Ubuntu
```       

### 4. Dockerサービスの起動&自動起動設定

```bash
sudo systemctl start docker
sudo systemctl enable docker
```

### 5. 自分自身を`docker`グループに追加する

```bash
sudo usermod -aG docker $USER
```

反映させて再確認
    
```bash
newgrp docker
groups $USER
```
    
出力例：
        
```bash
username : username adm dialout cdrom floppy sudo audio dip video plugdev users netdev docker
```

## 起動・停止方法

### ディストリビューションの起動

```powershell
wsl -d Ubuntu
```

### ディストリビューションの停止

```powershell
wsl -t Ubuntu
```
※ Ubuntu の部分は、インストールしているディストリビューション名に置き換えてください。
AWS SDK利用のFargateコンテナからSESに接続できない → NAT Gatewayで解決した話

## はじめに
AWSのFargateで動かしているコンテナ内で、AWS SDKを利用してAmazon SES経由でEメールを送信する仕組みを構築しました。
　
公式ドキュメントを参考にVPCエンドポイントを設定したにもかかわらず、SES経由のメール送信ができない問題に遭遇したので、その原因と解決策について書き留めておきます。

## 結論
Fargate上のコンテナからAWS SDKを使ったSES経由のメール送信を行う場合、SMTP対応のVPCエンドポイントではなく、NAT Gatewayを用いた通信経路が必要でした。

#### 通信ができなかった構成構成
![how-to-send-email-by-ses-2.jpg](https://res.cloudinary.com/dcigcmciv/image/upload/v1747470656/how-to-send-email-by-ses-2_nbgur8.jpg)

#### 通信ができた構成
![how-to-send-email-by-ses-1.jpg](https://res.cloudinary.com/dcigcmciv/image/upload/v1747470654/how-to-send-email-by-ses-1_wxmxmm.jpg)


 
## 構成概要
　
	•	ECS(Fargate)でコンテナを稼働
	•	コンテナはプライベートサブネット内に配置
	•	AWS SDKを使用してAmazon SES経由でEメールを送信

## 起きた問題

ドキュメントを参考に設定したVPCエンドポイントがうまく機能しませんでした。具体的には、SESのSMTPエンドポイントに対しての接続はVPCエンドポイント経由で提供されていますが、AWS SDK（API経由の送信）はSMTPではなくSESのHTTPSエンドポイントを利用するため、設定したVPCエンドポイントでは対応で着なかったようです。


## 問題の原因詳細

AWS SESには次の2つの送信方法があります。
	•	SMTPインターフェース（メールクライアントなど）
	•	HTTPSインターフェース（AWS SDK、AWS CLI経由）

VPCエンドポイント（interface型）はSMTP通信にのみ対応しており、AWS SDKが使用するHTTPS通信には対応していないため、プライベートサブネット内のコンテナからはSES APIへアクセスができませんでした。

## 解決方法

VPCエンドポイント経由での通信を諦め、代わりに**NAT Gatewayを経由して外部インターネットへの通信を許可する**ことで、この問題を解決しました。

具体的な解決手順は以下の通りです。
	1.	NAT Gatewayをパブリックサブネットに設置
	2.	プライベートサブネットのルートテーブルを編集し、インターネット向け通信をNAT Gatewayにルーティング
	3.	AWS SDKからSESへの通信が可能になり、正常にメール送信が行えるようになった

## まとめ

Fargate上のコンテナからAWS SDKを使ったSES経由のメール送信を行う場合、SMTP対応のVPCエンドポイントではなく、NAT Gatewayを用いた通信経路が必要でした。

同じような問題で困っている方の助けになれば幸いです。
複素数平面における円束についての大学入試数学

# はじめに
ある２点を通る円の方程式を求めるのは難しい。分かりやすい解法としては、円の方程式に2点の座標を代入して連立させる方法である。しかし、もっと良い方法がある。それを今回は紹介すると同時に、複素数平面上で以下のような円束を描写することを目的とする。


![円束_複素数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/19f2cb3e-a8b1-43fa-af9f-45d395694576.png)


ただし、上記の円束の題材は以下の京大の数学入試問題である。

https://qiita.com/arairuca/items/1b35a5cb77976d1bdaa5

したがって、今回の記事の内容が理解できれば、題材となる証明問題もスムーズに解くことができる。

# 2点を通る方程式
円や直線に限らず、2つの陰関数で表現できる図形$f(x,y)=0,g(x,y)=0$が存在するとき、以下のことが成立するとする。

```math
f(x_1,y_1)=g(x_1,y_1)=0
```
つまり2つの曲線は定点$(x_1,y_1)$を通るとすると、

実数$k$を用いて、以下の事が成立する。

```math
f(x_1,y_1)+kg(x_1,y_1)=0
```

つまり、陰関数

```math
f(x,y)+kg(x,y)=0
```

は、2つの曲線の交点を通る曲線となる。

# プログラム

そこで、$\gamma=x+jy$とした複素数平面上において以下の2つの曲線の交点を通る曲線を考える。

```math
|\gamma|^2-1=0,\frac{\gamma-\bar{\gamma}}{2j}=0
```

とすると、2つの陰関数の交点をとおる陰関数は以下のように表すことができる。

```math
(|\gamma|^2-1)+k \frac{\gamma-\bar{\gamma}}{2j}=0
```

したがって、


```math
k=-\frac{2j(|\gamma|^2-1)}{\gamma-\bar{\gamma}}
```
## コード

さて、上記の考えをもとにして、以下のようなPythonのプログラムを考える。

```python. circle_com.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

n=200
L=3.0
x = np.linspace(-L, L, n)
y = np.linspace(-L, L, n)
X, Y = np.meshgrid(x, y)
Z = np.zeros((n, n))



for i in range(n):
  for p in range(n):
    gamma=X[i][p]+1j*Y[i][p]
    Z[i][p]=np.log((abs(-2j*(abs(gamma)**2-1)/(gamma-gamma.conjugate()))))

plt.contourf(X, Y, Z, cmap='jet')
plt.colorbar()
plt.savefig("円束_複素数.png")
plt.show()
```

![円束_複素数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/19f2cb3e-a8b1-43fa-af9f-45d395694576.png)

このように、上手く円束を描写することができているということが分かる。


# まとめ
今回は、複素数平面上における円束の描写をPythonを用いて表現してみた。具体的には、実数$k$を用いることで2つの曲線（円と直線）に共通な点を通る円の描写を行うことができた。
非エンジニアがJetson AI Specialistをとるまでのプロセス

Qiitaではいつも読むばかり、アウトプットが大事とはわかっていても「さて、自分がエンジニアばかりのサイトで何を発信できるのか？」と考えながらフォルダの中身を眺めてたら記憶の彼方になったものがちらほら。自分の復習と誰かの役に立つかもしれないものを今後書き留めてゆこうと思いますのでよろしくお願いします。
## Jetson AI Specialistとは
ご存じの通りJetsonとはNVIDIAのEdgeデバイスで、[2020年末にロボスタの記事でその存在を知って](https://robotstart.info/2020/11/27/nvidia-jetsonnano2gb-review2.html)、「Raspberry piみたいなボードでAI動くってこと？」ということですぐにJetson Xavier NXを入手し、早速NVIDIAの[DLIのコースを受講](https://learn.nvidia.com/courses/course-detail?course_id=course-v1:DLI+S-RX-02+V2)しました。コースに必要な機材、内容については[上記のロボスタの記事](https://robotstart.info/2020/11/27/nvidia-jetsonnano2gb-review2.html)や[他のQiitaの記事](https://qiita.com/nix0/items/29b26a1960e4ee2e0ff8 "NVIDIAのAI認定プログラム「Jetson AI Specialist」を取得しました")が詳しいので、そちらをご参照ください。
## え？自分自身のプロジェクト？
### プロジェクトが決まらない…
一通りJetsonを使ったAIについて学び、Dustin Franklin氏の[Hello AI World](https://github.com/dusty-nv/jetson-inference)のサンプルをいろいろ実際に動かすなどして、できそうなことがだんだんわかってきて、いよいよ最後のステップを残すのみ！

「自分自身のプロジェクトを提出」

この[Jetson Community Projects](https://developer.nvidia.com/embedded/community/jetson-projects)を参考にしようと思いましたが、ハード的にも、ソフト的にも技術的レベルが高いものばかり。

「こんなの自分にゃ無理だ…」

この状態から抜けるのにしばらく時間を要してしまいました。
### これ自動化したら ~~サボれ~~ 業務の効率化ができそうだ！
職業柄、試験監督をすることが時々あって ~~「メンドクセー、ズルしたってどうせ後で困るの本人だから…」とよそ見しながら~~ 監督していたある日の昼下がり、

「サンプルにあったPose Estimationを使って不審な動きを検出ができないか？目の動きだけに注目すれば、Edgeでも簡単に処理できるに違いない！」

と思いつき試験終了後に早速、とりかかりました。
両目と鼻とで作られる三角形の形から、視線を判別することができそうとのことで、両目と鼻の座標だけを取り出して計算する簡単なコードを書きました。
実際に試した際の動画を撮影し、YouTubeにUpload。
DockerでImageを作成し、GitHubにUpload。
GitHubのRepositoryにプロジェクトの解説文と動かすための手順を記入。
完成したプロジェクトは[こちら](https://github.com/ryusukemomota/cheating_detector "cheating_detector")。

## 申請から認定されるまで
プロジェクトの動画とGitHub repositoryが正しいことを確認し、フォームに従って入力、就寝前に送りました。
数日かかるといわれていましたが、翌朝起きたらDustinさんからのメールでCertificateが送られてきました！（パチパチ）
![Screenshot 2025-05-17 170752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175761/217150f8-b710-4c9d-ab2b-8fa92de4c51e.png)


## まとめ
### 基本的で実践的な手順を学ぶことができる
AIで何ができるのかを学ぶことができたのはもちろん、Linuxのコマンド, Pythonのプログラミングも学ぶことができました。さらに、申請にあたっては、再現性が重視され、ProjectをLocalで動かし、ちゃんと別のJetsonでも動くように手順をまとめる必要があり、Dockerにあまり慣れてないのでちょっと苦労しました。またGitHubのReadme.mdに、わかりやすく英語で説明文をまとめる必要があり、Jetson communityのProjectのReadmeなどが参考になりました。
### プロジェクトの創出が一番大変だった
どんな小さなことでも構わないのですが、日常生活、社会的、科学的な問題に対してJetsonで解決したい！という姿勢を示すのが評価対象になっているので、問題意識を持つことが大事だと思うが、難しいプロジェクトのショーケース見て、深く考え込むと逆に滞ってしまったような気がする。
**これから挑戦する方々へ：
自動化して楽したいこと、困っていること、解決したいことは何か？を第一に考えてください。**
### 最後までやり切ること
私みたいに個人で取り組む以外にも、大学のチームで取り組んでいる例（[会津大](https://blogs.nvidia.co.jp/blog/jetson-grant-certif-casestudies-aizu-u/)、[慶応大](https://blogs.nvidia.co.jp/blog/jetson-casestudies-keio-u-2/)、[岐阜大](https://www.gifu-u.ac.jp/news/news/2024/11/entry20-13974.html)）もあるようなので、仲間とアイディア出しながら一緒にプロジェクト進めるのがいいかもしれません。チームで行うProblem Based Learningの教材としては最適なものだと取得から3年経った現在でも感じます。
[備忘録] kubectl でcp コマンド使ってみる

今日はコマンドの備忘録記事になります。kubernetes 使いたくなって、勉強し始めました。ただ、コマンドが全然わからないなーーってなったので、command の使い方の備忘録になります。

それで、今回はkubectl コマンドでホストから、pod の中にファイルが転送できるらしいので、それをやってみました。

## 適当にyaml 作るよ

nginx のpod を作成するmanifest ファイルです。
```
apiVersion: v1
kind: Pod
metadata:
  name: test
  namespace: default
  labels:
    env: test
spec:
  containers:
    - name: test
      image: nginx:latest
```

```
kubectl apply -f test.yml

pod/test created
```
test created ならオッケーです。

```
kubectl get pod -o wide

NAME          READY   STATUS      RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
test          1/1     Running     0          73s    10.244.0.7   minikube   <none>           <none>
```
これで立ち上がりましたね。

## ファイルを転送してみる

わかりやすいように、/var/tmp 配下にファイルを送ってみます。
```
touch test.txt

kubectl cp ./test.txt test:/var/tmp/test.txt

 kubectl exec -it test -- ls -la /var/tmp
total 12
drwxrwxrwt 1 root root 4096 May 17 08:12 .
drwxr-xr-x 1 root root 4096 Apr 28 00:00 ..
-rw-r--r-- 1 1000 1000    0 May 17 08:12 test.txt
```

ちゃんとありますね！！！

じゃあ、つぎはホスト側にファイルを転送します！

```
# ファイル作成
kubectl exec -it test -- touch /host.txt

# 存在確認
kubectl exec -it test -- ls -la /host.txt
-rw-r--r-- 1 root root 0 May 17 08:16 /host.txt

# host 側に移動
kubectl cp test:/host.txt ./host.txt
tar: Removing leading `/' from member names
```

host側にファイルが出てきたら、転送成功です！！簡単で、めっちゃ便利なので、なんか転送するの忘れたとかコマンドベースで運用できるのいいですね！！
Seleniumで指定したタブのみ閉じる

# 事案
本題の通りの実装をしたくて
ネット調べたら、コードを書いてくれてたHPもあったが上手くいかなかったので、備忘録


# 解決
```python
pip install selenium
```

```python
from selenium import webdriver

driver = webdriver.Chrome()
# 一つ目のタブ
driver.get(url _1)

# 二つ目のタブ
driver.switch_to.new_window()
driver.get(url_2)

# 二つ目のタブのウィンドウハンドル取得
current_window = driver.current_window_handle

# driverのウィンドウハンドル取得
window_handles = driver.window_handles

# driverのウィンドウハンドルの中から二つ目のタブのウィンドウハンドルに一致するものを閉じる
for window in window_handles:
    if window == current_window:
        driver.close()
        
# 一つ目のタブのタブに切り替え 
driver.switch_to.window(window_handles[0])
```
MacのZedでrust-analyzerがintelのときの差し替え方

zed.appがうっかりIntelになっているときはappleに差し替えるだけでよいのですが、
rust-analyzerまでintelになっていることがあります。

アクティビティモニタのCPU欄も見てみるとわかりやすいです。

zed組み込みのrust-analyzerは以下にキャッシュ？されています
`/Users/username/Library/Application Support/Zed/languages/rust-analyzer`

上記に対して`file rust-analyzerの場所`でintelかどうか確認しましょう
` Mach-O 64-bit executable x86_64`あたりはIntelでありNGです。

intelのようなら消してしまえば改めて作成されます。
(rustupやzedなどがappleになってる前提で)

もう一度実行して` Mach-O 64-bit executable arm64`になればOK
アクティビティモニタのCPU欄を再度確認しましょう

# 同じような事象
https://qiita.com/yoshi-taka/items/0d378122fb411bf202f0
React 環境構築

## 背景
転職先の会社ではReactで開発していると聞いており、暇な有休消化期間を使ってやってみました。環境構築をするにあたり注意点がわかったので、忘れてもまた思い出せるよう、記事にします。

## 教科書にした動画
【2025年最新】世界一簡単なReact講座！JavaScript初心者・中級者は必見
https://youtu.be/TgU-FT2WdS4?si=k8XRf0EevHFCofaR

## 前提条件
* VSCode、Node.jsは既にインストール済み

## ビルドツール Vite でプロジェクト生成

まずVSCodeのターミナルで、ファイルを格納する階層まで cd コマンドで移動しておく。画像の赤枠内のコードをターミナルにコピーペーストして、Enterキーで実行する。

https://ja.vite.dev/guide/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/9fa5ec1c-6ef4-4927-b21d-bd3470d6663f.png)


## 発生したエラーと解決方法
### エラー
コマンド npm install で node_modules のディレクトリが入らない。

```
npm install
```

### 原因と解決策
ターミナルに cd my-vue-app と表示されているのに、無視して npm install を実行していました。エラー発生時にスクリーンショットを残すのを見逃しているので、添付画像では正常にインストールできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/4c3f8e17-247e-4faa-b188-a8fd57073f7b.png)


cd ディレクトリ のコマンドで階層を移動してから、再度 npm install を実行すると、node_modules まで入りました。

## npm run dev でサーバー起動

```
npm run dev
```
URLが発行され、Ctrl + Click で Vite のデフォルトページが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/4ad7bb6d-f2ba-4f55-8ee9-729a7344c4c2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/f2e95574-0171-4375-a495-789c06998010.png)
AWSの設定が完了したのにオンプレから接続できなかった原因と対処

## はじめに

実務で、AWSの設定は完了したはずなのに、オンプレミスからアクセスできない状況が発生しました。  
**結論は、オンプレミス側の設定の見落としが主な原因**でした。

---

## 発生した問題

- EC2やRDSへのPing・SSH・RDPが通らない  
- プライベートDNS名の名前解決が失敗する  
- AWS側（セキュリティグループ、NACL、ルートテーブルなど）は問題なし  
- オンプレ端末にAWSのIPを直接設定しても通信できない

---

## チェックすべき2つの設定

### 1. オンプレミスルーターにAWS CIDRへのルートがあるか

オンプレミスからAWSのVPCに到達するには、  
**接続に使用するルーターがAWSのCIDRを正しく認識している必要があります**。

#### ✅ チェックポイント

- 静的ルートでVPC CIDRがルーターに明示的に登録されているか  

---

### 2. オンプレミスDNSサーバに条件付きフォワーディングがあるか

オンプレミスからAWS内のDNS名（例: `example.internal`）を解決するには、  
**Route 53 Resolverのインバウンドエンドポイント**と  
**DNSサーバの条件付きフォワーディング**の設定が必要です。
尚、前提として「オンプレのDNSサーバ」からroute53へ名前解決する想定です。

#### ✅ 設定手順

1. **Route 53 Resolver インバウンドエンドポイントを作成**  
   - VPCに配置  
   - 割り当てられるIPアドレス（通常2つ）をメモ

2. **オンプレミスDNSサーバに条件付きフォワーディングを設定**  
   - 対象ドメイン: `example.internal` など  
   - 転送先IP: 上記でメモしたインバウンドエンドポイントのIPアドレス

#### 💡 例（Windows Server DNSの場合）

1. DNSマネージャーを開く  
2. 「条件付きフォワーダー」→「新しい条件付きフォワーダー」を追加  
3. 対象ドメインを入力  
4. IPアドレスにインバウンドエンドポイントを指定  

※ **「解決できません」と表示されることがありますが、問題ありません。**  
　これはRoute 53側が逆引き応答を返さない仕様のためで、  
　**実際のDNS解決は正常に動作するはずです。**

また、オンプレDNSサーバからインバウンドエンドポイントへのIPがルーティング許可されているかも合わせて確認してください。

---

## 感想
オンプレの設定が「どこまで」出来ているかを確認することが大事だと実感
【AI投資システム構築】9. 売買の判断基準（さまざまなリスク対策）

これまでの投稿で、為替レートを予測する学習モデルを構築しましたが、
学習モデルの予測だけでは急な変動には対応できず利益は出せません。
様々なリスク対策を施しているため、紹介いたします。
（今回は文章メインです）

# ■ 注文時（OrderSend）

学習モデルを用いて数時間後の為替レートを予想し、任意のしきい値以上の上昇・下降が見込める場合、新規注文候補とします。
この後、下記のリスク対策を施しています。

## 1. ファンダメンタル分析と同じ判定結果であること

本業が別にあるため、頻繁に確認することはできませんが、
朝と夕方、1日に2回は市場動向を確認し、方向性を確認するようにしています。

ファンダメンタル分析結果と学習モデルの予測結果が同じ場合のみ、新規注文を行います。

ただし、個人が行うファンダメンタル分析では、ニュース等による事後反応となるため、急な市場の動向には反応が遅くなります。

そのため、経済指標カレンダーを確認し、
重要度が高い発表がある２日前から、ポジションを保持しないようにしています。

https://www.sbifxt.co.jp/market/economic_calendar.html

## 2. スプレッドがしきい値以下であること

主に市場の流動性が低下する時や経済指標の発表前は、
スプレッドが大きくなることがあります。
スプレッドが大きすぎると利確するのが難しくなるため、スプレッドがしきい値以下の時だけ、新規注文を行います。

## 3. 同一通貨ペアのオーダー数に上限設定

同じ通貨を含んでいる通貨ペアの場合、同じ予測となることが多いです。例えばUSDJPYとEURJPYが同じ上昇予測となるとかです。
そのため、保持している注文が、同じような通貨ペアばかりになることがあります。
リスクは分散させるべきなので、
同一通貨ペアのオーダー数上限を2つ,3つにするなど制限をかけて、小ロットで注文するようにしています。
こうすることによって、多種多様な通貨ペアをBUY・SELLが入り乱れた状態で保持することになり、一見、含み損益があるのかないのか、分からない状態になりますが、最終的には少しずつ利益が上昇しているような売買を行っています。

## 4. TP/SL値はATR値の3倍で設定

こちら、ChatGPT先生のアドバイスにより導入しました。私が生成した為替レート予測AIは、数時間後の為替レートを予測します。
つまり、数時間以内の最大値や最小値はわかりません。十分広い値でTP/SL値を設定する必要があります。
特にSL値は狭いと「後ちょっと待てば上がったのに、損切りしちゃった！」ということが頻発します。

ChatGPT先生に相談したところ、
私の売買方式では、下記設定がいい感じに収まりました。
  * TP:SL = 1.1:1.0
  * SL値はATR値の3倍

これによって、例え値動きが激しい時の注文でも、すぐに損切りするような事象は防げるようになりました。

## 5. 変動型ロット数（損失リスクが高い時はロット数減）

為替レートの予測は数時間間隔で自動で行っていますが、市場が落ち着いている時は、同じ予測が連続することがあります。
全ての同種の注文が利益を出したら最高ですが、そう上手くはいかず、損失が連続することもあります。
そのため、同じ種類の注文を連続して行う場合、既に保持している注文の含み損益を算出し、利益が出ていればそのまま注文、損失が出ていれば、ロット数を減らして注文するなど、対策を行っています。

## 6. 証拠金維持率150％以上のときだけ新規注文

FX業者が行う「強制ロスカット」
私の大っ嫌いな言葉です。
トレード初心者のとき、この強制ロスカットによって、何度涙を流したことか。
「ちょっと待ってよ！あと数時間したら、反転する予想だから！」ってタイミングで、証拠金維持率100％を下回り、強制ロスカットされたことが、何度あったか…。
いまは証拠金維持率150％以下の時は新規注文を行わない自分ルールを設けています。

# ■ 決済時（OrderClose）

## 1. ファンダメンタル分析が変わったら決済

少しでも変わったら決済します。
経済発表前は強制決済します。
なんど裏切られたことか...。
ビビりでOKです。

## 2. システム障害時は強制決済

たま～に、市場データが取得できない時や、注文が失敗する時があります。
システムとして、何度かリトライを行い、
それでも失敗するときは、市場に何らかの異常が発生していると判断し、保持していポジションは全て決済するようにしています。

また、個人PCを連続稼働しているため、
PC環境に何らかのトラブルが発生するときもあります。
（義理父がネットワークケーブルが邪魔だから引っこ抜くとか...普通ないか😅）
そのときは、個人スマホにもMT4/MT5アプリを入れているので、手動で迷いなく決済するようにしています。

# ■ 共通

## 1. 複数通貨ペアでトレード

過去の記事でも何度か記載していますが、リスク分散のために、複数の通貨ペアでトレードを行っています。
私は最大14つの為替レートを予測しトレードを行っています。

## 2. 複数のFX会社でトレード

実は為替レートと言っても、FX会社によって微妙に違います。スプレッドスワップポイント、システムの更新頻度などが会社によって異なるからです。
私はMT4とMT5で、複数のFX会社で、予想の時間感覚をあえてずらし、トレードを行っています。
これぞリスク分散です。

# まとめ

以上で最初に予定していたAI投資システムに関する投稿（備忘録）は以上になります。

https://qiita.com/marcy_st_tech/items/47f34bbdcd18586edfd6

読んで頂きありがとうございました。
もし全体を通してご質問がございましたらお気軽にコメントください。

私はAIの学習も、予測もトレードも、ほぼ全て自動化していますが、
ファンダメンタル分析だけは人が行っています。

ファンダメンタル分析の自動化の手法に目処が立ったら、
また投資関連の投稿をするかもしれませんが、
最近はどちらかというと、
VRやドローンアプリをつくって技術検証しているのが私のトレンドです。

整理ができたら投稿しようと思います。
Python で入れ子のリストを平坦化

# やりたいこと
以下のような変換を行う。
```python:変換前
[
    [[1, 2], [3, 4], [5, 6]],
    [[7, 8], [9, 10]],
    [[11, 12]],
]
```

```python:変換後
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]
```


# リスト内包表記
```python:
flattened_list = [item for sublist in nested_list for item in sublist]
```


# itertools.chain.from_iterable() を利用
```python:
from itertools import chain
flattened_list = list(chain.from_iterable(nested_list))
```


# sum() でリストを連結（リストの加算）
```python:
flattened_list = sum(nested_list, [])
```
リストの加算で ['a', 'b'] + ['c'] が ['a', 'b', 'c'] になることをイメージするとわかりやすい。


# ループして extend() で連結
```
flattend_list = []
for sublist in nested_list:
    flattend_list.extend(sublist)
Building Real-Time Voice AI Agents Using LLMs, ASR, and TTS with Sub-500ms Latency

## 🧠 Core Components

Our system is built around 5 key modules:

1. **ASR (Automatic Speech Recognition)**  
   - We use Whisper or Deepgram to convert speech to text with high accuracy and stream support.

2. **NLP + LLM Integration**  
   - GPT-4 or similar models (via OpenAI or local inference) handle intent recognition, reasoning, and response generation.

3. **TTS (Text-to-Speech)**  
   - Voice synthesis using services like ElevenLabs or in-house TTS for human-like tone and intonation.

4. **Telephony Bridge**  
   - Integration with Twilio/Plivo or SIP to connect real phone calls with our AI agents.

5. **Real-time Streaming Engine**  
   - Built using WebSocket + event queues to manage <500ms round-trip latency.

---

## ⚙️ Architecture Diagram
https://vocallabs.ai/
【React】urqlの「urql-custom-scalars-exchange」でscalar単位で値変換する

## 実現したいこと
GraphQLのスキーマでバックエンド`gqlgen`を使用していて、レスポンスの項目として[Time](https://gqlgen.com/reference/scalars/#time)の
scalarを使用します。その際にフロントエンド側ではDateとして扱いたいので、codegenのgenerates設定で以下のように設定します。
```typescript
generates: {
    "./src/graphql/gen/graphql.tsx": {
      plugins: ["typescript", "typescript-operations", "typescript-urql"],
      config: {
        scalars: {
          Time: "Date",
        },
      },
    },
  }
```

ただ、このままだとDateにparseされず文字列の状態で入ってきてしまうので、このDateのparseをどこかに実装したいというのがやりたいことです。

## 対応方法
まず挙げられるのは[urqlでデータ変換(transform)してみた](https://zenn.dev/silverbirder/articles/a281596599f56b)で紹介されている通り、transformExchangeを使用する方法です。ただ、自前で実装するのではなく何か良さげなライブラリあるかなと思って探してみたところ、urqlのドキュメント[Showcase](https://nearform.com/open-source/urql/docs/showcase/)を見てみたら、`urql-custom-scalars-exchange`というのがあったので今回はこれを試してみました。

## urql-custom-scalars-exchangeの留意点
ドキュメントからリンクを辿ると、このライブラリは直近（2025年5月時点）更新されておらず[Projectstatus](https://github.com/clentfort/urql-custom-scalars-exchange/issues/28)のissueで言及されている通り、今後メンテナンスされない見込みとのことです。
ただ、このライブラリをフォークした[atmina/urql-custom-scalars-exchange](https://github.com/atmina/urql-custom-scalars-exchange)があり、使えそうな雰囲気だったのでとりあえず今回はこれを使用してみます。

## 前提
* 使用したurqlのバージョンは`4.2.2`です。
* 使用したatmina/urql-custom-scalars-exchangeのバージョンは`1.1.1`です。

## 実装サンプル
urqlのクライアントを作成する実装は以下の通りとなります。

```typescript

import {
  cacheExchange,
  createClient,
  fetchExchange,
} from "urql";
import customScalarsExchange from "@atmina/urql-custom-scalars-exchange";

import schema from "@/graphql/gen/introspection.json";

// urqlクライアント作成関数
const createUrqlClient = (token?: string) => {
  const scalarsExchange = customScalarsExchange({
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
    schema: schema as any, // なぜか型エラーになるのでanyにしておく・・
    scalars: {
      Time(value) {
        return new Date(value);
      },
    },
  });

  return createClient({
    url: `${process.env.NEXT_PUBLIC_API_URL}`,
    exchanges: [scalarsExchange, cacheExchange, fetchExchange],
    fetchOptions: () => ({
      headers: {
        Authorization: token ? `Bearer ${token}` : "",
      },
    }),
  });
};
```
GithubのエディターをVimに変更する

### Defoult Editorの設定
デフォルトだとPicoになっている。非常に使いづらいのでVimにする

```bash
git config --global core.editor vim
```


[参考URL]
https://qiita.com/Syunto07ka/items/f87c9a82dfacf1472ee5


### おわりに
Picoではよくわからないコマンドが多く、いつもテンパってしまいました。
Vimに変えられるのを知り感動です。
Cursorの「Connection failed」エラーを解決する小技

最近、[Cursor](https://cursor.sh) を使っていると、突然次のようなエラーメッセージが表示されることがあります：

> **“Connection failed. If the problem persists, please check your internet connection or VPN”**  
> （接続に失敗しました。問題が解決しない場合は、インターネット接続またはVPNをご確認ください）

ネット環境に特に問題がないのにこのエラーが出ることがあり、作業の流れが中断されてしまいます。

## 原因は？

CursorのAI機能の多くは、ストリーミングレスポンスを可能にする **HTTP/2** を使用しています。  
しかし、すべてのネットワークがHTTP/2に対応しているとは限りません。以下のような環境では、接続エラーが発生しやすくなります：

- 企業ネットワークや社内ネットワーク  
- VPNを利用している場合  
- Zscalerのようなプロキシを使っている場合

HTTP/2の通信が妨げられると、Cursorがコードのインデックス作成に失敗したり、AI機能が使えなくなったりします。

## 解決策：HTTP/2を無効にする

幸いなことに、Cursorには **HTTP/1.1 にフォールバックするオプション** が用意されています。  
HTTP/1.1はやや遅いですが、HTTP/2が使えない環境でも安定して動作します。

設定方法は以下のとおりです：

1. Cursorの設定を開く（ショートカット：`Cmd` または `Ctrl` + `,`）  
2. **VS Code Settings** を開く  
3. `http2` と検索  
4. **「Disable HTTP/2」** を有効にする（チェックを入れる）

これで、CursorがHTTP/1.1を使うようになり、接続エラーが出なくなるはずです。

> ✅ 設定後は、エラーが出にくくなり、快適に使えるようになります。

![VS Code Settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4083579/d2e173aa-c156-43ee-bc19-cf796601b12f.png)

![Disable HTTP/2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4083579/df52ec21-710f-4cdc-bc76-5a507775b1d4.png)

---

## 参考リンク

- [Cursor フォーラム：接続エラーに関するディスカッション](https://forum.cursor.com/t/connection-failed-if-the-problem-persists-please-check-your-internet-connection-or-vpn/64673)  
- [Cursor 公式ドキュメント：ネットワーク関連の問題（HTTP/2）](https://docs.cursor.com/troubleshooting/common-issues#networking-issues-http%2F2)
Webpack 設定ファイル（webpack.config.js）の各項目を丁寧に解説

以下は、基本的な構成の `webpack.config.js` ファイルです。CSSの読み込み、HTMLテンプレートの自動生成、開発サーバーの設定まで含んでおり、フロントエンド開発におけるモダンな開発環境を構築できます。

まず、ファイルの内容を提示し、その後に各セクションごとの解説を行います。

---

## webpack.config.js 全体

```js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './index.html',
    }),
  ],
  devServer: {
    static: './dist',
    open: true,
  },
  mode: 'development',
};
```

---

## 各セクションの解説

### ✅ `const path = require('path');`
Node.jsの標準モジュールで、ファイルパスの操作に使用します。

### ✅ `const HtmlWebpackPlugin = require('html-webpack-plugin');`
Webpack用のプラグイン。テンプレートとなるHTMLファイルにバンドル済みのJSファイル（例: `bundle.js`）を自動で挿入してくれます。

---

### ✅ `entry`
```js
entry: './src/index.js',
```
Webpackが依存関係の解決を始めるエントリーポイント。プロジェクトの主なJSファイルを指定します。

---

### ✅ `output`
```js
output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist'),
  clean: true,
},
```
- `filename`: 出力するバンドルファイル名。
- `path`: 出力先の絶対パス。
- `clean`: 出力前に `dist` フォルダをクリーン（削除）します。

---

### ✅ `module.rules`
```js
module: {
  rules: [
    {
      test: /\.css$/i,
      use: ['style-loader', 'css-loader'],
    },
  ],
},
```
- `test`: 対象となるファイル（ここでは `.css`）。
- `use`: 適用するローダーの配列（順序が重要）。
  - `css-loader`: CSSをJSで扱えるようにする。
  - `style-loader`: JS内のCSSを `<style>` タグとしてHTMLに挿入。

---

### ✅ `plugins`
```js
plugins: [
  new HtmlWebpackPlugin({
    template: './index.html',
  }),
],
```
- HTMLファイルを自動生成。
- `template` に指定したファイルをベースに、バンドルしたJSを挿入したHTMLを出力。

---

### ✅ `devServer`
```js
devServer: {
  static: './dist',
  open: true,
},
```
- `static`: サーバーが提供するファイルのルートディレクトリ。
- `open`: サーバー起動時にブラウザを自動で開く。

---

### ✅ `mode`
```js
mode: 'development',
```
- `'development'`: 開発モード（ソースマップあり・圧縮なし）。
- `'production'`: 本番モード（圧縮や最適化が有効）。

---

## ✅ まとめ

この設定ファイルは、次のような基本構成を持ったモダンな開発環境を提供します：

- `index.js` からJSをバンドル
- CSSの読み込みと挿入をサポート
- HTMLファイルを自動生成
- 開発サーバーの起動 (`npm start`)
- 本番ビルドにも対応 (`npm run build`)

シンプルかつ拡張性のある構成なので、これからWebpackを使ってフロントエンド開発を始めたい方におすすめです。
Next.js Typescript で作成するブログ作成手順[完全版]

# Next.js Typescript で作成するブログ作成手順[完全版]

手順書

1. ドメイン・DNS設定
1. 環境変数・APIキーの変
更



## ドメイン・DNS設定
- お名前.comで取得
## microCMSのアカウント取得
これらを取得して、 ```.env.local```ファイルに設定
- MICROCMS_API_KEY
- MICROCMS_API_URL
- MICROCMS_SERVICE_DOMAIN
## 環境変数・APIキーの変更
- microCMSで割り当てられたAPIキーを設定していく
- 
## Cloudflare 設定
- アカウントホーム -> 開発者プラットフォーム -> アプリケーションを追加 -> 既存のGitリポジトリをインポート
- ビルド構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4001301/db2a50ca-c663-4246-b77b-4be8d213555e.png)

ビルド コマンド:npm run build
ビルド出力:out
ルート ディレクトリ:
ビルド コメント:
- Cloudflare で Nextjs のビルドしたら、 xx.yy.zz is required. というエラーがでたら環境変数の設定が必要
    - NODE_VERSION : 22.12.0
- microCMSの環境変数も必要
    - MICROCMS_API_KEY
    - MICROCMS_API_URL

## お名前.comで取得したドメインをCloudflare に設定する
- Cloudflare Pagesのプロジェクト画面で「カスタムドメイン」タブを開き、「カスタムドメインを設定」ボタンをクリック
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4001301/7ac23d2f-387e-4bf5-8341-dc5c25b0d0e4.png)

- お名前.comで取得したドメインを入力
- お名前.com Naviにログイン
「ネームサーバーの設定」メニューを開く。

「他のネームサーバーを利用」タブを選択。

先ほどCloudflareで表示されたネームサーバー2つを入力し、保存します


## Google Analytics の設定
- 管理 -> プロパティの追加
- Google tag をNext.jsのコードに追加
```
"use client";

import Script from "next/script";

export default function GoogleAnalytics() {
  return (
    <>
      <Script
        src="https://www.googletagmanager.com/gtag/js?id=xxxx"
        strategy="afterInteractive"
      />
      <Script id="google-analytics" strategy="afterInteractive">
        {`
          window.dataLayer = window.dataLayer || [];
          function gtag(){dataLayer.push(arguments);}
          gtag('js', new Date());
          gtag('config', 'G-DSZNTPVFS3');
        `}
      </Script>
    </>
  );
}
```

## Google Search Console

## Google AdSense
【初手】サ〇ーウォーズの誕生日当てで分かるFastAPIとVSCodeなど_1.愉快な仲間たち編

# これは何の記事
サ〇ーウォーズの誕生日当て Web アプリを通して，
以下のことを学んでいく記事です

- `VSCode` で `FastAPI` を使った開発をする方法
- フロントからバックまでの開発方法をざっくり

最終的にこれを作れるようになります
![UI_first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/e02cb969-44eb-4d76-b679-9a554669a486.png)

生年月日を和暦で入力して三角ボタンを押すと，
その日が何曜日だったかを教えてくれます

![UI_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/138b121b-bbfc-4ce6-bd9c-2cf281db5cad.png)

## 今回の内容
このアプリを作るために必要な仲間たちや単語・知識を紹介します

分かりやすさ重視ですので，多少の語弊があるかも知れませんが，
語弊だと分かるようになった頃には強くなれてると思うので，
ここは一つよしとしてください

ではいきましょう^^

## VSCode
プログラミングのコードを書くためのアプリです（無料）

コードを書くアプリをエディターといいますが，
`VSCode` はエディター戦争を終結させたと言っても過言ではない，
超高性能エディターです

こちらを参考にインストールしましょう
拡張機能は一旦以下が入っていれば良いです
- Python (Microsoft 公式のもの）
- indent-rainbow

https://www.python.jp/python_vscode/windows/setup/install_vscode.html

## Python
アプリを作るために書く言語をプログラミング言語といいます
その中でも `Python` は比較的簡単なのに色々できる流行りの言語の一つです
（無料）

もう全部こいつでいいんじゃないかと思わせるレベルです
（実際そんなことはないですが...）

使っている PC の OS に合わせてインストールしてください
バージョンは最新版を入れちゃいましょう

https://www.python.jp/install/windows/install.html

https://www.python.jp/install/macos/index.html

## FastAPI
`API` を簡単に作れる `Python` のフレームワークです（無料）

### API
- A: アプリケーション
- P: プログラミング
- I: インタフェース
で，`API` です

別のところで動いているプログラムに処理をお願いする方法が `API` です
`URL` に値を付けて渡します
すると処理された結果が返ってきます

デリバリーでピザを注文して，
しばらくしたらピザが届くイメージで大丈夫です

![APIイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/cffe8b50-0dcc-4527-b039-fde6c94c1fae.png)


今回はこのように使います
![フロント_バックイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/b2ab481f-d151-444b-9563-ff22b6dfd992.png)

### フレームワーク
その通り作ると簡単に作れる枠組みです

カレーで考えると，市販のルーがフレームワークです
裏に書いてあるレシピに従ってルーを使うと簡単にカレーが作れますね
フレームワークを使わない場合は，
スパイスを炒めるところから自分でカレーを作ることになりますね

## フロントエンドとバックエンド
ユーザーが直接見て触れる側がフロントエンドで，
ユーザーが見えないところで処理をしている側がバックエンドです

もっと簡単にいうと画面側がフロントエンドで，
画面じゃない方がバックエンドです

![フロント_バックイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/b2ab481f-d151-444b-9563-ff22b6dfd992.png)

今回バックエンドにはFastAPIを使います
フロントエンドは素の `HTML, CSS, JavaScript` で作ります

## Git
バージョン管理ツールです

新しい機能を追加した新バージョンにしたり，
一旦過去のバージョンに戻るなどをするためのツールです

更に `Git` を使えば複数人で共同開発がしやすくなります

今回は簡単のため使ってないですが，
基本的には使った方が良いです
壊れてデータが飛んだり，
一旦前に戻りたい時などに凄く感謝することになります

https://qiita.com/soiSource/items/196e59f7a4e3d2a75e20

因みに，某 Facebook は `Git` 使ってないらしいです!?

https://graphite.dev/blog/why-facebook-doesnt-use-git
【SQLで簡単ビッグデータ分析】Amazon Athenaとは？

# 【SQLで簡単ビッグデータ分析】Amazon Athenaとは？

「大量のログをSQLでさくっと分析したい」  
「ETLやサーバー管理は面倒…」  
そんなあなたにおすすめなのが **Amazon Athena** です。

---

## 🔸 Amazon Athenaとは？

**Amazon Athena** は、AWSが提供する**サーバーレスのインタラクティブクエリサービス**です。  
S3に保存されたCSVやJSON、Parquetなどのデータを、**SQLを使って直接分析できます**。

- サーバー構築不要
- クエリ実行ごとの**従量課金**（$5/TBスキャン）
- **Presto（現Trino）ベース**の標準SQL対応

---

## 🔸 主なユースケース

| ユースケース              | 説明                                           |
|-------------------------|----------------------------------------------|
| ログ分析                 | ELBやCloudFrontなどのアクセスログを直接分析            |
| IoTデータの可視化          | センサーデータを定期的にS3へ保存し、SQLで集計            |
| BIツールとの連携           | QuickSightやTableauと連携してダッシュボード作成         |
| データレイクアーキテクチャ | Glueと組み合わせて、ETLレスな分析基盤を構築             |

---

## 🔸 実行例（クエリ）

```sql
SELECT user_id, COUNT(*) AS access_count
FROM logs
WHERE status = '200'
GROUP BY user_id
ORDER BY access_count DESC
LIMIT 10;
```
上記のようなクエリを、S3のデータに直接実行できます。
## 🔸 Athenaのメリット

- ✅ **サーバーレス**で簡単導入、すぐ使える  
- ✅ S3にあるデータを**そのままクエリ**  
- ✅ **コスト効率が高い**（スキャン量ベース課金）  
- ✅ SQLベースなので、**学習コストが低い**

---

## 🔸 使用時のベストプラクティス

- **ParquetやORCなど列指向フォーマット**で保存すると高速＆低コスト  
- **Glue Data Catalog**と連携すればスキーマ管理も可能  
- クエリ結果は**自動的にS3に保存**される（保存先は設定可）

---

## 🔸 まとめ

Athenaは、S3のデータをSQLで簡単に分析できる強力なサービスです。  
分析基盤の初期構築コストを大幅に削減できるため、**ログ解析やIoTデータ分析、データレイク設計**において非常に有効です。

まずは無料枠で試してみるのがおすすめです！

---

## 🔗 公式リンク

- [Amazon Athena – AWS公式](https://aws.amazon.com/jp/athena/)  
- [Athena クエリランナー（サンプル付き）](https://docs.aws.amazon.com/athena/latest/ug/querying.html)

---

📘 AWS関連のQiita投稿も今後していく予定です。ぜひフォロー＆いいねお待ちしています！
【ChatGPT】課題に対して、一問一答してユーザーの理解度を測るPromptです。


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

　今回は、課題に対して、一問一答してユーザーの理解度を測るPromptです。

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

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

　ゆうべ（2025/05/17 0:00）、
　　行なわれた
　　　OpenAIの開発者向けライブ。

　その内容は、
　　Codexのリサーチプレビュー版の
　　　紹介と使用方法でした。

　こちらは、ライブの様子です。
　　[A research preview of Codex in ChatGPT](https://www.youtube.com/live/hhdpnbfH6NU?si=NN8dqTjS-21EfEqT)

　　00:00　Codexの紹介
　　01:38　セットアップとタスクの開始
　　05:05　環境設定
　　07:20　Markdownファイルで
　　　　　　Codexを誘導
　　12:00　Codex誕生のストーリー
　　14:25　Codexタスクの検証と
　　　　　　レビュー
　　17:28　OpenAI社内でのCodex活用
　　20:48　ChatGPT経由での利用可能性
　　21:22　ロードマップと
　　　　　　Codex CLIのアップデート

　Codexとは、
　　自然言語を解析して
　　　対応するプログラムコードを
　　　　自動生成する生成AI技術です。

　o3をベースに
　　しているようです。

　詳しくは、こちらをどうぞ。
　　[Codexのご紹介](https://openai.com/index/introducing-codex/)
***
　では、【本題】です。

　今回は、
　　課題に対して、一問一答して
　　　ユーザーの理解度を
　　　　測るPromptです。

　おのれが勉強したことを
　　ChatGPTに出題してもらい、
　　　おのれの知識の穴を
　　　　確認しましょう。

　下記のPromptの
　　＊＊＊に課題を入れて、
　　　送信してください。

```Text:課題について一問一答Prompt
“＊＊＊”について、あなたが出題者となり、一問ずつ私に質問してください。

私が答えた後、正解・不正解の判定と簡単な解説を返してください。

これを5問繰り返してください。

最後に、総合的な成績と批評をお願いします。
```

　5問のところを
　　必要な回数にしても
　　　いいと思います。

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

　今回は、ここまで。