OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Compose V1とV2違いは？

# はじめに
何度かお世話になっているDockerの参考書「プログラマのためのDocker教科書 第2版」を見ていた際に、Docker Composeを起動する方法として「docker-compose」というエイリアス名が使用されていることに違和感を感じた(普段はdocker composeコマンドを使っている)ので調べてみました。

# docker composeとは
>Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose は YAML ファイルを使い、アプリケーションのサービスを設定します。コマンドを１つ実行するだけで、設定内容に基づいた全てのサービスを生成・起動します。

要約すると複数のDockerコンテナを一括で管理できるのが「docker compose」です。

# docker-composeとdocker composeのコマンドの違い
この違いはバージョン変更に伴うコマンド名の変更があるようです。
具体的には、Docker Compose V1が2023年6月にEOLし、その移行先としてDocker Compose V2が実装されたからみたいです。 参考：[Docker blog](https://www.docker.com/blog/announcing-compose-v2-general-availability/)

Docker Compose V1コマンドを利用する場合、別途インストールが必要でしたが、Docker Compose V2ではプラグインとしてデフォルトでDockerに組み込まれています。以前のバージョンでも、[compose-plugin](https://docs.docker.jp/compose/install/compose-plugin.html)をインストールすれば利用可能。

## V1とV2の変更点
インストール方法: V1はPythonで実装されており、Pythonの仮想環境にインストールする必要がありました。V2はGoで実装されており、Docker本体に統合されています。

パフォーマンス: V2はGoで実装されているため、V1に比べて高速で効率的です。

コマンド形式: V1ではdocker-composeコマンドを使用しましたが、V2ではdocker composeとスペースを含む形式になりました。

yamlファイルの記述: 基本的v1で作成したdocker-compose.yamlはV2でも流用可能ですが、一部コマンドが利用できなかったり非推奨などにもなっている。V1で書かれているyamlを流用する際は注意が必要そうです。

# あとがき
何となくで使っていたDocker Composeでしたが、v1とv2でのパフォーマンス違いや
推奨設定違いなど全然知識がアップデートできていなかったことに気づきました。
これを機会に最新のDockerに関して勉強しなおして行こうと思います。(おすすめの参考書などあれば是非ご教授ください。)

# 参考

https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350

https://docs.docker.jp/compose/index.html
【OUTPUT記事】Webシステムについて

# 概要
本記事は、研修で学んだことをOUTPUTするための記事である。
あくまで、学んだことを俯瞰的に書き記したものであり、概要程度の説明のみとする。

# 目次
 1.非機能要件
2.Webシステムの全体像
3.ロードバランサ
4.プロキシ
5.クラスタリング
6.SQL

## 非機能要件
機能以外の側面に用いられる要件のことを指す。
以下項目である。
・可用性
・性能/拡張性
・運用/保守性
・移行性
・セキュリティ
・システム環境/エコロジー

## Webシステムの全体像
アプリケーションサーバ（ＡＰ）
Ｗｅｂサーバ（ＷＥＢ）
ＤＢサーバ（ＤＢ）
ロードバランサ（ＬＢ）

## ロードバランサ
外部からの通信（トラフィック）を複数のサーバーに分散する装置
### 主な機能
・サーバーへのアクセスを集約する
・リソースに余裕があるサーバーを接続先として選択する
・負荷分散によって、いずれかのサーバーにアクセスが集中しないようにする
・サーバーの死活状態を監視し、障害が発生した場合にはそのサーバーへの振り分けを停止する

## プロキシ
インターネット通信においてパソコンやスマートフォンなどの代わりに外部ネットワークへアクセスする役割を持つもの

## クラスタリング
複数のサーバーを使って冗長化すること
システムを障害から守るための構成としてよく用いられるのが、負荷分散クラスターとHAクラスターと呼ばれる構成

## SQL
リレーショナルデータベース（RDB）のデータを操作するための言語

### データ定義言語（DDL）
・CREATE……テーブルの作成
・DROP……テーブルの削除
・ALTER……既存テーブルの定義変更
・TRUNCATE……テーブルのデータ削除
・RENAME……テーブル名の変更
・JOIN……テーブルの結合
・COMMENT……テーブルへのコメント追加

### データ操作言語（DML）
・SELECT……テーブルからレコードを取得
・UPDATE……テーブルのレコードを更新
・DELETE……テーブルからレコードを削除
・INSERT……テーブルにレコードを新規登録

### データ制御言語（DCL）
・GRANT……テーブルへの権限付与
・REVOKE……テーブルへの権限取り消し
・BEGIN……トランザクション処理の開始
・COMMIT……トランザクション処理の確定
・ROLLBACK……トランザクション処理の取り消し
ドメイン駆動設計(DDD)のざっくりとした考え

### **1.ドメイン駆動設計の基本的な考え方**

- **「ドメイン」とは何か？**
    - ドメインとは「そのシステムが解決しようとする業務の世界」のことです。たとえば、銀行システムなら「お金の預け入れや送金」、オンラインショップなら「商品購入や在庫管理」がドメインです。
    - ドメイン駆動設計では、「その業務の仕組みやルール（ドメイン）」を理解することが最優先になります。
- **ビジネスの専門家と開発者が協力する**
    - DDDでは、ビジネスの専門家（顧客や業務担当者）と開発者が一緒に議論し、システムの中核となる業務（ドメイン）を深く理解して設計を進めます。
    - 専門家から聞いた業務ルールを正しく反映させたシステムを作ることが目標です。

---

### **2. DDDを構成する重要な要素**

ドメイン駆動設計では、いくつかの「核となる考え方」があります。以下はその中でも重要な3つです。

### **(1) ユビキタス言語（Ubiquitous Language）**

- **何をするもの？**
    - ドメイン駆動設計では、開発者と業務担当者が共通して使う「言葉」を統一します。これを「ユビキタス言語」と呼びます。
- **なぜ必要？**
    - 「業務担当者と開発者で使う言葉が違うと誤解が生まれる」ことを防ぎます。
    - たとえば、「顧客」という言葉を「ユーザー」と混同しないよう、明確に定義します。

### **(2) エンティティとバリューオブジェクト**

- **エンティティ（Entity）**
    - 業務上「一意の識別子」を持つもの。
    - 例: 図書館の「利用者」や「図書」はエンティティです。利用者IDや図書IDで特定できるからです。
- **バリューオブジェクト（Value Object）**
    - 業務上「単なる値として扱うもの」。
    - 例: 「住所」や「日付」は値としてシステムに扱われ、個別のIDを必要としません。

### **(3) 集約（Aggregate）**

- **何をするもの？**
    - 業務で扱うデータを「まとまり」としてグループ化し、外部とのやり取りをシンプルにします。
    - 例: 図書館システムなら、「貸出」という集約の中に「利用者」「図書」「返却期限」が含まれる形。
- **メリット**
    - データの管理がシンプルになり、システム全体の複雑さを減らせます。

---

### **3. DDDでシステムを作る流れ**

大きく分けると、以下の流れでシステムを設計・構築します。

### **(1) ドメインの理解**

- 業務の専門家（顧客）にインタビューし、業務のルールや仕組みを深く理解します。
- ユビキタス言語を作り、開発者と顧客が「共通言語」を使えるようにします。

### **(2) ドメインモデルの設計**

- 業務ルールをもとに、エンティティ、バリューオブジェクト、集約などを設計します。
- 例: 図書館の「貸出モデル」には、「利用者」「図書」「貸出日」「返却期限」が含まれます。

### **(3) 実装**

- 設計したドメインモデルをコードに落とし込みます。
- 業務ルールが変更された場合も簡単に対応できる設計を目指します。

---

### **4. DDDのメリットと課題**

### **メリット**

- 業務ルールに忠実なシステムを作れる。
- システムが拡張しやすく、変更に強くなる。
- 開発者と業務担当者の意思疎通が良くなる。

### **課題**

- ドメイン駆動設計を実践するには、業務の深い理解と設計力が求められる。
- 小規模なプロジェクトでは、DDDを適用するコストが高い場合がある。
JavaのGetterとSetter、いつどっちを使うべきか？

## **1. Getter だけを作るべき時**

### **「値の読み取りは必要だが、変更を許可したくない」場合**

#### **主な例**

- イミュータブル（不変）なオブジェクト
  - `final` フィールドで初期化後に変更不可とする場合
  - 例: `java.time.LocalDate` のような値オブジェクト
- 設定後に変更させたくないプロパティ
  - 例: `ユーザーID`、`作成日時` など、変更されるべきでないデータ

#### **具体例**

```java
public class User {
    private final String id;  // 一度セットされたら変更不可
    private String name;

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {  // Getter だけ
        return id;
    }

    public String getName() {
        return name;
    }

    // Setter を用意しないことで id の変更を防ぐ
}
```

**ポイント:**

- `id` は `final` なのでコンストラクタでのみセット可能
- `id` の `Getter` はあるが `Setter` はなし → **不変性を確保**
- `name` は変更可能なので `Setter` を作ることも可能

------

## **2. Setter だけを作るべき時**

### **「外部から値の取得を制限し、内部のロジックだけで使用する」場合**

#### **主な例**

- 値の取得を許可したくない場合
  - 例: **パスワードのようなセンシティブな情報**
- 値を外部に公開したくないが、設定はできる場合
  - 例: **API 経由で設定はできるが、内部でのみ利用する値**
- 特定のロジック内でしか値を使わない場合
  - 例: キャッシュの更新フラグ、ログ管理用の変数

#### **具体例**

```java
public class SecureUser {
    private String password;  // 外部に公開したくない

    public void setPassword(String password) {
        this.password = password;
    }

    // Getter を作らないことでパスワードの取得を防ぐ
}
```

**ポイント:**

- `setPassword` で **パスワードを設定** できる
- しかし、`getPassword` は作らないので **外部からパスワードを取得できない**
- **セキュリティ対策として有効**

------

## **3. Getter と Setter の両方を作るべき時**

### **「自由に値を取得・変更できるべき場合」**

#### **主な例**

- 通常のエンティティや DTO
  - 例: `User`、`Product` などの **ビジネスデータを持つクラス**
- フォームデータや設定情報
  - 例: **画面からの入力を保持するオブジェクト**
- 特に不変性が必要ない場合
  - 例: **キャッシュや一時的な設定を扱うオブジェクト**

#### **具体例**

```java
public class Product {
    private String name;
    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}
```

**ポイント:**

- `name` と `price` は **自由に取得・変更できる**
- 一般的な **データ保持用クラス** に適している
- DTO（Data Transfer Object）や JavaBean では **Getter/Setter を両方持つことが多い**

------

## **まとめ**

| 作成するメソッド         | 使うべきケース                                               |
| ------------------------ | ------------------------------------------------------------ |
| **Getter だけ**          | - 値を変更させたくない（`final` フィールドなど） - イミュータブルなオブジェクト（`User ID`、`作成日時` など） |
| **Setter だけ**          | - センシティブな情報を外部に公開したくない（`password` など） - 内部ロジックでのみ使う値（`ログイン試行回数` など） |
| **Getter & Setter 両方** | - 通常のエンティティ（`User`、`Product` など） - 変更可能なオブジェクト（DTO や フォームデータ） |

**設計のポイント**

- **変更を許可すべきか？** → Getter/Setter の有無を決める
- **セキュリティや不変性を考慮する** → Getter/Setter を制限する
- **ビジネスルールを考慮する** → 必要な操作だけを提供する
個人的な備忘録：WHERE句について3時間語れなかったので、記事にまとめて振り返ってみた

## はじめに

`WHERE`句は、SQLでデータベースのクエリ結果をフィルタリングするために使用されます。**特定の条件に一致する行だけを取得するのに役立ちます。**

:::note info
***SQL文と適切に組み合わせることで、より便利に活用できます。***
:::

本記事は個人的な備忘録としてまとめたものです。***その点をご理解いただければ幸いです。***

## 書こうと思ったきっかけ
日常的に`INSERT`や`SELECT`、`UPDATE`といった基本的なSQL文を使用することは多いですが、`WHERE`句については、意識して使う機会がそれほど多くありませんでした。

:::note warn
**そのため、自分自身の知識を体系的に整理し、学んだことをアウトプットする目的で本記事を作成しました。**
:::

今後、データベースのテーブル設計を行う際に、作成したデータを適切にフィルタリングできるよう、WHERE句の使い方を丁寧にまとめていきたいと思っています。

## `WHERE`句の基本構文について

WHERE句は、SQLでデータを取得するときに条件を指定するためのものです。***例えば、「年齢が25歳のユーザーだけを取得する」といったフィルタリングができます。***

```sql
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件;
```

また、複数の条件を組み合わせたり、部分一致検索や範囲指定も可能です。これにより、必要なデータだけを効率よく取得できるようになります。

## 実際に使ってみた

### 1. 特定の値に一致するデータを取得

`users`テーブルから`age`が25のユーザーを取得する:

```sql
SELECT * 
FROM users
WHERE age = 25;
```

### 2. 条件を複数指定する
ANDやORを使って複数条件を指定できます。

- **AND（かつ）条件:**
`users`テーブルから`age`が25で`gender`が'male'のユーザーを取得:

```sql
SELECT * 
FROM users
WHERE age = 25 AND gender = 'male';
```

- **OR（または）条件:**

`users`テーブルから`age`が25または`gender`が`'female'`のユーザーを取得:

```sql
SELECT * 
FROM users
WHERE age = 25 OR gender = 'female';
```

### 3. 比較演算子を使う
- **大なり/小なり: `age`が30より大きいユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE age > 30;
```

- **範囲指定（BETWEEN）: `age`が20から30の間のユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE age BETWEEN 20 AND 30;
```

### 4. 部分一致検索（LIKE）
- **名前が「A」で始まるユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE name LIKE 'A%';
```

- **名前が「smith」を含むユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE name LIKE '%smith%';
```

### 5. NULL値のチェック
- **`phone_number`がNULLのユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE phone_number IS NULL;
```

### 6. IN句を使った条件指定
- **特定の値リストに一致するデータを取得:**

```sql
SELECT * 
FROM users
WHERE age IN (25, 30, 35);
```

### 7. NOTを使った条件反転
- **`age`が30以外のユーザーを取得:**

```sql
SELECT * 
FROM users
WHERE age != 30;
```

## 注意点
条件に指定する値が文字列の場合、シングルクォート `' '` で囲む必要があります。数値の場合はクォートなしで記述します。

```sql
SELECT * FROM users WHERE name = 'Alice';  -- 文字列 → シングルクォートで囲む
SELECT * FROM users WHERE age = 25;       -- 数値 → クォートなし
```


## まとめ
最後までお読みいただき、ありがとうございました。SQLやCRUD周りの処理については、ITスクールのハッカソンに参加し、実際に手を動かしたことで、より実践的なスキルを身につけることができました。

:::note warn
***データベースを設計する際は、`WHERE`句の使い方を正しく理解し、適切に使い分けることが重要だと痛感しました。***
:::

***これからも、このような基本的な内容を丁寧にまとめ、知識を定着させていきたいと思います。***
AMIリストア起動後確認設定作業【SAP BASIS向け】

・IP重複確認(通信を遮断している場合)
イーサネットのプロパティ→プロトコルver4のプロパティ→詳細設定からIP設定確認

・hosts変更

・EBS初期化

・SAPライセンス再インストール

(・タスクスケジューラ/cron変更)
【忙しい人のためのネスぺ対策】DHCP・DHCPリレーエージェント・DHCPスヌーピング

## DHCP
### DHCPとは
ネットワーク情報をホストに自動的に割り当てるプロトコル

### プロトコル
UDP

### DHCPで払い出される情報
- IPアドレス
- サブネットマスク
- <font color="red">**デフォルトゲートウェイのIPアドレス**</font>
- <font color="red">**DNSサーバのIPアドレス**</font>
- IPアドレスのリース時間
など

### DHCPの仕組み
##### 1. DHCPクライアントが<font color="red">**DHCP Discover**</font>をブロードキャストで送信
DHCPサーバを探す＆IPアドレスを要求
##### 2. DHCPサーバがDHCP Offerをユニキャストで送信
DHCPクライアントに対してIPアドレスを提案
##### 3. DHCPクライアントがDHCP Requestをブロードキャストで送信
DHCPサーバに対して提案されたIPアドレスの利用を要求
##### 4. DHCPサーバがDHCP Ackをユニキャストで送信
IPアドレスの仕様を了承

##### ※2と4については、DHCPサーバの仕様によりユニキャストではない場合がある


## <font color="red">**DHCPリレーエージェント**</font>
### DHCPリレーエージェントとは
- DHCPクライアントからのDHCPパケットをDHCPサーバに転送する仕組み

### なぜ必要なのか
- DHCPパケットはブロードキャストなので、L3越えができないから

### DHCPリレーエージェントの仕組み
- L3スイッチやルータがブロードキャストをユニキャストに変換して、DHCPサーバに転送することでL3越えを可能にする

### メリット
- サブネット毎にDHCPサーバを配置する必要がなく、1台のDHCPサーバで複数のサブネットのDHCPを管理できること

### どこに設定するのか
L3スイッチやルータのインターフェースに対して設定する（ciscoの場合）
```ruby:Ciscoルータの設定例
Router(config)#interface gigabitEthernet1
Router(config-if)#ip helper-address 192.168.1.200
```
下記構成であれば、**ルータ1**にだけ設定すればOK
PC → スイッチ1 → **ルータ1** → スイッチ2 → ルータ2 → DHCPサーバ

## <font color="red">**DHCPスヌーピング**</font>
### DHCPスヌーピングとは
DHCPパケットをのぞき見することで、不正な通信をブロックする仕組み

### 役割
- <font color="red">**IPアドレスを固定設定したクライアントからの通信をブロックする**</font>
- 不正なDHCPサーバからのIPアドレスの払い出しを防ぐ

### DHCPスヌーピングの仕組み
- DHCPスヌーピングを有効化したポートで受信したDHCP OfferやDHCP Ackを破棄する。これにより、不正なDHCPサーバからの通信をブロックする
- 正規のDHCPサーバからIPアドレスを払い出されたクライアントのIPアドレスやMACアドレス、ポート番号などを記録しておき、受信したパケットの情報を比較する。一致する場合は転送し、一致しない場合は破棄する。これにより、固定IPアドレスからの通信をブロックする

### trustedポート(信頼ポート)
- DHCP OfferやDHCP Ackを許可する設定のポートであり、<font color="red">**DHCPサーバを接続するポート**</font>に設定する（trustedポートについて、過去問では「<font color="red">**DHCPスヌーピングの制限を受け付けない設定**</font>」という表現がされている）
【脱・コーダー】JavaScriptの苦手意識を克服してReact・Next.jsを実務レベルに引き上げるためにやったこと

# はじめに
年末年始の不規則な生活を反省し、生活習慣を改善しようと決意したイモトです。

今回の記事はコーダーとしてHTML・CSSやjQueryを使ったサイト制作をしていた私ですが、後述する内容でモダンな技術スタックを習得してフロントエンドエンジニアとして無事キャリアアップして、後にNext.jsを使ったプロジェクトに参画しています。

JavaScriptの苦手意識を克服し、ReactやNext.jsを実務レベルまで引き上げるための学習ステップを具体的にご紹介します。

この記事が、同じように「脱コーダー」を目指している方の参考になれば幸いです。

# 過去の私のコーディングレベル
まずは、私の過去のスキルについて紹介します。コーダーとして自社サービスに携わっていた1～3年目のころの話です。

- HTML・CSS ⇒ PC・SP（時にはタブレット対応）のレスポンシブコーディングは問題なく実装できるレベル。
- jQuery ⇒ プラグイン（slickやskrollr等）を使ってスライダーやパララックスを実装可能。
- Vanilla JavaScript（素のJavaScript） ⇒ 非常に苦手で、変数や条件文は理解できても、関数やクラス構文があやふやなレベル
- PHP ⇒ 先輩エンジニアのコードを参考にしながら改修を続けていたのでようやくゼロから実装できるようになってきたレベル

この状態で3年間を過ごし、JavaScriptの学習本を買っては諦める、を繰り返していました。

# モダン環境で開発したいと思ったきっかけ
最大のきっかけは、このままでは年収アップが見込めないと感じたことです。また、SNSや周囲のエンジニアがモダンな技術スタックで活躍しているのを見て、強い焦りと劣等感を抱いていたのを覚えています。

# どこから学び直しを始めたか
前置きが長くなりましたが
以下、私が実際に行った学習ステップを順に紹介します。

## 1. JavaScriptの基礎から学ぶ
まずはJavaScriptを基礎から学び直しました。これまで参考書を途中で放棄していたため、今回は「実装して学ぶ」ことを意識しました。
- 重点を置いたポイント
  **変数・配列・条件文**：基本構文を復習し、実践で使える知識に落とし込む。
  **関数の返り値・引数**：関数の仕組みを理解することは、Reactのpropsやイベント処理の理解に直結します
- 使用した教材
  オライリーの「[初めてのJavaScript](https://x.gd/2fIuX "初めてのJavaScript | Amazon")」。全て読む必要はなく、上記の変数、配列、条件文、関数等の基礎を読んでいました
- 実践したこと
  まずは簡単なDOM操作を学び、JavaScriptがHTMLに与える影響を体感。
  次に、オセロゲームやじゃんけんゲームを通じてロジックを構築。
  わからない部分はChatGPTを活用するが、まずは自力で考えることを徹底。

## 2. Reactの基礎を学ぶ
Reactでは、コンポーネントや状態管理が重要な基礎となります。公式ドキュメントを中心に学び、以下の手順で実践しました。
状態管理（state）やuseEffectなどは最初は理解が難しいかもしれません。その際は公式ドキュメントのスタートガイドを参考にし、さらに書籍やChatGPTを活用して補完してください。
- 学習の流れ
  1. 公式の「クイックスタート」を参照し、基本的なコンポーネント設計を体験
  2. 状態管理（State）やuseEffectなどの基礎を理解
  3. 実際に「TODOリストアプリ」を作成し、コンポーネント間のデータフローを学ぶ
状態管理やライフサイクルの理解に苦労する場合は、書籍「りあクト！」やChatGPTを活用。
- おすすめ教材
  1. [公式ドキュメント（クイックスタート）](https://ja.react.dev/learn "クイックスタート")
  2. [りあクト！](https://oukayuka.booth.pm/items/2368045 "りあクト！")
  3. [TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発](https://x.gd/KO6z3 "TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発 | Amazon" )

## 3. Next.jsを学ぶ
Next.jsは、Reactの弱点を補う機能が豊富に用意されたフレームワークです。
以下の手順で学びました。
- 公式ドキュメントの活用
[Next.js公式ドキュメント](https://nextjs.org/learn/dashboard-app "App Router | Next.js")を見て学習して、SSRやSSGなどのレンダリング手法を学び、ブログサイトを作成
- 実践例
Eコマースサイトを作成し、SSRやAPI連携の基礎を理解
ここまでくると作りたい欲が色々出てくる頃かなと思いますので、作りたいものをNext.jsで実現してみてください！
思いつかなければ、以下のようなものがおすすめです。
- おすすめ制作物
ブログサイト（SSGや動的ルーティングの学習）
Eコマースサイト（SSRやAPI連携の実践）

## 4. TypeScriptを学ぶ
フロントエンドエンジニアとして今後キャリアのことを考えるとTypeScriptも学習することをおすすめします。
TypeScriptは、コードの安全性を高め、プロジェクト全体の品質を向上するものなので技術スタックとして採用している企業も多いです。
- おすすめ教材
  1. [りあクト！](https://oukayuka.booth.pm/items/2368045 "りあクト！")
  2.  [TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発](https://x.gd/KO6z3 "TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発 | Amazon" )
  3. [サバイバルTypeScript](https://typescriptbook.jp/tutorials "作って学ぶTypeScript")

学習後も実践を繰り返しましょう！！JavaScript学習の際に作成したオセロゲーム、じゃんけんゲームなどをTypeScriptへリファクタリングしてみるのもよいですし、ReactやNext.jsの時に作成した制作物をTypeScriptへリファクタリングするのも良いです！

- 実践したこと
  以前に作成したオセロゲームやReactアプリをTypeScriptにリファクタリング

# さいごに
基本的に「学ぶ→作る」のサイクルを繰り返せば、必ずスキルは向上すると実感しました。

コーダーとして脱したい方、フロントエンドエンジニアとしてキャリアアップの一助になれば幸いです！
【JavaScript】【TypeScript】オブジェクトのプロパティ(キー)は文字列

### はじめに
* 基本的なことなのですが混乱したためメモ
    * 「`obj.prop` のようなドット記法で参照」 = 「Ruby でいう"シンボル"？」なのかという点で勝手に混乱したため

---
# 結論

:::note info
* オブジェクトの**プロパティ (キー) は文字列**である
    * `Object.keys(XXX)`で確認すると文字列として格納されているのが確認できる
    * ブラケット記法においても `["XXX"]` で参照できる
:::


```typescript:sample.ts
const data = 'prop';
const obj: {
  name: string;
  age: number;
  123: 123;
  [data]: string;
} = {
  name: 'Mike',
  age: 20,
  123: 123,
  [data]: 'hello'
}


// キーの確認
console.log(Object.keys(obj));           //=> [ '123', 'name', 'age', 'prop' ]
console.log(typeof Object.keys(obj)[0]); //=> string
console.log(typeof Object.keys(obj)[1]); //=> string
console.log(typeof Object.keys(obj)[2]); //=> string
console.log(typeof Object.keys(obj)[3]); //=> string

// ドット記法
console.log(obj.name); //=> Mike
console.log(obj.age);  //=> 20
console.log(obj.prop); //=> hello

// ブラケット記法
console.log(obj["name"]); //=> Mike
console.log(obj["age"]);  //=> 20
console.log(obj[123]);    //=> 123
console.log(obj["123"]);  //=> 123
console.log(obj[prop]);   //=> hello

// エラー
console.log(obj[name]); // error TS2538: Type 'void' cannot be used as an index type.
console.log(obj.123);   // error TS1005: ',' expected.
```

:::note warn
* プロパティ（キー）に数値を用いるケースを見つけられなかったので一般的ではないかと思われます
    * 先述のコードよりドット記法だとエラーになるため使い勝手が悪い

```typescript:例
const obj = {
  123: 1_234_567_890
}

console.log(obj["123"]);  //=> 1234567890
// console.log(obj.123);  // エラー
```

:::

# 変わったプロパティの設定方法（動的プロパティ名）
* プロパティについて調査している際に **動的プロパティ名** という概念をしったため併せてメモ
    * これについて先述の『プロパティは文字列である』という点が関係してくる

```typescript:sample.ts
const key1 = 'name';
const key2 = 'age';
const person = {
  [key1]: 'Alice',
  [key2]: 30,
};

// 動的にプロパティ名を指定して値を取得
console.log(person[key1]); //=> 'Alice'
console.log(person[key2]); //=> 30

// 新しいプロパティを追加
const additionalKey = 'location';
person[additionalKey] = 'Tokyo';

console.log(person); //=> { name: 'Alice', age: 30, location: 'Tokyo' }
```
CpawCTF Q14.[PPC]並べ替えろ! をpythonで解いた

とりあえずpythonでコードを書いてやってみようと思いました。
大きい順に並び替えるメソッドがあるかもしれないなーと思ったけど、自分で書いた方がプログラミングの練習になると思いました。
以下が実際に書いたコードです。

```
sort_number = [15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]

x = 0
y = 0

is_complete = False

while not is_complete:
    is_complete = True
    for i in range(len(sort_number) - 1):
        if sort_number[i] < sort_number[i+1]:
            if is_complete==True:
                is_complete=False;
            x = sort_number[i]
            y = sort_number[i+1]
            sort_number[i] = y
            sort_number[i+1] = x

for i in range(len(sort_number)):
    print(sort_number[i], end="")
```
```
#実行結果
2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210
```
無駄なところはあるかもしれませんが、自分で考えてやってみました。
やっぱり、自分でコードを書いて解けたらめっちゃ気持ちいいです。

終わったあとに調べてみると、sortメソッドというものがあるらしいです。
AWSのマルチセッションサポートで複数AWSアカウントにアクセスする

## 初めに
AWSのコンソール画面にアクセスする場合、以下のようなURLにアクセスしてIAMユーザーでログインします。
https://[アカウントID].signin.aws.amazon.com/console
他のAWSアカウントのコンソール画面にアクセスする場合は別のURLでアクセスしますが、同じブラウザの場合はログイン中のAWSコンソールはログアウトされます。

2025年1月末ごろからAWSコンソールに「マルチセッションサポート」という機能が追加されているのを見つけました。この機能を使うと同一ブラウザで複数のAWSアカウントに同時ログインできます。

## 使い方
1.右上のプルダウンメニューを開き、「マルチセッションサポートをオンにする」をクリックします。
![スクリーンショット 2025-01-29 081909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/ecee0c0c-ea37-5ef6-c12f-da2bbb6a0d42.png)


2.ポップアップが出るので「マルチセッションサポートをオンにする」をクリックします。
![スクリーンショット 2025-01-29 081927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/23f98ea0-3f9a-c8c0-6f91-fce1095612df.png)


3.コンソール画面に戻ります。前の画面の説明にあったとおり、URLにあるリージョン名の前に文字列が追加されるのでブックマークの変更が必要になります。
この画面で「セッションを追加」をクリックします。
![スクリーンショット 2025-01-29 082000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/195961dc-1a96-33fb-20fa-5437e6b7c264.png)


4.ログイン画面が表示されるので別のAWSアカウントID、IAMユーザー名、パスワードを入力し、ログインします。
![スクリーンショット 2025-01-29 082043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/04115a4b-0166-01a0-c864-c050518d1a68.png)


5.新しいAWSアカウントのIAMユーザーでログインできます。右上のプルダウンメニューを開くと「その他に1件のアクティブなセッション」の枠内に今まで利用していたAWSアカウント、IAMユーザーが表示されるのでここをクリックすると別のAWSアカウントのコンソールを開くことができます。
![スクリーンショット 2025-01-29 082136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/e73a6fbe-7aaf-3a32-72d4-2d2a39d8766e.png)


ユーザー設定は保持されるようで、同一ブラウザで複数のAWSアカウントのコンソールを開いた場合、色や上部のアイコンの表示はそれぞれのゆーざーｎ設定で表示されました。
![スクリーンショット 2025-01-29 082618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/eb1a3784-6aa3-77df-4f2c-477552f8804a.png)

![スクリーンショット 2025-01-29 082727.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92424/580f4d6c-99f1-5001-8c17-5f3f373a3dc0.png)

今回の記事は以上です。
langchain_awsのChatBedrockConverseで構造化出力を行うとエラーになる問題の対処法

langchain_awsのChatBedrockConverseを使って`with_structured_output`をするとエラーになる問題の対処法

## ChatBedrockを使用するとOK

これはOK

```python
from langchain_aws import ChatBedrock
from pydantic import BaseModel, Field


class SearchQuery(BaseModel):
    search_query: str = Field(None, description="ウェブ検索に最適化されたクエリ")


llm = ChatBedrock(model="anthropic.claude-3-haiku-20240307-v1:0")
llm = llm.with_structured_output(SearchQuery)

response = llm.invoke("Googleで'富士山'を検索")

print(response.search_query)
```

> 富士山

## ChatBedrockConverseを使用するとエラー

でも、これはエラー

```diff_python
- from langchain_aws import ChatBedrock
+ from langchain_aws import ChatBedrockConverse
  from pydantic import BaseModel, Field
  
  
  class SearchQuery(BaseModel):
      search_query: str = Field(None, description="ウェブ検索に最適化されたクエリ")
  
- llm = ChatBedrock(model="anthropic.claude-3-haiku-20240307-v1:0")
+ llm = ChatBedrockConverse(model="anthropic.claude-3-haiku-20240307-v1:0")
  llm = llm.with_structured_output(SearchQuery)
  
  response = llm.invoke("Googleで'富士山'を検索")
  
  print(response.search_query)
```

> botocore.exceptions.ParamValidationError: Parameter validation failed:
> Invalid length for parameter toolConfig.tools[0].toolSpec.description, value: 0, valid min length: 1

descriptionの最小文字数が1以上ですが、上記実装では`""`（空文字）がセットされてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8958ef29-eb72-dfeb-3cfc-d23f53bc0d03.png)

## 対処法

docstringを追加することでdescriptionにセットされます

```diff_python
  from langchain_aws import ChatBedrockConverse
  from pydantic import BaseModel, Field
  
  
  class SearchQuery(BaseModel):
+     """検索クエリー"""
      search_query: str = Field(None, description="ウェブ検索に最適化されたクエリ")
  
  
  llm = ChatBedrockConverse(model="anthropic.claude-3-haiku-20240307-v1:0")
  llm = llm.with_structured_output(SearchQuery)
  
  response = llm.invoke("Googleで'富士山'を検索")
  
  print(response.search_query)
```

> 富士山


めでたしめでたし

いやー、ハマった
Linux リンク

# `$ ln`
link

シンボリックリンクやハードリンクを作成する。

Linux のリンクは、Windows では ショートカット、MacOS では エイリアス と呼ばれる。

`-s` オプションをつけない場合、ハードリンクを作成することになる。

```console:ハードリンクを作成
$ ln リンク元 ハードリンク
```

```console:シンボリックリンクを作成
$ ln -s リンク元 シンボリックリンク
```

# ハードリンク

データ本体への参照を名前が異なる複数のファイルが共有すること。

Linux のファイルシステムでは、ファイルは ファイル名、データ本体、 [inode](https://qiita.com/AsahinaKei/items/09ee7ce55b1a0be01ff0#inode) で構成される。

ハードリンクを作成したファイルは元のファイルと同じ inode を持つため、ファイルシステム上で完全に等価関係にある。

:::note info
ハードリンクのリンク元、リンク先ファイルは完全に等価。
リンク元、リンク先は区別できない。
:::

ハードリンクは同じファイルシステム内でしか作成できない。ファイルシステム、マウントポイント、パーティションをまたいだファイル間では作成できない。

ディレクトリに対しても作成できない。

ハードリンクは `$ ln` コマンドを使用して作成する。

```console:ハードリンクを作成する
$ ln リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
```

カレントディレクトリ `.` や、親ディレクトリ `..` は、ハードリンクの一つである。

## ファイルの削除

ハードリンクが作成されたファイルの **データ本体** は、リンク数が `0` になるまでは完全には削除されない。

`$ rm` コマンドを実行した時、内部ではそのファイル名と inode の紐付けが解除され、これによりリンク数が `1` 減少している。さらにリンク数が `0` になった場合にのみ、ファイルのデータ本体と inode が初めて削除（解放）されている。

:::note info
ファイルのデータ本体はリンク数が `0` になるまで削除されない
:::


# シンボリックリンク

リンク元ファイルへのパスを保持する特殊なファイル。

[ハードリンク](#ハードリンク) と異なり、異なるネットワーク、ファイルシステム、パーティション間でも作成できる。

シンボリックリンクは元ファイルのデータ本体ではなく、パスを参照するだけなので、元ファイルが削除されるとリンクは壊れてしまう。

```console:シンボリックリンクを作成する
$ ln -s リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
```

ディレクトリに対しても作成することができる。

```console:ディレクトリにシンボリックリンクを作成する
$ ls -s リンク元ディレクトリ名 リンクディレクトリ名
```

シンボリックリンクは `ls -l` コマンド実行時に `->` で表示される。

```console:シンボリックリンクが設定されたf
$ ls -l
> lrwxrwxrwx 1 kei kei 5 Jan 30 11:33 file1 -> file1
```

[パーミッション](https://qiita.com/AsahinaKei/items/2fbc4e079b1c4b847240) は `rwxrwxrwx` と表示されるが、実際には **リンク元のパーミッションが適用される**。

:::note info
シンボリックリンクのパーミッションは、リンク元のパーミッションが適用される。
:::


# リンクのコピー

ハードリンク、シンボリックリンクをファイルコピーした場合、デフォルトではリンク元ファイル（ファイルの実体）がコピーされる。

```console:ファイルの実体がコピーされる
$ cp リンク コピー先ファイル
```

ファイルの実体ではなくリンク自体をコピーしたい場合、`-d` オプションを使用する。

```console:リンク自体をコピーする
$ cp -d リンク コピー先ファイル
```

# 比較

| 特徴 | ハードリンク | シンボリックリンク |
|:-:|:-:|:-:|
| 参照方式 | 同じデータ本体を参照  | パスを参照 |
| inode 番号 | **同じ** | 異なる |
| リンク元ファイル削除時の挙動 | リンクが残る限りデータにアクセス可能 | リンク切れになる |
| 制約 | 同じファイルシステム内でのみ作成可能 | 異なるファイルシステムでも作成可能 |
| ディレクトリのリンク | 不可 | **可能** |
PHPで定数が定義されているか確認する

## はじめに
　Qiita初投稿です。PHPで定数が定義されているか確認する際にちょっと詰まったので備忘録も兼ねて投稿します。
 ## 実行環境
 - PHP8.1.29
 ## 変数の場合
　変数が宣言されているときには```isset```関数を使用します。以下の例をご覧ください。
 ```php:isset_check.php
 <?php
 $foo = "foo";
 $hoge = null;
 var_dump(isset($foo)); //bool(true)
 var_dump(isset($bar)); //bool(false)
 var_dump(isset($hoge)); //bool(false)
 ?>
 ```
 ## 定数の場合
 　定数の場合は```isset```の定数版である```defined```関数を使います。引数は
  私の場合は入門書で```isset```を先に知ったので、issetと同じ感覚で以下のように記述してしまいました。
```PHP:defined_check_bad.php
<?php
const FOO = "foo";
var_dump(defined(FOO)); //bool(false)
var_dump(defined(BAR)); //PHP Fatal error:  Uncaught Error: Undefined constant "BAR" in 〜
?>
```
　あれれ〜おっかしいぞ〜。3行目はbool(true)、4行目はbool(false)を予期していたのに、fatal errorが発生してしまいました。エラーの```Undefined constant "BAR" in 〜```に関しては、 **定数が定義されているのか調べたいんだから定義されていない場合もあるだろ！** とツッコミを入れたくなります。が、マニュアルを見るとすべて解決しました。
## ```defined()```の引数には定数「名」を渡さなければならない

> defined — 指定した名前の定数が存在するかどうかを調べる
> ```PHP:
> defined(string $constant_name): bool 
> ```
>（中略）
>パラメータ:constant_name
>定数***名***。
>戻り値
>constant_name で指定した名前の***定数が定義されている場合***にtrue、その他の場合にfalseを返します。

はい。つまり```defined```の引数には定数ではなく定数名を代入しないと行けなかったんですね。すなわち以下のように書く必要があるんです。
```PHP:defined_check_good.php
<?php
const FOO = "foo";
var_dump(defined("FOO")); //bool(true)
var_dump(defined("BAR")); //bool(false)
?>
```
ちなみに、上の```defined_check_bad.php```のコードは、FOOに代入されている値、すなわち"foo"という名前の変数が定義されているかという意味になってしまいます。以下の2つは同じ意味です。
```PHP:
<?php
const FOO = "BAR";
var_dump(FOO);
?>
```

```PHP:
<?php
var_dump("BAR");
?>
```
## おわりに
　いかがでしたでしょうか。私自身プログラミング経験が浅く数分間「なんで動かないんだろう？」と苦悶していました。同じミスをしてしまった方の参考になれば幸いです。最後までお読みいただきありがとうございました。
 ## 参考
 [PHP: isset - Manual ](https://www.php.net/manual/ja/function.isset.php)
 [PHP: defined - Manual ](https://www.php.net/manual/ja/function.defined.php)
基本情報技術者試験について


---

## 基本情報技術者試験まとめ

### 背景
ITの知識として幅広い知識を学びたいと思い、基本情報技術者試験を取得を目指している中で、
そもそも基本情報技術者試験についてまとめたいと思いこの記事を書きました。
少しでも気になっている方に見てもらえればと思います。

### 基本情報技術者試験の概要
基本情報技術者試験（略称 FE 試験）は、情報処理技術者としての基礎的な知識やスキルを評価する試験です。この試験の主な目的は、新卒者や初級システムエンジニア（SE）、プログラマーなどが基本的なIT知識を習得していることを証明することです。



### 試験の構成
試験は2つのセクションに分かれています：

1. **午前試験**
   - 基礎知識を評価するための四肢択一形式（多肢選択式）です。
   - 資格や統計、アルゴリズム、データベース、ネットワークなど、IT全般にわたる幅広い分野について出題されます。
   - 試験時間: 約2.5時間

2. **午後試験**
   - 実践的な応用力と問題解決能力を問う問題が出題されます。
   - プログラミングやシステム設計、データベース設計など、具体的な事例を元にした問題が中心です。
   - 試験時間: 約2時間

### 試験日程と応募方法
試験はCBT受験で日時を指定して、試験を受けることができます。

### 合格基準
基本情報技術者試験の合格基準は以下の通りです：
- **午前試験**: 60%以上の得点
- **午後試験**: 60%以上の得点

### 受験料
受験料は変動する可能性がありますが、2025年現在の受験料は約7,500円です。

### 参考資料と勉強方法
- 公式テキストや過去問題集　
参考書：イメージ＆クレバー方式でよくわかる栢木先生の基本情報者教室
過去問：アプリ　基本情報技術者試験　午前問題集
目安勉強時間：100～200時間

---
### 基本情報技術者試験を取得するメリット

#### 1. 専門知識の証明
- **基礎知識の裏付け**
  - 情報処理技術の幅広い基礎知識を有していることを証明できます。
  - プログラムやシステム開発の基本を理解していることが示されます。

#### 2. 就職・キャリアアップに有利
- **職場での評価向上**
  - IT関連企業や部門での評価が高まります。
  - 新卒者や中途採用者にとって、採用時に有利な資格となります。

#### 3. 他の上位資格へのステップアップ
- **ステップアップの土台**
  - 応用情報技術者試験やプロフェッショナル資格への足掛かりとなります。

---

### 午前試験の内容

#### 1. コンピュータの基礎
- **ハードウェア**
  - CPU: 中央処理装置の役割と構造
  - メモリ: 主記憶装置の種類と特性（RAM、ROM）
  - ストレージ: HDD、SSDの特徴

- **ソフトウェア**
  - OSの基本機能（プロセスマネジメント、メモリマネジメント）
  - プログラミング言語の分類（高級言語、低級言語）

#### 2. 情報処理技術
- **データ構造とアルゴリズム**
  - 配列、リスト、スタック、キューの基本的な使い方
  - ソート（バブルソート、クイックソート）と探索アルゴリズム（リニアサーチ、バイナリサーチ）

- **データベース**
  - データベース管理システム（DBMS）の基本
  - SQLの基本構文（SELECT、INSERT、UPDATE、DELETE）

#### 3. ネットワーク技術
- **ネットワークの基本**
  - OSI参照モデル（各層の役割とプロトコル）
  - TCP/IPモデルと主要プロトコル（HTTP、FTP、IP）

- **セキュリティ**
  - 暗号化技術（対称鍵暗号、公開鍵暗号）
  - 認証技術（パスワード、バイオメトリクス）
  - セキュリティ対策（ファイアウォール、アンチウィルス）

#### 4. 総合的な知識
- **システム開発**
  - システム開発ライフサイクル（SDLC）
  - プロジェクトマネジメントの基本（スコープ、コスト、時間）

- **情報システム戦略**
  - ITガバナンスの基本概念
  - 経営戦略との整合性

#### 5. 標準化と法務
- **標準化団体と標準規格**
  - ISO、IEC、IEEEの役割

- **知的財産権**
  - 著作権の基本
  - 特許権、商標権の基本

- **IT関連法規**
  - 個人情報保護法の概要
  - 不正アクセス禁止法の要点

## 午後試験の内容

### 概要
午後試験は、実務に即した応用力と問題解決能力を評価する形式です。具体例に基づいた個別問題が中心で、プログラム開発やシステム設計、データベース設計などが出題されます。

### 出題範囲

#### 1. プログラミング
- **アルゴリズム**
  - サーチアルゴリズム（バイナリサーチ、ハッシュなど）
  - ソートアルゴリズム（クイックソート、マージソートなど）
- **データ構造**
  - リンクリスト、スタック、キュー
  - ツリー構造、グラフ理論

#### 2. システム設計
- **要件定義**
  - 分析手法（UML、DFD等）
  - 調査、ヒアリング手法
- **基本設計**
  - 業務フロー設計
  - データフロー設計
- **詳細設計**
  - モジュール設計
  - インターフェース設計

#### 3. データベース設計
- **リレーショナルデータベース**
  - 正規化（第1～第3正規形、不正規形）
  - E-Rモデリング
- **SQL**
  - 複雑なクエリ（JOIN、GROUP BY、サブクエリ）
  - トリガーとストアドプロシージャ

#### 4. ネットワークとセキュリティ
- **ネットワーク設計**
  - トポロジー設計（スター型、メッシュ型など）
  - IPアドレス設計（サブネットマスク、CIDR）
- **セキュリティ対策**
  - 暗号化技術（対称/非対称暗号）
  - 認証技術とアクセス制御

#### 5. システム運用・管理
- **オペレーション管理**
  - バッチ処理
  - サービスレベル管理
- **トラブルシューティング**
  - 障害対応手法
  - ログ解析

### 試験時間と形式
- 試験時間: 約2時間
- 形式: 記述式問題、選択式問題が混在

### 試験対策
- **過去問題演習**
  - 過去問題を解くことで、出題パターンに慣れる。

### まとめ
基本情報技術者試験についての試験内容や出題問題等をまとめましたが、このように幅広い知識や問われます。専門的な知識ではないため仕事に役立つ部分は少ないかもしれませんが、基本的な知識として知っておくべきことも多く学べます。私もまだまだ勉強中ですが、これからも頑張りたいと思います。
選択公理はなぜ公理なのか？その直感的な意味を数学の博士が解説する

# はじめに

選択公理は数学における命題の１つで、特にZFC公理系の公理の１つです。
特に、他の公理から示せない独立な命題になっていますが、その直感的で感覚的に分かる説明をしているサイトや教科書があまり多くはない印象です。

そこで本記事では、選択公理がなぜ他の公理から示せない独立な命題なのか、それが意味することとは何かを数学の博士号をもつ私の個人的な意見から簡単に解説していきます。


# 選択公理とは

選択公理とは以下の命題である。

**任意の添え字集合$\Lambda$とその上の集合族$\\{A_\lambda\\}_{\lambda \in \Lambda}$に対し、**
**任意の$\lambda \in \Lambda$に対し$A_\lambda \neq \emptyset$を満たすとする。
この時以下を満たす写像$f : \Lambda \to \bigcup_{\lambda \in \Lambda}A_\lambda$が存在する。**

```math
\forall \lambda \in \Lambda, f(\lambda) \in A_\lambda
```

この命題について、よく**空でない集合から同時に元を取り出す**動作を表していると言われます。
直感的には特におかしいこともなさそうな命題ですが、なぜそれが公理として必要で、他の命題から示せないのか、私が初めて選択公理に触れた大学の学部生時代には正直分かりませんでした。
他にも選択公理と同値な命題がいくつかありますが、当時、そのどれも直感的に分かりやすいものではなかったので、しばらくよく理解しないまま使用していました。

そこで、なぜ選択公理が公理なのかを直感的にも分かるように解説していきます。


# 選択公理が公理である理由

選択公理が公理である理由を説明する前に、まず数学の世界とその証明について軽く触れていきます。

## 数学の世界では無限を扱えるが、その証明はあくまで有限長

ご存知の通り、数学の世界には無限集合が存在し、何個でも要素を取り出せる集合を扱うことができます。
しかしながら、数学の命題を示すには証明が必要です。
その**数学の証明というのはあくまで有限長でなければならない**こと、すなわち無限長の証明が認められていないことが選択公理が公理として必要な1つの背景といえます。


## 選択公理は無限長になる証明を有限長に収める

上で述べた通り、**選択公理は(ある種の)無限長になる証明を有限長に収めるために必要**な公理になります。

実際に証明において、空でない集合から要素を取り出す記述をするには、当然、証明の長さが必要になります[^1]。すなわち証明は有限長でなければならないことから、選択公理なしでは証明中に有限回しか要素を取り出すことができないということです。
しかしながら無限集合を扱う場合、無限回の要素の取り出しが必要になる場合があります。
それをある程度可能にするのが選択公理の役割です。

[^1]: 集合$X$とその上の述語$P : X \to 2$、すなわち$X$の部分集合$P \in 2^X$に対して、$P$が空でない、すなわち$\exists x \in X, P\\,x$が成り立っていた時に、$P\\,x$が成り立つ$x \in X$を取り出すという推論規則が必要になります。これは存在量化子$\exists$の導出規則です。

具体的に見ていきましょう。

## 具体例

### 全域的関係から写像の存在性を示す

集合$X, Y$に対し、全域的関係すなわち以下を満たす関係$R : X \to Y \to 2$が存在したとします。

```math
\forall x \in X, \exists y \in Y, R\,x\,y
```

このとき、以下を満たす写像$f : X \to Y$が存在することを示します。

```math
\forall x \in X, R\,x\,(f\,x)
```

証明の概要ですが、仮定より任意の$x \in X$に対して$\exists y \in Y, R\\,x\\,y$が成り立つので、写像$f$の入力$x \in X$に対してこの$y \in Y$を1つ対応させれば良さそうです。しかしながら一般の集合$X$は無限集合である可能性があり、$f$を定義するためにはその全ての$y$が必要になります。その理由は写像$f$がそれら全ての取り出した$y$に依存するからです。すなわち$\exists y \in Y, R\\,x\\,y$から$y \in Y$を取り出す動作を無限回行う必要があるということです。

そこで選択公理が必要になります。

まず、選択公理の仮定に合わせるために$Y$上の集合族$\\{Y_x\\}_{x \in X}$を以下に定義します。

```math
Y_x := \{y \in Y \mid R\,x\,y\}
```

仮定より任意の$x \in X$に対して$R\\,x\\,y$となる$y \in Y$が存在するので、任意の$x \in X$に対して$Y_x \neq \emptyset$であることがわかります。

（ちなみにこの証明には選択公理は必要ないです。これは$\forall x \in X, Y_x \neq \emptyset$を示すのに、勝手な1つの$x \in X$に対して$Y_x \neq \emptyset$を示せばいい[^2]からです。すなわち、存在量化子$\exists$を外す推論もこの$x$のときの1回のみで済みます。）

[^2]: 全称量化子$\forall$の導入規則

さて、それぞれ空でない集合族$\\{Y_x\\}_{x \in X}$が定義できたので、選択公理を使います。

すると以下を満たす写像$g : X \to \bigcup_{x \in X}Y_x$が存在することがわかります。

```math
\forall x \in X, g\,x \in Y_x
```

今、$\bigcup_{x \in X} Y_x \subset Y$であり、自然な写像$\operatorname{id} : \bigcup_{x \in X} Y_x \to Y$が存在するので写像$f:X \to Y$を$f := \operatorname{id} \circ g$と定義します。
このとき、任意の$x \in X$に対し、$g\\,x \in Y_x$すなわち$R\\,x\\,(g\\,x)$を満たすことから任意の$x \in X$に対して$R\\,x\\,(f\\,x)$を満たします。


## 選択公理の独立性

選択公理の意味としては上に書いたようなものですが、なぜ公理として必要なのでしょうか？

その直感的な説明も選択公理が証明の長さに言及する命題だという点からある程度いえます。

無限長の証明を有限長に収めるための公理には他にも数学的帰納法がありますが、これは一般に帰納原理が定義できるような、整礎関係が成り立つ集合上でしか使えません。
しかしながら選択公理であれば、そのような制約がなく一般の集合上で扱えるので、数学的帰納法よりも適用範囲が広く、その分他の公理から示せないというのが直感的な説明になります。


# まとめ

選択公理が公理である理由について、その感覚的な説明をしました。
あくまで感覚的な話であり個人的な見解ですので、その辺りはご了承ください。
【AWS SAA C-03】１ヶ月合格体験記

みなさんこんにちは！
AWS SAAを2025年1月に合格したので、テストの感想や対策を書いていきます。
合格されたい方、ご覧ください！

▫️目次
[自己紹介](#自己紹介)
[SAAとは](#SAAとは)
[使用教材](#使用教材)
[テストセンターについて](#テストセンターについて)
[最後に](#最後に)

## 自己紹介
SEをやっております。周囲で取得している方も多いので、取るか〜と重い腰を上げました。
AWSは2年程度触っていましたが、サービスを広く知っているわけではないので、勉強している中で初見も多かったです。
勉強時間としては累計50時間です（1日1-2時間勉強）
※初学者の方は2ヶ月程度見込むといいかもです！

## SAAとは
AWSの公式がやっている、設計における最適解って何？ていうのを学べる試験になります。
以下公式リンクです。
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

試験の構成は65問、これを130分間で解いていくテストです。
しかもこれ、2025年1月現在は20,000円もします…（高すぎ、しかも3年で切れます…泣ける）
受験にはテストセンターか自宅受験を選択できますが、私はテストセンター受験のため、自宅は割愛します！

## 使用教材
早速本題に入りますが、使用教材は2つです。
### Ping-t
https://mondai.ping-t.com/g
- 概要
基礎知識を身につけられるため、2周程度すれば十分だと思います。（無料です！）
知識自体は身につけられるのですが、本番の問題に近いのはudemyでした。
ここで大体65%以上取得できればudemyに移行すると良いです！

- 勉強方法
①まずは【試験レベル】以外の章を全て解きます
　1周目は間違えて全然いいので、解説をよく読んでこんなサービスがあるんだと知る
　2周目以降は身につけた知識で解いていき、問題に慣れましょう
②次に【試験レベル】を解いていきます
　飛ばしてudemyに行っても構いません。
　時間がある方は、2周程度実施し、65%以上を目指しましょう。

- 重点でやるべき章
どれも大事ですが、特に全ての問題に関連してきたものを挙げます。
①主要なサービス
②ストレージ
③データベース
④ネットワーク、コンテンツ配信
⑤アプリケーション統合

### udemy
【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）

https://www.udemy.com/course/aws-knan/?srsltid=AfmBOoryatVId2imT_c4hmR0L8QHjXs-aBNk2z0SIVf39il0wmpncRNS&couponCode=ST16MT28125BROW

- 概要
最後の仕上げ問題集です。
Ping-tで基礎力を身につけた後は、こちらに移行しましょう。
私は2回分だけ解いてますが、3周程度は実施しました！
こちらは本番のレベルや問題文にかなり近いです。
udemyの方が難しいという声も聞きますが、私はあまり変わらないと思いました。
※AIの問題をここでどんな風に出るのか拾いましょう
※選択問題が多いですが、本番は数問しか出ませんでした

- 勉強方法
ひたすら解きまくり、解説をみる。
6回分全て解くよりも1回分を何回も回して解説を読む方が大事です（同じような問題も出ました）
ここの問題で70%以上安定してとれれば、本番に望んでもいいと思います！

## テストセンターについて
知っている方は飛ばしてください！

各地にあるテストセンターに行って、試験を受けます。
持ち物は一切持ち込み禁止、身分証明書が2つ必要だったりするので、受験時に必ず予約票を確認しましょう！
流れとしては、受付→紙面記入→写真撮影→持ち物を全てしまう、になります。
※暑かったり寒かったりするので、インナーで調整しましょう。脱ぎ着できなそうです。
※ホワイトボードや紙を入場前に渡してくれます、防音用のイヤーマフもあります

基本は受付をすれば全てわかるようになっていますが、私の時は試験開始の15分前にいくこと予約票に書いてあるので、必ずチェックしましょう！！！
ちなみに結果は、当日の20:30頃に公式サイトに届きました！

## 最後に
私が受験して感じたSAAの備忘録を記載しました。
みなさんの参考になれば幸いです！一緒に試験頑張りましょう！！！

最後まで読んでくださり、ありがとうございます！これからも技術や資格の情報発信しますので、よかったらフォローお願いします！
コンソールアプリにGenericHostを入れて便利に最新機能を使う（コード例を紹介）

# 概要

私の記事でも何度か触れていますが、GenericHost（WebHost）はとても便利な共通インフラなので、慣れると常に使っていきたくなります。しかし、さすがにコンソールアプリでは使えない・・・と思うかもしれませんが、使えます。コンソールアプリへのGenericHostの組み込み方を紹介します。

# 最初に結論まとめ

次のGitリポジトリのようにすることで組み込みができます。

https://github.com/suusanex/sample_console_generic_host   

# 説明

さっそく、組み込み方を説明していきます。

テンプレートから生成したコンソールアプリプロジェクトに、まずはGenericHostを追加します。NuGetで次のように追加です。

```xml
<ItemGroup>
	<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
</ItemGroup>
```

最近のコンソールアプリのテンプレートならトップレベルのステートメントになっているので、Program.csの中身はHello Worldのコンソール出力だけだと思います。

そこを書き換えて、次のようにすることでホストを作成します。

```csharp
_ = Host.CreateDefaultBuilder(args)
    .RunConsoleAsync();

```

これだけだと何の処理も入れられないので、続けてメインのサービスとなるクラスを追加します。

サービスはIHostedServiceを継承すれば良いので、最小限だとこんな感じで、開始と停止のイベントハンドラだけになります。

```csharp
    public class ApplicationHostService : IHostedService
    {
        public async Task StartAsync(CancellationToken cancellationToken)
        {
        }

        public async Task StopAsync(CancellationToken cancellationToken)
        {
        }
    }
```

ここへさらに、アプリケーションのライフタイムの管理をしてイベントを呼び出す、IHostApplicationLifetimeを追加し、ApplicationStartedイベントを追加します。これは次で触れるように、「メソッドが制御を返すまではコンソールアプリが動作し、制御を返すと終了する」というMainメソッドのような動作をするメソッドOnStartedを作るためです。用途によってSTAThread属性を付ける事も可能になります。

```csharp
    public class ConsoleHostedService(IHostApplicationLifetime _AppLifetime) : IHostedService
    {
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            _AppLifetime.ApplicationStarted.Register(OnStarted);
            await Task.CompletedTask;
        }
```

このOnStartedメソッドを、次のように定義して、メソッドが終わる時にライフタイムの終了処理を呼び出します。こうすることで、このOnStartedメソッドをコンソールアプリの普通のMainメソッドと同じように使えます。ここではSTAThread属性も付けています。

```csharp

[STAThread]
private void OnStarted()
{
	//～メインの処理～

	_AppLifetime.StopApplication();
}
```

これでメインのサービスとなるクラスが完成したので、Program.csの方に戻ってDIコンテナへサービスとして登録します。

```csharp
_ = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        services.AddHostedService<ConsoleHostedService>();
    })
    .RunConsoleAsync();
