OmniAICreator/Qiita-1.07M huggingface dataset:
ROCK5BにUbuntu GUIをインストール

# 使用目的
　ローカルでWeb GUIを備えたDBサーバー、いわゆるWebアプリケーション構築目的。常時起動させるので耐久性と性能を考慮してrock5bを選択した。RSの日本公式サイトから購入。
 
　ssdからubuntuを起動させるのに苦戦したので備忘録としてメモ。HDMI入力を備えたrock5b+ってのが新しく出てるっぽい。

https://jp.rs-online.com/web/

https://radxa.com/products/rock5/5b


# 組み立て
　適当なファンとヒートシンクを購入。ここが一番大変かも。

　ヒートシンクは2.3cm角くらいまでは干渉なく貼り付けできそう。`20mm * 21mm * 15mm`の熱伝導両面テープ付きを購入。ファンは`40mm * 40mm * 10mm`を購入。40mm幅なら取り付け穴2コをそのまま利用できる。ただし取り付けには工夫が必要。
　ボルトネジ（2.5M）40mm、ナイロンワッシャー（2.5M）、ナット（2.5M）をアマゾンで検索して購入。100コ入りとかなのでほぼ余る。

　ボルトのグラつきを抑えるために、基盤をナイロンワッシャーで挟んでボルトの根本をナットで固定している。ワッシャーは絶縁目的も兼ねている。

![bolt_nat1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/3b131b13-934f-882d-754f-ad7ebbf6a658.jpeg)


　電源はUSB-Cのラズパイ5用のものを購入。電源は相性などもあるらしく、5A出力が必要らしい。
　無線のモジュールはインテル製の`AX210NGW`を購入。接続するだけでドライバインストールなどしなくても動作した。
　ssdはキオクシアの`EXCERIA G2 SSD-CK500N3G2/N`。片面実装のもので部品干渉をできるだけ避けた方が良いと思うけど、アマゾンの購入ページだけでは確認できない。

![ssd_install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/fd933989-0948-8479-85e7-8a28b5e524ba.jpeg)

![heatsink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/941f58ab-d058-42af-4ba6-19f858cdd454.jpeg)

　本体含め全て揃えて5万円程度。これでアプリケーションサーバーが構築できるなんてとんでもない時代になったもんだ...（遠

　ケースどうするか悩みどころ。7インチくらいのディスプレイを付けて運用するので何かを加工して自作する予定。


# m.2 SSDから起動できるようにする
　RKdevToolでROMを焼き直す。

以下のサイトの`Advanced (external) method`の項目を実行した。Windows11から行ったので、`Option 2: Flash with Windows PC`のところ。`Additional: erase the SPI NOR flash`は消去する方法なので実行しない。

https://wiki.radxa.com/Rock5/install/spi


# OSをダウンロード

　他サイト等で紹介されているリンクでダウンロードしたubuntuイメージでは起動しなかった。起動時に`Failed to start Light Display Manager`のエラーとなり起動しない。
　どうやって探し当てたか忘れたが、以下のサイトのデスクトップイメージをインストールしたところ無事起動できた。

https://joshua-riek.github.io/ubuntu-rockchip-download/boards/rock-5b.html

　ダウンロード後解凍してimgファイルを生成、balenaEtcherでssdへOSを焼いて接続。

　使用したUSB-CのSSDケースはアマゾンで3,000円くらい。

 ![ssd_usbc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/d2734c4e-0d96-3161-9402-2a38f58d883c.jpeg)


# 初期設定

　マウス、キーボード、ディスプレイを接続して電源を入れる。
　無事起動すればユーザーの初期設定などの画面となる。

　ネットワークを設定してネットに接続する。
　Rootを有効化して昇格。

```
sudo passwd root
su -
```

　vi をまともに使えるようにする。

```:root、ユーザーで実行
echo "set nocompatible" >> ~/.vimrc
```

　不要アプリケーション削除。

```:rootで実行
apt autoremove libreoffice*
apt autoremove rhythmbox
apt autoremove remmina
apt autoremove transmission*
```

　アップデート。少し時間がかかる。

```:rootで実行
apt update
apt upgrade
```

　sshdを有効化。今回はインターネットへ公開せずLANで使うので設定は特に変えずにそのまま使用。

```:rootで実行
systemctl enable ssh
systemctl start ssh
```


　利用予定のものをインストール。

```:rootで実行
apt install apache2 mb-string
apt install samba
apt install postgresql

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
apt install nodejs
```

　Rock5Bを再起動。起動が確認出来たらマウスやキーボードなしで起動しても問題なく起動できる。これでSSHで接続できる。

```:あとはお好きに
mkdir MyApp

cd MyApp

npm init
npm install express --save
```
[検証] rails runner はやはり遅かった

# 概要

バッチ処理の実行環境について、チーム内で議論しました。

その際、「**`rails runner` は`Rails`実行環境を毎回読み込むので遅い**」とのコメントがありましたので、実際に検証することにしました。

## スクリプトの準備

まず、共通で使用するスクリプトを作成します。
- 1から1,000,000までの整数の合計を計算し、処理にかかった時間を取得
- 上記を複数回実行して平均時間を計測する

`benchmark_task.rb` 
```ruby
def perform_task
  sum = 0
  (1..1_000_000).each { |i| sum += i }
  sum
end

if __FILE__ == $0
  iterations = 10
  total_time = 0.0

  iterations.times do
    start_time = Time.now
    sum = perform_task
    end_time = Time.now
    elapsed_time = end_time - start_time
    total_time += elapsed_time
    puts "Iteration: #{sum}, Time: #{elapsed_time} seconds"
  end

  average_time = total_time / iterations
  puts "Average Elapsed Time: #{average_time} seconds"
end
```

## ruby コマンドでの実行

Ruby環境でスクリプトを実行します。

```bash
ruby benchmark_task.rb
```

### 実行結果

```ruby
Iteration: 500000500000, Time: 0.082677 seconds
Iteration: 500000500000, Time: 0.074426 seconds
Iteration: 500000500000, Time: 0.0732 seconds
Iteration: 500000500000, Time: 0.077007 seconds
Iteration: 500000500000, Time: 0.082132 seconds
Iteration: 500000500000, Time: 0.076183 seconds
Iteration: 500000500000, Time: 0.071092 seconds
Iteration: 500000500000, Time: 0.072957 seconds
Iteration: 500000500000, Time: 0.077457 seconds
Iteration: 500000500000, Time: 0.076813 seconds
Average Elapsed Time: 0.0763944 seconds
```

`rails runner` で`0.0763944 seconds` よりも遅くなるか検証します。

## Rails Runner での実行

`rails runner`で同じスクリプトを実行します。

```bash
rails runner benchmark_task.rb
```

### 実行結果

```ruby
Iteration: 500000500000, Time: 0.124216 seconds
Iteration: 500000500000, Time: 0.110869 seconds
Iteration: 500000500000, Time: 0.109642 seconds
Iteration: 500000500000, Time: 0.132782 seconds
Iteration: 500000500000, Time: 0.118581 seconds
Iteration: 500000500000, Time: 0.16234 seconds
Iteration: 500000500000, Time: 0.113434 seconds
Iteration: 500000500000, Time: 0.10714 seconds
Iteration: 500000500000, Time: 0.106049 seconds
Iteration: 500000500000, Time: 0.091899 seconds
Average Elapsed Time: 0.1176952 seconds
```

確かに少し遅いですね...

## まとめ

Railsの環境初期化によるオーバーヘッドで
`ruby` コマンドと比較すると、少し遅くなっていますね。

Rails環境を読み込む必要がない場合はRails runnerの利用は避けるべきですね。
上記理由で`cron`内で複数の`rails runner`を使用していましたが、テコ入れしました。
データベースシステム設計

## はじめに

こんにちは！今日は、データベースシステムを設計する際に検討すべきポイントをまとめます。システム開発の過程では、どの機能がどのテーブルをいつ使うかを整理する**CRUD分析**や、複雑な条件分岐を明確化する**決定表**の作成などを行います。また、コード体系の設計、データ移行計画、セキュリティ設計も重要なテーマです。これらをしっかり押さえることで、スムーズな開発・運用が可能になります。

## 本文

### CRUD分析

**CRUD分析**は、システムの各機能がテーブルに対してどのような操作（Create, Read, Update, Delete）を行うかを一覧表で整理する手法です。これにより、データのライフサイクルに矛盾がないか、想定通りの利用ができているかを確認します。


| 機能               | 顧客テーブル | 受注テーブル | 商品テーブル |
|-------------------|----------|---------|---------|
| 顧客登録機能        | C        | -       | -       |
| 顧客情報参照機能     | R        | -       | -       |
| 顧客情報更新機能     | U        | -       | -       |
| 受注登録機能        | R        | C       | R       |
| 受注参照機能        | R        | R       | R       |
| 顧客削除機能        | D        | -       | -       |

ここで、"C"は作成(Create)、「R」は参照(Read)、「U」は更新(Update)、「D」は削除(Delete)を意味します。たとえば、受注登録機能では、受注テーブルは作成（C）し、顧客や商品テーブルは参照（R）のみしています。  
CRUD分析によって、まだ存在しないデータを参照していないか、不必要な更新・削除がないかなど、データ操作の整合性を検証できます。

### 決定表（Decision Table）

**決定表**は、複数の条件が組み合わさって複雑な処理分岐が発生する場合、その条件と結果を整理する表です。条件ごとにYes/Noを並べ、対応する処理を明示することで、要件の抜け漏れを防ぎ、実装の手がかりを得られます。


