OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトマネジメントはまるで旅行！楽しく学ぶPMの基本

# はじめに

プロジェクトマネジメント（PM）は一見難しく感じるかもしれませんが、実は旅行の計画と非常に似ています。この記事では、旅行に例えながらPMの基本的な考え方を解説します。

![travel_people_pamphlet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/2f5a7d2c-04ff-58a6-e575-09272a727a64.png)


---

## 1. 目的地を決める（プロジェクトの目標設定）

旅行ではまず「どこに行くか？」を決めます。これはプロジェクトにおける**目標設定**にあたります。目標が明確でないと、どのような手段を取ればよいのか分からず、迷子になってしまいます。

### 例：
- 旅行：「沖縄でリゾートを満喫する」
- プロジェクト：「新規Webサービスを3か月でリリースする」

目標が具体的であればあるほど、計画も立てやすくなります。

---

## 2. 旅の計画を立てる（プロジェクト計画）

目的地が決まったら、次に「どうやって行くか？」を考えます。これが**プロジェクト計画**に相当します。

### 計画のポイント
- **スケジュール**（日程を決める）
  - 旅行：出発日、帰宅日、各観光地での滞在時間
  - プロジェクト：各タスクの期限、リリース日
- **予算管理**（コストを決める）
  - 旅行：航空券、宿泊費、食事代
  - プロジェクト：開発費、人件費、ツール費用
- **リソース管理**（必要なものを揃える）
  - 旅行：持ち物リスト、事前予約
  - プロジェクト：チームメンバーのアサイン、ツール準備

計画を立てることで、リスクを減らしスムーズに進めることができます。

---

## 3. 移動手段を決める（プロジェクトの進め方）

目的地に到達するための方法も重要です。旅行なら「飛行機」「新幹線」「車」などの手段を選びますが、プロジェクトも同様に、**どの手法を使うか**を決める必要があります。

### 例：
- 旅行：「飛行機で短時間移動」 or 「電車でのんびり旅」
- プロジェクト：「アジャイル開発で短期間リリース」 or 「ウォーターフォールで慎重に進める」

目的やリソースに応じて、最適な手法を選びましょう。

---

## 4. 予期せぬトラブルへの対応（リスク管理）

旅行中に「飛行機が遅れる」「ホテルが取れない」などのトラブルが発生することがあります。プロジェクトでも同じく**リスク管理**が重要です。

### 対応策の例：
- **リスク予測**：旅行保険に加入する ⇔ バックアッププランを用意
- **柔軟な対応**：悪天候なら屋内観光に変更 ⇔ 仕様変更が発生しても対応できるようにする

---

## 5. 旅行を楽しむ（プロジェクトの成功）

計画通りに進めば、旅行は楽しく、満足のいくものになります。プロジェクトも同じで、目標を達成できれば大きな成果となります。

### 旅行の成功の要因：
- 事前の計画がしっかりしている
- トラブルに柔軟に対応できる
- 参加者全員が楽しめる

これらはプロジェクト成功の要因と全く同じです。

---

## まとめ

プロジェクトマネジメントを旅行に例えると、以下のように整理できます。

| 旅行 | プロジェクトマネジメント |
|------|-------------------|
| 目的地を決める | 目標設定 |
| 旅の計画を立てる | 計画策定（スケジュール・予算管理） |
| 移動手段を決める | 進め方の選定（アジャイル・ウォーターフォール） |
| トラブル対応 | リスク管理 |
| 旅行を楽しむ | プロジェクトの成功 |

旅行と同じようにプロジェクトも、**しっかり計画し、柔軟に対応すること**が大切です。

プロジェクトマネジメントを身近に感じてもらえたら幸いです！


![family_airplane_travel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/3ea3b51d-afd3-4822-0dab-49584dbcd78d.png)
【忙しい人のためのネスぺ対策】VRRP

# VRRPとは
- <font color="red">**デフォルトゲートウェイ**</font>などを冗長化するためのプロトコル

### マスタールータ
- パケットの転送処理を行うルータ

### バックアップルータ
- パケットの転送処理を行わないルータ
- マスタールータがダウンした場合に、バックアップルータがマスタールータとなる

### 仮想IPアドレス/仮想MACアドレス
- VRRPを設定したで保持される仮想的なIPアドレスとMACアドレス
- 仮想IPアドレスは、PCなどに設定するデフォルトゲートウェイのIPアドレスとなる
- 仮想MACアドレスは、PCのARPテーブルに保持されるMACアドレス

### プライオリティ値
- マスタールータになるか、バックアップルータになるかを決定する値
- 最も<font color="red">**大きい**</font>プライオリティ値を持つルータが、マスタールータとなる

### VRRPグループ
- VRRPをサポートするルータ等により形成されているグループのこと
- VRRPグループの番号のことを<font color="red">**VRID**</font>といい、1～255まで指定可能である
- VRRPの規格では、最大<font color="red">**255**</font>組の仮想ルータ（VRRPグループ）を作成可能

### <font color="red">**VRRPアドバタイズメント(VRRP広告)**</font>
- VRRPを有効にしたルータ間（インターフェース間）でVRRPに関する情報をやり取りするための<font color="red">**マルチキャスト**</font>のこと。マスタルータからバックアップルータに対して定期的に送信される

### マスタールータからバックアップルータへの切り替わり
1.マスタールータが故障する
2.バックアップルータがVRRPアドバタイズメントを受信しなくなり、マスタールータが故障したと判断する
3.バックアップルータがマスタールータに昇格する（便宜上、新マスタールータと呼ぶ）
4.新マスタールータがGARPを送信することで、隣接SWのMACアドレステーブルを書き換える
5.仮想IPアドレス/仮想MACアドレスに対するパケットが新マスタールータに転送されるようになる

※GARP...自分自身のIPアドレスに対するARPのこと。IPアドレスの重複検知や同一セグメント上の機器のARPテーブルの更新、隣接機器のMACアドレステーブルを更新するために使われる。

### バックアップルータがマスタールータがダウンしたと判断する条件
- <font color="red">**バックアップがマスタルータからのVRRPアドバタイズメントを決められた時間内に受信しなくなった場合**</font>（VRRPアドバタイズメント=マスタールータの稼働状態の報告）

### トラッキング
- <font color="red">**マスタールータでインターフェース障害が発生した場合に、自動的にマスタールータのVRRPのプライオリティ値を下げる機能**</font>

### プリエンプト
- 最も大きいプライオリティ値を持つルータが、常にマスタールータとなる機能

### その他
- VRRPはインターフェースに対して設定するため、1台のルータで複数のVRRPグループを設定することが可能
- ルータ以外にも、サーバの冗長化にVRRPを使うことができる(keepalivedがその代表例)
BlazorでのServer Sent Eventsの実装

# 目的

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/fba9ab29-fffa-cd91-fb9f-28ba310e03a1.png)

ChatGTPなどのLLMに問い合わせを行った時の回答など最近Server Sent Eventsを使う場面が増えてきました。

今開発してるチャットボットの回答もWebAPI経由で問い合わせを行っているのでその回答をServer Sent Eventsで受け取るべくサンプルプログラムを作成しました。