```

これで完成です。実行すると、OnStartedの「//～メインの処理～」部分の処理をして、終了する。というコンソールアプリとして動作すると思います。

普通のコンソールアプリと同じ動きですが、Extensionsの追加もできますし、すでにProgram.csの処理以外はDIコンテナ経由で生成されている状態なので、 `ILogger<T>` を受け取ったり、任意のクラスインスタンスをDIコンテナに追加して受け取ったりができる状態となっています。

全体を見たい人は、次のgitリポジトリを見ると分かりやすいと思います。

https://github.com/suusanex/sample_console_generic_host   

# まとめ

コンソールアプリへGenericHostを手動で組み込みました。イメージしていたよりも少ないコード変更で簡単に組み込めたのではないでしょうか。

既存のプロジェクトへも同じように組み込めるはずなので、どんどんGenericHost前提の新しいインフラ的機能を導入して、開発効率を上げていきましょう！

（[WPFの記事](https://qiita.com/spc_ksudoh/items/622e7c58beedb310b64f)と全く同じことを言ってますが、実際そう思ってます）
Amazon CognitoのOIDC機能を活用してLINEログインを統合する方法

# OIDCを使用してAmazon CognitoでLINEログインを実現する手順
この記事では、LINEログインをAmazon CognitoのOIDC機能を活用して設定し、LINEのユーザーをCognitoに登録する方法について解説します。

# 前提条件
以下の準備が完了していることを前提とします

- Amazon Cognitoユーザープールの作成済み
- LINEログインチャネルの作成済み（LINE Developersから作成）


# 1. LINEログインチャネルの設定
### チャネルの基本設定でOpenID Connectの申請
LINE Developersで作成したチャネルに移動します。
基本設定タブを開き、OpenID Connectの項目で申請を行います。
→ 審査が完了し、申請が承認された状態にしてください。

### LINEログイン設定でコールバックURLを設定
チャネル設定の「LINEログイン」タブを開きます。
コールバックURLを設定します。
コールバックURLの形式は以下のようにします
```bash
https://<your-cognito-domain>/oauth2/idpresponse
```

your-cognito-domainはCognitoのドメイン名です。

# 2. LIFFアプリの作成
### LIFFアプリを作成
LINE DevelopersのチャネルページでLIFFアプリを作成します。
スコープに以下の値を設定します：
openid
email
profile
# 3. Amazon CognitoでOIDCプロバイダーを設定
### OIDCプロバイダーを作成
Amazon Cognitoの管理画面で、対象のユーザープールを開きます。
「ソーシャルプロバイダーと外部プロバイダー」タブでアイデンティティプロバイダーを追加を押下します。
以下の情報を設定します：
クライアントID：LINEログインチャネルの「チャネルID」
クライアントシークレット：LINEログインチャネルの「チャネルシークレット」
発行者URL
```
https://access.line.me
```
スコープ
```
openid profile email
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/5f651848-197f-fc55-6cce-c732c0fb5b7d.png)