| 条件                      | C1:会員か | C2:購入金額≥5000円 | C3:クーポン利用 |
|--------------------------|---------|--------------|-----------|
| 処理番号                   |    1    |       2      |     3     |
| 条件組み合わせ             | Y/N     | Y/N          | Y/N        |
| 処理結果                   | 割引率適用 |
|--------------------------|---------|--------------|-----------|
| ルール1: 会員, 5000円以上, クーポン使用 | Y       | Y            | Y         | 割引率10% |
| ルール2: 会員, 5000円以上, クーポン無し | Y       | Y            | N         | 割引率5%  |
| ルール3: 会員, 5000円未満, クーポン使用 | Y       | N            | Y         | 割引率3%  |
| ルール4: 非会員            | N       | -            | -         | 割引無し   |

このように決定表を用いると、条件と処理を体系的に整理でき、実装段階での誤りが減ります。

### コード設計

データベースで扱うコード（IDや分類コード）を計画的に設計することで、長期的な運用やデータ統合が容易になります。主なコード体系は以下の通りです。

1. **順番コード（シーケンスコード）**：連番を振ることで一意性を確保します
2. **けた別コード**：先頭から順に大分類、中分類、小分類などの階層構造を表します
3. **区分コード**：特定の範囲内でコードを割り当て、グルーピングしやすくします

【サンプルコード設計例】

| 商品コード | 構成 | 内容                   |
|----------|------|----------------------|
| A001     | けた別 | A:果物, 001:りんご     |
| B010     | けた別 | B:野菜, 010:キャベツ   |
| 1001     | 順番  | 通し番号:1001           |

将来、商品数が増えた場合にも、十分なけた数を確保し、コードが枯渇しないようにします。また、データ統合時にはコードが重複しないように事前調整が必要です。

### データ移行

新しいシステムへ移行する際には、既存データを新しいデータベースへ移行します。移行時には、以下の点を事前に調査します。

- データの保存方法（DBMS種類、ファイル形式など）
- データ更新の有無とタイミング
- データ量（数百万件規模かなど）
- データ形式（整数、文字列、日付、文字コードなど）

これらを踏まえ、移行スケジュールや変換手順を策定し、テストを行います。想定外のトラブルに備えて、実際のデータを一部抽出して試験的に移行してみるなど、リハーサルを行うことが効果的です。

### セキュリティ設計

データベースシステムでは、情報セキュリティも重要な観点です。認証・権限管理、暗号化、監査ログなど、DBMSが提供する機能や外部ツールを活用し、システム要件定義の段階からセキュリティリスクに対応します。

セキュリティ設計には、機密性・完全性・可用性を確保する考え方が必要で、  
- パスワードポリシーや多要素認証の導入
- テーブルごとのアクセス権限設定
- 暗号化ストレージやTLS接続
- 不正アクセスに備えた監査ログの解析

といった取り組みを総合的に検討します。システム開発初期からセキュリティを考慮する「セキュリティバイデザイン」の思想が求められます。

## まとめ

今回は、データベースシステム設計で考慮すべき様々な要素を紹介しました。  
- CRUD分析でデータ操作と機能を対応付け、データライフサイクルを明確化  
- 決定表で複雑な条件判定を整理  
- コード設計で長期運用やデータ統合に備える  
- データ移行計画でスムーズなシステム移行を実現  
- セキュリティ設計で安全なデータ利用を確保

これらのプロセスを経ることで、信頼性・拡張性・保守性・セキュリティを兼ね備えたデータベースシステムを構築できます。
【React Hook Form】React Hook FormのWatchについて

# はじめに
業務でReact Hook Formの`watch`の使い方に苦労したため、記事にまとめてみました。watchを活用すると、フォームの入力値をリアルタイムに取得し、動的なUIの実現が簡単になります。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# Watchとは

>このメソッドは指定された入力を監視し、その値を返します。入力値をレンダリングしたり、条件によって何をレンダリングするかを決定するのに役立ちます。

https://react-hook-form.com/docs/useform/watch

`watch`は、フォームフィールドの値をリアルタイムで監視し、取得できるReact Hook Formのメソッドです。

以下は`watch`の基本的な使用例です。
```app.ts
import React from "react";
import { useForm } from "react-hook-form";
 
function App() {
  const { register, handleSubmit, watch } = useForm();
  const watchedValue = watch("example");
 
  const onSubmit = data => console.log(data);
 
  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("name", { required: "名前を入力してください" })} placeholder="名前" />
      <p>ここに名前が表示されます: {watchedValue}</p>
      ![画面収録 2024-12-16 20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/79bfe718-82d9-7693-9652-8d5aa73f196d.gif)
<input type="submit" />
    </form>
  );
}
 
export default WatchExample;
```

![画面収録 2024-12-16 20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/707a9171-d24b-d808-9d6f-5b522d770423.gif)

上記のコード例では、`name`フィールドに入力された内容がリアルタイムで反映されます。

## 用途
`watch`の主な用途として以下が挙げられます

+ ***リアルタイムUIの更新***
ユーザーの入力内容に応じて動的にUIを変更する際に利用できます。例えば、入力に応じてバリデーションエラーを即時表示したり、プレビューを更新する場面で役立ちます。

+ ***複数フォームの入力値を監視***
一つの画面で複数のフォームがある場合や、複数フィールドの入力値を利用して計算を行う場合など、フォーム全体を監視する必要がある場面で有効です。

業務では、ユーザーの入力内容に基づいてリアルタイムでフィードバックを表示する用途で使用しました。

## watchとe.target.valueの違い
Reactでは、フォームの入力内容を`e.target.value`を利用して取得することができます。例えば以下のように`state`を用いて入力値を管理する方法が一般的です。

e.target.valueを使用した例

```react
const [studyText,setStudyText] = usestate("");

const onChangeText = (event) => {
  setStudyText(event.target.value);
  console.log(event.target.value);
};

<div>
 <label htmlFor="studyText">学習内容</label>
 <input id="studyText" type="text" onChange={onChangeText} value={studyText} />
</div>
```
フォームが簡単な作りであったり、数が少ない場合はこちらでも問題ないかと思います。

しかしこちらだとフォームの入力内容を`state`で管理しているので、フォームの数が増えるとそのぶん`state`を増やさなくてはいけなくなります。また`e.target.value`は複数の値を取得するには、個別に記述が必要になります。

`watch`は、リアルタイムでフォーム全体または特定フィールドを監視したい場合や、複数のコンポーネント間で状態を共有する場合に特に有効です。

# 終わりに
`watch`は、React Hook Formを使ったフォーム管理の幅を広げる非常に便利なメソッドです。特に動的なフォームや複雑なUI構成で大いに役立つのでぜひ使ってみてください。

# 参考

『react-hook-formで値を確認したいときはwatchを使え』Qiita

https://qiita.com/mu-suke08/items/c10c7a9b0b02a25f70aa

『React Hook Formのwatchの基本的な仕組み』Zenn

https://zenn.dev/wood_stock/articles/265dc18e51eb0a
AWS Firewall Managerとは

# AWS Firewall Manager

## 概要
AWS Firewall Managerは、複数のAWSアカウントやリソースにわたるセキュリティポリシーを一元管理できるサービス

## 主な機能
- **AWS WAFのルール適用**
  - WAFのルールを組織全体に一括で適用します。
- **AWS Shield Advancedの管理**
  - DDoS対策を複数アカウントに統一して適用します。
- **セキュリティグループの監視と修復**
  - 不適切なセキュリティグループ設定を検出して修正します。
- **Amazon VPCルート設定の管理**
  - 未承認のネットワーク設定変更を防止します。
- **AWS Network Firewallポリシーの管理**
  - ネットワークレベルのセキュリティ設定を一元管理します。

## 利点
- 複数アカウント環境での一貫したセキュリティポリシー適用
- セキュリティの自動修復機能による運用負担の軽減
- AWS Organizationsとの連携で中央集権型の管理が可能

## ユースケース
- 組織全体での統一的なセキュリティ管理
- 大規模環境でのセキュリティポリシーの自動適用
- DDoS攻撃や不正アクセスからの保護

## フロー図

```mermaid
graph TD
    A[管理者がFirewall Managerでポリシー作成] --> B[AWS Organizationsに参加する全アカウント]
    B --> C[ポリシーが適用されるリソース]
    C --> D[WAFルール適用]
    C --> E[Shield Advanced有効化]
    C --> F[セキュリティグループ監視と修復]
    C --> G[Network Firewallポリシー適用]
```
Dockerの基礎的なコマンド

### Dockerのコマンドの基礎
## イメージ関連
1. **docker pull [イメージ名]**
   - Docker Hubなどのリポジトリからイメージを取得する。
   - 例: `docker pull nginx`

2. **docker images**
   - ローカルに保存されているイメージの一覧を表示する。
   - 例: `docker images`

3. **docker rmi [イメージID]**
   - 指定したイメージを削除する。
   - 例: `docker rmi nginx`

## コンテナの作成・操作
4. **docker run [オプション] [イメージ名]**
   - コンテナを作成して実行する。
   - 例: `docker run -d -p 80:80 nginx`

5. **docker ps**
   - 実行中のコンテナの一覧を表示する。
   - 例: `docker ps`

6. **docker ps -a**
   - 停止中を含むすべてのコンテナの一覧を表示する。
   - 例: `docker ps -a`

7. **docker start [コンテナID]**
   - 停止中のコンテナを開始する。
   - 例: `docker start [コンテナID]`

8. **docker stop [コンテナID]**
   - 実行中のコンテナを停止する。
   - 例: `docker stop [コンテナID]`

