OmniAICreator/Qiita-1.07M huggingface dataset:
Excel VBA 印刷設定をする

### はじめに
印刷ページ設定をします。

### プロシジャーの説明
印刷ページ設定の印刷向き、余白の設定をします。

#### サンプル１ 
``` VB
Sub PrintSettings()
    With ActiveSheet.PageSetup
        ' 余白の設定（単位：センチメートル）
        .TopMargin = Application.CentimetersToPoints(0)   ' 上余白
        .BottomMargin = Application.CentimetersToPoints(0) ' 下余白
        .LeftMargin = Application.CentimetersToPoints(0)   ' 左余白
        .RightMargin = Application.CentimetersToPoints(0)  ' 右余白
        .HeaderMargin = Application.CentimetersToPoints(0)
        .FooterMargin = Application.CentimetersToPoints(0)
        
        ' ページ中央を垂直方向に配置
        .CenterVertically = True
        ' 横向きに設定
        .Orientation = xlLandscape
'        ' 縦向きに設定
'        .Orientation = xlPortrait
        ' 印刷範囲をA1:A5に設定
        .PrintArea = "A1:A5"
    
    End With
End Sub
```
Djangoでデータベースに初期データを登録する手順

# 1.アプリケーションディレクトリに"fixtyres"ディレクトリを追加する

手動でfixtyresディレクトリを作ります。

# 2.jasonファイルを作成
fixtyresディレクトリの中に.jasonファイルを作成します。
ファイル名はなんでもいいです。

例えば、productsというアプリケーションにfoodというモデルがあるとします。
このfoodに初期データを追加する場合、下記のようにjsonファイルを作ります。
```food.json
[
    {
        "model": "products.foods",
        "fields":{
            "item":"humberger",
            "price":300,
        },
        "fields":{
            "item":"Curry",
            "price":200,
        },
        "fields":{
            "item":"Pizza",
            "price":400,
        }
    }
]
```

# 2.jasonファイル読み込み
下記のコマンド実行

```
python manage.py loaddata food.json
```

これでデータベースに初期データが追加されます。
IBM Cloud アカウントへのサブスクリプション・コード登録時に「アップグレードによるアカウントの再アクティブ化」画面が表示され、コードの適用方法がわからない場合の対応

<h2>はじめに</h2>

IBM Cloudにおけるアカウントの作成時には `クレジットカードの登録` もしくは `お客様とIBM の契約に基づき発行されたコードの適用 (サブスクリプション契約の場合にはサブスクリプション・コードの適用)` が必要です。

基本的には [登録ページ](https://cloud.ibm.com/registration) から進めていただきますが、何らかの理由で処理を完了せずに終了してしまうと、次回 [IBM Cloud コンソール](https://cloud.ibm.com)にログインした後、以下のような「アップグレードによるアカウントの再アクティブ化」という画面が表示されます。この状態ではサービスのリソースを作成したり、利用することは基本的にできません。また、カード登録もしくはコードの適用はアカウント登録から2週間以内に完了する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/3da1c2b9-9325-4b4d-06b7-0847b2be4036.png)

サブスクリプション・コードをお持ちということは、おそらくサブスクリプション契約でご利用されたい状況だと思います。このとき以下の2点にご留意ください。
- カードの登録はクレジッドカード支払いを希望する場合のみ必要
- クレジットカードを登録してしまうと、後続の処理をセルフサービスで実施できない

特に2点目について、以前は考慮する必要がありませんでした。2025年5月時点ではカード登録時に米ドルでカード会社に請求を行うアカウントとして設定され、サブスクリプションアカウントのように使用量および請求を日本円で管理するアカウントとシステム上での互換性がなくなってしまいます。そのためサポートケースなどを通じて個別の対応が必要となってしまいます。「日」の単位で時間を要しますので、ご注意ください。


<h2>コードの登録はどこでできるか？</h2>

先ほどお示ししたスクリーンショット、実は右側のセクションだけでなく左側のセクションもスクロール可能で、下のほうに説明があります。特に画面が小さめの端末でアクセスしている場合には気が付きにくいケースがあるので、大きな画面表示した場合の画面ショットを改めて下に添付します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/c92dd5fc-163a-4837-b862-4fd62337f16e.png)