### コールバックURLを許可する
Cognitoの「アプリケーションクライアント」→ログインページを開きます。
許可されているコールバックURLを以下に変更します。
```
https://<your-cognito-domain>/oauth2/idpresponse
```
### IDプロバイダーの追加
アプリケーションクライアントの設定で、作成したOIDCプロバイダーを選択して紐付けます。
# 4. Cognitoマネージドログインからログインページを確認
### ログインページにアクセス
Cognitoの「アプリケーションクライアント」のログインページを表示からマネージドログインのページに遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/a1c41267-95dc-c6e5-067e-ae9b166b846c.png)

### LINEログインの動作確認
LINEログインボタンを押下し、Lineログインを行うと、
ログイン後、CognitoユーザープールにLINE UIDが登録されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/ecab9248-629d-d2f2-d12e-5854b2a8be7f.png)



### おわりに
本記事では、OIDCを活用してLINEログインをCognitoで実現する方法を解説しました。この設定により、LINEの認証機能を簡単に組み込むことができます。

また、OIDCを活用することでGoogle認証も同様に導入可能です。さらに、Cognitoの 「カスタム属性」 にLINEのUIDを保存することで、既存のユーザーデータと紐付けることもできます。
Telegram の暗号通貨分野向けの現在の無料ミニアプリケーション