9. **docker rm [コンテナID]**
   - 指定したコンテナを削除する。
   - 例: `docker rm [コンテナID]`

## ログや詳細確認
10. **docker logs [コンテナID]**
    - コンテナのログを確認する。
    - 例: `docker logs [コンテナID]`


## イメージの構築
12. **docker build -t [イメージ名] [Dockerfileのパス]**
    - Dockerfileからイメージを作成する。
    - 例: `docker build -t myapp .`

## ネットワーク関連
13. **docker network ls**
    - Dockerネットワークの一覧を表示する。
    - 例: `docker network ls`

14. **docker network create [ネットワーク名]**
    - 新しいDockerネットワークを作成する。
    - 例: `docker network create mynetwork`

## その他便利なコマンド
15. **docker exec -it [コンテナID] [コマンド]**
    - 実行中のコンテナ内でコマンドを実行する。
    - 例: `docker exec -it [コンテナID] bash`
Github Actionsで始める！Python自動テストのちょー基本ガイド  

# GithubActionsでPythonの自動テストの実行について

GithubActionsは、コードをリポジトリにプッシュしたタイミングで自動的にテストを実行する便利なCI/CDツールです。本記事では、Pythonプロジェクトにおいて自動テストを実行する方法を解説します。

## 1. 必要なファイルを準備する

### Pythonプロジェクトとテストコード

以下のような構成を例とします:

```
my_project/
├── src/
│   └── main.py
├── tests/
│   └── test_main.py
└── requirements.txt
```

### 各ファイルの説明

#### 1.1 `src/main.py`  

アプリケーションのメインコードを配置します。この例では簡単な関数を用意します:

```
# src/main.py
def add(a, b):
    return a + b
```

#### 1.2 `tests/test_main.py`  

テストコードを配置します。`pytest`を使用して関数の動作を検証します:

```
# tests/test_main.py
from src.main import add

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0
    assert add(0, 0) == 0
```

#### 1.3 `requirements.txt`  

プロジェクトの依存関係を管理します。このファイルにはテストフレームワークやその他の必要なパッケージを記載します:

```
# requirements.txt
pytest
```


### GithubActionsの設定ファイル

リポジトリのルートに`.github/workflows/test.yml`を作成します。このファイルにCI/CDパイプラインを定義します。

## 2. GithubActionsの設定ファイルの記述

以下は`.github/workflows/test.yml`の例です:

```
name: Python Tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.13'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Set PYTHONPATH
        run: echo "PYTHONPATH=$(pwd)" >> $GITHUB_ENV

      - name: Run tests
        run: pytest
```

## 3. ファイルの詳細解説

### トリガーイベント

以下の設定で、`main`ブランチへのプッシュやプルリクエストがトリガーとなります:

```
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
```

### ジョブ設定

ジョブは`ubuntu-latest`上で実行されます。ステップごとに以下の操作を行います:

1. リポジトリをクローン:  
   ```
   uses: actions/checkout@v3
   ```

2. Pythonのセットアップ:  
   ```
   uses: actions/setup-python@v4
   with:
     python-version: 3.10
   ```

3. 依存関係のインストール:  
   ```
   python -m pip install --upgrade pip
   pip install -r requirements.txt
   ```

4. テストの実行:  
   ```
   pytest
   ```

## 4. 実行結果の確認

Githubのリポジトリページにアクセスし、`Actions`タブを開きます。設定したワークフローが実行され、テスト結果が確認できます。

## 5. 注意点とベストプラクティス

- **Pythonバージョン**: 必要なPythonバージョンを`setup-python`で正確に指定します。
- **依存関係管理**: `requirements.txt`を正確に記載し、環境を再現可能にします。
- **テストカバレッジの向上**: より多くのケースを網羅するテストを書きましょう。

以上の手順で、GithubActionsを使ったPythonの自動テストが構築できます。効率的なCI/CDを目指して、ぜひ導入してみてください！
感想「Clean Architecture 達人に学ぶソフトウェアの構造と設計」

# :tea: はじめに

[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://amzn.asia/d/bmdObqB) を読了しました。

内容は非常に難解で、すべてを完全に理解するにはさらなる学習が必要だと感じています。そのため、1年後に再読しようと思います。

とはいえ、本書から多くの学びを得ることができたので、特に自分なりに解釈し理解できた部分をここにまとめます。

なお、ここでの記述は個人的な解釈を多分に含んでおり、誤解や不正確な部分が含まれる可能性があります。

# :bulb: 学び
優れたアーキテクチャの目的は、開発チームが重要な事項に集中し付加価値を継続的に生み出すことができるようにすることと理解しました。
書籍の中でもメジャーリリースを経るたびに、生産性が下がっているグラフがありました。

私のPJの先輩エンジニアもシニアが書いても、ジュニアが書いてもコードは全て負債であると言っていたことを思い出しました。

クリーンアーキテクチャやその他原則は、コードが増えていく状況下で生産性の低下を緩やかにするため重要だと理解しました。

---

![Screenshot 2024-12-16 at 21.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488575/1837fe8c-55a2-f66a-bb6b-719dce03820b.png)
Clean Architecture　達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ) (Japanese Edition) (p. 37). 株式会社ドワンゴ. Kindle Edition. 

---


普段の開発にすぐすぐ組み込むことは難しいが、下記にまとめる項目は頭に置くことで日々のコーディングがより良いものになると思いました。

組み込むことが難しいというか、曖昧な知識のまま組み込むべきではないですね。
当たり前ですが、組み込むメリット、デメリット整理やチーム内での共通知識が必須だと思いました。

## ソフトウェアの提供価値
ソフトウェアは「振る舞い」と「構造」を価値提供する

「振る舞い」要件を満たすこの方が重要視した結果、変更のコストがメリットを上回り、変更が事実上不可能なシステムは実際に存在する

## SOLID
SOLIDの目的は、変更に強く、理解しやすく、コンポーネントの基盤として多くのシステムで利用できることである

### 単一責任の原則（SRP：Single Responsibility Principle）
モジュールが一つのことだけをするべきと誤解されることが多いが、**本当はアクターの異なるコードは分割すべき**であるということ。

例として、Employeeクラスが3つのメソッドを持ち、それぞれが別々のアクターに対する責務を負う場合は分割すべき

### オープン・クローズドの原則（OCP：Open-Closed Principle）
ソフトウェアは拡張に対しては開いていて、修正に対して閉じているべきということ
言い換えると、ソフトウェアの振る舞いは、既存の成果物を変更せず拡張できるようにすべきである


### リスコフの置換原則（LSP：Liskov Substitution Principle）
インターフェイス経由で別のクラスを呼んだ場合に、実行するロジックが複数あったとして（派生型）入れ替えても問題がない状況ということ


### インターフェイス分離の原則（ISP：Interface Segregation Principle）
インターフェイスを分離することで、不要なソースコードに依存しないようにすること


### 依存関係逆転の原則（DIP：Dependency Inversion Principle）
変化しやすい具象クラスを継承しない、抽象だけを参照するのが最も柔軟であるということ
直接参照するのではなく、安定した抽象インターフェイスに依存させるべき

## クリーンアーキテクチャ
円の内側は外側について何も知らない、内側のコード（例えばエンティティ）が外側のコード（例えばユースケース）を利用してはいけない

レイヤーに分けて、依存のルールを守ることでテスト容易性にもつながる

---

![Screenshot 2024-12-16 at 19.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488575/3140af34-4ded-e1ce-a803-754b1a8e29ea.png)
Clean Architecture　達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ) (Japanese Edition) (p. 250). 株式会社ドワンゴ. Kindle Edition. 

---

### エンティティ
最重要ビジネスルールのことを指す
システムが存在しなくても存在する、ビジネスにとって欠かせないもののこと
企業のビジネスルール

例えば、銀行で言うところの利子N%に当たる

### ユースケース
エンティティをいつ、どのように呼び出すかなどを規定したルールのこと
アプリケーション固有のビジネスルール

例えば、銀行がお客さんの情報を受け取り、与信判定の基準を超えているか判定したのちに見積もりを渡す一連の流れに当たる

### インターフェイスアダプター
ユースケースやエンティティを、データベースやビューに便利なフォーマットへ変換する層のこと
MVCアーキテクチャなどがここに当たる

### フレームワークとドライバ
ウェブやデータベースのこと

## 重複
ソフトウェアの世界では重複は悪だとされ、好まれない
しかし本物の重複と、偽物（偶然）の重複が存在するため注意が必要

画面が似ているからといって反射的に共通化することで、将来的に辛い分離作業がやってくる

# :book: 参考
https://iwasiman.hatenablog.com/entry/20200907%E2%88%92clean-architecture

https://blog.tai2.net/the_clean_architecture.html
AIと挑むSlay the Spire！GPTと二人三脚でAct1を完全攻略！

※本文もほぼChatGPTが書きました

## AIと共に切り開くスレスパの新境地：マップ解析からカードピックまでを最適化
Slay the Spire（以下スレスパ）は、その奥深い戦略性とランダム性で知られるカードゲーム型ローグライクです。しかし、その難しさゆえに「どう攻略すればいいかわからない」「適切なルート選択やカード構築に迷う」という悩みを持つプレイヤーも多いのではないでしょうか。

そんな中、私が試したのは「ChatGPTを相棒にして攻略する」という新たな挑戦でした。[^1] AIにマップ情報を読み込ませ、ルート選択やカードピックのアドバイスをもらいながら進行。[^2] 結果、Act1を無事にクリアすることができました。

[^1]: A19で延々とAct1を突破できず同じような事を繰り返して嫌になってきていた
[^2]: 戦闘時のカードの切り方もGPTに出してもらおうかと思っていたが状況説明が面倒だったので戦闘は自力

