OmniAICreator/Qiita-1.07M huggingface dataset:
FivetranでユーザーIDを確認する方法について

FivetranでユーザーIDを確認する方法について簡単にまとめます。

# 前提
Fivetran管理画面ではユーザーIDが直接表示されていなかったので、APIで取得することにしました。

## API Key
設定→API Key→Generate API keyでAPI Keyを発行することができます。


# ユーザー情報の取得

以下のAPIを使用します。（すべてのユーザー情報を取得）
```
GET https://api.fivetran.com/v1/users
```

## curlの例

```bash
curl -u <API_KEY>:<API_SECRET> \
     -H "Content-Type: application/json" \
     -X GET "https://api.fivetran.com/v1/users"
```

json形式でユーザー情報を取得できます。

```json
{
  "code": "Success",
  "data": {
    "items": [
      {
        "id": "user_id",
        "email": "user@email.value",
        "given_name": "xxx",
        "family_name": "xxx",
        "verified": true,
        "invited": false,
        "picture": null,
        "phone": null,
        "role": "Account Administrator",
        "logged_in_at": "xxx",
        "created_at": "xxx",
        "active": true
      },
      {
      ...
      }
    ]
  }
}
```

# 参考URL

https://fivetran.com/docs/rest-api/api-reference/users/list-all-users
リダイレクト,パイプラインに関する整理

リダイレクト（`>`, `>>`, `<`）やパイプライン（`|`）に関するストリーム処理は、Unix系シェル（bash など）での標準的な入力・出力の操作に関わる重要な概念です
唐突な記号の登場により、毎年新人が躓きやすい箇所でもあるので以下にそれぞれの機能をまとめて整理してみます

---

## 🚤 ストリームの基本

ストリームは、処理の流れを表す概念です
シェルには、以下の3つのストリームがあります：

| ストリーム | 番号 | 意味         |
|------------|------|--------------|
| 標準入力   | `0`  | キーボード等の入力 |
| 標準出力   | `1`  | 通常の出力   |
| 標準エラー | `2`  | エラー出力   |

## ↪️ リダイレクト

リダイレクトは、標準の出力先（ターミナル画面）や入力元（キーボード）を変更します：

### 標準出力のリダイレクト
　出力が、ターミナルには表示されず代わりにファイル等へ書き込まれます

`>`：上書き（ファイルがあれば削除して書き込む）
  ```bash
  echo "Hello" > file.txt 
  ```
 
`>>`：追記
  ```bash
  echo "World" >> file.txt
  ```

### 標準入力のリダイレクト
　入力を、キーボード入力に代わりファイル等から読み込みます

`<`：ファイルからの入力
  ```bash
  wc -l < file.txt
  ```

`<<`：指定文字(ここでは"EOF")までの文字列の入力
  ```bash
  grep apple <<EOF
  apple
  lemon
  pineapple
  EOF
  ```

### 標準エラーのリダイレクト

`2>`：エラーをファイルに出力
  ```bash
  ls kyomu 2> error.log
  ```

`2>&1`：エラー出力を標準出力と同じ場所へ出力
  ```bash
  command > out.log 2>&1
  ```

---

## 🔗 パイプライン（`|`）

パイプは、コマンドの「標準出力」を、次のコマンドの「標準入力」として渡します：

```bash
ls -l | grep ".txt"
```

上記は、`ls -l` の結果から `.txt` を含む行だけを抽出します

複数のパイプも可能です：

```bash
cat file.txt | grep "error" | sort | uniq
```

## 🖇️ `tee`コマンド

`tee`コマンドは、出力を指定(複数でも可)のファイル等に保存しつつ標準出力にも流します：

```bash
ls -l | tee all.txt
```

## 🧩 `xargs`コマンド

`xargs`コマンドは、出力(複数でも可)を次のコマンドの引数に指定します：

```bash
ls -l | grep ".ai" | xargs rm -i
```
複数プロセスのアプリケーション

質問:「複数プロセスでアプリケーションを作る場合い、各プロセスがmain()を持つことになりますか？」
以下はChatGPTの回答。

---

はい、まさにその通りです！

---

## ■ 結論

> **複数プロセスでアプリケーションを構成する場合、各プロセスは `main()` 関数を持ちます。**

---

## ■ 詳しく説明すると：

### 【プロセス】＝【1つの独立した実行ファイル】
- それぞれが **独立した実行体（バイナリ）** なので、
- **当然、それぞれ `main()` を持ちます。**

---

### 例：2つのプロセスから成るアプリ

```
[プロセスA：センサ取得プログラム]
main_sensor.c → main() がある

[プロセスB：表示UIプログラム]
main_display.c → こちらも main() がある
```

- どちらも別々に `gcc` でビルドして別バイナリとして実行します。

```sh
gcc -o sensor main_sensor.c
gcc -o display main_display.c
./sensor &
./display
```

---

## ■ じゃあ「1つのソースファイルで複数プロセス」は？

C言語で `fork()` を使う方法です。

```c
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子プロセス
        printf("子プロセスです\n");
    } else {
        // 親プロセス
        printf("親プロセスです\n");
    }
    return 0;
}
```

この場合は **1つの`main()`からプロセスを複製**します。  
つまり、「プロセスは2つ」ですが「`main()`は1つ」です。

---

## ■ 要するに

| 方法 | `main()` の数 | 備考 |
|------|----------------|------|
| 複数のバイナリを使う（正攻法） | 各プロセスに1つずつ | プロセス設計が明確で保守しやすい |
| `fork()` でプロセス分岐 | 1つだけ | 手軽だが複雑な構成には向かない |

---

## ■ 組込みLinuxでの例

- `センサ収集プロセス` と `MQTT通信プロセス`
- `UI描画プロセス` と `ログ収集プロセス`

などに分けるのが一般的で、それぞれ**別バイナリ & 別 `main()`**を持ちます。

---

もし「複数プロセス間の通信方法（IPC）」にも興味があれば、  
- **パイプ**
- **ソケット**
- **共有メモリ（shm）**
- **メッセージキュー**

なども解説できますよ！やってみます？
組込みLinux プロセスとスレッドの違い

質問:「プロセスとスレッドの違いは？」
以下はChatGPTの回答。

---

とても重要なポイントですね！  
**プロセスとスレッドの違い**をわかりやすく表にまとめつつ、イメージとともに解説します。

---

## ■ ざっくり一言で

- **プロセス**：アプリケーション1個の実行単位（独立したメモリ空間を持つ）  
- **スレッド**：そのプロセス内での**軽量な処理単位**（メモリ空間は共有）

---

## ■ 比較表：プロセス vs スレッド

| 特徴 | プロセス | スレッド |
|------|----------|----------|
| メモリ空間 | **独立している** | **共有している（同じプロセス内）** |
| 作成コスト | 重い（OSが管理） | 軽い（同一プロセス内で管理） |
| 通信 | **プロセス間通信（IPC）が必要** | **グローバル変数で共有できる** |
| 安全性 | 高い（クラッシュしても他に影響なし） | 低い（1つが落ちると全体に影響） |
| 使用例 | Chromeのタブごと、別プロセスなど | GUIのメインスレッド、センサ監視など |

---

## ■ 図でイメージすると：

### プロセス
```
[プロセスA]   メモリ空間A（独立）
    |
    └─ 実行コード・データ・スタック

[プロセスB]   メモリ空間B（独立）
    |
    └─ 実行コード・データ・スタック
```

### スレッド（同一プロセス内）
```
[プロセスC]  メモリ空間C（共有）
    ├── スレッド1（スタック1）
    ├── スレッド2（スタック2）
    └── スレッド3（スタック3）
```

---

## ■ なぜスレッドを使うのか？

- 同じメモリを使えるため、**高速なデータ共有が可能**
- 処理を並列化して、**応答性の高いアプリケーションを実現できる**
- 例：センサの読み取り・通信・UI更新などを別スレッドで同時進行

---

## ■ 組込みLinuxでの活用シーン

| 処理 | 向いてるもの |
|------|--------------|
| 別アプリ同士で通信（例：センサ制御プログラムとUI） | **プロセス**（+ IPC） |
| アプリ内で複数の処理を並列に（例：センサ・ログ・表示） | **スレッド**（+ ミューテックス） |

---

## ■ まとめ

| 観点 | プロセス | スレッド |
|------|----------|----------|
| 独立性 | 高い（安全） | 低い（クラッシュ連鎖の恐れ） |
| 実行コスト | 高い | 低い |
| 並列処理 | できる（重め） | できる（軽快） |
| データ共有 | 難しい（IPC） | 簡単（共有メモリ） |

---

**組込みLinuxでは、基本は「1プロセス＋複数スレッド」の構成が多い**です。  
必要なら、「実際にプロセスとスレッド両方を使ったサンプル」も作れます！

知りたい応用例とかあれば教えてくださいね！
個人的備忘録：Alembic使うなら必読！alembic.iniの編集ポイントをまとめたみた

## はじめに

Alembicは、SQLAlchemyと連携してデータベースのスキーマ変更（マイグレーション）を管理するツールです。その設定の中心となるのが `alembic.ini` というファイルです。

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

ここでは、`alembic.ini` の主な項目について解説します。

**参考にするコードは以下になります。**

https://github.com/2025SpringTeamA/backend/blob/main/alembic.ini

---

### [alembic] セクション

- `script_location = migrations`
  - マイグレーションスクリプトを保存するディレクトリを指定します。
  - 通常、`migrations` というディレクトリを使います。

- `prepend_sys_path = .`
  - 現在の作業ディレクトリを `sys.path` に追加して、Pythonモジュールのパス解決を助けます。