Telegram は、暗号通貨愛好家や専門家が分析、取引、セキュリティのためのさまざまなツールを見つけることができるプラットフォームになっています。暗号通貨を扱うのに役立つ、最も便利な無料のミニアプリケーションを集めました。

1.AMLボット

理由: 暗号通貨取引のリスクと「純度」をチェックするため。
特徴:
ウォレットとトランザクションを分析して、詐欺、ダークネット活動、または制裁リストとの関連を確認します。
イーサリアム、TON、TRONなどのブロックチェーンとの統合。
使い方は簡単: ウォレットアドレスまたはトランザクションハッシュを送信するだけです。
リンク: Telegram https://t.me/AMLBotOfficialBot/app

2.CoinGeckoボット

理由: 価格、時価総額、チャートを追跡します。
特徴:
10,000 以上の暗号資産に関する現在のデータ。
急な価格変更のお知らせ。
証券取引所への新規上場に関する情報。
リンク: https://t.me/coingeckobot
3. DeFiウォレットトラッカー

目的: 分散型ウォレットの監視。
特徴:
リアルタイムの残高追跡。
送受信トランザクションに関する通知。
Ethereum、BSC、Polygon、その他のネットワークのサポート。
リンク: https://t.me/defiwalletalert_bot
今月読んだ本のアウトプット