追加で表示されるようになった説明のうち、リンクになっている [アカウント設定ページ](https://cloud.ibm.com/account/settings) にアクセスすると以下のような画面が表示されます。このとき「アップグレード」をクリックするとサブスクリプション・コードを入力する画面が表示されます。ここからコードの適用を進めていただけると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/1403b052-0bb7-4437-af40-00a2ba117e91.png)
【Python in Excel】UUID (GUID) と ULID の採番方法

# 【Python in Excel】UUID (GUID) と ULID の採番方法

## ✅ Python in Excel での一意識別子の採番方法まとめ

UUID (GUID) と ULID の比較です。

| 特性            | **UUID (GUID)**                  | **ULID**                                          |
| --------------- | -------------------------------- | ------------------------------------------------- |
| 生成方法        | `uuid.uuid4()`（標準ライブラリ） | 自作関数（Crockford Base32 + timestamp + random） |
| ソート可能性    | ❌（ランダム順）                  | ✅（時系列順）                                     |
| 長さ            | 36文字（ハイフン含む）           | 26文字（ハイフンなし）                            |
| URLフレンドリー | △（ハイフンあり）                | ✅（Base32でURL安全）                              |
| 実装の簡単さ    | ✅ 非常に簡単                     | △ 自作関数が必要                                  |
| 外部ライブラリ  | 不要                             | 不要（標準ライブラリのみで実装可能）              |

---

## 🔹 UUID（GUID）を生成するコード

標準ライブラリで生成できます。

```python
import uuid
str(uuid.uuid4())
```

Python セル (Excelの値) に貼り付けて実行すれば、毎回異なる UUID が生成されます。

------

## 🔹 ULID を生成するコード (標準ライブラリのみ)

### ULID の構造

ULID は以下の 2 つの部分から構成されます：

1. **48ビットのタイムスタンプ**（ミリ秒単位、時系列順にソート可能）
2. **80ビットのランダム値**（衝突回避のため）

この 128ビットの値を **Crockford Base32** でエンコードして、**26文字の文字列**として表現します。

### ✅ 自作関数の定義

セルに、自作関数を定義しておきます。

```python
import time
import random

CROCKFORD_BASE32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'

def encode_crockford_base32(value: int, length: int) -> str:
    result = ''
    for _ in range(length):
        result = CROCKFORD_BASE32[value % 32] + result
        value //= 32
    return result

def generate_ulid():
    timestamp = int(time.time() * 1000) & ((1 << 48) - 1)
    randomness = random.getrandbits(80)
    return encode_crockford_base32(timestamp, 10) + encode_crockford_base32(randomness, 16)
```

### ✅ 任意のセルで呼び出し

Python セル (Excelの値) で実行すれば、毎回異なる ULID が生成されます。

```python
# 他のセルで生成関数を呼び出す
generate_ulid()
```

### ❓ なぜ `base64.b32encode()` を使わずに自作関数を使うのか？

`base64.b32encoe()` は **RFC 4648 の Base32（A〜Z, 2〜7）** を使っており、ULID の仕様である **Crockford Base32（0〜9, A〜Z から I, L, O, U を除く）** とは異なります。

そのため、ULID を正しく生成するには、**Crockford Base32 に対応した自作のエンコード関数が必要**になります。

------

## 📌 固定値として使うには？

- Python セルで生成した値は **再計算時に変わる**ため、**「値として貼り付け」**することで固定化できます。
- 方法：生成 → コピー → 右クリック → 「値として貼り付け」

------

## 🧩 応用：複数の ID を一括生成して Excel に出力

Python セル (Excel の値) に指定すると、指定した件数の ID を自動生成してくれます。

### ✅ ULID (GUID)

```python
import pandas as pd
import uuid

cnt = 10
df = pd.DataFrame({
    "GUID": [str(uuid.uuid4()) for _ in range(cnt)]
})

df
```

### ✅ ULID

定義済みの自作関数を呼び出します。

```python
import pandas as pd

cnt = 5
df = pd.DataFrame({
    "ULID": [generate_ulid() for _ in range(cnt)]
})

df
```
PCの5大装置とWebサービス開発：メモリ管理の基礎知識

# PCの5大装置とWebサービス開発：基礎知識と実践

## はじめに

基本情報で学習するPC5台装置が、実務のWeb開発でどのように使われ、どのような考慮をしなければいならないのか考えてみました！

## PCの5大装置とは

コンピュータは以下の5つの主要な装置で構成されています：

```mermaid
graph TD
    A[入力装置] --> B[制御装置]
    B --> C[演算装置]
    C --> D[制御装置]
    D --> E[出力装置]
    B --> F[主記憶装置<br/>メモリ]
    C --> F
    F --> G[補助記憶装置<br/>ストレージ]
    G --> F

    style A fill:#f9f,stroke:#333,stroke-width:2px
    style B fill:#bbf,stroke:#333,stroke-width:2px
    style C fill:#bfb,stroke:#333,stroke-width:2px
    style D fill:#bbf,stroke:#333,stroke-width:2px
    style E fill:#f9f,stroke:#333,stroke-width:2px
    style F fill:#fbb,stroke:#333,stroke-width:2px
    style G fill:#fbb,stroke:#333,stroke-width:2px
```

各装置の役割について説明します。

1. **入力装置**
   - コンピュータにデータを入力するための装置
   - 代表的な例：キーボード、マウス、タッチパッド
   - その他：カメラ、マイクなども入力装置として機能

2. **出力装置**
   - コンピュータの処理結果を表示する装置
   - 代表的な例：ディスプレイ、プリンター、スピーカー
   - ユーザーへの情報提示を担当

3. **記憶装置**
   - データを保存する装置で、2種類に分類されます
   - 主記憶装置（メモリ）
     - 一時的な記憶領域として機能
     - 電源を切るとデータは消去される
     - 高速なアクセスが可能
     - 例：RAM（Random Access Memory）
   - 補助記憶装置（ストレージ）
     - 永続的な記憶領域として機能
     - 電源を切ってもデータは保持される
     - メモリよりアクセス速度は遅いが、大容量の保存が可能
     - 例：HDD、SSD

4. **演算装置（CPU）**
   - コンピュータの中核となる処理装置
   - 計算や処理を担当
   - 例：Intel Core i7、AMD Ryzen
   - 性能が高いほど処理速度が向上

5. **制御装置（CPUの一部）**
   - 各装置の連携を管理する制御装置
   - CPUに内蔵されている
   - システム全体の動作を調整

## Webサービスでの各装置の役割

Webサービスにおける各装置の役割について説明します。

1. **サーバー側**
   - 演算装置（CPU）
     - PHPプログラムの実行
     - データベースの処理
     - 複数ユーザーのリクエスト処理
   - 主記憶装置（メモリ）
     - 実行中のプログラムやデータの一時保存
     - システムの作業領域として機能
   - 補助記憶装置（ストレージ）
     - データベースの永続的な保存
     - ログファイルの保存
     - システムの記憶領域として機能

2. **クライアント側（ブラウザ）**
   - 入力装置
     - キーボード、マウスによる操作
   - 出力装置
     - ディスプレイへのWebページ表示
   - 主記憶装置
     - ブラウザのメモリ
     - JavaScriptの実行
   - 演算装置
     - JavaScriptの処理
     - ページのレンダリング

## メモリ使用量の計算と具体例

Webサービス開発では、メモリ使用量の計算が重要です。

1. **1リクエストあたりのメモリ使用量**
   - 基本的な使用量
     - PHPプログラムの実行：5-10MB
     - データベースクエリの結果：2-5MB
     - セッション情報：1-2MB
     - その他の処理：2-3MB
   - 合計：10-20MB/リクエスト

2. **メモリ使用量の計算**
   - 単純な計算
     - 例：100ユーザー × 20MB = 2GB
   - 実際の計算（最適化を考慮）
     - メモリの共有
       - 同じコードやライブラリは複数のプロセスで共有
       - 例：Laravelのフレームワークコードは1回だけメモリに読み込まれる。2回目は共有メモリとして管理される。
     - キャッシュの効果
       - データベースの結果をキャッシュ
       - セッション情報の共有
       - 静的ファイルのキャッシュ
     - ガベージコレクション
       - 使用していないメモリは自動的に解放
       - メモリの再利用が行われる
     - 実際の使用量
       - 理論値：100ユーザー × 20MB = 2GB
       - 実際の使用量：約1-1.5GB程度
       - キャッシュと共有により30-50%程度の削減

3. **具体的な使用例**
   - 一般的なWebアプリケーション
     - 1リクエストあたりのメモリ使用量：10-20MB
     - 同時接続ユーザー：100-200人
     - 必要なメモリ：約2-4GB
     - 実際の使用量：約1-2GB（最適化後）

## サーバースペックの選定

メモリ使用量の計算に基づいて、適切なサーバースペックを選定します。

1. **メモリ容量の決定**
   - 予測される最大メモリ使用量の1.5〜2倍程度を確保
   - 例：ピーク時2GB使用の場合、4GBのメモリを用意
   - 余裕を持たせることで、急な負荷増加にも対応可能

2. **推奨サーバースペック**
   - メモリ：8GB（余裕を持って）
   - CPU：2-4コア
   - ストレージ：50GB SSD
   - 例：AWS t3.medium、GCP e2-standard-2

3. **スケーリングの考慮**
   - 垂直スケーリング（サーバーの性能向上）
     - メモリ容量の増設
     - CPUの性能向上
   - 水平スケーリング（サーバー台数の増加）
     - ロードバランサーの導入
     - 複数サーバーでの分散処理

4. **注意点**
   - 上記は一般的な目安であり、実際の使用量はアプリケーションの特性により変動
   - キャッシュの効果により、実際のメモリ使用量は減少する可能性あり
   - 定期的な監視と調整が必要
   - スケーリングの容易さも考慮した選定が重要
[ORMapper] ORMapperについて

# ORMapperとは
- オブジェクト指向プログラミング言語とリレーショナルデータベースの間のデータ変換を簡素化するツール
- 結果的に、開発者はデータベースの操作をオブジェクトとして扱い、SQLクエリを直接書く必要がなくなる

# 各言語で使用されるORMapper
| ORMapper | 対応言語 | 特徴 |
|----------|----------|------|
| **Sequelize** | JavaScript, TypeScript | 強力なデータベース抽象化、広範なドキュメントとコミュニティサポート |
| **TypeORM** | TypeScript | デコレーターを使用したエンティティ定義、広範なデータベースサポート |
| **Prisma** | JavaScript, TypeScript | 高速なデータベースアクセス、型安全なクエリ |
| **Hibernate** | Java | 強力なデータベース抽象化、広範なドキュメントとコミュニティサポート |
| **Entity Framework** | C# | データベースの自動生成、広範なデータベースサポート |
| **SQLAlchemy** | Python | 強力なデータベース抽象化、広範なドキュメントとコミュニティサポート |
| **Django ORM** | Python | Djangoフレームワークの一部として使用、スキーマベースのモデル定義 |

# 参考リンク
[9 Best JavaScript and TypeScript ORMs for 2024](https://www.sitepoint.com/javascript-typescript-orms/) 
[Top 8 TypeScript ORMs, query builders, & database libraries: evaluating type safety](https://www.prisma.io/dataguide/database-tools/evaluating-type-safety-in-the-top-8-typescript-orms) 
[TypeORM](https://typeorm.io/)
[The best TypeScript ORMs](https://blog.logrocket.com/best-typescript-orms/)
React + Expressで作るカート画面：商品情報とレビュー集計を含めたSQLクエリの設計

# はじめに
React と Express を使ってカート画面を構築する中で、  
以下のような要件を満たすために SQL 設計を工夫しました。

- 商品名、価格、数量の表示
- 各商品のレビュー平均点とレビュー数の表示
- 特定ユーザーのカート内容だけを対象にする

---

# カートと商品、レビューのテーブル関係

簡易的な ER 図は以下のようになります：

USER (1) ─── (∞) CART (∞) ─── (1) PRODUCT (1) ─── (∞) REVIEW


---

# 要件：ログインユーザーのカートにある商品のレビュー情報を一緒に表示したい

## 解決方法：サブクエリ＋LEFT JOIN

```sql
SELECT
  C.cart_id,
  C.quantity,
  P.product_id,
  P.name,
  P.price,
  COALESCE(R.review_avg, 0) AS average_rating,
  COALESCE(R.review_count, 0) AS review_count
FROM cart AS C
JOIN product AS P ON C.product_id = P.product_id
LEFT JOIN (
  SELECT
    product_id,
    AVG(rating) AS review_avg,
    COUNT(*) AS review_count
  FROM review
  WHERE is_deleted = false
  GROUP BY product_id
) AS R ON R.product_id = P.product_id
WHERE C.user_id = ?
  AND C.is_deleted = false;
```
まとめ
実装中に気をつけた点：

データ構造を理解して結合順序と集約方法を選ぶ

ユーザーのセキュリティを守るために user_id 条件は必須

COALESCE で NULL を 0 にすることで UI 側でも処理が簡単に
【4日目】統合マネジメント（Integration Management）とは？【PMBOKを1日10分、半年で！】

# ✅【4日目】統合マネジメント（Integration Management）とは？

このドキュメントでは、プロジェクトマネジメントの司令塔ともいえる「統合マネジメント」について学びます。  
統合とは「バラバラな要素をまとめ、1つの方向へ導く」ことです。

## 🎯 統合マネジメントの役割とは？

統合マネジメントは、

> **プロジェクト全体の流れ・成果・変更・調整などをまとめ、全体を統率する知識エリア**です。

プロジェクトでは、スケジュール、コスト、品質、リスクなどたくさんの要素がありますが、これらがバラバラに進んでは成功しません。  
その調整役・まとめ役となるのが統合マネジメントです。

## 🔧 統合マネジメントの主なプロセス

| プロセス群     | プロセス名                              | 説明                                      |
|----------------|------------------------------------------|-------------------------------------------|
| 立上げ         | プロジェクト憲章の作成                   | プロジェクトの目的や責任者を明文化する           |
| 計画           | プロジェクトマネジメント計画書の作成     | 各分野（スコープ・コスト・品質など）の計画を統合 |
| 実行           | プロジェクト作業の指揮・マネジメント     | 計画通りに全体を進行させるための調整             |
| 監視           | 作業の監視と統制                         | 計画とのズレを修正／全体の整合性を確認           |
| 実行・監視     | 変更の統合マネジメント                   | 要望・変更を受けたときに影響を判断して調整       |
| 終結           | プロジェクトまたはフェーズの終結         | 成果物を納品し、契約や記録を正式に終了する       |

## 💡 キーワード：変更統制（Change Control）

プロジェクトでは必ず「変更したい」という声が出てくる。

> 「納期を伸ばしたい」「機能を追加したい」「デザインを変えたい」

こうした変更をすべて受け入れるとプロジェクトは破綻してしまうため、

- 影響（コスト・納期・品質）を評価し、
- 必要な変更のみを取り入れる

この一連の判断と調整が「**変更統制（Integrated Change Control）**」であり、統合マネジメントの大きな役割である。

## ✅ 今日のまとめ

- 統合マネジメントは「プロジェクト全体をまとめる知識エリア」
- バラバラの計画や進捗、変更を**ひとつに統率する役割**
- 特に重要なのは「変更の統制」と「プロジェクト憲章の作成」

## 🔜 次回予定

次回は「スコープ・マネジメント（Scope Management）」を学びます。  
プロジェクトで「やること／やらないこと」を明確にすることの重要性を理解しましょう！
Privacy Warningが出たのでDNSについて調べてみた

## はじめに
公共のWi-Fiを使っていたらこんな警告が出てきました！
![IMG_0855.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091380/d7da4f27-0de9-4872-baad-185c9164fbe6.png)
暗号化されたDNSトラフィックって何？状態だったので、改めてDNSについて調べてみました。
## DNSとは
DNS（Domain Name System）は、Webサイトの名前（例: `example.jp`）をIPアドレスに変換する仕組みです。
たとえば、ブラウザで `https://example.jp` にアクセスすると、背後では以下のような名前解決プロセスが動いています。
![DNS構造図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091380/9e8ef337-7cd8-4d92-993a-551bf0148b93.jpeg)

この図のように以下の流れでドメイン名からIPアドレスを特定します。
1. クライアントが「`example.jp`のIPアドレスを知りたい」とDNSに問い合わせを送る。
2. ルートDNSは`example.jp`のIPアドレスを知らないので、「`.jp` を管理してるDNSに聞いて」とリダイレクトする。
3. `.jp` DNSも`example.jp`のIPアドレスを知らないので、「`example.jp` を持ってるDNSはこれ」と返す。
4. 最終的に `example.jp` を管理する権威DNSが「IPは (例:`93.184.216.34`) だよ」と返す。
## 通常のDNSは何が問題なのか
ここで問題になるのは、上記のやり取りが **基本的にすべて平文（暗号化なし）** で行われるという点です。

つまり、DNSのクエリ（どのドメイン名を問い合わせたか）やレスポンスはそのままネットワーク上に流れてしまいます。
### 誰に見られてしまうのか
- 同じWi-Fiを使っている他のユーザー
- ネットワークの管理者
- プロバイダ（ISP）
- 中間者（MITM攻撃者）
**→ 誰でも、通信をキャプチャすれば「どのサイトにアクセスしたか」が分かってしまう**
## 暗号化されたDNS
この問題を解決するのが、以下のような「暗号化DNS」技術です。
DNSサーバとのやり取りをTLS（HTTPS）で包むことで、第三者から中身を見えなくしてくれます。

| プロトコル | 名前             | 概要                           |
| ----- | -------------- | ---------------------------- |
| DoT   | DNS over TLS   | DNSのやり取りをTLSで暗号化（ポート853）     |
| DoH   | DNS over HTTPS | DNSクエリをHTTPS通信でカプセル化（ポート443） |
### どの部分が暗号化されているのか
![DNS構造図-DNS構造図_暗号化.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091380/25cc101b-3f61-4e6b-821e-cb74f4b66621.png)

※赤枠で囲った部分が、DNS over HTTPS（DoH）や DNS over TLS（DoT）によって暗号化される。この部分が暗号化されることで、第三者に「どのサイトにアクセスしようとしているか」が見えなくなる。

- クエリのドメイン名
	- DNSサーバーに `example.jp` を問い合わせているという情報
- クエリ種別
- トランザクションIDやDNSヘッダー
- レスポンスの内容
	- 最終的に帰ってくるIPアドレス
** → DNSクエリとレスポンスの中身が暗号化される **
## 警告が出た理由
AppleのiOSやmacOSでは、OSレベルで暗号化DNS（DoH/DoT）を自動的に使おうする。
しかし、ネットワーク上でDoTやDoHの通信をブロックするような設定がされている場合、OSが検知して冒頭のような警告が出るようです。
【Django】Javascriptファイルの置き場所

# 【Django】Javascriptファイルの置き場所

html内に書く場合は、script タグを作成し以下のように記述します。

```diff__html:
<script>
// コードを記述する
</script>
```
これをjsファイルを別の場所にまとめる場合の書き方を残しておきます。


# ファイル構成
このようにします。javascriptディレクトリを作成します。
app
┃
┗ static
　┣ css
　┣ images
　┗ javascript
　　　┣ ***.js
　　　┗ ***.js


#  base.html

```diff_html:  base.html
{% load static %}

<!DOCTYPE html>
<html lang="ja">

      {% block content %}
      {% endblock %}


      {% block footer %}
      {% endblock %}
    </div>

    <!-- BootstrapのJS　全体にかかるのでbase.htmlに置いておく -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
    <!-- 各ページに入れるJSのタグを設置 -->
    {% block script %}{% endblock %}
  </body>

</html>
 ```

# .js ファイル作成
javascriptディレクトリ内に.js ファイルを作成し、内容を記述します。ここでは例として、クリップボードコピーのjsコードを書いています。

```diff_javascript:  clipboard.js
// クリップボードコピーのJS

// HTML要素取得
const txt = document.getElementById('txt');
const btn = document.getElementById('btn');

// コピー処理（btnがクリックされたらtxtをコピーする）
btn.addEventListener('click', () => {
    if (!navigator.clipboard) {
        alert("残念ですが、このブラウザは対応していません...");
        return;
    }

    navigator.clipboard.writeText(txt.textContent).then(
        () => {
            alert('リンクをクリップボードにコピーできました！\nメール本文などに貼り付けて利用できます。');
        },
        () => {
            alert('クリップボードにコピーできませんでした。');
        });
});
```



# テンプレート
テンプレートに記載します。
- .js を設置したいテンプレートに、{% load static %}　を追加
- 最下部に.js 参照リンクを追加

```diff_python:  ***.html

{% extends 'base.html' %}
{% load static %} 　# ここに追加
{% block title %}詳細ページ{% endblock title %}
...

# 最下部に.js 参照リンクを追加
{% block script %}
    <script src="{% static "javascript/clipboard.js" %}"></script>
{% endblock %}
 ```

同じテンプレートに2つjsを使いたい時は、下記の行を追加します。
```
<script src="{% static "javascript/*****.js" %}"></script>
```
📘 Vol.8.5：【Struts2】条件分岐タグ（s:if / s:else）徹底解説！ 〜表示制御と実務応用の決定版〜


本記事は、Struts2でJSPを書く際に頻出するタグの基本を網羅する  
**📘「Vol.8.0〜8.7：Struts2 タグライブラリ入門編（基本操作・最低限の知識）」**　シリーズの一部です。

## 🧭 はじめに

本記事は「Struts2でJSPを書く時に絶対に使うタグ」を紹介するシリーズの第4弾です。

**今回は `s:if` / `s:elseif` / `s:else` タグにフォーカス！**  
JSTLの `c:if` に慣れている方にも、Struts2の統一的な記述スタイルで**より安全かつ表現力豊か**な条件分岐を学んでいただけます。

---

## 🎯 対象読者

- Struts2でWebアプリを開発している人
- JSPで条件分岐をシンプルに書きたい人
- JSTLとの違いに困ったことがある人
- `ログインユーザーだけに表示` など制御をしたい人

---

## ✅ `s:if` / `s:else` タグとは？

Struts2のタグライブラリで提供されている**条件分岐用のカスタムタグ**です。

### 基本構文

```jsp
<s:if test="%{条件式}">
  条件が真のときに表示される内容
</s:if>
<s:elseif test="%{別の条件}">
  次に真のときに表示される内容
</s:elseif>
<s:else>
  上記すべての条件に該当しないときに表示される内容
</s:else>
```
---

- test 属性には **OGNL式** を使用

- %{} で囲むことで式評価を有効化

## 💡 実用例1：ログインユーザーによる表示制御

```jsp
<s:if test="%{session.user != null}">
  ようこそ、<s:property value="%{session.user.username}" /> さん！
</s:if>
<s:else>
  <a href="login.jsp">ログイン</a> してください。
</s:else>
```

## 💬 解説：
session.user に値がある＝ログイン済み

ない場合はログインリンクを表示

---

## 💡 実用例2：ユーザー権限による表示切替

```jsp
<s:if test="%{user.role == 'admin'}">
  <button>管理者設定</button>
</s:if>
<s:elseif test="%{user.role == 'user'}">
  <button>プロフィール編集</button>
</s:elseif>
<s:else>
  <span>ゲスト閲覧中</span>
</s:else>
```
---
## 🔍 OGNL式の書き方のポイント
| 書き方               | 説明       |
| ----------------- | -------- |
| `%{変数 == 値}`      | 等価比較     |
| `%{変数 != null}`   | nullチェック |
| `%{リスト.size > 0}` | リストの件数判定 |
| `%{!条件}`          | 否定       |

---

## 🛠 よくある使い方集
- フォームの表示・非表示

- 管理者メニューのON/OFF

- エラーメッセージの制御

- データの有無による表示切り替え

---

## 🔁 JSTLとの違い

| JSTL (`c:if`) | Struts2 (`s:if`) |
| ------------- | ---------------- |
| EL式で書く        | OGNL式で書く         |
| nullチェックが面倒   | OGNLで簡潔に書ける      |
| 表現が分かれる       | Struts2の中で統一できる  |


Struts2でのJSPは**ロジックの再利用と一貫性が命！**
条件分岐タグをマスターして、保守性の高い画面設計を実現しましょう！

---

## 📚 関連記事（Vol.8シリーズ）

- [📘 Vol.8.0：【Struts2】OGNL入門　〜タグライブラリを支える最重要基礎技術〜](https://qiita.com/juehara-crypto/items/9b9558d46dfa5ac75224)
- [📘 Vol.8.1：【Struts2】タグライブラリの全体像と種類を把握する 〜JSP開発で使えるタグ一覧と役割まとめ〜](https://qiita.com/juehara-crypto/items/9635c8746d362496aef3)

- [📘 Vol.8.2：【Struts2】JSPタグライブラリ実践テンプレート集 〜現場で即使える！フォーム・URL・セッション活用まとめ〜](https://qiita.com/juehara-crypto/items/f57e473a85b2c9845730)

- [📘 Vol.8.3：Struts2で作る共通レイアウトJSP 〜header/footerを使った再利用設計〜](https://qiita.com/juehara-crypto/items/96cee6c986e13bbacd8c)

- [📘 Vol.8.4：【Struts2】「s:action」「s:token」タグ徹底解説！〜アクション呼び出しと二重送信防止の最前線〜](https://qiita.com/juehara-crypto/items/6e54c3be0c35aa464724)

- [📘 Vol.8.6：【Struts2】画面部品の共通化！ s:include / s:component 徹底解説 〜JSPヘッダー/フッターの再利用でメンテ効率UP〜](https://qiita.com/juehara-crypto/items/b36801f70830d2c056aa)

- [📘 Vol.8.7：【Struts2】バリデーションUIの味方！ `<s:fielderror>` / `<s:actionerror>` / `<s:actionmessage>` 徹底ガイド 〜エラーメッセージの表示とフォーム連携の基本〜](https://qiita.com/juehara-crypto/items/b5bacb915f8baea2f2ec)

---
🎉 次回予告：[Vol.8.6 s:include / s:component](https://qiita.com/juehara-crypto/items/b36801f70830d2c056aa) でJSP部品化の極意！
「テンプレートを使い回す方法」が知りたい方はお楽しみに！

---
.NETでPDFを読み込み画像化する。Dockerでも

# 目的
.NET(C#)でバックエンドを開発。その中でPDFを画像化ための記事です


PDFを読み込み画像化、線などを描画し保存するには、ライブラリの選定が必要です。
本記事ではサーバ動作に必須なMemoryStreamで扱えるように試しています。

一見Windows上で動作しているプログラムでもDockerのコンテナ上で動くとは限りません。
特にSystem.Drawingはコンテナ(asp.net core)では動作ないためです。

上記の制限をクリアするためライブラリを探した結果
* PDFtoImage
* SkiaSharp

を使うことで動作します。

[動作するサンプル](https://github.com/kyamamoto03/PDFDraw)

# dockerでの動作

## build

Dockerfileがあるディレクトリで下記のコマンドでビルドしてください

```
docker build -t pdfdraw .
```

## run

```
docker run --rm -it -e PDF_FILE_NAME=RAG.pdf -e OUTPUT_DIR=/output -v {ホスト側PDFがあるフォルダ名}:/pdf -v {ホスト側PDFを出力するフォルダ名}:/output pdfdraw

```

例：
```
docker run --rm -it -e PDF_FILE_NAME=RAG.pdf -e OUTPUT_DIR=/output -v c:\pdf:/pdf -v c:\output:/output pdfdraw

```

流れ

```mermaid
flowchart TD
    /pdfにあるRAG.pdfを読み込む --> 画像化 --> SkiaSharpで画像読込 --> 線描画 --> /outputにファイル保存
    
```

# 終わりに
描画系はDockerでは特にハマりやすいので、簡単なプログラムを作り、まずDockerで実行し動作確認をするのが重要だと感じました

いいねください！
Geminiで風車を使う魔法少女を描いてみた。

# 概要

Geminiで風車を使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光の風車を使う魔法少女を描いてください。
```

![光の風車を使う魔法少女_20250521.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6c7a66e8-d839-4c84-9c9d-02bf978be6cf.png)



```
闇の風車を使う魔法少女を描いてください。
```

![闇の風車を使う魔法少女_20250521.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/850a659c-aec6-4cdf-90bb-d4c1f5b17dc0.png)



```
聖なる風車を使う魔法少女を描いてください。
```

![聖なる風車を使う魔法少女_20250521.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/aaafca7a-9905-4983-9f77-c6d09dd12ec3.png)


# まとめ

聖の子は可愛い。
何かの役に立てばと。
Github Copilot（有料）でAgentモード使うときにはアカウント設定を確認

※本記事は2025/05/01時点での事象です

## 状況
- organizationに所属している、個人のgithubアカウント
- VS code × Github copolotでAgentモードを利用する

## 結論
Github copolot（Agentモード）でMCP使うには、organization側で `Editor preview features: Enabled` にしている必要がある

## 以下はログ

会社でcopilot（有料）権限付与してもらったので、意気揚々とリクエストなげてみた。
（[github MCP Server](https://github.com/github/github-mcp-server)を使おうとしている様子）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/f9e117ec-b4ed-4d1c-af61-350519b4d0ec.png)


- なぜか使えない（個人無料利用のときは動作していた）
- コンソールログのエラーの内容を送ろうと思うと、画像も添付できない（個人無料利用のときはできた）


### トークンを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/56c998ba-8c66-47f9-846a-b7b99cded13f.png)

→トークンは有効だった。

### なぜ...！ぐぐる

こちらの記事に、エンタープライズ利用に関する記述が！
https://qiita.com/nokoxxx1212/items/ab52f7b9d4f03a637e1a

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/e11dacbe-a6b6-42af-bb83-dd55106fdb5f.png)

→怪しい！（Agentはプレビュー機能枠だったのですね）

### 自分の設定画面を確認


![貼り付けた画像_2025_05_21_16_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/c37edd69-fb60-4d65-b14c-81e04f5da757.png)

→なってない。


### 設定変更を依頼


MCP無事動作🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/c9a96511-e666-49d5-b6ae-abff98476144.png)

画像も添付できた🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454968/367e66df-6e0f-4b05-bb08-b746a3e9f806.png)


以上！
同じような状況に遭遇して困る方いるやも？で投稿してみました。
Django 5.2.1に以降したらlogoutボタンが動作しない事に気がついた

# はじめに

外部に公開しているサイトがあって頻繁にDjangoのバージョンを上げています。

LTSのバージョンが4.2から5.2に変更になったので対応したのですが、ほぼほぼ問題ないことを確認した後でlogoutリンクが動作しない事に気がつきました。

実際の変更は昨年入っていたのですが、セキュリティ面を考慮して**csrf_token**を必須としたようです。

https://forum.djangoproject.com/t/deprecation-of-get-method-for-logoutview/25533/5

GETでログアウトできるといたずらでの総攻撃には弱そうなので妥当だなと思いつつ、単純なテキストリンクをボタンで再実装しました。

# 対策

HTML上でシンプルなAnchorタグをButtonに変更します。

Bootstrap5を利用していて、だいたい次のような差分で見た目には同様になったと思います。

```diff:git diffによる差分
diff --git a/templates/base.html b/templates/base.html
index 47f3c79..6e11be1 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -32,7 +32,12 @@
                <li class="list-inline-item ps-4"><a href="{% url 'top' %}">Home</a></li>
                {% if request.user and request.user.is_authenticated %}
                <li class="list-inline-item"><a href="{% url 'profile' %}">Profile</a></li>
-               <li class="list-inline-item"><a href="{% url 'logout' %}">Logout</a></li>
+               <li class="list-inline-item">
+                 {# See also: "https://forum.djangoproject.com/t/deprecation-of-get-method-for-logoutview/25533/2" #}
+                 <form method="post" action="{% url 'logout' %}">{% csrf_token %}
+                   <button class="btn btn-link p-0 m-0 b-0 mb-1" type="submit">Logout</button>
+                 </form>
+               </li>

                <li class="list-inline-item mx-4"><a href="{% url 'password_change' %}">Change password</a></li>

```

# さいごに

この他にDjango 5.2系列へのアップグレード時に問題になったのは、4.2で既にプランに入っていた **|length_is:** フィルターの廃止でした。

単純な置き換えで対応できるので問題はまったくありませんが、エラー画面をみるのはあまり気持ちの良いものではありません。

今回利用しているライブラリの中では``django-fobi``でこの問題への対応をしています。

該当するコードは添付されているthemeに含まれるdjango2テンプレートなので、ライブラリ側にパッチをあてる必要はありませんでした。

Djangoは便利な点は多いですが、過去の経験からORMを利用しているところはかなり怖いです。
アリババクラウドとマプア大学が次世代デジタル人材の育成に向けてパートナーシップを締結

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-cloud-and-map%C3%BAa-university-forge-partnership-to-cultivate-next-gen-digital-talents_602243?spm=a2c65.11461433.0.0.4ee35355Z0vn2M)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# 2025年5月21日、フィリピン・マニラ — フィリピンのデジタル人材育成をさらに強化するため、アリババグループのデジタル技術および知能の中核を担うAlibaba Cloudは、フィリピン有数の工学・技術系大学であるマプア大学と提携しました。このコラボレーションにより、人工知能（AI）およびクラウドコンピューティングに関する最先端のトレーニングを提供し、マプア大学の学生たちにデジタル経済で成功するために必要なスキルを身につけさせます。Alibaba Cloud Academic Empowerment Program (AAEP) の枠組みで、このパートナーシップは、マプア大学の学生や教職員に対し、業界に即したAIおよびクラウドコンピューティングのコース、詳細なリソース、実践的なラボ体験、そしてAlibaba Cloud認定資格への道筋を提供します。

![O1CN01XUIKoJ1Vck8TiIRMG_!!6000000002674-](https://img.alicdn.com/imgextra/i3/O1CN01XUIKoJ1Vck8TiIRMG_!!6000000002674-0-tps-2767-1845.jpg)

## 次世代のデジタル人材育成

このプログラムは、科学技術省（DOST）の[国家人工知能戦略（NAIS Ph）](https://www.dost.gov.ph/knowledge-resources/news/86-2025-news/3989-dost-builds-on-ai-national-strategy.html)を支援しています。この戦略は、AIを包摂的イノベーション、改善されたガバナンス、そして世界的に競争力のある産業の触媒として位置付けています。この戦略の柱の一つは労働力開発であり、デジタル経済の要求に応えるためにフィリピンの人材を再教育・再訓練することに焦点を当てています。これを実現するため、DOSTは高等教育機関にAIマイクロクレデンシャルおよび継続教育プログラムの拡大を推進し、グローバル競争に必要な技術的専門知識を持つ労働力を育成しています。Alibaba Cloudとマプア大学との新たな協力は、学生や教職員が業界レベルのAIおよびクラウドトレーニングにアクセスできるようにすることで、これらの取り組みをさらに強化し、革新を促進し、将来の学術的イニシアチブを向上させます。

「工学と技術において1世紀にわたる卓越性の歴史を持ち、フィリピンで初めて学部レベルでAI工学を提供する大学として、マプア大学はAI時代におけるリーダーを育成することに全力で取り組んでいます」と、マプア大学のドジ・S・マエストレカンポ学長兼CEOは述べました。「Alibaba Cloudとのパートナーシップにより、私たちは世界クラスのAIおよびクラウドコンピューティング技術を学習エコシステムに統合し、卒業生が現在の産業のニーズに対応できるだけでなく、AI駆動型の世界で革新を推進できるようになることを確実にしています。」

Alibaba Cloud Intelligenceのフィリピン総責任者であるアレン・グオ氏は、「工学・技術教育の先駆者であるマプア大学と提携し、次世代の人材を強化できることを嬉しく思います。この協力を通じて、学界と産業界のギャップを埋め、急速に進化するデジタル環境で優れた能力を発揮するために必要なスキルと認定資格を学生に提供することを目指します。共に、フィリピンにおける革新と成長の基盤を築いていきます」と語りました。

## 多様なスキルレベル向けの包括的な学習プログラム

このプログラムは、多様なスキルレベルに対応するため、公開講座、トレーニングプログラム、ウェビナー、ハンズオンセッションなど、さまざまな学習リソースを提供します。参加者は、クラウドコンピューティングおよびAI全般の基礎から高度なトピックまで、またAlibaba CloudのAIインフラおよびソリューションについての洞察を得ることができます。Alibaba Cloud Academy、同社のトレーニングおよび認定部門は、この取り組みをサポートしており、19言語で利用可能な250以上のオンラインおよびオフライン認定コースと、270以上のオンラインハンズオンラボを提供しています。これまでに、23カ国・地域の110以上の大学および教育機関との戦略的パートナーシップを通じて、50万人以上をトレーニングしてきました。

## マプア大学について

マプア大学はフィリピン有数の工学・技術系大学であり、世界でもトップクラスの大学です。世界の高等教育機関の上位6%以内に位置し、Times Higher Education（THE）World University Rankings（WUR）2025ではフィリピン国内でわずか5校しかランクインしていない大学の一つです。Quacquarelli Symondsによる4つ星評価を受けている教育機関であり、東南アジアのトップ100大学の一つです。マプア大学は、iPeople学校の一環として、Yuchengco-Ayala教育パートナーシップの一環で、エンジニアリングや科学、建築・デザイン、情報技術、コミュニケーションおよびメディア研究、高校の学問的に優れたプログラムを通じて、1世紀にわたり一流の教育を提供してきました。また、米国で最も革新的な大学であるアリゾナ州立大学と協力して、ビジネス・マネジメント、健康科学、医学分野での国際教育も提供しています。マプア大学について詳しくは[mapua.edu.ph](http://mapua.edu.ph/)をご覧ください。
AWS SAA受かるまでの道のり

### はじめに

先日、AWS Certified Solutions Architect – Associate(SAA)に無事合格できました！
この記事では、勉強方法やSAAを受けてみた感想などを紹介して行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917995/ee1a7deb-55ba-467e-bd17-772d29ba1161.png)

### 受験申し込み方法
試験申し込みは[こちらの公式ページ](https://aws.amazon.com/jp/certification/certification-prep/testing/)から行えます
1. AWSビルダーIDを作成する
2. 試験の申し込みをする
受験料：22,000円(税込)
試験時間：130分

### 勉強方法
- Udemy
今回はUdemyの[**【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-knan/?src=sac&couponCode=CP130525JP)を購入しました。
購入した理由は「価格が安かったこと」と「受講者数が多く安心感があったこと」です。
テストモードと試験モードがあるため、最初のうちはテストモードで1問1答形式で解説見ながら進めていき自信がついてきたら試験モードで問題を解きました。
ただ、お金に余裕がある方は[CloudTech](https://kws-cloud-tech.com/)などを利用するとより確実かなと感じました。
- ChatGPT
みなさんお馴染みのChatGPTでは、試験モードで間違えた問題について、自分が理解できるまで何度も質問しました。
例えば、IAMポリシーとIAMロールの違いはなんですか、どういった場面で使いますかやバケットポリシーとIAMポリシーって同じポリシーだけど何が違うのでしょうか。
といった感じで自分が理解するまで質問しました。
- AWSのSAA対策動画（YouTube）
動画はこちら→[AWS SAA試験対策講座](https://www.youtube.com/watch?v=QA0aHa0qPVk&list=PLPzcoMdqG5npIMyRZ7QmBaZQ-LdMeGXRa)
AWSのSAA試験対策の動画が、YouTubeで無料で公開されています。
無料でここまで学べるのは本当にありがたく、通勤中などのスキマ時間にもぴったりでした。
各機能の概要が数分の短い動画で解説されており、耳だけで聞いてもある程度理解できるので「ながら学習」にも最適です。
内容としては深掘りというより「機能の確認・おさらい用」として使うのがちょうど良いと感じました。

### 勉強時間
- 学習時間：3月中旬~5/11
- 移動時間や仕事終わりに毎日30分ほど、土日も同じくらい勉強していました。試験日が5/11なこともあったので5月からは平日2時間、休日8時間で詰め込みました。
### 試験結果
試験の結果は人によりますが、私の場合は試験受けた当日の夜8時ぐらいにはメールの方に通知が来てました
### 感想
１問目から分からず、かなり焦りました。自信持って答えられたのは10問ほどだったと思います。
試験時間も長く、慣れない机と椅子だったこともあり集中力を保つのが大変かなと感じました。
あと、体調万全にしときましょう！私は試験日に頭痛がひどかったため苦しい思いしました。
### 実務で役に立つのか？
これは人それぞれかと思いますが、SAAを受けたからといっていきなり実務で作業はできないと感じました。やはり実務で手を動かすことが大切なのかなと。
ただ、SAAの勉強をする前と比べてAWSの単語や機能がある程度理解できる様になったので、未経験の方やエンジニア歴浅い人にはおすすめかと思います。
### まとめ
ChatGPTは、AWS SAAだけでなく他の資格試験の勉強にも役立つと感じました。
これから受験される方の参考になれば嬉しいです。焦らず自分のペースで進めてください！
RustでLambdaを作ってデプロイする

Rustを使ってLambda関数を作成する方法について記載。

# 事前準備

## cargo-lambdaのインストール

Lambdaを操作するツールとしてcargo-lambdaをインストールをします。
これを用いてビルドやデプロイを行います。

```shell
cargo install cargo-lambda
```

## zigのインストール

cargo-lambdaではクロスコンパイルのため、内部ではzigというプログラミング言語を使用します。

```shell
ZIG_VERSION=0.14.0
curl -k -L https://ziglang.org/download/${ZIG_VERSION}/zig-linux-x86_64-${ZIG_VERSION}.tar.xz -o zig.tar.xz
mkdir -p /opt/zig
tar -xf zig.tar.xz -C /opt/zig --strip-components=1
ln -s /opt/zig/zig /usr/local/bin/zig
rm zig.tar.xz
```

# ソースコード

Lambdaを管理する場合、最小限ではlambda_runtimeクレートを使用して、以下のようになります。
(拡張性を鑑みてかなりファイル分割は多め)

```rust:src/main.rs
pub(crate) mod endpoint;

use lambda_runtime::{Error, LambdaEvent, service_fn};
use log::{error, info, warn};
use serde_json::{Value, json};

/// メイン関数。Lambda関数のエントリポイント。
#[tokio::main]
async fn main() -> Result<(), Error> {
    env_logger::Builder::from_default_env()
        .filter_level(log::LevelFilter::Info)
        .init();
    info!("Starting Lambda function");

    let handler = service_fn(route_request);
    lambda_runtime::run(handler).await?;
    Ok(())
}

/// ルートリクエストを処理する関数。
///
/// # 引数
/// - `event`: Lambdaイベント。
/// - `context`: Lambdaコンテキスト。
///
/// # 戻り値
/// - HTTPレスポンス。
async fn route_request(event: LambdaEvent<Value>) -> Result<Value, Error> {
    let (payload, _) = event.into_parts();

    // パスの取得
    let path = payload["path"].as_str().unwrap_or("");
    let method = payload["httpMethod"].as_str().unwrap_or("");

    info!("Received request: path = {}, method = {}", path, method);

    let result = match (path, method) {
        ("/api/system/health", "GET") => endpoint::system::health::get::handle().await,
        _ => {
            warn!("Unhandled request: path = {}, method = {}", path, method);
            Ok(json!({
                "statusCode": 404,
                "body": "404 Not Found"
            }))
        }
    };

    if let Err(ref e) = result {
        error!("Error occurred while processing request: {:?}", e);
    }

    result
}
```

```rust:src/endpoint/mod.rs
pub(crate) mod system;
```

```rust:src/endpoint/system/mod.rs
pub(crate) mod health;
```

```rust:src/endpoint/system/health/mod.rs
pub(crate) mod get;
```

```rust:src/endpoint/system/health/get.rs
use lambda_runtime::Error;

/// システムのヘルスチェックを行うGETリクエストを処理するモジュール。
///
/// このモジュールは、システムの稼働状態を確認するための簡易的なヘルスチェックを提供します.
/// Lambda関数のエントリポイント。
///
/// # 戻り値
/// - HTTPレスポンスを表すJSONオブジェクト。
pub async fn handle() -> Result<serde_json::Value, Error> {
    Ok(json!({
        "statusCode": 200,
        "body": "Health Check OK"
    }))
}
```

# ビルド

以下のコマンドでビルドできます。

```shell
cargo lambda build --release --target x86_64-unknown-linux-musl
```

成果物としては `backend/target/lambda/<関数名>/bootstrap` に作成されます。

# デプロイ

以下のコマンドでデプロイできます。

```shell
cargo lambda deploy --region "$REGION" --iam-role "$ROLE_ARN"
```

関数名は未指定の場合、Cargo.tomlのプロジェクト名が採用されます。
AWS Certified Machine Learning - Specialty試験に合格しました！

AWS MLS試験を受験し合格したので、自分がしてきた対策をまとめます。

# AWS MLS試験とは？
AWSが提供する機械学習の分野における認定資格試験です。
AWSクラウド環境での機械学習の開発や設計、実装に関する知識と経験を証明するものです。

# 試験概要
- 時間時間: 180 分（長すぎる…😢）
- 受験費: 44,000円（高すぎる…😢）
- 形式: 65 個の質問 (複数選択または複数応答のいずれか)
- 試験場所: Pearson VUE テストセンターまたはオンラインでの監督付き試験
- 合格ライン: 750点

# 対策
- 期間：約4か月
- [Cloud Licence | AWS WEB問題集で学習しよう](https://cloud-license.com/) の問題No01-44を3周しました
- [【最短攻略】AWS 認定機械学習 – 専門知識 模擬問題集](https://ricoh.udemy.com/course/aws-30-b/learn/) を3周しました
- 機械学習に関する用語が大量に出てくるので、もしG検定を受験していない人はG検定を受験してからの方が合格しやすいと思いました。（自分はG検定に合格していました。）

# 結果
受験者スコア: 857で合格しました！
思ったよりも高得点だったのでよかったです。

 

# 受講した感想
体感ですが、実際に出題された問題のうち半分は、試験対策で利用した問題集とかなり似た問題でした。
そのため、問題集を繰り返しやったかどうかが合否に大きく影響しそうです。
また、1～2割は完全初見の問題で、知らない単語がたくさん出てきました。
問題は2時間くらいで解き終わり、最後の1時間は丁寧に見直しできました。

 

# 最後に
AWSの機械学習サービスに関する知識を身につけられたと感じました。
AWSの機械学習については実務経験が無く、研修でしかやったことがないので、実際に触ってみたいなと思いました。
（特にAmazon Transcribeは面白そうだなと思いました。Amazon Translateと組み合わせて音声自動翻訳アプリとか作ってみたいです…！）
また、最近登場した資格である AWS Certified AI Practitioner や AWS Certified Machine Learning Engineer – Associate にも挑戦したいです。
Amazon Linux 2023 で Docker composeを使える環境を構築する

# やりたいこと
通常、開発をDockerを使ってローカル環境で行ってるんですが、諸事情によりEC2環境上にローカルと同じ環境を構築したいということで作業したところ、リポジトリにローカルコンテナの環境記述してあるし、すぐできるでしょ、と思っていたらいくつか詰まったポイントがありましたので備忘録として残しておきます。

# 前提
普段、Macを使ってローカル環境で、Docker composeを使ってコンテナを立ち上げて作業してます。
これを、Amazon Linux 2023上で再現するということ。　
AWS側のネットワークやセキュリティグループなどについては適切に設定が行えるという前提で、割愛させていただきます。

# AWS console上での作業
EC2インスタンスを新規に立ち上げます。
当然ながらAMIやインスタンスタイプを指定して起動することになりますが、このとき、ローカル環境をMacで作業しているような場合は、アーキテクチャでArm64を指定しておくようにしましょう。
![スクリーンショット 2025-05-21 15.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45794/6565b507-97fe-4f40-92bb-cbd8f815114f.png)
ここを間違えると、後々、つまづきます。

# 必要なソフトウェアのインストール及び設定
開発に必要となるミドルウェア系のソフトをインストールおよび設定します。

1. ssh などでインスタンスに接続し、dnfでアップデートした後、git と docker をインストール
    1. sudo dnf update
    2. sudo dnf install git docker
1. 必要ならmake のインストール
    1. sudo dnf install make
1. dockerの設定
    1. sudo usermod -aG docker $USER
        1. dockerを実行する権限を、一般ユーザー（EC2の場合、だいたいec2-user）に与える
    1. sudo systemctl start docker
    1. sudo systemctl enable docker
        1. dockerデーモンを起動した後、インスタンス起動時に自動起動するように設定。
1. docker compose のインストール
    1. sudo curl -SL https://github.com/docker/compose/releases/download/v2.36.1/docker-compose-linux-aarch64 -o /usr/libexec/docker/cli-plugins/docker-compose
        1. このときの対象ファイルの指定に注意するポイントが3つ。
            1. まず、バージョンの指定。執筆時点での最新が 2.36.1 ですが、必要に応じて古いものなり、更に新しいものへ変更を。
            1. 続いてアーキテクチャの指定ダウンロード対象の最後にある linux-aarch64 がLinuxのArm64のアーキテクチャ。他にもWindowsのx86やdarwinのarmなど、複数のパターンがあるので、[公式GitHubのリリースノートのAssets](https://github.com/docker/compose/releases/) を確認して、自分が必要とするものを指定する。
            1. 最後にファイルを保存する場所。[公式GitHubのREADME](https://github.com/docker/compose?tab=readme-ov-file#linux)では 

                ```
                /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins
                /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins
                ``` 

            という4パターンの記載があるが、私が試したときには、何故か `/usr/local/libexec/docker/cli-plugins` ではうまく動かなかった。原因は追求していないが、確認したところ、dockerをインストールした時点で自動的に作られるフォルダは `/usr/libexec/docker/cli-plugins/` だったのでこちらを利用したところ適切に動いた。

    1. sudo chmod +x /usr/libexec/docker/cli-plugins/docker-compose
         1. 最後に対象ファイルに実行権限を付与して完了。

# エラーが起きたとき
例えばdocker-composeをダウンロードするときにアーキテクチャの指定を間違えたりしている場合、 `docker -v` コマンドは正常に動く（バージョンを返してくる）が `docker compose version` を実行したときには
```
docker: 'compose' is not a docker command.
See 'docker --help'
```
と、composeをインストールする前と全く変わらない挙動でエラーを返してきて？？？となった。
この場合 `/usr/libexec/docker/cli-plugins/docker-compose` のように、インストールした `docker-compose` ファイルを直接実行すると
```
-bash: /usr/libexec/docker/cli-plugins/docker-compose: cannot execute binary file: Exec format error
```
のように、ファイルフォーマットが間違えている、というメッセージを返してくれるので、OSやアーキテクチャを確認して、再度ファイルをダウンロードすれば良し。
最初これに気づかず、インストールしたはずなのに、パスが通ってない？？とかしばらく悩んでました…。

---
ここまでくれば、あとは普段ローカル環境でやるように、コンテナをビルドして起動してやれば、普通に環境が動いてくれるはずです。

---
参考サイト
https://zenn.dev/kun432/scraps/1078b45bf8d250
https://qiita.com/MasahitoShinoda/items/d0c0c5b011b33c27be5c
Mac Book Proでアンリアルエンジン5を軽く動かしてみた。初心者の部屋

# UE5の勉強を始めました

とりあえずマシンスペック

![スクリーンショット 2025-05-15 12.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158190/6a2356a3-856e-42e6-a48d-733eb729cbf4.png)

たまにレンボーカーソルが出て５秒くらい待つ事になる。
UE5初心者なので、開発が進むとどうなるかわかならいが、個人開発するのには、耐えられそう。

そこそこ動いたので、まず以下のサイトを参考にした。

[参考サイト](https://zenn.dev/daichi_gamedev/books/unreal-engine-tutorial/viewer/about-this-book)

参考サイトの中で紹介されtた　シューティングゲームを作ってみた。
[参考動画サイト](https://www.youtube.com/@unreal-engine-senmon)

簡単なゲームだけど、自分で作ったので嬉しいし、なんか楽しい！

他の方の動画も複数視聴した。


## ちょっと触った感んじの感想

- 思っていたよりも、簡単に３Dゲームが出来る
- ドラックでキャラを配置したり、項目から選択してイベントとイベントを線で繋げたり直感的な作りになっている
- プログラミング知識不要（あった方が良い）
- PCのスペックが高くないと無理（数年前にUEの仕事している人に聞いたら30万くらいPCが必要との事）


# すぐ忘れるので、用語集(追記予定）

沢山あるので、初心者の自分で覚えた事

**レベル**
ワールドの事、ここにアクタとか配置していく

**アクタ**
人間・車・ライトワールドに配置するオブジェクト

**アセット**
素材　Fab（マーケット）でDLとか出来る

**マテリアル**
見た目と言うか外見

**トランスフォーム**
アクタの位置、サイズなど

**ブループリント**
プログラミングを視覚的にした様な感じ？
プログラムを書かなくても、定義されたイベントを選んでゲームの動作を作成できる。
📘 Vol.8.4：【Struts2】「s:action」「s:token」タグ徹底解説！〜アクション呼び出しと二重送信防止の最前線〜

本記事は、Struts2でJSPを書く際に頻出するタグの基本を網羅する  
**📘「Vol.8.0〜8.7：Struts2 タグライブラリ入門編（基本操作・最低限の知識）」**　シリーズの一部です。

---

今回はStruts2のJSPタグライブラリの中でも、特に動的処理や安全性を高めるために便利なタグ、「`<s:action>`」と「`<s:token>`」について詳しく解説します。

---

## 🔹 1. `<s:action>` タグとは？

`<s:action>` はJSP内からStruts2のアクションを呼び出し、その結果をJSPで利用できるタグです。  
普通はコントローラのアクションがビューにデータを渡しますが、JSPから動的にアクションを呼ぶことで、より柔軟な表示制御が可能になります。

### 使い方の例

```jsp
<s:action name="getBulletinboards" var="bulletinboardsAction" />
<s:iterator value="#bulletinboardsAction.bulletinboards">
  <p>掲示板名: <s:property value="name" /></p>
</s:iterator>
```

- name属性に呼び出したいアクション名を指定

- var属性で結果を格納する変数名を指定

- 変数名は#をつけてプロパティアクセスに利用


---

### 🔹 2. `<s:token>` タグとは？
`<s:token>` はフォームの二重送信防止に使うトークンを生成し、フォームに埋め込むタグです。
Struts2の`TokenInterceptor`と連携して、ユーザーの二重送信やブラウザの戻るボタンによる二重処理を防ぎます。

**フォームでの使い方**
```jsp
<s:form action="InsertThread" method="post">
  <s:token />
  
  <div>
    スレッドタイトル:
    <s:textfield name="thread.thread_title" />
    <s:fielderror fieldName="thread.thread_title" />
  </div>
  
  <s:submit value="作成" />
</s:form>
```
**TokenInterceptor の設定例（struts.xml）**

```jsp
<action name="InsertThread" class="com.example.action.InsertThreadAction">
  <interceptor-ref name="token" />
  <interceptor-ref name="defaultStack" />
  <result name="success">/success.jsp</result>
  <result name="invalid.token">/error/duplicateSubmit.jsp</result>
</action>
```
- トークン不一致時はinvalid.token結果へ遷移

- ここで重複送信を検知して処理を中断

---

### 🔹 3. まとめ
| タグ           | 目的                       |
| ------------ | ------------------------ |
| `<s:action>` | JSP内からアクション呼び出し、動的に結果を取得 |
| `<s:token>`  | フォームの二重送信を防止するトークンを生成    |


これらを活用することで、Struts2のJSP画面をより安全かつ柔軟に設計可能です。

---
## 📚 関連記事（Vol.8シリーズ）

- [📘 Vol.8.0：【Struts2】OGNL入門　〜タグライブラリを支える最重要基礎技術〜](https://qiita.com/juehara-crypto/items/9b9558d46dfa5ac75224)

- [📘 Vol.8.1：【Struts2】タグライブラリの全体像と種類を把握する 〜JSP開発で使えるタグ一覧と役割まとめ〜](https://qiita.com/juehara-crypto/items/9635c8746d362496aef3)

- [📘 Vol.8.2：【Struts2】JSPタグライブラリ実践テンプレート集 〜現場で即使える！フォーム・URL・セッション活用まとめ〜](https://qiita.com/juehara-crypto/items/f57e473a85b2c9845730)

- [📘 Vol.8.3：Struts2で作る共通レイアウトJSP 〜header/footerを使った再利用設計〜](https://qiita.com/juehara-crypto/items/96cee6c986e13bbacd8c)

- [📘 Vol.8.5：【Struts2】条件分岐タグ（s:if / s:else）徹底解説！ 〜表示制御と実務応用の決定版〜](https://qiita.com/juehara-crypto/items/d9883eae6585aa62b93e)

- [📘 Vol.8.6：【Struts2】画面部品の共通化！ s:include / s:component 徹底解説 〜JSPヘッダー/フッターの再利用でメンテ効率UP〜](https://qiita.com/juehara-crypto/items/b36801f70830d2c056aa)

- [📘 Vol.8.7：【Struts2】バリデーションUIの味方！ `<s:fielderror>` / `<s:actionerror>` / `<s:actionmessage>` 徹底ガイド 〜エラーメッセージの表示とフォーム連携の基本〜](https://qiita.com/juehara-crypto/items/b5bacb915f8baea2f2ec)

---
### 最後に
今回の解説がStruts2初心者の皆さんの助けになれば幸いです！
次回はより応用的なタグや実践例を取り上げていきます。お楽しみに！

---

この記事はjuehara-cryptoによる連載シリーズの一部です。
1年目エンジニア「すみません、仮想DOMってなんですか？」僕「...」

ってなりたくなかったので調べました
next.jsでコーディングしてると良く目にするワードですが、知らなくてもコーディングはできたしなんだか難しそうだったので放置してしまってました...。

## 仮想DOMって何？

実際のDOM（HTMLの要素ツリー）を軽量化したJavaScriptオブジェクトとしてメモリ上で管理したものです。

next.jsで下記のようなコードを書いたとすると

```typescript
function Modal({ isOpen }) {
  return (
    <div className="modal">
      {isOpen && <div className="modal-content">This is a modal</div>}
    </div>
  );
}
```

仮想DOMは下記にようにメモリに保存されます。（状態が変更されたら生成される）
```js
{
  type: "div",
  props: {
    className: "modal",
    children: [
      {
        type: "div",
        props: {
          className: "modal-content",
          children: ["This is a modal"]
        }
      }
    ]
  }
}
```

## なんのために仮想DOMがある？
DOMの一部だけを更新してパフォーマンスを上げるためです。

### どういう仕組み？

先ほどのコード例で説明します

isOpenフラグがtrueになって状態が変化すると

変更前と後の仮想DOMが生成されます
その差分をチェックして、差分のところのみをレンダリングして実際のDOMに反映させてるわけです

こうすることで余計なDOMの更新をかけなくて済むので素早く更新をかけることができます


## Next.js学びたての時に自分がやりがちだったミス

```typescript
const button = document.getElementById('incrementButton');
button.style.backgroundColor = 'lightblue';
```
HTMLやCSSのコーディングに慣れている人は
上記のようにリアルDOMの方を操作しようしてしまいがちです。

Reactが管理する仮想DOMとの整合性が取れなくなり、予期しない動作が発生します。
また、差分計算が効かず、最適化された更新が行われなくなるためパフォーマンス低下を引き起こす可能性もあります。

useStateやuseRefを使用して、仮想DOMの方を操作するようにしましょう。
ReactでのonClickと関数の型まとめ

# ReactでのonClickと関数の型まとめ

Reactでボタンなどに関数を渡すとき、特にTypeScriptを使っていると「関数の型」や「書き方」が混乱しやすいポイントです。この記事では、よくあるonClickの使い方や関数の型の書き方について、パターン別にコード例付きで解説します。

---

## ✅ パターン1：引数なし・戻り値なしの関数

```tsx
const handleClick = () => {
  console.log("clicked");
};

<button onClick={handleClick}>Click</button>
```

### 型

```ts
const handleClick: () => void = () => { ... };
```

* `() => void` は「引数なし・戻り値なし」という意味です。

---

## ✅ パターン2：引数ありの関数

### ❌ よくある間違い

```tsx
<button onClick={handleClick("hello")}>Click</button> // 即実行されてしまう！
```

### ✅ 正しい書き方（無名関数でラップ）

```tsx
const handleClick = (msg: string) => {
  console.log(msg);
};

<button onClick={() => handleClick("hello")}>Click</button>
```

### 型

```ts
const handleClick: (msg: string) => void = (msg) => { ... };
```

---

## ✅ パターン3：戻り値がある関数

```tsx
const handleClick = () => {
  return "clicked";
};

<button onClick={() => console.log(handleClick())}>Click</button>
```

### 型

```ts
const handleClick: () => string = () => "clicked";
```

---

## ✅ パターン4：propsで関数を渡す（引数なし）

```tsx
// 子コンポーネント

type Props = {
  onAction: () => void;
};

const MyButton = ({ onAction }: Props) => (
  <button onClick={onAction}>Action</button>
);

// 親コンポーネント
const handleAction = () => {
  console.log("action");
};

<MyButton onAction={handleAction} />
```

---

## ✅ パターン5：propsで関数を渡す（引数あり）

```tsx
// 子コンポーネント

type Props = {
  onAction: (id: number) => void;
};

const MyButton = ({ onAction }: Props) => (
  <button onClick={() => onAction(123)}>Action</button>
);

// 親コンポーネント
const handleAction = (id: number) => {
  console.log("action id:", id);
};

<MyButton onAction={handleAction} />
```

---

## ✅ よく使う関数型まとめ

| シグニチャ      | 型                         | 用途例          |
| ---------- | ------------------------- | ------------ |
| 引数なし・戻り値なし | `() => void`              | ボタンクリックなど    |
| 引数あり・戻り値なし | `(value: string) => void` | 入力イベントなど     |
| 引数なし・戻り値あり | `() => string`            | 値の取得や処理の返却など |
| 引数・戻り値あり   | `(x: number) => string`   | IDを変換して返すなど  |

---

## 💡 まとめと注意点

* `onClick={func}` → 関数を渡す（クリック時に実行される）
* `onClick={func()}` → 関数がすぐ実行され、戻り値が渡る（注意！）
* 引数を渡したいときは `onClick={() => func("arg")}` のように**無名関数**でラップする

React×TypeScriptでUIイベントを書くときの基礎として、ぜひ参考にしてください！
ClipboardManagerからClipboardに移行する

compose-uiを1.8.0にアップデートしたところ、以下の警告が出るようになりました。
```
'interface ClipboardManager : Any' is deprecated. Use Clipboard instead, which supports suspend functions.
```

## 移行作業
単純に移行するとコード量が多いので、以下のような拡張関数を追加するのが良さそうです。
```kotlin
suspend fun Clipboard.setText(text: String) {
    setClipEntry(
        ClipData
            .newPlainText(text, text)
            .toClipEntry(),
    )
}
```

`LocalClipboardManager` を置換し、
```diff
-    val clipboardManager = LocalClipboardManager.current
+    val clipboard = LocalClipboard.current
```

suspend funを実行する形に修正します
```diff
+   val scope = rememberCoroutineScope()
    Button(
        onClick = {
-           clipboardManager.setText(AnnotatedString(it))
+           scope.launch {
+               clipboard.setText(it)
+               ...
+           }
        }
    )
```
sl(Steam Locomotive)を入れてるとjestがwatchモードで動かない！

# 要するに
ターミナルで蒸気機関車を走らせることができるジョークコマンド（`Steam Locomotive`）と、`sapling`のコマンド名がコンフリクトしている(どっちも`sl`な)ので、`Steam Locomotive`をインストールしていると `jest --watch` が正常に起動しません。

https://github.com/jestjs/jest/issues/14046

BugFixについてはv30から入るようです。

https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.4

# Steam Locomotiveって

`ls`を`sl`とタイポしたときに、ターミナルに蒸気機関車が走るというジョークコマンドです。

![gifイメージ](https://github.com/mtoyoda/sl/raw/master/demo.gif)

https://github.com/mtoyoda/sl より引用。

ジョークコマンドの一つとして、QiitaやZennなどでも取り上げられるのを見ますね。

# 何が起きたのか

`Steam Locomotive` を入れた環境で `jest --watch`テストを流すと動きません！

```sh
npx jest --watch
Determining test suites to run...

  ● Test suite failed to run

thrown: [Error]
```

# 詳しい理由

冒頭の通り、slというコマンド名が `Steam Locomotive`と[sapling](https://sapling-scm.com/)（Meta謹製のソースコード管理システム）のコマンド名が重複しています。

もう少し具体的には `jest-changed-files` が gitやsaplingなどいくつかのソースコード管理システムによる差分検知をサポートしており、slコマンドも入っていれば利用してくれます。
ここで名前がコンフリクトしているので`Steam Locomotive`を利用している人は蒸気機関車が走ってしまい、エラーになるというわけです。

## Bugfixについて

こちらのPRで修正されています。`sl`が `Steam Locomotive` なら処理をスキップするようになっています。

https://github.com/jestjs/jest/pull/15053

https://github.com/jestjs/jest/blob/d866589cb869af0b533ae318acdf3e913f11733e/packages/jest-changed-files/src/sl.ts#L55-L65
AUTOSAR を、本当に完全に理解するには

MATLAB 完全に理解するには, OSEK(82)　制御（１）
https://qiita.com/kaizen_nagoya/items/867e8743fa813be9b37c

制御のことしか書いてない。ごめんなさい。

AUTOSAR (88)「完全に理解した」 OSEK(40), 制御（４）
https://qiita.com/kaizen_nagoya/items/51983798ad7902b33cb1

OSEKには触れている。CANにあまり触れていない。

CANとOSEK/VDX OSで、Etehrnet/TCP/IP＋POSIXがやっているIPC/RPCを実現するがぬけている。ごめんなさい。

AUTOSARの利点と方向性, OSEK(50) https://qiita.com/kaizen_nagoya/items/681902476520cccf3c3e

AUTOSAR わかりにくいこと12, AUTOSAR(27), OSEK(67) https://qiita.com/kaizen_nagoya/items/68b0da5bee1421200a11

# OSEK/VDX OSが制御のじゃまをしない
Priority ceiling Protocolで、デッドロックしない。
拡張タスクの待ちになるときには、リソースを手放す。

# CAN通信が制御のじゃまをしない
大事な通信のIDの物理的な信号で勝ち負けが決まり、勝った方は、そのまま通信ができる。
vectorのCANoeがデファクトソフト
# Matlab/simulinkが制御のコードを自動生成
Cコンパイラ書いていた人がMatlabコンパイラの改良に参加。
# AUTOSARは、上記３つを連携するソースコードを自動生成。
人がやるより、自動生成でやれるようにする。
vectorのツールがCANoe連携を自動生成できるのでNo.1
# Cの精神　プログラマがやろうとすることを妨げない。
OSEK、AUTOSARのソースコード生成はCの精神の延長線上。

# CANとOSEK/VDX OSで、Etehrnet/TCP/IP＋POSIXがやっているIPC/RPCを実現する。
OSEK/VDX OSでは、抽象絵的な定義しかない。
具体的にIPC:Inter Process Communication, RPC: Remote Procedure Callをどう実現するかの例をAUTOSARは示した。
Classic PlatformとAdaptive Platformをソースコード統合すると、もう一歩先に進めるかも。
🚀 JetBrains「2025年開発者エコシステムアンケート」参加のお願い （抽選で賞品が当たるチャンス）🎯

#  JetBrains「2025年開発者エコシステムアンケート」参加のお願い 


こんにちは、JetBrains公式代理店「NATTOSYSTEM」のねばねーばです。
JetBrainsが2025年5月20日に発表した「2025年開発者エコシステムアンケート」について紹介します。本アンケートは世界中の開発者の声を集め、ソフトウェア開発の現状や未来を探るための年次調査です。

---

## 📝 アンケート概要

- **🎯 目的**  
  開発者コミュニティのトレンドや課題を把握し、JetBrainsや業界のツール・サービス改善に役立てること。

- **👥 対象者**  
  エンタープライズ開発者から個人のサイドプロジェクト開発者まで、幅広い開発者が対象。

- **⏳ 所要時間**  
  約30分

- **🌐 対応言語**  
  10言語で実施

- **🎁 参加特典**  
  抽選で以下の賞品が当たるチャンスがあります。  
  - 💻 MacBook Pro 16インチ  
  - 📱 iPhone 16 Pro または Google Pixel 9 Pro  
  - 🛒 $500のAmazonギフト券（代替品も選択可）  
  - 🔧 JetBrains All Products Pack 1年サブスクリプション  
  - 🎽 $150分のJetBrainsグッズストアバウチャー

---

## 🚀 参加方法

アンケートは以下のURLから回答可能です。回答後に専用の紹介リンクが発行されるので、ぜひ周囲の開発者にも共有してください。
また、最も多く共有していただいた方には、ささやかな贈り物をお渡しする予定とのこと。

[2025年開発者エコシステムアンケート - Developer Ecosystem Survey 2025](https://blog.jetbrains.com/ja/team/2025/05/20/developer-ecosystem-survey-2025-help-shape-the-future-of-development/)

---

## 📊 結果公開

アンケート結果はインフォグラフィックや詳細レポートとして公開されます。匿名化された生データも配布され、開発者自身が分析に活用可能です。

---

## 🤖 本記事について

本記事はChatGPT（AI）を活用して要点を整理し、わかりやすくまとめています。

---

## 🔍 まとめ

このアンケートは、ソフトウェア開発の未来を形作る貴重な情報源（抽選で賞品が当たるチャンス）となります。開発者コミュニティ全体の声を届けるため、参加をお待ちしています。

---

> 出典：JetBrains公式ブログ  
> [2025年開発者エコシステムアンケート - Developer Ecosystem Survey 2025](https://blog.jetbrains.com/ja/team/2025/05/20/developer-ecosystem-survey-2025-help-shape-the-future-of-development/)