この記事では、ChatGPTとどのように連携して攻略を進めたか、特に「マップ情報をどのように共有し、効率的なルートを選んだのか」を中心に、そのプロセスを紹介します。[^3] AIと共にスレスパに挑むという新しいゲーム体験を、ぜひ皆さんも試してみてください！

[^3]: あんまり上手くいかなかった

## マップ形式の相談：AIを活かす準備からスタート
スレスパの攻略をAIに支援してもらうためには、まずマップ情報をどのように伝えるべきかが課題となりました。私たちは以下のような会話を交わしました。

私：「マップ情報をどう入力すれば進行を分析してもらえますか？」
GPT：「マップをノード（地点）とその接続関係として図形データで入力するのがおすすめです。たとえば、以下の形式が使えます。」

そして、提案されたのが Graphvizのdot形式。この形式により、各地点間の接続を明確に記述できるため、AIが進行可能なルートを瞬時に解析できました。[^4] これが今回の攻略を支える基盤となりました。

[^4]: すぐ繋がっていないノードへ進もうとするため何度も回答をやり直す事になった。マップは木構造ではないのでうまくいかないのかもしれない

## ChatGPTのアドバイスが光った瞬間
特に印象的だったのが、敵との戦闘後のカード選択の場面です。「自暴自棄（Doom and Gloom）」を選ぶか迷っていたとき、GPTの助言が決定打になりました。

私：「次のカード選択肢は『融合』『自暴自棄』『コンデンサ』です。どれが良いと思いますか？」
GPT：「次のボスがヘクサゴーストなら、全体攻撃でダークオーブ生成も可能な『自暴自棄』が最適です。ダークオーブの爆発力が終盤の火力不足を補えます。」

このアドバイスが的中し、ヘクサゴースト戦では見事にダークオーブが活躍！[^5]「ここでChatGPTのアドバイスが光りました！」と感じた瞬間です。

[^5]: 実際はダークオーブは一度も解放されていない

## AIによる進行ルートの提案
マップ進行を最適化する場面でも、GPTは重要な役割を果たしました。私が複数の分岐点に迷っていた際には、以下のような提案をもらいました。

私：「次の選択肢は『休憩所（r6）』か『エリート（E7）』です。どちらが良いですか？」
GPT：「E7に進むことでレリックを獲得できます。現在のHPとデッキ構成なら十分攻略可能です。ただし、戦闘後の休憩を計画しておくのがベターです。」

結果的にこの助言が効き、重要なレリック「錨」を入手。AIによる分析と提案が戦略を次のステージに引き上げました。

## AIと共に挑むスレスパ攻略の可能性
AIと連携した攻略は、スレスパの戦略性を新しい次元に引き上げるものでした。ただし、AIが万能というわけではなく、「完全に信頼できる答え」ではないことも事実です。しかし、迷いがちな場面で背中を押してくれる頼れるパートナーであることは間違いありません。[^6]

読者の皆さんも、ChatGPTと共にスレスパ攻略に挑戦してみてはいかがでしょうか？きっと、AIと共に切り開く新境地の楽しさを味わえるはずです！

## Reference

実際のやり取り。AIを使う力が全然弱いなあ
https://chatgpt.com/share/67601b89-67c0-800f-8439-e7d91d74ce75

[^6]: 今回はGPTの判断を優先させると決めてプレイ
未経験が使ったgitコマンド

初心者が最初の方に覚えた、使うコマンドをまとめました。

## リポジトリの作成・初期化
1. **git init**
   - 新しいGitリポジトリを作成する。
   - 例: `git init`

2. **git clone [URL]**
   - リモートリポジトリをローカルにクローンする。
   - 例: `git clone https://github.com/example/repo.git`

## 状態確認
3. **git status**
   - 現在のリポジトリの状態を確認する。
   - 例: `git status`

4. **git log**
   - コミット履歴を表示する。
   - 例: `git log`

## ファイルの追跡・管理
5. **git add [ファイル名]**
   - ファイルをステージングエリアに追加する。
   - 例: `git add README.md`

6. **git add .**
   - カレントディレクトリ以下の全ファイルをステージングエリアに追加する。
   - 例: `git add .`

7. **git reset [ファイル名]**
   - ステージングエリアからファイルを取り除く。
   - 例: `git reset README.md`

## コミット
8. **git commit -m "[メッセージ]"**
   - ステージングエリアの変更をコミットする。
   - 例: `git commit -m "Initial commit"`


## ブランチ管理
10. **git branch**
    - 現在のブランチ一覧を表示する。
    - 例: `git branch`

11. **git branch [ブランチ名]**
    - 新しいブランチを作成する。
    - 例: `git branch feature/add-login`

12. **git checkout -b [ブランチ名]**
    - 新しいブランチを作成して切り替える。
    - 例: `git checkout -b feature/add-login`

## リモートリポジトリ

14. **git push origin [ブランチ名]**
    - ローカルの変更をリモートに反映する。
    - 例: `git push origin main`

15. **git pull**
    - リモートリポジトリの変更を取得して統合する。
    - 例: `git pull`
【AWS】EC2とAMI、起動テンプレートについて

AWSで、「EC2」と「AMI」、また「起動テンプレート」を利用して、汎用的に使えるテンプレートを作成しました。最初、それぞれの違いがイマイチわからなかったので、概要をまとめてみました。

### ◼️EC2インスタンス

**EC2とは？**

- サーバーです。これが使い回す基本の形です。

**EC2でやること例**

- 基本のライブラリやシステムなどを入れていきます。
    - アパッチ、PHP、MySQLなどをインストールします。
- EC2くんのイメージ
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/3fb2b103-8b91-f5ef-be9f-729c256c36cb.jpeg)


### ◼️AMI

**AMIとは？**

- AMIは 「Amazonマシンイメージ」の略です。
    - *>Amazon マシンイメージ (AMI) は、Amazon EC2 インスタンスをセットアップして起動するために必要なソフトウェアを提供するイメージです。*([公式](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html)より)
    - EC2の形をテンプレートとしてAMIにすることができ、それを元に、「同じ設定の別のEC2”を簡単に作ることができます。別リージョンや他アカウントで使ったり、なんなら販売することもできます。
    - AMI自体の作成には利用はできません。ただし、AMIを保存するスナップショットには料金が発生します。

**AMIでやること例**

- 新たに作ったEC2インスタンスをカスタマイズし、それを一つのAMIにします。
- それを元に簡単に他のEC2を作ることができます。
- AMIを使ってたくさんEC2を作ったイメージ
![clone_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/2229fbbc-f132-4e8c-6127-a2017af1408d.png)


### ◼️起動テンプレート

**起動テンプレートとは？**

インスタンスを作るための「設定情報」をテンプレートにすることができます。

### AMIと何が違うの？

ここが最初自分もわかりづらかったのですが、
AMIが「EC2インスタンスそのものをテンプレートにするもの」だとしたら、
起動テンプレートは「EC2インスタンス周りの設定情報も含めてテンプレ化するもの」といえます。

- 設定情報とは、例えば以下のようなものです。
    - インスタンスのタイプ（例: t2.micro, m5.large）
    - 使用するAMIそのもの（どのAMIを使うか、ということ！）
    - セキュリティグループ
    - IAMロール（インスタンスに付与する権限）
    - ネットワーク設定（VPCやサブネット、パブリックIPの割り当て）
- 起動テンプレートのイメージ
![bushi_yoroikabuto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/401b86f6-074c-86ac-8451-fb6d57727fe8.png)


## これらを前提に実際にやってみたこと

細かい設定手順ではなく、概要のみ。です！

### 1：EC2を作成しました。
![1_インスタンス作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/38e445cc-03e7-0128-6580-d78231102f9f.png)


### 2：そのEC2にいろんなサービスを入れました。
起動後のEC2の中には「接続」からアクセスができます。ので、そこからEC2の中に入り、コマンドラインでApacheインストール、PHPやWordpressなんかをインストール。
![2_接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/6bbdb488-7a4f-911d-ebd5-0dcd76357d5b.png)


### 3：そのEC2をAMI化しました。
インスタンスを選択した状態で、「アクション」から「イメージとテンプレート」、「イメージを作成」で行えます。
![3_imageを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/744e8071-f38f-3417-b125-ac554cd42c9b.png)



### 4：起動テンプレートを作りました。

作る時に、どのAMIを使うか？を選択できるので、そこで「3」で作ったAMIを選択しました。

ついでにこの起動テンプレートでインスタンスのタイプやセキュリティグループやらも指定できます。

### 5：この起動テンプレートからEC2インスタンスを作りました。

簡単に、テンプレート的に、インスタンスを作成します！

# まとめ

元にするインスタンスの中に例えばWordpressを入れておけば簡単にデフォルトの枠を作ることができるなど、複数のサイトやサービスのインフラ環境を作ることが多ければおすすめの手順でした。
初心者が学んだDockerのざっくりとした概要

# Dockerの仕組み

Dockerは「データやプログラムを隔離できる」仕組みで、複数のプログラムを独立した環境で動作させることが可能です。これにより、環境の干渉を防ぎ、安定した動作を実現します。

## コンテナとDocker Engine

### コンテナとは
コンテナは、プログラムやデータを入れた「独立した物置部屋」のようなものです。コンテナを使用するためには、Dockerのソフトウェア（Docker Engine）をインストールし、コンテナの作成や操作が可能になります。

### Docker Engine
Docker Engineをインストールすると、コンテナを作成したり利用することが可能になります。

## コンテナはイメージ（image）から作成される