今月読んだ本の中で、印象に残った本のアウトプットをしておこうと思います。
今月は冬季休暇もあったので、結構読みたい本が読めました。備忘のため記載します。

### 2025年1月中に読んだ本
①三行で撃つ　[近藤康太郎]
②超・箇条書き　[杉野幹人]
③まめこの日常　[まめきちまめこ]　※再読
④超コミュ力　[田村敦]
⑤頭のいい人が話す前に考えていること　[安達裕哉]　※再読
⑥みんなのフィードバック大全　[三村真宗]
⑦勝ち残りSEへの分岐点　[三好康之]
⑧エンジニアが学ぶ会計システムの「知識」と「技術」　[広川 敬祐]

### 読書の感想
今月読んだ本はいずれも学びが多く、楽しく読めました。
その中でも印象に残った3冊を記載します。

###### 三行で撃つ　[近藤康太郎]
昨年12月（忘年会シーズン）に、私の改善した方が良い点を、
社内外問わずヒアリングしていました。
その中で、最も多かった意見が「ドキュメント作成力」でした。

ですので、「ドキュメント作成力」向上のための、
おすすめ書籍をググって発見したのが、本書でした。

テクニックを学ぶために本書を購入したつもりが、
「文章」とは「書く」とはを起点に、表現について考えさせられる、哲学書のような感覚を受けました。
※本当は「生き方」を考えさせられるような本、と書きたかったです。が、この本の感想では避けるべきと判断しております。

