OmniAICreator/Qiita-1.07M huggingface dataset:
LightWeightIP(LwIP)を紐解く(UDP/TCP用の構造体)


下記の記事の続きになります。

https://qiita.com/tom_S/items/cdc91201db27eed6ebdb

前回の記事ではLightWieghtIPの概要と構造を示したので、
この記事では、LightWeightIPのデータ構造にフォーカスしてまとめています。

# LightWeightIPのデータ構造

LightWeightIPのデータ構造を下記に示します。

![データ構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/a4d80c15-5113-42cd-9a93-37a5c50b27e5.png)

UDPの通信を「udp_pcb」という構造体で、TCPの通信を「tcp_pcb」というデータの塊を使って制御・管理します。
加えて、「udp_pcb」と「tcp_pcb」が実際に通信を行う際には、Ethernet,WLAN,BLEのドライバに関するデータの塊「netif」を使って通信を行います。

IPアドレスやポート番号、データの送受信を行うバッファなどの情報は「udp_pcb」と「tcp_pcb」が持っており、物理層(Ethernet, WLAN, BLE等)のデバイスドライバに関する情報は「netif」が持っていると考えてください。

## udp_pcb(UDPの管理用データ)

udp_pcbの定義はリポジトリの[こちら](https://github.com/lwip-devs/lwip/blob/73fcf72792a926a4e0ac8b656b29bff70552d927/src/include/lwip/udp.h#L81)にあります。

構造体にはたくさんパラメータが定義されていますが、LwIPを使用するうえでは下記のようなイメージで考えればよいかと思います。主にUDPを通信を行うための送信元と受信先の情報(IPアドレスとポート)を保持することになります。

![udp_pcb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/96f69494-3015-4da4-9049-ecdd9398cf43.png)

また、上記の情報の通り、udp_pcbは送信元と受信先の組み合わせ一つにつき、一つ存在します。
よって、送信先が変わる場合や、別ポートでの通信時は別のudp_pcbを使用します。下記の図のようなイメージです。

![udp_pcb組み合わせ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/c1c38dec-33cd-4d48-8f0a-dc55b8d3e031.png)

上記において、local IPアドレスとlocalポートはudp_pcbを保持している側のIPアドレス、ポート番号を指しており、remote IPアドレスとremoteポートは通信先のIPアドレスとポート委番号を指しています。

# tcp_pcb(TCPの管理用データ)

tcp_pcbの定義はリポジトリの[こちら](https://github.com/lwip-devs/lwip/blob/73fcf72792a926a4e0ac8b656b29bff70552d927/src/include/lwip/tcp.h#L242)にあります。

こちらの構造体にもたくさんのパラメータが定義されていますが、LwIPを使用するうえでは下記のようなイメージで問題ないかと思います。

![tcp_pcb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/e37de72f-3951-49e6-8a1a-4863a07a0698.png)

上記にある「送信バッファ」というのは送信に行うデータをリスト構造で保持するものです。

## tcp_pcbの送信バッファ

TCPはUDPと違ってコネクションを確立したり、再送制御や順序制御などを行う必要があるので、送信バッファは下記のようにリスト構造の送信バッファリスト「unacked」と「unsent」を持っています。

![tcp_pcbバッファ構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/bfbb9d2c-a700-4bbd-b647-7480207a83a7.png)

上記の図にも示した通り、「unsent」はまだ送信を行っていないバッファをリストで持ち、「unacked」はすでに送信済みでackを待っているバッファをリストで持っています。
「unsent」は、輻輳制御などの影響ですぐにデータ送信できないことがあるので、リスト構造にしてデータを保持しています。
また、「unacked」は、ACKが返ってこない場合の再送制御を行うために、リスト構造にしてデータを保持しています。

## tcp_pcbの受信バッファ

送信バッファがリスト構造になっているのに対し、基本的に受信バッファはリスト構造で保持していません。
データが受信された際、その都度受信したデータの処理を行います。

# netif(デバイスドライバの管理用データ)

「netif」はデバイスドライバを管理するためのデータ構造です。ソースコード上では[こちら](https://github.com/lwip-devs/lwip/blob/master/src/include/lwip/netif.h#L269)で定義されています。
下記の図のように、通信処理を行うネットワークインターフェース一つにつき、一つ存在します。

![netif構造体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/dc2d2fc2-f1aa-47cd-9cf1-ca21af7ba838.png)

また、「netif」に格納されているのは下記の図に示したようなデータです。

![netif詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/c5abb13d-e947-473c-9f33-0f39d39a6e64.png)

通信に必要なIPアドレス関連の情報と、データを送受信する際に呼び出される関数、ネットワークのステータスが変わった時にそれをデバイスドライバやネットワークインターフェースにも反映させるためのコールバック関数など、デバイスドライバを制御・管理するための情報がまとめられています。
こちらも「tcp_pcb」や「udp_pcb」と同様パラメータは多いですが、よく使うのは上記の図に示した情報になるかと思います。

# 参考資料

- Githubリポジトリ
https://github.com/lwip-devs/lwip
- LwIP初版設計書
https://www.artila.com/download/RIO/RIO-2010PG/lwip.pdf
家計簿アプリを作る＃２９

![スクリーンショット 2025-04-06 131515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/fd2c1225-bb9d-4ee9-b44d-010de5e68a36.png)
MUIなので、すべてインポートしていきます👆

![スクリーンショット 2025-04-06 131643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/e9794840-94d5-4e83-83fb-3bba4fd32a01.png)
また、interfaceは、typeのように変えることもできます👆

![スクリーンショット 2025-04-06 131815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/e309aeb9-f73f-4de6-8e7c-2db208c4fabc.png)
このように👆型定義をすることも可能です。
AWS EC2にApacheをインストールしてWebサーバーを構築しよう

## はじめに

AWSのEC2インスタンスを使ってWebサーバーを構築する方法を解説します。EC2インスタンスは作成しただけでは単なる仮想マシンにすぎません。Webサイトを公開するためには、Webサーバーソフトウェアをインストールする必要があります。今回はApacheをインストールして、基本的なWebサーバーを構築していきます。

## 前提条件

- AWSアカウントを持っていること
- EC2インスタンスが既に作成されていること
- EC2インスタンスへのSSH接続ができる状態であること


## WebサーバーとApache

### WebサーバーとEC2の関係

多くの方が「EC2がWebサーバーなのでは？」と思われるかもしれませんが、正確には：

- **EC2**は仮想的なコンピュータ（ハードウェア）を提供するサービス
- **Apache**はそのコンピュータ上で動作する、Webページを配信するためのソフトウェア

つまり、EC2は「パソコン本体」、Apacheは「そのパソコンにインストールしたWebサーバーソフトウェア」と考えるとわかりやすいでしょう。

### Apacheとは

Apacheは世界で最も広く使われているWebサーバーソフトウェアの一つです。主な役割は：

1. インターネットからのHTTPリクエストを受け取る
2. リクエストに応じて適切なHTMLファイルなどを返す
3. PHPなどのプログラミング言語と連携して動的なWebページを生成する

ApacheはオープンソースであるためAmazon Linuxなどで無料で利用可能です。似たような役割を持つソフトウェアにnginxがあります。

## Apache（httpd）のインストール手順

### 1. EC2インスタンスにSSH接続

まず、EC2インスタンスにSSH接続します。前回の記事で作成したキーペアを使用して：

```bash
ssh -i ~/.ssh/test-dev-keypair-ec2.pem ec2-user@あなたのElasticIP
```

### 2. システムの更新

セキュリティと安定性を確保するため、まずシステムを最新の状態に更新します：

```bash
sudo yum update -y
```

このコマンドの意味：
- `sudo`: 管理者権限でコマンドを実行する
- `yum`: Red Hat系Linuxのパッケージ管理ツール
- `update`: インストール済みパッケージを最新版に更新する
- `-y`: 確認メッセージに自動で「yes」と答える

### 3. Apacheのインストール

次にApache（httpd）をインストールします：

```bash
sudo yum install -y httpd
```

このコマンドの意味：
- `install`: 新しいパッケージをインストールする
- `httpd`: Apache HTTPサーバーのパッケージ名（HTTP Daemonの略）

### 4. Apacheの起動と自動起動設定

Apacheをインストールしただけでは動作しません。以下のコマンドで起動します：

```bash
sudo systemctl start httpd
```

また、サーバーが再起動してもApacheが自動的に起動するように設定します：

```bash
sudo systemctl enable httpd
```

このコマンドの意味：
- `systemctl`: Linuxのサービスを管理するコマンド
- `start`: サービスを開始する
- `enable`: システム起動時に自動的にサービスを開始するよう設定する
- `httpd`: Apache HTTPサーバーのサービス名

### 5. Apacheの動作確認

Apacheが正常に動作しているか確認するには以下のコマンドを実行します：

```bash
sudo systemctl status httpd
```

正常に動作していれば、`active (running)`と表示されます。

## ブラウザからのアクセス確認

Apacheが正常に動作していれば、EC2インスタンスのElastic IP（またはパブリックIP）アドレスをブラウザで開くことでアクセスできます。

例えば、Elastic IPが`12.34.56.78`の場合：
ブラウザで`http://12.34.56.78`にアクセスします。

Apacheのデフォルトのテストページが表示されれば成功です！

## よく使うLinuxコマンドとその意味

初めてLinuxを使う方のために、今回使用したコマンドの解説をします：

| コマンド | 意味 | 例え |
|---------|------|------|
| `sudo` | 管理者権限でコマンドを実行する | 管理者のパスワードを使って操作する |
| `yum` | パッケージ管理ツール | Windowsの「プログラムのインストール」や「App Store」 |
| `-y` オプション | 確認に自動で「yes」と答える | 「本当に実行しますか？」に常に「はい」と答える設定 |
| `systemctl` | サービスを管理するコマンド | Windowsの「サービス」管理画面のコマンド版 |

## まとめ

今回は、EC2インスタンス上にApache（httpd）をインストールして基本的なWebサーバーを構築しました。これにより、インターネットからアクセス可能なWebサイトの基盤ができました。

次のステップとしては：
- HTMLファイルをアップロードして独自のWebページを表示する
- MySQLをインストールしてデータベースを構築する
- PHPをインストールして動的なWebページを作成する
- WordPressをインストールしてブログやCMSを構築する

これらの方法については、次回の記事で紹介します！

## 参考リソース

- [Apache HTTP Server プロジェクト公式サイト](https://httpd.apache.org/)
- [Amazon Linux 2 ユーザーガイド](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html)
- [AWS EC2 公式ドキュメント](https://docs.aws.amazon.com/ec2/)
【Teams電話】通話キューの制御：電話番号と案内応答

# はじめに

Teams 電話の通話キューについて、通話キューへ着信した際の動作に関する設定をまとめました。

通話キューの概要については以下に記載しています。

※ 関連記事

https://qiita.com/atsmin77/items/cd0d7f0fa8569d677e6f

# 電話番号

通話キューの電話番号に関する設定には以下の 2 つがあります。

| 制御 | 設定タブ | 設定名 |
|:-:|:-:|:-:|
| 通話キューへの着信 | 一般情報 | リソースアカウント |
| 通話キューからの発信 | 一般情報 | 通話 ID |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/542f23f1-7351-47f5-b126-af5e99978ae0.png)

### 通話キューへの着信

通話キューの電話番号は、通話キューに割り当てるリソースアカウントの電話番号が使用されます。リソースアカウントについては以下に記載しています。

※ 関連記事

https://qiita.com/atsmin77/items/cd0d7f0fa8569d677e6f#1-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90

### 通話キューからの発信

エージェントが通話キューの電話番号から発信できるようにするためには、[一般情報] - [通話 ID] にリソースアカウントを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5ced5f31-4ea0-4012-ad28-2935c9295aea.png)

リソースアカウントが追加されると、通話キューのエージェントは追加したリソースアカウントの電話番号で Teams クライアントから発信することができます。

::: note
リソースアカウントは複数追加することができます。また、別の通話キューや自動応答のリソースアカウントを追加することもできます。
:::

::: note warn
通話 ID に割り当てたリソースアカウントには、外線発信が行えるよう電話番号や Direct Routing では音声ルーティングポリシーの割り当てが必要となります。
:::

(参考：手順 1: 一般的な情報を設定する)
https://learn.microsoft.com/ja-jp/microsoftteams/create-a-phone-system-call-queue?tabs=general-info#step-1-set-up-general-information

# 案内応答

通話キューへ着信した際に利用者へ案内する自動音声に関する設定は、以下の 2 つがあります。

| 制御 | 設定タブ | 設定名 |
|:-:|:-:|:-:|
| 利用者に流れるメッセージ | 案内応答と音楽 | 応答メッセージ |
| 利用者が待っている間の音楽 | 案内応答と音楽 | 保留音 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/e4cb2e25-86c7-4155-8518-ba86052f63f4.png)

### 利用者に流れるメッセージ 

利用者が通話キューへ発信した際に、最初に流れるメッセージを指定することができます。メッセージは音声ファイル、または入力したメッセージを再生することができます。

| 名前 | 説明 |
|:-:|:-:|
| あいさつ文なし | 利用者にメッセージを流さない |
| 音声ファイルを再生する | 利用者に指定したファイルの音声を流す |
| 応答メッセージを追加 | 利用者に入力したメッセージを流す |

[応答メッセージを追加] を選択する場合、[一般情報] タブで応答メッセージの言語を指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/b58d3b3b-320c-4055-8ba5-ff0f62f47493.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5747dbf9-acec-43b2-9f37-bd3c8fb8c78c.png)

### 利用者が待っている間の音楽 

利用者が通話キューへ発信した際に、エージェントが受話するまでキューで保留中となっている間に利用者へ流す音楽を指定することができます。

既定の音楽のほか、アップロードした音声ファイルを再生することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c8324b28-1b97-4fcf-8dd3-602dd647951d.png)