コンテナを作成する際には、あらかじめ用意された「イメージ」というテンプレートを利用します。例えば、MySQL用のコンテナを作成する場合、MySQLのイメージを利用します。

- イメージはソフトウェアやその環境をまとめたものです
- コンテナはDocker上に複数作成可能で、必要に応じて柔軟に配置・利用できます

## DockerはLinuxマシンで動作

Dockerを利用するには、何らかの形でLinux OSが必要です。WindowsやMacでもDockerは動作しますが、その内部ではLinuxが使われています。また、コンテナ内で動作するプログラムもLinux用のものです。


## プログラムの実行環境とライブラリ

PHPやPythonのプログラムを動かすには、それぞれ専用の実行環境とライブラリが必要です。これらを適切に分離して管理しなければ、干渉やエラーの原因になります。

### ソフトウェアの構成
WordPressのようなソフトウェアは、プログラム本体だけでなく、データベース（例: MySQL）が必要です。他のプログラムや特定のフォルダ、ディレクトリを共有している場合、環境設定の競合が起こる可能性があります。

### 環境隔離の必要性
複数のプログラムやシステムが同じ場所で動作すると、設定やデータの衝突が発生することがあります。これを防ぐために、環境を分離して動作させるDockerのような仕組みが有効です。

## プログラム間の依存と問題

### アップデートによる問題
システムAとシステムBが同じプログラム（例: hogeプログラム）ver.5を共有している場合、片方をver.8にアップデートすると、もう一方が動作しなくなる可能性があります。これは共有部分の変更や競合が原因で発生します。


## プログラムを隔離するということ

### Dockerコンテナの特性
Dockerのコンテナは、他のコンテナから完全に分離されており、コンテナ内のプログラムも独立しています。これにより、同じサーバー上で異なるバージョンのプログラムを動作させることが可能です。

### 問題解決
例えば、システムAが「hogeプログラム」ver.5を使用し、システムBがver.8を使用する場合、通常の環境では競合が起きます。しかし、Dockerコンテナを使用すれば、それぞれのプログラムを独立して動作させることで、競合を防ぐことができます。

### 通常環境との違い
通常、1台のサーバーやパソコンでは1つのソフトウェアの特定バージョンしか動かせないことが多いですが、Dockerコンテナを使うことで、異なるバージョンのソフトウェアも共存可能です。
番号がWhatsAppに登録されているかどうかを確認する方法

まず、[WhatsApp Number Checker](https://ekycpro.com/whatsAppNumberCheck) のウェブページにアクセスしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963003/30cc9f4c-4805-aace-3951-592df249cd17.png)

国コードを選択し、確認したい電話番号を入力して、「オンラインステータスを確認」ボタンをクリックすると、結果が表示されます。

APIのJSON結果には以下のフィールドが含まれます：
「number」フィールドには確認された電話番号が含まれます
「whatsapp」フィールドには番号がWhatsAppに登録されているかどうかが示されます（登録されている場合は「yes」、登録されていない場合は「no」、番号が確認中の場合は「checking」）
「status_update」フィールドにはWhatsAppアカウントのステータス更新時間に関する情報が提供されます
「signature」フィールドには企業アカウントかどうかが示されます
「avatar」フィールドにはWA番号にWAアバターがあるかどうかが示されます
「region」フィールドにはWA番号が所在する国が示されます
「carrier」フィールドにはWA番号のキャリアが示されます
左手デバイス比較

## 概要
左手デバイスをいくつか使った上で、それぞれのメリット、デメリットが見えたので、まとめる。
ただの主観評価でしかないので、悪しからず。

## 試したデバイス一覧
1. Razer Tartarus Pro
1. STREAM DECK MK.2
1. TourBox Elite

## Razer Tartarus Pro
有線のデバイス、主にゲーミング用途で用いることを想定している

### メリット
- ボタンが多い
- 押し込み加減で発火の有無を調整できる
    - 特にゲーム用途
- この中では最も安い

### デメリット
- 管理用ソフトのRazer Synapseがよろしくない
    - ソフトウェアの立ち上げが遅い
    - プロファイルなどのデータ管理がネットを前提としている
    - 様々なプログラムや操作のログを常にとっていて、SSDに良くない、ログをサーバに送っている
    - タスクバーから終了しても裏でいくつものソフトが動き続ける
        - RazerSynapse.exe、GameManager.exeなど4つが動き続け、ログを取り続けている
    - UIが無駄に横長で使いづらい
    - ゲーム向けなのか頻繁にアップデートがある
        - アップデートは長い、すぐに使えない
- 誤作動を起こす
    - 頻繁にアップデートがある割りに、軽快に動くわけでもなく、時々フリーズしたりする
    - フリーズしててもわかりづらい
        - デフォルトのプロファイルで動いたりする
- 耐久性が高くない
    - チャタリングするようになる(サイドの方向ボタン)
- コンパクトでない
    - でかい

## STREAM DECK MK.2
Youtuberなどストリーマー用のデバイス

### メリット
- ボタンにディスプレイがある
- iPadなどで体験できる
    - ただし、無料だとボタン数が少ない
        - 試用で全ボタン使えるようにできるが、そのままにすると1年間の利用契約が開始される、ウェブから無効にしてもAppleStoreのサブスクライブ機能で勝手に契約される(3500円)
    - ボタンの位置がわかりづらいのでスマホ版は使いやすくはない
- QuickLauncherの代替になる

### デメリット
- 動作が不安定
    - USBの接続の経路によって動作が不安定になる
        - ハブをかませると特に押しても反応しなくなる
    - 時々デバイスがフリーズする
        - USBを抜いて差しなおすと治るが、ソフトなどの再起動では治らない
    - マクロの処理が遅い
- ソフトが不親切
    - デバイスが無い状態でプロファイルを作っても消える
    - 若干ソフトが使いづらい
    - デフォルトでアイコンの種類が少ない
        - 売りなのに
    - デフォルトのプログラム実行系が良くない
        - 基本、拡張機能を使ったほうが良い
    - 一括変更ができない(?)
        - できるかもしれないが不明
- 押し心地が良くない
    - モソッとする、押したと思っても押せてないことが多い
- 見ずに使うのに向いていない
    - 誤動作するほか、各ボタンに特徴が無いので、手探りすることに向かない

## TourBox Elite
絵描きや動画編集者向け

### メリット
- 最も安定している、動作が軽快
- ソフトが良い
    - 起動が速い
    - デフォルトプロファイルが多い
    - デフォルトのボタンの組み合わせなどが多い
        - デフォルトで存在しない任意のボタンやダイアルなどとの組み合わせを作ることも可能
    - ボタンや組み合わせを押すと、即その設定に飛んでくれる
    - ホイールやダイアルは方向毎に別の設定が可能
        - 速度も3段階で変更可能
- ボタンそれぞれが違う形をしていて手探りしやすい
- 触っていて楽しい
    - 小さい子はめちゃくちゃに触ると思うので、誤作動含めて注意が必要だと思う、足に落としたりすると本当に危ない、大人でも悶絶すると思う
- 左手前のクルクル回る部分に動画のシークを割り当てると使いやすい
    - ただし、シーク幅は0.5秒とか細かくするのが良い
        - 自分は自前でChromeの拡張機能を作っているので、拡張機能にショートカットキーを対応させて、組み合わせている

### デメリット
- 長押しによる組み合わせで、長押しボタンの割り当てまで発火する
    - 例えば、Aボタンにアクション1、A+Bにアクション2を割り当てた場合、Aボタンを長押ししたタイミングでアクション1が発火し、続けてBを押すとアクション2が発火する
        - アクション1を発火させないようにする方法はない、あえて行うのであれば、Aボタンにアクションの割り当てを無くすしかない
- Alt+Tabのような動作が連続的にできない
    - 例えば、AltをAボタンに割り当てて、TabをBボタンに割り当てた場合、Aボタンを長押ししてBボタンを押したタイミングでAボタンの長押しが終了するので、タスク切り替えが連続で行えない
- この中で最も高い
    - amazonのセールがねらい目
    - 安いモデルでも良いと思う、ケーブルが気にならないのであれば、無線にする必要は皆無
- インジケータが無い
    - 電源のLEDのみ、プロファイルを判別することはデバイスだけではできない
- 重い
    - ずっしりしているので、持ち運ぶのに向かない
- 乾電池式
    - なんでバッテリーじゃないの
    - 最初から入っている乾電池は少しペタペタする
- 有線と無線の切り替えはスムーズではない
    - 一度、Bluetoothと接続/切断するので、遅い

## 個人的な順位付け
TourBox Elite >>>> STREAM DECK >= Razer Tartarus Pro

そもそも、Razer Tartarus Proは常に起動していたくない
Salesforceの標準オブジェクトとカスタムオブジェクトの違いを理解しよう

## はじめに
Salesforceを使い始めると必ず出会う概念が「標準オブジェクト」と「カスタムオブジェクト」です。この記事では、両者の違いと特徴を、具体例を交えながら解説していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/864cd5e0-ab59-dabb-57a8-426f4b06bab5.png)

## 標準オブジェクトとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0c0d8462-9dcb-d70c-3840-bc74ea29c92d.png)

### 1. 定義
標準オブジェクトは、Salesforceが最初から用意している基本的なオブジェクトです。すべてのSalesforce組織で利用可能で、ビジネスの基本的なニーズに対応するように設計されています。

### 2. 主な特徴
- Salesforce組織作成時から使用可能
- 基本的な項目が予め設定済み
- 他の標準オブジェクトとの基本的なリレーション（関連付け）が設定済み
- 完全な削除はできない
- 名前の変更は可能だが、APIでの参照名は固定