下記が印象に残った、学んだことです。
既に忘れてしまっていることがあるので、どこかで再読の必要がありそうです。

＜学んだこと＞
・1文でまとめられることは1文にまとめる
・いい文章を書くには、五感を研ぎ澄ます。五感で存分に感じたことが、オリジナルの文章へと繋がる
・安易に「○○方」「○○的」という表現に逃げない
・情報処理コストを読み手ではなく、書き手が負担する

#### みんなのフィードバック大全　[三村真宗]
会社の上司がおすすめしている動画の中で、
おすすめされていた本でした。

良い組織づくりに関心をもっており、気になって読みました。

本書は、大きくは「ポジティブフィードバック」「ギャップフィードバック」「コーチャビリティ」の3つにカテゴライズされています。

各カテゴリで、下記のようなことを学びました。
組織やコミュニティの所属する中で、まずは自らがフィードバックを求める人でありたいと思いました。

＜学んだこと＞
・ポジティブフィードバックは、スピード感をもって行った方がよい
・ポジティブフィードバックは、まめに行うとよい
・ギャップフィードバックは、1対1の対面で行うのがよい
・ギャップフィードバックは、1回につき1つまでとする
・フィードバックを受ける側の、器も重要（コーチャビリティ）

#### 勝ち残りSEへの分岐点　[三好康之]
お客様におすすめいただいた本で、読みました。

