OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SESの「検証保留」問題に一発で対処する方法と、仕組みの理解メモ

## はじめに

Amazon SES（Simple Email Service）を使ってメール送信をしようとしたとき、DNSの設定も済ませたはずなのに「検証保留（pending）」から進まないことはありませんか？

ググると「DNSがちゃんと反映されてるか確認しましょう」という説明が多いですが、それだけでは原因が分からず困ることも多いです。

本記事では、
* 検証保留の状態とは何か
* 一発で解消するためのチェックリスト
* SESの内部的な仕組み まで簡潔に紹介します。

初心者の方でも「なぜダメなのか」が分かるように解説していきます。

---

## 検証保留とは？

SESでドメイン認証（特にDKIM認証）を行う場合、
SESが提示するCNAMEレコードをDNSに設定する必要があります。

しかし設定後もSESの管理画面で以下のような状態になることがあります：

```
[検証保留] DNS 設定はまだ検証されていません
```

この「検証保留」状態は、SESがまだCNAMEレコードを正しく検知できていないことを意味しています。

---

## よくある原因と対処法（チェックリスト）

| 原因 | 確認ポイント | 対処 |
|:-:|:-:|:-:|
| DNSレコード未反映 |  TTLの待機時間が足りない |  数分〜最大72時間かかる。digやnslookupで確認 |
|  CNAMEのホスト名ミス | example.com ではなく xxx._domainkey.example.com  | SESの管理画面から正確にコピー  |
| ホスト名の省略ミス |  xxx._domainkey.example.com の登録が xxx._domainkey.example.com.example.com になってることも | FQDN（.で終わる完全な名前）で登録する  |
|  レコード競合 |  同一の_domainkeyを他サービスが使ってる |  DKIMを共有しない、用途を分ける |
|  外部DNS管理で未反映| Route53以外のDNSで登録し忘れ  |  管理者に伝えて設定を依頼 |

---

## 「一発で直す」ための確認コマンド

以下のコマンドで、CNAMEが正しく設定されているかを確認できます：

```
nslookup -type=CNAME xxx._domainkey.example.com
```

返ってきたCNAMEの値がSES指定のものと一致しているか確認します。

または dig を使ってもOK：

```
dig xxx._domainkey.example.com CNAME
```

---

## SESの内部仕組みと検証プロセス

以下のような流れで検証が行われます

```
[SES] ── CNAMEレコード確認 ──▶ [DNS] （Route53など）
     ◀── 正しい値なら承認、誤っていれば保留のまま
```
* SESは一定間隔でDNSをチェックし、提示したCNAMEが設定されているか確認します。
* DNSが正しく返答しない、または間違った値を返すと「検証保留」状態が継続します。

---

## それでも解決しない場合は？

* レコードを削除 → 再発行して登録し直す
* TTLの待機（最大72時間）を取る
* それでも無理な場合はAWSサポートに問い合わせ

---

## まとめ

* 「検証保留」＝SESが提示したCNAMEがまだDNSに反映されていない状態
* Route53ではFQDNの末尾の.など、設定ミスが多い
* nslookup や dig を使って、目視でDNSの実態を確認することが大事
* DKIMやSPFの仕組みを理解しておくと、他サービスの設定にも活かせる

---

## おまけ：DKIMとSPFのざっくり違い

| 種類 | 目的 | 設定方法 |
|:-:|:-:|:-:|
| SPF  |  なりすまし送信の防止（IP制限） | TXTレコードで送信元IP範囲を指定  |
|  DKIM | メールの改ざん検知  | CNAMEレコードで公開鍵を設定  |

---

以上です！

この記事が、SESの「検証保留」で詰まった誰かの助けになれば幸いです。

ご意見・補足があればぜひコメントで教えてください！
Sui上のCetus DEXを狙い、約2億6,000万ドル相当をハッキング

---

**1. ハックの概要**

* ハッカーはSui上のCetus DEXを狙い、約2億6,000万ドル（約3,600億円）相当を不正に引き出しました。盗まれた資金はUSDCにスワップされ、そのうち約6,000万ドル分がEthereumへブリッジされ、約21,938 ETHを取得しています([CryptoRank][1], [CryptoSlate][2])。

**2. 脆弱性のポイント**

* 問題箇所は `clmm_math.move` の `get_delta_a` 関数内：


https://github.com/CetusProtocol/cetus-clmm-interface/blob/1402fcab87160dfb81b9f3e91d0213edd4026455/sui/cetus_clmm/sources/math/clmm_math.move#L68


  ```move
  let (numberator, overflowing) = math_u256::checked_shlw(
      full_math_u128::full_mul(liquidity, sqrt_price_diff)
  );
  if (overflowing) { abort EMULTIPLICATION_OVERFLOW };
  ```
* ここで期待される「128ビット×128ビットの乗算結果を正しく256ビットで得る」処理が、実際には **乗算時のオーバーフローを検出 できず**、結果が切り捨てられてしまう可能性があります。つまり、「かけ算」のチェックが抜けているわけです。
* 本来は liquidity × sqrt_price_diff（128ビット×128ビット）の結果を「256ビットで正しく表せているか」を確かめる必要があります。ところがこのコードでは、その「かけ算」自体に異常が起きていても検出せずに先へ進んでしまいます。
* その後のシフト（`checked_shlw`）でしかオーバーフローをチェックしないため、すでに壊れた値がそのまま使われ、後続の価格計算（分子）が小さく誤算出されます。

<BR>

例えば「ビット幅を縮小したミニチュア版」でイメージしてみましょう。


## 例題：8ビット型×8ビット型 → 16ビット型を期待

1. **本来の計算**

   * `liquidity = 200`（8ビットで表せる最大は255）
   * `sqrt_price_diff = 200`
   * 期待する掛け算結果：

     $$
       200 \times 200 = 40\,000
     $$

     これは16ビット（最大 65,535）までは余裕で表現できます。

2. **もし “full\_mul” が壊れていて下位8ビットだけ返すと…**

   * 本来の 40,000（0x9C40） を 8ビットに切り捨てると、0x9C40 の下位8ビットは 0x40（＝64）になります。
   * つまり、本来「40,000」のはずが「64」になってしまう。

3. **シフト（ずらし）でのオーバーフローチェック**

   * つづけて `checked_shlw`（ビットをずらす処理）で「オーバーフローしていないか」を見るとき、すでに値は壊れているので問題なしと判定される。
   * 例：左に１ビットシフトしても 64→128（0x80） なので「溢れていない」と見なされる。

4. **その後の分母・除算**

   * たとえば分母（価格計算に使う値）を `100 × 100 = 10,000` とすると、

     * **本来** の結果：

       $$
         \frac{40\,000}{10\,000} = 4
       $$
     * **誤った** 計算：

       $$
         \frac{64 \;(\text{切り捨て後})}{10\,000} \approx 0.0064
       $$

       （整数型なので「0」になるか、`round_up=true` なら「1」になる）

---

### 何が起きる？

* **本来は4トークン必要なはず** の操作で、誤計算により **0〜1トークン** 分しか徴収されない。
* これを利用すると、プールから「ほんのわずかなコスト」で大量のトークンを取り出せてしまい、結果として大規模な資金抜き取り（ハック）が可能になります。

---

**まとめ**

* かけ算の段階で本来必要な大きな値が「切り捨てられて」しまい、そのあとにオーバーフローチェックをしても気づかれない。
* そのまま不正な（小さすぎる）必要量でトークンを引き出せてしまうのが、このバグの本質です。
 









**3. 悪用手順**

1. 攻撃者は非常に大きな `liquidity` と `sqrt_price_diff` を組み合わせ、128ビット乗算を意図的にオーバーフローさせる。
2. 本来はここでabortすべきところ、乗算時点のオーバーフロー検出がないため、結果が切り捨てられたまま次に進む。
3. その後の `get_delta_a` が返す ΔA（プールから必要なトークン量）が実際よりも極端に小さく計算され、`swap` や `removeLiquidity` 呼び出しで **極小のコストで大量の資産を引き出せる** 状態に。
4. プールが一気に枯渇し、ハッカーは多額の資金を瞬時に盗み取ることに成功。

---

**まとめ**

* `get_delta_a` の乗算オーバーフロー検出が「シフト時のみ」だったため、壊れた値で価格計算が行われ、プールの価格影響や必要トークン量が異常に低く見積もられた
* これを利用して、ハッカーはごくわずかな資金で巨額の資金を引き出し、約2億6,000万ドルを盗み取りました。

[1]: https://cryptorank.io/news/feed/623f1-sui-based-cetus-protocol-reportedly-exploited-for-over-260m-investigation-underway?utm_source=chatgpt.com "SUI-Based Cetus Protocol Reportedly Exploited for Over $260M ..."
[2]: https://cryptoslate.com/sui-based-cetus-protocol-suspends-operations-following-260-million-oracle-exploit/?utm_source=chatgpt.com "Sui-based Cetus Protocol suspends operations following $223 ..."
Google製の自立型コーディングエージェント「Jules」を使ってみた

## 概要
「Google I/O 2025」で、自律型コーディングエージェント「Jules」について発表がありました。ということで、実際に使ってみようと思います。