動作するソース[こちら](https://github.com/kyamamoto03/ServerSentEvents)です。

# 動かす

上記のリポジトリからクローンし、Visual Studioで開き、ServerSentEvents.APIをでばっぐ実行してください
ブラウザが立ち上がり、Blazorの画面が表示されます。

# Server Side
キモは
コンテントタイプにtext/event-streamを設定し、WriteAsyncしたのちFlushAsyncするです

```csharp
    // コンテントタイプにtext/event-streamを設定
    context.Response.Headers.Append(HeaderNames.ContentType, "text/event-stream");
    var counter = 0;
    while (!context.RequestAborted.IsCancellationRequested)
    {
        counter++;
        var message = $"data: 現在は {counter} 回目です ({DateTime.Now:HH:mm:ss})\n\n";
        // Response.WriteAsyncでデータを返す
        await context.Response.WriteAsync(message);
        // 強制的に送信
        await context.Response.Body.FlushAsync();
        apiService.Logger.LogInformation("SSEAsync Send");

        await Task.Delay(5000);
    }
```

# Client Side
キモは

```csharp
    HttpResponseMessage response;
    // streaming is enabled
    httpRequestMessage.SetBrowserResponseStreamingEnabled(true);
```
でストリーミングをenableにし

```csharp
    using Stream responseStream = await response.Content.ReadAsStreamAsync(cancellationToken);
    await foreach (SseItem<string> item in SseParser.Create(responseStream).EnumerateAsync())
    {
        if (cancellationToken.IsCancellationRequested)
        {
            break;
        }

        SSEMessages.Add(item.Data);
        await InvokeAsync(() => StateHasChanged());
    }
```
ReadAsStreamAsyncでStreamを取得し、SseParser.Create(responseStream).EnumerateAsync()でデータを都度受け取りといった流れです。

SseItemとSseParserを使うにあたり
Nugetから[System.Net.ServerSentEvents](https://www.nuget.org/packages/System.Net.ServerSentEvents/9.0.1#show-readme-container)をインストールしてください

# 追加情報
## サーバが送信するデータについて

data:で始まり、改行を2つ入れる必要があることが判明しました。
サンプルで上げているコードにはすでに開業が入っています。
pytest-covでテストファイルがカバレッジ追跡対象にされないようomitを追加

## 環境
```pyproject.toml
requires-python = ">=3.13"
dependencies = [
    "pytest>=8.3.4",
    "pytest-cov>=6.0.0",
]
```

## pytest-covでテストファイルがカバレッジ追跡対象にされてしまう
[pytest-cov](https://pypi.org/project/pytest-cov/)は、[pytest](https://docs.pytest.org/en/stable/)でカバレッジを出力するツールです。

pytestは[`*_test.py`か`test_*.py`というファイル名をテストとして扱います](https://docs.pytest.org/en/stable/explanation/goodpractices.html#conventions-for-python-test-discovery
)。pytest-covをインストールしてそのままカバレッジを表示すると、この`*_test.py`か`test_*.py`というファイルをテスト対象として扱われてしまいます。

```
$ pytest --cov
```

```
---------- coverage: platform linux, python 3.13.1-final-0 -----------
Name            Stmts   Miss  Cover
-----------------------------------
hello.py           14      7    50%
hello_test.py       3      0   100%
test_hello.py       3      0   100%
-----------------------------------
TOTAL              20      7    65%
```

### omitを追加
pytest-covの設定でomitしておくと、カバレッジ計算の算出対象からテストファイルを除外できます。

https://pytest-cov.readthedocs.io/en/latest/config.html#configuration

```pyproject.toml（追記）
[tool.coverage.run]
omit = [
    "test/*",
    "*/*_test.py",
    "*/test_*.py",
]
```

```
---------- coverage: platform linux, python 3.13.1-final-0 -----------
Name       Stmts   Miss  Cover
------------------------------
hello.py      14      7    50%
------------------------------
TOTAL         14      7    50%
```
C#でメモリダンプを覗く方法の覚書

そのうち必要にせまられｔ清書します。

## ダンプの取り方

`dotnet-dump collect` を使う
https://learn.microsoft.com/ja-jp/dotnet/core/diagnostics/dotnet-dump#dotnet-dump-collect

1. サーバー等のシェルに入る
1. プロセス番号を取得
    - `dotnet-dump ps`
1. ダンプファイル置き場を作成する
    - `mkdir /tmp/memory` みたいな書き込み権限のあるディレクトリ
1. ダンプを取る
    - `dotnet-dump collect -p 1 -o /tmp/memory/$(date "+%Y%m%d%H%M%S").dump`
    - 複数回取ることもあるので `date` を入れている
1. シェルから出てファイルをローカルに取ってくる

## ダンプファイルの解析

`dotnet-dump analyze` を使う
https://learn.microsoft.com/ja-jp/dotnet/core/diagnostics/dotnet-dump#dotnet-dump-analyze

### コールスタックの状態を見る (pstacks)

`dotnet-dump analyze path/to/file.dump -c pstacks`
Power Apps でソートする列を切り替える


# はじめに

Power Apps のギャラリーでデータを表示する際に並び替え (ソート) をしたいことがあると思います。また、その際、ソートする列を切り替えたいということがあると思います。
今回はそのようなアプローチについて紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d4d3a027-14a8-24e1-5b4e-b7b35ed044c3.png)

# アプローチ

まず、アイコンとラベルをグループ化した部品をソートしたい列ごとに作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ffdc10d0-e591-c108-067e-0ff8df55ce42.png)

※もちろん、コンテナーで実装してもよいです

次に、`[OnSelect]`プロパティを以下のように設定します。gblSortColumn はソート対象の列を格納する変数です。gblSortOrder は true と false を切り替える変数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f1072750-87a1-859d-f520-a37211ffc169.png)

```
Set(gblSortColumn,"Title");
Set(gblSortOrder,!gblSortOrder)
```

:::note

```
Set(gblSortOrder,!gblSortOrder)
```

の部分は以下と同じ意味になります。上の書き方の方がすっきりしています。

```
If(
    gblSortOrder = true,
    Set(
        gblSortOrder,
        false
    ),
    Set(
        gblSortOrder,
        true
    )
)
```


:::

そして、ギャラリーの`[Items]`プロパティを以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cad93646-1b82-4238-e38b-a7c9eb97cc6e.png)


```
Switch(
    gblSortColumn,
    "Title",
    SortByColumns(
        '問題追跡 益森 20250108',
        "Title",
        If(
            gblSortOrder,
            SortOrder.Ascending,
            SortOrder.Descending
        )
    ),
    "DateReported",
    SortByColumns(
        '問題追跡 益森 20250108',
        "DateReported",
        If(
            gblSortOrder,
            SortOrder.Ascending,
            SortOrder.Descending
        )
    )
)
```

以下の方がすっきりしているのですが、この場合、委任の警告が出ちゃうため、Switch 文にしました。

```
SortByColumns(
    '問題追跡 益森 20250108',
     gblSortColumn,
    If(
            gblSortOrder,
            SortOrder.Ascending,
            SortOrder.Descending
        )
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/adc51f4c-cd25-bfce-c67e-10985c8025b7.png)

なお、フィルターをする際は、SortByColumns より内側で Filter 関数を利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cdb7e047-da27-8103-526c-b09acfc70bcb.png)

# まとめ

今回は、Power Apps のギャラリーでデータを表示する際にソートする列を切り替える方法を紹介しました。同じようなことを実装したい方にとって参考になれば幸いです。
サスペンドしたimpdpをKILLしたい

**impdp実行時にジョブがサスペンドした場合に、ジョブをKILLする方法について、解説します。**

```
dev@LAPTOP-ISHOKGQJ:~$ impdp usr01/pass01@db01 PARFILE=impdp.prm