エンジニアに転身して、5年超。
多少なりとも、資格勉強にチャレンジしていたため、
努力の方向性が間違ってなさそうだと、安心できた1冊でした。

また、本書の中ではプロジェクトマネージャーやITコンサルタントの方向に進むことを推奨している節がありました。
私もプロジェクトマネージャーのキャリア志向があるため、勉強になる本でした。

下記、学んだことです。

＜学んだこと＞
・1週間で5時間。月に20時間の勉強が必要
・良いSEには基礎力が必須。基礎力を20時間の勉強で養う
・資格勉強は、業務の先回りのために行う
・SEに必要なスキルは、テクニカルスキル/プロセスマネジメントスキル/ビジネスマネジメントスキル/ヒューマンスキルの4つ

### 今後の目標
インプット（読書や動画視聴等）に対してのアウトプットが足りていないと感じているので、
今後も備忘のために、アウトプットの場は定期的に設けたいと思います。記事ではない方法でも
S3エンドポイント経由でEC2のdnfを実行しようとしたらポリシーで引っかかった話

# はじめに
EC2(Amazon Linux2023)でdnf updateを実行したところ403エラーになってしまい、その原因を見つけるのに苦労したため、同じように悩んでいる人の助けになればいいなと思い、自身の備忘録も兼ねて本記事を執筆してます。

# エラー時の構成と設定
## 構成
今回の構成は、以下の前提条件をもとに構成していました。
1. インターネットを介した通信はしない
2. 出来る限り最小限のポリシーを設定する

構成は以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981404/ae193b72-7bbc-f369-eedf-4319d09d0f1c.png)

まず、条件1を満たしつつ、EC2インスタンスからdnfを実行するため、AWSが管理しているAmazon Linux2023のリポジトリ用S3バケット``al2023-repos-us-east-1-de612dc2``へGateway型のS3エンドポイント経由でアクセスするという構成を取りました。

参照したドキュメント↓↓

https://repost.aws/ja/knowledge-center/ec2-al1-al2-update-yum-without-internet

更に条件2つ目を満たすために、S3のエンドポイントのポリシーで以下のように権限を絞りました。

- 許可するプリンシパルをEC2に付与しているIAMロールのみに設定（"Condition"で設定）


```JSON
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Enable Access Amazon Linux repository",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::al2023-repos-us-east-1-de612dc2/*",
			"Condition": {
				"ArnEquals": {
					"aws:PrincipalArn": "arn:aws:iam::xxxxxxxxxxxx:role/ec2-role"
				}
			}
		}
	]
}

```

参照したドキュメント↓↓

https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-s3.html#edit-vpc-endpoint-policy-s3%EF%BC%88%E4%BE%8B

>特定のIAMロールへのアクセスを制限するポリシーを作成できます。aws:PrincipalArn を使用してプリンシパルへのアクセスを許可する必要があります。

EC2に付与しているIAMロールにも、Amazon Linux2023のリポジトリ用S3バケットへの"s3:GetObject"権限を付与しています。（実際のポリシーは省略します。）

## エラー
一見この構成で問題ないように見えるのですが、dnf updateをしてみると403エラーとなってしまいました。
よくエラーの原因となりうる以下の点は確認し、問題ありませんでした。

- Gateway型S3エンドポイントのルートテーブル設定
- EC2のIAMロールに付与しているポリシー
- EC2のセキュリティグループのアウトバウンドルール


# 原因
記事のタイトルにもあるように、原因はS3エンドポイントに設定したポリシーにありました。
"Condition"の"PrincipalArn"でEC2のIAMロールを指定していることが直接的な原因でした。

```JSON
			"Condition": {
				"ArnEquals": {
					"aws:PrincipalArn": "arn:aws:iam::xxxxxxxxxxxx:role/ec2-role"
				}
			}
		}
	]
}

```

前述していますが、以下のドキュメントに特定のIAMロールへのアクセスを制限するポリシーを作成できると記載があります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-s3.html#edit-vpc-endpoint-policy-s3%EF%BC%88%E4%BE%8B

>特定のIAMロールへのアクセスを制限するポリシーを作成できます。aws:PrincipalArn を使用してプリンシパルへのアクセスを許可する必要があります。