https://jules.google/

## 特徴

- 無料で誰でも使えるよ
- 一日5タスクまでしか使えないよ（どうやら60タスクまで増えたらしい）
    - https://x.com/testingcatalog/status/1928562073757188198
- タスクは同時に2つまで実行できるよ
- githubリポジトリに対して使えるよ
- パブリックベータ版だよ

## 使ってみた
ちょうど開発途中のスマホアプリがあるので、機能追加してみたいと思います。次のタスクとして編集機能の実装を考えていたので、Julesに編集機能を実装してもらいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/b0c498a6-6107-464d-be60-747ddcf50f32.png)

指示は以下の通りです。どの部分の修正をして欲しいかを指示していますが、具体的な編集要件はあえて伝えないでおきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/6470477f-3900-40fa-a0bd-2ae57f947e44.png)

だいたい3分くらいで生成が完了し、意図した部分に「編集」ボタンは実装してくれているようです。

![スクリーンショット 2025-05-23 8.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/85f297c6-f923-4b3a-901b-7df1ac1f6548.png)

どうやら私の意図を汲み取って、編集機能まで実装してくれているようですね。どんなものができあがっているか楽しみです。

![スクリーンショット 2025-05-23 8.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/1c236c0f-a896-4ae6-9cfa-f236b5bd3cfd.png)

では、バブリッシュします。指定したブランチからブランチを切ってくれているようです。

![スクリーンショット 2025-05-23 8.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/106271c3-452a-4fd4-9148-35f9c4601770.png)

では、手元で起動してみます。編集ボタンも表示されていますね。編集機能も私のイメージ通りのものを作ってくれているようでした。正直、正常に機能するかどうか不安でしたが、その点も問題ありませんでした。

![画面収録-2025-05-23-9.07.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4087869/359b3582-1dab-4f94-9e03-c4e50ad80a50.gif)

## 感想
だいぶAIも進化してきましたね。今回の「Google I/O 2025」では私生活にもかなりAIが組み込んでくるような発表でしたので、さらにAIが世の中に浸透していきそうです。
シートの連番マクロ

シートの連番

Sub シートを1から100まで作成_全セル文字列()

    Dim i As Long
    Dim ws As Worksheet

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ' 既存のシートをすべて削除（必要に応じてコメントアウト可）
    Do While Worksheets.Count > 0
        Worksheets(1).Delete
    Loop

    ' シートを1〜100まで作成
    For i = 1 To 100
        Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        ws.Name = CStr(i)
        
        ' シート全体を文字列形式に設定
        ws.Cells.NumberFormat = "@"
        
        ' 任意：A1セルにシート番号を文字列で入力
        ws.Range("A1").Value = CStr(i)
    Next i

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub
Javaのコンストラクタについて

# コンストラクタ
- インスタンスを生成するときに呼ばれる処理。
## 前書き：インスタンスとは
- 後述ｎコードブロックにおいて、クラス定義から、`Person taro = new Person("太郎", 20);`などと実際につくられたものがインスタンスである。

## コンストラクタとは
- インスタンスを作成したタイミングで設定の読み込みや、フィールドの初期化等の処理をしたい場合に宣言を行う。
- 下記のコンストラクタは、インスタンスを作ったときに自動的に呼ばれて、
    1. 名前（name）と年齢（age）を引数として受け取る
    2. その値を、`this.name = name;` のように、Personの中の `this.name`, `this.age` にセットする
        - `this.name` : クラスが持っている変数（フィールド）
        - `name` : 引数（コンストラクタに渡された値）

```Java
// クラス定義
public class Person {
    String name;
    int age;

    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
```
### コンストラクタの書き方
- メソッド名の部分はクラス名と同じ
- 戻り値の宣言が存在しない

## 新しいインスタンスの生成
```Java
Person taro = new Person("太郎", 20);
```
- `Person` クラスの設計図をもとに 新しいオブジェクト（インスタンス）を作る
- `new` によって自動的に Person(String name, int age) が呼ばれる
    - Javaの仕様では、`new クラス名(...)` の `(...)` の中身を見て、対応するコンストラクタを探して呼び出す。
- "太郎" と 20 が引数として渡される
- `this.name = "太郎";`, `this.age = 20;`　のように、値をセットする。
    - `this.name`: この場合では、Personクラスが持っている `name`という変数
- `taro` という変数に、そのオブジェクトの住所（参照）が代入される
メモ

```
#!/bin/bash

# カテゴリ:ディレクトリの対応（必要に応じて変更可）
declare -A CATEGORY_DIRS=(
  [To]="/var/spool/postfix/to"
  [From]="/var/spool/postfix/from"
  [Bcc]="/var/spool/postfix/bcc"
  [Ndr]="/var/spool/postfix/ndr"
)

# 出力ファイル
OUTPUT_FILE="postfix_perf_metrics.csv"

# CSVヘッダ出力（初回のみ）
f_initialize_output_file() {
  if [ ! -f "$OUTPUT_FILE" ]; then
    printf "%-25s" "Date"
    for _category in "${!CATEGORY_DIRS[@]}"; do
      printf ",%6s" "$_category"
    done
    printf "\n" >> "$OUTPUT_FILE"
  fi
}

# 各カテゴリのファイル数を収集（並列）
f_collect_counts() {
  local _tmpdir _key _dir
  _tmpdir=$(mktemp -d)

  for _key in "${!CATEGORY_DIRS[@]}"; do
    _dir="${CATEGORY_DIRS[$_key]}"
    find "$_dir" -type f | wc -l > "$_tmpdir/$_key" &
  done

  wait

  declare -gA CATEGORY_COUNTS
  for _key in "${!CATEGORY_DIRS[@]}"; do
    CATEGORY_COUNTS["$_key"]=$(<"$_tmpdir/$_key")
  done

  rm -r "$_tmpdir"
}

# CSV出力
f_output_metrics() {
  local _timestamp="$1" _key
  printf "%-25s" "$_timestamp"
  for _key in "${!CATEGORY_DIRS[@]}"; do
    printf ",%6d" "${CATEGORY_COUNTS[$_key]}"
  done
  printf "\n" >> "$OUTPUT_FILE"
}

# 次の「分の00秒」まで sleep
f_wait_until_next_minute() {
  local _now_sec _next_minute _sleep_sec
  _now_sec=$(date +%s)
  _next_minute=$(( (_now_sec / 60 + 1) * 60 ))
  _sleep_sec=$(( _next_minute - _now_sec ))
  sleep "$_sleep_sec"
}

# メインループ
f_main_loop() {
  while true; do
    local _now
    _now=$(date -Iseconds)
    f_collect_counts
    f_output_metrics "$_now"
    f_wait_until_next_minute
  done
}

# 実行
f_initialize_output_file
f_main_loop
```
セキュリティ対策における機能と基本的な考え方

## 情報セキュリティ対策の機能と基本的な考え方
### 情報セキュリティ対策の機能
* 抑止・抑制
  * 人間の意識に対し、犯罪や不正行為を思いとどまらせるように働きかけ、問題の発生を未然に防ぐこと
  * 社員や派遣社員など、内部で業務を行う要因が主な対象となる
  * 対策
      * セキュリティポリシの策定・運用
      * 情報セキュリティ教育の実施
      * 社内ネットワークの監視(告知だけでも効果◯)
* 予防・防止
    * 組織、物理環境、情報システムなどの脆弱な部分に対して、あらかじめ対策を施し、堅牢な状態にすること
    * 対策
        * 機器・設備の定期保守
        * 脆弱性検査の実施
        * ソフトウェアの最新化
        * 機密データの暗号化
* 検知・追跡
    * サイバー攻撃や内部犯罪の発生を速やかに発見・通知し、その原因・影響範囲の特定に必要な情報を確実に取得・保全することで問題の拡大・拡散を防ぎ、損害を最小限に抑えること
    * 対策
        * マルウェアの常時検査
        * ログ取得・分析
        * コンピュータやネットワークの監視・記録
        * サイバー攻撃のリアルタイム監視・記録
        * 重要な情報資産が存在する場所への監視カメラの設置
* 回復
    * サイバー攻撃や内部犯罪、機器障害などによって問題が発生した場合に、情報システムやネットワークを正常な状態まで復旧させること
    * 対策
        * バックアップデータの保存
        * 復旧手順書の整備
        * ログの出力と保存
        * 不測事態発生時の手順と体制の明確化
        * 不測事態を想定した訓練
### 情報セキュリティ対策における基本的な考え方
* 対策を検討する前にリスクアセスメントを行う
    * 実施する情報セキュリティ対策を検討する前に、想定されるリスクについて分析・評価し、実施する対策の目的・効果を明確にする
* 守るべきものを認識する
    * 組織の情報資産やそれを利用するための仕組みである情報システム等について何を守らなけばならないのかを認識する
* 脅威を知る
    * 重要な情報資産を脅かすものの存在を認識し、その種類、攻撃者の手口についても可能な限り詳細に把握する
    * 自社のサイトに対してどのような攻撃が行われているのかを知る
* 脆弱性を知り、対処する
    * 組織や情報システムのどこに脆弱性があるのか、それによってどのようなリスクが顕在化させるのかを認識し、対処する
