OmniAICreator/Qiita-1.07M huggingface dataset:
macOSのsandbox-execをためしてみた

## 1. もっとも手軽 ― 組み込みプロファイルで実行

macOS には **`no-network`** や **`strict`** などの組み込みプロファイルが用意されています。

```bash
# ネットワークを禁止した状態で curl を試す（失敗するはず）
sandbox-exec -n no-network /usr/bin/curl https://example.com
```

- `-n <name>` で組み込みプロファイル名を指定  
- `no-network` はすべてのネットワークアクセスを拒否します

---

## 2. 独自プロファイルをファイルで書いて実行

1️⃣ プロファイルを書く（例: **`allow_ls.sb`**）  

```scheme
;; allow_ls.sb
(version 1)

(deny default)                 ; まず全部拒否
(allow process-exec            ; /bin/ls の実行を許可
       (equal "/bin/ls"))
(allow file-read*              ; ~/tmp だけ読み取り/書き込み可
       file-write*
       (regex "^/Users/leo/tmp"))
```

2️⃣ コマンドを走らせる  

```bash
sandbox-exec -f allow_ls.sb /bin/ls /Users/leo/tmp
```

ポイント
| 行 | 説明 |
|----|------|
| `(deny default)` | まずは全て拒否 ― “ホワイトリスト方式” で書き始めるのが鉄則 |
| `(allow process-exec …)` | 実行できるバイナリをピンポイントで許可 |
| `(allow file-read* file-write* …)` | 読み書きパスを正規表現で限定 |


---

## 3. 即席ワンライナーでプロファイルを渡す

ファイルに書かずに **ヒアドキュメント** で済ませる方法です。

```bash
sandbox-exec -p \
'(version 1)
 (deny default)
 (allow file-read*
        (literal "/etc/hosts"))' \
/bin/cat /etc/hosts
```

---

## 4. 便利な開発テクニック

| テクニック | 使いどころ |
|-----------|------------|
| **`(debug deny)`** を一番上に書く | sandbox で拒否されたときのログを詳しく出す |
| **`(with no-log ...)`** を併用 | ログが多すぎる場面で絞り込みたいとき |
| 環境変数 `SANDBOX_DEBUG_INFORMATION=YES` | syslog から sandbox の違反原因を確認 |

---

### よくあるハマりどころ

1. **パス指定の落とし穴**  
   - `/bin/ls` を許可しても実行実体が `/usr/bin/ls` なら拒否されます  
   - `which ls` で正確なパスを確認しましょう
2. **GUI アプリには別 API**  
   - GUI アプリのサンドボックスは *App Sandbox*（Entitlement ベース）で、`sandbox-exec` は CLI 向けです
3. **macOS Ventura 以降の制限**  
   - SIP (System Integrity Protection) や EndpointSecurity 連携で挙動が変わる場合があります

---

## まとめ

- **`sandbox-exec` は “deny default” で書き始める** のが安全
- テキストファイルに **Scheme ライク** なポリシーを書いて `-f` で渡す  
- ネットワーク禁止など軽い試験なら **組み込みプロファイル** が手っ取り早い

これで macOS 上での簡易サンドボックス実行が試せます。
【長文】うつ病で24新卒入社取り消しになりました。Nekotaといいます。人生の経歴を書きます。

## 初めまして、Nekotaといいます。
広島工業大学情報学部情報コミュニケーション学科を卒業し、IT系の中小企業に内定をもらっていたのですが・・・

### 3月頃、うつ病が悪化し、更にOD(オーバードーズ)をしながらDiscord上で出会った男性と勢いで交際し、スマホの電源を切って情報を遮断してしまったのです。
(当時付き合ってた彼氏にいきなり別れを告げました、、残酷)


そして、広島にある実家を飛び出し東京のホテルを転々とし、広島に帰ってはまた市販薬等のODを繰り返していました。


ある日、電話がかかってきて社長と人事のお姉さんに会うことになり・・・の
>社長「どうして1カ月も連絡を取れなかったの？」
>Nekota「(ODしまくって彼氏とホテル転々としながら遊び惚けてたなんて言えない・・・)」
>社長「他の内定者は全員研修を終えて、契約も済んでいる。君だけが何も進んでないんだ。何があったんだ？」
### Nekota「実は私、うつ病にかかってまして・・・」

### うつ病経験者なら首がもげるほど分かるはず、

## "病気のせいにしたくない"

### を手札として使ってしまいました・・・。

そして役員と私の親と会議になり、最終的に内定辞退という形になりました。

自業自得です。

病気のせいにして甘えたくはないですが、、、

## 人生
ちなみに、当時は診断は下っていませんでしたが生まれつき選択制場面緘黙症という人と話すときに言葉が出なかったり、動けなくなる精神障害を持っていました。

高校２年の同級生(恐らくかなりのアスペルガー)となんとなくのきっかけで付き合うことになり、上手く感情を共有出来たり話し合いが出来たりしなかったため、カサンドラ症候群(当時も病院に通っていないので診断は下ってない)に・・・これがうつの引き金となりました。

そして19歳、コロナ禍の中なんとか対面授業になった頃、私は自〇を決意しました。

### 卒業するまでに死んでおこう。そうすれば親にこれ以上負担もかけないし、社会のお荷物にもならない。最善の選択だ。

そう思い込んでいました。

そして、どうせ〇ぬなら最期に人と話してみよう。と思い自分の中の限りある根性で人と話せるようになりました。
それまでの人生で一度も支援を受けたことはありません。親にも理解されず、療育や心療内科等にも通ったことはありませんでした。
死ぬ気でやれば出来るもんなんだな、と思いました。
それから大学生活においても白黒思考で、「単位を取れなかったら〇ぬ」と意気込んで大学３年後期までGPAは3.75ほどを維持していました。

サークルも４つ掛け持ちし、学生自治会文化局という文化系サークルを取りまとめる部の局長にもなりました。

他サークルでは、後輩たちにC言語を教えたりテストを作成したりし、また他ではWebサイト制作をし、またまた他では起業をしようとしたり・・・

とにかく死ぬ気満々だったので何でもやれました。

基本情報技術者試験も一夜漬けで何とか合格。

21歳の夏、大学特有のなっげ～夏休みを利用して精神科の開放病棟に入院しました。理由は「とりあえず、一応」って感じでした。
1ヵ月半ほどめちゃくちゃ暇な時間を過ごし、適切なご飯と服薬を続けると、頭の中にかかっていた霧(ブレインフォグというらしいです)がきっぱりと晴れ、やる気に満ちるようになりました。

それがなんでああなってしまったんだろう・・・・

そんな失敗を今も引きずりながら、ITとは全く関係のないラウンジでフリーターやってます。


スパゲティのような文章でしたが、ここまで読んでくださりありがとうございました。

## 【完】
pandas.read_csv: 数値に変換できない値が格納されているCSVを読み込むと、すべての値の型は文字列型である

# 環境
* Python 3.13.1
* pandas 2.2.3


# 内容
以下のような、`value`列にいろんな種類の値が格納されているCSVを読み込みたいです。

```csv:bar.csv
key,value
count,1
name,alice
```


https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

当然といえば当然なのですが、数値と数値以外が混在していると、すべての値は文字列型です。

```
In [52]: df=pandas.read_csv("bar.csv")

In [53]: df.dtypes
Out[53]:
key      object
value    object
dtype: object

In [54]: df["value"]
Out[54]:
0        1
1    alice
Name: value, dtype: object

In [55]: for v in df["value"]:
    ...:     print(f"{v=}, {type(v)=}")
    ...:
v='1', type(v)=<class 'str'>
v='alice', type(v)=<class 'str'>
```

数値に変換できる`'1'`は、数値型に変換されるものだと思い込んでいたので、少しハマりました。
`pandas.to_numeric`: `errors="ignore"`を指定した場合、数値に変換できない要素のみ無視されるのではなく、変換が実行されない

# 環境
* Python 3.13.1
* pandas 2.2.3


# やりたいこと

`pandas.Series`には文字列型の値が格納されています。数値型に変換できる要素のみ数値型に変換したいです。

```
In [29]: s = pd.Series(['apple', '2'])
In [30]: s
Out[30]:
0    apple
1        2
dtype: object
```

# ハマったこと