### 3. 代表的な標準オブジェクト
- **取引先（Account）**：企業や組織の情報
- **取引先責任者（Contact）**：個人の情報
- **商談（Opportunity）**：販売や取引の機会
- **リード（Lead）**：見込み客の情報
- **ケース（Case）**：サポート案件
- **キャンペーン（Campaign）**：マーケティング活動

## カスタムオブジェクトとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/85fad993-0e1f-5e2d-e6ac-3adcb2874a11.png)

### 1. 定義
カスタムオブジェクトは、ユーザーが独自に作成できるオブジェクトで、企業固有のビジネスニーズに対応するために設計できます。

### 2. 主な特徴
- ユーザーが必要に応じて作成可能
- 項目やリレーションを完全にカスタマイズ可能
- オブジェクトの作成・削除が自由
- 名前やAPIでの参照名も自由に設定可能
- カスタムタブやページレイアウトも柔軟に設定可能

### 3. カスタムオブジェクトの作成例
不動産会社の例：
- **物件（Property__c）**：販売・賃貸物件の情報
- **内覧予約（Viewing__c）**：物件の内覧予約管理
- **メンテナンス記録（Maintenance__c）**：物件のメンテナンス履歴

医療機関の例：
- **診療記録（Medical_Record__c）**：患者の診療履歴
- **予約（Appointment__c）**：診療予約管理
- **医療機器（Medical_Equipment__c）**：設備管理

## 両者の主な違い

| 観点 | 標準オブジェクト | カスタムオブジェクト |
|------|----------------|-------------------|
| 作成 | 最初から利用可能 | 必要に応じて作成 |
| 削除 | 不可 | 可能 |
| 基本項目 | 事前定義済み | 自由に設定 |
| API参照名 | 固定（例：Account） | カスタム（例：Property__c） |
| 制限 | ほとんどなし | データ容量やレコード数に制限あり |
| ライセンス | 基本的に追加コストなし | エディションによって作成可能数に制限あり |

## 使い分けのポイント

### 標準オブジェクトを使うべき場合
1. 一般的なビジネスプロセス（営業、サポート、マーケティングなど）
2. Salesforceの標準機能をフル活用したい場合
3. AppExchangeのアプリケーションと連携する場合

### カスタムオブジェクトを使うべき場合
1. 業界特有のデータを管理する場合
2. 企業独自のビジネスプロセスがある場合
3. 標準オブジェクトでは表現できない関係性が必要な場合

## 実装時の注意点

### 標準オブジェクト活用のコツ
- 可能な限り標準オブジェクトを使用する
- 必要に応じてカスタム項目を追加する
- 標準のリレーションを活用する

### カスタムオブジェクト作成のベストプラクティス
- 命名規則を統一する（例：`ObjectName__c`）
- 必要最小限の項目から始める
- 適切なリレーションを設定する
- 項目の説明を丁寧に記載する

## まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/6e7f2925-a75f-575b-14f3-134c00c4bc22.png)

- 標準オブジェクトは基本的なビジネスニーズに対応
- カスタムオブジェクトは特殊なニーズに対応
- 両者を適切に組み合わせることで、効率的なシステム構築が可能
- 拡張性とメンテナンス性を考慮して選択することが重要
LaravelのmakeメソッドってDBに保存されないの？

# はじめに
Laravelでテストを書くときに`make()`を使うのか`create()`を使うのかで曖昧だったので違いについて調べる。

# makeメソッド
vendorを見にいくと、`make()`では**モデルのインスタンス作成のみ**を行っており、DBに保存する処理は行っていなかった。

```php:vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php
/*
 * Create an instance of the given model.
 *
 * @param  string  $class
 * @param  array  $attributes
 * @return mixed
 */
public function make($class, array $attributes = [])
{
    return $this->of($class)->make($attributes);
}

/*
 * Create a builder for the given model.
 *
 * @param  string  $class
 * @param  string  $name
 * @return \Illuminate\Database\Eloquent\FactoryBuilder
 */
public function of($class, $name = 'default')
{
    return new FactoryBuilder($class, $name, $this->definitions, $this->states, $this->faker);
}
```

```php:vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php
/*
 * Create a collection of models.
 *
 * @param  array  $attributes
 * @return mixed
 */
public function make(array $attributes = [])
{
    if ($this->amount === null) {
        return $this->makeInstance($attributes);
    }

    if ($this->amount < 1) {
        return (new $this->class)->newCollection();
    }

    return (new $this->class)->newCollection(array_map(function () use ($attributes) {
        return $this->makeInstance($attributes);
    }, range(1, $this->amount)));
}
```

# createメソッド
以下の記事の通り、`create()`では**新しいモデルインスタンスを作成**して**データベースに保存**を行い、そのインスタンスを返す。

https://qiita.com/mattsu_mocha/items/c5a5c88ffdd0d033a2a1

# まとめ
- `create()`：DBにデータを保存してインスタンス作成を行う
- `make()`：DBにデータ保存をせず、インスタンス作成のみを行う
CSSでの中央配置の設定方法

簡単に要素を中央に配置する方法を紹介したいと思います。

## 水平中央配置
### 方法1: text-align: center
インライン要素またはインラインブロック要素を親要素の中央に配置。
```
<div style="text-align: center;">
  <span>中央に配置</span>
</div>
```

### 方法2: margin: auto
ブロック要素に使用。親要素に display: block と width を指定。
```
<div style="width: 50%; margin: 0 auto; background: lightgray;">
  中央に配置
</div>
```

### 方法3: display: flex
Flexboxを使用して、子要素を水平中央に配置。
```
<div style="display: flex; justify-content: center;">
  <div>中央に配置</div>
</div>
```


## 垂直中央配置
### 方法4: line-height を使用
行の高さを親要素の高さに等しくし、テキストを垂直方向に中央配置。
```
<div style="height: 100px; line-height: 100px; text-align: center; background: lightgray;">
  中央に配置
</div>
```

### 方法5: display: table-cell
table-cell と vertical-align: middle を使用。
```
<div style="display: table; height: 100px; width: 100%; text-align: center;">
  <div style="display: table-cell; vertical-align: middle;">中央に配置</div>
</div>
```

### 方法6: Flexboxを使用
Flexboxの align-items: center を使用。
```
<div style="display: flex; align-items: center; height: 100px; background: lightgray;">
  <div>中央に配置</div>
</div>
```


## 水平および垂直中央配置（完全中央）
### 方法7: Flexboxを使用
justify-content: center と align-items: center を組み合わせる。
```
<div style="display: flex; justify-content: center; align-items: center; height: 100vh; background: lightgray;">
  <div>中央に配置</div>
</div>
```

### 方法8: position と transform を使用
絶対配置で中央を指定。
```
<div style="position: relative; height: 100vh;">
  <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
    中央に配置
  </div>
</div>
```

### 方法9: margin を使用
絶対配置と margin: auto を組み合わせる。
```
<div style="position: relative; height: 100vh;">
  <div style="position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 100px; height: 50px; background: lightgray;">
    中央に配置
  </div>
</div>
```
gradleからJUnit5の@EnabledIfXxxテストケースを実行

結合テストなどは条件付きで実行を切り替えたい場合がある。JUnit 5の条件付き実行を行うanntationがあるのでこれを使用できる。また、gradleからそのannotationがついたテストケースを実行する方法にも触れる。

- gradle 8.6
- junit-jupiter:5.10.3

# ソースコード
環境変数の場合。

```java
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;

@EnabledIfEnvironmentVariable(named = "testing.type", matches = "IT")
class SomeIntegrationTest1 {
  ...
```

システムプロパティの場合。

```java
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;

@EnabledIfSystemProperty(named = "testing.type", matches = "IT")
public class SomeIntegrationTest2 {
  ...
```

gradleから上記のテストケースを実行するには、それぞれの方法で値をセットするtaskを作成する。

環境変数の場合。

```gradle
tasks.register("integrationTest", Test) {
  environment("testing.type", "IT")
  useJUnitPlatform()
}
```

システムプロパティの場合。

```gradle
tasks.register("integrationTest", Test) {
  systemProperty("testing.type", "IT")
  useJUnitPlatform()
}
```

コマンドライン引数などから指定したい場合、それに応じた手段で取得した値を上記のように設定すればよい。以下はその一例。

```gradle
tasks.register("integrationTest", Test) {
	systemProperty("testing.type", System.getProperty('testing.type'))
	useJUnitPlatform()
}
```

# ハマった点
以下のようにしても意図通りの結果にはならない。下記で指定している```-D```はgradleに対するパラメータなため。

```bash
gradle test -Dtesting.type=IT
```

# 参考URL
- https://stackoverflow.com/questions/36322536/how-to-set-an-environment-variable-from-a-gradle-build
- https://ma38su.hatenablog.com/entry/2020/04/17/234400
- https://yukihane.github.io/blog/202008/30/gradle-bootrun-parameter/
パブリックIPを使用したセキュアなDirect Connect 接続

# パブリックIPを使用したセキュアなDirect Connect 接続
AWSのパブリックIPを使用して、よりセキュアにオンプレ、AWS環境に接続したい場合に有効な構成。

```mermaid
flowchart TD
    subgraph オンプレ環境
        A[サーバ]
        B[ルータ]
    end

    subgraph AWS環境
        C[Direct Connect 接続]
        D[パブリックVIF<br>（※1 仮想インターフェース）]
        G[Site-to-Site VPN<br>（IPSecトンネル）]
        E[Direct Connect Gateway]
        
        subgraph VPCネットワーク
            F1((リージョン1<br>VPC))
            F2((リージョン2<br>VPC))
            F3((リージョン3<br>VPC))
        end
    end

    %% 接続の流れ
    A --> B --> C --> D --> G --> E
    E --> F1
    E --> F2
    E --> F3

```