* 情報セキュリティの方針、基準を明確にし、手順等を整備する
    * 情報セキュリティに対する組織の方針、基準を明確にし、関係者の意識や認識を合わせる
    * 対策を確実に実施し、過失による問題の発生を防ぐため、手順書等を整備する
* セキュリティと利便性のバランスをとる
    * セキュリティと利便性はトレードオフのため、リスクを考慮した上でバランスをとることが重要
* インシデントの未然防止に努めつつ、発生時に備えた対処を確実に行う
* 実施した対策の有効性について第三者によるレビューを実施する
* 最小権限の原則を徹底する
    * 紹鴎資産にアクセスする人間、プロセス、プログラム等に対し、常に必要最小限の権限のみを付与する
* 責務分離の原則を徹底する
    * 業務ごとに担当を分離する
        * 複数の業務を与えると、確認不足によるミスや、不正行為発生の原因となるため
* 重要な情報を取り扱うシステムとインターネット接続環境を分離する
* フェールセーフを考慮してシステム設計・構築する
    * システムに障害が発生した場合、安全な方向に向かうように設計・構築する
* システムの構成や機能を単純にする
    * 単純であるほど、セキュリティを確保しやすい
* システムや設備の重要な機能を分散化する
* 二重・三重の対策を施す
* 利用者を一意に識別し、事象の追跡・検証を可能とする
    * システムで発生する様々な事象について、それを発生させた主体(利用者、端末、プロセスなど)を一意に識別し、追跡できるようにする
    * 複数人でのアカウント共有×
    * ログを確実に記録し、改ざん、滅失が発生しないようにする
npmのパッケージバージョンを固定する運用に切り替えた話


# npmのパッケージバージョンを固定する運用に切り替えた話

## はじめに

npmの依存パッケージ管理について、これまで「package-lock.jsonを管理していれば十分」と考えていました。しかし、チーム開発や自動アップデートツール（dependabot等）の導入が進む中で、バージョンの不一致や意図しないアップデートによるトラブルが増えてきました。

そこで、**パッケージのバージョンを完全に固定する運用**へ切り替えたので、その背景と手順をまとめます。

---

## 背景・課題

- `package-lock.json`のコンフリクトが頻発し、解消のたびにバージョンがずれることがあった
- `^`や`~`でバージョン指定していると、lockファイルを消して再インストールした際に、意図しない新しいバージョンが入ることがあった
- 結果として、「意図せず挙動が変わった」「最新バージョンのバグを踏んでしまう」といった問題が起きやすくなった


## バージョン固定の方針

- すべての依存パッケージを「完全一致」で管理する
- `package.json`のバージョン表記も信頼できる状態にする
- lockファイルを消しても、同じバージョンで再現できるようにする


## 実際の手順

### 1. 依存パッケージを最新化

```bash
npm update --save
```
これで、現状のバージョン範囲内で最新のものに揃えます。
`--save` をつけることで、`package.json`のバージョンが更新されます。
変わらないものは手動で`package.json`を修正しました。

### 2. lockファイルと`node_modules`を削除

```bash
rm -rf package-lock.json node_modules
npm cache clear --force
```
一度クリーンな状態にします。

### 3. `.npmrc`で「バージョン固定」設定

```bash
touch .npmrc
```
`.npmrc`に以下を記述します。

```bash
save-exact=true
```
これにより、`npm install`時にバージョンが完全一致で記録されるようになります。

### 4. パッケージを再インストール

```bash
npm i
```
これで`package.json`のバージョン指定がすべて「完全一致」になり、以降のインストールもブレなくなります。

---

## 注意点・補足

- 既存の`^`や`~`が残っている場合は、手動で修正が必要です
- lockファイルを消す場合は、必ずバージョン指定を見直してください

---

## 参考リンク

- [Renovate公式：Dependency Pinning](https://docs.renovatebot.com/dependency-pinning/)

---

## まとめ

パッケージのバージョンを固定することで、
- チーム全体で同じ環境を再現しやすくなる
- 意図しないアップデートによるトラブルを防げる
といったメリットがありました。
(QA)IBM i のグループプロファイルの作成の仕方を教えてください

首記ご質問です。

かつては5250でコマンド操作でしかできませんでしたが、最近はNavigator for i 使う方が早くてかんたんです。

## 復習：グループプロファイルとは？
複数のIBM i ユーザー・プロファイル（ユーザーID）に共通のアクセス権限その他属性を設定する際に利用する事が多いです。たとえば、給与操作用グループプロファイル、A工場用グループプロファイル、などを作成しそれぞれの操作に必要な権限設定や環境設定を行います。設定できる内容は基本的に一般の（個人用の）ユーザープロファイルと共通です。作成完了したグループプロファイルに給与操作を行う個人のユーザープロファイル、A工場の操作を行う個人のユーザープロファイルを追加（登録）することでグループプロファイルの権限設定や環境設定を継承出来ます。個人のユーザープロファイルには個々の権限設定や環境設定は行いません。これによって例えば退職や異動の際には個人のユーザープロファイルを操作するだけで済むので設定ミスや忘れなどを抑止できます。

## Navigator for i でグループプロファイルを作成する。

Navigator for i でのグループプロファイルはとてもかんたんです。
**ステップ：1 Navigator for i でグループの作成を開く**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/38b68854-1c75-47e5-a480-e73b1a0f8131.png)

**ステップ：2 グループの作成パネルで必要な情報を入力する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0eac98cb-856b-41d5-a162-256b12eee566.png)

名前：グループプロファイルの名前　この名前でグループプロファイルが作成されます。
記述：任意のコメント
ユーザー：このグループプロファイルに所属させる個人用のユーザープロファイルを選択して、選択されたユーザー　の欄に登録（追加）します。例ではユーザーID GOMAを追加しています。

以上が完了したら、ウィンドウ右下のOKボタンを押して作成します。（画像では切れてしまいました(^^;）

以上で設定は完了です。

## グループプロファイルを確認しておく。

上記で作成したグループユーザー・オブジェクトがどのように見えるか確認しておきます。
Navigator for iでは、グループ　を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3a474b80-d2ea-43e5-878b-8129a08c893a.png)

下記のように作成したグループプロファイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/30509687-c479-4b88-973d-1f2741d2b193.png)

グループプロファイルを右クリックして開くと下記のように属している個人のユーザープロファイルが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9a2bca4d-0a9d-44f4-8cc6-3ed7c45f30cd.png)

**5250画面では WRKUSRPRFコマンドで確認できます。このコマンドでは個人用のユーザープロファイルとグループプロファイルを識別しないので（大昔からの振る舞いがそのまま残っています…）、初見だとちょっとわかり難いと思います。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a8c9af68-cee5-4d04-a389-4b3bd43e49fc.png)

上記の例では、GRPPRF1 だけがグループプロファイルでそれ以外は通常の個人用ユーザープロファイルです。
Databricks にて Azure IoT Hub に対して Device twin's reported properties を送信する方法

## 概要

Databricks にて Azure IoT SDK により Azure IoT Hub に対して Device twin's reported properties を送信する方法を共有します。

## 事前準備

### 環境構築

- Azure IoT Hub の構築 （本手順は Free tier で実施）
- Databricks （本手順は Serveless ではなく汎用コンピュートで実行）

### デバイスの作成と接続文字列の取得

Azure IoT Hub のリソース画面にて、`デバイス`タブを選択後、`+ デバイスの追加`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/32708e89-0264-4b64-b5f2-494be974a7d4.png)

`デバイス ID`に任意の値を入力し、`保存`を選択してデバイスを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/37ac238e-cbd3-48d6-82f5-68cf9038354e.png)

作成したデバイスを表示して、`プライマリ接続文字列`の`コピー済み`を選択して値をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4f8d5549-6a72-4ff4-9e10-0e23214201f6.png)


## デバイス ツインの報告されるプロパティ（Device twin's reported properties）を送信する方法

ライブラリをインストールします。

```python
%pip install azure-iot-device -q
dbutils.library.restartPython()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/68790aa8-a1f9-4c24-ae0a-1030d2d07b08.png)

デバイスに対する接続文字列をセットします。

```python
device_conn_str = "HostName=iot-hub-test-001.azure-devices.net;DeviceId=qiita_test_01;SharedAccessKey=r2fxXUdn/4w9iNJdhqnIJZ+h0qxxxxx="
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e700229a-f912-4f57-a495-03de5a43b1fb.png)

デバイス ツインの報告されるプロパティ（Device twin's reported properties）を送信します。