[pandas.to_numeric](https://pandas.pydata.org/docs/reference/api/pandas.to_numeric.html)を使って、`errors="ignore"`を指定しました。

```
In [36]: s_ignore = pd.to_numeric(s, errors="ignore")
<ipython-input-36-10ba5326fdc0>:1: FutureWarning: errors='ignore' is deprecated and will raise in a future version. Use to_numeric without passing `errors` and catch exceptions explicitly instead
  s_ignore = pd.to_numeric(s, errors="ignore")

In [41]: s_ignore
Out[41]:
0    apple
1        2
dtype: object

In [37]: for v in s_ignore:
    ...:     print(f"{v=}, {type(v)=}")
    ...:
v='apple', type(v)=<class 'str'>
v='2', type(v)=<class 'str'>
```

`'2'`は数値型に変換されることを期待しましたが、変換されませんでした。

>* If ‘raise’, then invalid parsing will raise an exception.
>* If ‘coerce’, then invalid parsing will be set as NaN.
>* If ‘ignore’, then invalid parsing will return the input.

`return the input.`の`input`は、引数に渡したpandas.Seriesそのものを指しているようです。

# 解決
`errors="coerce"`を指定して解決しました。

```
In [38]: s_coerce = pd.to_numeric(s, errors="coerce")

In [40]: s_coerce
Out[40]:
0    NaN
1    2.0
dtype: float64

In [39]: for v in s_coerce:
    ...:     print(f"{v=}, {type(v)=}")
    ...:
v=nan, type(v)=<class 'float'>
v=2.0, type(v)=<class 'float'>
```

# 補足

## `errors="ignore"`はひすいｓ
>“ignore” is deprecated. Catch exceptions explicitly instead.
Ruby on RailsのMVCの流れを暗記を極力せずに理解する

## 背景 前提知識
MVCの流れを何回も忘れなるので忘れないようにしたい。
ファイルはある程度記載済みとする。

## 1. MVCをCMVと覚え直す　
C コントローラー　そのままの意味　普通はとりあえずコントローラーからスタートだよねのイメージ
M モデル 英単語だと雛形、原型の意味、そこからデータベースの雛形とイメージする
V ビュー　英単語だと景色の意味、そこから、ユーザーが見ている画面とイメージ

## 2.自分がWebサイトを見ていることを想像する
まずとあるURL(localhost:3000/tasks)にアクセスするとする。
ちなみにブラウザでURLを直接入力したり、リンクをクリックした場合は、仕様により必ずHTTPリクエストGETメソッドが発動する。

## 3. HTTPサーバがリクエストを受け取る
Railsアプリは通常、PumaなどのHTTPサーバ上で動いている。
このサーバが最初にリクエストを受け取り、Railsアプリケーションに処理を渡す。

## 4. ルーティング（地図のようなもの）ファイルに移動
ルーティングファイルに到着し中身を確認してみる。
```ruby
get "tasks", to: "tasks#index"
```
これによるとlocalhost:3000/tasksにアクセスしてそれがgetメソッドなら
tasks コントローラーにある
の
index　アクション
を
発動せよと書いてある。

## 5.コントローラー（C）に移動
```ruby
class TasksController 以降省略
 def index
     @tasks = Task.all
 end
```
Tasksコントローラー行ってみると、確かにindexアクションがある。
それによると
.allはモデルが持つ「全データ取得」メソッド
よってTasksはRailsの「モデル」クラス

## 6.モデルに移動（M）に移動
```ruby
class Task < ActiveRecord::Base
end
```
ここには何も書かれていないが、親クラスはActiveRecordモジュールの中のBaseクラス。このBaseクラスがallメソッドを持っているため、Taskクラスもallメソッドを使える。

## 7.データベースに移動
ActiveRecordが Task.allを翻訳してくれ、「tasksテーブルの全データを取得するSQL文
```sql
SELECT * FROM tasks
```
を唱えて、データが取得できる。
このためSQLを意識せずにデータベース操作ができる。

## 8.コントローラー（C）に戻る
```ruby
class TasksController 以降省略
 def index
     @tasks = Task.all
 end
```
とってきたデータを@tasksに代入。
Rubyでは、変数名の先頭に@を付けると、それは「インスタンス変数」になる。
インスタンス変数を定義すると、その値はコントローラーのアクション内だけでなく、対応するビューでも使えるようになる。

3行目はTaskのモデルからallメソッド使ってデータを取得して、左辺は@か、じゃあビューに渡したいのねというイメージ　

renderやredirect_to などの明示的な描画指示がなけばアクション名と同じ名前のviewテンプレートを自動的に探して描画する。例えば、PostsControllerのindexアクションならlocalhost:3000/views/posts/index.html.erbが自動的に呼び出される。

## 9. ビュー（V）に移動
とってきた@tasksは配列に似たオブジェクトなのでそれを分解して、htmlで表示する。
Ansible学習メモ④（Container関連)

業務で最近Ansibleを使い始めました。私自身はエンジニア職ではないので普段コーディングをほとんどしないです。少しAnsibleがわかるように学習し始めています。

### 1. AnsibleでLinux Centos環境にDockerインストール
こちらの三つのモジュールを使用
ansible.builtin.rpm_key
ansible.builtin.yum_repository
ansbile.builtin.yum

作成するマニフェストtest.yamlは以下のようです。
```
---
- name: install docker to redhat like system
  hosts: all
  become: true
  tasks:
    - name: add rpm_key
      ansible.builtin.rpm_key:
        key: "https://download.docker.com/linux/rhel/gpg"
        state: present

    - name: Add repository
      ansible.builtin.yum_repository:
        name: docker
        description: docker repository
        baseurl: "https://download.docker.com/linux/rhel/$releasever/$basearch/stable"
        enabled: true
        gpgcheck: true
        gpgkey: "https://download.docker.com/linux/rhel/gpg"

    - name: install Docker
      ansible.builtin.yum:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
        state: latest
        update_cache: true

    - name: Start Docker
      ansible.builtin.service:
        name: "docker"
        enabled: true
        state: started
```
inventoryファイルを以下のように設定
```
XX.XX.XX.XX ansible_ssh_private_key_file=~/XXXXX.pem
```
(XX.XX.XX.XX: 対象マシンのIPアドレスまたはホスト名)

以下のコマンドを実行し、対象マシンにパッケージインストールを行う。
```
ansible-playbook -i inventory test.yaml
```

### 2. Apache webサーバをコンテナ(Podman)としてデプロイする
※Podmanは、Dockerの代替として、Red Hat Enterprise Linux 8以降で導入され、現在RHELシステムではPodmanの使用を推奨
そのため、本タスクではDockerの代わりにPodmanを使用。