それなのに、なぜdnf実行時にエラーが出てしまうかというと、
dnfコマンドは**HTTPS通信で**S3のリポジトリからパッケージ等をダウンロードしているからです。
特定のIAMロールでアクセスの制御ができるのはAPI通信の場合のみであり、HTTPS通信ではIAMロールによるアクセス制限はできない、というのがエラーの原因でした。
よく考えてみれば確かにそうだと理解できるのですが、盲点でした…


実際にCondition部分を削除してdnf updateを実行したところ、無事に成功しました。

# 対策
特定のEC2のからのアクセスに絞りたい場合の代替策としては、EC2インスタンスのIPアドレスを"Condition"の"VpcSourceIp"で許可する設定を入れるという方法が可能かと思います。
ただし、特定のEC2インスタンスを明示的に許可拒否するものではないというところには注意が必要です。
```JSON
"Condition": {
    "IpAddress": {
    	"Aws:VpcSourceIp": "(許可するEC2インスタンスのIPアドレス)/32"
		}
	}
}
```

https://repost.aws/ja/knowledge-center/block-s3-traffic-vpc-ip

https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-s3.html#vpc-endpoints-s3-bucket-policies

>aws:VpcSourceIp 条件キーを使用して、特定の IP アドレス範囲へのアクセスを制限するポリシーを作成できます。

# まとめ
最小権限のポリシー付与という条件があったため、できるだけ特定のIAMロールにのみアクセスを制限しようとした結果、今回のような盲点に気づくことができました。

Amazon Linuxのリポジトリ用のS3バケットはAWS管理のオープンなバケットであり、許可アクションもGetObjectのみに設定（おそらくPutやDeleteはバケット側で制限されているだろう）しているので、特定のIAMロールでアクセス制御ができなくても大きな問題が起きる可能性は低いかと思いますが、頭の片隅に置いておきたいと思います。
【UiPath最新情報】StudioXとStudio統合の影響とは？ 〜2024年12月アップデートまとめ〜

# 【UiPath最新情報】StudioXとStudio統合の影響とは？ 〜2024年12月アップデートまとめ〜

## 🎉 2024年12月、UiPathの大規模アップデート！

2024年12月、UiPathは **StudioXとStudioの統合** を含む **最新のコミュニティリリース** を発表しました！  
これにより、RPA開発者だけでなく、**業務ユーザー（Citizen Developer）** にとっても大きな変化が生じています。  

本記事では、**UiPath StudioXとStudio統合の影響** を中心に、2024年12月のアップデートを詳しく解説します。  

📌 **公式アナウンスはこちら**  
➡ [UiPath Forum: 2024年12月Communityリリース](https://forum.uipath.com/t/uipath-2024-december-community-release/785415?utm_source=qiita)  

---

## 🏆 1. StudioXとStudio統合の影響  

### ✅ **StudioXワークフローがStudioで直接作成可能に！**  
これまで**StudioXとStudioは別のプロファイル**として扱われていましたが、今回の統合により、**StudioのテンプレートからStudioXのワークフロー（Task）を作成できる** ようになりました。  

💡 **ポイント:**  
- **プロファイルの切り替え不要！** StudioでStudioXワークフローを直接作成可能  
- **プロジェクトノートブックなど、StudioXの機能もそのまま利用可能！**  
- **業務ユーザーとRPA開発者のシームレスな連携が可能に！**  

📌 **公式アナウンス:** [UiPath Forum](https://forum.uipath.com/t/uipath-2024-december-community-release/785415?utm_source=qiita)  

---

### ❌ **しかし…StudioXのUIはほぼ消滅！**
今回の統合により、StudioXユーザーが抱える **デメリット** もいくつか浮上しています。

💡 **デメリット:**  
- **StudioXのUIがほとんどなくなり、実質的にStudioに統一**  
- **StudioXのシンプルな操作性に慣れていた業務ユーザーにとっては学習コスト増加**  
- **StudioXの専用ビューがなくなり、Studioのフル機能に適応する必要がある**  

つまり、**「StudioX = Studioの簡易版」という認識がなくなり、Studioに慣れるしかない** ということになります。  
今までStudioXを使っていたユーザーには、やや戸惑う変更かもしれません。

---

## 🚀 2. Studioのセットアップが軽量化  

**Studioのインストールがよりコンパクトに！**  
従来はすべてのアクティビティが含まれていましたが、**今後はシステムアクティビティのみがバンドル** され、  
追加のパッケージは必要に応じて **公式フィードからインストール** する形に変更されました。  

📌 **メリット:**  
✅ **インストールサイズが軽量化** → **PCの負担軽減 & インストールが高速化！**  
✅ **必要なパッケージだけを追加インストール可能** → **環境に合わせたカスタマイズが容易！**  

💡 **これにより、環境ごとに最適なパッケージ構成を選択できるようになりました。**  

📌 **公式アナウンス:** [UiPath Forum](https://forum.uipath.com/t/uipath-2024-december-community-release/785415?utm_source=qiita)  

---

## 🔐 3. UiPath Studioのサインイン体験が向上  

今回のアップデートで、**Studioのサインインプロセスが簡素化** されました。  
これにより、以下の点が改善されています。  

### ✅ **変更点:**  
- Studio起動時の **接続がよりシンプルに！**  
- クライアント資格情報やマシンキーを使用する場合、**Assistantやコマンドラインでの接続が可能に！**  

💡 **より直感的な接続が可能になり、作業のストレスが減少しました！**  

📌 **公式アナウンス:** [UiPath Forum](https://forum.uipath.com/t/uipath-2024-december-community-release/785415?utm_source=qiita)  

---

## 🏁 まとめ  

**2024年12月のUiPathアップデートのポイント:**  

✅ **StudioXがStudioに統合** → **プロファイルの切り替え不要！**  
✅ **Studioのセットアップが軽量化** → **必要なパッケージのみインストール可能！**  
✅ **サインインプロセスがシンプルに！** → **より直感的にStudioを利用できる！**  
✅ **StudioXユーザーはStudioのUIに慣れる必要がある** → **従来のシンプルさは失われた！**  

💡 **今回の統合により、UiPathはさらに柔軟で使いやすい開発環境に進化しました！**  

---

## 📢 コメント募集中！  

- **今回のアップデート、どう思いましたか？**  
- **StudioXを使っていた方は、Studioへの移行で不便な点はありましたか？**  
- **この変更でどんな影響が出そうですか？**  

ぜひ **Qiitaのコメント** で意見を共有してください！📢✨  

🚀 **UiPathの最新情報をキャッチアップして、効率的なRPA開発を目指しましょう！** 🚀  

📌 **公式アナウンス:** [UiPath Forum](https://forum.uipath.com/t/uipath-2024-december-community-release/785415?utm_source=qiita)  

---
プロジェクトマネージャー vs プロダクトマネージャー 〜あなたに合うのはどっち？〜

## はじめに

IT業界やビジネスの現場では、「プロジェクトマネージャー（PM）」と「プロダクトマネージャー（PdM）」という役職がよく登場します。しかし、この二つの役割の違いを明確に理解している人は意外と少ないかもしれません。本記事では、それぞれの役割や責務、必要なスキル、キャリアパスについて解説し、違いを分かりやすく説明します。

## プロジェクトマネージャー（PM）とは？

### **役割と責務**
プロジェクトマネージャー（PM）は、特定のプロジェクトを計画し、実行し、完了させる責任を持つ役職です。主な役割は以下の通りです。

- **プロジェクトの計画・管理**：スケジュール、予算、リソースを管理する。
- **チームの統率**：エンジニアやデザイナー、関係者と協力しながら進捗を管理する。
- **リスク管理**：プロジェクトの遅延や予算超過を防ぐために問題を特定し、対策を講じる。
- **ステークホルダーとの調整**：クライアントや社内の関係者と適切にコミュニケーションを取りながら進行する。

### **必要なスキル**
PMには、以下のスキルが求められます。

- **プロジェクト管理スキル**（WBS、ガントチャート、アジャイル開発など）
- **コミュニケーション能力**
- **リスク管理能力**
- **問題解決能力**
- **リーダーシップ**

## プロダクトマネージャー（PdM）とは？

### **役割と責務**
プロダクトマネージャー（PdM）は、プロダクト（製品やサービス）の開発から市場投入、成長戦略までを担う役職です。主な役割は以下の通りです。

- **プロダクト戦略の策定**：市場調査を行い、ユーザーニーズを分析し、製品の方向性を決める。
- **開発チームとの連携**：エンジニアやデザイナーと協力し、要件定義や仕様策定を行う。
- **ビジネス目標の達成**：売上や利用率などのKPIを設定し、成長戦略を策定する。
- **ユーザーとの対話**：顧客のフィードバックを収集し、プロダクトの改善につなげる。

### **必要なスキル**
PdMには、以下のスキルが求められます。

- **市場分析・ユーザー理解**
- **プロダクト戦略立案**
- **データ分析**
- **UX/UIに関する知識**
- **チームマネジメント**

## **PMとPdMの主な違い**

| 項目 | プロジェクトマネージャー（PM） | プロダクトマネージャー（PdM） |
|------|---------------------------------|---------------------------------|
| **目的** | プロジェクトの成功（納期・予算・品質の達成） | プロダクトの成功（市場での成長やユーザー満足度） |
| **期間** | 限定されたプロジェクト期間 | 長期的なプロダクトのライフサイクル |
| **主な対象** | 社内のチーム、クライアント | ユーザー、市場、ビジネス目標 |
| **成功指標** | スケジュール遵守、予算管理 | ユーザー数増加、売上向上、継続率改善 |

## **どちらのキャリアを選ぶべきか？**

どちらの職種が適しているかは、個人の志向やスキルによります。

- **PMに向いている人**：計画を立て、スケジュールやリソースを管理することが得意な人。
- **PdMに向いている人**：市場やユーザーのニーズを理解し、新しい価値を生み出すことに興味がある人。

## **まとめ**

プロジェクトマネージャー（PM）とプロダクトマネージャー（PdM）は、似ているようで異なる役割を持つ職種です。PMはプロジェクトの円滑な進行を管理し、PdMはプロダクトの成長と市場での成功を目指します。自身のスキルや興味に合わせて、どちらのキャリアを目指すか検討してみましょう。