```python
import time, random
from datetime import datetime, timezone
from azure.iot.device import IoTHubDeviceClient

client = IoTHubDeviceClient.create_from_connection_string(
    device_conn_str,
    websockets=True,
)
client.connect()

reported = {
    "firmwareVersion": "1.2.0",
    "batteryLevel": random.randint(10, 100),
    "lastTelemetryUtc": datetime.now(timezone.utc).isoformat(),
}
client.patch_twin_reported_properties(reported)
print("✓ reported sent:", reported)

# ── ③ desired の差分を受け取り、応答として reported を送り返す例
def on_desired_patch(patch):
    print("★ desired patch:", patch)
    # $ で始まるキーを除去してエコーバック
    clean = {k: v for k, v in patch.items() if not k.startswith("$")}
    clean["appliedUtc"] = datetime.now(timezone.utc).isoformat()
    client.patch_twin_reported_properties(clean)
    print("✓ reported echo:", clean)

client.on_twin_desired_properties_patch_received = on_desired_patch


time.sleep(60)
client.shutdown()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b1e41e25-9a7d-4536-ba44-651a92279bcf.png)


Azure ポータルの Azure IoT Hub の画面にてデバイスツインが更新されていることを確認します。デバイスを表示し、`デバイス ツイン`を選択します。更新した内容（例：`batteryLevel`が`62`）が反映されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0483a053-d6b3-421c-8676-5a359c70ee25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3d4baf7b-690a-4d58-ace7-3712d9043ab6.png)
📗 Vol.8.12〜：共通レイアウト、<%@ include %> 設計など

🔗 本章は「Vol.8.9〜：Struts2 タグライブラリ応用編（実務／初級応用）」シリーズです。

---
## 🧭 はじめに

本記事では、Struts2アプリケーションにおいて **共通レイアウト（ヘッダー・フッター・メニュー等）を再利用できる構造** を実現するための方針と、実装例を解説します。

複数画面に共通する部品を適切に分離・再利用することで、

- コードの重複削減  
- デザインの一貫性維持  
- メンテナンス効率の向上  

が可能になります。

---

## 📌 本記事の対象内容

| 項目 | 説明 |
|------|------|
| `common/header.jsp` | ロゴやナビゲーションなどの共通ヘッダー |
| `common/footer.jsp` | フッター・著作権表示など |
| `common/menu.jsp`   | ログイン後ユーザーメニュー |
| `<%@ include %>`    | 静的インクルードによる共通化 |
| `<s:include>`       | Struts2タグによる動的インクルードとの違い |

---

## 🧱 ディレクトリ構成案

```
/WebContent/
├── view/
│ ├── common/
│ │ ├── header.jsp
│ │ ├── footer.jsp
│ │ └── menu.jsp
│ ├── BulletinboardManagementScreen.jsp
│ ├── UserManagementScreen.jsp
│ └── ...
```


---

## 🧩 `header.jsp` の例（共通ヘッダー）

```jsp
<!-- /view/common/header.jsp -->
<div class="header">
    <h1>My Bulletin Board</h1>
    <hr/>
</div>
```
---

## 🧩 `footer.jsp` の例（共通フッター）
```jsp
<!-- /view/common/footer.jsp -->
<hr/>
<div class="footer">
    <small>&copy; 2025 My Company</small>
</div>
```

---
## 🧩 `menu.jsp` の例（ログイン後メニュー）
```jsp
<!-- /view/common/menu.jsp -->
<div class="menu">
    <ul>
        <li><a href="userPortal.action">ポータル</a></li>
        <li><a href="moveUserManagement.action">ユーザー管理</a></li>
        <li><a href="moveBulletinboardManagement.action">掲示板管理</a></li>
        <li><a href="logout.action">ログアウト</a></li>
    </ul>
</div>
```
---

## 💡 JSP内での共通部品読み込み
以下のように各画面で共通部品を読み込むことで、再利用性を高められます。

```jsp
<%@ include file="common/header.jsp" %>
<%@ include file="common/menu.jsp" %>

<h2>掲示板管理画面</h2>
<!-- 各画面固有の内容 -->