- `version_path_separator = os`
  - 複数のマイグレーションディレクトリを使う際の区切り文字をOS依存にします（例：Unixでは `:`, Windowsでは `;`）。

---

### コメントアウトされているが重要な設定

- `sqlalchemy.url = driver://user:pass@localhost/dbname`
  - 実際に使うときは、ここに使用するDBの接続情報（ドライバー、ユーザー名、パスワード、ホスト、DB名など）を設定します。

- `file_template`
  - マイグレーションファイルの命名規則を定義します。
  - 日付や時刻を含めた命名も可能で、履歴管理しやすくなります。

---

### [post_write_hooks] セクション

- 自動生成されたマイグレーションスクリプトに対して、整形ツールや静的解析ツールをかける設定です。
  - 例：
    - `black`（Pythonコード整形）
    - `ruff`（静的解析・自動修正）

---

### ログ設定セクション

以下のセクションでは、ログ出力に関する設定を記述します。

- `[loggers]`, `[handlers]`, `[formatters]`
  - AlembicやSQLAlchemyが出力するログの出力レベル（例：INFO, WARNING）や出力先（例：stderr）などを管理します。

---

### 開発時に編集すべき主な項目

- `sqlalchemy.url`
  - 実際に使うDBに合わせて正確に設定する必要があります。

- `script_location`
  - 自分のプロジェクト構成に応じて変更する場合があります。

---

## まとめ

`alembic.ini` は Alembic を正しく動作させるための重要な設定ファイルです。

:::note warn
***特に `sqlalchemy.url` と `script_location` は必ずプロジェクトごとに適切に設定する必要があります。***
:::

その他の項目についても、必要に応じてカスタマイズすることで、より快適なマイグレーション管理が可能になります！
C#を使ってPDFのページを回転させる

私たちの毎日の仕事では、我々は時々、PDF文書内のページの方向がドキュメントを読むことは非常に不便になり、逆になっていることがわかります。このケースでは、PDFファイルのページの向きを調整する必要があります。

この記事では、C#と無料PDFライブラリ – [**Free Spire.PDF for .NET**](https://www.e-iceblue.com/Introduce/free-pdf-component.html)を使用してPDFファイル内のページを回転させる方法を共有します。