### ※1 仮想インターフェースについて
AWS Direct Connect では3種類の仮想インターフェイスを提供しています。

#### 1. パブリック仮想インターフェイス
- **使用目的**: Amazon S3バケットやAWSのパブリックエンドポイントなど、パブリックIPアドレスでアクセス可能なAWSリソースへの接続。
- **特徴**:
  - グローバルにAWSパブリックIPアドレスに接続可能。
  - 任意のDirect Connectロケーションで利用可能。
  - AWS中国リージョン以外のすべてのAWSリージョンでアクセス可能。

#### 2. プライベート仮想インターフェイス
- **使用目的**: プライベートIPアドレスを使用してAmazon VPC内のリソース（例: EC2インスタンス、ロードバランサー）に接続。
- **特徴**:
  - Direct Connectゲートウェイを介して、複数のVPCや任意のAWSリージョンに接続可能。
  - ただし、特定のサブネットブロックのアドバタイズは不可。

#### 3. トランジット仮想インターフェイス
- **使用目的**: トランジットゲートウェイ経由でプライベートIPアドレスを使いVPC内のリソースに接続。
- **特徴**:
  - 複数のVPCや異なるAWSアカウント間で接続可能。
  - 最大3つのトランジットゲートウェイを接続可能。
  - 特定の許可されたプレフィックスリストのみがアドバタイズされる。

## 関連リンク
- [AWS Direct Connect 仮想インターフェイス](https://aws.amazon.com/directconnect/)
- [Direct Connect ゲートウェイの操作](https://aws.amazon.com/directconnect/)
Databand 簡単紹介

# この記事について
- この記事は[IBMが提供する製品に関する情報やナレッジを共有する Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ibm_data_ai_automation)の12月17日分として記載しています

# Databand とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/d09b5cbd-0a37-95cf-8b84-b876fca9cb85.png)


 - Databand とは、IBMのデータ・オブザーバビリティ（データ可観測性）製品です
 - データパイプラインを可視化し、データの異常やその予兆を素早く検知します
---
- [こちらのサイト](https://www.ibm.com/products/databand/integrations)に記載がありますが、以下のデータパイプライン製品に対応しています

    - Apache Airflow
    - Snowflake
    - BigQuery
    - dbt Core and Cloud
    - IBM Datastage
    - Apache Spark
    - Databricks Spark
    - Azure Data Factory
    - StreamSets
    - Control-M
    - カスタム統合

![スクリーンショット 2024-12-17 0.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/33a5bd77-bf4d-9d94-f657-0ad285a9aea2.png)
![スクリーンショット 2024-12-17 0.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/527c15b7-1b9e-a060-b489-1c152f382d7c.png)


- また、アラート用ツールとしては以下対応しています
    - Microsoft Teams
    - PagerDuty
    - Slack
    - カスタムツール
    - Eメール


# Databand 紙芝居

- 簡単な使い方の紙芝居を以下に記載します

## ダッシュボード

- ジョブの実行状況が確認できます
![スクリーンショット 2024-12-16 21.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/254df62c-73d9-cda1-259d-5b0d9dfcd8fb.png)

- なお、こちらで流れている各データパイプラインはデモ用のものです

- 赤い帯（失敗したジョブ）をクリックしてみます
![スクリーンショット 2024-12-16 21.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b926ee51-1aef-5f7a-1eb0-3f8d88bbcd7f.png)

- SnowflakeやAirflowなどでの各データパイプラインでの失敗した実行状況が一覧化されます
![スクリーンショット 2024-12-16 21.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/f8cb89c1-4c37-e469-0b3b-1d2b1801ad6a.png)

- 19時0分27秒に実行したAirFlowのジョブをクリックしてみます
![スクリーンショット 2024-12-16 21.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/1c23e6e6-e303-ce70-0be7-a72d81af347e.png)


- 右側のフローの、「dbnd_track_dbt_load」の「＋」ボタンをクリックして処理をドリルダウンしてみてみます

![スクリーンショット 2024-12-16 21.19.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/aa00ef65-3797-e2e0-b88b-f42095c1fd84.png)

- 個別の処理（例えば「closed_reqests」）をクリックすると、画面左側にて過去履歴の処理時間もわかります
![スクリーンショット 2024-12-16 21.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/40a5f227-c533-708c-d283-95c39bc5c0bd.png)


Databand のドキュメントは[こちら](https://www.ibm.com/docs/en/dobd)にあります。IBM Data Observability by Databand、というのが現在の正式名称ですね。
[T-DASH] Windows アプリのXPath取得をもっと簡単に！

# はじめに

T-DASHではWebアプリ、Windowsアプリ、モバイルアプリをひとつのプラットフォームでテスト自動化できます。
テスト自動化を進める上で、UI要素を正確に特定するためのXPath取得は欠かせない工程です。
しかし、多くの人が以下のような課題を抱えています。

* 要素の階層が深く、XPathを手動で記述するのが大変
* 動的に生成される要素に対応できない

こうした課題を解決するために、T-DASHで採用しているFlaUIでのXPath取得方法を紹介します。


# 対象環境

T-DASHでは以下の環境をサポートしています。

* サポートするフレームワーク
    * Win32
    * WinForms
    * WPF

* 主な技術
    * FlaUI

# XPath指定方法

* UI要素特定

FlaUIではXPathに以下のようなプロパティを活用します。

| プロパティ名 | 内容 |
| ---- | ---- |
| ControlType | UI要素の種類を表します（例: ボタン、テキストボックス、リストなど）。 |
| ControlIndex | 同じ種類のコントロールが複数存在する場合のインデックス番号です。<br>特定の要素を一意に識別するために使用します。 |
| AutomationId | 開発者が設定する一意の識別子で、最も安定した要素特定に使用されます。<br>ただし、全ての要素に設定されているわけではなく、動的に生成される場合もあります。 |
| Name | UI要素の表示名やラベルを表します。<br>特定の要素を識別する際に便利ですが、同じ名前を持つ要素が複数存在する場合もあります。 |
| ClassName | 要素のクラス名を示します。カスタムコントロールや独自に定義されたUI要素を特定する際に役立ちます。 |
| HelpText | UI要素に関連付けられた補助テキスト（例: ツールチップやアクセシビリティの説明）。操作ガイドや詳細情報の確認に利用できます。 |

プロパティを活用して、動的要素や階層が深い要素を簡単に特定できます。

T-DASHではWinツール画面の以下の部分でプロパティを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/cf84b203-6aca-38f7-3f8b-419f1b1d0f6c.png)

* 特定の要素に柔軟に対応する方法

例えば、以下のようなWindowsアプリ画面の`RightClick`ボタンをXPathで指定する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/48333719-a193-2f04-eafc-3278fde2cea3.png)

要素のツリー構造としては以下になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/1345c1f2-3b1e-2dea-64ed-1a0025927a24.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/1ff9f803-8857-a0e0-2c13-a7d2b72d6485.png)

この場合、XPathのフルパスとしては以下のように記述できます。

```
/Window/Tab/TabItem/Button
```

このXPathをいくつかの条件を組み合わせて作成します。

### 1. ボタンのIndexを指定する

`ControlIndex`を利用して、特定のインデックスを指定できます。例えば、`Button[3]` と指定すると、3番目のボタンを特定します。

```
/Window/Tab/TabItem/Button[3]
```

ControlIndexを利用して、Winツール上で`1/1`になっているか確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/d1173224-6e15-b67a-8704-a91792caa508.png)

### 2. プロパティを組み合わせて`and`条件で組み合わせて指定する

XPathで`and`を使用して、複数の条件を組み合わせることができます。例えば、`Name`と`ClassName`の両方を条件に指定することができます。

 ```
 /Window/Tab/TabItem/Button[@Name='RightClick' and @ClassName='Button']
 ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/cad0947d-84ab-6b82-53fd-2a3cf529ca38.png)

### 3. `//`を利用して、階層内の子要素どこかにある要素を指定する

`//`を使うことで、指定した要素がどの階層にあっても検索することができます。これにより、深い階層の要素を特定できます。