<%@ include file="common/footer.jsp" %>
```

---

## ❓ `<%@ include %>` と `<s:include>` の違い

| 比較項目   | `<%@ include %>` | `<s:include>`       |
| ------ | ---------------- | ------------------- |
| タイプ    | 静的インクルード         | 動的インクルード（Struts2タグ） |
| 読み込み時点 | コンパイル時に結合        | 実行時に読み込み            |
| 利用場面   | 基本的な共通部品         | 条件付き切替などが必要な時       |


---

## 📎 CSS・JSの共通読み込みも一括管理
例えば `header.jsp` に共通スタイルやスクリプトを追加すれば、全画面に適用できます。
```jsp
<link rel="stylesheet" href="css/style.css" />
<script src="js/common.js"></script>
```

---

## 📘 まとめ
| ポイント             | 内容                                |
| ---------------- | --------------------------------- |
| ✅ 共通レイアウトをファイル分離 | `header.jsp` や `footer.jsp` 等に共通化 |
| ✅ 再利用で修正コスト削減    | デザイン変更も一括対応可能                     |
| ✅ JSP標準構文で簡単導入   | `<%@ include %>` で画面構成を効率化        |


---

## 📚 各記事リンクとテーマ概要

| Vol | タイトル | 内容のポイント |
|-----|----------|----------------|
| [📘 Vol.8.9](https://qiita.com/juehara-crypto/items/0d1e09c5241a2a1c9f60) | UIを条件で自在に制御！〜 `<s:if>` / `<s:else>` / OGNL活用 〜 | 状態や権限による動的出し分け、見やすい条件分岐 |
| [📗 Vol.8.10](https://qiita.com/juehara-crypto/items/10f85829a2e56e889cb3) | タグの自作入門 〜 カスタムJSPタグライブラリ基礎 〜 | 再利用可能な部品化でUI開発の効率を劇的改善 |
| [📗 Vol.8.11](https://qiita.com/juehara-crypto/items/4793c85e0900a6fea4c8) | 見た目を整えろ！〜 タグ構造のパターン化Tips 〜 | タグの入れ子・定型化でスタイリッシュなJSPに |
| [📗 Vol.8.12](https://qiita.com/juehara-crypto/items/bbe57cc81a3834704c4c) | 共通レイアウト設計術 〜 `<%@ include %>` 活用と部品化 〜 | ヘッダー・メニュー・フッターの共通化と構造整理術 |

---
【Go】USBデバイスへのファイル転送の追跡

https://qiita.com/mniyk/items/c61d4a752c6a8fe91997

# GitHub
https://github.com/mniyk/endpoint-security-and-monitoring-tools/tree/main/module/usb

# Screenshot
![USB File Transfer Monitoring.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498946/319698c8-ee4c-41ef-a2b2-20e0ccd1aa45.gif)

# Technology Stack
- Go Lang
Disk使用率アラートが頻発する理由とその対処法

# 【インフラ監視Tips】Disk使用率アラートが頻発する理由とその対処法

日々のインフラ運用で最もよく見かけるアラートの一つが、**Disk使用率の閾値超過アラート**です。  
「またか……」と思いつつも、対応を誤ると**システム停止**にもつながる重要な指標です。

本記事では、なぜこのアラートが頻発するのか、そして現場で実践できる対応策をまとめました。

---

## 🔍 よくあるDisk使用率アラートの実例

```text
[EC2] ディスク使用率 WARN
system.disk.in_use was >= 0.9 on average during the last 5m
対象: /dev/nvme0n1p1 使用率: 99.8%
```

調査すると、`df -h` の結果はこう：

```bash
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  8.0G  7.7G  312M  97% /
```

---

##  なぜDiskアラートはこんなに頻繁に出るのか？

| 原因 | 詳細 |
|------|------|
| ルートパーティションが小さい | AWSのデフォルト構成では8GBしかないケースも |
| ログやキャッシュの蓄積 | `/var/log`, `journal`, `pip cache`, 一時ファイル など |
| PythonなどのMWやアプリのアップデート | バージョン間でファイルが残りやすく、二重管理に |
| 仮想環境やビルドキャッシュ | `venv`, `node_modules`, `dist/` のような一時的ファイル群 |
| アラート閾値が厳しすぎる | 90%超でWARNにすると“通常動作”でも引っかかる |

---

## 実際の原因はPythonだけじゃなくて。。。

### 🔧 開発環境／言語系ツールによる要因

| 項目 | 内容 |
|------|------|
| Python | venv複数作成、pyenvによるバージョン重複、pipキャッシュ |
| Node.js | `node_modules` の爆発的肥大化（特にフルスタック系） |
| Java / Maven | `.m2/repository` に大量の依存JARが残存 |
| Go | `go mod cache` や `vendor` ディレクトリの肥大 |
| Rust / Cargo | `.cargo/registry`, `target/` フォルダの肥大 |

### 🗃 ログ・キャッシュ・監視エージェントによる要因

| 項目 | 内容 |
|------|------|
| `/var/log` の肥大化 | OSログ、アプリログ、cronログ、access.log等 |
| `journalctl` | systemdによるログが最大数・最大容量に達するまで無制限に蓄積 |
| `auditd` | セキュリティ監査ログが高頻度に出力される |
| Datadog/CloudWatch Agent | 出力ファイルのバッファやトレースログが溜まり続けるケース |

### 🧪 CI/CD・ビルド関連

| 項目 | 内容 |
|------|------|
| Jenkins/CIランナー | `/var/lib/jenkins/workspace` にビルドアーティファクトが蓄積 |
| Docker | 未使用イメージ・中断されたbuildでディスク圧迫（`docker system prune` で解消） |
| `/tmp` にビルド展開 | MakefileやCIパイプラインが一時的に膨大なファイルを生成するケース |

### 🗑 不要なファイル／人為的な操作ミス

| 項目 | 内容 |
|------|------|
| SCP/FTPで送った一時ファイル | `/home/ec2-user/` や `/root/` にzip/tarが残っている |
| スナップショット取得用スクリプト等の一時バックアップ | `/backup` に古いtar.gzが放置されているケースも |
| ダンプファイル | DBバックアップやログ吐き出し（`mysqldump`, `pg_dump`）などの出力残り |

---

## よく使うディスク調査コマンド

```bash
# ルート直下のディレクトリごとの容量確認
sudo du -sh /* | sort -hr | head -n 10

# ログディレクトリの中身で大きいものを特定
sudo du -sh /var/log/* | sort -hr | head -n 10

# journalログの使用量
sudo journalctl --disk-usage
```

---

## ✅ 現場での対応方針まとめ

### 1. アラート閾値の見直し
- WARN: 90% → 92% に緩和
- CRITICAL: 95%以上

### 2. ログや一時ファイルのクリーンアップ

```bash
# 古いログファイルを削除（7日以上）
find /var/log -type f -name "*.log" -mtime +7 -exec rm -f {} \;

# journalログを7日で削除
journalctl --vacuum-time=7d
```

### 3. 空いている永続領域（/mnt など）へ移動

```bash
# 例: /var/log を /mnt/ebs に退避
sudo mv /var/log /mnt/ebs/var_log
sudo ln -s /mnt/ebs/var_log /var/log
```

### 4. ルートボリュームの拡張（EBSの場合）

```bash
# growpart + resize2fs（Amazon Linux）
sudo growpart /dev/nvme0n1 1
sudo resize2fs /dev/nvme0n1p1
```

---

## 📌 まとめ

Disk使用率アラートは、  
「ただのノイズ」になりがちですが、  
**適切に管理しなければクリティカルな障害の入り口**です。

- しきい値の調整
- クリーンアップ手順の自動化
- ボリューム設計の見直し

を通じて、“鳴らないけど意味ある監視”に育てていきましょう。

---

## 🗒 参考

- [AWS EC2 – EBS ボリュームの拡張手順](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)
- [journalctl のクリーンアップ](https://wiki.archlinux.jp/index.php/Systemd/ジャーナル)

---

## 👨‍💻 著者

檜垣 慶太
XIAO ESP32C6+SSD1306、円を書いて遊ぶ。(アルゴリズムを考える


結果
----

![image_original(39).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/74b897e6-d652-42d4-9301-fc6bf2065cb1.jpeg)

プログラム
----

```c++


//OLED_SSD1331_en2_XIAO_ESP32C6


//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



void draw_circle_bad(int diameter) {

    // 円の中心の座標
    int cx = diameter / 2;
    int cy = diameter / 2;
    // 円の半径
    int radius = diameter / 2;
    //radius = radius - 1;

    // 円を描画する

  for(int y = 0;y < diameter;y++){
    for(int x = 0;x < diameter;x++){


      // 円の中心からの距離を計算・判定する
      // 0.5 を足し、ピクセルの中心で判定する
      int dx = (x<<1) + 1 - (cx<<1);
      int dy = (y<<1) + 1 - (cy<<1);

      if (  ((dx * dx) + (dy * dy)) <= ((radius<<1) * (radius<<1))  ) {
        // 円の中なので、点を描画する
        display.drawPixel(x,y,WHITE);
        display.drawPixel(diameter-x,y,WHITE);
        break;
      }

    }
    delay(50);
    display.display();
  }
  
    // 描画バッファの内容を画面に表示
  display.display();

}


//初期化
void setup() {

  //I2Cの初期化
  Wire.begin(D9,D10); //XIAO ESP32C6+SSD1306
  //Wire.begin(D10,D9); //XIAO ESP32C6+GROVE

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  draw_circle_bad(30);
  //draw_circle_bad(6);

 //while(1);

  delay(5000); //5秒待つ

}//loop



```
#0146（2025/05/23）無名関数

# 無名関数とは

**TL;DR** : 無名関数は名前を付けずに即席で宣言できる関数。Python では `lambda`、TypeScript / JavaScript ではアロー関数 `=>` を使う。関数を変数のように扱う世界では、純粋関数・高階関数・コールバック関数と組み合わせることで威力を発揮する。

---

## 1. 無名関数の定義と文法

| 言語         | 代表構文           | 例                                 |
| ---------- | -------------- | --------------------------------- |
| Python     | `lambda 引数: 式` | `lambda x, y: x + y`              |
| TypeScript | `(引数) => 式`    | `(x: number, y: number) => x + y` |

無名関数は**式**として評価できるため、変数に代入したり、引数として渡したり、戻り値にしたりできる。

```python
# Python
square = lambda x: x ** 2
print(square(4))  # 16
```

```ts
// TypeScript
const square = (x: number): number => x ** 2;
console.log(square(4)); // 16
```

### 関数定義 (`def`/`function`) との違い

* **スコープ**: 無名関数もクロージャを形成できるが、Python の `lambda` は 1 式しか書けず、複数文は不可。
* **デバッグ**: 名前がないため、スタックトレースで識別しづらい。

## 2. 純粋関数 (Pure Function) との関係

無名関数 = 純粋関数 ではないが、**無名関数は純粋関数として書かれることが多い**。純粋関数の条件は ①副作用なし ②同じ入力→同じ出力。

```python
# 副作用なしの lambda
increment = lambda x: x + 1
```

```ts
// 副作用があるアロー関数 (純粋ではない)
let total = 0;
const impure = (x: number) => total += x; // グローバル変数を書き換え
```

## 3. 高階関数とコールバック関数

* **高階関数**: 関数を引数に取る or 戻り値に返す関数。
* **コールバック関数**: 高階関数に渡され、「後で呼び戻される」関数。多くの場合、無名関数が用いられる。

```python
# map は高階関数; 第1引数はコールバック
nums = [1, 2, 3]
doubles = list(map(lambda n: n*2, nums))
```

```ts
// setTimeout は高階関数。1番目の引数に無名コールバックを渡す
setTimeout(() => console.log("done"), 1000);
```

## 4. 典型ユースケース

### 4.1 データ変換・フィルタリング

```python
filtered = list(filter(lambda x: x % 2 == 0, range(10)))  # [0,2,4,6,8]
```

```ts
const filtered = [ ...Array(10).keys() ].filter(n => n % 2 === 0);
```

### 4.2 ソートキー

```python
students = [("Akira", 24), ("Ben", 19)]
print(sorted(students, key=lambda s: s[1]))  # 年齢順
```

```ts
const students: [string, number][] = [["Akira",24], ["Ben",19]];
console.log(students.sort((a,b) => a[1]-b[1]));
```

### 4.3 イベントハンドリング / 非同期

```ts
import fs from "fs";
fs.readFile("data.txt", "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});
```

## 5. パフォーマンスと実装上の注意

1. **オーバーヘッドは僅少**: 呼び出しコストは名前付き関数と同等。ただし、ループ内で毎回 `lambda` を生成するとガベージコレクション負荷が増える。
2. **再利用性**: 同じ処理を複数回使うなら名前付き関数に切り出すべき。
3. **デバッグ難度**: スタックトレースに `<lambda>` や `anonymous` と表示される。
4. **可読性**: 複数文や複雑なロジックを無名関数に詰め込むと可読性が急落。
5. **再帰不可 (Python)**: `lambda` は自身を参照しにくく、再帰より名前付き関数を推奨。

## 6. ベストプラクティス

| シナリオ                 | 無名関数を使う? | 理由               |
| -------------------- | -------- | ---------------- |
| 1 回限りの短い処理           | ✅        | 定義場所を探すコストを削減    |
| 複数回再利用               | ❌        | DRY 原則に従い関数名を付ける |
| 複雑な処理                | ❌        | 可読性・テスト容易性優先     |
| イベントコールバック           | ✅        | コードの局所性が高まる      |
| パフォーマンスクリティカルかつループ生成 | ❌        | 生成コストを抑える        |

## 7. まとめ

無名関数は「関数も第一級オブジェクト」という思想を具体化する最小単位。**短く、一時的で、純粋な処理**を書くときに最適で、高階関数やコールバックの相棒として不可欠だ。ただし、再利用性・可読性・デバッグ性を犠牲にしないよう、適材適所で使い分けよう。

> **合言葉** : “大は小を兼ねない” —— 短い処理は無名関数、長い処理は名前付き関数！
Struts2連載まとめ＆今後の記事リンクポータル

# 📚 @juehara-crypto ブログリンク集（仮）

---

## 🚀 開発カテゴリ

### 💻 Java / Struts2 系列

📘 **Vol.1〜7 総まとめ：画面駆動開発で学ぶ Struts2実践プロジェクトの軌跡**  
➡️ https://qiita.com/juehara-crypto/items/251fea796d8f9fd0532e  
画面設計／ER図／MVC構成といった基盤知識をストーリー仕立てで整理。

📘 **Vol.8.0〜8.20 総まとめ & 実務逆引きリファレンス**  
➡️ https://qiita.com/juehara-crypto/items/60fde06e887bc420520d  
現場で役立つタグ活用・セッション制御・Action設計を逆引き形式でまとめ。

🌟 **Vol.8.9〜8.12 総まとめ：Struts2タグライブラリ応用編【UI制御・構造最適化・共通化】**
https://qiita.com/juehara-crypto/items/e2837f5bbaa50d7aefdd
「条件付きUI制御／見た目の統一／共通レイアウト化」といった応用テクニックを体系的に学べるシリーズ

🌟 **Vol.8.13〜8.15 総まとめ：Struts2 UI制御編（実務向け UI 出し分け・エラー表示制御・再利用設計）**
https://qiita.com/juehara-crypto/items/3e1bac9c86a9e8f2eb70
「UIの動的制御/エラー表示の最適化/フォーム再利用」といった応用テクニックを体系的に学べるシリーズ

🌟 **Vol.8.16〜8.17 総まとめ：Struts2 出力最適化＆拡張編（一覧表示・共通部品化・カスタムタグ）**
https://qiita.com/juehara-crypto/items/c13bd0474f71efc7cd28
Struts2タグライブラリの活用・工夫・設計パターンを整理しています。


🌟  **Vol.8.18〜8.20 総まとめ：Struts2 テンプレート最適化・UI共通化設計編（共通レイアウト構築と動的UI出し分け）**
https://qiita.com/juehara-crypto/items/d01303875f78a1c5282f
Struts2ベースのJSP設計においての、共通レイアウトの設計とテンプレート分離の最適化 

🌟 **Vol.9.0〜9.11 総まとめ：Struts2 バリデーション編（実務レベルの入力チェック設計／実装／UX／Ajax連携）**
https://qiita.com/juehara-crypto/items/b8b3b4c67d884f0b7262
Struts2 バリデーション編

🌟 **【Struts2 Vol.9.xxxシリーズ総まとめ】実務で活かす！入力バリデーション・型変換リファレンス集**
https://qiita.com/juehara-crypto/items/b293102d6a4d68e926b1
入力バリデーション・型変換リファレンス集

🌟 **Vol.10.0〜10.8 総まとめ：Javaデータ層設計とDAO／DTO／Serviceの全体像（Struts2／JDBC／JUnit対応）**
https://qiita.com/juehara-crypto/items/5bb3a714aebd09f536ec
Javaデータ層設計とDAO／DTO／Serviceの全体像

**🌟【Vol.10.x 逆引きリファレンス】実務で活かす！DAO／DTO／Service層の設計パターン集（Struts2対応）**
https://qiita.com/juehara-crypto/items/58fe5588fa273ef80139
Vol.10.x 逆引きリファレンス


**🌟 Vol.11.2 総まとめ：Struts2アクション層設計とUX改善のベストプラクティス大全**
https://qiita.com/juehara-crypto/items/e58f3570c06d3daff8b6

**⚙️ Vol.11.3 総まとめ：Struts2 Interceptorの基礎理解とカスタマイズ実践の完全ガイド**
https://qiita.com/juehara-crypto/items/e8310ee7d42548cc28e5

**🌟 Vol.11.4 総まとめ：Struts2自動バインディング完全理解ガイド _ParametersInterceptor × OGNL連携の仕組みと実践_**
https://qiita.com/juehara-crypto/items/9a110434d7d2626aa149

**🌟 Vol.11.5 総まとめ：Struts2 `struts.xml` 設定ファイル徹底理解ガイド _Struts2アーキテクチャの基盤となる `struts.xml` を“設定から設計へ”昇華させるためのベストガイド集_**
https://qiita.com/juehara-crypto/items/5fcb05ec58b26051b36c

**🌟 Struts2「Vol.11シリーズ」総まとめ：アクション設計・UX制御・Interceptor応用・セキュリティ設計まで一気に整理！**
https://qiita.com/juehara-crypto/items/e4856c3fe041f61aa314


---

## 🧭 このページの使い方

Qiitaでは「ピックアップ」設定に限りがあるため、  
**すべての技術記事をカテゴリ別に整理した案内所**としてこのページを活用しています。

📝 今後の追加記事もここにリンク予定です。ブックマーク推奨！

---

## 🕒 更新履歴

- 2025/05/23：初版公開（Struts2記事を中心にまとめ）
- 2025/05/24：記事更新（Vol.9.0〜9.11 総まとめ：Struts2 バリデーション編）
- 2025/05/30：記事更新（Vol.9.0〜9.11 総まとめ：Struts2 バリデーション編）

---
スミレ畑、やってみた。 その5

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
ハノイの塔を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f01dce90-c21e-4a43-930d-cecf1adeae2e.png)

# サンプルコード

```
【値:整数】だけ【塔:文字列の配列】を、ハノイする手順
　値 > 0なら
　　値 - 1だけ｛塔(1), 塔(3), 塔(2)｝をハノイする
　　値 &「番の円盤を、」& 塔(1) &「から」& 塔(2) &「へ移動」& 改行を出力する
　　値 - 1だけ｛塔(2), 塔(1), 塔(3)｝をハノイする
　そして
終わり

3だけ｛「A」,「B」,「C」｝をハノイする
```

# 実行結果

```
1番の円盤を、AからBへ移動
2番の円盤を、AからCへ移動
1番の円盤を、CからAへ移動
3番の円盤を、AからBへ移動
1番の円盤を、BからCへ移動
2番の円盤を、BからAへ移動
1番の円盤を、AからBへ移動

```

以上。
スミレ畑、やってみた。 その4

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
zundokoを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/76ffe650-f9f4-4c55-a4f4-6612d3e22b76.png)

# サンプルコード

```
結果は、空の配列
『 
ズンドコは、{「ズン 」,「ドコ 」}の(1から2までの乱数)番目
結果へズンドコを加える
結果を繋げたものが「ズン ズン ズン ズン ドコ 」で終わるなら、繰り返しから抜け出す
』を繰り返す
結果へ「キ・ヨ・シ！！」を加える
結果を繋げて報告する
```

# 実行結果

```
ズン ズン ドコ ドコ ズン ドコ ズン ズン ズン ドコ ズン ズン ズン ズン ドコ キ・ヨ・シ！！

```

以上。
スミレ畑、やってみた。 その3

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
fizzbuzzを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8d187bf2-af4d-4ef6-97be-6fbb527a6a5d.png)

# サンプルコード

```
変数aに1から100まで『
　剰余15は、変数a % 15
  剰余5は、変数a % 5
  剰余3は、変数a % 3
  もし、剰余15が、0に等しいなら
  　「fizzbuzz」を報告する
  他で、剰余5が、0に等しいなら
  　「buzz」を報告する
  他で、剰余3が、0に等しいなら
  　「fizz」を報告する
　でないなら
　  変数aを報告する　
　そして
』を繰り返す
```

# 実行結果

```
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz
buzz

```

以上。
Swift学習帳: 定数と変数

## 目次
- 定数と変数とは
- 意識していること3つ
- まとめ

## 定数と変数とは
定数と変数は値を保存するための入れ物
定数はlet、変数はvarを宣言する
### 定数
定数は一度代入すると後から変更できない

```Swift:Swift
let name: String = "イチロー"
name = "ジロー" // コンパイルエラー
```
### 変数
変数は後から値を変更できる

```Swift:Swift
var name: String = "イチロー"
name = "ジロー" // name変数の値はジローになる
```

## 意識していること3つ
### ①命名規則
[API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/)のルールに則り命名。
定数と変数の命名では
(1)不要な言葉を省きつつ、必要な単語はすべて含める。
(2)lowerCamelCase(最初の単語を小文字で始め、2語目以降の単語の頭文字を大文字にする)
(3)役割に応じた名前をつける

---
名前を宣言する定数を上記の内容を参考に命名します。

```Swift:Swift
let firstName: String = "イチロー" // 下の名前
let lastName: String = "鈴木" // 苗字
```

---
### ②予約語
Swiftでは予め定義されている単語(予約語)があり、それぞれに役割を持たせています。
予約語と同じ名前の定数と変数を使うことは可能ですが、非推奨のため避けましょう。
(参考: [The Swift Programming Language(日本語版)](https://swift-programming-language-jp.gitbook.io/the-swift-programming-language-jp/language-guide/the-basics#tononaming-constants-and-variables))


### ③最初は定数（let）で宣言
[The Swift Programming Language(日本語版)](https://swift-programming-language-jp.gitbook.io/the-swift-programming-language-jp/language-guide/the-basics#tonodeclaring-constants-and-variables)の定数と変数の宣言の項目に記載されています。
>コードに格納された値が変化しない場合は、常に `let`` キーワードで定数として宣言してください。変数は、変化する値を格納する場合にのみ使用します。

最初はletで宣言することで、以下のメリットを享受できます
- 定数は一度しか値を設定できないため、意図しない値の変更を防ぐことができる
- 予期せぬバグの発生を減らし、コードの安全性が高まる

## まとめ
- 定数はlet、変数はvarを宣言する
- 命名規則と予約語に注意を払い、まずはletで宣言して、値の変更が必要になったらvarに変更する
ソフトウェア開発系AIエージェントを6つのアーキテクチャで分類してみた

## はじめに

最近のAI開発ツール、種類が多すぎませんか？GitHub Copilot、Cursor、Devin、Claude Code...どれも「AIが開発を支援する」と言っているけど、実際に使ってみると全然違う。

そこで、いろいろかツールを使い倒して機能やモデルではなく**アーキテクチャ**で分類してみました。すると面白い進化の流れが見えてきたので共有します。

## アーキテクチャ分類図
![AI開発環境アーキテクチャ比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64345/89f702db-6781-4289-9834-2f7aa57e039e.png)

## アーキテクチャを順番に見て行きます。

### 0. **汎用チャット型**（ChatGPT、Claude）
（これは図にはありません）
- 一番最初の段階
- 「この関数書いて」→コピペの繰り返し
- 環境差異で動かないこと多数

### 1. **ローカル実行型**（GitHub Copilot、Cursor、Windsurf）  
- IDE統合でローカルファイルにアクセス
- プロジェクト全体を理解できるように
- でもローカルリソースに制約あり

### 2. **クラウド開発環境型**（Devin、GitHub Codespaces）
- ブラウザでアクセスする仮想環境
- クラウドリソース活用で高性能
- 環境の標準化を実現

### 3. **対話型プロジェクト管理**（Claude Code）
- ターミナル/チャットで自然言語対話
- プロジェクト全体のナビゲーション
- コードベース探索が得意

### 4. **自律型コーディングエージェント**（Devin、OpenAI Codex）
- 高度な自律性でタスクを自動実行
- 要件から直接コード生成・テスト・デバッグ
- 制御が難しく実用性に課題

### 5. **GitHubワークフロー統合型**（GitHub Copilot Agent、Google Jules）
- 2024年後半から登場の新世代
- Issue → PR → Review の完全統合
- チームメンバーとして機能

## 見えてきた進化の流れ

図を見ると、以下の進化パターンが見えてきます：

**汎用チャット** → **ローカルリソースアクセス** → **ワークスペース提供** → **対話型管理** → **自律性の追求** → **ワークフロー統合**

特に興味深いのは、単純に「より自律的に」ではなく、**既存の開発プロセスとの調和**を重視する方向に進化していること。

自律型エージェント（Devin等）は「何でも自動でやります」系で制御が難しく実用性に課題があったけど、GitHub統合型は既存のIssue/PR/Reviewフローを活かしつつ自動化しているのが賢い。

## 選び方の指針

- **単発コーディング**: Cursor、Windsurf
- **クラウドリソース活用**: GitHub Codespaces  
- **コードベース探索**: Claude Code
- **完全自動化（実験的）**: Devin、OpenAI Codex
- **チーム開発効率化**: GitHub Copilot Agent、Jules

## まとめ

6つのアーキテクチャで分類すると、AIエージェントの進化の方向性がよく見えました。特に自律型から統合型への転換が面白く、今後はGitHubワークフロー統合型が主流になりそうな予感。

「AIに何でもやらせる」より既存のワークフローに自然に溶け込ませて作業を分担してもらうほうが作業を切り出す立場としても使い易い印象です。

---

**詳細な分析については、Zennの記事[「ソフトウェア開発AIエージェント：アーキテクチャから見る開発ツールの進化」 ](https://zenn.dev/oota/articles/64ce2f9e20c83d)で詳しく書きました。**

## 参考

- [GitHub Copilot](https://github.com/features/copilot)
- [Cursor](https://cursor.sh/)
- [Claude Code](https://www.anthropic.com/news/claude-code)
- [Google Jules](https://blog.google/technology/google-labs/jules/)
基本情報技術者試験のためのやさしいIT用語まとめ【自分用メモ５月22日】

# 📘基本情報技術者試験のためのやさしいIT用語まとめ【自分用メモ】

---

## 🏢 企業と経営・計画

### 🔹 BCP（事業継続計画）  
**もし大きな地震や災害が起きても、会社の大事な仕事を止めないように準備しておく計画のこと。**

### 🔹 エンタープライズアーキテクチャー  
**会社の仕組み（人・仕事・ITなど）をわかりやすく整理して、もっと良くするための考え方や設計図のこと。**

### 🔹 リスクファイナンシング  
**もしこまったこと（事故・トラブル）が起きたときのために、お金の準備をしておくこと。**

---

## 📊 データ分析・統計

### 🔹 データマイニング  
**たくさんのデータの中から、「すごいヒミツ」や「かくれたルール」を見つけること。**

### 🔹 標準偏差  
**データがどれくらいバラバラかをあらわす数字。**

---

## 💾 データベース・トランザクション管理

### 🔹 ACID特性  
データベースの安全な処理のルールで、4つのポイントがあります：

| 略語 | 名前（カタカナ） | やさしい意味                          |
|-------|------------------|-------------------------------------|
| A     | アトミシティ     | ぜんぶやるか、なにもしないか（中途半端なし！）|
| C     | 一貫性（コンシステンシー） | ルールをちゃんと守る！               |
| I     | 独立性（アイソレーション） | よその人の作業にまどわされない！    |
| D     | 永続性（デュラビリティ）  | 一度保存したら、ちゃんと残る！        |

---

## 🛡️ セキュリティ

### 🔹 XML署名  
**「このデータは本物で、途中でだれにも書きかえられてないよ！」って証明するための“しるし”。**

---

## 📅 プロジェクト管理

### 🔹 ガントチャート  
**「いつ・なにをやるか」が、ひと目でわかる予定表のこと。**

---

## 📚 まとめ

新しい用語も身近なことばで説明すると、スッと頭に入ってきますね！  
試験勉強や業務の理解に役立ててください。

---


✒️ **自分用のメモですが、勉強中の方はぜひ参考にどうぞ！**
【公ド読】lint エラーの修正

【公式ドキュメントを読もうシリーズ】lint エラーの修正

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/refactoring-code/fixing-lint-errors](https://docs.github.com/ja/copilot/copilot-chat-cookbook/refactoring-code/fixing-lint-errors)

## 説明

lintのエラーの修正ができる。
実例がたくさん記載されている。
たくさん載っているので、引用が「正当な範囲内」ではないくらい引用して、著作権上どうなのかと思う節があるので載せないが、lintエラーの修正方法に関してたくさん載っている。

## 所感

実務でlintをあまり触ったことがないが、人力で修正していた箇所をGithub Copilotでやってくれるのであれば、工数は大きく減るだろう。

lint周りでの、プロンプトを生成することで、より解像度の高いほかの案を提案してくれると思うので、概要の理解をして使っていきたい。
ログからURLの一部だけ抽出してリアルタイムに出力(重複除去＆ソート)

以下のようなパイプラインで実現できます。

**重複除去・ソートする場合**

```bash
grep '/api/v1/' \
  | awk 'match($0, /\/api\/v1\/([^\/]+)/, m) { print m[1] }' \
  | sort -u
```

**ファイルの末尾100行に限定したい場合は、先頭に tail -n 100 を追加**

```bash
tail -n 100 your.log \
  | grep '/api/v1/' \
  | awk 'match($0, /\/api\/v1\/([^\/]+)/, m) { print m[1] }' \
  | sort -u
```


## **PowerShell** でやる場合

PowerShell は Linux のようなワンライナー処理には向きませんが、以下のようにすれば似たことができます：

```powershell
Get-Content .\your.log |
  Select-String '/api/v1/' |
  ForEach-Object {
    if ($_ -match '/api/v1/([^/]+)') {
      $matches[1]
    }
  } | Sort-Object -Unique
```
ChatGPTを使用したアプリ開発記【ヘッダー導入】

## ロジックコード
```Header.js
import React from "react";
import { useNavigate } from "react-router-dom";

	//	profileName: ヘッダーに表示するユーザー名（propsで渡される）
	//	profilePhotoURL: ユーザーのアイコン画像URL（propsで渡される）
	//	useNavigate: React Router の navigate() を使って画面遷移
	//	currentUserId: ログイン中のユーザーID（localStorageから取得）
function Header({ profileName, profilePhotoURL }) {
  const navigate = useNavigate();
  const currentUserId = localStorage.getItem('currentUserId');

  	//	localStorage の currentUserId を削除してログアウト状態にする
	//	/login に遷移してログイン画面に戻る
  const handleLogout = () => {
    localStorage.removeItem('currentUserId'); // ログイン情報削除
    navigate('/login'); // ログイン画面へ遷移
  };

  return (

  	//	fixed top-0 left-0: ページ上部に固定
	//	z-50: 前面に表示（他要素より上）
	//	w-full: 幅100%
	//	bg-white: 背景白
	//	shadow-md: シャドウ（立体感）
	//	px-6 py-3: パディング（左右・上下）
    <header className="fixed top-0 left-0 z-50 w-full bg-white shadow-md px-6 py-3">
      
      <div className="max-w-4xl mx-auto flex items-center justify-between h-10">
        {/* 左ロゴ */}
        <div className="flex items-center space-x-4 cursor-pointer" onClick={() => navigate('/')}>
          <img
            src="/Tomomitsu_keruma_SNS_logo.png"
            alt="SNS Logo"
            className="h-14 w-auto"
          />
          <h1 className="text-xl font-bold text-gray-700">Tomomitsu SNS</h1>
        </div>

        {/* 右 プロフィール情報 */}
        <div className="flex items-center space-x-4">
          <img
            src={profilePhotoURL || "/default-icon.png"}
            alt="アイコン"
            className="w-10 h-10 rounded-full border"
          />
          <span
            className="text-blue-600 font-semibold cursor-pointer hover:underline"
            onClick={() => navigate(`/profile/${currentUserId}`)}
          >
            {profileName || 'ゲスト'}さん
          </span>
          {/* 🔵 ログアウトボタン */}
          <button
            onClick={handleLogout}
            className="bg-blue-500 text-white px-4 py-2 rounded-2xl hover:bg-blue-600 transition duration-200 shadow-md"
          >
            ログアウト
          </button>
        </div>
      </div>
    </header>
  );
}