Import: Release 19.0.0.0.0 - Production on 木 12月 26 15:36:07 2024
Version 19.20.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"N4OBJ01"."SYS_IMPORT_FULL_01"は正常にロード/アンロードされました
USR01."SYS_IMPORT_FULL_01"を起動しています: usr01/********@db01 PARFILE=impdp.prm
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
ORA-39171: ジョブは再開可能な状態で待機中です。
Resumable error: ORA-30036: 8(UNDO表領域'UNDOTB01'内)でセグメントを拡張できません
Resumable stmt status: SUSPENDED
Resumable stmt start: 12/26/24 15:36:46 stmt suspend: 12/26/24 15:50:10

(ここでジョブがサスペンドする)
```

**① CTRL+C を入力する。**

「Import > 」という表示とともに対話式ターミナルが起動する。

```
(前略)
Resumable stmt status: SUSPENDED
Resumable stmt start: 12/26/24 15:36:46 stmt suspend: 12/26/24 15:50:10

(CTRL+C を入力)

Import>
```

**② 対話式ターミナルに「kill_job」を入力する。**

「このジョブを停止しますか」に対して「yes」を入力する。少し待つと、ジョブのサスペンド状態が解除され、ジョブがKILLされる。

```
(前略)
Resumable stmt status: SUSPENDED
Resumable stmt start: 12/26/24 15:36:46 stmt suspend: 12/26/24 15:50:10

Import> kill_job
このジョブを停止しますか([yes]/no) yes

dev@LAPTOP-ISHOKGQJ:~$
```

**環境情報**

- Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Albumentationsを用いたデータ拡張(Data Augmentation)

## Albumentationsの基本トピック
https://albumentations.ai/docs/

### Albumentationsの概要とインストール
https://albumentations.ai/

Albumentationsは画像のデータ拡張(Data Augmentation)を行うにあたって用いられる高速かつフレキシブルなライブラリです。下記のコマンドを実行することによってPyPIからインストールすることが可能です。

```
$ pip install -U albumentations
```

https://albumentations.ai/docs/getting_started/installation/

`pip install`のオプションでつけた`-U`はライブラリがインストール済みだった場合に最新版にアップデートするオプションです。


### Albumentationsのサンプルコードの実行
https://albumentations.ai/docs/examples/example/

・元画像
![2007_000256.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/3b1ee916-839e-1a32-87f7-9ef0d93fe134.jpeg)

```python
import random

import cv2
from matplotlib import pyplot as plt

import albumentations as A


image = cv2.imread('images/2007_000256.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

transform = A.HorizontalFlip(p=0.5)
random.seed(7)
augmented_image = transform(image=image)['image']

plt.imsave("results/output1.png", augmented_image)
```

・実行結果
![output1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/0937d564-df60-13af-23a7-79d9879e0e46.png)
【Linux】シンボリックリンク(Symbolic Link)入門

## シンボリックリンクの基本トピック
### シンボリックリンクの概要
シンボリックリンク(Symbolic Link)はディレクトリやファイルまでのパスを含んだファイルのことを指します。シンボリックリンクを作成することで、カレントディレクトリから遠いファイルへのアクセスもスムーズに行うことが可能になります。


### シンボリックリンクの貼り方
```
.
├── other files
└── test
    └── sample
```

CLI(コマンドライン)で$tree$を実行した際に上記のようなディレクトリ構成が得られるとします。この際にシンボリックリンクを用いることで、`test/sample`ディレクトリを`sample`だけで指定が可能になります。

```
$ ln -s test/sample sample
```

たとえば上記のように`ln`コマンドを実行することで、`sample`を指定するだけで`test/sample`を取り扱うことが可能です。`ln`コマンドが正常に動作した場合`tree`を実行すると下記のような結果が得られます。

```
.
├── other files
├── sample -> test/sample
└── test
    └── sample
```

上記の`sample -> test/sample`が作成したシンボリックリンク(symbolic link)に対応します。このシンボリックリンクの動作確認にあたっては、たとえば下記のようなコマンドを実行すると良いです。

```
$ echo xxx > sample/test.txt
$ tree
```

・実行結果
```
.
├── other files
├── sample -> test/sample
└── test
    └── sample
        └── test.txt
```
【Linux】screen入門

## screenの基本トピック
### screenの概要とインストール
`ssh`でログインし作業を行う際などに`ssh`接続が切れるなどでjobが止まる場合があります。これはたとえばノートPCからGPUマシンのサーバにログインし、DeepLearningの学習などを行う場合、ネットワーク接続が維持できない場合に何らかの解決が必要になります。

このような場合の解決策の1つが`screen`です。`screen`を用いることで作業している状態をマシン(サーバ)の電源が切れない限りは保持ずることができます。

Ubuntu環境で`screen`のインストールを行うにあたっては下記を実行すれば良いです。

```
$ apt install screen
```


### screenの基本的な使い方
```
$ screen -S xxx
```

まず`screen`で新しいセッションの`xxx`を作成する場合は上記のように`screen -S xxx`を実行します。この後に何らかの処理を実行し、「`Ctrl`+`a`->`d`」を押すことでセッションからデタッチすることが可能です。デタッチした後、セッションの確認にあたっては下記のコマンドを実行すれば良いです。

```
$ screen -ls
```

・実行結果
```
[detached from 11111.xxx]
```

また、デタッチ後に再びアクティブな`screen`セッションに再接続するにあたっては下記のように`screen -r`コマンドを実行すれば良いです。

```
$ screen -r xxx
```

`screen`セッションを閉じる場合はexitコマンドか「`Ctrl`+`D`」を押せば良いです。
clineでAOAIのo1リソースを使用する

# あらすじ
clineというAIコード生成ツールがVSCodeとの親和性が高く非常に使いやすいという噂を遅ればせながら聞きつけ、会社のo1リソースを使って楽々プログラミング生活を過ごそうとしたところ、謎のエラーに遭遇したのであった・・・


# はじめに
以下はAzureOpenAIのリソースを使用する場合の話です。その他のケースについては未検証ですのでご容赦ください。
clineとはみたいな部分はQiita上にも多数の記事があり説明不要そうなのと、そも語れるほど知らないので割愛します。


# 遭遇したエラー

`400 Unsupported parameter: 'temperature' is not supported with this model.`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746407/7173483f-0944-d27b-9648-4c323e613b2f.png)

多分o1-previewで必須のパラメーターだったかなんかで、デフォルト値が設定されているのだと思いますが中のコードを読んだりはしていません。


# 解決

おそらく、clineでは2025-01-29現在未対応で、設定をいじっての解決はできなそうです。
なので代わりにclineのForkであるRooCode(RooVeterinaryInc.roo-cline)を使用します。
Forkなので使用感は大差ないはずと思っています。

ただそれだけではダメで、Settings内の `Enable streaming`のチェックボックスを解除することで、応答を得ることが可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746407/191c8663-c253-dd59-a714-c525fd5ad8b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746407/6ce6acd5-b6ee-1e3e-4980-411b05422a54.png)

質問を踏襲しようとして間違えました、こんな簡単なタスクもこなせないので人間はコードを書くべきじゃないですね。


# 参考
参考もとを貼ろうとしたらredditのリンクが弾かれてしまった。
ググると出てくると思います、サンキューReddit :)
PowerShellにおけるAZCopyのエラーハンドリング 


# 概要
PowerShellでazcopyを使用することでローカルのファイルを簡単にAzureBlobにコピーすることができます。
しかし、エラーが発生した場合のエラーハンドリングがうまくいかないことがあったのでそのエラーハンドリングについて記述します。

# エラーの内容
下のようなコードを実行しました。

```
try {
    $filePath = "C:\Users\user\Desktop\test.zip"
    # SASトークン
    $SASToken = "https://storageaccount.blob.core.windows.net/container/test.zip"
    azcopy copy $filePath $SASToken --recursive=true
} catch {
    Write-Error "AZCopyのエラーが発生しました。"
    Write-Error $_.Exception.Message
}

```
ここでSASTokenの権限を変更して、azcopyのエラーを意図的に発生させて、エラーハンドリングを正しく行うかのテストを行おうとしました。
エラーが発生するため、catchブロックが実行されるはずですが、エラーハンドリングが行われず、処理が最後まで行ってしまいました。

# 原因
PowerShell で azcopy コマンドを実行する際、azcopy は外部プログラムとして扱われるため、PowerShell の標準的なエラーハンドリング機構である try...catch ブロックではエラーを捕捉できないことがあるらしいです。

https://github.com/Azure/azure-storage-azcopy/issues/1105?utm_source


# 解決策

下記のコードで意図的に例外を発生させることでエラーハンドリングを行うことができました。
```
try {
    $filePath = "C:\Users\user\Desktop\test.zip"
    $SASToken = "https://storageaccount.blob.core.windows.net/container/test.zip"
    azcopy copy $filePath $SASToken --recursive=true
    
    # $LASTEXITCODEを使用してエラーをスロー
    $exitCode = $LASTEXITCODE
    if ($exitCode -ne 0) {
      throw "AzCopy failed with exit code $exitCode"
    }
    
} catch {
    Write-Error "AZCopyのエラーが発生しました。"
    Write-Error $_.Exception.Message
}

```
LASTEXITCODEはPowerShellで実行した外部アプリの終了コードを取得するための変数です。この処理を追加することで、azcopyのエラーが発生した場合に$exitCodeには0以外の値が入り、例外を発生させることができます。

LASTEXITCODEの詳しい説明については下記のサイトを参考にしてください。

https://zenn.dev/haretokidoki/articles/48b448e8c9a6f7

# 参考

https://github.com/Azure/azure-storage-azcopy/issues/1105?utm_source

https://tech.blog.aerie.jp/entry/2019/12/03/022650
PlaywrightでHTML要素を取得する

# はじめに
Playwrightを使用する中で、画面上のテキストボックス・ラジオボタン・チェックボックスなど操作対象の要素を特定する必要があります。
今回はHTML要素を特定し、取得する方法を記載します。

# 開発環境
言語：C#
IDE：Visual Studio2022

# Locatorを使用して要素を取得する
CSSやXPathを指定して要素を特定する場合に使用します。

## idで要素を特定する
HTML要素に指定されているid属性を使用して要素を特定します。
idはページ内で一意となるため信頼性が高い特定方法となります。
```
ILocator textElement = page.Locator("#textbox");
```
## classで要素を特定する
class属性を使用して要素を特定する方法となります。
※同じクラス名を持つ要素が複数存在する場合があります。
```
ILocator textElement = page.Locator(".text-control");
```
## 複数要素が見つかった場合
class属性を使用して要素を特定する場合、同じクラス名を持つ要素が
複数見つかる可能性があります。
その場合には、FirstやNthを使い特定の要素を取得する事が可能です。
```
//最初に見つけた要素を指定する
ILocator textElement = page.Locator(".text-control").First;

//n番目の要素を指定する
ILocator textElement = page.Locator(".text-control").Nth(n);
```

# さいごに
他にも役割を指定した要素へのアクセス、テキストから要素を検索する方法などもあります。
要素を取得した後の操作方法なども、今後記事にしていきたいと思います。
Qiitaの不具合報告手順

## はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。

今回は、Qiitaの不具合を見つけた時の報告手順を記載します。
わざわざ記事にする理由として、どこから報告したらいいのか少し悩んだので纏めました。
※ 技術記事でもなんでもないので今回は「Qiita」タグのみ設定しています。

:::note info
追記）今回報告した不具合は修正いただけました。早急な対応ありがとうございます！
:::

## どこから報告する？
報告ルートは2通りあります。

### サポートフォーム

1. Qiitaフッタの「ガイドライン」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/d5da3f80-cb4b-5fb9-ad2b-76678dc1ae95.png)
1. 画面内を「サポート」で検索してアンカーをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/25a58db1-1229-693c-5d0f-a2bdaaff541b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/0a55675a-faa1-c609-bce1-53bb70d2cdeb.png)

ここからQiita宛に連絡する事ができます。

### Qiita Discussions
`2024/01/30追記：こちらのルートからの報告方法をコメントで共有いただけたので追記します。ありがとうございます！`

今回のような Qiita の機能についての不具合報告については、こちらのルートを取る方がよさそうです。
※ Qiita Discussions から報告する際に github アカウントが必要です

1. Qiitaフッタの「ご意見・ご要望」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/1eff51de-cb16-f59b-1a3f-9a49defac1cc.png)
1. 「【初めにお読みください】」の内容を確認

ここからQiita運営チーム宛に連絡する事ができます。

## 何を連絡した？

:::note info
以下の現象は修正済みです。
:::

記事を書いている時にツールバーの「絵文字を選択」をクリックすると、何故かそれ以降「絵文字を選択」ボタンに強制的にフォーカスが当たり、文字の入力などができなくなる現象が発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/31cdc688-36bc-cbea-8bf1-c90d0ca08cf4.png)
Edgeを使用している時に気づきましたが、念のためChromeで実行しても同じ状態に。
割と使われている機能かと思ったので報告に至りました。
※ その際に「あれ？どこから報告するんだ？」と少し探したので薄い内容ですが記事にしました

報告後、「内容確認後にサポートチームから折り返し連絡します」とメールが届くのですが、「返答不要」的なチェックボックスがあってもいいかもしれない！
SM30_维护视图

1.事前通过SE11设置维护视图（详细请谷歌）
2.T-Code SM30进入到下面画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/8f0fda2a-e983-fd55-5c5d-add520d3d925.png)
3.可以对对象表格进行编辑。
AIエージェントを活用したウェブスクレイピングの方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/21735b38-7b35-7190-26ad-4f10c2bf3d2e.png)
# **AIエージェントを活用したウェブスクレイピングの方法**

ウェブスクレイピングは、人工知能（AI）の統合により大きく進化し、自律的にデータを収集・処理できるAIエージェントが登場しました。これらのエージェントは、効率性と精度を向上させ、データ収集において非常に有用なツールとなっています。

## **ウェブスクレイピングにおけるAIエージェントとは？**

AIエージェントとは、自律的にタスクを実行するソフトウェアプログラムのことです。ウェブスクレイピングの分野では、ウェブサイトを巡回し、適切な情報を特定し、データを抽出する役割を担います。従来のスクレイパーはあらかじめ決められたルールに従う必要がありましたが、AIエージェントは機械学習を活用して、異なるウェブサイトの構造やコンテンツの変化に適応することが可能です。

## **AIエージェントを活用するメリット**

### 1. **適応力**
AIエージェントは、ダイナミックで複雑なウェブサイトレイアウトにも対応し、レイアウトが変更されても手動で修正する必要がありません。

### 2. **高い効率性**
大量のデータを迅速に処理できるため、データ収集の時間を大幅に短縮できます。

### 3. **高い精度**
コンテキストを理解しながら適切な情報を抽出するため、従来のスクレイピング技術に比べて誤りが少なくなります。

## **AIエージェントを活用したウェブスクレイピングの実装方法**

### **1. 目標を明確にする**
まず、収集したいデータの種類や対象のウェブサイトを明確に定義します。

### **2. 適切なツールを選択**
プロジェクトに適したAIフレームワークやライブラリを選択します。  
例えば、[Crawl4AI](https://github.com/unclecode/crawl4ai) は、大規模言語モデル（LLM）やAIエージェント向けのオープンソースウェブクローラーとして利用できます。

### **3. AIエージェントの開発**
- **ナビゲーション**: AIエージェントがウェブページを適切に巡回できるように設計し、リンクやボタン、フォームなどを適切に処理できるようにします。  
- **データ抽出**: 機械学習モデルを導入し、必要なデータを的確に識別・抽出できるようにします。  
- **データ保存**: 抽出したデータを保存するためのデータベースやデータ構造を構築します。

### **4. テストと最適化**
異なるウェブサイトでエージェントの動作をテストし、精度とパフォーマンスを向上させるためにアルゴリズムを調整します。

## **倫理的な考慮事項**

AIエージェントを利用する際には、以下の点に留意し、責任を持って運用することが重要です。

### **1. ウェブサイトのポリシーを遵守**
各ウェブサイトの **利用規約** や **robots.txt** を確認し、許可されている範囲でデータ収集を行うことが必須です。

### **2. データプライバシーの保護**
個人情報や機密データを取得しないよう注意し、データの扱いには細心の注意を払う必要があります。

### **3. 法的遵守**
EUの **一般データ保護規則（GDPR）** などのデータ保護法を遵守し、合法的にデータ収集を行うことが重要です。

## **課題と今後の展望**

AIエージェントには多くのメリットがありますが、 **スクレイピング防止機能** や **進化するウェブ技術** に対応する必要があります。現在も研究が進められており、より強力で効率的なAIエージェントの開発が期待されています。例えば、[AutoCrawler](https://arxiv.org/abs/2404.12753) は、HTMLの階層的理解を活用した進化型ウェブスクレイピングフレームワークの一例です。

## **まとめ**

AIエージェントを活用したウェブスクレイピングは、従来の方法と比較して **高い適応性、効率性、精度** を誇ります。機械学習やAIの技術を活用することで、よりスマートなデータ収集が可能になります。しかし、倫理的・法的な側面を十分に考慮し、責任を持って利用することが求められます。

この技術を適切に活用し、データ収集を効率的に行うことで、より多くの可能性を引き出すことができるでしょう。
Microsoft 認定試験 SC シリーズ全制覇の道

NTTデータ先端技術株式会社の原田です。

2025年1月18日に全制覇となりました Microsoft 認定試験 SC シリーズの受験記となります。

## はじめに
SC-300 取得から PL ・ DP を挟んで SC シリーズ全制覇です、こちらもそんなに情報多くないと思いますのでご参考になれば。

## SC-300: Microsoft Identity and Access Administrator
* 受験日 : 2023年2月28日
* 試験会場 : 大宮NSDビルテストセンター
* 結果 : 合格
* 得点 : 772 (合格点 : 700)
* 勉強方法 : Microsoft Learn + ESI 模擬試験

SC-300 は Entra ID (受験当時はまだ Azure AD) の試験になります。
SC シリーズは Azure と Microsoft 365 のハイブリッドな範囲になりますが、Azure から入ってくると Entra ID Connect や Identity Governance あたりに補足の学習が必要になると思います。
あといくばくかのいわゆるオンプレミスの Active Directory の知識も問われますね。
全体としては広く浅くですので、経験を模擬試験で強化すれば行けるんじゃないかと思います。

## SC-200: Microsoft Security Operations Analyst
* 受験日 : 2024年11月29日
* 試験会場 : 秋葉原昭和通り口テストセンター1
* 結果 : 合格
* 得点 : 761 (合格点 : 700)
* 勉強方法 : Microsoft Learn + ESI 模擬試験

SC-200 はほぼ Sentinel の試験になります、Defender XDR や Defender for Cloud も含まれますが感覚的にはそんな感じです。　
学習方針はまず Sentinel の直観的ではない機能名とそのできることを覚えること、そして KQL を実用レベルで理解することの 2 点です。
特に KQL は感覚的に 2 割くらい出題されますので、全く触ったことがないとかなり辛いでしょう。
あとはできることから機能名を逆引きして、そこから Learn を駆使できれば合格に近づくと思います。

## SC-400: Administering Information Protection and Compliance in Microsoft 365
* 受験日 : 2024年12月27日
* 試験会場 : 秋葉原昭和通り口テストセンター2
* 結果 : 合格
* 得点 : 745 (合格点 : 700)
* 勉強方法 : Microsoft Learn + ESI 模擬試験

SC-400 は Purview 単体の試験になります、が Purview がいろんなサービスを繋ぎ合わせてブランド化していますので単体といえど試験範囲はかなり広いです。
おそらく Purview を体系立てて全範囲抑えている方は少ないと思いますので、ここは時間かけても学習リソースをしっかりなぞることをお奨めします。
試験自体も特定のサービスへの偏りなく均等に出題されますし、加えて Purview は手を動かしてってのが難しいので学習量で覚えるしかないと思いました。
あと問題数が確か 56 か 58 問あって、Learn 検索使いすぎてると確実に時間なくなりますね。

## SC-100: Microsoft Cybersecurity Architect
* 受験日 : 2025年1月17日
* 試験会場 : 秋葉原昭和通り口テストセンター2
* 結果 : 合格
* 得点 : 803 (合格点 : 700)
* 勉強方法 : Microsoft Learn + ESI 模擬試験

そして最後はお得意のエキスパート試験 SC-100 です。
はいご多分に漏れずこちらも広く浅く、SC シリーズを順番に取得してきていれば試験範囲はほぼ充足されているはずです。
学習リソースをやって置いたほうが確実ですが、知識問題が多いので模擬試験だけでも行けるかなと思います。
ただ問題数は多く SC-400 と同じく 50 問台後半ありましたので、油断してると時間なくなります。

## おわりに
SC シリーズ終わっての感想、試験範囲が広い・問題数が多い・べスプラ的な問題は少ない。
あと経験積むのが難しい領域なので、学習量がものを言うなと思いました。

次は MS・MD シリーズ全制覇を目指します。
【Power Automate】トリガーの作成方法について ～自動化したクラウドフロー編(イベントトリガー)～

## 概要
Power Automate は、さまざまなトリガーを使って自動化のプロセスを開始することができます。
この記事では、Power Automate におけるトリガーの作成方法の１つである
「自動化したクラウドフロー」の作成方法について説明します。
トリガーの基本的な種類に関して、簡単にではありますが以下の記事において説明をしています。

https://qiita.com/Sanwa_Paint/items/659e451d33f011a59bf5


## 自動化したクラウドフロー(イベントトリガー)の作成手順

1\. Power Automateにサインイン
+ 　Power Automate にサインインして、フローの作成を開始します。
 　
 
2\. 新しいフローを作成
+ Power Automateのホーム画面で「+ 作成」をクリックします。
+ 「自動化されたフロー」を選択します。
　自動化されたフローは、イベントトリガーを使って自動的に実行されるフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/784019b0-f215-9b14-e456-2c1393d49a79.png)

3\. トリガーの選択
+ フローを構築する画面でトリガーを選択します。
+ ここで使用したいイベントトリガーを選択します。
+  今回は例として Share Point を利用した「新しいアイテムが作成または変更されたとき」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/3b61be5c-22b7-59ce-622d-5dd14ef37e0f.png)

4\. トリガーの設定
+ 次にそのトリガーに関連する設定を行います。
サイトアドレス：使用する Share Point サイトの URL を選択します。
リスト名　　　：フローをトリガーしたいSharePointリストを選びます。
+ 必要な設定を入力したら、「新しいステップ」をクリックして、フローに次のアクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/d7b3ac3f-2e52-cfc2-5140-98d7a6a5cf07.png)


5\. アクションの設定
+ トリガーが発動した時に行いたいアクションを追加します。
`今回は選択したリストにアイテムが追加された際に、Microsoft Teams に通知が飛ぶように設定します。`

+ 「チャットまたはチャネルでメッセージを投稿する」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/3bc9ec85-fa5c-ea95-439d-dea77681bd37.png)

+ 各項目に値を入力し、メッセージを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/7e85092e-0b5e-ee64-6e7d-53a7d6dddb9b.png)

6\. フローを保存してテスト
+ `保存`を押してフローを保存を行い、保存ができたらフローのテストを行います。
+ Share　Point　リストでアイテムを作成または変更して、トリガーが正しく機能しているか確認します。


【Microsoft Teams への通知】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/5800d259-6a2e-8611-e79c-1a179fd9a239.png)

【テスト完了】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/75689f31-f488-82a4-0431-5ea9706524ce.png)


:::note warn
注意点
+ フローを作成するユーザーは、対象のSharePointリストまたはライブラリに対する十分な権限が必要です。
+ SharePointコネクタでMicrosoftアカウントに正しくサインインしていることを確認してください。
:::


### まとめ
とても簡易的な一例ではありますが、以上が「自動化したクラウドフロー（イベントトリガー）」の作成方法になります！
この他にも随時、他の種類のフローやトリガーについて記事を作成していく予定です！
ぜひ、ご活用ください！
supabase一時停止によるエラー

# はじめに
アプリ開発中開発ツールのコンソールで下記のようなエラーが表示され、こちらの解決に時間を要したため共有させていただきます。

supabaseの読み込みがうまくいっていないようです。
```console
@supabase_supabase-js.js?v=c601c353:3872 
 GET https://ajzhisdpnjhamjfyxyyl.supabase.co/rest/v1/study-record?select=* net::ERR_NAME_NOT_RESOLVED

App.tsx:33 データ取得エラー Error: TypeError: Failed to fetch
    at GetAllTodos (supabaseFunctions.ts:14:11)
    at async fetchTodos (App.tsx:22:22)
App.tsx:33 データ取得エラー Error: TypeError: Failed to fetch
    at GetAllTodos (supabaseFunctions.ts:14:11)
    at async fetchTodos (App.tsx:22:22)
```

# 解決方法
supabaseダッシュボードから一時停止を解除する。

# おわりに
他の実装をした後のタイミングで気づいたため、実装が影響しているものと思い込んでおりましたが、しばらくsupabaseが稼働していなかったことによる一時停止状態が影響しておりました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
Windowsバッチ(.bat)学習メモ　格納されている値が数値かどうかのチェック


<br>

##### ①：数値として扱い、エラーの有無で判定
```bat
@echo off
setlocal enabledelayedexpansion

set mayBeNum=123
set /a dummy=!mayBeNum! 2>nul
::数値でない場合だけ、メッセージを出力
if %errorlevel% neq 0 echo !mayBeNum! is Not Num

set mayBeNum=1w3
set /a dummy=!mayBeNum! 2>nul
::数値でない場合だけ、メッセージを出力
if %errorlevel% neq 0 echo !mayBeNum! is Not Num
```
```bat:結果
1w3 is Not Num
```

<br>

##### ②：0-9の数値を除去し、何も残らなければ数値と判定
```bat
@echo off

set mayBeNum=o151

set dummy=%mayBeNum%
set dummy=%dummy:=0%
set dummy=%dummy:=1%
set dummy=%dummy:=2%
set dummy=%dummy:=3%
set dummy=%dummy:=4%
set dummy=%dummy:=5%
set dummy=%dummy:=6%
set dummy=%dummy:=7%
set dummy=%dummy:=8%
set dummy=%dummy:=9%
if not "!dummy!"=="" echo !mayBeNum!は数値ではない
```
後輩のためのFigma入門（Step1）

# 後輩のためのFigmaの使い方

後輩のためにFigmaに関して書きました。

最初は登録からです。

## Figmaの登録の仕方

**Step1**　Figmaと検索します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/9224ecd7-cf81-1995-ecfb-ff9d6b01d564.png)

**Step2**　無料で始めるをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/e2cc548a-48f6-4470-6167-019f83635979.png)

**Step3**　メールアドレスを入力します（Googleで続行をおすすめします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/e4523e6b-7cac-9860-30c2-744d38c145d3.png)

**Step4**　名前を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/6dcce420-18f8-73f2-022c-bb4c28e15630.png)

**Step4**　職種を入力します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/04d2b915-43a3-044c-8cb5-178101b15666.png)

**Step5**　所属している場所を入力します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/d89733ee-fbda-d2f2-e574-49cfdbc98001.png)

**Step6**　仕事内容を選択します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/c0701fe8-0f3d-c58e-b5f5-277a7b48ccd6.png)

**Step7**　仕事仲間を選択します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/ab1379a4-53fd-69bf-8fb5-b406c8663b4e.png)

**Step8**　招待する場合はメールアドレスを入力します（後から追加・削除できます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/eb3428f4-e9ab-0093-d2d3-4107d67d93c6.png)

**Step9**　FIgmaを使う目的を選択します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/48c6dd0e-6c14-035a-f31a-e59dc8d4c377.png)

**Step9**　FIgmaの経験を選択します（機能に影響は出ないです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/b98b62dc-429b-d434-0727-1663e29e8367.png)

**Step10**　プランを選択します（最初は無料プランで十分です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/d42eb767-00fc-3184-00c7-8fe6f4eabf19.png)

**Step10**　どの機能を使いたいかを選択します（Skipで構いません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/66a7371d-d2b1-c3ad-c318-875c2c80f9d8.png)

**Step11**　この画面になれば登録完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/3fba5b3a-986c-7bfe-3a22-ce0cc7b9ec93.png)

## 続き
https://qiita.com/ko-tarou/items/c61550c2a3edb7bbabfc
Windowsバッチ(.bat)学習メモ　for文関連

* usebackq
・バッククォート「`」で囲まれた文字列を、コマンドとして認識するようになる
・ダブルクォート「"」で囲まれた文字列を、ファイル名として認識するようになる（通常は文字列として認識される）
・シングルクォート「'」で囲まれた文字列を、文字列として認識するようになる（通常はコマンドとして認識される）

```text:新しいテキスト ドキュメント.txt（batと同じ階層に配置）
a
ii
uuu
eeee
ooooo
```
* #### ダブルクォートの認識の変化
```bat
@echo off

set filePath="C:\Ex Periment\新しいテキスト ドキュメント.txt"

echo ◆usebackqなし◆
for /f %%a in (%path%) do echo %%a

echo.

echo ◆usebackqあり◆
for /f "usebackq" %%a in (%path%) do echo %%a
```
```bat:実行結果
◆usebackqなし◆
C:\Ex

◆usebackqあり◆
a
ii
uuu
eeee
ooooo
```

* #### シングルクォートの認識の変化
```bat
@echo off

rem 「q ww eee」を出力しろ、というコマンドの結果に対してトークン分割をする
echo ◆usebackqなし◆
for /f %%a in ('echo q ww eee') do echo %%a

echo.

rem 「echo q ww eee」という文字列に対してトークン分割をする
echo ◆usebackqあり◆
for /f "usebackq" %%a in ('echo q ww eee') do echo %%a
```
```bat:実行結果
◆usebackqなし◆
q

◆usebackqあり◆
echo
```
* #### 両方併用時
```bat
@echo off

echo ◆usebackqなし◆
for /f %%a in ('type "新しいテキスト ドキュメント.txt"') do echo %%a

echo.

echo ◆usebackqあり◆
for /f "usebackq" %%a in ('type "新しいテキスト ドキュメント.txt"') do echo %%a
```
```bat:実行結果
◆usebackqなし◆
a
ii
uuu
eeee
ooooo

◆usebackqあり◆
type
```
.NETのお勉強4_redisコンテナと連携

# 概要
AmazonLinux2023インスタンス上にコンテナで.NETを利用したサーバをたてる
そのお勉強メモ4

redisコンテナと連携する

# 連携の前にmysqlコンテナ単体たてる
最低限がこんな感じ
データの永続化のためvolumesで外にも出す
```yml
services:
  redis:
    image: redis:7.4.2
    ports:
      - "6379:6379"
    volumes:
      - ./redis:/data
```

# ソース
``` src/MyServerApp.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MySql.Data" Version="8.1.0" />
    <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.0" />
  </ItemGroup>
</Project>
```

``` src/Controller/RedisController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;

[ApiController]
[Route("[controller]")]
public class RedisController : ControllerBase
{
    private readonly IDistributedCache _cache;

    public RedisController(IDistributedCache cache)
    {
        _cache = cache;
    }

    [HttpGet("set/{key}/{value}")]
    public IActionResult Set(string key, string value)
    {
        var options = new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(10));
        _cache.SetString(key, value, options);
        return Ok($"SET {key} = {value}");
    }

    [HttpGet("get/{key}")]
    public IActionResult Get(string key)
    {
        var value = _cache.GetString(key);
        if (string.IsNullOrEmpty(value)) {
            return NotFound($"'{key}' not found");
        }
        return Ok($"GET {key} = {value}");
    }
}
```

``` src/Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "redis:6379";
});
builder.Services.AddControllers();

var app = builder.Build();
app.MapGet("/", () => "Hello, World!");
app.MapControllers();
app.Run();
```

``` docker-compose.hotload.yml
services:
  build:
    image: builder
    build:
      context: .
      dockerfile: Dockerfile.build
    volumes:
      - ./src:/src
    ports:
      - "80:8080"
    command: dotnet watch run --urls=http://0.0.0.0:8080
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: cs_test
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
  redis:
    image: redis:7.4.2
    ports:
      - "6379:6379"
    volumes:
      - ./redis:/data
```

# 実行テスト
xx.xx.xx.xx/redis/set/key1/value1アクセス後、redisコンテナ内でredis-cliで入ってデータが入っており、xx.xx.xx.xx/redis/get/key1アクセスでvalue1が表示されればok

# その他メモ
あとで勉強して追記
・redis系の処理はasyncすべき？
・redisはクラスターで使いたい
一年目のIT初心者がAWS　SAAを選択肢の癖読みで受かった話

IT企業就職一年目でありAWSどころかIT知識全般皆無だった自分が一カ月の勉強時間でほとんど理解しないままSAAに受かってしまった話です。

AWS　SAA（Solutions Architect - Associate）挑戦すると決めた時、自分は下位資格であるCLFすら取得していない状態でした。

昔から勉強は嫌いなのでインプットだと続かないと考えた結果、ひたすら模擬試験だけを解くアウトプットのみの勉強法に行きつきました。

結果としては７４２点でギリギリの合格となりましたが恥ずかしながら知識量的には到底合格ラインに達していなかったはず、、、

そんな僕がなぜ受かることができたかというとAWSの試験問題には間違った選択肢にも政界の選択肢にも確かな癖を感じるものが多くそれを見抜くことができたからです！！

ひたすらアウトプットを繰り返し、僕が気づくことができた選択肢の癖をこの初投稿で紹介させていただこうと思います。

※間違いなく自分の学びにはつながらないのでちゃんと知識をつけて試験に挑むことをお勧めします。

## 選択肢の癖
#### その１　「手動で」～という言葉が入ったらだいたい間違い
これはAWSのベストプラクティスでは、手動作業を極力減らし、自動化（Infrastructure as Code, CI/CD, Auto Scalingなど）を推奨しているからですね。
また、手動だとミスが発生しやすく、運用負担も増えるので当り前ですね。

#### その２　選択肢にサービスがたくさん出てきたらだいたい間違い
これはAWSでは、シンプルで運用しやすい設計が推奨されるからですね。
たくさんのサービスを組み合わせると 複雑になりすぎて管理が大変 になり、非効率。
例えば、静的サイトホスティングなら S3 + CloudFront で十分なのに、EC2, ALB, RDS などが含まれていたら 明らかにオーバーエンジニアリング で間違いの可能性が高いですよね。

#### その３　lambdaが出てきたらちょっとだけ怪しい
これはその２と同じような理由なのですが、lambdaを使えば確かに解決できるが、もともとlambdaを使わなくてもそのサービス自体がカバーできている機能をわざわざlambdaを使っている解決している選択肢をよく見かけました。もちろんlambdaが政界になるパターンもたくさんありますが一度疑ってみるのもいいかもしれませんね。

#### その４　サードパーティーの製品が出てくると間違いなことが多い
AWSのサービスを使ってほしいんでしょう。



ここまで書いてみたのですが、実は受験をしたのは２カ月ほど前で、当時はもっとあった気がするのですが残りは忘れてしまいました。よｔｔ今回はここまでにします。
他にもこんな癖あるよねっていうものがあればぜひ教えてください。

## 重要

ここに書かれていう内容はあくまで個人の感想になるので信じすぎないようにお願いします。
M3 Mac への phpenv を使用した php8.3 のインストールメモ

UpdatedAt: 2025-01-29

anyenv は入ってる状態からの phpenv と php8.3 のインストール
最終的なのは以下のイメージ

```
$ anyenv -v
anyenv 1.1.5
$ phpenv -v
phpenv v1.0.0
$ php -v
PHP 8.3.13 (cli) (built: Jan 29 2025 13:28:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.13, Copyright (c), by Zend Technologies
    with Xdebug v3.3.1, Copyright (c) 2002-2023, by Derick Rethans
```

手順

```
# anyenv で phpenv 入れる
anyenv install phpenv

# 環境変数再読み込みするため、ターミナルを新規タブか新規ウインドウで続きを実行する

# php install のためのライブラリ群インスト
# 参考: https://kojirooooocks.hatenablog.com/entry/2022/10/14/004658
brew install pkg-config bzip2 libjpeg libpng libiconv tidy-html5 libzip autoconf openssl libxml2 oniguruma pcre2

# 足りなかったので追加
brew install gcc
# Macのgrepではだめだったのでこっちを使わせるために追加
brew install grep
echo 'export PATH="$(brew --prefix grep)/libexec/gnubin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# gcc やらを指定して phpenv install を実行する（クソなが１文で実行する）
CC=$(brew --prefix)/bin/gcc-14 CXX=$(brew --prefix)/bin/g++-14 CXXFLAGS="-std=c++17" PKG_CONFIG_PATH="/opt/homebrew/opt/jpeg/lib/pkgconfig" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv) --with-tidy=$(brew --prefix tidy-html5)" phpenv install 8.3.13
```
ネストされたクラスに親クラスの@Keepは反映されるのか

# Question
こんなdataクラスがあったとします。

``` kotlin
@Keep
data class HogeResponse(
    val result: Result,
) {

    data class Result(
        val hoge: Boolean,
    )
}
```

親クラスの`HogeResponse`の方には`@Keep`があるので、難読化されなそう。
しかし、ネストされた`Result`の方には`@Keep`が付いていません。

この場合、`Result`クラスは難読化されるでしょうか？


# 結論
難読化されてしまいます。
ネストされたクラスには親クラスの`@Keep`が反映されません。

# 実験
`Result`に`@Keep`がある or なしで生成したapkに差分があるかを確認します。
AndroidStudioのBuildタブ > Analyze APKもしくはツリーの中から直接apkファイルを開くと確認できました。

**`@Keep`あり**
![@Keepあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982302/3a1181a6-78ab-ad45-27b2-3d6dacd82ccc.png)

**`@Keep`なし**
![@Keepなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982302/86eed18d-822a-368b-48de-57a7038a3dcf.png)

`@Keep`ありの場合は、`HogeResponse$Result`のツリーがあることと、`HogeResonse`内でも`Result`クラスを確認できるため、難読化されていないことがわかります。

対して`@Keep`なしの場合は、`HogeResponse$Result`のツリーがないことと、`HogeResonse`内でも`Result`クラスが確認できません。難読化によって、`M0.d`に変換されているようでした。


# まとめ
親クラスに`@Keep`つけてる場合は、ネストされたクラスにも`@Keep`つけようね。


# 補足：ChatGPTにも聞いてみた

![スクリーンショット 2025-01-24 17.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982302/cb6e5afa-8de3-0eb3-9f05-319461482e91.png)


とのこと。見解一致です。めでたしめでたし👏
【Unity】URPマテリアルの種類ってどう違うん？

# 初めに
<img src="画像URL" width="300">

モバイル開発してる→重いからURPに変える→ピンクになる→Lit？Unlit?なにそれ

となり検索したところムズすぎたので簡略化して自分用にまとめておきます。

![スクリーンショット 2025-04-23 151457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/13bae92a-c038-4d39-842d-7a96faffe57d.png)


# 種類
糞ほどある

https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/shaders-in-universalrp.html

### 表にすると↓

| 名前                      | 特徴                             | 使用ケース                 | 負荷     |
|----------------------|--------------------|-----------|----------|
| **Complex Lit**| 超高品質  |ビジュアルが重要なもの|かなり重い|
| **Lit**   | 標準的な高画質シェーダー      | オブジェクト全般    |重い|
| **Simple Lit** | Litの軽量版。シンプルな影| モバイル、低スペック |やや軽い|
| **Baked Lit** | ライトマップだけで明るさを表現 | 動かない背景や建物   |軽い |
| **Unlit** | 明るさや影の影響なし。色だけを表示| UI、マーカーなど|非常に軽い |
| **Particles Lit**| 光の影響を受けるパーティクル用 | 炎や爆発などリアルなVFX  | 重い      |
|**Particles Simple Lit**| 少しだけ光の影響を受ける軽量パーティクル用|モバイル用のエフェクト|やや軽い|
| **Particles Unlit** | 光の影響なし。パーティクル用| エフェクトなど|非常に軽い|
| **Decal** | 他の物体に貼り付くように表示できる | 血、汚れなど| 中くらい  |


# 各オブジェクトの質感

![スクリーンショット 2025-04-23 153558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/df3880fd-254d-47a7-8385-17685e10b300.png)

すべてテクスチャは同じものです
まず3Dオブジェクトから

## Unlit
最も軽量で、ライティングを使用しません。
また、物理的な正確さやエネルギー保存を使用しないため、
高速でレンダリングが行われます。
低スペックの端末でも有効な選択です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/be2046f6-516e-4ad7-a641-8e78a0d598fa.png" width="300">

## Simple Lit
写実性(リアリティ)よりもパフォーマンスが必要な場合に有効な選択です。
Unlitと同様に物理的な正確さやエネルギー保存を使用しないため、高速でレンダリングが行われます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/90a62902-4247-4d68-9594-6ff09d3a9bba.png" width="300">

## Lit
現実世界のような写実的なレンダリングが行われます。
URP内で最も演算負荷の高いシェーダーモデルを使用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/ef4e9fe2-0fb6-453a-8e41-cfff1a454c2f.png" width="300">


## Complex Lit
LitにClearCoatを加えたもの。
ClearCoat(クリアコート)は車をツヤツヤにする感じのやつで、有効にすると質感にテカリをさらに追加することができます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/a9ad41e7-349a-4bf4-92cb-40f5f796c5e8.png" width="300">


:::note info

ClearCoat 無効

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/bdf0fa1e-bffb-44e6-be2d-7a376d8361ef.png" width="300">

ClearCoat 有効
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/7a4675f4-24f5-4699-950a-24c598d9bf34.png" width="277">
:::
Windowsバッチ(.bat)学習メモ　文字列加工(for 環境変数以外)

## 前提
これらのオプションは、環境変数に対して使用することができない。
使用可能な対象は、引数(%1、%2など)、またはfor文内で使用するメタ変数(%%aなど)のみであるため、基本的には無理矢理for文内変数へ格納することが必要となる。

<br>

## ~：引用句(")を削除して展開
```bat
@echo off

set txtFile="sample.txt"

for %%a in (%tgtFile%) do echo %%~a
```
```bat:実行結果
sample.txt
```

## ~f：ファイル名からフルパスへ展開
※C:\【　実験　】\例\sample.txt、とする
```bat
@echo off

cd "C:\【　実験　】\例"

set txtFile="sample.txt"

for %%a in (%tgtFile%) do echo %%~fa
```
```bat:実行結果
C:\【　実験　】\例\sample.txt
```

## ~d：ファイル名のフルパスから、ドライブ文字だけを展開
```bat
@echo off

set txtFile="C:\【　実験　】\例\sample.txt"

for %%a in (%tgtFile%) do echo %%~da
```
```bat:実行結果
C:
```

## ~p：ファイル名のフルパスから、パス名だけを展開
```bat
@echo off

set txtFile="C:\【　実験　】\例\sample.txt"

for %%a in (%tgtFile%) do echo %%~pa
```
```bat:実行結果
\【　実験　】\例\
```

## ~n：ファイル名のみを展開
```bat
@echo off

set txtFile="C:\【　実験　】\例\sample.txt"

for %%a in (%tgtFile%) do echo %%~na
```
```bat:実行結果
sample.txt
```

## ~x：ファイル名の拡張子のみを展開
```bat
@echo off

set txtFile="C:\【　実験　】\例\sample.txt"

for %%a in (%tgtFile%) do echo %%~xa
```
```bat:実行結果
.txt
```

## ~s：ファイル名以外のパス（短縮名）を展開
> ##### 短縮名とは？
>**8.3形式**という命名規則に従って作成された名前のこと。
最大8文字（ファイルの場合は追加で拡張子部が最大3文字）という、かなりの制限が求められる形式であり、MS-DOS・Windows3.1といった古いOSで採用されていた命名規則となる。
Windows95以降はファイル名が250文字まで設定可となったことで影は薄れたが、互換性のため今でも秘密裡にこの形式のファイル名も生成されるようになっているらしい。
（例：`C:\Program Files`=`C:\PROGRA~1`。これはエクスプローラなどでも問題なく動作する）

> ##### 短縮名の取得
>基本は`dir /x`で取得する。
>`find`においては、`/s`で変換が可能。
※存在しないパスなどでは、短縮名が生成されていないため効力が発揮されない。注意

> ##### 短縮名の使用
>8.3形式のファイル名が必要になるケースとしては、
>・古いアプリを利用する時
>・cmd上で他プログラムを起動する際、**空白文字を含む長いファイル名ではうまく動作しない**時
>などが考えられる。
>スペースを含んでいるパスに対し、エスケープ文字の仕様や""での囲みといった、様々な策を弄しても失敗するというような場合、これを利用するのが吉のよう。
>（というか最初からこちらで良い気がする）

```bat
@echo off

set txtFile="C:\新しいフォルダー\新しいフォルダー\新しいフォルダー\asdfghjklqwertyuiopzxcvbnm.txt"

for %%a in (%tgtFile%) do echo %%~sa
```
```bat:実行結果
C:\temp\新しい~1\新しい~1\新しい~1\ASDFGH~1.TXT
```

## ~a：ファイルの属性を展開
> ##### アルファベットに対応するファイル属性
> d：ディレクトリ
r：読み取り専用
h：隠しファイル
s：システムファイル
a：アーカイブファイル
他
```bat
@echo off

set directory="C:\新しいフォルダー"
for %%a in (%directory%) do echo %%~aa

set txtFile="C:\新しいフォルダー\asdfghjklqwertyuiopzxcvbnm.txt"
for %%a in (%tgtFile%) do echo %%~aa
```
```bat:実行結果
d---------
--a--------
```

## ~t：ファイルのタイムスタンプを展開
```bat
@echo off

set directory="C:\新しいフォルダー"

for %%a in (%directory%) do echo %%~ta
```
```bat:実行結果
yyyy/mm/dd hh:mm
```

## ~z：ファイルサイズを展開
※KB・MB・GBなどではなく、バイト単位で表示されることに注意
```bat
@echo off

set directory="C:\新しいフォルダー\FAQ.txt"

for %%a in (%directory%) do echo %%~za
```
```bat:実行結果
nnnnn
```
>### ※捕捉
>ディレクトリを対象としても、基本は0になる。
ディレクトリ内のファイルの合計サイズを取得したい場合は、`dir`を使用する。
>リンク先参照。
>> [ディレクトリ内のファイルの合計サイズの取得方法](https://qiita.com/rinchang/items/f7feef83292ff938016d)
Windowsバッチ(.bat)学習メモ　ディレクトリの使用中容量取得

##### ※容量はKB・MB・GBではなく、バイト単位なので注意

```bat
@echo off

set directory="C:\新しいフォルダー"

for /f "tokens=3" %%a in ('dir %directory% ^| find "バイト" ^| find /v "空き"') do set nowUsing=%%a

echo %nowUsing:,=%
```

```bat:実行結果
nnnnn
```

> ##### 日本語が文字化けする場合
>```bat
>@echo off
>chcp 65001
>
>set directory="C:\新しいフォルダー"
>
>for /f "tokens=3" %%a in ('dir %directory% ^| find "bytes" ^| find /v "free"') do set nowUsing=%%a
>
>echo %nowUsing:,=%
>```
>```bat:実行結果
>nnnnn
>```
robloxでassistant その169

# 概要
robloxでassistantやってみた。
roblox見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/25seida/items/6368e5be929253330a8a

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/59541296-50b6-900a-4636-56f2846391cf.png)

# サンプルコード
localscript
```

local Common = Instance.new("Tool", game.ServerStorage)
Common.Name = "Common"
local Handle = Instance.new("Part", Common)
Handle.Size = Vector3.new(4, 1, 4)
Handle.Position = Vector3.new(0, 5, 0)
local Rare = Instance.new("Tool", game.ServerStorage)
Rare.Name = "Rare"
local Handle = Instance.new("Part", Rare)
Handle.Size = Vector3.new(1, 1, 1)
Handle.Position = Vector3.new(-2, 6, 2)
local SuperRare = Instance.new("Tool", game.ServerStorage)
SuperRare.Name = "SuperRare"
local Handle = Instance.new("Part", SuperRare)
Handle.Size = Vector3.new(1, 1, 1)
Handle.Position = Vector3.new(2, 6, -2)
local UltraRare = Instance.new("Tool", game.ServerStorage)
UltraRare.Name = "UltraRare"
local Handle = Instance.new("Part", UltraRare)
Handle.Size = Vector3.new(1, 1, 1)
Handle.Position = Vector3.new(-2, 6, -2)
local GachaMachine = Instance.new("Part", workspace)
GachaMachine.Size = Vector3.new(1, 1, 1)
GachaMachine.Position = Vector3.new(2, 6, 2)


local GachaRewards = {{ 
	Name = "コモン", 
	Probability = 50, 
	ItemName = "Common" 
}, { 
		Name = "レア", 
		Probability = 30, 
		ItemName = "Rare" 
	}, { 
		Name = "スーパーレア", 
		Probability = 15, 
		ItemName = "SuperRare" 
	}, { 
		Name = "ウルトラレア", 
		Probability = 5, 
		ItemName = "UltraRare" 
	}}
local function SpinGacha()
	local randomNumber = math.random(1, 100)
	local cumulative = 0
	for _, reward in pairs(GachaRewards) do
		cumulative = cumulative + reward.Probability
		if randomNumber <= cumulative then
			return reward.Name, reward.ItemName
		end
	end
	return "はずれ", nil
end
local function GiveItemToPlayer(player, itemName)
	local item = game.ServerStorage:FindFirstChild(itemName)
	if item then
		local newItem = item:Clone()
		newItem.Parent = player.Backpack
		print(player.Name .. " に " .. itemName .. " を渡しました。")
	else
		warn("アイテムが見つかりません: " .. itemName)
	end
end
local ClickDetector = Instance.new("ClickDetector")
ClickDetector.Parent = GachaMachine
ClickDetector.MouseClick:Connect(function(player)
	local rewardName, itemName = SpinGacha()
	print(player.Name .. " がガチャで当てた: " .. rewardName)
	if itemName then
		GiveItemToPlayer(player, itemName)
	end
	game.StarterGui:SetCore("SendNotification", {
		Title = "ガチャ結果";
		Text = "あなたが当てたアイテム: " .. rewardName;
		Duration = 3;
	})
end)



```

以上。
Amazon Auroraの延長サポート料金は何時から発生する？

## 背景

2025年2月28日にAWSのPostgreSQL 12（Aurora）の標準サポートが終了し、3月1日から延長サポートになるため、アップグレードの準備を進めています。もしも延長サポートを利用することになった場合の料金を計算したく、サポート開始時刻を知りたいと思いました。

標準サポート終了の案内がHealthダッシュボードに掲載されていましたが、終了日（2月28日）のみが記載されており、具体的な時刻の記載がなかったため、AWSサポートに確認しました。

## 延長サポートと料金の軽いおさらい

Amazon AuroraはPostgreSQLの多数のバージョンをサポートしていますが、コミュニティサポートが終了したバージョンは標準サポートも終了することがあります。リリースカレンダードキュメントによると、コミュニティサポート終了から約3か月後に標準サポートが終了する傾向ですね。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/aurorapostgresql-release-calendar.html

標準サポートの終了後にも延長サポートに入れば最大3年までサポートを受けることができます。
延長サポートでは、AWSが重大なセキュリティ問題やバグに対するパッチリリースを提供します。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/extended-support-overview.html

延長サポートの料金は、時間当たりのVCPUまたはACU（Serverless）と、サポート期間（1年＆2年、または3年）に基づいて課金されます。また、延長サポートを受けるためには、DBをLTSバージョン（利用可能な場合）および最新のマイナーバージョンにアップグレードする必要があります

https://aws.amazon.com/jp/rds/aurora/pricing/#Amazon_RDS_Extended_Support_costs

## サポート問い合わせ

### 料金関連の問い合わせはケースタイプを「アカウントと請求」にする

無意識的に普段よく問い合わせしていた「技術」で問い合わせをしましたが、延長サポート料金に関する質問はケースタイプを「アカウントと請求」にして問い合わせるよう案内されました。

### 問い合わせ結果

UTC（協定世界時）を基準としているため、日本時間では2025年3月1日午前9時からの開始となるようでした。

> ドキュメントなどに記載されている延長サポートの開始日時は、UTC 協定世界時 (+0000) でございます。
そのため、PostgreSQL 12 の延長サポートの開始日時は UTC の 2025/03/01 0:00 となり、日本時間の場合は 2025/03/01 09:00 となります。
> 

日本時間で0時開始と思っていたので、少し得した感じですね（笑）