```
/Window//Button[@Name='RightClick' and @ClassName='Button']
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780127/4fdea20d-75e2-8d90-8b76-1aef16d982b9.png)

### 4. `*`を利用する

`*`を使うことで、`ControlType`を指定せずに、任意のコントロールタイプを対象にできます。これにより、`ControlType`が動的に変わる要素にも対応することができます。

```
/Window//*[@Name='RightClick' and @ClassName='Button']
```

この方法で、`ControlType`を特定せず、`Name`と`ClassName`のみで要素を特定することができます。


# 最後に

FlaUIでは、WebのXPathのようにUI要素を特定することができますが、動的な要素や深い階層の要素を取り扱う際に、プロパティを活用することでより柔軟かつ安定したテスト自動化を実現できます。
T-DASHでWindowsアプリ自動化を行う際にXPathで悩まれている方の参考になれば幸いです。
Waffleに参加して良かったこと3選

昨年waffle collegeのテックキャリアコースに参加してみて良かったこと（すっごいアバウト）ついて書いてみようと思います



（技術関連のカレンダーが多かったのでそれ以外で書いてみようという試み！）

---

- やってみよう精神が身についた
- 仲間ができた
- ITを"学ぶ"だけじゃない

---


#### やってみよう精神が身についた

waffleに入る前の私は、「〇〇に挑戦してみたいけど今の実力じゃ難しい」とか「まだ準備できてないからもう少し後でやってみよう」とか、自分が納得できる状態になって初めて何かに挑戦する人でした…
\
waffle collegeに入って3ヶ月経ったあたりからこの考えが徐々に変わってきて…
一番最初のきっかけはハッカソンへの出場

まだプログラミング始めて数ヶ月しか経ってないしWebアプリ一個作っただけの状態でハッカソン出て大丈夫なのだろうか…と躊躇していましたがwaffle collegeの同期と勢いで申し込み…

いざ出てみたらめっちゃ楽しい！！

限られた時間で理想系に近づけていくのに必死で申込前に感じていた不安を感じる暇は無かった…！

ハッカソン終了後の懇親会でもポジティブなフィードバックを沢山いただけて、この経験はwaffleの仲間がいなければ出来なかったことだな、やってよかったなとしみじみ感じました
\
その後も、インターン募集宣伝で度々大人から発せられる「自信なくても挑戦してみて！」やコンフォートゾーンについての学びを通して私の意識は徐々に変わっていきました


\
コンフォートゾーンについて↓



https://service.alue.co.jp/blog/comfort-zone


\
自分の不安な状態はストレッチゾーンにいるってことだ、成長しようとしている証だからここで戻ったらもったいない！と思うようになりました





結果として、今まで話すスキルに自信がなく挑戦しなかったリーダーという役割にゼミ合宿で挑戦してみたり、自分には程遠い世界だと思っていた某A〇Sのインターンに応募してみたり（その後選考を通過し2ヶ月間インターンに参加できました！インターンのカリキュラムなど機密事項が多いので書かないことにします）自信ないけどとりあえずやる！！という積極的なマインドが身についたと思います



#### 仲間ができた



突然ですが！！

- 同じ志を持つ仲間がおらず1人もくもくと勉強する

- 共通の目標がある仲間に刺激を受けながら勉強する



どちらがより成長できると思いますか？
私は圧倒的後者の方が成長できる人間です

勉強が嫌になりそうな時、アドバイスを貰ったり、ちょっと愚痴ったり^_^
新しい情報を仕入れた時、共有することで更に理解を深めたり
そんな仲間がwaffleに入ってできました！！
\
毎週zoomで顔を合わせていたのですぐに打ち解けられ、初めて顔を合わせてから1年以上経った今も毎日のように連絡を取りあっている人も…！
\
学外でこんな関係を築ける場所ってなかなか無いと思うんですよね！！！
そんな環境を作ってくださった大人たちには頭が上がりません



#### ITを"学ぶ"だけじゃない

waffle collegeテックキャリアコースとは？？


```
女性・ノンバイナリーの学生がエンジニアのインターン獲得を目指し
プログラミングとCSの基礎を学ぶ

毎週の授業＋チームでのアプリ開発
```


すごいざっくり説明するとこんな感じ！



でもwaffleではこれ以外にも以下のような経験ができます↓



- TA経験

-Technovation girsでのTA

-waffle campでのTA

それぞれthunkable、HTML&CSSなど自分たちが学んできた知識を活かしてイベントで高校生への学習アドバイスや基礎知識を教える講師のような経験ができます！

自分たちの学びをアウトプットするだけでなくどうしたら相手に伝わりやすいかや自分が将来持つであろう後輩へどう接したら良いかなどソフトスキルを磨ける機会になります



- イベント企画

これは自主的なものですが、私たちの期は卒業アルバムページ制作という企画やleetcode解けるまで帰れまテンなど様々なイベントが行われました！





- 人気企業のオフィスツアー

昨年は数回ありましたね。残念ながら私は参加できなかったのであまり詳細なことは書けませんが不特定多数の学生が参加するオフィスツアーよりも企業の方への質問とかもしやすいのではないでしょうか！（完全に主観です🙇‍♀️）





この辺はこしむのアドカレにも書いてあるのでぜひ見てみてください



https://qiita.com/55koshimu/items/35936cdf1a1672b58e23

良いお年を～！
AZ-900に合格した話

先日(12月初頭)Azure Fundamentals(AZ-900)に合格したので勉強法を共有します。
## 1.自己紹介
aocchi-infraと申します。NEW GAME!が好きです。記事執筆時点ではSE歴は1年9か月です。資格取得前のクラウドに関する知識はあまりありませんでした。（クラウド事業者やEC2みたいな有名なサービスを知ってるくらい）

## 2.勉強期間・勉強方法
勉強期間は大体1か月半くらいです。勉強方法としては、Udemyの講座を利用しました。私が購入した講座は講義系と問題集の二つです。以下のURLよりご覧ください。

https://www.udemy.com/course/azure-az900-learn/ 

https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/

勉強法としては、まずは講義を一回通して聞き、その後に問題集を解いて間違えた分野を講義とまた照らし合わせていくといった形を取りました。この二つがあれば大体の範囲は網羅できるのではないかと思います。実は別に一冊参考書を購入したのですが、ほとんど読まなかったので必要ありませんでした。気になる方は以下のURLからご確認ください。

https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Microsoft-Azure-Fundamentals%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%BBAZ-900%EF%BC%BD%E5%AF%BE%E5%BF%9C/dp/4295018996/ref=asc_df_4295018996?mcid=3857316a46423cfe84239124e85aba7c&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707458635054&hvpos=&hvnetw=g&hvrand=5774843528537879340&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009260&hvtargid=pla-2309848366966&psc=1&gad_source=1

## 3.試験を受けてみて
実際に本番の試験を受けてみたところ、受験中に「これって本当にこの選択肢でいいのかな？」と惑わされることが多く始終不安な気持ちでした。結果は750点台と割とギリギリでしたので、合格はしたものの勉強不足だと痛感させられました。

## 4.今後の目標
AZ-900の復習をしつつ、AZ-204(Azure Developer Associate)の合格を目指します。三年目に入る前にはうかりたいな～。

## 5.終わりに
非常に適当な記事ですが、誰かの役に立てば幸いです。また資格に合格したら新しい記事書くかもしれません。それじゃ、またね～。
route 53のalias（エイリアス）ってなんなんだよ！

まじAWSのaliasってなんなんだよってところですが、

本名が『山田太郎』だけど、友達から『タロちゃん』って呼ばれる
みたいな感じ。
DNSでも、「example.com って呼んだら、実は otherdomain.com のことだよ」 って別名をつけるのがエイリアスになります。

つまりはあだ名をつける機能ですね。うん。

そこに付随するalias recordやそもそもroute53って何ってところも合わせて解説しますと、、

route53の主な機能

- ドメイン名を登録
- インターネットのトラフィック（＠＠のウェブサイトに行きたいなどのリクエスト）を対象ドメインに当てはまるリソースへ案内する
- リソースの正常性をチェックする（ヘルスチェック）

ルーティングポリシーの種類

- シンプルルーティング
    - 一番単純なやつ
    - 単一リソースへのルーティング
- フェイルオーバールーティング
    - アクティブとパッシブフェイルオーバーを設定できる
    - アクティブフェイルオーバー：二つシステムがあったら二つとも稼働している状態。一つ死んだらもう一個の方だけで稼働を続けられるように死んだサーバーへはルーティングを行わない
    - パッシブフェイルオーバー：二つシステムがあったら、どちらか一つのみが稼働している状態。稼働中のが死んだらもう一個の動いてなかったシステムを開始させてそちらにトラフィックをルーティングする。
- 位置情報ルーティング
    - ユーザーの位置情報に基づいてトラフィックをルーティングする
- 地理的近接性ルーティングポリシー
    - リソースの場所に基づいてトラフィックをルーティングする
- レイテンシールーティング
    - 複数箇所にあるリソースのうち最もレイテンシーの低い（遅延が起きていない）リソースへのルーティング
- 複数回答値ルーティング
    - 最大で８つのレコードにDNSクエリを投げてランダムに応答させる気まぐれルーティング
- 加重ルーティング
    - 決めた比率で複数のリソースにトラフィックをルーティングする（「Aに5割行かせて、Bに3割行かせて、残り2割はCでいいや」など）

エイリアスレコード

- IPアドレスもしくはドメイン名の代わりに下記リソースへ繋いでくれる
    - cloudfrontディストリビューションのサブドメイン名
    - ELB
    - 静的ウェブサイトとして設定されたs3
    - 同じホストゾーン内の別のroute53リソースレコードセット

このエイリアスレコードですがまじでCNAMEレコードと区別つきにくい、

でも全然違うものなんです！

具体的には、、、

- CNAMEレコードはZone apex（最上位ドメイン）には作成できない
    - **理由１：Zone ApexにはSOAとNSレコードが必要だけどCNAMEは一つしかDNSレコード（別名）しか設定できない**
        - DNSのZone Apex（最上位ドメイン）には、必ず**SOA（Start of Authority）レコード**と**NS（Name Server）レコード**が存在しなければなりません。
        - **SOAレコード**はゾーンの管理情報を定義し、**NSレコード**はそのゾーンを管理するDNSサーバを示します。
        - CNAMEレコードは、**エイリアス（別名）を指すレコード**であり、CNAMEが設定された場所には他のレコードを同時に設定できません。
        - そのため、SOAやNSレコードが必須のZone ApexにCNAMEを設定することは**DNSの仕様上不可能**です
- エイリアスレコードはZone apexにも作成できる
    - Zone ApexでCNAMEのように振る舞うけどSOAやNS（DNSサーバがドメインに対する問い合わせを処理するレコード）も持ち合わせることができるのが**ALIASレコードの特徴だから**エイリアスは 「別名」 って意味だよ。