export default Header;
```
## UIコード
```App.js
import Header from './Header';

// この部分でHeaderコンポーネントを呼び出しており、Appコンポーネントのstateで保持しているプロフィールの名前・アイコン画像URLを渡しています。
        {/* ロゴを左上に固定表示 */}
        <Header
          profilePhotoURL={profilePhotoURL}
          profileName={profileName}
          user={user}
          setUser={setUser}
        />
```


## UI

![スクリーンショット 2025-05-17 10.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/b46a4e8f-be36-4f78-be2c-9765d1978552.png)
全てのデバイスからのスリープ解除を無効にする方法


### 解決したいこと
https://qiita.com/__xxWaKoUxx__/items/1adc60dd104c376d9864
こちらの記事参考

元記事はキーボードとマウスを対象にしているが、すべてのデバイスを対象とした

### 修正後コード
```
@echo off
setlocal

echo ==== Wake可能なデバイスを無効化中 ====

for /f "usebackq delims=" %%A in (`powercfg -devicequery wake_armed`) do (
    echo 無効化: %%A
    powercfg /devicedisablewake "%%A"
)

echo ==== 完了しました ====
endlocal
pause
```

あとは元記事と同様に設定する。
【Python初心者】ドット（.）の使い方を整理してみた

Pythonでクラスやオブジェクトを扱っていると、よく `obj.name` や `obj.method()` のように「ドット（.）」を使うコードに出会います。  
なんとなく見よう見まねで使っていたのですが、「そもそもこのドットは何をしているんだろう？」と気になったので、学習の記録として整理してみました。

## ドット（.）の基本的な役割

Pythonにおけるドット（.）は、**オブジェクトの中にあるもの（属性やメソッド）にアクセスする記号**です。

```python
obj.名前
```

このように書くと、「objの中にある名前（変数・関数など）」を取り出すことになります。

## 属性へのアクセス（変数）

```python
obj.変数名
```

これは、**オブジェクトが持っているデータ（属性）にアクセスしている**ということになります。

### 例：インスタンス変数のアクセス

```python
class User:
    def __init__(self, name):
        self.name = name