:::note
アップロードできる音声ファイルにはファイル形式やサイズに [制限](https://learn.microsoft.com/ja-jp/microsoftteams/plan-auto-attendant-call-queue#supported-audio-file-formats) があります。
機能を試すだけであれば [公式ブログで公開されている MP3](https://techcommunity.microsoft.com/blog/microsoftteamsblog/introducing-a-microsoft-teams-ringtone-that-will-make-you-want-to-dance/3626035) を利用できます。 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/08362a99-ead0-42d4-bad5-aa78ca23401e.png)
:::

(参考：手順 2: あいさつと保留音を追加する)
https://learn.microsoft.com/ja-jp/microsoftteams/create-a-phone-system-call-queue?tabs=greeting-music#step-1-set-up-general-information
Azure DatabricksのUnity Catalogでカタログを使えるようにするまで

Azure DatabricksのUnity Catalogを使えるようにするまでの手順です。
Azure Databricks公式Docを参照いただいたほうが確実かと思います。
あくまで私が作成した際の一例となります。

## Azureにてワークスペース作成

### 1. リソースグループ作成

下記構築物はすべてこのRGに構築しました。

### 2. VNet構築
    
アドレス空間：10.0.0.0/22
サブネットをひとつだけ作成：dbw01-snet-back-test-jpe

### 3. NSG構築

私は作成しませんでした。

### 4. ワークスペースデプロイ

2.VNetで作成したVNetを選択し、そこに以下のようなサブネットを作成しました。
パブリックサブネット名：dbw01-snet-public-test-jpe
CIDR範囲：10.0.1.0/26
プライベートサブネット名：dbw01-snet-private-test-jpe
CIDR範囲：10.0.2.0/26
プライベートエンドポイント名：dbw01-pep-test-jpe
その他設定値割愛します。

## アカウントコンソールに入れないとき

私は、ワークスペースにログインし、ワークスペース画面の右上のワークスペース名を押下しても、「アカウントを管理」ボタンが出てこない自体に陥りました。

公式Docの[アカウントコンソールURL](https://accounts.azuredatabricks.net/)にアクセスしても下記エラーが出て入れませんでした。

> 選択されたユーザー アカウントは、テナント 'Microsoft Services' に存在しないため、そのテナントのアプリケーション '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d' にアクセスできません。最初に、アカウントをテナントの外部ユーザーとして追加してください。別のアカウントをお使いください。

ちなみに、下記条件は満たしていました。

- Azure Databricks Premiumプランである
- ワークスペースと同テナントのユーザーでログイン
- サブスクリプションの管理者ロールを付与されたユーザーでログイン

私の場合の原因は、Azure登録時のデフォルトのサブスクリプション配下にワークスペースを作成していたことかもしれません。

サブスクリプションを新たに作り、そのサブスクリプションの管理者ロールをユーザーに付与します。付与されたユーザーでログインするとアカウントコンソールにアクセスできるようになりました。

同じ事態に陥っている方の参考になれば幸いです。

## Unity Catalogの設定

### 1. AzureマネージドIDの作成

ユーザー管理のマネージドIDを作ります。
AzureポータルでマネージドIDを開き、各種パラメータ入力します。

### 2. Azure Databricks用のアクセスコネクタの作成

マネージドIDに紐づくアクセスコネクタを作成します。

システム割り当てマネージドID：オフ
ユーザー割り当てマネージドID：任意の命名で指定

### 3. Azureストレージアカウントの作成

- 基本情報
    - プライマリ：Blob StorageまたはAzure Data Lake Storage Gen2
- 詳細
    - ほぼデフォルトで設定
    - **Unity Catalog用途の場合は階層型名前空間は有効にする**
- ネットワーク
    - ネットワークアクセス：すべてのネットワークから有効
    - 選択した仮想ネットワークとIPアドレスという指定にする場合
        - ワークスペース作成時に作成した仮想ネットワークを選択
        - サブネット：パブリックエンドポイントを指定
- データ保護・暗号化
    - すべてデフォルト設定

### 4. AzureストレージアカウントのIAM設定

ストレージアカウントの権限を先程のマネージドIDに付与します。

1. ストレージアカウントのアクセス制御（IAM）画面でロール追加を押下
2. ロールタブの職務ロールで「ストレージBLOBデータ共同作成者」を選択
3. メンバータブのアクセスの割当先で、「マネージドID」を選択
4. メンバーを選択するボタンを押下し、手順１で作成したマネージドIDを選択
5. 設定画面最後まで進み、レビューと割当てボタンを押下

### 5. 資格情報の登録

1. Azure Portal
    1. 前手順で作成したAzure Databricksアクセスコネクタを開き、概要⇨JSONビューを押下しリソースIDを控える
    2. 前手順で作成したマネージドIDを開き、概要⇨JSONビューを押下しリソースIDを控える
2. Databricksワークスペースにログイン
    1. 左ペインからカタログ押下、上の外部データ押下
    2. 資格情報タブの「資格情報を作成」ボタンを押下する
    3. 前手順で控えたリソースIDをそれぞれ入力し、作成

### 6. 外部ロケーションの登録

1. 外部ロケーションタブの「外部ロケーションを作成」ボタンを押下
2. URL入力と前手順で作成した資格情報を選択

### 7. カタログの作成

カタログエクスプローラ画面のカタログ作成ボタン押下して、先ほど作成した外部ロケーションを設定し、その他必要事項を入力すれば、カタログの完成です。
/usr/local/bundle/bin/railsを削除して大変だったけど、dockerについてちょっと学んだ話。

## ご挨拶
初めまして！

未経験からエンジニアを目指しプログラミングスクールで学習し、就活中のあいと申します。
`/usr/local/bundle/bin/rails`を削除して大変でしたが、dockerについてちょっと学んだことをまとめております。
どなたかのお役に立てますと幸いです。

## 前提
初学者がアプリ開発を通して学んだことをまとめておりますので、温かい目で見守ってくださると幸いです。
もし別の方法でうまくいっている方がいらっしゃれば、教えていただけますと幸いです。

## 状況
Rails Tutorialで、環境構築はdocker、本番環境はflyioで実装。

## 発生したエラー
- Rails8がインストールされてしまい、Rails7にインストールし直したが、ターミナルで`rails -v`で確認するとバージョンがRails8のままだった。
- それを解決するために、誤って消しちゃいけない`/usr/local/bundle/bin/rails`を削除し、`railsコマンド`が使えなくなった。
  - `rails new`とかができなくなった。

## 使用資料
- [lnコマンドめっちゃ便利。](https://qiita.com/mitsumizo/items/3c266699d9ca7a712108)
- スクール生自作資料
- - エラー解決後、スクールの講師に`/usr/local/bundle/bin/rails`に対する自分自身の理解と認識を確認した。

## 解決策
- 上記エラーを、`ln -s コマンド`で解決。

## 詳細
- `lnコマンド`は、リンクを貼るコマンド。
- `ln -s コマンド`は、**シンボリックリンク**を貼るコマンド。

## 考察
- 今回の場合は、`Railsのコマンド本体（Rubyで書かれた実行スクリプト）`を`/usr/local/bundle/bin/rails`この名前で呼ばれるようにするために、`ln -s コマンド`を使って、「railsコマンドの入り口」を作り直したので、解決した。
  - 「railsコマンドの入り口」を作る必要があるので、ディレクトリをただ作り直すだけではダメ。
- `/usr/local/bundle/bin/rails`の削除は、他のコンテナやアプリにも影響が出る。
  - Dockerfile内の下記の記載によって、ファイルが実行されたときに、`/usr/local/bundle /usr/local/bundle`が参照される。Dockerfileに下記の記載があれば、他のアプリディレクトリやコンテナでも共通で参照される。
  - railsをインストールすると、`/usr/local/bundle /usr/local/bundle`ファイル下に`bin/rails`ができる。そこに、railsのファイルデータは保存される。
  - そのため、`/usr/local/bundle/bin/rails`を削除すると、他のコンテナ（下記の記載がdockerfileにあるコンテナ）は影響を受ける。
  ```
  # Dockerfile内の下記の記載
  # Copy built artifacts: gems, application
  COPY --from=build /usr/local/bundle /usr/local/bundle
  COPY --from=build /rails /rails
  ```
Next.jsとCloudflare WorkersでDisallowed operation called within global scope. Asynchronous I/O (ex: fetch() or connect()), setting a timeout, and generating random values are not allowed within global scopeエラーが出る

# はじめに

Cloudflare WorkersでNext.jsを開発しているときにエラーに時間がかかったのでまとめます

# 問題

`npm run preview`をすると以下のエラーが出るようになりました

```
✘ [ERROR] Error: Disallowed operation called within global scope. Asynchronous I/O (ex: fetch() or connect()), setting a timeout, and generating random values are not allowed within global scope. To fix this error, perform this operation within a handler. https://developers.cloudflare.com/workers/runtime-apis/handlers/

      at Js.ge.__chunk_2976
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/webpack/5f9c3c5ca34a56d5b98423dc5279b2aa.js:59:15708)
      at n
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/functions/files/[id].func.js:1:15438)
      at Js.ge.__chunk_6938
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/webpack/5f9c3c5ca34a56d5b98423dc5279b2aa.js:1:135163)
      at n
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/functions/files/[id].func.js:1:15438)
      at Js.ge.__chunk_4389
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/webpack/5f9c3c5ca34a56d5b98423dc5279b2aa.js:37:4118)
      at n
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/functions/files/[id].func.js:1:15438)
      at Js.ge.__chunk_805
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/webpack/5f9c3c5ca34a56d5b98423dc5279b2aa.js:77:30985)
      at n
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/functions/files/[id].func.js:1:15438)
      at Js.ge.__chunk_2823
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/webpack/5f9c3c5ca34a56d5b98423dc5279b2aa.js:65:17569)
      at n
  (file:///home/jinwatanabe/workspace/gigafile-clone-app/.vercel/output/static/_worker.js/__next-on-pages-dist__/functions/files/[id].func.js:1:15438)
```

ページにアクセスすると500エラーになります
シンプルなページにしても起きました

# 解決方法

Next.jsを14系に変更しまして治りました
15系ではnext-on-pageが対応できていないのかエラーが発生しているようです

# おわりに
tailwindcssもnext14に対応する必要がありま
ハッカソン個人備忘録①：FastAPI・Next.js・Terraformを使った構成メモを記事にアウトプットしてみた

## はじめに
本記事では、FastAPI、Next.js、Docker を組み合わせたモダンなWebアプリケーション開発の概要を紹介します。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

バックエンドからインフラまでを一貫した構成で管理できるこの手法は、スケーラビリティと保守性に優れています。

## 書こうと思ったきっかけ
受講しているITスクールでFastAPIやNext.js、インフラ構築に関するハッカソンがあり、実際に手を動かしながら学んだ知識を備忘録として整理したいと思ったのがきっかけです。

### 技術構成概要

#### バックエンド
- **FastAPI**
  - Python製の高速APIフレームワーク
  - Swagger UIの自動生成が便利
  - AWS Lambdaやサーバーレス環境との相性も良い

#### フロントエンド
- **Next.js (TypeScript)**
  - サーバーサイドレンダリング(SSR)によるSEO強化
  - API Routesやミドルウェアも強力
  - TypeScriptにより型安全な開発

#### インフラ
- **AWS Fargate + Terraform**
  - ECS + Fargate でサーバー管理無しのコンテナ実行
  - TerraformでIaCを実現 → 再現性と保守性UP

## まとめ
FastAPI + Next.js + Docker の組み合わせによるアプリ開発では、バックエンドからインフラまでを統一的かつ柔軟に扱えるため、現代的なWeb開発のベースとして非常に有効だと実感しました。

:::note warn
***開発効率の向上やデプロイの簡略化だけでなく、スケーラブルな構成を目指すうえでも理想的なスタックです。***
:::

今後は、API Gateway連携やセキュリティ強化、CI/CDパイプラインの導入にも挑戦していきたいです！
vouch-proxy を試す（思わぬ水入り)

# auth0+nginx+oauth2proxy が何時しか動かなく
![スクリーンショット_2025-04-06_02-00-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91470/f981b0e2-4943-47cf-92a8-1089c14f7b9c.png)

* 某所で 去年に設定して今年の3月半ばまで動いていた評価試験設定があるのですが、OS更新やパッケージ更新を経たことにより、動作しなくなっていました。

* GET - "/oauth2/start?rd=%2F"
```
[2025/04/06 10:05:45] [oauthproxy.go:897] Error redeeming code during OAuth2 callback: token response did not contain an id_token
```
## 動いていた頃は
```
GET - "/oauth2/start?rd=%2Foauth2%2Fcallback%3F" HTTP/1.0 "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" 302 442 0.001
```
* 詳しいところはよく判っていませんが、auth0 は okta　に買収されていますし、2018年頃から使われていた古いインターフェイスは無くなっていて、NGINXに関していえば、njsや mTLSをつかう、有償版サービスのみ生きているというところでしょうか。
* [サ終おしらせ](https://auth0.com/docs/troubleshoot/product-lifecycle/deprecations-and-migrations#new-management-api-scopes-required-for-connection-options)
* 時期的にはズレているのですが、最近エンドポイントのURIを変更することでイレギュラーなことをやったので、テナント毎捨てる他ないかもというところ。

## oidc プロバイダを自前で持てばいい？
* サ終が理由なら okta にアカウント作ればいいじゃない　→現在作業中
* oauth2proxy の oidcドキュメントでは[dex](https://github.com/dexidp) を使う事例があります。なるほど idpも自作か。
* dex　に関してはまた別の記事を書くかも。　

## oauth2proxy の闇
* oauth2proxy の実装を見ると、まあ go のプロダクトらしい集合知という感があります。このあたりのアプローチはモダンなんでしょうが、巨大化するコードとドキュメントの不一致には泣かされるわけです。オプションがよく変わるのは多数が関わるプロジェクトの政治的な判断にすら左右されてしまっていますし、責任分界がどこにあるのかわかりにくい。素人が手を出せないところというか、何故か実装にBASIC認証まで入れていると知り、oauth2じゃないじゃんこれという感があります。
* oauth2proxy に対する別解
たとえば、[mini-oauth2proxy](https://github.com/wolfmagnate/mini-oauth2-proxy) のような、簡略化で明快にしようという考えをコードにされている人もいます。 strnh 本人のスキルレベルとして、goはド^3素人なので動かすまで戸惑いましたが、とりあえずバイナリをこしらえるところまで行っています。 dexを動かしたら間違いなくテストできそうです。

# 本題: [vouch-proxy](https://github.com/vouch/vouch-proxy)
* oidc で検索をしていたらすぐ見つかりました。　oauth2proxy以外に手を出すのは時間の問題になるかと思ったのですが、動いていたAuth0の古い設定が サ終 and 壊れた(ワザと壊れるようにした？？)のもあり、目論んでいたターゲットに適用→実運用するにはこの変化に追いつくこともなく間に合いそうにありません。　ですからB案で行くこととして、vouch-proxyについては調べていきたいというところです。

### 運用準備
*  vouch-proxy は　http周りを nginxに預ける形になっていました。別のSNIを持って運用するようですので、DNSに vouch.ほにゃらら.com  的な AレコードRRsetを追加しておきます。
* OKTAに開発者アカウントを作って、とりあえず設定を・・

## 思わぬ認証PROVING検出・・・
* vouch-proxy の設定が進んで来たのでテストしていると nginxのログがにわかに増えてきました。なんか嫌な予感がするので、止めて確認です。
* まだテストして数分なので、URLがどこかで漏れているんですかねぇ？？
```
% IANA WHOIS server
% for more information on IANA, visit http://www.iana.org
% This query returned 1 object

refer:        whois.afrinic.net

inetnum:      154.0.0.0 - 154.255.255.255
organisation: Administered by AFRINIC
status:       LEGACY

whois:        whois.afrinic.net

changed:      1993-05
source:       IANA

# whois.afrinic.net
```
* 何やらきな臭くなってきたので、試験中止です。URLをランダムな文字列に変えてアクセスが来たらどこかで漏れているってことですかねぇ？？
* たまたまかもしれないですが、idpを見張っているのがいるのか中に変なのがいるんですかねえ

## 続きは後日
* 認証系いじるのはホント厄介な時代ですねぇ。
円滑なコミュニケーションのための考えとテクニック

# はじめに
「会議や打ち合わせでうまく伝わらない」
「質問や意見をどうやって伝えたらよいのか」
といった経験はないでしょうか？

そんな悩みを改善する「信頼関係の構築」と「伝え方」についてご紹介します！

# ▼信頼関係の構築
### 信頼関係とは
心理学用語で「信頼関係」は「ラポール」と呼ばれます。このラポールがなければ、相手に意図を伝えることは非常に難しいです。

### 信頼関係（ラポール）の構築方法
人は「共通点」や「同調」を感じることで親近感を抱きます。しかし、相手が「本心ではない」と感じる場合、逆に信頼を損なうリスクがあります。そのため誠実さが重要です。


以下、代表的なテクニックです。
#### ペーシング
- 話すスピードをそろえる
- 声の大きさをそろえる
- 声のトーンをそろえる
- 言葉遣いをそろえる
#### ミラーリング
- 表情を合わせる
- 姿勢を向ける
- ジェスチャーを真似る
#### バックトラッキング（オウム返し）
- 事実や感情表現を繰り返す
- 相手の言葉を言い換える
- 相手の言葉を要約する

※さらに、「好きなこと」「行ったことのある場所」「価値観」など、個人的な共通点を見つけることが効果的です。自己紹介の際にこれらの情報を伝えることで信頼の基礎を築けます。

# ▼伝え方
会話の目的が発生した場合、すぐに会話をするのではなく、大小含め以下の流れで準備をしましょう。
- 調査：問われている事象に関する情報収集をする
- ストーリー作成：調査結果から「何を決めたいか」を決める
- 資料作成：ストーリーが伝わる資料を用意する
- 対話：会議や個別打合せで結論を出す

### 相手の理解
誰に対しても同じ話し方をしていませんか？相手のタイプに合わせた話し方があります。

下記のソーシャルスタイルでは、人を4つに分類できます。
相手のタイプを予測して、そのタイプにあわせてコミュニケーションをとりましょう。

![スクリーンショット 2025-04-06 120842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971273/1c962a45-3a53-4103-be2b-6a17e9c9282c.png)



### 論理構成
ただ話したいことを並べるだけでは伝わりません。代表的な構成に合わせて、伝えたいことを整理しましょう。

#### 空雨傘の構成
- 事実
> 例）空を見上げると曇っていた
- 解釈
> 例）今日は雨が降りそうだ
- 行動
> 例）傘を持って出かけよう

#### 背景/目的・要求・対応の構成
- 背景/目的
> 例）新しいプロジェクトを立ち上げるにあたり、チームメンバー間のコミュニケーションを改善したい。
- 要求
> 例）本プロジェクトの成功には明確な役割分担が必要。各メンバーが責任範囲を理解してほしい。
- 対応
> 例）チームメンバー全員に対して役割分担表を作成し、共有ミーティングを実施する。また、個別に不明点があれば私まで直接相談させる。

### 対話
下記の行動がみられる場合、相手が理解していない可能性が高いです。
- 無言
- 前の資料を見ている
- 資料の場所を聞かれる
- 的外れな質問が来る

このパターンに合致したら、繰り返して伝えてみたり、より丁寧な伝え方に切り替えてください。

また、オフラインに比べ、オンラインは相手の反応が見えにくいです。下記のように、より反応を得られる工夫をしましょう。
- 広い質問は行わず相手を指名して質問する
- 細かく区切って確認する

# ▼参考文献
https://www.udemy.com/course/communication-skills-for-engineers/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-3&utm_term=general&msclkid=f531466940f515b373e52198b335cea1
ユースケース層は「ユーザー操作」だけを書く場所ではない  

# はじめに
ユースケース層は「ユーザーが操作する処理だけを書く場所」だと考えている人は多い。  
この考えは間違いではないが、本質ではない。  

ユースケース層の役割はもっと広い。  
それは「アプリケーションとして必要な処理の流れ」を書く場所である。  
ユーザーの直接的な操作かどうかは関係ない。  

この記事ではその理由を解説する。

# よくある誤解
ユースケース層 = ユーザー操作をまとめる場所  
このイメージはClean Architectureを学び始めたときによく陥る誤解である。

例えば次のような操作は、誰が見てもユースケースだとわかる。

- アカウント登録  
- アカウント削除  
- ログイン  

一方で次のような処理はどうだろうか。

- アカウント一覧取得  
- アカウント詳細取得  
- 検索処理  

これらは「ユーザーの操作」というよりは「表示のための処理」に見えるかもしれない。  
だが結論から言えば、これらも全てユースケース層に置くべき処理である。

# なぜ表示用の処理もユースケース層に書くのか
理由はシンプルである。  

Clean Architectureでは、ユースケース層は「アプリケーションが提供する処理の流れ」を全て受け持つ。  
UI層やインフラ層から独立した「アプリ固有のルール」をここに閉じ込める。  

つまり次のように考えるべきである。  

> ユースケース層は「ユーザーの操作」ではなく「アプリの振る舞い」を書く場所である。

「表示のための処理」も「登録・更新・削除」も区別しない。  
どちらもアプリケーションとしての処理手順であり、ユースケースである。

# 図で整理する
```
[ UI層 ]  
     ↓ ユーザー操作 or 表示要求  
[ ユースケース層 ]  
     ↓ アプリの処理手順  
[ ドメイン層 ]   
```

# 具体例
### CreateAccountUseCase（登録処理）

```go
Execute(ctx, input) → アカウントを作成して返す
```

### FindAccountUseCase（表示処理）

```go
Execute(ctx, id) → アカウントを取得して返す
```

これらはどちらもユースケース層に属する。  
「アプリケーションの流れを表現する処理」だからである。  

表示処理だからといってUI層やインフラ層に任せてしまうと、アプリケーションのルールが散逸し保守性が落ちる。

# 結論
ユースケース層は「ユーザーの操作」だけを書く場所ではない。  
アプリケーションが提供するあらゆる処理の流れを書く場所である。  

迷ったときはこう考えると良い。  

> その処理はアプリケーションとして必要か？  
> アプリが提供する一連の処理手順か？  

これに「はい」と答えられるなら、ユースケース層に書く。
Wio BG770Aで割り込み処理を実装する方法

# はじめに
今回は、Wio BG770Aで割り込み処理を試してみます。


# 使用するデバイス
- Wio BG770A v1.0
- Grove Button

https://soracom.jp/store/30926/

https://jp.seeedstudio.com/Grove-Button.html

https://www.switch-science.com/products/801


# ポイント
ポイントは以下になります。

* Grove Buttonは、GroveコネクタのDigitalポートに接続
* 割り込みハンドラの作成
* 割り込みの初期化
* 割り込み関数内でフラグを制御
* 主な処理は、loop関数内で処理を実装


# ソースコード
ソースコードは以下になります。
サンプルスケッチの「grove-button.ino」をベースにして、ボタンによる割り込み処理を実装しています。割り込み関数以内でいろいろな処理を行うのはあまり望ましくないので、割り込み関数内ではフラグの制御のみを行い、主な処理はloop関数内で処理をしています。

```cpp
/*
 * grove-button.ino
 * Copyright (C) Seeed K.K.
 * MIT License
 */

#include <Adafruit_TinyUSB.h>
#include <WioCellular.h>

#define BUTTON_PIN (D30)  // Grove - Digital (P1)
#define INTERVAL (100)

// 割り込みフラグ
volatile bool buttonPressed = false;

// 割り込みハンドラ
void handleButtonPress() {
  buttonPressed = true;
}

void setup(void) {
  Serial.begin(115200);
  {
    const auto start = millis();
    while (!Serial && millis() - start < 5000) {
      delay(2);
    }
  }
  Serial.println();
  Serial.println();

  WioCellular.begin();
  digitalWrite(PIN_VGROVE_ENABLE, LOW);

  pinMode(BUTTON_PIN, INPUT);

  // 割り込みの設定
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, RISING);

}

void loop(void) {
  static int count = 0;

  if (buttonPressed) {
    // ボタンが押されたときの処理
    Serial.println("Button pressed!");
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);

    buttonPressed = false;
  }

/*
  int buttonState = digitalRead(BUTTON_PIN);
  Serial.print(buttonState ? '*' : '.');

  if (++count >= 10) {
    Serial.println();
    count = 0;
  }
*/

  delay(INTERVAL);
}

```

# 今後の展望
今回は、Wio BG770Aで割り込み処理の実装を行いました。割り込みの延長線での処理は、シリアル出力とLED点滅のみを実装していますが、今後はセルラー通信なども試してみたいと思います。
実装で学ぶフルスタックWeb開発

Docker DeskTop はインストール済み

1. MySQL

```yml
services:
  app-db:
    image: mysql:8
    command:
      --collation-server=utf8mb4_0900_bin
      --transaction-isolation=READ-COMMITTED
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Tokyo
    ports:
      - 53306:3306
```

workbenchをインストール
https://www.mysql.com/jp/products/workbench/

# フロント
```sh
yarn create next-app frontend --ts --eslint
```

frontendに作らないとフォルダ名重複によりエラーになる

```sh
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes

```

あとで直す

```sh
$ mv frontend/* .
$ mv frontend/.* .
$ rmdir frontend/
```

コンテナで開発する場合VSCodeのDev Containerをインストールして以下を実行
```
cd ./frontend
code .
```


## ライブラリ追加する
```
yarn add @mui/material @emotion/react @emotion/styled
yarn add @mui/x-data-grid
yarn add axios
yarn add swr
```

#### swrとは
stale-while-revalidate
httpキャッシュ無効化戦略？
- Fast, efficient fetching
バックエンドがレート制限を避けるためリクエストを効率的に並列化、重複除去、リトライする
- Realtime Updates
リアルタイムにデータを更新
- Built-in cache and no re-renders
データが更新されたら再レンダリング。ユーザー体験をスムーズに
- Transport and protocol agnostic
swrはAPIやデータの形式に依存せず、GraphQL、RESTなどの任意のデータフェッチに使用可能


# バックエンド
コンテナで開く
```
cd backend
code .
```
echo -e 'djangorestframework\nmysqlclient' > requirements.txt
pip install -r requirements.txt
pip freeze > requirements.lock

devcontainer.jsonに記載を追加

```
"postCreateCommand": "pip3 install --user -r requirements.txt"
```
Webview2 Runtimeを再インストールする

# 経緯
- Tauri製アプリの開発中にアプリのウィンドウが表示されなくなったが、コンソールにエラーは出ていない
- Xbox Liveへサインインしようとすると`0x89235107`エラーが出る

これが同時に発生した
考えられる原因として両方ともにWebView2がいる

# 手順
https://developer.microsoft.com/ja-jp/microsoft-edge/webview2/?form=MA13LH&cs=578062562
ここからブートストラップかスタンドアロンインストーラーをダウンロードして管理者権限で実行しインストール

# つまづいたところ
管理者権限で実行しないと「インストールできませんでした。Microsoft Edge WebView2 Runtimeは既にシステムにインストールされています。」とだけ表示されてインストールできない

# どうでもいい経緯
`npm run tauri dev`の実行中にエラーが出ていなかったのでTauri側の問題ではなさそう、`localhost:1420`にブラウザでアクセスすると問題なくアプリのフロントエンドが表示されるからウィンドウの表示だけの問題っぽいな…　WebView2再インストールするか…

→「インストールできませんでした。Microsoft Edge WebView2 Runtimeは既にシステムにインストールされています。」

めんどくさ！マイクラやろ！

→`0x89235107`

これで問題解決の優先順位が一気に上がったのでもう一度考え直すと、WebViewは明らかにユーザーを跨いで動くものなのに管理者権限でインストールしていないことに気がついた
インストールできなかったときの表示が簡潔すぎるんよ…
【ChatGPT＋4o Image Generation】で白黒写真をカラー化します。


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

　今回は、4o Image Generationで白黒写真をカラー化します。

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

　今回は、
　　4o Image Generationで
　　　白黒写真をカラー化します。

　白黒写真が撮影された
　　当時の色はどんなだったのか
　　　想像したことはありませんか？

　少し前は、
　　パソコンで、Photoshopなどを
　　　使って、カラー化していました。
　　　　かなりの微調整が
　　　　　必要だったみたい。

　ところが、
　　4o Image Generationで
　　　試したところ、
　　　　簡単に、カラー化
　　　　　できてしまいました😅

　こちらをごらんください。
![file-NRoXacYcZAcXAEi8PMnoif.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/bec59b6e-32b2-4674-96ed-f2b1ba7dd815.png)


　こちらは下記ホームページにあった
　　白黒写真です。
　　　[OMG Pressページ](https://www.ohmyglasses.jp/blog/2013/04/08/audrey-hepburn-sunglass/)

　ご存知、
　　オードリー・ヘプバーン主演の
　　　映画『ティファニーで朝食を』
　　　　のワンシーン。

　左側が白黒写真、
　　右側がカラー化したものです。

　こちらがそのPromptです。
　　白黒写真をアップロードして
　　　使ってください。
```Text:白黒写真→カラー化Prompt
カラー化して
```

　はい、たったこれだけです。
***
　さて、
　　この二枚を
　　　よく見比べてみると、
　　　　前髪、唇、ネックレスに
　　　　　違いが見てとれます。

　ここから言えることは、
　　単なるカラー化ではなく、
　　　**マネしてカラー化した**、
　　　　ということのようです。

　こちらは
　　別のセッションで
　　　生成したオードリーです。
![file_0000000093205230a8b304972548c96e_conversation_id=67f1c9d8-6290-8007-8606-832ccde2aecc&message_id=208fb230-bcdf-47e7-a111-66880f328c56.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/7c4d859e-b8af-4cf7-b4eb-1de6bdc81935.png)


　こちらは
　　白黒写真の
　　　ネックレスに
　　　　よく似ていますね。

　それにしても
　　映画も学習しているんですね。

　まぁ、それはともかく、
　　ジャングルの原住民の
　　　白黒写真（セピア色してる）も
　　　　同様にカラー化できました。

　もうひとつ。
　　こちらは『七人の侍』。
![file-3ACkfLnrbyPQdkuLjJyZek.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/35224011-c6fa-4eda-a036-a1430e6cfb4e.png)


　やっぱり
　　ところどころ違いますね😅

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

　今回は、ここまで。
ホモサピエンスとERP（静かに進化中）

**人類と税務**
最近よく話題になる、ユヴァル・ノア・ハラリ氏の『NEXUS情報の人類史』。『サピエンス全史』と同様に、人類の長い歴史をたどりながら、私たちがどうやって「今」の社会をつくり上げてきたのかを語る、壮大な一冊です。とくに近著の『NEXUS』においては、表立った変化が短期的には感じられなくても、水面下ではじわじわと進んでいく、社会の「進化」についての解説がちりばめられています。

こじつけみたいですが、ビジネスソフトウェアの世界においても、「静かな進化」があります。その一例としては、NetSuiteにおける「Legacy Tax」から「SuiteTax」へというグローバルな取り組みがあります。これは、日々の業務の中でほぼほぼ気が付かれることがないのですが、将来を見据えた壮大な土台作りです。
<br>

**変わらないのに、ちゃんと進化**
将来的な日本におけるSuiteTaxの適用は、現行のNetSuiteの見た目や使い勝手にほとんど変化をもらすことはありません。しかしながから、より先進的なTax Engine（税金計算モジュール）であるSuiteTaxは、システム内部で、より柔軟でしなやかな税制対応を、長く将来にわたって支えてくれる改善です。人類を含め、動物やあらゆる生命体が少しずつ環境に適応してきたように（少し大げさですね）。
<br>

**税務における「ネクサス」とは**
SuiteTaxの強みのひとつに、「ネクサス（Nexus）」という概念への対応強化があります。ネクサスとは、「どこで」「どういう条件のときに」税金がかかるのかを判断する基準のことです。一言で表せば「課税の根拠となる関連性」です。特に、複数の国や地域にまたがってビジネスを展開されているお客様にとって、各国や州における税制に柔軟に準拠することを、ネクサスは容易にしてくれます。
<br>

**未来に強いシステムへ、静かに進行中**
NetSuiteがグローバルに進めているLegacy TaxからSuiteTaxへの移行は、表立った変化ではありません。しかしながら、それは確かな進化であり、年度の途中で税率が変わったり、新しいルールが加わったりしても、より迅速に適応する「税制対応インフラ」への、NetSuiteの長期的な取り組みです。この取り組みは、日本のお客様に届くのは数年後かもしれませんし、全く気が付かれないかもしれませんが、話題の「ネクサス」という用語にからめて、ご紹介させて頂きました。
<br>

**参考リンク**
1. ユヴァル・ノア・ハラリ著『NEXUS情報の人類史』： [“知の巨人”ハラリ氏最新作、2025年3月5日発売。｜河出書房](https://web.kawade.co.jp/information/121737/)
2. NetSuite および NetSuite OneWorld の税制度／法制度への対応： [NetSuite OneWorldで解決](https://www.netsuite.co.jp/solutions/themes/global3.shtml?utm_source=chatgpt.com)
3. SuiteTax と Nexus について： [NetSuiteのグローバルTaxエンジン](https://www.netsuite.com/portal/products/erp/financial-management/finance-accounting/tax-management-software.shtml)、[SuiteTax と Legacy Tax の違い](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_0315035511.html#bridgehead_0318012331)
4. SuiteTaxも含めたユーザーガイド一覧： [NetSuite User Guides](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/preface_3710621755.html)
フロー Lightning ランタイム


ヘルプを読んでも意味が分からん

+ [フロー Lightning ランタイムに関する考慮事項](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_lex_runtime.htm&type=5)
+ [画面フローで Lightning ランタイム警告が繰り返し表示されないようにする](https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_flow_fbuilder_lightning_runtime_warnings.htm&release=230&type=5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7977514c-ea0c-4316-b5ea-b64568a4708c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2f586ea1-a8f1-4a7f-af88-904064e11980.png)


create access ?????

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1f7b7cc6-b402-4f7a-b860-fddb77c7c8c0.png)

理解不能　C！！！！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d6a40a05-f569-4caf-a12e-46a653186280.png)


+ 画面のこのセクションは、Classic ランタイムではサポートされていないため表示できません。Lightning ランタイムでのみ実行される方法でこのフローを配布するように Salesforce システム管理者に依頼してください。

[リストビューから呼び出す画面フローではLightningランタイムが必要な画面は使えない？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000PeT1ySAF)

:::note
設定 --> プロセスの自動化設定 で
フローの Lightning ランタイムを有効化は有効になっていますか？
:::
42歳で大学生になった

# 42歳で大学生になった話：社会人からCSを学び直すまで

## はじめに

私は文系大学出身で、これまで幸運にも失業することなく働いてきました。  
しかし年齢を重ねる中で、**自身のスキル不足を痛感することが増え**、「このままで本当に通用し続けるのか？」という不安が募っていきました。

そんな中、Qiitaやnote、ブログなどで、**「これからの時代、CS（コンピュータサイエンス）を学ぶべきだ」と説く記事**をいくつも目にしました。  
特に印象に残ったのが、大学院でCSを学んでいた方の記事です。  
その方は大学院に2年間通ったものの、学部レベルの基礎が足りず授業についていけなかったとし、**「大学で4年間学んでおくべきだった」と振り返っていました**。

それを読んで、「自分もまずは大学レベルからきちんと学び直すべきだ」と考えるようになりました。

調べを進めるうちに、「放送大学」と「帝京大学通信課程」の2択に絞られていきます。

この記事では、実際に入学するまでの流れと、社会人として感じたことをまとめています。

---

## 放送大学と帝京大学通信、どちらにするか

まず、両大学の違いを整理しました。

- **放送大学**
  - 学位は「教養」だが、**学位授与機構を通じて「工学」の学位を得る**ことも可能。
  - **大卒であれば3年次編入が確実**にできる。

- **帝京大学 通信課程（理工学部）**
  - 文系出身者は原則「2年次編入」が推奨。
  - ただし、**卒業生は3年次編入を申請できる可能性もある**。
  
私は帝京大学の文系学部の卒業生だったので、「これは縁かもしれない」と思い、**ダメ元で3年次編入を申請**することにしました。

---

## 入学手続きで必要だったもの

### 健康診断書

- 身長・体重・視力・聴力・胸部X線が必要。
- **保険適用外のため、費用は自己負担**（相場は1万円前後）。
- 幸い、地元の診療所で**5,000円で受診**できました。

### 証明写真

- 学生証用の顔写真（データ形式）。
- 最近の証明写真機は、スマホでデータをダウンロード可能。
- 今後長く使う写真になるので、**スーツを着て撮影**しました。

### 授業料支払い

- 帝京大学卒業生ということで、**授業料が約3万円割引**。
- 支払いは銀行窓口でのみ対応（証明書に印鑑が必要）。
- 平日に半休を取って振り込みに行きました。

### 志望動機書

- 400文字程度の志望理由を**手書き**で提出。
- Wordで下書きを作り、ChatGPTで誤字脱字をチェック。
- 鉛筆で下書き → 万年筆で清書。
- 内容は「これまでのキャリア」「学び直しの動機」「AIや人材不足といった背景からCSを学ぶ意義」などをまとめました。

### 書類の郵送

- 書類一式は**郵便局の窓口から発送必須**。ポスト投函は不可。

---

## 入学前にやっておいたこと

ある方のブログで「**高校数学は復習しておいた方がいい**」とあったので、素直に従いました。

以下の2冊を活用しました：

- 『[大学への数学 基礎からの数学](https://www.diamond.co.jp/book/9784478117804.html)』
- 『[高校数学の教科書 長岡亮介（考える大人の学び直しシリーズ）](https://www.amazon.co.jp/dp/4010527129)』

2月中旬から取り組みましたが、後半は読むだけになってしまったのが反省点。**もっと早く始めておけば良かった**です。

---

## 結果とこれから

正直「2年次編入だろうな」と思っていたのですが、**まさかの3年次編入で合格**。年齢的な配慮もあったのかもしれません。

ただ、社会人としてフルタイムで働きながら学業をこなすのは、**相当ハード**になることは間違いありません。破綻しないよう、**時間の使い方やモチベーションの維持について戦略を立てていく必要があります**。

---

## おわりに

42歳という年齢で大学生になることに、不安がなかったわけではありません。ですが、「今からでも遅くない」と一歩踏み出したことで、少し世界が広がった気がしています。

同じように迷っている方の参考になれば幸いです。

---

※この記事は、本人の体験談をもとに、ChatGPTがインタビュー形式でお話をうかがいながら執筆しました。  
文章がやけに丁寧だったら、そのせいです。
【2025年04月版】Ubuntu24.04 で Samba で Windowsとファイル共有

# はじめに

Ubuntu側でファイル共有サーバを作りたいな。。。

そうだ、Samba しよう。

昔の記事は匿名アクセス設定だったので、今回はアクセス可能なユーザを限定する方向で。

:::note info

匿名アクセスで構築する場合、Dockerで構築する場合は、以下の記事を参照してください。

- [【2023年06月版】Ubuntu22.04 で Samba で Windowsとファイル共有](https://qiita.com/nouernet/items/8a2415b48f095a292745)
- [【2024年10月版】Ubuntu22.04 で Docker + Samba で Windowsとファイル共有、サービス化](https://qiita.com/nouernet/items/f06e20bf77fd8de5e9fe)
:::

# 前提条件

- 環境
    Ubuntu24.04

- 共有するフォルダ
  `/export/smb_share`

- UbuntuのサーバのIPアドレス
    `192.168.100.100`

- 共有を使うユーザ
    `user1`

# インストール

```terminal
$ sudo apt update
$ sudo apt install samba
```

# 設定

- samba の設定ファイルを編集する

```terminal
$ sudo vim /etc/samba/smb.conf
  :
  :
[global]
; [global] に追加
security = user
  :
  :
; printers セクションをコメントアウト
;[printers]
;   comment = All Printers
;   browseable = no
;   path = /var/spool/samba
;   printable = yes
;   guest ok = no
;   read only = yes
;   create mask = 0700
  :
  :
; print$ セクションをコメントアウト
;[print$]
;   comment = Printer Drivers
;   path = /var/lib/samba/printers
;   browseable = yes
;   read only = yes
;   guest ok = no
  :
  :
[shared]
   comment = ubuntu24.04 share
   path = /export/smb_share
   available = yes
   read only = no
   browsable = yes
   public = no
   writable = yes
   guest ok = no
   valid users = user1
```

- samba の設定ファイルの編集内容をチェックする

```terminal
$ testparm
```

- 設定ファイルの修正にミスって、デフォルトに戻したいときは `/usr/share/samba/smb.conf` からコピーすれば良い

```terminal
$ sudo cp /usr/share/samba/smb.conf /etc/samba/smb.conf
```

- ユーザのsambaのパスワードを設定する

```
$ sudo smbpasswd -a user1
```

- フォルダの権限を設定する

```terminal
$ sudo chown user1:user1 /export/smb_share
$ sudo chmod 770 /export/smb_share
```

- 必要であれば、ufw の 139 と 445 を開ける

```terminal
$ sudo ufw allow 139/tcp
$ sudo ufw allow 445/tcp
```

# サービスの再起動

```terminal
$ sudo systemctl restart smbd
```

# サービスの自動起動の設定

```terminal
$ sudo systemctl enable smbd
$ sudo systemctl enable nmbd
```

# 動作確認

## Windows

Windows端末から、Explorerで、`//192.168.100.100/smb_shared` の共有を開く
ユーザとパスワードを求められるので、user1/入力したパスワードを入力する

## macOS

macOS端末から、Finder -> 移動 -> サーバへ接続で、`//192.168.100.100/smb_shared` の共有を開く
ユーザとパスワードを求められるので、user1/入力したパスワードを入力する

## Linux

- smbclientで直接操作する場合

```terminal
$ smbclient --user smbuser //192.168.100.100/share smbpassword
```

- MOUNTする場合(/mnt/smbにマウント)
```terminal
# mount -t cifs //192.168.100.100/share /mnt/smb -o user=smbuser
```

# さいごに

かんたんでしたね

# リンク

- [【2023年06月版】Ubuntu22.04 で Samba で Windowsとファイル共有](https://qiita.com/nouernet/items/8a2415b48f095a292745)
- [【2024年10月版】Ubuntu22.04 で Docker + Samba で Windowsとファイル共有、サービス化](https://qiita.com/nouernet/items/f06e20bf77fd8de5e9fe)
- [【2023年6月版】Sambaメモ](https://qiita.com/nouernet/items/abd4a1e0e80ebf9ace5b)
SQLクエリビルダを使った効率的なデータ挿入手法

## はじめに

データベース操作において、SQLクエリを手動で構築するよりも、クエリビルダを利用する方法が多くの場合で便利です。特に複数行のデータを一度に挿入する場合（バルクインサート）では、効率性と可読性の両面でメリットがあります。この記事では、`tx.InsertInto()`を使ったバルクインサート手法について解説します。

## クエリビルダの基本構文

クエリビルダを使ったデータ挿入の基本構文は以下の通りです：

```go
tx.InsertInto("テーブル名").
    Columns("カラム1", "カラム2", ...).
    Values(値1, 値2, ...).
    Values(値1, 値2, ...).
    Exec()
```

それぞれの要素について詳しく見ていきましょう。

## 各メソッドの役割

### `tx.InsertInto("テーブル名")`

このメソッドは、指定されたテーブルにデータを挿入するためのSQL INSERT文の構築を開始します。`tx`はデータベーストランザクションオブジェクトで、このトランザクション上でクエリが実行されます。

```go
tx.InsertInto("m_user")  // ユーザーテーブルへの挿入を開始
```

### `.Columns("カラム1", "カラム2", ...)`

データを挿入するカラム（列）の名前を順番に指定します。

```go
.Columns("user_id", "name", "email", "status")  // 挿入するカラムを指定
```

### `.Values(値1, 値2, ...)`

挿入する**1行分**のデータを、`.Columns()`で指定したカラムの順番に合わせて指定します。

```go
.Values(user_口座開未開設, "山田太郎", "yamada@example.com", definitions.AccountOpenStatusActivate)
```

### `.Exec()`

構築されたINSERT文（複数行のデータを含む）をデータベース上で実行します。

```go
.Exec()  // クエリを実行
```

## バルクインサートの利点

**重要な点:** 1つの`InsertInto()...Exec()`のブロック内で`.Values(...)`が複数回呼び出されることで、**複数の行をまとめて1つのINSERT文で挿入する**ことができます（バルクインサート）。

```go
tx.InsertInto("m_user").
    Columns("user_id", "name", "status").
    Values(user_口座開未開設, "山田太郎", definitions.AccountOpenStatusActivate).
    Values(user_FX口座申込中, "鈴木一郎", definitions.FxAccountStatusUnOpen).
    Values(user_口座開設済, "佐藤花子", definitions.AccountOpenStatusActivate).
    Exec()
```

この方法は、以下のように1行ずつINSERTを実行するよりも効率的です：

```go
// 効率が悪い方法
tx.InsertInto("m_user").Columns("user_id", "name", "status").Values(user_口座開未開設, "山田太郎", definitions.AccountOpenStatusActivate).Exec()
tx.InsertInto("m_user").Columns("user_id", "name", "status").Values(user_FX口座申込中, "鈴木一郎", definitions.FxAccountStatusUnOpen).Exec()
tx.InsertInto("m_user").Columns("user_id", "name", "status").Values(user_口座開設済, "佐藤花子", definitions.AccountOpenStatusActivate).Exec()
```

## 実際の使用例

テストデータの作成などでは、異なるシナリオに対応したデータを効率的に挿入できます：

```go
tx.InsertInto("m_user").
    Columns("user_id", "name", "status", "email", "account_type", "my_number_status", "agreement_status").
    Values(user_口座開未開設, "山田太郎", definitions.AccountOpenStatusActivate, "yamada@example.com", "normal", "submitted", true).
    Values(user_FX口座申込中, "鈴木一郎", definitions.FxAccountStatusUnOpen, "suzuki@example.com", "premium", "not_submitted", true).
    Values(user_口座開設済, "佐藤花子", definitions.AccountOpenStatusActivate, "sato@example.com", "normal", "submitted", true).
    Exec()

tx.InsertInto("m_account_open").
    Columns("user_id", "application_date", "approval_date", "status").
    Values(user_口座開未開設, time.Now(), nil, "pending").
    Values(user_FX口座申込中, time.Now().AddDate(0, -1, 0), nil, "processing").
    Values(user_口座開設済, time.Now().AddDate(0, -2, 0), time.Now().AddDate(0, -1, 0), "approved").
    Exec()
```

## まとめ

クエリビルダを使ったバルクインサートは、以下のメリットがあります：

1. **効率性**: 複数のINSERT文の代わりに1つのクエリで複数行を挿入できる
2. **可読性**: SQL文を直接書くよりも構造化されて理解しやすい
3. **保守性**: カラムや値の追加・変更が容易

特にテストデータの準備やマスターデータの初期化など、多くのデータを一度に扱う場合に非常に有用なテクニックです。

## 注意点

- バルクインサートは効率的ですが、挿入する行数が非常に多い場合は、適切なバッチサイズに分けることも検討してください。
- エラーハンドリングを適切に実装することで、大量データ挿入時の問題を素早く検出できます。
LiteLLM 最近の更新まとめ

## 概要

LiteLLMは複数のLLMプロバイダーに対して統一されたインターフェースを提供するPythonライブラリであり、API呼び出しを標準化・簡素化することでLLM開発を容易にします。最近のリリースでは、API互換性の強化、パフォーマンス最適化、信頼性向上のための多くの機能が追加されています。

主なハイライト：
- Vertex AI、Gemini、Anthropicなど主要プロバイダーのサポート機能拡張
- DBデッドロック削減とRedisを活用した信頼性向上
- 画像生成・音声入力などマルチモーダル機能の拡充
- チーム管理・認証周りの機能改善

以下、最新リリースから順に主な変更点をまとめます。

## v1.65.4-stable（最新安定版）

最新の安定版リリースでは、多くの機能追加と修正が行われました。主な変更点は以下の通りです：

### 主な新機能
- Vertex AIトランスフォーメーションにnullフィールドを持つanyOf共用体タイプのサポートを追加
- Bedrockのレイテンシーに最適化された推論サポートとVertex AI マルチモーダル埋め込みコスト追跡を追加
- Gemini音声入力サポートとSagemakerレスポンスの特殊トークンの処理を追加
- MCP（Model Caching Proxy）の改善、SSE MCPサーバーの使用サポートを追加
- Google AI Studio /v1/files アップロードAPIサポートを追加
- Gemini画像生成出力サポートを追加
- VertexAI gemini-2.0-flashのサポートを追加
- DBRX Anthropicのthinkingとresponseフォーマットをサポート

### 重要な修正
- キャッチされない例外のJSONフォーマットを追加
- チャートでのttlSecondsAfterFinishedの誤ったインデントを修正
- Anthropicのthinkingとresponse_formatを修正
- OpenRouterキーエラーに関する情報メッセージの表示を追加
- DBのデッドロックを減らすために、Redisに支出更新を保存し、その後DBにコミット
- Azure o-seriesツール呼び出しの修正
- VertexAI資格情報のキャッシュ問題を修正
- DB取引アーキテクチャv2のデッドロック削減 - メモリ内キューに最大サイズとバックプレッシャー機構を追加
- Anthropicツール呼び出しのプロンプトキャッシュを修正

### 信頼性と監視の向上
- Prometheusでログ失敗メトリクスにLLMプロバイダーを追加 - LiteLLMエラーとLLM APIエラーを区別しやすく
- /metricsエンドポイントに認証を追加する機能
- 新しいDB取引アーキテクチャの運用メトリクスを発行

### UI改善
- 新しい使用状況タブの修正
- ユーザーサインアップ時の「デフォルトキー」を削除し、個人キー作成に利用可能なユーザーモデルの表示を修正
- テストキーv2ページ - 画像エンドポイントのテストを可能にし、ページを改良
- Microsoft SSOでSSOユーザーをチームに割り当て可能に

## v1.65.4-nightly（8時間前にリリース）

ナイトリービルドには、安定版と同様の機能と修正が含まれていますが、より最新のものとなっています。

## v1.65.3-nightly（2日前にリリース）

このビルドでは以下の主な変更点がありました：

- 非管理者のユーザー日次アクティビティ利用を許可
- チーム管理者がチームモデルを更新できるように修正
- Cohereチャットトランスフォーメーションにmax_completion_tokensのサポートを追加
- Geminiルート埋め込みのオプションパラメータマッピングサポートを追加
- PodLockマネージャーにRedisを使用してPG（PostgreSQL）の代わりにデッドロックを防止

## v1.65.2.dev1（4日前にリリース）

主な変更点：

- OpenRouterストリーミングの修正とAnthropic 'file'メッセージサポート
- Databricks llama3.3-70bエンドポイントとDatabricks Claude 3.7 Sonnetエンドポイントを追加
- モデル料金にgemini-2.5-pro-exp-03-25を追加
- max_parallel_requests = 0の場合の「循環参照検出」エラーを修正
- RedisとDBアーキテクチャが支出を正確に追跡するよう確保
- サービスアカウントの修正 - service_account_settings.enforced_paramsをサービスアカウントにのみ適用
- 仮想キーベースのポリシーをAim Guardrailsに追加

## まとめ

最新のLiteLLMリリースでは、多様なLLMプロバイダーへの対応強化、システムの信頼性向上、UIの改善が進められています。特に注目すべき点は：

1. マルチモーダル機能の拡充（音声入力、画像生成など）
2. DB処理アーキテクチャの最適化によるパフォーマンス向上
3. チーム管理・認証機能の強化
4. 主要LLMプロバイダー（Anthropic、Vertex AI、Geminiなど）との連携強化

## 負荷テスト結果

最新の安定版v1.65.4-stableの負荷テスト結果：
- リクエスト成功率: 100%（1842リクエスト、0失敗）
- 平均応答時間: 223.77ms
- 毎秒リクエスト数: 6.15
- 最小応答時間: 181.88ms
- 最大応答時間: 4326.02ms

## Dockerで実行する方法

```bash
docker run \
-e STORE_MODEL_IN_DB=True \
-p 4000:4000 \
ghcr.io/berriai/litellm:main-v1.65.4-stable
```

内部プロキシを維持したくない場合は、Hosted Proxy Alphaをご検討ください：
https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat
【Git】自分用メモ（随時更新）

GitHubでのIssue対応についての自分用メモ。

---

## 1. 作業ブランチの作成
ローカル環境で、`main`ブランチから作業ブランチを作成。

```bash
git checkout main
git pull origin main  # 最新状態を取得
git checkout -b feature  # 作業ブランチ名はチーム方針に従う
```
## 2. 修正完了後
修正完了後は以下を実施してpushする
```bash
git status # 変更箇所確認
git diff # 差分確認
git add -A # 全ての変更をステージングエリアに追加
git commit -m  "Issue対応: コメント内容"　 #コミット
git push origin HEAD #push
```

## 3. Pull Requestの作成
プルリクエスト時のコメント等はチーム方針に従う。
生成AIアーキテクチャパターン適用戦略編


https://qiita.com/taketo_higashi/items/cc1e07df82235b8918d3

チートシートはちょっと受け身な感じもするので、戦略的に採用するパターンにたどり着くような立案のプロセスをChatGPT(o3-mini）に提案してもらいました。こっちの方がチートシートより簡潔にアプローチできるイメージがありました。ご参考、以下です。

## 1. ユーザー／環境コンテキストの取得
課題例: ユーザーが与える入力が不完全・曖昧で、追加情報が必要。

対話だけで十分 → Passive Goal Creator 対話インターフェース上での明示的なゴール抽出・補完を行う 。

周辺情報（画面キャプチャ・ジェスチャー等）が必要 → Proactive Goal Creator センサやスクリーンショット等を用い、ユーザー意図を能動的に補足。

## 2. プロンプト／レスポンスの標準化
課題例: 外部ツールや他エージェント連携時にフォーマットがバラバラ。

必須 → Prompt/Response Optimiser テンプレートに従いプロンプト・レスポンスを整形し、相互運用性と目標適合性を担保。

## 3. 知識補完の要否
課題例: ドメイン固有データをモデルが学習しておらず、外部知識が必要。

必要 → Retrieval Augmented Generation (RAG) ベクトルストア等から最新・機密データを取得し、モデル呼び出しに組み込む 。

不要 → スキップ

## 4. モデル呼び出し戦略
課題例: 低コストで全体計画を素早く立案したい vs. 詳細な検証が必要。

一回で全体計画生成 → One-Shot Model Querying コスト効率・シンプルさ重視。ただし詳細不足・説明性欠如に注意 
。

ステップ毎に呼び出し → Incremental Model Querying 文脈ウィンドウ制限回避・説明性向上。ただし呼び出し回数増加によるオーバーヘッドに注意。

##5. 計画生成パターン
課題例: 明確な一連手順がある vs. ユーザー選択肢を含む多様なルートが必要。

単一路線の計画 → Single-Path Plan Generator CoT（Chain-of-Thought）等で効率的に直線的計画を生成 。

複数分岐の計画 → Multi-Path Plan Generator ユーザー確認を挟みつつ多様性・包括性を確保（Tree-of-Thoughts等） 。

## 6. 計画の検証・改善プロセス
課題例: 計画に誤り・抜け漏れがある可能性。

自己検証 → Self-Reflection 自己一貫性チェックで高速反復。ただし評価精度に限界あり citeturn1file0。

他エージェント検証 → Cross-Reflection 専門エージェントを利用し、より包括的に精度向上。ただし責任所在が複雑化。

人手検証 → Human Reflection ユーザー／専門家のフィードバックで調整。透明性・受容性向上 。

## 7. マルチエージェント協調方式
課題例: 複数エージェントで最適解を合意形成したい。

投票による合意 → Voting-based Cooperation 公平性・説明責任を確保しつつ集合知を活用 。

役割分担 → Role-based Cooperation プランナー／ディスパッチャー／ワーカーなど明確な役割でスケーラビリティ確保 。

議論型 → Debate-based Cooperation 反証・討論を経て批判的思考を促進。ただしオーバーヘッド大 。

## 8. セーフティ＆ガバナンス
課題例: 悪意ある入力や法規制対応が必要。

入出力監視 → Multimodal Guardrails ルール／AIベースで入出力を検査し、安全・適合性を担保。

## 9. 外部ツール・エージェント管理
課題例: 多数のプラグインやエージェントから最適なものを選びたい。

レジストリ → Tool/Agent Registry メタデータカタログで探索性・適切性を担保 。

インターフェース変換 → Agent Adapter 各ツールAPIをラッピングし、エージェント連携を容易化 。

## 10. パフォーマンス評価
課題例: エージェント品質を定量的に把握・改善したい。

評価モジュール → Agent Evaluator 機能適合性や適応性をテスト・ベンチマークし、運用前後で品質を維持 。

適用のポイント
非逐次的実装：各パターンは独立して適用可能。マイクロサービス的に組み合わせる。

トレードオフの把握：緑＝得られる効果、橙＝注意すべき副作用を常に意識。

反復的チューニング：初期段階ではシンプルなパターンから始め、運用データを元に徐々に複雑化。

この戦略モデルを参照しながら、自身のアプリケーション課題に合わせてパターンを選択・組み合わせることで、FMベースエージェントの設計と実装を効率的かつ効果的に進められます。
macのPostgreSQLをバージョン変更してみた(Homebrew)

<h1>モチベーション</h1>
現在Rails環境構築が不完全でアプリ開発できていない。
Railsバージョン更新を行ったことが一因として挙げられる。
関連アプリのバージョンを更新する一環でPostgreSQLのバージョン更新を記録する。

参考記事[1]をベースに作成しました！とても分かりやすいです！

<h1>実行手順</h1>
<h2>1. 現在のpostgreSQLのバージョン確認</h2>

```ruby:ターミナル
$ psql --version
psql (PostgreSQL) 14.17 (Homebrew)
```

<h2>2. Homebrewから取得できるpostgreSQLのバージョン確認</h2>
チェックがついているものがインストールしてあるもの。
以前アップデートのためインストールした@17があります。
@14を削除して@17のみを残します。

```ruby:ターミナル
$ brew search postgresql
==> Formulae
postgresql-hll       postgresql@12        postgresql@14 ✔      postgresql@16        qt-postgresql
postgresql@11        postgresql@13        postgresql@15        postgresql@17 ✔      postgrest
```

<h2>3. 現在のpostgreSQL@14のアンインストール</h2>

```ruby:ターミナル
$ brew uninstall postgresql@14
Uninstalling /opt/homebrew/Cellar/postgresql@14/14.17_1... (3,330 files, 45.9MB)
```
<h2>4. アンインストール確認</h2>

```ruby:ターミナル
$ brew search postgresql
==> Formulae
postgresql-hll       postgresql@12        postgresql@14        postgresql@16        qt-postgresql
postgresql@11        postgresql@13        postgresql@15        postgresql@17 ✔      postgrest
```

<h2>5. バージョン確認</h2>
@17があるはずなのにnot found。次で再リンクを行います。

```ruby:ターミナル
$ psql --version
zsh: command not found: psql
```

<h2>6. リンク解除</h2>

```ruby:ターミナル
$ brew unlink postgresql@17
Unlinking /opt/homebrew/Cellar/postgresql@17/17.4_1... 0 symlinks removed.
```

<h2>7. 再リンク</h2>

```ruby:ターミナル
$ brew link postgresql@17
Linking /opt/homebrew/Cellar/postgresql@17/17.4_1... 802 symlinks created.

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
```

上記のように"echo 'export PATH=~"をやるように！と言われます。これは「zshのような環境変数を格納しておくファイルにパスを保存しておいてね。保存しておかないとDB使う時にパスがわからなくてエラー表示するよ。」の意味みたいです[2]。
以下ではパスがzshにそもそもあるか確認、保存して再確認します。

<h2>8. 環境変数格納パスの確認・保存・再確認</h2>
<h3>8-1. 環境変数格納パス一覧表示</h3>

以下を実行すると、指定されたパス("/opt/homebrew/opt/~")がないことが分かりました。
```ruby:ターミナル
$ echo $PATH | sed -e 's/:/\n/g'
・・・(省略)・・・
/opt/homebrew/bin
/opt/homebrew/sbin
/usr/local/bin
・・・(省略)・・・
```

```
<h3>8-2. PATHの設定</h3>
指定コマンドをそのまま入力[3]。特に出力はありません。

```ruby:ターミナル
$ echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
```

<h3>8-3. PATHの保存</h3>
以下のコマンドでPATHを保存[3]。これも特に出力はありません。

```ruby:ターミナル
$ source ~/.zshrc
```

<h3>8-4. 保存したPATHの確認</h3>
以下のコマンドでPATHを保存[3]。8-2で保存したパスが表示されれば完了！

```ruby:ターミナル
$ which psql
/opt/homebrew/opt/postgresql@17/bin/psql
```

<h2>9. バージョン確認</h2>
リンクできました。

```ruby:ターミナル
$ psql --version
psql (PostgreSQL) 17.4 (Homebrew)
```
<h1>まとめ</h1>
macでHomebrewのpostgreSQLバージョン更新を行いました。
環境構築の進展があれば記事とともに報告します。
この記事が誰かの役に立てられれば幸いです。
閲覧ありがとうございました。

<h1>参考資料</h1>
[1]@yuppymam.(2023).【Mac】Homebrew を使って PostgreSQL を動かす.https://qiita.com/yuppymam/items/fad4eec0c5b7d6c86517

[2]@ishidao(石田尾 豪).(2022).開発者であれば最初はきっと沼る、PATHと.zshrc周りを調べまくったので備忘録.https://qiita.com/ishidao/items/769b2e9acfc2ce4542b6

[3]Curry (id:dev-0).(2025).PostgreSQLをmacにHomebrewでインストールする手順.https://mkdir-cd.hatenablog.com/entry/2025/01/06/232458