## 無料の.NET PDF APIをインストールする
[Free Spire.PDF](https://www.e-iceblue.com/Introduce/free-pdf-component.html)は、PDFファイルを生成、処理、変換、印刷するための無料の.NET PDFライブラリです。

それをインストールするには、それをダウンロードし、参照として手動でSpire.PDF.dllを追加することができます。または、[Nuget](http://www.nuget.org/packages/FreeSpire.PDF/)経由で直接インストールすることもできます。

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html

## C#でPDFのページを回転させる方法
***ステップ:***
1. `PdfDocument` インスタンスを作成します。
1. PDF文書を読み込みます。
1. 回転するページを取得します。
1. ページの現在の回転角度を取得します。
1. 現在の回転角度（0/90/180/270度）に基づいてページを回転させます。
1. 結果文書を保存する。


***C#コード：***
```csharp
using Spire.Pdf;

namespace RotatePdfPage
{
    class Program
    {
        static void Main(string[] args)
        {
            //PDF文書を読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("input.pdf");

            //最初のページを見る
            PdfPageBase page = pdf.Pages[0];

            //ページの元の回転角度を取得する
            int rotation = (int)page.Rotation;

            //元の回転角度に基づき、ページを時計回りに90度回転させる。
            rotation += (int)PdfPageRotateAngle.RotateAngle90;
            page.Rotation = (PdfPageRotateAngle)rotation;

            //結果文書を保存する
            pdf.SaveToFile("RotatePDF.pdf");
        }
    }
}
```

***入力 & 出力：***
![RotatePDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/1c70a9c1-5e7c-46ff-a61d-0acdfb631d78.png)

* * *
C# におけるさらなる PDF 処理機能については、以下を参照してください：

https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Spire.PDF-Program-Guide-Content.html
パイソン無料講義～RPA編

こんばんは、韓国在住のsanaです！

今日は無料講義　パイソン活用３弾！　RPA編を紹介します:relaxed:

こんな方におすすめ✨
エクセルやCSVの操作を自動化したい方📊
データ管理に興味がある方🕵️‍♀️
Pythonを使って自分の業務をもっと便利にしたい方🐍

パイソン活用を活用して業務の手間を減らするのっていいですよね
私もこの講座で自動化挑戦してみようと思います:sunglasses:


https://u.inf.run/4lCyDKC
📢指導教官に怒られまくった？これらのPDF注釈ツールこそ真の「学術アサシン」だ！

💥指導教官：「この論理、おかしい！」
私：（震える手で注釈を開く）😱

🔥論文修正効率が2倍になる秘密兵器を紹介：
1️⃣ ComPDFKitオンライン版 - インストール不要！[ハイライト/下線/テキストボックスで](https://www.compdf.com/demo/webviewer?utm_source=referral&utm_medium=qiita_thesisannotation_20250415)即修正、指導教官の赤入れもクラウド同期。スマホでもPCでも即対応👉

2️⃣ PDF Reader Pro - プロ級の「メス」のような[注釈機能](https://www.pdfreaderpro.com/?utm_source=referral&utm_medium=qiita_thesisannotation_20250415)。音声コメントや手書きサインも可能。指導教官からの緊急連絡時、注釈スクショで即謝罪！💻

💡血涙の教訓：自ら論文を「削る」方が、指導教官の赤ペン攻撃よりマシ…
数値の出現率　Map() vs 配列

paizaの「数字の出現回数カウント」の問題を解いた！出現回数をカウントする問題は前に解いたことあったけど、地味なミスを連発した(´;ω;｀)　あと、正解は一つじゃないんだと改めてわかったことを記録するよ！

## <br>🎯 問題概要：`0〜9`の出現回数を数えるだけ
入力例：
```
5  // N
1 2 3 3 6  
```
出力例：
```
0 1 1 2 0 0 1 0 0 0
```
N個の整数（0〜9）が与えられるので、それぞれの出現回数をカウントし、
0から9の順で1行に出力するだけ。

## <br>❌NG例
```js
const nums = lines[1].split(' ');
const count = new Map();

for (let i = 1; i <= 9; i++) {
    count.set(i, 0); // ❌ 0入れ忘れた
}

nums.forEach(a => {
    count.set(a, count.get(a) + 1); // ❌ aが文字列なのでNaNになる
});

count.forEach(v => console.log(v)); // ❌ 出力が改行されてしまう
```

ミス：
- 0 を初期化し忘れる
- `.split(' ')` で得た値が文字列 → `.map(Number)` を忘れると事故る
- 出力が 10行 に分かれる（`join`が必要）

## <br>✅ OK例：Mapをちゃんと使うならこう
```js
const nums = lines[1].split(' ').map(Number);
const count = new Map();

for (let i = 0; i <= 9; i++) {
    count.set(i, 0);
}

nums.forEach(a => {
    count.set(a, count.get(a) + 1);
});

const result = [];
count.forEach(value => result.push(value));
console.log(result.join(' '));
```

## <br>✨配列でスマートに！
```js
const nums = lines[1].split(' ').map(Number);
const counts = Array(10).fill(0);

for (const n of nums) {
    counts[n]++;
}

console.log(counts.join(' '));
```
解説：
- `Array(10).fill(0)`：0〜9に対応する配列を初期化
- `counts[n]++`：そのままインデックスで加算
- `console.log(counts.join(' '))`：出力は1行で整形済み

<br>なぜ配列がいいのか？
- キーが固定（0〜9）ならMapより配列が高速＆簡潔
- 書く量も読む量も少なくなる＝タイパがいい

## <br>🧠 まとめ：Mapに頼りすぎない！

Mapももちろん便利だけど、キーが固定なら配列で十分。

<Br>覚えておきたい構文：
- `Array(10).fill(0)`
- `.map(Number)`（文字列→数値）
- `.join(' ')`（出力整形）


<br><br>[僕の失敗談(´;ω;｀)と解決話🚀](https://paizabeginner.wordpress.com/2025/04/15/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e6%95%b0%e5%ad%97%e3%81%ae%e5%87%ba%e7%8f%be%e7%8e%87%ef%bc%81/)
npm run build のあとにバッチファイルが止まる問題の対処法【Windows】

## 概要

VueやReactなどのフロントエンドプロジェクトを Windows のバッチファイル（`.bat`）でビルド → S3 アップロード → CloudFront 無効化という流れで自動化しようとしたところ、`npm run build` の後で処理が止まる問題に直面した。

## 問題

以下のような `deploy.bat` を実行すると、`npm run build` は実行されるが、その後の `aws s3 sync` や `CloudFront` 無効化処理に進まない。

```bat
@echo off

set S3_BUCKET=example-bucket
set DISTRIBUTION_ID=EXXXXXXXX

echo Building project...
npm run build

echo Uploading to S3...
aws s3 sync dist/ s3://%S3_BUCKET% --delete

echo Invalidating CloudFront cache...
aws cloudfront create-invalidation --distribution-id %DISTRIBUTION_ID% --paths "/*"
```

`npm run build` の出力は正常に完了しているように見えるが、その後の `echo` が表示されず、バッチファイルが途中で終了してしまう。

## 原因

Windows のバッチファイルでは、外部プログラム（特に npm script）を呼び出したとき、戻り先がなくなる場合がある。

具体的には、`npm run build` のように直接実行すると、`npm` プロセスに制御が渡ったまま、バッチファイルが終了してしまう。

## 解決策

`npm run build` の前に `call` を付ける。

```bat
call npm run build
```

これにより、npm の実行が終わったあと、バッチファイルの続きの処理に制御が戻るようになる。

## 修正後の例

```bat
@echo off

set S3_BUCKET=example-bucket
set DISTRIBUTION_ID=EXXXXXXXX

echo Building project...
call npm run build

echo Uploading to S3...
aws s3 sync dist/ s3://%S3_BUCKET% --delete

echo Invalidating CloudFront cache...
aws cloudfront create-invalidation --distribution-id %DISTRIBUTION_ID% --paths "/*"

echo Deployment completed.
pause
```

## 補足：文字コードにも注意

`deploy.bat` を `UTF-8 BOM付き` で保存していると、先頭の `@echo off` が無視されたり、処理がうまく実行されないこともある。

保存形式は「ANSI」または「UTF-8 (BOMなし)」がおすすめ。

---

## まとめ

Windows バッチで `npm run build` を使うときは `call` を付ける。シンプルだけどハマりやすい罠なので、備忘録として記録。
高位合成って何？HLS開発の全体像と検証ステップ

## はじめに
FPGAを使った開発に取り組んでいると、HLS（高位合成）、CSIM、COSIM、といった聞きなれない言葉に出会います

さらに、HLSの結果とOpenCVの結果を比較しているシーンを見て、「なんでソフトウェアとハードウェアで結果を比べてるの？」と疑問に思う方も多いのではないでしょうか

この記事では、そうした疑問に答えるかたちで、高位合成の基本的な考え方と、CSIMやCOSIMの役割、OpenCVとの関係性をわかりやすく解説していきます

## 高位合成（HLS：High Level Synthesis）とは？
従来、FPGAで何か処理をしたい場合は、**VerilogやVHDLといったハードウェア記述言語（HDL）** でロジックを1から設計する必要がありました

しかし、それは非常に手間がかかる作業

HLSは、C/C++などの高級言語で記述したアルゴリズムを自動的にハードウェア化してくれる技術です

これにより、ソフトウェアエンジニアでもFPGAの設計に参加しやすくなりました

## 全体のロードマップ

まずは、HLSを用いたFPGA開発の一般的な流れを俯瞰してみましょう

```mermaid
graph TD
  A[① CSIM<br>Cシミュレーション] --> B[② CSYNTH<br>高位合成]
  B --> C[③ COSIM<br>協調シミュレーション]
  C --> D[④ VIVADO_SYN<br>論理合成]
  D --> E[⑤ VIVADO_IMPL<br>配置配線]
  E --> F[⑥ 実機実装<br>FPGAへ書き込み]
```

## 各ステップの目的と意味

### ① CSIM（C Simulation）

- **目的：** C/C++コードが正しく動くかをソフトウェア上で確認
- **内容：** ロジックミスや入出力ミスを検出する
- **実行例：**
  ```bash
  make run CSIM=1
  ```

この段階では、**ハードウェアは一切関係ありません**

---

### ② CSYNTH（C Synthesis）

- **目的：** C/C++コードをFPGA向けのRTL（Verilog/VHDL）に変換
- **内容：** パイプライン化やリソースの使用量などがここで決まる
- **実行例：**
  ```bash
  make run CSYNTH=1
  ```

出力されるのは**FPGAに載せるための回路図的なもの（RTL）** です

---

### ③ COSIM（Co-Simulation）

- **目的：** 合成されたRTLがC/C++の動作と一致しているか確認
- **内容：** C/C++とRTLを比較し、差がないかシミュレーション
- **実行例：**
  ```bash
  make run COSIM=1
  ```

ここで差異があれば、CSYNTHの設定やCコードを見直す必要があります

---

### ④ VIVADO_SYN（Vivado Synthesis）

- **目的：** RTLコードをFPGA向けのネットリストに変換
- **内容：** 論理ゲートレベルでの設計を作成
- **実行例：**
  ```bash
  make run VIVADO_SYN=1
  ```

Vivado HLS から Vivado Design Suite にバトンタッチするイメージ

---

### ⑤ VIVADO_IMPL（Vivado Implementation）

- **目的：** 実際のFPGA上のリソースに配置・配線
- **内容：** クロック制約・タイミング制約の検証もここ
- **実行例：**
  ```bash
  make run VIVADO_IMPL=1
  ```

ここまで完了すれば、**FPGAに書き込めるbitstreamが生成されます！**

---

## ゴール：実機での動作確認

最終目標は、生成されたbitstreamを使ってFPGAに実装し、**外部入力に応じて意図した処理ができるかどうかを検証する**ことです

たとえばカメラ画像に対してフィルタ処理を行う場合、
- OpenCV：ソフトウェアでの「正しい」結果
- FPGA出力：ハードウェア実装の実際の出力

この2つを比較することで、**FPGAが想定通りに動作しているか**が確認できます

---

## OpenCVの結果と比較する理由

- OpenCVで出力された画像は、**“期待される理論値”** として扱えます
- HLSやFPGAから出力された画像と比べることで、**数値の誤差や設計ミスを検出できる** からです

```text
ソフトウェア（OpenCV） ＝ テストの正解例
ハードウェア（HLS, FPGA）＝ 作った回答
```
この2つを比較することで、FPGAが想定通りに動作しているかが確認できます

ここで重要なのは、ソフトウェア（OpenCV）とハードウェア（HLS/FPGA）で出力結果が**完全に一致しないこともある**という点です

これは、以下のような理由から発生します

- ハードウェア合成時に固定小数点演算へ変換され、丸め誤差が生じる

- パイプライン処理や並列化による処理順序の違い

- メモリアクセスや境界処理の違い（たとえば画像端の扱い）

このような背景があるため、HLS開発では **“許容誤差の範囲で一致しているか”** を確認することが大切です

## まとめ

| ステップ         | 内容                     | 目的                               |
|------------------|--------------------------|------------------------------------|
| **CSIM**         | Cシミュレーション         | ロジックバグの早期発見             |
| **CSYNTH**       | 高位合成（C→RTL変換）    | RTLの生成、性能見積もり            |
| **COSIM**        | 協調シミュレーション     | 合成RTLとCの結果の一致確認         |
| **VIVADO_SYN**   | 論理合成（ネットリスト） | FPGA向けの論理回路作成             |
| **VIVADO_IMPL**  | 配置配線                  | FPGAリソースに割り当て、タイミング調整 |
| **実機実装**      | FPGA書き込み              | 実環境での動作確認                  |

## おわりに

開発の最初から実機動作までには、**複数のチェックポイントが存在する**ことが分かりました

それぞれのステップでの検証が、後戻りコストを減らし、**高信頼なFPGA設計につながります**

※ 本稿は以下のサイトを参考にしています
https://xilinx.github.io/xup_high_level_synthesis_design_flow/Lab4.html
tmux でセッション共有しようとすると "access not allowed" と出る

概要
====

`tmux` でセッション共有しようとすると `access not allowed` と表示され共有できない場合があります。
最近の `tmux` でセッションを共有するユーザをチェックする機能が追加されたことが原因のようです。

共有する側
----------

ソケットファイル `/tmp/tmux.sock` を作成して `tmux` を起動します。

```bash
tmux -S /tmp/tmux.sock
```

ソケットファイルのパーミッションを  
共有する相手が読み書きできるよう変更します。

```bash
chmod -c 777 /tmp/tmux.sock
```

共有してもらう側
----------------

ソケットファイルを指定して `tmux` にアタッチしようとすると…

```bash
tmux -S /tmux/tmux.sock attach
```

以下のように表示されセッション共有ができません。

```console
access not allowed
```

対策
====

Stack Overflow にこの挙動に関する質問が投稿されていました。
[tmux shared socket throws "access not allowed" error - Stack Overflow](https://stackoverflow.com/questions/74861662/tmux-shared-socket-throws-access-not-allowed-error)

共有する側
----------

`tmux` セッション内で以下のコマンドを実行することで
セッションを共有するユーザの許可を追加します。

```bash
tmux server-access -a 許可するユーザ名
```

現在セッション共有を許可されているユーザは
以下のコマンドで確認できます。

```bash
tmux server-access -l
```

共有してもらう側
----------------

セッション共有を許可してもらってからアタッチします。

```bash
tmux -S /tmux/tmux.sock attach
```
困っていた二重ルーターの使いにくさを力業で解決した

こんにちは。
ALJの江口と申します。

皆さん、二重ルーターに悩まされていませんか？
最近は、ミニPCでホームサーバーが簡単に作れたり、RasberryPiを設置したり、メッシュWifiで１階と２階で同じSSIDが利用できたり、ひと昔前では考えられないくらい、自宅の環境が充実してきました。

しかし、なかなか解決しずらい問題に、二重ルーターがありました。
二重ルーターでどんなことに悩んでいたかというと、以下の図で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/02333617-8a51-4548-8e68-0dba2eb9be3f.png)

### 悩み①　Wifiルーターをbridgeモードにするとメッシュにできない
これは、古いWifiルーターを使っている自分が悪いのかもしれませんが、我が家のWifiルーターはルーターモードしかメッシュに対応していません。
なので、買い換えたら、すぐに解決かもしれませんが、今回は別の方法で解決しました。

### 悩み②　ホームサーバーなどは上位のセグメントに置きたい
最近の光回線は2G、3Gは当たり前になりつつあり、非常に速いですが、Wifiは高速化したとはいえ、まだ速度は落ちてしまうので、ホームサーバーは高速な回線を利用したい。
安定性についても、Wifiルータはたまに再起動したりするので、ホームサーバーは上位のセグメントに置きたい。また、スマホやタブレットが多数あるので、Wifiは接続数が多く、IPアドレスの管理が面倒という理由もありました。

### 悩み③　上位のセグメントからWifiルーターの内側のセグメントにアクセスできない
Wifiがルーターモードで動作しているので、RasberryPiなど無線で利用している機器に上位のセグメントからはアクセスできません。

### 悩み④　上位のセグメントからルーターのメンテナンスができない
上位のセグメントからWifiルーターの管理画面に入れません。設定すれば外部許可も可能ですが、親機がメンテできても、子機がメンテできません。

### 悩み⑤　家庭用のWifiルーターではWan->Lanのルーティングができない（たぶん）
これができれば解決ですが、自分の持っているWifiルーターでは設定がなさそうです。

## 二重ルーターの悩みを逆向きのルーターの設置で解決
二重ルーターにしても、以下のような解決方法があります。
・ブリッジモードで利用する（メッシュ対応なら）
・ポートフォワードやDMZを利用する（管理がメンドクサイ）
・全てWifiルーターの管理下に置く

上記も試したのですが、どれも一長一短があり、今回は**逆向きのルーター**を置くことで解決しました。

### ルーターを追加した構成図
簡単に説明すると、以下の３つの作業を実施しました。
1. ホームサーバーにはLANポートが２個あるので、２個目のポートをWifiルーターのLAN側に接続し、ホームサーバーもルーターの内側のセグメントに参加させる
1. ホームサーバーにVMを追加し、OPNsenseをインストール
　[LAN側]光ルーターのセグメント（固定IP）
　[WAN側]Wifiルーターの内側のセグメント（DHCP可）
1. 光ルーターに、Wifiルーターの内側のセグメントをOPNSenseに向けて静的ルーティングを追加

構成図は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/7e1a8d9e-149f-4322-a2ad-f7b2b103302b.png)

なぜ**逆向き**のルーターが必用かというと、Wifiルーターの内側のLANは、デフォルトGWがWifiルーターになっているため、上位のIPのままアクセスすると、OPNsenseから入ったパケットが、Wifiルーターから出てきてしまうため、うまく通信できません。OPNsenseではなく、LinuxなどのIPフォワードでもできますが、Wifiルーター側はNATする必要があります。要は逆向きのNATルータを置くのと変わりないというイメージです。

## 結果として、意図通りになりました。
OPNsenseのVMインスタンスを追加するだけで、上位のセグメントからWifiルーターの内側にアクセスできました。
最近のPCは性能が高いので、Wifiで利用しているネットサーフィン用PCでも、ちょっとVM立てたりすることもありましたが、上位のセグメントからアクセスできないので若干不便を感じることもありました。

はたして、このネットワーク構成が正しいのか、OPNSenseを初めてセットアップしたので、もしかしたら間違ってるかもしれません。
ご指摘等あれば、コメントで教えて頂けると幸いです。

一般的に、LANー＞WANはパケットを通すので、OPNSenseに特別な設定をしなくても、Wifiルーターの内側にパケットを投げてくれました。

最近のWifiルーターはとても早く、メッシュにすると遠くまで届くので、ほとんどの機器はWifi接続ですが、一部の機器は光回線の直下にあります。二重ルーターに悩まされている方がいれば、設計の一つの参考になれば幸いです。

:::note warn
ネットワークがループしてしまうと、最悪の場合、機器を壊してしまうため、ループさせないように十分注意してください。
実行する場合は、ネットワーク設定の変更には細心の注意をしてください。
:::

細かい設定方法については、説明を割愛しました。おそらく、これを読んで実行したいと思う人には細かい説明は不要だと思いましたが、もし、ご質問等があればコメント頂けると幸いです。

以上です。
シュレディンガー方程式とCPTPマップ　　[2分読み切り]

Quantum Error Correction　Todd A. Brun　1

初めまして！量子エラー訂正超初学者です。読んだ論文を細切れにして投稿します。
だいぶ読みにくくなってしまいました。。。時間のある時に編集します。

参考論文
・QCQI１
・https://www.bing.com/ck/a?!&&p=0129e81cccda165d4a7893a7c2b2f2ae5d5c4560412ee8d040e33b8e4993df93JmltdHM9MTc0NDY3NTIwMA&ptn=3&ver=2&hsh=4&fclid=332c347a-2c9d-612a-3ab9-25082d536078&psq=Quantum+Error+Correction+Todd+A.+Brun+Summary+Quantum+error&u=a1aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzE5MTAuMDM2NzIucGRm&ntb=1

##シュレディンガー方程式について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4062187/729c27fb-5f83-4343-bd79-0548369b34e5.png)

φは状態ベクトルである。ハミルトニアンHを持ち、これは系がどのように発展するかにおいて完全な情報を与えてくれる。
その結果として、ユニタリ発展を持ち、例えば状態|0>をU|0>にする。

##CPTPマップ
一般的に、量子状態は混合状態も含めて、密度行列の形で表される。

密度行列の性質
①トレースが１
②正値
純粋状態はp=|φ><φ|で表されるが、これはランク１の射影行列である。

時間発展してもこの性質は保存されるが、密度演算子の時間発展には、更に
・線形性
・トレース保存
・完全正値
これらを満たしたとき、CPTPマップという。下のような式で状態の時間発展がかかれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4062187/d635116e-660b-41de-a229-e758b975c8fa.png)

Akはクラウスオペレータと呼ばれる。
確率
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4062187/57d82bb7-90d9-4926-b661-c6cd7ca980fe.png)
でランダムに選ばれたAによって次の状態が決まる。
どの状態が選ばれるかわからないので、∑を取ってすべての演算子を混合(足す)して考える。

同様に、この時間発展をユニタリーオペレータで記述するとしたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4062187/b3d03add-c2ab-4269-9f9b-c0a3b4ab0b53.png)
である。ここで、P=∑pk|φｋ><φk|であり、Pは密度行列(量子状態を混合状態混みで表現したもの)を、確率pkである状態|φk><φk|になったとすると、その総和が、Pである。
個人的備忘録：PostgreSQLのパフォーマンス改善に効くshared_buffersのチューニング方法について

## はじめに
PostgreSQLのパフォーマンスチューニングを行う際に、最も基本かつ重要な設定項目の一つが `shared_buffers` パラメータです。

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

この記事では、`shared_buffers` の役割や設定方法、注意点について解説します。

## shared_buffers とは？
`shared_buffers` は、PostgreSQLがデータベースのデータをメモリ上に保持するために使う共有メモリ領域のサイズを設定するパラメータです。

https://postgresqlco.nf/doc/ja/param/shared_buffers/

この領域は、ディスクから読み込んだページのキャッシュや変更されたデータの一時的な保存に使用されます。

つまり、`shared_buffers` のサイズを適切に設定することで、ディスクI/Oを削減し、クエリのレスポンス速度を向上させることができます。

## デフォルト値と推奨設定
- **デフォルト値**：通常、インストール直後のPostgreSQLでは、`shared_buffers` の値はシステムメモリの128MBや256MB程度に設定されています。

**参考文献**

https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/database-tuning/#:~:text=%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC-,shared_buffers,%E3%81%93%E3%81%A8%E3%82%92%E6%8E%A8%E5%A5%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

- **推奨値**：
  - 小規模システム：物理メモリの25%程度
  - 中〜大規模システム：メモリの30%〜40%を目安に設定するケースもあります。

ただし、システム全体の使用状況（他アプリケーションやOSキャッシュとのバランス）も考慮する必要があります。

## 設定方法
`postgresql.conf` ファイルを編集するか、SQLで変更します。

## 方法1：postgresql.conf の編集
```conf
shared_buffers = 1GB
```
設定後、PostgreSQLの再起動が必要です。

## 方法2：SQLで確認・設定
```sql
-- 現在の値を確認
SHOW shared_buffers;

-- 動的変更はできないため、変更には設定ファイル編集と再起動が必要
```

## 注意点
- **物理メモリとのバランス**：`shared_buffers` を大きくしすぎると、OSや他プロセスに使えるメモリが減少し、逆効果になる場合があります。
- **OSのキャッシュとのバランス**：PostgreSQLでは、`shared_buffers` とは別に、OSのファイルキャッシュも利用されるため、両者のバランスを意識することが重要です。
- **巨大な値にする意味は薄い**：PostgreSQLは、`shared_buffers` 以外にも効果的なキャッシュ戦略を持っており、闇雲に値を増やしても性能向上につながらない場合があります。

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/tuning-postgresql-parameters/shared-buffers.html

## まとめ
`shared_buffers` はPostgreSQLの基本的なメモリ設定のひとつであり、適切な設定によってパフォーマンス向上が期待できます。

環境ごとの最適値を見極め、OSや他プロセスとのバランスも考慮しながら、慎重にチューニングを行いましょう！
Windows 11 に SSH サーバーを立てて公開鍵認証

AuthorizedKeysFileの設定の仕方がUbuntuサーバーへのSSH接続と異なっており、少々手間取ったのでここに備忘録として残しておく。

公式のページがやはり役に立った。
[参照資料]https://learn.microsoft.com/ja-jp/windows-server/administration/OpenSSH/openssh-server-configuration

以下全文引用
```
AuthorizedKeysFile
The default is .ssh/authorized_keys. If the path isn't absolute, 
it's taken relative to user's home directory (or profile image path), for
example, C:\Users\username. If the user belongs to the administrator group,
%programdata%/ssh/administrators_authorized_keys is used instead.

 ヒント
The administrators_authorized_keys file must only have permission entries
for the NT Authority\SYSTEM account and BUILTIN\Administrators security
group. The NT Authority\SYSTEM account must be granted full control. The
BUILTIN\Administrators security group is required for administrators to 
manage the authorized keys, you can choose the required access. To grant
permissions you can open an elevated PowerShell prompt, and running the
command icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys"
/inheritance:r /grant "Administrators:F" /grant "SYSTEM:F".
```
どうやら、ユーザーが管理者グループであれば%programdata%/ssh/administrators_authorized_keysが優先して、参照されるようだった。
Oracle Cloud メモ2


等価的データ暗号化(TDE)とは？


ChatGPT:
ナイスなセキュリティ系の質問です！
「等価的データ暗号化（TDE: Transparent Data Encryption）」は、データベースのデータを保存時に自動で暗号化する技術です。主に Oracle Database や他のエンタープライズDBで使われます。

🔐 等価的データ暗号化（TDE）とは？
👉 TDE = Transparent Data Encryption
「透過的なデータ暗号化」

ユーザーやアプリケーションは、何も意識せずにデータを読み書きできる

ディスク上のデータ（保存時のデータ＝at rest）を自動で暗号化する機能

📦 どこが暗号化される？
主にこの2つ：

データファイル（テーブルスペース）

表やインデックス、LOBデータなど → 列単位 or 表領域単位で暗号化できる

Redoログ、アーカイブログ、バックアップファイル

Oracleは TDE の設定でこれらも保護可能



TDEマスター・キーとは？
TDEマスター・キー（Master Encryption Key） は、
Oracle Transparent Data Encryption (TDE) において、
実際のデータを暗号化する「データ暗号化キー（DEK）」を暗号化するための上位鍵です。

簡単に言うと、**「鍵を守る鍵」**です。



Oracle Database セキュリティ・パッチとは？
Oracle Databaseに発見された脆弱性（セキュリティの穴）やバグを修正するための更新プログラムのこと。

Oracleは定期的に、こうしたセキュリティ修正パッチをリリースしています。




Oracle Autonomous Database（ADB）とは？
Oracleが提供する自動運用型のクラウド・データベース・サービスです。

キーワードは 「自律（Autonomous）」＝人手いらず！

✅ 構築・運用・管理の多くの作業が AIと機械学習で自動化 されています。
✅ データベースのパッチ適用・バックアップ・チューニングなどもOracleがやってくれます！

🤖 どんなことが自動化されてるの？
自動化される作業	内容
🧱 構築・設定	ADBのプロビジョンは数クリックで完了。OSやDBのインストール不要
🔄 スケーリング	ワークロードに応じてCPUやIOを自動で拡張／縮小
🔧 パフォーマンス・チューニング	SQLの最適化、インデックス管理も自動
🔐 セキュリティ	暗号化、ユーザー制御、パッチ適用を自動実施
💾 バックアップ・復旧	自動バックアップ（最大60日保持）＋セルフサービスで復元可能
🛠 パッチ＆アップグレード	セキュリティパッチやDBバージョンアップも自動適用
🧩 種類（用途別に2タイプ）
タイプ	用途	特徴
Autonomous Transaction Processing（ATP）	トランザクション処理、アプリ、API向け	高速なINSERT/UPDATEなど
Autonomous Data Warehouse（ADW）	分析・BI向け	高速な検索と並列処理に特化



General Data Protection Regulation (GDPR)とは？


ChatGPT:
いい質問です！
クラウドやデータベースを扱ううえで避けて通れないのが、GDPR（General Data Protection Regulation）＝一般データ保護規則です 📜🔐

🏛️ GDPR（General Data Protection Regulation）とは？
欧州連合（EU）が制定した、個人データの保護に関する法律で、
2018年5月25日に施行された、世界で最も厳格なデータ保護規則のひとつです。

🌍 適用範囲
**「EU市民の個人データを扱うすべての組織」**が対象です。

✅ 所在地がEU圏外でも、EUユーザーにサービスを提供しているなら対象になります。

例：

日本企業がEUの顧客にオンラインサービス提供 → GDPR適用対象

オラクルクラウド上のDBにEU市民の個人情報を格納 → GDPR対策必須

🔑 保護対象の「個人データ」って？
GDPRでは「個人を特定できるすべての情報」が対象です。たとえば：

データの種類	例
基本情報	氏名、住所、メールアドレス、電話番号
オンライン識別子	IPアドレス、Cookie ID、デバイスID
特殊カテゴリ	人種、宗教、健康情報、生体認証、政治的意見など


Department of Defense（DoD）Library of Security Technical Implementation Guides（STIG）**について、わかりやすく解説します ✍️🔐💻

✅ STIG（Security Technical Implementation Guide）とは？
アメリカ国防総省（DoD = Department of Defense）が策定した、
システムやアプリケーションを安全に構成するためのセキュリティ設定ガイドラインです。

📚 STIG = セキュリティの設計・運用に関するベストプラクティス集

🧠 そもそも何のためのもの？
STIGは次の目的で使われます：

✅ サイバー攻撃からシステムやネットワークを守る

✅ セキュリティ基準に沿った統一的・再現性ある構成を提供

✅ コンプライアンス準拠（例：FISMA、FedRAMPなど）を実現




Oracle Database Maximum Security Architecture（MSA）とは？
Oracleが推奨する最高レベルのセキュリティを実現するためのアーキテクチャ指針です。
データベースの 機密性・完全性・可用性 を守るために、Oracleのセキュリティ機能を総合的に活用します。

📌 つまり「こうやって構成すれば、もっとも安全だよ！」というベストプラクティスのセットです。
Oracleが提供する最も強力なデータベース・セキュリティ戦略のフレームワーク
【React】mapが使えないunknown型エラーを解決する方法について

# はじめに
PostGIS拡張機能を許可したあと、テーブル作成した際geography(POINT)型をsupabaseが認識できないようでunknown型になってしまい、その影響でmap関数が使用できずそちらの解決方法について備忘録も兼ねて記事にします。

# 解決方法
型を作成しその型を明示する


### 手順
PostGISはドキュメントどおりに許可しています。

```.SQL
create extension postgis with schema "extensions";
```

【テーブル作成】

```.SQL
create table if not exists public.post_locations (
post_id int not null references posts(id) on delete cascade,
location geography(POINT) not null, // geography型
PRIMARY KEY(post_id)
);
```

次に位置情報を取得するための関数をSupabase DatabaseのUI functionsを利用しましたが、エラーで作成ができずSQLで作成することにしました。

```.SQL
create or replace function get_all_post_coordinates() // 全て取得するので引数なし			
returns table (			
post_id integer,			
latitude double precision,			
longitude double precision			
)			
language sql			
as $$			
select			
post_id,			
ST_Y(location::geometry) as latitude, // （locationカラムの値をgemetryに変換しそれをST_Yに渡す）それをlatitudeとする		
ST_X(location::geometry) as longitude			
from post_locations;			
$$;			
```

databaseファイルへ反映
```.terminal
npx supabase gen types typescript --project-id "ここにprojectIDを入力" --schema public > utils/supabase-database.ts
```

下記のようにunknown型になります
```supabase-database.ts
export type Database = {
  public: {
    Tables: {
      post_locations: {
        Row: {
          location: unknown
          post_id: number
        }
        Insert: {
          location: unknown
          post_id: number
        }
        Update: {
          location?: unknown
          post_id?: number
        }
        Relationships: [
          {
            foreignKeyName: "post_locations_post_id_fkey"
            columns: ["post_id"]
            isOneToOne: true
            referencedRelation: "posts"
            referencedColumns: ["id"]
          },
        ]
      }
```

atomと型を作成
```.tsx

export type PostLocation = {				
post_id: number;				
latitude: number;				
longitude: number;				
};				
				
export const locationAtom = atom<PostLocation[]>([]);				
```

ここでset関数に渡すdataに型を明示する
```.tsx
useEffect(() => {
const fetchData = async () => {
try {
const { data, error } = await supabase
.rpc('get_all_post_coordinates') // 関数実行
if (error) throw error;

if (data) setlocationData(data as PostLocation[]); // ここでdataがPostLocation[]であることを明示

} catch (error) {
console.error('データ取得失敗', error);
}
};
fetchData();
}, []);

///////////////////////////
{locationData?.map((location) => {
return (<Marker
key={location.post_id}
position={[location.latitude, location.longitude]}
></Marker>)
})}
<Marker
```


# 参考
https://zenn.dev/ototrip/articles/tech-supabase-geolocation-1

https://postgis.net/docs/ja/index.html

https://supabase.com/docs/guides/database/functions

# おわりに
Databaseのfunctionについても勉強になりました。

<br>

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
Jetpack composeの備忘録

# Jetpack compose
https://developer.android.com/jetpack/androidx/releases/compose?hl=ja

Jetpack composeのライブラリ関連の情報
参照するバージョン情報は[ここ](https://developer.android.com/develop/ui/compose/bom/bom-mapping?hl=ja)から辿れる（↑のBOMってとこから飛べる）

https://developer.android.com/develop/ui/compose/documentation

Jetpack composeのライブラリのhow2useが色々書かれてる
理想は端から端まで読んで理解しておきたいが、結構量があるので時間がかかる
一応つまみ食いでも書けはする。

# KotlinとJetpack composeの互換性
https://developer.android.com/jetpack/androidx/releases/compose-kotlin?hl=ja

```kotlin
android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.15"
    }

    kotlinOptions {
        jvmTarget = "19"
    }
}
```

# Jetpack compose のUIデバッグ
https://developer.android.com/develop/ui/compose/tooling/debug?hl=ja

# Codelab
https://github.com/android/codelab-android-compose

取っ掛かりはここからやってみた。苦労なく理解できた。

## UI

https://www.figma.com/@tv

sampleとして実装してみたUIのG様のUI仕様書

https://m3.material.io/blog/material-theme-builder

Figmaからkotlinのコードに落としてくれる？
個人のフリーアカウントだったので試してない（出来なさそうなことが書いてあった [\<link\>](https://medium.com/@anastasia.bizyayeva/how-to-create-a-custom-material-design-theme-and-use-it-in-figma-2dec90d5bc08)）
エンタープライズで試してみたい

# Tips
後に増やすハズなので大雑把にカテゴライズしておく

## 全般

### リソース参照

https://tech.mokelab.com/android/compose/composable/text/display-ja.html
https://qiita.com/FalconFlat/items/6b15f7219e7459ce99b2

```kotlin
// リソースから文字列を読み込む
Text(text = stringResource(R.string.label_text))

// リソースから文字サイズを読み込む
// テーマで指定するほうが適切
Text(
    text = "something",
    // previewしたときにviewのサイズがおかしいな・・・という場合にこれを疑う
    // fontSize = R.dimen.text_size_large ← これは間違い！
    fontSize = dimensionResource(R.dimen.text_size_large).value.sp
)
```

## 文字関係

### phrase指定
最近言われがちなやつ

https://developer.android.com/develop/ui/compose/text/style-paragraph

### 文字溢れ
...にするのが良いかどうかはさておき、指定方法はある

https://developer.android.com/develop/ui/compose/text/configure-layout

### 定義済みの文字サイズの参照方法とか

https://developer.android.com/develop/ui/compose/designsystems/material3#typography

### AutoSizeableText

https://qiita.com/Nabe1216/items/8cbc9529116288d4784a

## UI parts関係

### 定義済みのwidgetとか
https://developer.android.com/develop/ui/compose/components/button?hl=ja

試しに作ったUIにボタンがあったので、ボタン系へのリンクをペタリ

### RoundEdgeのカスタマイズ
https://qiita.com/yoppie_x/items/c2c1a8a74c6d2e58cfb4

### アライメント関係

https://zenn.dev/wm3/articles/7332788c626b39

（UI初心者だからすごく参考になった）

### 初期フォーカス

https://stackoverflow.com/questions/68826625/how-to-set-default-focus-item-in-android-jetpack-compose

https://developer.android.com/develop/ui/compose/side-effects#launchedeffect


# 試しで書いてみたコードの置き場

https://github.com/Ikuto-Akayama/gtv-wizard-jetpack-compose

2025/05/xx いくつかTodoが残ってるのでGW中に消化してしまいたい
2025/06/06 初期のものをv1、改良版をv2としてアップデート
Ansible学習メモ②(RHEL、CentOS関連）

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


#### 1.RHELマシンにパッケージをインストール
ansibleマニフェストを作成：
test.yaml
```
---
- name: ansible install a package in redhat system
  hosts: all
  become: true
  tasks:
    - name: install a package in redhat system
      ansible.builtin.dnf:
        name: wget
        state: present
```
inventoryファイルを以下のように設定
```
XX.XX.XX.XX ansible_ssh_private_key_file=~/XXXXX.pem
```
以下のコマンドを実行し、対象マシンにパッケージインストールを行う。
```
ansible-playbook -i inventory test.yaml
```

#### 2.Apache httpd webサーバをインストール
四つのモジュールを使用する
ansible.builtin.yum
ansible.builtin.copy
ansible.builtin.service
ansible.posix.firewalld
※マニフェストを実行前、コレクションのインストールが必要
```
ansible-galaxy collection install ansible.posix
```
ansibleマニフェストを作成：
test.yaml
```
---
- name: deploy a web server apache httpd
  hosts: all
  become: true
  tasks:
    - name: httpd installed
      ansible.builtin.yum:
        name: httpd
        state: latest

    - name: custom index.html
      ansible.builtin.copy:
        dest: /var/www/html/index.html
        content: |
          Custom web Page

    - name: httpd service enabled
      ansible.builtin.service:
        name: httpd
        enabled: true
        state: started

    - name: open firewall
      ansible.posix.firewalld:
        service: http
        state: enabled
        immediate: true
        permanent: true
```

inventoryファイルを以下のように設定
```
XX.XX.XX.XX ansible_ssh_private_key_file=~/XXXXX.pem
```
(XX.XX.XX.XX: 対象マシンのIPアドレスまたはホスト名)

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

#### 3.Google Chrome インストール
以下のモジュールを使用する
ansible.builtin.rpm_key (モジュール整合性確認ため、google chrome key 追加）
ansible.builtin.yum_repository (Google Chromeリポジトリ追加)
ansible.builtin.yum (Google Chrome インストール）

ansibleマニフェストを作成：
test.yaml
```
---
- name: install Google Chrome
  hosts: all
  become: true
  tasks:
    - name: Add Yum signing key
      ansible.builtin.rpm_key:
        key: https://dl.google.com/linux/linux_signing_key.pub
        state: present

    - name: Add repository into repo.d list
      ansible.builtin.yum_repository:
        name: google-chrome
        description: google-chrome repository
        baseurl: http://dl.google.com/linux/chrome/rpm/stable/x86_64
        enabled: true
        gpgcheck: true
        gpgkey: https://dl.google.com/linux/linux_signing_key.pub

    - name: Install google-chrome-stable
      ansible.builtin.yum:
        name: "google-chrome-stable"
        state: latest
        update_cache: true
```
inventoryファイルを以下のように設定
```
XX.XX.XX.XX ansible_ssh_private_key_file=~/XXXXX.pem
```
(XX.XX.XX.XX: 対象マシンのIPアドレスまたはホスト名)

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


```bash
#!/bin/bash

DOCUMENT_ROOT=/var/www/html/
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)

echo "1. Put file to ${DOCUMENT_ROOT}${RANDOM_NAME}.php"
echo "<?php var_dump(opcache_reset()); ?>" > ${DOCUMENT_ROOT}${RANDOM_NAME}.php

echo "2. HTTP Request to https://example.com/${RANDOM_NAME}.php"
curl https://example.com/${RANDOM_NAME}.php

echo "3. Remove file from ${DOCUMENT_ROOT}${RANDOM_NAME}.php"
rm ${DOCUMENT_ROOT}${RANDOM_NAME}.php

```
【第10.5回】Azureで社内システム再現（クラウド編）｜オンプレ構成をどうクラウドに移行するか？

## 概要

これまでの「オンプレ編」では、Azureの仮想マシン（IaaS）上に社内システムを構築してきました。  
社員番号を入力して名前を検索するだけのシンプルなシステムですが、Active Directory や ADFS、SQL Server などを組み合わせて、実際のオンプレ構成に近い形を再現しています。

※詳しい全体構成については、[【第0回】Azureで社内システム再現（オンプレ編）｜構成図と動作の流れ](リンクを貼る) で紹介しています。

今回からは、これまでの構成をベースに、**よりクラウドネイティブな構成（PaaS中心）へと移行**していくプロセスをまとめていきます。  
Azure Automation や Azure App Service、Azure SQL Database などのマネージドサービスを活用しながら、**運用の自動化やセキュリティの強化も視野に入れた構成**を検討していきます。

---

## オンプレでの要件整理
以下は構築が完了したオンプレ環境の構成図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/a6d6786c-2d64-4263-8f37-dd1eeb3ff4a5.png)

これまでのオンプレ環境では、以下のような要件を満たす構成をIaaSベースで構築していました。


| 要件 | 実現方法 |
|------|-----------|
| ユーザー管理 | Active Directory（ADDS） |
| 社員検索アプリ | IIS + PHP |
| 社員データ管理 | SQL Server |
| SSO認証 | ADFS + Shibboleth（SAML） |
| データ同期 | PowerShellスクリプト + タスクスケジューラ |
| 通信保護 | ADCSで証明書を発行し、IISに適用してHTTPS化 |


---

## クラウド移行後のシステム構成

以下は、Azureへ移行後の構成図です。  
オンプレでの構成をベースに、Azureのマネージドサービス（PaaS）を中心に再構成しています。

![cloud (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/ebbbb32c-e79c-4363-918e-d400b6e544cc.png)


---

## データフローの流れ（構成図に対応）

構成図にある①〜④の番号に沿って、実際のデータ処理の流れを追っていきます。

1. **Azure Automation → Microsoft Entra ID**  
　Graph APIを使ってAzure ADのユーザー情報を取得します。

2. **Azure Automation → Blob Storage**  
　取得したユーザー情報をCSVファイルとして書き込みます。

3. **Azure Data Factory → Blob Storage**  
　保存されたCSVファイルをトリガーとして認識し、処理を開始します。

4. **Azure Data Factory → Azure SQL Database**  
　CSVデータをSQL Databaseへインポートします。

加えて以下の連携も実装します。

- App Service → SQL Database：社員番号による検索
- App Service → Key Vault：接続パスワードの取得
- GitHub → App Service：WebアプリのCI/CDデプロイ

---

## クラウド構成：要件ごとの対応サービスと役割
以下は、各要件をクラウドでどのように実現しているかをまとめた対応表です。
オンプレ構成で満たしていた機能を、Azure の各サービスでどのように置き換えたかを整理しています。


| 対応する要件 | サービス名 | 役割・動作内容 |
|----------------|-------------|----------------|
| ユーザー管理・SSO認証 | Microsoft Entra ID | ユーザー情報の一元管理を行い、App ServiceへのSSO認証を実現 |
| 社員検索アプリ | Azure App Service | PHPベースのWebアプリをホストし、社員番号の検索画面を提供 |
| 社員データ管理 | Azure SQL Database | 社員番号と氏名のデータを格納し、Webアプリからの検索に対応 |
| データ同期（取得） | Azure Automation | Entra IDから社員情報を取得し、CSV形式でBlob Storageに保存 |
| データ同期（中継） | Azure Blob Storage | Automationで出力したCSVファイルを一時保管（ADFのトリガーに） |
| データ同期（インポート） | Azure Data Factory | Blob Storage上のCSVファイルをトリガーにSQL DBへデータを取り込み |
| 接続情報の保護 | Azure Key Vault | App ServiceがSQL接続時に使用するパスワードを安全に管理 |
| アプリのデプロイ管理 | GitHub | Webアプリのソースコードを管理し、CI/CDでApp Serviceへ自動デプロイ |


---

## 移行に使用するツール

本システムのクラウド移行にあたって、以下の2つのツールを利用しています。

### Microsoft Entra Connect（旧Azure AD Connect）

オンプレミスの Active Directory（AD）と、Microsoft Entra ID を連携させるための公式ツールです。  
ユーザー情報や属性情報を Entra ID に同期することで、クラウド上での統合ユーザー管理が可能になります。

- 公式ドキュメント：https://learn.microsoft.com/ja-jp/entra/identity/hybrid/connect/whatis

### Data Migration Assistant（DMA）

オンプレミスの SQL Server から Azure SQL Database への移行をサポートする Microsoft 製の無料ツールです。  
互換性チェック、スキーマのコピー、データ移行までGUIベースで実施できます。

- 公式ドキュメント：https://learn.microsoft.com/ja-jp/sql/dma/dma-overview
cp2kの使い方: メタダイナミクス

# CP2Kによるメタダイナミクス
* メタダイナミクス(meta-dynamics)は、反応座標において人為的にエネルギーを加算することにより**起こりにくい現象を起こりやすくする手法**である
* これにより、化学結合の解離・生成などの起こりにくい反応を現実的な計算時間内に観測することができる
* meta-dynamicsでは、エネルギーを加算する座標(collective variable: CV)をまず定義し、そこにエネルギーをどの程度加えるかの条件を設定する
* 以下、cp2kによるmeta-dynamicsについて解説する

## インプットファイル
```
&GLOBAL
  PROJECT metadyn_test
  RUN_TYPE MD
  PRINT_LEVEL LOW
&END GLOBAL

&FORCE_EVAL
  METHOD QS
  &DFT
    BASIS_SET_FILE_NAME BASIS_MOLOPT
    POTENTIAL_FILE_NAME GTH_POTENTIALS
    &MGRID
      CUTOFF 280
    &END MGRID
    &XC
      &XC_FUNCTIONAL PBE
      &END XC_FUNCTIONAL
    &END XC
  &END DFT

  &SUBSYS
    &CELL
      ABC 10.0 10.0 10.0
    &END CELL
    &COORD
      O   0.0  0.0  0.0
      H   0.0  0.0  1.0
      H   0.0  1.0  0.0
    &END COORD
    &KIND O
      BASIS_SET DZVP-MOLOPT-SR-GTH
      POTENTIAL GTH-PBE
    &END KIND
    &KIND H
      BASIS_SET DZVP-MOLOPT-SR-GTH
      POTENTIAL GTH-PBE
    &END KIND
  &END SUBSYS
&END FORCE_EVAL

&MOTION
  &MD
    ENSEMBLE NVT
    STEPS 10000
    TIMESTEP 0.5
    TEMPERATURE 300
  &END MD

  &PRINT
    &TRAJECTORY
      FORMAT XYZ
    &END TRAJECTORY
  &END PRINT

  &FREE_ENERGY
    &COLVAR
      &DISTANCE
        ATOMS 1 2
      &END DISTANCE
    &END COLVAR
      
    &METADYN
      DO_HILLS TRUE
      NT_HILLS 100
      HILL_HEIGHT 1.2
      HILL_WIDTH 0.2
      BIASFACTOR 10
      TEMP 300
      USE_WELLTEMPERED TRUE

    &END METADYN
  &END FREE_ENERGY
&END MOTION
```

## メタダイナミクスに関わるセクションの解説
### `&MOTION &MD`
* `ENSEMBLE`: アンサンブル（ここではNVT）
* `STEPS`: MDのステップ数
* `TIMESTEP`: 時間ステップ（fs）
* `TEMPERATURE`: システムの温度（K）

### `&COLVAR`
* メタダイナミクスで使用するCollective Variable（CV）を定義
* `&DISTANCE`: 原子1と2の距離をCVとして使用（他にもANGLE, TORSION, COORDINATION等が利用可能）

### `&MOTION &PRINT`
* 原子のトラジェクトリー（`TRAJECTORY`）をXYZ形式で保存

### `&MOTION &FREE_ENERGY &METADYN`
* `DO_HILLS`: hill(Gauss関数)を定期的に加える
* `NT_HILLS`: hillを加えるステップ間隔
* `HILL_HEIGHT`: hillの高さ（kcal/mol単位）
* `HILL_WIDTH`: hillの幅（CV空間での幅）
基本情報ネットワーク分野の丸暗記事項だけ

# 📘 基本情報技術者試験 ネットワーク分野 暗記まとめ

---

## 🧠 基本用語（単語帳）

| 用語 | 意味 |
|------|------|
| IPアドレス | ネットワーク上の機器を識別するための番号（例：192.168.1.1） |
| IPv4 | 32ビットのIPアドレス。例：192.168.0.1 |
| IPv6 | 128ビットのIPアドレス。例：2001:db8::1 |
| MACアドレス | 機器に固有に割り振られた物理アドレス（例：00-14-22-01-23-45） |
| DHCP | IPアドレスを自動で割り当てる仕組み |
| DNS | ドメイン名とIPアドレスを結びつける（名前解決） |
| NAT | プライベートIPをグローバルIPに変換する技術 |
| グローバルIPアドレス | インターネット上で一意のIPアドレス |
| プライベートIPアドレス | LAN内のみで使用されるIPアドレス |
| ルータ | ネットワーク間の通信を中継 |
| スイッチ | MACアドレスで通信先を判断して中継 |
| ハブ | 接続端末すべてに信号を送る単純な装置 |
| モデム | アナログとデジタルを変換する装置 |
| HTTP | Web閲覧に使われる通信プロトコル（ポート80） |
| HTTPS | 暗号化されたHTTP通信（ポート443） |
| FTP | ファイル転送プロトコル（ポート20, 21） |
| SMTP | メール送信プロトコル（ポート25） |
| POP3 | メール受信（旧型、ポート110） |
| IMAP | メール受信（サーバ同期型、ポート143） |
| TCP | 信頼性重視の通信（コネクション型） |
| UDP | 軽量・高速だが信頼性は低い（コネクションレス） |
| ポート番号 | サービスを識別する番号（例：HTTP→80） |
| OSI参照モデル | 通信を7階層に分けた概念モデル |
| パケット | ネットワーク層でのデータ単位 |
| フレーム | データリンク層でのデータ単位 |
| セグメント | トランスポート層でのデータ単位 |
| データユニット | 各層におけるデータ全般の呼称 |
| MTU | 一度に転送できる最大データサイズ（例：1500バイト） |
| ARP | IPからMACアドレスを得るためのプロトコル |
| VPN | 仮想的な安全な通信経路 |
| ファイアウォール | 通信を制御して不正アクセスを防止 |
| DMZ | 外部公開用サーバを配置する領域 |
| プロキシサーバ | クライアントの代わりに通信を行うサーバ |
| サブネットマスク | ネットワーク部とホスト部の区切り |
| CIDR | サブネットを柔軟に分ける方式（スラッシュ表記） |
| ping | 通信確認のコマンド |
| traceroute | 通信経路の調査コマンド |
| スループット | 実際に転送されるデータ量（速度） |
| 帯域幅 | 通信経路の最大データ容量（理論値） |
| レイテンシ | 応答までの遅延時間 |
| 冗長構成 | 障害に備えてバックアップを用意する構成 |
| フェイルオーバー | 障害時に予備システムへ自動切り替え |

---

## 🔌 代表的なポート番号

| サービス名 | ポート番号 | 説明 |
|------------|------------|------|
| HTTP | 80 | Webの閲覧 |
| HTTPS | 443 | 暗号化されたWeb |
| FTP（データ転送） | 20 | ファイルデータの転送 |
| FTP（制御） | 21 | ファイル転送の指示・応答 |
| SMTP | 25 | メール送信 |
| POP3 | 110 | メール受信（旧式） |
| IMAP | 143 | メール受信（サーバ管理型） |
| DNS | 53 | 名前解決 |
| SSH | 22 | リモートログイン（暗号） |
| TELNET | 23 | リモートログイン（非暗号） |
| DHCP | 67（サーバ）/68（クライアント） | IP自動割当て |

---

## 🏗 OSI参照モデル（語呂：アプレセトネデブブ）

| 層 | 名前 | 主な機能 | 例・機器 |
|----|------|-----------|-----------|
| 第7層 | アプリケーション層 | Webやメール等のアプリを提供 | HTTP, FTP, ブラウザ |
| 第6層 | プレゼンテーション層 | 暗号化、圧縮、文字コード変換 | JPEG, SSL, MPEG |
| 第5層 | セッション層 | 通信の開始・終了の管理 | ソケット、API |
| 第4層 | トランスポート層 | 通信の信頼性・制御 | TCP, UDP |
| 第3層 | ネットワーク層 | IPアドレスでルーティング | IP, ICMP, ルータ |
| 第2層 | データリンク層 | MACアドレスで隣接機器と通信 | Ethernet, スイッチ |
| 第1層 | 物理層 | ケーブル、電気信号 | ハブ, ケーブル |

---

## 🌐 IPアドレスの種類

| 種別 | 例 | 補足 |
|------|----|------|
| グローバルIP | 8.8.8.8 | インターネットで一意に識別 |
| プライベートIP | 192.168.x.x / 10.x.x.x / 172.16〜31.x.x | LAN内専用 |
| ループバックアドレス | 127.0.0.1 | 自分自身を指すアドレス |
| ブロードキャストアドレス | 192.168.1.255 など | ネットワーク内の全機器に送信 |

---

## 🧮 IPアドレスのクラス

| クラス | アドレス範囲 | 主な用途 |
|--------|--------------------------|-----------|
| A | 1.0.0.0〜126.255.255.255 | 大規模ネットワーク |
| B | 128.0.0.0〜191.255.255.255 | 中規模ネットワーク |
| C | 192.0.0.0〜223.255.255.255 | 小規模ネットワーク |
| D | 224.0.0.0〜239.255.255.255 | マルチキャスト用 |
| E | 240.0.0.0〜255.255.255.255 | 実験・予約用 |

---

## ✅ 補足暗記ポイント

- **OSI参照モデル語呂合わせ**：アプレセトネデブブ
- **pingとtracerouteの違い**：pingは疎通確認、tracerouteは経路調査
- **冗長構成 vs フェイルオーバー**：
  - 冗長構成：障害時の予備を持つ
  - フェイルオーバー：障害時に自動で切り替え

---
Laravelでの開発を始めるための環境構築

## はじめに
ChatGPTなどに聞けばすぐに回答いただける時代なのに、この記事を訪問してくださりありがとうございます！
この記事は0から開発をしたことないエンジニアが開発環境を構築するために試行錯誤した記事となっていますので、
温かい目で読んでいただければと思います。
※Intel版のMacからAppleシリコン版のMacに変えたばっかの環境構築となっています。

## 使用環境
マシン：MacOS M3チップ
エディタ：VsCode

## 1.Laravelの環境構築
まず開発するためにどうやって開発環境構築すればいいのか、、、
とりあえずPCには「Docker Descktop」と「VsCode」は入ってる状態、、、
プロジェクト作るためにはどうしたらいいんだ？ということで色々調べてコマンドを入力して作れることを知りました！
まずは下準備として「PHP」などを確認しないとということで、
以下コマンドでPC内の環境を確認
```
brew -v
php -v
compose -v
```
返ってきた結果が
```
brew -v
->Homebrew 3.5.10
php -v
->PHP 8.1.9
compose -v
->Compose 2.4.1
```

とりあえずバージョンが古そうなのですべてバージョンを上げないと、、、
```
brew update
```
を実行！！！
でも何の反応もしないでずっと動かない:thinking:
調べてみるとIntel版とAppleシリコン版でHomeBrewの保存先が違う！！！
なのでAppleシリコン版のHomeBrewを入れないといけなくなったので以下コマンドを実行。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
Intel版のHomeBrewは削除して問題ないようなので、削除します。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
```
もともとのルートがIntel版になっているのでAppleシリコン版のルートに修正。
```
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```
ルートを確認して結果が以下になってればOK！
```
which brew
-> /opt/homebrew/bin/brew
```
ちなみにIntel版のルートはこちら
```
/usr/local/bin/brew
```
一応エラーが出ないかも確認しておこう
```
brew doctor
```
結果が返ってこなかったのでOK！

続いて「PHP」たちも入れていきます
#### 1.PHPインストールと確認
```
brew install php
php -v
```
#### 2.Composerインストールと確認
```
brew install composer
composer -v
```
#### 3.Nodeインストールと確認
```
brew install node
npn -v
```
これで下準備はOK！！

## 2.プロジェクト作成
ここからプロジェクトを作ってみようということで以下コマンドをターミナルで実行
```
composer create-project laravel/laravel my-app
```
※my-appの部分はディレクトリなので自分の好きな名前に変更してね

ディレクトリが問題なく作れたんで作成したディレクトリに移動してローカル環境に接続できるか確認するぞ！
```
cd my-app
php artisan serve
```
ここで問題発生、、、
artisanがPHP 8.2以上じゃないと使えないと言われた！
さっき最新の入れたはずだけどな、、、、:thinking:
もう一度確認してみよう！
```
php -v
->PHP 8.1.9
```
### !?!?
なんでまだ古いバージョンなんだぁ:thinking:
とりあえずPHP2.0入れてみよう(ついでにリンクも変更っと)
```
brew install php@8.2
brew unlink php
brew link --force --overwrite php@8.2
```
問題なく入ったぞ！確認！
```
php -v
->PHP 8.1.9
```
### !?!?
バージョンが変わってない。。。
Intel版の時に入れたのが影響してるか確認するためパスを確認。。。
※「/opt/homebrew/bin」が先頭にきてればAppleシリコン版に変わってるみたい
```
echo $PATH
->/opt/homebrew/bin・・・・
```
先頭に来てるからパスは問題なさそうだなぁ:thinking:
強制的にリンクを切り替えてみよう。。。
```
brew unlink php
brew link --overwrite --force php@8.2
```
念のためにシンボリックリンクも上書きだ、、、
```
sudo ln /opt/homebrew/bin/php /usr/local/bin/php
```
再確認！
```
which php
-> /opt/homebrew/bin/php
php -v
-> PHP 8.2.0
```
ちゃんとバージョン変更できた！
さて、改めて接続してみよう。
```
cd my-app
php artisan serve
```
お！ctrl＋C　で接続解除って書いてあるからいけるかも！
Chromeでローカルに接続だ！
▼URL
http://localhost:8000
接続できたーー！

一旦ここまで行けたらVsCodeで開けるかも確認して今日は終わろう
```
cd my-app
code .
```
ん？できない、、、
VsCodeの設定の問題か、、、？
```
Cmd + Shift + P
->「Shell Command: Install 'code' command in PATH」を選択
```

出来た！！！
いったん今日はここまで:joy:

次はDB接続とかいろいろ試してみよう！！！

## 最後に
ここまで読んでいただいてありがとうございます。
文章能力がないので記事を書いていく毎にレベルアップをしていきますので、
見守っていただければと思います。

また違う記事も訪問してみてね:hugging:
REST APIのテスト自動化：テストサンプル

## はじめに
APIテストを書く時に使用頻度の高いサンプルコードを集めてみました。
まずはこれらの簡単なテストの実施を導入し、理解度を深めてケースを増やしていくと良い。
とりあえず稼働させてみる！
そして品質としても最低限保証すること思います！


### 疎通確認　ステータスチェック
```python
pm.test("疎通を確認", function () {
    pm.response.to.be.ok;
    pm.response.to.have.status(200);
});
```

### レスポンス速度確認
```python
pm.test("レスポンス時間を確認", function () {
    pm.expect(pm.response.responseTime).to.be.below(3000);
});
```

### レスポンスの値チェック
```python
// レスポンスBody aaaaaのキーにiiiiiであることを確認
pm.test("Body aaaaaのキーを確認", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.aaaaa).to.eql(iiiii);
});
```


### レスポンスの値をenvironmentに保存
```python
// レスポンスのJSONデータを取得
var responseBody = pm.response.json();
// aaaaa要素の値を取得
var iiiii = responseBody.aaaaa;
// 環境変数uuuuuに値iiiiiを格納
pm.environment.set("uuuuu", iiiii);
```
REST APIテスト自動化：Postman環境変数で効率UP！

### 1. はじめに：なぜ環境変数？

APIエンドポイント、認証情報、テストデータなどを変数として管理してあげることで、複数のリクエストで再利用できます！
これにより、同じ情報を何度も入力する手間を省き、テストと開発の効率UP!

### 2. 環境変数の作成

*   **環境作成：**
    1.   Postman左メニュー「Environments」アイコン → 「Create Environments」
    ![スクリーンショット 2025-04-15 10.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49297/270c209c-86b2-45c6-a16b-978ea8a5e578.png)
    2. 名前を付けてSave
    <br>
*   **変数設定：**
    *   変数名、タイプ、初期値、現在値を設定
  ![スクリーンショット 2025-04-15 16.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49297/e065c3fa-0c40-4d5f-a5d7-d32890542e5a.png)


*   **環境切り替え：**
    *   Postman右上ドロップダウンで選択  
      <br>

### 3. 環境変数の活用

*   **URL管理：**
    *   `{{api_url}}` で参照
    *   例：開発環境 `api_url = "http://dev.xxxx.com"`
*   **認証情報：**
    *   APIキー、トークンを安全に管理
    *   例：`{{api_key}}`
*   **テストデータ：**
    *   ID、名前などを環境ごとに設定
    *   例：`{{user_id}}`
*   **スクリプトでの利用：**
    *   `pm.environment.get("変数名")` で取得
    *   例：`let url = pm.environment.get("api_url");`

### 4. 注意点

*   **命名規則：**
    *   `API_URL`、`AUTH_TOKEN` など、大文字スネークケース
*   **機密情報：**
    *   現在値のみ設定、共有しない
*   **チーム共有：**
    *   Postman Cloud、JSONエクスポート/インポート


### 5. newmanコマンドで環境ファイルを指定して実行
[こちら](https://qiita.com/s-iwahana/items/6b026e9b0b499a332eda)の記事でnewmanの実行方法を記載したが、オプションを設定することで環境ファイルを適用することができる

1.Environmentsを右クリックしてExport
2.
```javascript
newman run コレクション名.json -e 環境ファイル名.json
```


### 6. まとめ

環境変数を利用することでAPIテストを効率化することができます！
自動テスト始めたてだったりすると、変数という概念を知らず直接入力で動作を試し始めると思いますが、環境変数を理解することでかなりテストの幅が広がるし効率的で楽しくなります。