u = User("Gaku")
print(u.name)  # Gaku
```

`u.name` という書き方で、`u` の持つ `name` 属性にアクセスしています。

## メソッドの呼び出し（関数）

```python
obj.関数名()
```

これは、**オブジェクトが持っている処理（関数）を呼び出す**という意味になります。

### 例：メソッドの呼び出し

```python
class User:
    def greet(self):
        print("こんにちは！")

u = User()
u.greet()  # こんにちは！
```

ドットのあとに `()` がついているので、これは関数の呼び出しであることがわかります。

:::note warn
### 補足：() をつけずに関数を渡す（コールバックとしての利用）

関数やメソッドは `()` をつけないことで「呼び出す」のではなく、「関数オブジェクトを取り出す」ことができます。 

例えば、**他の関数に引数として渡し、あとで呼び出す**という使い方が可能です。
これを「コールバック」と呼びます。
#### 例：メソッドをコールバックとして渡す
```python
class User:
    def greet(self):
        print("こんにちは！")

def func(callback):
    callback()  # ここで実行される

u = User()
func(u.greet)  # () はつけない → 関数オブジェクトを渡している
```

このように、`u.greet` を `()` をつけずに `func` に渡すことで、  
関数内で後から `callback()` として呼び出すことができます。

※ `()` をつけてしまうと、その場で実行されてしまい、「関数を渡す」ことができなくなる点に注意です。

:::

## プロパティのアクセス（処理付きの値）

```python
obj.プロパティ名
```

見た目は変数と同じですが、**裏では処理（関数）が実行されている場合**があります。  
これは `@property` を使ったときの挙動です。

### 例：@property を使った属性のような関数

```python
class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def area(self):
        return 3.14 * (self._radius ** 2)