本タスクでは以下のモジュールを使用する。
ansible.builtin.yum
containers.podman.podman_image （イメージをプール）
containers.podman.podman_container (コンテナを実行）

まず、コレクションのインストール必要
```
ansible-galaxy collection install containers.podman
```
作成するマニフェストtest.yamlは以下のようです。
```
---
- name: Podman container demo
  hosts: all
  become: true
  tasks:
    - name: install podman
      ansible.builtin.yum:
        name: podman
        state: latest

    - name: pull image
      containers.podman.podman_image:
        name: httpd
        pull: true

    - name: run podman container
      containers.podman.podman_container:
        name: webserver
        image: httpd
        state: started
        detach: true
        expose:
          - 80
        ports:
          - 8080:80
```
inventoryファイルを以下のように設定
```
XX.XX.XX.XX ansible_ssh_private_key_file=~/XXXXX.pem
```
(XX.XX.XX.XX: 対象マシンのIPアドレスまたはホスト名)

以下のコマンドを実行し、対象マシンにパッケージインストールを行う。
```
ansible-playbook -i inventory test.yaml
```
🔐 Mac Studioを公開鍵のみでセキュアにSSH運用するまでの記録

先日Mac Studio M4Maxモデルを購入し、外部からここで動かした将棋AIを叩きたいぜ!と思ってSSHサーバーのセットアップを行いました。セキュリティ強化の過程を、自分用のメモも兼ねてまとめます。「なぜパスワード認証が無効にならないのか？」と悩んだ方の参考になれば幸いです。

✅ 背景と発端

自宅サーバーとして使っているMac Studioに、iPhoneやWindowsからSSHで接続したい。

ただしパスワードによるログインは絶対に許可したくない（公開鍵認証のみにしたい）。

Available client authentication methods: password,keyboard-interactiveと表示され、意図しない認証方式が有効になっている可能性に気づいた。

🔍 原因調査と判明したこと

macOSのsshd_configは次のように書かれていました：

Include /etc/ssh/sshd_config.d/*
...
UsePAM no

一見すると UsePAM noが有効に見えますが、Includeの後に UsePAMを記述しても優先されないことが判明。

OpenSSHの仕様では、最初に出現した値が優先される（後勝ではなく、先勝）。

/etc/ssh/sshd_config.d/100-macos.confに UsePAM yesが書かれているため、これが有効になっていた。

🔧 実施した対策：01-custom.conf 作成

macOSは /etc/ssh/sshd_config.d/にある設定ファイルを辞書順で読み込むので，

次のファイルを作成：

sudo nano /etc/ssh/sshd_config.d/01-custom.conf

内容：

PasswordAuthentication no
KbdInteractiveAuthentication no
UsePAM no

これにより、UsePAM yesより前に UsePAM noが読み込まれるようになりました。

🔁 設定の反映と確認

sudo /usr/sbin/sshd -t
sudo launchctl kickstart -k system/com.openssh.sshd

反映されたかどうかは以下で確認：

sudo /usr/sbin/sshd -T | grep authentication
sudo /usr/sbin/sshd -T | grep usepam

期待される出力：

passwordauthentication no
kbdinteractiveauthentication no
pubkeyauthentication yes
usepam no

✅ 結果

公開鍵認証のみでログインが許可されるようになった。

UsePAMを無効化したことで、keyboard-interactive認証も無効化。

セキュアな状態で、安心してSSH接続ができるようになった。

📋 まとめ

macOSのsshd設定では、Includeディレクティブの位置と読み込み順が非常に重要とのことですUsePAM noを有効にするには、01-custom.confのような早い順序の設定ファイルを作成するのがもっともシンプルで安全な方法でした。

SSHの設定をしっかりしておくことで、自宅Mac Studioをより安心して外部から活用できるようになりました。
OJT 番外編 監視設定をしてみる

## はじめに
前回作成したEC2に対し、監視設定を行う

### 最終目的
監視設定をする

### 監視設定とは
監視設定とは、対象のサーバーを監視し以上があった際にアラート(警告)を出し必要に応じて対応するために行います。

:::note info
監視設定を行っていないと、サーバーが動作していない事に気づくのが遅れ、お客様に多大なご迷惑をおかけすることになります。
:::

### 利用するツール
とくになし

## CloudWatchを使い監視設定をする
### SNSの設定をする
- アラート発生後、メールを送信し検知できるようにしたいのでSNSの設定をする
:::note info
SNS=Amazon Simple Notification Service
ざっくり説明すると、登録したメールアドレスにメールを送信するサービスです。
:::
- SNSの画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/5ab6352a-b6a6-4d74-9512-7fb76e7f1d28.png)
- 左側のトピック、トピックの作成の順でクリックする
- 以下の表に従い入力し、トピックの作成をクリック

|項目|設定値|
|--|--|
|タイプ|スタンダード|
|名前|OJT-[自分の苗字]-alarm|
|表示名|OJT-[自分の苗字]-alarm|

- 作成後以下画面に移動するので、サブスクリプションの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/2d9b0fc5-360b-4e4f-8efe-a6ac7869ca67.png)
- プロトコルはE-メール、エンドポイントは自分のメールアドレスを入力しサブスクリプションの作成をクリックする
- 自分のメールに認証通知がくるので、認証する
:::note info
認証をしないと、アラートメールが届かないので注意してください。
また認証メールの認証方法は自分で調べてください。
:::
### CPU使用率の監視設定
- AWSコンソールにログインし、CloudWatchを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/6b56b5e8-80d7-4524-9432-59e806c62e18.png)
- すべてのアラーム、アラームの作成の順番でクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/1702ae9d-db1c-4295-8499-8c4b3b583c17.png)
- 以下画像に従って進めていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/ae732349-7cb8-477b-a8c4-2a52b37db66f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/3e4ffd2c-a4b6-472a-9f55-6299f632c9a2.png)
- インタンス別メトリクスをクリック
- 監視設定をしたいEC2のインタンスIDをコピーし以下に貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/b7883b19-2de4-43df-b295-8d23562bb152.png)
- 今回はCPU使用率を監視するのでCPUUtilizationの欄のチェックボックスにチェックをいれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/e42b1d61-6e40-46c7-9eb7-1a5ab7264f3a.png)
- メトリクスの選択をクリックする
- 以下表に従い入力する

|統計|期間|しきい値の種類|アラームの条件|...よりも|
|--|--|--|--|--|
|平均値|5分|静的|より大きい|90|
- アラーム状態トリガーはアラーム状態を選択し、既存のSNSトピックから先ほど作成したトピックを選択する
- アラーム名は以下にする
```
[自分の苗字]-[対象のインタンスID]-CPUUtilization-High-90%
```
- 最終確認をし問題なければ、アラームの作成をクリックする

### 最後に
これでCPU使用率が90%以上になった場合、個人のメールアドレスに通知がくるようになります。

届いた際の対応は必要に応じて、EC2自体の再起動だったり、apache等の再起動をおこなったりします。

このあたりの対応は、保守契約時の契約内容によります。

次は、apahceの監視を行い停止した際の起動まで行っていきます。
障害対応に使える Sidekiq ジョブの調べ方 

# これなに

その昔、仕事で sidekiq を使っていたのですが、障害で死んだ sidekiq のジョブをポチポチ調べるのがしんどかったので、調べた中でいろいろわかったことをメモ。

基本的には個人的な雑記なので、読みやすさや正確性云々は考えてません。悪しからず。
あとフレッシュで正確な情報は [sidekiq の wiki ページ](https://github.com/sidekiq/sidekiq/wiki)を見るのが良い。

※ [2023年10月に note に書いた記事](https://note.com/su3_hokkaido/n/nd0734d1b3ff2)を移行しただけなのですが、基本的な仕様は変わっていないはず。もし細かいところが変わっている場合はご容赦ください。

# 便利な一覧表

- `Sidekiq::DeadSet.new` : 失敗
- `Sidekiq::Workers.new` : 実行中
- `Sidekiq::Queue.new` : 待機中
- `Sidekiq::ScheduledSet.new` : 実行予約（あんま使い所ないので割愛）
- `Sidekiq::RetrySet.new` : リトライ（同上）

# 失敗したジョブの情報取得する

### 失敗したジョブをすべて取得する

`class: CronJob::AbcJob, job_id: fd02749d-29d7-4a1c-938d-7bbbc11ba353, enqueued_at: 2023-10-22T03:05:04Z` 的な感じで書くことでリストできる

```ruby
dead_jobs = Sidekiq::DeadSet.new
dead_jobs.map {|job| "class: #{job["args"][0]["job_class"]}, job_id: #{job["args"][0]["job_id"]}, enqueued_at: #{job["args"][0]["enqueued_at"]}"}
```

### 特定の失敗ジョブの情報を取得する

時間を指定して、dead_abc_jobs.first/last/length とかも使える

```ruby
dead_jobs = Sidekiq::DeadSet.new
dead_abc_jobs = dead_jobs.scan("AbcJob").select{|job| job.args[0]["enqueued_at"].to_time > Date.new(2020,1,12)}
```

# 実行中のジョブの情報を取得する

### 実行中のジョブをすべて取得する

とりあえず全部出す

```ruby
running_jobs = Sidekiq::Workers.new
running_jobs.each {|job| job}
```

# 待機中のジョブの情報を取得する

### 待機中のジョブを全て取得する

とりあえず全部出す

```ruby
queuing_jobs = Sidekiq::Queue.new
queuing_jobs.each
```
FastAPI × LangGraph/ADK × MCPでAIエージェントをAPI化してみた（初心者向けコード付き）

# 💡 本記事を読むとできるようになること
- LangGraph or ADK で作ったAIエージェントを
- MCPサーバー経由で使えるようにして
- FastAPI 経由で呼び出し可能なAPIとして外部提供！

自然言語でリクエストを投げると、AIエージェントが裏で処理して結果を返してくれる仕組みを構築できます。

# はじめに
最近、LangGraphやGoogleのAgent Development Kit（ADK）を触ってましたが、MCPサーバーとの連携例がなかなかなくて動かし方にめっちゃ苦労しました。

そこで本記事では、以下の構成で「自然言語で指示を受けて処理するAIエージェントAPI」をゼロから立ち上げられるコードを紹介します！

```mermaid
graph LR
    user --> FastAPI
    FastAPI --> Graph[LangGraph]
    FastAPI --> ADK[Agent Development Kit]
    Graph --> MCP[MCP Server<br>SSE]
    ADK --> MCP
    MCP --> tool_1
    MCP --> tool_2
    MCP --> tool_3
```

# 🔧 使ってる技術
- Python 3.12+
- LangGraph（LangChain製のエージェント実行フレームワーク）
- Google Agent Development Kit（ADK）
- MCP（Model Context Protocol）サーバー
- FastAPI（エージェントをAPI化）

# 📁 構成とリポジトリ

以下のリポジトリに、各構成要素をディレクトリ単位で整理しています。
詳細は[Github](https://github.com/Kewton/adk-mcp-starter)をご参考ください。

📦 [GitHub: Kewton/adk-mcp-starter](https://github.com/Kewton/adk-mcp-starter)

├── sample-mcp-server         # MCPサーバー本体
├── sample-adk-agent          # ADKエージェント（* 今回は使用しない）
├── sample-langGraph-agent    # LangGraphエージェント（* 今回は使用しない）
└── sample-fast-api           # FastAPIラッパー

# 🚀 セットアップ手順（超ざっくり）
1. リポジトリをクローン
    ```bash
    git clone https://github.com/Kewton/adk-mcp-starter.git
    cd adk-mcp-starter
    ```
1. 各モジュールのセットアップ
    **mcp-server**
    ターミナルを起動して下記コマンドを実行します。
    ```bash
    cd sample-mcp-server
    python3 -m venv venv
    source venv/bin/activate
    
    pip install --upgrade pip
    pip install -r requirements.txt
    ```

    **ADK-AgentとLangGraph-AgentをラッピングするFastAPI**
    ターミナルを起動して下記コマンドを実行します。
    ```bash
    cd sample-fast-api
    python3 -m venv venv
    source venv/bin/activate
    
    pip install --upgrade pip
    pip install -r requirements.txt
    ```

1. .env ファイルを用意（APIキーやSSE URLを設定）
    例：
    **sample-mcp-server/.env**
    ```env
    HOST=127.0.0.1
    PORT=8001
    ```
    
    **sample-fast-api/.env**
    ```env
    OPENAI_API_KEY=<your api key>
    GOOGLE_API_KEY=<your api key>
    LOG_DIR=./log
    LOG_LEVEL=INFO
    SSE_SERVER_PARAMS_URL=http://localhost:8001/sse
    ADK_AGENT_MODEL=gemini-2.0-flash
    GRAPH_AGENT_MODEL=gpt-4o-mini
    ```
1. それぞれ起動していく
    **MCPサーバー**
    ```bash
    cd sample-mcp-server
    source venv/bin/activate
    python main.py
    ```
    **FastAPIサーバー**
    ```
    cd sample-fast-api
    source venv/bin/activate
    uvicorn app.main:app --reload
    ```
# APIを叩いてみる（curlでOK）
1. LangGraphエージェント経由で実行
    ```bash
    curl -X POST "http://127.0.0.1:8000/aiagent-api/v1/aiagent/graph" \
        -H "Content-Type: application/json" \
        -d '{"user_input": "https://github.com/Kewton/adk-mcp-starter の記事をMarkdownに変換して"}'
    ```
1. ADKエージェント経由で実行
    ```bash
    curl -X POST "http://127.0.0.1:8000/aiagent-api/v1/aiagent/adk" \
        -H "Content-Type: application/json" \
        -d '{"user_input": "https://github.com/Kewton/adk-mcp-starter の記事をMarkdownに変換して"}'
    ```

# 👀 最後に
LangGraph や ADK に興味あるけど「実行できるコードがない…」という人の参考になれば嬉しいです！
スター・フォローも励みになります🙏
個人的備忘録：Next.jsはReactの何？どう違う？実は拡張フレームワークという話

## はじめに

Webアプリケーション開発の現場で頻繁に登場する「Next.js」ですが、その中核には「React」というライブラリが存在しています。

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

本記事では、「Next.jsとReactの関係性」について初心者にも分かりやすく解説します。

## 書こうと思ったきっかけ

私自身がNext.jsを学び始めたときに、Reactとの違いや役割分担が分かりにくく、何度も調べ直すことがありました。備忘録として残すことで、同じような疑問を持つ方の助けになればと思いまとめました。

## Next.jsとは

Next.jsは、Reactで構築されたWebアプリケーションの開発をより効率的に、かつスケーラブルにするための**Reactベースのフレームワーク**です。

主な特徴としては、以下のような機能を提供しています：

- ルーティング（ファイルベース）
- サーバーサイドレンダリング（SSR）
- 静的サイト生成（SSG）
- APIルートの作成
- デプロイしやすい構成（特にVercelとの親和性が高い）

**参考文献**

https://nextjs.org/

## Reactとの違いと関係

### Reactとは？
Reactは、Facebookが開発した**UIライブラリ**で、コンポーネントベースでユーザーインターフェースを構築します。状態管理やDOM操作をシンプルに記述できるのが特徴です。

### Next.jsはReactの拡張版
Next.jsは、Reactを土台として、その上に「ページ管理」や「データ取得」などの機能を追加したフレームワークです。

React単体では実装が面倒な以下のようなことを、Next.jsが簡単にしてくれます：

- ページ遷移のルーティング（`pages/`ディレクトリで管理）
- SEO対策を考慮したSSRやSSGの導入
- APIエンドポイントの構築（`pages/api/`）

つまり、**Next.jsはReactに「構造」と「機能性」を持たせた枠組み**なのです。

**参考文献**

https://udemy.benesse.co.jp/development/app/what-is-next-js.html

## どちらから学べばいい？

結論から言うと、**Reactの基礎を理解した上でNext.jsに進むのが理想**です。

なぜなら、Next.jsの中で書くコードの大部分はReactの構文だからです。

Reactの知識がないままNext.jsを使おうとすると、
「これってReactの仕様？Next.jsの仕様？」と混乱しやすくなります。

## まとめ

- Next.jsはReactのフレームワークであり、Reactの力を最大限に活かせるように作られている
- ReactがUI構築のライブラリなのに対して、Next.jsはルーティングやSSRなどの**アプリケーション全体を構築するための枠組み**を提供している
- まずはReactの基本を押さえたうえで、Next.jsに進むとスムーズ

Next.jsを学びながらReactの知識も深めていけるので、焦らず一歩ずつ学んでいきましょう！
ZabbixでLDAP認証のJITプロビジョニングを利用するとき

JITプロビジョニングを利用するためにはデフォルトの認証をLDAPにする必要がある（と思う）が、そうすると組み込みのAdminも認証でLDAPを見に行ってしまう。（`Zabbix administrators`グループの`Webインターフェースへのアクセス`設定が「システムデフォルト」なので）

で死ぬので、設定前に「Zabbixデータベース内のユーザー情報」でログインできるユーザーを確保しておきましょう。そういう設定のユーザーグループを作ってAdminを所属させておくのが楽。
Fivetran の Managed Data Lakes Service 構築時に Azure に Fivetran-TenantBridge を作成できない場合の暫定対応方法


## 概要

Fivetran で Managed Data Lakes Service を Azure Data Lake Storage Gen2 上に構成する際、`STEP7 Complete Fivetran configuration` の手順にある Consent URL を実行してもサービスプリンシパルが作成されない場合があります。本記事では、その場合における暫定対応方法を紹介します。対応策としては、コマンドラインからサービスプリンシパルを登録し、結果として `Fivetran-TenantBridge` というエンタープライズアプリケーションが作成される手順です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/53df5b54-0243-408e-8972-589da3c6d83b.png)

出所：[Fivetran for Managed Data Lakes Service | Setup Guide](https://fivetran.com/docs/destinations/managed-data-lakes-service/setup-guide#completefivetranconfiguration_1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99cf7d6b-957a-4e69-9e5e-ac8d0b10d839.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61a46d0d-950e-4efb-9887-2c7381454a10.png)

## 対応手順

### 1. Fivetran の画面で Consent URL が表示される `here` を右クリックし、表示されるリンクをコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bd30f3fe-dba2-42af-a41a-1d96d4e6b134.png)

### 2. コピーした URL から `client_id`（以下 sp_id）の値を取得

```text
https://login.microsoftonline.com/{tenand_id}/oauth2/authorize?client_id={sp_id}&response_type=code
```

### 3. 取得した sp_id を元に以下のコマンドを編集・実行

```bash
az ad sp create --id {sp_id}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99cf7d6b-957a-4e69-9e5e-ac8d0b10d839.png)

### 4. Entra ID の「エンタープライズ アプリケーション」で「すべてのアプリケーション」を表示し、フィルター条件の「アプリケーションの種類 == エンタープライズアプリケーション」を削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d8286ed1-7ceb-4d33-816f-f720a5fce189.png)

### 5. `Fivetran-TenantBridge` という名称のアプリケーションを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f0c755f6-782a-489d-a363-f637ff71b15d.png)

### 6. `Fivetran-TenantBridge` のアプリケーション情報を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61a46d0d-950e-4efb-9887-2c7381454a10.png)
IOPS・帯域幅・スループットの違い

IOPS（Input/Output Operations Per Second）、スループット、帯域幅は、全てデータ通信やストレージの性能を表す指標ですが、それぞれ異なる側面を測定しています。違いを理解するために、各用語を詳しく見てみましょう。

---

### 1. **IOPS（Input/Output Operations Per Second）**
- **定義**：1秒間にどれだけの入力/出力操作（I/O）が実行できるかを示す指標。
- **用途**：主にストレージデバイス（例えば、SSDやHDD）やデータベースのパフォーマンス評価に使われます。特に、小さなデータの読み書きが頻繁に行われる環境で重要です。
- **例**：「このディスクは1秒間に10,000回のI/O操作が可能」といった形で、データの読み書き回数を測ります。

---

### 2. **スループット（Throughput）**
- **定義**：ネットワークやストレージ、システム全体において、実際に転送できたデータ量の速度。
- **単位**：bps（ビット毎秒）、MB/s（メガバイト毎秒）など。
- **用途**：ネットワークやディスクI/O、ストリーミング、データ転送などの効率を測るために使われます。
- **例**：ストレージシステムで「スループットが500MB/s」という場合、1秒間に500メガバイトのデータが実際に転送されるということです。

---

### 3. **帯域幅（Bandwidth）**
- **定義**：理論的に可能なデータ転送速度、すなわち回線やストレージの「最大容量」を示します。
- **単位**：bps、Mbps、Gbpsなど。
- **用途**：ネットワークの最大転送能力を評価するために使われます。ネットワークの回線や接続の「幅」を示すため、通信速度の限界を理解するために重要です。
- **例**：ネットワーク回線の帯域幅が「1Gbps」と言われる場合、理論上1秒間に1ギガビットのデータを転送する能力があるということです。

---

### 🆚 **違いを一言で**
- **IOPS**：1秒間に実行できる入出力操作の回数（主にストレージ関連）
- **スループット**：実際に転送されたデータ量の速度（ネットワークやストレージ）
- **帯域幅**：理論的な最大データ転送能力（ネットワークやストレージ）

---

### 🚗 **たとえ話（道路に例えると）**
- **帯域幅**：道路の最大幅（車が通れる最小限の幅、理論上の限界）
- **スループット**：実際に通行した車の数（道路の混雑具合や実際の通行量）
- **IOPS**：1秒間に何回車が通過できるか（小さな車両が頻繁に出入りする場面）

---

### まとめ
- **帯域幅**は「理論的な最大速度」で、実際の速度は**スループット**に反映されます。
- **IOPS**は、ストレージやデータベースでのパフォーマンスを測るための指標で、スループットとは異なり、転送される「データ量」ではなく「操作の回数」を評価します。
個人的備忘録：フロントエンド開発で押さえておきたい「SPA / SSR / SSG」の基礎知識を整理してみた

## はじめに

フロントエンド開発において、アプリケーションの構築方法としてよく耳にする「SPA」「SSR」「SSG」。

:::note info
***これらはそれぞれ異なるアーキテクチャであり、ユーザー体験や開発コスト、SEO対策などに大きな影響を与えます。***
:::

本記事では、それぞれの特徴や違いについて整理し、選定の指針となるような解説を行います。

## 書こうと思ったきっかけ

Next.jsやNuxtなどのフレームワークを使う中で、これらの違いを正しく理解していないと感じる場面がありました。

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

また、チーム開発において方針を決める上で「なぜそれを選ぶのか？」を説明できるようになっておきたいと思い、個人の備忘録としてまとめました。

## 各レンダリング方式の特徴

### SPA（Single Page Application）
- **概要**：最初に1つのHTMLファイルを読み込み、その後のページ遷移はJavaScriptによって動的に行われる方式。
- **メリット**：
  - ユーザー体験が滑らか（ページ遷移が速い）
  - フロントエンド主体の開発に適している
- **デメリット**：
  - 初回表示が遅くなりがち
  - SEO対策が難しい（検索エンジンがJSを正しく解釈できないことがある）

**参考文献**

https://qiita.com/shinkai_/items/79e539b614ac52e48ca4

https://developer.mozilla.org/en-US/docs/Glossary/SPA

### SSR（Server Side Rendering）
- **概要**：ユーザーのリクエストに応じて、サーバー側でHTMLを生成して返す方式。
- **メリット**：
  - 初回表示が速い（HTMLが最初からレンダリングされている）
  - SEOに強い
- **デメリット**：
  - サーバー負荷が高くなりがち
  - 実装とインフラ構成がやや複雑

**参考文献**

https://qiita.com/Thang_TQ/items/1e1d86bffd2288ce1865

https://ja.vuejs.org/guide/scaling-up/ssr

### SSG（Static Site Generation）
- **概要**：ビルド時にHTMLを静的に生成しておき、ユーザーにはそのHTMLを返す方式。
- **メリット**：
  - 表示が高速
  - サーバーレス構成も可能（CDNとの相性が良い）
  - SEOに強い
- **デメリット**：
  - 動的なページ生成には向かない
  - 更新頻度が高いページは再ビルドが必要になる

**参考文献**

https://aws.amazon.com/jp/blogs/news/ssg-vs-ssr-in-next-js-web-applications-choosing-the-right-rendering-approach/

https://qiita.com/thesugar/items/47ec3d243d00ddd0b4ed

## 比較表

| 方式 | 初回表示速度 | SEO対応 | 更新性 | サーバー負荷 |
|------|---------------|----------|--------|---------------|
| SPA  | 遅い          | 弱い     | 高い   | 低い          |
| SSR  | 速い          | 強い     | 高い   | 高い          |
| SSG  | 非常に速い    | 強い     | 低い   | 低い          |

## まとめ

- **SPA** はインタラクティブなアプリケーションに向いており、ダッシュボードなどの内部ツールでよく使われます。
- **SSR** はSEOや初回表示速度が重要なサービスサイト向け。
- **SSG** は更新頻度が少ない静的サイトやブログに最適。

それぞれの特性を理解したうえで、プロジェクトの目的に合ったレンダリング方式を選択することが大切です！
Oracle Cloud 　メモ４

OCI Zero Trust Packet Routingとは？
Zero Trust Packet Routing (ZTPR) は、OCIが提供するゼロトラストセキュリティモデルに基づいたネットワーク制御機能です。
従来の「ネットワークベースの信頼（例：IP範囲での許可）」から脱却し、ユーザーやワークロード単位での精密な制御を可能にします。

ZTPRは、次の3つの柱で構成されます：

マイクロセグメンテーション：	VCNやサブネット内でも、ワークロードごとに通信制御が可能
IDベースのポリシー：	IPアドレスではなく、IAM IDに基づく通信許可（例：あるインスタンスが別のDBにアクセス可）
強制エンフォースメント：	全トラフィックは暗号化・検査され、明示的に許可された通信のみが通過（デフォルト拒否）

ZTPRはOCIのAdvanced Network Security機能の一部として提供され、以下が関係します：

VCN Security Rules with Identity Context
IAMタグ・ポリシー
VCN Flow Logs + Inspection（監視）
Service MeshやOCI Firewallとの統合（任意）

VCN Security Rules with Identity Contextとは？
これは、VCN（Virtual Cloud Network）内のセキュリティルールに「ユーザーやインスタンスのID情報（Identity）」を組み込んで制御できる機能です。
従来のように「IPアドレスだけで制御」するのではなく、OCIのIAMのコンテキスト（例：インスタンスのタグ、所属ユーザー、グループなど）を活用して、より細かく・柔軟に通信をコントロールできます。

これはOCIのゼロトラストアーキテクチャの一部です。

🔎 従来のセキュリティリストとの違い

従来の方法（セキュリティリストやNSG）	Identity Context付きセキュリティルール
IPアドレスでアクセスを許可/拒否	「誰が」や「何のインスタンスが」通信しているかを判断して許可
静的で管理が煩雑になりがち	IAMポリシー・タグベースで管理が簡潔
インスタンスが変わると設定変更が必要	タグやIDで追跡できるため柔軟性が高い
📦 使い方の例
例1️⃣：「タグ付きのインスタンス」だけがDBにアクセス可能
text
コピーする
編集する
送信元: タグ「app=frontend」を持つインスタンス
宛先: Private Subnet上のDBサーバー
ポート: TCP 1521（Oracle DB）
ルール: 許可
→ IPではなく、「タグ」でアクセス権を管理。

例2️⃣：「運用チーム」だけがSSHアクセスできるようにする
text
コピーする
編集する
送信元: IAMユーザーが属するグループ「OpsTeam」
宛先: VCN内のLinuxインスタンス
ポート: TCP 22（SSH）
ルール: 許可
→ IP制限ではなく、「誰がアクセスしているか」で制御。

✅ Identity Context で使える情報（例）
インスタンスのタグ

ユーザーのID

インスタンスの所属コンパートメント

IAMグループやポリシー情報

これらを活用することで、「信頼できるアプリだけ通信を許可」などの精密なセキュリティ制御が可能になります。

🛠 構成には何が必要？
この機能を使うには、以下のような要素が関連します：
VCN Security Rules（セキュリティリストやNSG）
Flow Logs（必要に応じて監査目的で）
IAMタグベースの制御



Security Zones 
OCIで「強制的なセキュリティポリシー」を適用できる機能です。
特定のコンパートメント（リソースのグループ）をセキュリティゾーンに指定すると、その中ではセキュリティベストプラクティスに反する操作が禁止されるようになります。

🎯 主な目的
セキュリティ設定ミスの未然防止
ゼロトラスト設計の実現
セキュリティ基準に沿ったコンプライアンス強化
開発チームによる操作でも安全性を自動保証
fedoraで²の入力

変換を無効にして Ctrl + Shift + u -> b2


![Peek 2025-04-17 13-58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/101dd9bf-fd7e-4566-93d2-89fea8d586af.gif)

Ctrl + Shift + uでunicode入力になるらしい
VMware ESXiからProxmoxVEへVM移行が簡単にできた話

## 先に結論
* Proxmoxの新しいバージョンでは、今まで出来なかったことが、出来るようになった！
* しかも簡単に！

## 背景
* VMwareESXi無償ライセンス版でVMを構築・運用
* 別環境でProxmoxの活用を開始
* Proxmoxの操作に慣れたので、VMwareESXi上のVMをProxmoxに移行したいと考える
* 手動による仮想マシンのエクスポートを以下のように検討した
    * 移行元のファイルをProxmoxにコピー
    * アーカイブを展開
    * VMDKのフォーマットを確認 (変換前に形式をチェック)
    * VMDKをqcow2に変換（明示的にraw形式を指定）
    * 仮想マシンを作成（UEFIブート対応）
    * ディスクをインポート（SCSIバスを利用）
    * ディスクを適切に設定
    * CPU設定を最適化
    * 必要ならEFIディスクを追加（UEFIの場合）
    * VMを起動
* 検証を実践するが、Diskサイズ等の関係で途中断念・放置状態

## 環境
* VMware ESXi 6.7
* ProxmoxVE 8.1.4
* ProxmoxVE 8.3.0

## 方針
* ProxmoxVE8.3.0環境にて『Live import』が利用できることを見つけた
* Live importとは？
```
仮想マシンをESXiからProxmoxへVMの停止なしで移行できる仕組み。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/09551954-cb53-45cc-a84c-2d6ea220b0ef.png)

* 前提条件:
    * ソースが VMware ESXi 6.5以降
    * Proxmox VE 8.1以降が稼働中
    * virtioやqemu-guest-agentなど、移行後に動作するようドライバ対応の確認
    * 同一ネットワーク上での通信が可能なこと（VMディスクの取り込みにおいて）

## 手順
### VMwareESXiをストレージとして認識させる
* ProxmoxVE8.3.0の環境にて、[データセンター]⇒[ストレージ]⇒[ESXi]追加
* 移行元のESXiの情報を入力して保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/df12058d-c5d3-4293-8620-b4005a46a09d.png)

### 移行元VMのVMware Toolsアンインストール
* 確認
```bash
rpm -qa | grep open-vm-tools
```

* アンインストール
```bash
yum remove open-vm-tools
```

* 確認
```bash
rpm -qa | grep open-vm-tools
```

### 移行元VMのvmwaretools 残存ファイルの削除
```bash
rm -rf /etc/vmware-tools
rm -rf /usr/lib/vmware-tools
```

### 移行元環境作業
* df -Thの確認
* VM停止

### 移行先環境作業
* Live importの設定・実行
    * ソケット、コアの値を入替
    * CD/DVDドライブのチェックを外す
    * MACアドレス確認

* Live importが進み最後に[TASK OK]と表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/2a95feb5-2e2b-43e4-a999-a82df1c4c447.png)
      
* 移行されたVM起動
* df -Thで容量の確認
* ハードウェアの情報を確認(事前に確認したMACアドレスが変わっていない事等々)

### 移行元VM削除
* 移行先環境にて、問題無い事が確認できれば移行元のVMを削除

## さいごに
* 手動で移行を検証してはうまくいかず、移行実現で困っていた
* ProxmoxVEの新しいバージョンでサラッと簡単に解決してくれた
* 新しいバージョンは過去の機能で困っていることを改善してくれる
* 新しいバージョンに目を向けるという事を今回の事象をきっかけにして考えるようになった
NetSuiteと銀行入金管理サービスの連携【概要】

## はじめに

NetSuiteはグローバルで利用されるクラウドERPですが、**日本の銀行API（オープンAPI）やFB（ファームバンキング）形式に標準対応していない**ため、入金データの自動取得・処理には課題があります。

この記事では、**銀行入金管理サービス（例：V-ONEクラウド、MFクラウド入金管理など）とNetSuiteを連携する目的、利便性、注意点、開発上の論点**を整理します。

この記事はこれからERPを導入（新規・入替）をする会社が銀行入金管理を行う場合において以下のことを想定しています。情報としましてはコピー＆ペースト的なご利用をされて問題ありません。
・なぜERPとは別で銀行入金管理（SaaS）を別途購入し使う必要があるのかを社内説明する場合
・上記必要性は社内認知されているが資料的な情報整理が必要な場合
・現時点の運用に不満があるための情報整理

---

## 1. NetSuiteにおける他社銀行入金管理サービスの必要性

NetSuiteは以下のような理由から、**日本の銀行と直接的に入金連携ができません**。

- 日本の銀行APIやFBファイル（全銀協形式）には非対応
- SuiteBankingやBank Feedsは欧米仕様であり、日本の金融インフラとの互換性がない
- 日本の銀行APIは統一仕様がなく、銀行ごとの認証・形式差が大きい

そのため、**銀行APIやFBファイルを扱える入金管理SaaSと連携することが、現実的な選択肢**となります。

ただしこの機能的な制約と有無は**NetSuiteに限ったことではなく**いわゆる外国産ERPでは殆どの場合において、銀行入金管理を他社サービスを使うかアドオンでの対応となっております。逆に言えば「周辺システム」として一般的であるためほとんどの場合においてシステム間連携がされています。
国産ERPでも設計思想が**業務管理中心の製品**、銀行API・FB対応は**周辺システムとの分業**を前提にしている製品の場合は、銀行入金管理機能を持ちません。一方で「周辺システム」を自社で持っている場合もあります。
外国産ERPには無い、国産ERPなら有るという見解は一面的であるため「銀行入金管理の有無」をERP選定の判断材料の一つに加える場合には連携の事例と連携のコストや技術的困難さも検討するべきと考えます。

---

## 2. 銀行入金管理サービスとの連携によるユーザー側の利便性

連携によって得られる業務メリットは以下の通りです。

| 利便性 | 説明 |
|--------|------|
| ⏱ 消込業務の自動化 | 振込名義や金額での自動マッチングにより、手作業の照合作業を大幅削減 |
| 🎯 消込精度の向上 | 類似名義の名寄せ、手数料差引処理、一部入金への対応なども自動で可能 |
| 📊 経営情報の可視化 | 入金ステータスがERPに即反映されることで、債権回収状況や資金繰りがリアルタイムに確認可能 |
| 🤝 営業・経理の連携強化 | 入金情報がNetSuiteに連携されることで、営業部門もリアルタイムで顧客の支払状況を確認可能 |

---

## 3. 連携上の注意点（技術・業務視点）

| 分類 | 注意点 |
|------|--------|
| データの不一致 | 銀行データの振込名義とNetSuiteの顧客名が一致しないケースが多く、名寄せロジックが必要 |
| 金額の差異 | 銀行手数料の控除や一部入金など、請求額との一致が前提でない場合の処理 |
| 消込ルール | 同一顧客の複数請求書に対する一括入金、まとめ請求・入金など、業務フローに即した設計が必要 |
| セキュリティ | 金融情報を扱うため、アクセス制御・ログ記録・暗号化が必須 |
| 二重登録の防止 | すでに消込済みの入金と同一のデータを再連携しないための排他設計が必要 |

---

## 4. 連携部分の開発に必要となる検討事項

| 項目 | 内容 |
|------|------|
| 💻 データ連携方式 | REST API、CSV取込、Webhookなどの方式を選定。リアルタイム性とコストのバランスに注意。 |
| 🔄 連携方向 | 基本は「銀行入金管理サービス → NetSuite」だが、突合結果を戻す双方向も可能 |
| 🧩 対象データ | NetSuite側は `CustomerPayment`, `Invoice`, `Deposit`, `JournalEntry` などが対象となる |
| 🔎 突合ロジック | 顧客コード、振込名義、金額、請求番号などをキーにマッチング。類似判定も検討 |
| 🧪 エラー処理 | 突合失敗時の対応フロー（手動処理、アラート、ログ出力）を設計 |
| 🔐 認証と権限 | APIキーの管理、アクセス制限、ユーザーロールごとの閲覧・登録制御も忘れずに |

---

## 5. 検討事項（次回記事）

1. 🔄 **NetSuiteでのCustomerPaymentの自動作成フロー（SuiteScript + CSV/API）**
2. 🏦 **主要な銀行入金管理サービス3種（V-ONEクラウド／AccountBank／MFクラウド）とのNetSuite連携パターン比較**
3. 🧾 **FBファイル（全銀フォーマット）をCSV変換し、NetSuiteに取り込むバッチ処理の実装例**

---

## まとめ

**NetSuiteと銀行データを扱える外部SaaSと連携して会計業務にとって来い率的な環境を構築しましょう**。本記事が導入検討・開発設計の参考になれば幸いです。

---

📌 **この記事へのコメントやご質問はお気軽にどうぞ！続編記事も予定しています。**
モンキーテストにおけるペルソナ例

### 🎯 一般的なペルソナ例（モンキーテスト向け）

| ペルソナ名 | 特徴 | 想定シナリオや行動例 |
|------------|------|------------------|
| **初心者ユーザー（ノービス）** | ITリテラシーが低く、操作ミスが多い | 無意味に何度もボタンを押す、更新を連打する、エラーを無視して進む |
| **好奇心旺盛ユーザー（クリック魔）** | すべての機能・リンクを試す癖がある | 意味もなく全メニューを開く、隠し機能を探す、無理な操作を試す |
| **イライラユーザー（せっかち）** | 反応が遅いとすぐに画面を連打 | ローディング中に操作を重ねる、通信切断直後に再試行する |
| **誤操作ユーザー（うっかり者）** | 操作ミスが多く、正しい操作をなかなかできない | 入力欄に関係ない情報を入れる、意図せず戻るボタンを押す |
| **子どもユーザー（非論理的）** | 文字が読めない or 意味を理解せず操作する | 適当にタップ、長押し、連打、スクロール連打 |
| **高齢者ユーザー** | ゆっくり操作しつつ、操作を途中でやめたり、誤認しやすい | ボタンを見落とす、すぐ戻る、複数ステップを中断する |
| **非対応環境ユーザー** | 推奨されないブラウザやOS、解像度などで利用する | モバイル端末でPC版を無理やり開く、古いブラウザで表示崩れなどを起こす |
| **多重操作ユーザー** | 複数ウィンドウ・タブを同時に開いて同時進行する | セッションが競合する操作、データの整合性確認に有効 |
Pythonのモジュールを全削除

```php:インストールしているモジュールをリストに出力
pip freeze > uninstall.txt
```

```php:出力したリストのモジュールを削除
pip uninstall -y -r uninstall.txt
```

```php:リストの確認
pip list
```

```php:リストの削除
rm uninstall.txt
```
```php:モジュールのインストール
rm uninstall.txt
```
【イベントレポート】企業版AWS IAMのマニアックな話 2025 #nncstudy

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.04.17（木）に開催した**企業版AWS IAMのマニアックな話 2025**へ参加しましたので、アウトプットとしてイベントレポートを執筆しました。

初見の方でもサクッと読めるように平易な表現で執筆しておりますので、お気軽にお読みいただければ幸いです。

:::note info
誤字脱字、わかりづらい表現、認識相違などは極力なくすように心がけています。そのうえで、リアルタイムで執筆しておりますので、誤字脱字、わかりづらい表現、認識相違などがあるかもしれません。
:::

#### イベントページ

https://nrinetcom.connpass.com/event/350129/

## 最新のIAMベストプラクティス
- 自己紹介
    - NRIネットコム所属の方
- 2019年のベストプラクティス
    - IAMユーザの最小化を行う
    - IAMポリシーの最小権限設定
    - ルートユーザのMFA認証設定など
    - 当時から最小権限のジレンマを感じていた
        - （個人的意見）確かに悩ましいところですね
- 最小権限のジレンマ
    - 複数アカウントを利用するのにIAMユーザーは向いていない
- 2025年以降のIAM管理
    - IAM Access Analyzerによる問題検出を行う
    - Verified Accessを利用したユーザとデバイス認証の統合
        - （個人的意見）組織利用だと確かに管理が大変ですよね
    - Access Analyzer
        - AWSリソースの利用状況に応じてポリシーを自動生成してくれる
        - （個人的意見）AIとの組み合わせでうまくできそうですね
    - 属性ベースでのアクセス制御（ABAC）
        - RBACの考えとは違うもの
    - 定期監査だけでなくAIを用いた監査を行っていく世界に
- アカウント管理について
    - 今後マルチアカウント運用は必須になっていく
    - そのうえでマルチアカウント運用でセキュリティを担保するのは大変
    - 各部署ごとに責任範囲を分解していく
        - （個人的意見）理想を考えて改修していくことが大切ですよね

## まとめ

IAM管理についてキャッチアップできているようでまだまだできていないところがあると気づきました。昨日参加したイベントでもガバナンス統制について話がありましたので、引き続きキャッチアップしていきたいと思います。

最後までお読みいただきありがとうございました。
非同期通信ってなに？【	Laravel + Vue.js】

# 背景
講座受講中。
Vue.jsを使用して、非同期通信によるいいね機能を実装することになった。
まってまって非同期通信ってなに！？？？となったのでまとめる。

# 非同期通信とは
ページをリロードせずに、裏でサーバーとやり取りすること。

たとえば、
Twitter（X）で「いいね」すると、
画面はリロードされないけど、ハートは赤くなるし、数字は増える。

たしかに、これまで実装してきた機能はページ遷移が伴っていたような…なるほど。

# Laravel単体で非同期通信はできないの？
ChatGPTに聞いてみた。

>Laravel単体では「非同期通信を受け取る側」にはなれるけど、
「非同期通信を送る側」にはなれない。

Laravelは「サーバー」側。リクエストがきたら、データを返したり保存したりする。
フロントからリクエストを非同期通信で「送る」ためにJavaScript（Vue.jsなど）が必要。

# memo
できたらまとめたい。
* async と await
* Promiseベースとは
* 実際のコードの書き方
【ChatGPT】新しい思考モデル（o3とo4-mini）のご紹介です。


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

　今回は、OpenAIが出した新しい思考モデル（o3とo4-mini）のご紹介です。

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

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

　OpenAIが
　　新しい思考モデルを発表し、
　　　提供を開始しました。

　OpenAI o3と
　　o4-mini、
　　　o4-mini-highです。

　サムやOpenAIのほかの人物も
　　発表できることに
　　　興奮しているのか、
　　　　ポストをポンポン出してます😅

　まずは、
　　下記をベースにして
　　　ChatGPTに書いてもらった記事を
　　　　ごらんください。
　　　　　一部に手を入れています。

　[Introducing OpenAI o3 and o4-mini
](https://openai.com/index/introducing-o3-and-o4-mini/)
　　
***（ChatGPTが記事にしました）***
OpenAI公式発表「Introducing o3 and o4-mini」の内容をもとに、専門用語をかみ砕いてわかりやすくまとめた日本語記事を作成しました。


# OpenAI、次世代AIモデル「o3」と「o4-mini」を発表  
**ChatGPTがさらに賢く、便利に進化。画像やツールも自由に使いこなす新モデルとは？**

OpenAIは2025年4月、新しいAIモデル「o3」と「o4-mini」をリリースしました。これらは、ChatGPTの頭脳として働く最先端のAIで、これまでよりもはるかに賢く、多機能になっています。


## o3：最強のAIモデルが登場

「o3」は、OpenAIがこれまでに開発した中で最も高性能なAIモデルです。以下のような特徴があります：

- **より深く考える力**  
  ただ答えるだけでなく、質問の意図をくみ取り、しっかり考えてから応答します。数学やプログラミング、科学のような難問にも対応できます。

- **視覚情報にも強い**  
  画像やグラフ、図表などを読み取り、内容を理解して解釈できます。手書きのメモやホワイトボードの写真にも対応。

- **ツールを自分で使いこなす**  
  Web検索、Pythonによるデータ分析、ファイルの読み込み、画像生成などを自分で判断して使い分ける「エージェント的」な動作が可能。

- **より安全に**  
  社外の専門家を含めた大規模な評価により、不適切な応答のリスクを最小限に抑えています。


## o4-mini：軽くて賢い小型モデル

「o4-mini」は、「コスパ重視のサクサク動くAIモデル」です。特徴は以下の通り：

- **軽量＆高速**  
  小型ながら高性能。難しい数学の問題やプログラミングにも強く、実用性の高いモデルです。

- **高い使用回数制限**  
  軽い分、より頻繁に使うことができ、毎日たくさんChatGPTを使いたい人に最適。


## ChatGPTはどう変わったの？

新モデルの登場により、ChatGPTは次のように進化しました：

- **複雑な質問にも対応**：「今年のカリフォルニアの電力需要はどうなる？」のような質問に対し、Web検索・グラフ作成・Python分析などを組み合わせて答えることが可能。
- **画像で考えるAI**：アップした画像を見て、読み取り・分析・推論ができる。ぼやけた手書きでもOK。
- **エージェント的動作**：ユーザーが何を求めているかをAIが判断し、必要なツールを自ら使って応答。


## 新しい開発ツール「Codex CLI」も発表

OpenAIは同時に、開発者向けの新ツール「Codex CLI」も発表しました。これはターミナルとエディタを統合した新しい開発体験で、AIと一緒にコードを書くことができます。まるでAIが開発パートナーになる感覚です。


## 誰が使えるの？

- ChatGPTの有料プラン（Plus / Pro / Team）のユーザーは、すでにo3やo4-miniを利用可能。
- 今後、**APIでも順次対応予定**。
- 数週間以内には、さらに高性能な「o3-pro」モデルも登場予定。


## 最後に：AIとの共創時代へ

今回のリリースは、単なるAIの性能向上にとどまらず、「人間とAIが一緒に考える」新しい時代への大きな一歩です。質問に答えるだけの存在から、自らツールを使って問題を解決する“賢いパートナー”へと進化したChatGPTを、ぜひ体験してみてください。
***

　すでに、
　　ChatGPTのPlus / Pro / Teamには、
　　　提供開始されています。
![Screenshot_20250417-111010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/2540c933-5c74-4d4f-b133-7748195d4714.png)

***

　ゆうべは、
　　疲れて寝落ちしてしまい、
　　　慌てて触りはじめたばかりで
　　　　ろくな情報もありません。

　ただ、
　　私の環境が悪いのか、
　　　Androidアプリが
　　　　停止したり落ちたり
　　　　　しています。

　みなさんは
　　大丈夫ですか？

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

　今回は、ここまで。
【C言語入門】ネストをわかりやすく解説！

# 【C言語入門】ネストをわかりやすく解説！

:::note warn
 **注意**  
 本記事の内容には、誤った知識や古い情報が含まれている可能性があります。  
 必ず公式ドキュメントや信頼できる参考書なども併せてご確認ください。
:::
---

C言語を学び始めると、必ず出てくる「ネスト（入れ子）」という言葉。  
if文やfor文、while文などの中に、さらにif文やfor文が入っている状態を「ネスト」と呼びます。

「ネストが深くなると、何がどこで動いているのか分からなくなる…」  
「波かっこ（{ }）の対応が分からなくなってエラーになる…」  
そんな悩みを持つ初心者の方も多いはずです。

この記事では、ネストの基本から、よくある間違い、実践例まで、**完全初心者向け**にやさしく解説します！

---

## ネスト（入れ子）ってなに？

ネストとは、**制御構文（if文やfor文など）の中に、さらに制御構文が入っている状態**のことです。

### 例え話

- ネストは「箱の中にさらに箱が入っている」イメージです。
- たとえば、for文の中にif文がある場合、「繰り返しの中で条件分岐をする」ことになります。

---

## ネストの基本的な書き方

たとえば、for文の中にif文を入れると、次のようになります。

```c
for (int i = 1; i <= 5; i++) {
    if (i % 2 == 0) {
        printf("%dは偶数です\n", i);
    }
}
```

**解説**  
- for文で1から5まで繰り返し
- その中でif文を使い、iが偶数のときだけメッセージを表示

---

## 初心者がつまずくポイント

1. **波かっこ（{ }）の対応が分からなくなる**
   - どの{ }がどの文に対応しているか分からなくなり、エラーや意図しない動作になることが多いです。
2. **インデント（字下げ）がバラバラになる**
   - ネストが深くなるほど、インデントを揃えないと見づらくなり、バグの原因になります。
3. **「どこで何が実行されているか」分からなくなる**
   - どの条件や繰り返しの中で、どの処理が動いているのか混乱しやすいです。

---

## 実践例：九九表を表示する（for文のネスト）

ネストの理解を深めるために、for文を2重にネストして「九九表」を表示するプログラムを作ってみましょう。

```c
#include <stdio.h>

int main() {
    for (int i = 1; i <= 9; i++) {         // 外側のfor文（段）
        for (int j = 1; j <= 9; j++) {     // 内側のfor文（掛ける数）
            printf("%2d ", i * j);
        }
        printf("\n"); // 1段ごとに改行
    }
    return 0;
}
```

**解説**  
- 外側のfor文（i）は「段」を表します（1の段～9の段）。
- 内側のfor文（j）は「掛ける数」を表します（1～9）。
- `i * j`で掛け算の結果を表示し、内側のfor文が1周するごとに改行します。

---

## よくある間違い・注意点

### 1. 波かっこの対応ミス

```c
for (int i = 1; i <= 5; i++)
    if (i % 2 == 0)
        printf("%dは偶数\n", i);
    printf("ここはfor文の外です\n"); // ← 意図しない場所で実行される
```
**解説**  
- 波かっこ `{}` を省略すると、for文やif文の「直後の1行」しか繰り返しや条件分岐の対象になりません。
- 複数行の処理をまとめたいときは、必ず `{}` で囲みましょう。

### 2. インデントがバラバラ

ネストが深くなるほど、インデント（字下げ）を揃えないと、どこがどのブロックか分かりにくくなります。

**悪い例：**
```c
for (int i = 1; i <= 3; i++) {
if (i % 2 == 1) {
printf("%dは奇数\n", i);
}
}
```
**良い例：**
```c
for (int i = 1; i <= 3; i++) {
    if (i % 2 == 1) {
        printf("%dは奇数\n", i);
    }
}
```

### 3. ネストが深くなりすぎる

ネストが3重、4重…と深くなりすぎると、プログラムが読みにくくなり、バグの原因になります。  
できるだけネストは2～3重までに抑え、必要なら関数に分けるなど工夫しましょう。

---
:::note info
## まとめ

- **ネスト**とは、if文やfor文などの中に、さらに制御構文が入っている状態のことです。
- ネストを使うことで、複雑な条件分岐や繰り返し処理が書けるようになります。
- **波かっこ `{}` の対応**や**インデント**をしっかり意識しましょう。
- ネストが深くなりすぎる場合は、プログラムを分割して見やすくする工夫も大切です。
- 実際に手を動かして、ネストの動きを体験してみましょう！
:::
---
:::note
## 関連記事

- [【C言語入門】ifとelseをわかりやすく解説！](https://qiita.com/Ayanokoji/items/e3388e8d12a1a6c4e49d)
- [【C言語入門】for文・while文をわかりやすく解説！](https://qiita.com/Ayanokoji/items/557ed3c6e5e5e55b555a)
- [【C言語入門】scanfってなに？初心者向けにわかりやすく解説！](https://qiita.com/Ayanokoji/items/b6747e69f5668a28897a)
- [【C言語入門】合計と平均を求める方法をわかりやすく解説！](https://qiita.com/Ayanokoji/items/33e46865e6b83b76076a)
:::
---
【SQL】ファントムリード

# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。
SQLを学習中ですが、トランザクションの中で発生してしまうダーティーリード、Non_repeatable read(反復不能読み取り), ファントムリードがあります。
本日はその中でファントムリードについて説明していきたいと思います。

## ファントムリードとは何か？

トランザクションの分離レベルに関する話題の中で、「ファントムリード（Phantom Read）」という用語を聞いたことがあるでしょうか？この記事では、ファントムリードとは何かを具体例とともにわかりやすく解説していきます。

---

## ファントムリードの意味

**ファントムリードとは、同一トランザクション内で同じ検索条件でクエリを複数回実行したときに、前回には存在しなかった"新しい行（ファントム）"が結果に現れる現象**のことを指します。

---


### 実例

「価格が500円以上の商品一覧」を取得したいとします。

---

### トランザクションA ( あなた )
```sql
BEGIN;

SELECT * FROM items WHERE price >= 500;
```
**結果:**
| id | name       | price |
|----|------------|-------|
| 1  | Book       | 800   |
| 2  | Headphones | 1000  |

---

### トランザクションB ( 別の人 )
```sql
INSERT INTO items (id, name, price) VALUES (3, 'Mouse', 700);
COMMIT;
```

---

### トランザクションAで再度同じクエリを実行
```sql
SELECT * FROM items WHERE price >= 500;
```
**結果:**
| id | name       | price |
|----|------------|-------|
| 1  | Book       | 800   |
| 2  | Headphones | 1000  |
| 3  | Mouse      | 700   | ← これが「ファントム」

---

## なぜ起こるのか

REPEATABLE READ や READ COMMITTED といった分離レベルは
- **"行の内容の変更"は防げても**
- **"条件に合致する新しい行の追加"は防げない**


---

## ファントムリードを防ぐには

**SERIALIZABLE** という最高レベルの分離性を使用することで防ぐことができます。

---

## トランザクション副作用のまとめ

| 用語                  | 内容 |
|-----------------------|------|
| **ダーティーリード**     | 他トランザクションの **未コミットデータ** を読む |
| **ノンリピータブルリード** | 同じ行を再度読んだときに **内容が変わっている** |
| **ファントムリード**      | 同じ条件の検索で **新しい行が返ってくる** |

---

## まとめ

- ファントムリードは、**同じSQLで読み取る行の数が変わる**
- **REPEATABLE READでも防げず**、**SERIALIZABLEで防げる**
- 他のリード問題と違いを理解しておくとデータ事故を防ぐことができます
RubyエンジニアがJavaScriptを書くときに知っておくべきreturnの罠

# はじめに
RubyからJavaScript（以下JS）に入門するとき、「なぜかfilterやsomeが思ったとおりに動かない」と感じることがあります。

その原因の一つが JavaScriptではreturnを明示的に書かないと値が返らない という仕様です。

この記事では、Rubyエンジニアがつまずきやすいこの点にフォーカスし、JSとの違いと注意点を紹介します。

# Rubyでは「最後に評価された値」が返る
Rubyでは、ブロックの最後に評価された値がそのまま戻り値になります。

```ruby
[1, 2, 3].select do |n|
  n > 1
end
# => [2, 3]
```
このコードでは、ブロックの最後にn > 1という式があるので、その評価結果（true or false）が自動的に返されます。

# JavaScriptでは return がないと返らない
JavaScriptでは、関数の戻り値は明示的にreturnしないと返されません。

```js
[1, 2, 3].filter((n) => {
  n > 1; // returnしていないので undefined を返す
});
// => []
```
このコードは一見Rubyと同じように見えますが、実はブロック内で値を返していないため、filterはすべての要素を弾いてしまいます。

# 正しい書き方
明示的にreturnを使う：
```js
[1, 2, 3].filter((n) => {
  return n > 1;
});
// => [2, 3]
```
あるいは、アロー関数の省略記法を使う：
```js
[1, 2, 3].filter(n => n > 1);
// => [2, 3]
```
アロー関数でブロック（{}）を使わなければ、returnは省略可能です。

よくあるパターン：someやfindでも同様
some, find, map, reduceなど、戻り値が重要なメソッドでも同じ注意が必要です。

```js
[1, 2, 3].some((n) => {
  n > 2;
});
// => false（常に undefined を返すため）

// 正しくは
[1, 2, 3].some((n) => {
  return n > 2;
});
// => true
```
# まとめ

|項目|Ruby|JavaScript|
|:--|:--|:--|
|戻り値|ブロックの最後の式|明示的にreturnが必要（※省略記法を除く）|
|filter, some, など|式を書くだけでOK|returnしないと常にfalse扱いになる|

# おわりに
RubyとJavaScriptの間には細かな文法の違いが多数ありますが、returnの扱いは特に罠になりやすいポイントです。

JSに慣れていないRubyエンジニアは「とりあえずreturn書く」というクセをつけるところからスタートすると、安全に開発を進められるでしょう。
Data Categorization and Access Superbadge Unit



https://trailhead.salesforce.com/content/learn/superbadges/superbadge_data_categorization_sbu



+ さまざまなビジネス要件とセキュリティ ニーズに応じて新しいフィールドを作成します。
+ 柔軟でスケーラブルなフィールド アクセスを構成します。
+ データの分類とアクセスのベスト プラクティスについて説明します。


# 新しいフィールドを作成する

ビジネス要件とセキュリティ要件に応じて 4 つの新しいフィールドを作成します。

Here are the new fields you’ve been asked to create.

+ Service Plan PIN (Account)
+ Tax ID (Account)
+ Social Security Number (Contact)
+ Closed Lost Reason (Opportunity)
Additionally, you’ve been asked to review access for the following standard fields.

+ Serial Number (Asset)
+ Birthdate (Contact)


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

:::note alert
We can't find the expected configurations for the Service_Plan_PIN__c field on the Account object. Make sure the field has a description and is configured according to the requirements.


アカウントオブジェクトのService_Plan_PIN__cフィールドに適切な設定が見つかりません。フィールドに説明があり、要件に従って設定されていることを確認してください。
:::

:::note alert
We can't find the expected configurations for the Tax_ID__c field on the Account object. Make sure the field has a description and is configured according to the requirements.


アカウントオブジェクトのTax_ID__cフィールドに適切な設定が見つかりません。フィールドに説明があり、要件に従って設定されていることを確認してください。
:::

:::note alert
We can't find the expected configurations for the Social_Security_Number__c field on the Contact object. Make sure the field has a description and is configured according to the requirements.
:::

:::note alert
We can't find the expected configurations for the Closed_Lost_Reason__c field on the Opportunity object. Make sure the field has a description and is configured according to the requirements.
:::

Visible in List Views
とあったから単なるテキストエリアにしたけどエラーですね。ロングにしたら合格。意味が分からないですね。



# フィールドアクセスを構成する

新規および既存のフィールドのアクセスを設定します。ソリューションを構築する際に、新しい権限セットや権限セットグループを作成しないでください。


:::note alert
We can't find the expected updates to the Account_Management permission set.
:::

ん？さっき登録した項目を設定するのか？

:::note alert
We can't find the expected updates to the Opportunity_Management permission set.
:::


:::note alert
We can't find the expected account field settings muted in the Account_Executive permission set group.
:::

note alert
We can't find the expected account field settings muted in the Sales_Manager permission set group.
:::

note alert
We can't find the expected account field settings muted in the Accounting permission set group.
:::

:::note alert
We can't find the expected contact field settings muted in the Accounting permission set group.
:::

:::note alert
We can't find the expected contact field settings muted in the Call_Center_Agent permission set group.
:::
FastAPIのディレクトリ構成


公式ドキュメント
https://github.com/fastapi/fastapi
https://github.com/fastapi/full-stack-fastapi-template

/
└ src/...sourceの略(appの名前のものもある)
　 ├ assets/
　 ├ crud/
　 ├ database/
　 ├ routers/
　 ├ schemas/
　 ├ services/
　 ├ __init__.py
　 ├ dependencies.py
　 ├ main.py
　 └ models.py

  
# ディレクトリ説明
|名前|説明|
|:-:|:-:|
|assets|画像データなどを格納|
|crud|DBのcrud操作に関する処理|
|database|DB設定に関する処理|
|routers|ルーティング後のエンドポイント|
|schemas|データのスキーマ定義|
|services|crud操作に関係のない関数|


# ファイル説明
|名前|説明|
|:-:|:-:|
|__init__.py|何も書かなくて良い モジュール設定用|
|dependencies.py|依存性注入に関する記述|
|main.py|エンドポイントに関する設定を行うFastAPIの実行ファイル|
|models.py|DBモデル設計 ORM (Object Relational Mapper)|
JavaScript 少なくとも1つ条件に合うかどうかを判断する`some`

JavaScriptには、配列を操作する便利なメソッドがたくさんあります。  
その中でも今回は、**条件に合う要素が1つでもあるかどうかを調べる**ためのメソッド、`some`について解説します。

# `some`とは？

`some`は配列に対して使えるメソッドで、次のような動きをします。

> **配列の中に、少なくとも1つ条件に合う要素があれば `true` を返す。**  
> 条件に合う要素が1つもなければ `false` を返す。

# 基本構文

```js
array.some(callback);
```
callback は各要素に対して実行される関数で、次のような書き方ができます：


```js
array.some((value, index, array) => {
  // 条件を指定してtrue/falseを返す
});
```

通常は value（今の要素）だけで十分なことが多いです。

# 具体例①：文字列の検索
```js
const fruits = ["apple", "banana", "cherry"];

const hasBanana = fruits.some(fruit => fruit === "banana");

console.log(hasBanana); // true
```
この例では、fruitsの中に"banana"があるのでtrueが返ります。

# 具体例②：数値のチェック
```js
const numbers = [10, 20, 30, 40];

const hasLargeNumber = numbers.some(num => num > 25);

console.log(hasLargeNumber); // true
```
30や40があるので、条件（25より大きい）を満たす要素が存在して true になります。

# 具体例③：オブジェクトの配列に使う
```js
const users = [
  { name: "Alice", isAdmin: false },
  { name: "Bob", isAdmin: false },
  { name: "Charlie", isAdmin: true }
];

const hasAdmin = users.some(user => user.isAdmin);

console.log(hasAdmin); // true
```
このように、配列の中のオブジェクトを見て条件をチェックする使い方も便利です。

# everyとの違い
よく一緒に出てくるのが every。
違いは以下

|メソッド|意味|
|:--|:--|
|some|1つでも条件を満たせば true|
|every|全てが条件を満たさないと false|

```js
const nums = [1, 2, 3];

nums.some(n => n > 2);  // true（3がある）
nums.every(n => n > 2); // false（1や2は条件を満たさない）
```

# おわりに
someは「何か1つでも条件を満たす要素があるか？」をチェックするのにぴったりのメソッドです。
- 書き方がシンプル
- オブジェクトにも使いやすい
- filterやfindと組み合わせるとさらに便利

配列処理をする場面でぜひ活用してみてください！