c = Circle(5)
print(c.area)  # 78.5
```

`c.area` は関数で計算していますが、呼び出すときは `()` をつけません。  
**値っぽく見せたいときにプロパティが使われる**と理解しました。

## ドットでアクセスできるものまとめ

| 書き方         | 意味                          | 例                  |
|----------------|-------------------------------|---------------------|
| `obj.変数`      | 属性（データ）にアクセス       | `u.name`, `c.radius` |
| `obj.関数()`    | メソッド（処理）を呼び出す     | `u.greet()`, `d.bark()` |
| `obj.プロパティ`| 値っぽく見えるけど実は関数     | `c.area`, `p.age`   |

## 変数と関数の見分け方

初心者の自分としては、ドットのあとが変数なのか関数なのかでよく迷いました。  
自分なりに整理した見分け方は以下の通りです。

- `()` がない → 変数 or プロパティ
- `()` がある → 関数（メソッド）
- 実際にプロパティかどうかは定義を見ないとわからない

### 例：

```python
print(user.name)     # → 変数またはプロパティ
print(user.get_age()) # → 関数（メソッド）
```

## まとめ

- ドットは「オブジェクトの中身（属性や関数）にアクセスするための記号」
- `obj.変数` → データ（属性）にアクセス
- `obj.関数()` → 関数（処理）を実行
（`()` をつけないことで、関数を「後から呼ぶために渡す（コールバック）」こともできる）
- `obj.プロパティ` → 値のように見えるけど処理してることもある（@property）

## さいごに

Pythonのクラスを学ぶ中で、`obj.〇〇` のような表現が頻出するので、  
ドットの意味をしっかり整理しておくことはすごく大事だと感じました。
本記事が私と同じようにドットの意味をより理解したい方の役に立てれば幸いです。
最近のDevinのリリース内容まとめ【2025年5月から2025年5月22】（記事とは言えないレベルの完全にメモ）

5/5 DeepWiki: あらゆるリポジトリ向けの AI ドキュメント

https://cognition.ai/blog/deepwiki

---

5/6 Kevin-32B: CUDAカーネルを書くためのマルチターンRL

https://cognition.ai/blog/kevin-32b

---

5/15 Devin2.1リリース

https://cognition.ai/blog/devin-2-1

---

5/22 Deep WikiのMCPサーバー

https://docs.devin.ai/release-notes/overview#may-22%2C-2025
FlutterでWidgetを画像として取得する

# widgetを画像として取得
## 概要
widgetを画像として取得する際には、[[RepaintBoundaryウィジェット]]を使用する。

## RepaintBoundaryウィジェット
### 概要
RepaintBoundaryウィジェットは、Flutterでパフォーマンスを向上させるために使用される重要なツールである。
また、子要素を画像データにすることのできる要素である。

### 解説
以下の例では、[[Containerウィジェット]]を画像として取得することができる。
```Dart
@override
Widget build(BuildContext context) {
	return RepaintBoundary(
	  key: _globalKey,
	  child: Container(
		width: 100,
		height: 100,
		color: Colors.red,
	  ),
	);
}
```

画像を取得するコードは以下のとおりである。
```Dart
import 'dart:ui' as ui;

...

 Future<void> captureImage() async {
    RenderRepaintBoundary boundary = _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
    ui.Image image = await boundary.toImage();
    ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
    setState(() {
      _imageData = byteData!.buffer.asUint8List();
    });
 }
```

#### コード例
```Dart
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';

class MyWidget extends StatefulWidget {
 @override
 _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
 GlobalKey _globalKey = GlobalKey();
 Uint8List? _imageData;

 @override
 Widget build(BuildContext context) {
    return RepaintBoundary(
      key: _globalKey,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
    );
 }

 Future<void> captureImage() async {
    RenderRepaintBoundary boundary = _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
    ui.Image image = await boundary.toImage();
    ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
    setState(() {
      _imageData = byteData!.buffer.asUint8List();
    });
 }
}
```

#### プロパティ
| プロパティ名  | 概要          | 備考  |
| ------- | ----------- | --- |
| `child` | 子要素をここに入れる。 |     |



### データの変換 (Realm保存用)
#### byteData -> base64
```Dart
Future<String> convertBoundaryToImageBase64(RenderRepaintBoundary boundary) async {
	ui.Image image = await boundary.toImage();
	ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
	Uint8List imageData = byteData!.buffer.asUint8List();
	String imageDataBinary = base64Encode(imageData);
	return imageDataBinary;
}
```

#### base64 -> imageProvider
```dart
ImageProvider convertBase64ToImage(String base64) {
	Uint8List bytes = base64Decode(base64.split(',').last);
	ImageProvider imageProvider = Image.memory(bytes).image;
	return imageProvider;
}
```