OmniAICreator/Qiita-1.07M huggingface dataset:
AWS用語シート

AWSの主な用語を解説付きで一覧にまとめた記憶用シートです。これを使って学習を効率化しましょう。

【Compute】

EC2 (Elastic Compute Cloud)AWSの主要な代表的サーバ。自由に配置やスケールの動的変更が可能。

Lambdaサーバーを使用せずコードを実行するためのサービス。"サーバーレスコンピュート"の代表格式。

ECS (Elastic Container Service)Dockerコンテナを管理して実行するためのマネージドサービス。

EKS (Elastic Kubernetes Service)Kubernetesクラスタの管理サービス。EKSは自動化されたメンテナンスを提供。

【Storage】

S3 (Simple Storage Service)無限にスケーラブルなオブジェクトストレージ。バックアップやファイル分散に優れる。

EBS (Elastic Block Store)EC2用のブロックストレージ。「ハードディスク」のように使用可能。

GlacierS3のサブサービス。長期保管用に適している。安価だがデータの取り出しに時間がかかる。

FSxWindowsファイルシステムやLustreファイルシステムのマネージドサービス。

【Networking】

VPC (Virtual Private Cloud)グローバルな経路を構築するためのサービス。セキュアなネットワーク環境を作成できる。

CloudFrontAWSのコンテンツ配信ネットワーク。グローバルにデーターファイルや動画を配信できる。

Route 53DNS管理サービス。ドメインを管理し、トラフィックの分散を行う。

Direct ConnectAWSとオンプレミスを経由せずに直接接続するためのサービス。

【Database】

RDS (Relational Database Service)マネージドな関係データベースサービス。MySQL、PostgreSQL、Oracle、SQL Serverなどに対応。

DynamoDBサーバレスなノーシークエルでデータを管理するサービス。高速でスケーラブル。

RedshiftAWSのデータウェハウスサービス。大量のデータの解析に適している。

ElastiCacheメモリデータベースのサービス。RedisやMemcachedに対応。

不明点があればAWSドキュメントを参考しましょう。

https://docs.aws.amazon.com/ja_jp/
#0004（2024/01/04）DNSのレコードの種類一覧

# モチベーション
- AWS SAA のRout53の勉強中に、DNSのレコードの種類が出てきたので調べて、表にまとめた

# DNSレコードとは
- ドメインとIPアドレスを名前解決するために、ドメインのデータベースに格納されているデータ

# 一般的なDNSのレコードの種類一覧

| レコードタイプ | 役割 | 値 | 用途 |
|--------|--------|--------|-----|
| Aレコード | ドメイン名とipv4を結びつける | 192.168.0.0 | web serverやリソースへの接続|
| AAAAレコード | ドメイン名とipv6を結びつける | 2001:db8::1 |ipv6を使用するサーバーへの接続|
|CNAMEレコード|ドメイン名を別のドメイン名のエイリアスとして紐づける|example.com|CDNやリダイレクト|
|MXレコード|ドメインに送信されるメールの配送先サーバーを指定する|mail.example.com|メールサーバーの設定|
|TXTレコード|テキストデータを保存するレコード|"v=spf1 include:_spf.google.com ~all"|メールの認証情報（SPF, DKIM, DMRAC）や説明文の登録|
|NSレコード|ドメインを管理するDNSサーバーの指定|ns1.example.com|ドメインの管理DNSサーバーの指定（AmazonRout53, GoogleDomains）|
|SRVレコード|特定のサービス（SIP、LDAP）を提供するサーバーを指定|_sip._tcp.example.com   10 5 5060 sipserver.example.com|特定のプロトコルやサービスの接続先の設定（通話用SIPサーバー）|
|PTRレコード|IPアドレスからドメイン名を逆引き（逆引きDNS）|1.1.168.192.in-addr.arpa   example.com|サーバーの正当性の証明（メールサーバーの認証やトラブルシューティング）|
|SOAレコード|ゾーン（ドメイン）の管理情報（プライマリDNS、管理メールアドレス、シリアル番号）を記録|ns1.example.com admin.example.com|DNSゾーンの管理情報を記録|
|CAAレコード|ドメインに発行できるSSL/TLS証明書を制限|0 issue "letsencrypt.org"|認証局の制限により、不正なSSL証明書の発行を防止|


# 参考
- https://maildata.jp/blog/blog-2023-02-01.html
- chatgptの回答を元に作成
paiza 勉強記録【ロボットの暴走】【Java】

paizaでの勉強記録です。
今回は下記のレベルアップ問題集のAランク問題の「ロボットの暴走」を実施しました。
一応テストケースはすべてOKでしたが、模範解答と比べるとレベル毎の移動マス数の処理など冗長なところが多いなと感じました。。。

ただ一つ文句が言いたい、標準入力で与えられるロボットの初期位置の最大範囲ってのは何なんだったんだ、、使わないやんけ、、

https://paiza.jp/works/mondai/class_primer/class_primer__robot_move

``` java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner sc = new Scanner(System.in)) {
			
//			入力はされるが使わない変数
			int x_max = sc.nextInt();
			int y_max = sc.nextInt();
			
			int robotCount = sc.nextInt();
			int moveCount = sc.nextInt();
			
			ToolBox[] toolPlaceList = new ToolBox[10];
			Robot[] robotList = new Robot[robotCount];
			
//			工具箱の位置の取得処理
			for (int i = 0; i < 10; i++) {
				int tool_x = sc.nextInt();
				int tool_y = sc.nextInt();
				toolPlaceList[i] = new ToolBox(tool_x,tool_y);
			}
			
//			ロボットの情報取得処理
			for (int i = 0; i < robotCount; i++) {
				int robot_x = sc.nextInt();
				int robot_y = sc.nextInt();
				int robot_level = sc.nextInt();
				
//				取得した情報の格納
				robotList[i]= new Robot(robot_x,robot_y,robot_level); 
			}
			
//			移動処理
			for (int i = 0; i < moveCount; i++) {
//				移動するロボットの情報取得
				int robotNumber = sc.nextInt();
				String compass = sc.next();

				Robot robot = robotList[robotNumber-1];
				robot.move(compass);
				
//				移動先に工具箱があればレベルアップ
				for (int j = 0; j < 10; j++) {
					ToolBox toolBox = toolPlaceList[j];
					if (robot.place[0]==toolBox.place[0]&&robot.place[1]==toolBox.place[1]) {
						robot.levelup();
					}
				}
			}
			
//			標準出力処理
			for (int i = 0; i < robotCount; i++) {
				Robot robot = robotList[i];
				System.out.println(String.format("%d %d %d", robot.place[0],robot.place[1],robot.level));
			}
		}
	}
}

class Robot {
	int[] place = new int[] {0,0};
	int level = 0;
	int moveDistance = 1;
	
//	コンストラクタ
	public Robot(int robot_x, int robot_y, int robot_level) {
		place[0] = robot_x;
		place[1] = robot_y;
		level = robot_level;
		
	    if (1==level) {
	    	moveDistance = 1;
	    } else if (2==level) {
			moveDistance = 2;
		} else if (3==level){
			moveDistance = 5;
		} else if (4==level) {
			moveDistance = 10;
		}
	}
			
//	移動処理
	public void move(String compass) {
		switch (compass) {
		case "N":
			place[1] -= moveDistance;
			break;
		case "S":
			place[1] += moveDistance;
			break;
		case "E":
			place[0] += moveDistance;
			break;
		case "W":
			place[0] -= moveDistance;
			break;
		default:
			break;
		}
	}
	
//	レベルアップ処理
	public void levelup() {
//		レベルが4未満の時レベルアップ
		if (4>level) {
			level++;
		} else {
			return;
		}
		
//		上がったレベルに応じて移動距離を増加させる
		if (2==level) {
			moveDistance = 2;
		} else if (3==level){
			moveDistance = 5;
		} else if (4==level) {
			moveDistance = 10;
		}
	}
}

class ToolBox {
	int [] place = new int[] {0,0};
	
//	コンストラクタ
	public ToolBox(int tool_x,int tool_y) {
		this.place[0] = tool_x;
		this.place[1] = tool_y;
	}
}
```
不在時にはひまじんでなければ、Lineに通知するを実装　ステップ

# 現在の不在時に本人以外の場合にLine通知する機能を追加してみる。　9:30-11:30　ジム休みの日など、不在じゃないときあるので、実装していく。　
１．ひまじんの画像を/home/pi/me.jpg で格納。正面でとりました。
参考サイトを参考にPythonを記述
参考サイト
https://blog.grasys.io/post/uema/python-face-recognition/
以下　kao_ninsyou.pyで保存＆実行
```
import sys
import cv2
import face_recognition
from picamera2 import Picamera2

# カメラの設定
camera = Picamera2()
camera.configure(camera.create_preview_configuration(main={
        "format": 'XRGB8888',
        "size": (640, 480)
}))
camera.start()

# 画像を読み込み、顔の特徴値を取得する
uema_image = face_recognition.load_image_file("/home/pi/me.jpg")
uema_face_encoding = face_recognition.face_encodings(uema_image)[0]

face_locations = []
face_encodings = []

print("Start capture image")

while True:
    # カメラからイメージを撮る
    image = camera.capture_array()
    output = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)

    # 顔を検知する
    face_locations = face_recognition.face_locations(output)
    print(f"Found {len(face_locations)} faces")
    face_encodings = face_recognition.face_encodings(output, face_locations)

    for face_encoding in face_encodings:
        # 読み込んだ顔の特徴量とカメラから取得した顔の特徴量を比較する
        match = face_recognition.compare_faces([uema_face_encoding], face_encoding)

        if match[0]:
            print("顔です。!")
            # プログラムを終了する
            sys.exit(0)
```
４．実行結果
顔は認証できてますね。picamera2 でも同じことができそうですね。
```
[4:22:16.837596510] [3271]  INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f
[4:22:16.995994680] [3277]  INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx708@1a to Unicam device /dev/media3 and ISP device /dev/media0
[4:22:16.996660769] [3277]  INFO RPI pipeline_base.cpp:1101 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
[4:22:17.016900278] [3271]  INFO Camera camera.cpp:1033 configuring streams: (0) 640x480-XRGB8888 (1) 1536x864-SBGGR10_CSI2P
[4:22:17.018282456] [3277]  INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected unicam format: 1536x864-pBAA
Start capture image
Found 1 faces
顔です。!
```

５．今度はひまじんを検出させてみる。
ちょっと時間かかりそう。
AIがもたらす開発プロセスの革命 & エンジニアの未来

## はじめに

現代社会において、技術の進歩は日進月歩で進んでおり、特に人工知能（AI）の発展は私たちの生活や仕事の在り方を大きく変えつつあります。AIがコード生成や設計プロセスに深く関与することで、ソフトウェア開発の方法論やエンジニアの役割自体が再定義される時代が訪れています。本記事では、AIによるプロンプトを活用した開発プロセスの革命と、その急速な進化、そしてエンジニアリングの未来について考察します。

## プロンプトが導く開発プロセスの革新

### 従来の開発プロセスの限界

従来のソフトウェア開発では、エンジニアが手作業でコードを書き、テストとデバッグを繰り返すことが主流でした。しかし、この手法には以下のような課題がありました。

- **時間と労力の負担**: 手作業によるコード記述は時間がかかり、エラーの温床となる可能性があります。
- **設計思想の共有不足**: チーム内で設計の意図や背景が十分に共有されないことが多く、保守性に影響します。
- **技術的負債の蓄積**: 急いで開発を進めるあまり、後々の障害となる問題を見過ごすことがあります。

### AIプロンプトによる新しい開発手法

AIに対してプロンプト（指示や要求事項）を与えることで、AIが自動的にコードを生成し、テストも併せて行う手法が注目を集めています。この方法には以下の利点があります。

- **効率性の向上**: AIがコード生成を担うことで、開発スピードが飛躍的に向上します。
- **品質の向上**: AIは最新のベストプラクティスに基づいてコードを生成するため、品質が向上します。
- **設計意図の明確化**: プロンプトを通じて設計意図を明確にするため、チーム内での認識のズレが減少します。

## 技術革新の進行速度とその驚異的な実現度合い

### 現在の技術進歩の状況

AIの発展は予想を超える速さで進行しており、既に多くの現場で実用化されています。

- **AIによるコード生成ツールの普及**: GitHub Copilotを始めとするツールが開発者の生産性を高めています。
- **自動テストの高度化**: AIがテストケースを自動生成し、バグの検出率を向上させています。
- **自然言語処理の向上**: AIは人間の言葉を理解し、適切なコードや回答を提供できるようになっています。

### 技術革新のスピードの背景

- **大規模データの活用**: 膨大なデータから学習し、高度な判断が可能になっています。
- **計算資源の拡大**: クラウド技術の発展により、AIの学習や推論に必要なリソースが確保されています。
- **コミュニティの協力**: オープンソースの取り組みが技術の進化を加速させています。

## エンジニアの役割の再定義

### スペックと文脈構成力によるエンジニアの選別

技術の高度化に伴い、エンジニアは以下の観点で評価されるようになります。

- **スペック（技術的能力）**: AI技術の理解や高度な専門知識が求められます。
- **文脈構成力**: 複雑な要求や設計意図を的確に伝えるコミュニケーション能力。

これらの能力を持たないエンジニアは、AIに取って代わられるリスクが高まります。

### 新たなエンジニアの役割

- **プロンプトデザイナー**: AIに対して最適な指示を設計し、望む結果を導き出す専門家。
- **システムアーキテクト**: 全体像を把握し、AIが生成したコードを統合する役割。
- **品質保証エンジニア**: AIが作成した成果物のテストと検証を行い、品質を担保します。

## 不要となる人々の増加とその背景

### 自動化による影響

- **単純作業の自動化**: ルーチンワークはAIによって代替され、人手が不要になります。
- **コスト削減の圧力**: 企業は効率化とコスト削減のために自動化を推進します。

### 適応できない人々のリスク

- **学習の停滞**: 新しい技術に追いつけないと市場価値が低下します。
- **柔軟性の欠如**: 変化に対応できないと職を失う可能性があります。

## [付録]技術と哲学の視点から見るエンジニアリング

### ニーチェの「超人」とエンジニア

ニーチェの哲学では、「超人」は自己を超越し、新たな価値を創造する存在です。エンジニアもまた、従来の枠組みに囚われず、新しい技術や方法論を取り入れることで、自身の価値を高めることが求められます。

### ウィトゲンシュタインの言語論

言語の限界が思考の限界であると説いたウィトゲンシュタインの思想は、AIとのコミュニケーションにおいても重要です。明確で文脈に合ったプロンプトを設計することで、AIから最適な結果を引き出すことが可能となります。

## エンジニアリングの未来への提言

### 継続的な学習と適応

- **最新技術の習得**: AIやクラウド技術など、新たなスキルを積極的に学ぶ。
- **柔軟な思考**: 変化を恐れず、新しいアイデアを受け入れる姿勢。

### コミュニケーション能力の強化

- **明確な表現**: 複雑な概念を平易な言葉で伝える力。
- **チームワークの重視**: 他者との協力を通じてシナジーを生み出す。

### 哲学的視点の導入

- **倫理観の育成**: AI活用における倫理的な問題を考慮する。
- **自己省察**: 自身の役割や影響力を客観的に見つめ直す。

## 結論

AIがもたらす開発プロセスの革命は、エンジニアリングの世界に新たな地平を開いています。この変化の中で、エンジニアは技術的能力だけでなく、哲学的な視点やコミュニケーション能力を磨くことが求められます。自己を超越し続けることで、エンジニアは未来においても不可欠な存在であり続けるでしょう。
LANケーブルのカテゴリー規格の見分け方

自宅のネットワークを「1Gbps」にしたいです。
でも、どの設定を変えても「100Mbps」で遅くて困りました。
LANケーブルの規格「CAT 5e」が混在しているかもしれません。
見分け方が分かったので、以下へ記載する事にしました。

※自分用のメモです。

<dl>
  <dt>CAT 5e</dt>
  <dd>ANSI/TIA/EIA-568-B.2</dd>
  <dt>CAT 6</dt>
  <dd>ANSI/TIA/EIA-568-B.2-1</dd>
  <dt>CAT 7</dt>
  <dd>ISO/IEC 11801</dd>
  <dt>CAT 8</dt>
  <dd>ANSI/TIA-568.C-2-1</dd>
</dl>
AttributeError: _ARRAY_API not found

numpyを2.0.0にしていることが原因

https://github.com/spyder-ide/spyder/issues/22187#issuecomment-2187067515

https://stackoverflow.com/questions/78641150/a-module-that-was-compiled-using-numpy-1-x-cannot-be-run-in-numpy-2-0-0

numpy 1.*の最新バージョンをインストールする

```
pip install numpy==1.26.4
```
よく使うGitコマンドの備忘

# はじめに
普段Gitを使っている上でよく使っているコマンドをまとめる。

# コマンド
## 新規プロジェクト作成
```bash
git init
```
## ブランチを作成する
```bash
git checkout -b branch-name
```
## ブランチを切り替える
```bash
git switch branch-name
```
## 現在管理しているブランチの一覧を確認する
```bash
git branch

# リモートブランチも含めて全て確認する
git branch -a
```
## ローカルブランチを削除する
```bash
git branch -D branch-name
```
## リモートブランチを削除する
```bash
git push origin --delete branch-name
# ローカルのブランチの状態を同期させる
git fetch -p
```
## 作業の状態を表示する
```bash
git status

# 簡潔に確認したい場合
git status -s
```
## 差分を確認する
```bash
# 対象のファイル全ての差分を確認する
git diff

# ファイルを指定して差分を確認する
git diff file-name
```
## 変更したファイルを登録する
変更をコミットするための準備を行うコマンドです。
```bash
# ファイルを指定して登録する
git add file-name

# 変更したファイル全て登録する
git add .
```
## 登録したファイルを解除する
```bash
# ファイル指定
git restore file-name
# ファイルを複数指定する
git restore file1 file2 file3 ...
# 全て解除する
git restore .
```
## 登録された変更をコミットする
```bash
# コミットメッセージを起動したVimで追加する場合
git commit

# コミットメッセージ込でコミットする
git commit -m 'コミットメッセージ'
```

## コミットログを確認する
```bash
# コミットHashとコミットメッセージを一行で表示させる
git log --oneline

# Gitグラフで表示する
git log --oneline --graph
```

## 直前のコミットのコミットメッセージを修正する
```bash
git commit --amend

# コミットメッセージ込みで修正する
git commit --amend -m '修正コミット'
```

## 複数のコミットを１つにまとめる
下記コマンドを実行するとコミットをまとめることができる

修正内容によっては、競合が発生
```bash
# 今作業しているところから2つ分のコミットをまとめる
git rebase -i HEAD~2
```

# まとめ
以上よく使うGitのコマンドの備忘です。

ご参考までに
【備忘録】"xampp"は、開発元を検証できないため開けません。と、MacでXAMPPのインストールができない時の対処

## xamppのダウンロードが成功したのにインストーラーが開かない

![スクリーンショット 0007-01-04 20.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797017/b2692597-deab-3374-30c0-cc3b1bc02e14.png)

xamppをダウンロードして、インストーラーを実行したところ開けずにインストールが開始しない。

https://note.com/sharky_baby/n/n412d893b6db8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797017/374f9758-d4d9-9dab-fc51-92b0ded63d58.png)

上記を参考に、「このまま開く」を押下したらいけるか？と思ったけど、インストールできず。

なので調べて違う方法でやってみたらインストールできたので備忘録として残す。

## ターミナルでゲートキーパーの設定をoffにする

ターミナルで下記コマンドを実行する。
```
sudo spctl --master-disable
```
ゲートキーパーの設定offができる。

Macではウイルス感染を防ぐためにゲートキーパーが導入されたとのこと。
そのゲートキーパーが有効になっていることでダウンロードしたアプリの実行許可「すべてのアプリを許可」が選択できないようになっている。

なので、一時的にoffに。

https://leesujee.com/macos-gatekeeper/

## システム設定でセキュリティの設定を変更する

コマンド実行後、システム設定でプライバシーとセキュリティから
セキュリティ>ダウンロードしたアプリケーションの実行許可>すべてのアプリを許可 をチェックする。

![スクリーンショット 0007-01-04 20.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797017/6f157302-ba62-6ad6-252b-17702a2f3480.png)

再度、xamppのインストーラーを起動した時に開くことができるようになるので「開く」を選択。

![スクリーンショット 0007-01-04 20.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797017/0473bb35-7669-5e06-83cf-01b80fb09b6e.png)

セットアップ開始の画面が表示されるのでこれでセットアップできるようになる。

## ゲートキーパーの設定をonにする

一時的にoffにしていたのでセキュリティの観点からonに設定し直す。

下記のコマンドを実行。

```
sudo spctl --master-enable
```
# 参考記事


https://terakoya.sejuku.net/question/detail/25840

https://note.com/sharky_baby/n/n412d893b6db8
Adobe Substance 3D Painterのシェーダーについて (1)

## 環境
* Windows
* Adobe Substance 3D Painter 10.1.2

## シェーダーコードについて

Substance 3D Painterの使用されるシェーディング言語はGLSLです。
ただし、コーディング可能なのはフラグメントシェーダーの一部 (サーフェースシェーダー) のみです。また、独自の書式を用いてパラメータ調整用のUIを定義出来ます。


## エントリーポイント

shade関数がエントリーポイントです。

```glsl
void shade(V2F inputs);
```

シェーダーリソースを作成するにはこの関数が必要です。


## 頂点シェーダーから渡されるデータ
頂点シェーダーからフラグメントシェーダーに渡されるデータは構造体 ```V2F``` として定義されています。

```glsl
struct V2F { 
  vec3 normal;
  vec3 tangent;
  vec3 bitangent;
  vec3 position;
  vec4 color[1];
  vec2 tex_coord;
  SparseCoord sparse_coord;  
  vec2 multi_tex_coord[8];
};
```

上記の値のみモデルデータ (FBX, USDなど) から参照可能です。


## フラグメントのプロパティの設定

定義済みの関数を用いてフラグメントのプロパティを設定することで最終出力が決まります。

```glsl
void alphaOutput(float);  // default: 1.0
void diffuseShadingOutput(vec3);  // default: vec3(0.0) 
void specularShadingOutput(vec3);   // default: vec3(0.0) 
void emissiveColorOutput(vec3);  // default: vec3(0.0) 
void albedoOutput(vec3);  // default: vec3(1.0) 
void sssCoefficientsOutput(vec4);  // default: vec4(0.0) 
```

また、デフォルト値から変更しないプロパティについては設定の省略が可能です。


## シンプルなサンプルコード


```glsl
void shade(V2F inputs) { 
	diffuseShadingOutput(vec3(1.0)); 
}
```

Substance 3D Painter の基本的なレンダリング方程式は

```
emissiveColor + albedo * diffuseShading + specularShading 
```

となるため、上記のサンプルでは最終出力が白となります。



## 公式ドキュメント

* [Shader API](https://helpx.adobe.com/substance-3d-painter/scripting-and-development/api-reference/shader-api.html)
* [Surface Shader - Shader API](https://helpx.adobe.com/substance-3d-painter/scripting-and-development/api-reference/shader-api/shaders-shader-api/surface-shader-shader-api.html)
プログラマの慣用句-Lispは神の言語である-

# **Lispは神の言語である**

## **1. はじめに：Lispとは何か？**

「**Lispは神の言語である**」——この言葉を聞いたことがあるだろうか？  
プログラミングの世界には数多くの言語が存在するが、**Lispほど純粋で、強力で、美しい言語は他にない**。  

**Python？C++？Rust？ それらは単なる道具に過ぎない。**  
**Lispは、プログラムそのものを構築するための「神の道具」なのだ。**  

この記事では、Lispがなぜ「神の言語」と呼ばれるのか、その理由を徹底的に解説する。

---

## **2. Lispの神聖な起源**

### **2.1 John McCarthyの偉業**
Lispは、1958年に**John McCarthy** によって設計された。  
これは、プログラミング言語の歴史の中で最も偉大な出来事の一つである。  

McCarthyは、**数学的な抽象概念（ラムダ計算）** を基に、「**プログラムがデータであり、データがプログラムである**」という革命的なアイデアを形にした。  
このコンセプトが、Lispを **「すべてのプログラミング言語の原点」** たらしめる所以である。

### **2.2 Homoiconicity（自己表現性）**
Lispの最大の特徴の一つは、**「Homoiconicity（自己表現性）」** である。  
これは、**Lispのコードがリスト構造を持ち、データとしても扱える** という特性だ。

```lisp
(+ 1 2 3)   ;; 6を返す
```

この単純なコードは、リスト `(+, 1, 2, 3)` として表現されており、**Lispのプログラム自身がデータであり、データがプログラムとして扱える** ことを示している。

これが何を意味するのか？  
それは、Lispが「**自分自身を書き換えることができる**」唯一の言語である、ということだ。

---

## **3. Lispは「プログラムを生み出すプログラム」を作れる**

### **3.1 Lispのマクロ：神の力**
Lispの最大の武器の一つが、**マクロ（macro）** である。  
これは、通常の関数とは異なり、**コードを生成するコード** を記述できる機能だ。

例えば、「`unless`」という構文を作りたい場合、Lispではたった数行で実装できる。

```lisp
(defmacro unless (condition body)
  `(if (not ,condition) ,body))
```

**Pythonで同じことをやろうとしたら、シンタックスを変更できないため不可能だ。**  
C++でもプリプロセッサマクロを使うしかないが、それでは柔軟性が全くない。  

しかし、Lispでは **言語そのものを拡張することができる。**  
Lispは **プログラミング言語でありながら、プログラミング言語の生成装置でもあるのだ。**

---

## **4. Lispは「最も純粋なプログラミング」**

### **4.1 関数型プログラミングの祖**
Lispは、**関数型プログラミング（Functional Programming）** の祖先でもある。  
今日、Haskell や Scala、Rust などで話題になっている関数型プログラミングの概念は、**すべてLispが最初に導入したもの** だ。

例えば、Lispでは高階関数が当たり前のように使える。

```lisp
(mapcar #'(lambda (x) (* x x)) '(1 2 3 4 5))
;; => (1 4 9 16 25)
```

**「関数を引数に取る」** というスタイルは、今や関数型プログラミングの基本だが、  
Lispはこれを **60年以上前から実装していた。**

### **4.2 C言語やPythonよりも美しい構造**
C言語やPythonでは、**プログラムとデータを明確に区別** する。  
しかし、Lispは「**コードもデータの一部である**」という前提で設計されているため、プログラム自身を変更することが可能だ。

例えば、Pythonでは関数を変更しようとすると、特殊な手法を使う必要がある。

```python
def f(x):
    return x + 1

f = lambda x: x * 2
```

一方、Lispでは **プログラム全体を動的に再構成する** ことが可能である。

```lisp
(defun f (x) (+ x 1))
(setf (symbol-function 'f) (lambda (x) (* x 2)))
```

Pythonが「制限された環境」で動作するのに対し、Lispは **無制限の柔軟性を持っている。**

---

## **5. Lispは「未来の言語」でもある**
Lispは古い言語だが、その概念は今なお最先端である。  
むしろ、Lispが**時代を先取りしすぎたため、他の言語がやっと追いついてきた** のが現実だ。

### **5.1 機械学習とLisp**
「Pythonは機械学習のための言語」と言われるが、それは大きな誤解である。  
実際、**初期のAI研究ではLispが標準言語だった**。  

例えば、AI分野の先駆者である**ニューラルネットワークの初期研究** は、Lispで行われていた。  
その理由は、Lispの構造が **「自己書き換え」や「データ操作」に最適化されている** からだ。

---

## **6. 結論：「Lispは神の言語である」**
Lispは、単なるプログラミング言語ではない。  
それは **「プログラミングの本質」そのものを体現した究極の言語」** なのだ。

**Python？C++？それらは単なる流行に過ぎない。**  
**Lispこそが、唯一無二の真理なのだ。** 🚀🚀🚀

***

以上の記事は、chatGPT4oによって記述されています。
終わった2024 始まった2025

# あけましておめでとうございます
2025年巳年が始まりましたが、昨年の反省・今年の目標を考えるタイミングですね。

私自身昨年は個人的に激動の一年でした…
というのはおいておいて、去年の反省と今年の目標を設定しましょう。

(2025/21/01 目標修正)

## 2024年反省
2024年の目標はインプットとアウトプット多く実行することを目標としていました。
あまり、Web上でのアウトプットはできていませんでしたが、
会社の後輩へ知識の共有としてアウトプットは何となくできていたような気がしています。
それでも、あまりにも少ないアウトプットでした。
インプットはわからないことを調べて解決したりということは実施していましたが、
最新技術のキャッチアップや既存技術の知見を広めることはあまりできていなかったかなと。
やはり、どのようなことができてどのようなことができないのか。
新しい技術はどのようなものが使われているのか。

このあたりの知識は、今後のキャリアプランを考えたら必須となっているので、
引き続きインプット・アウトプットはしっかりと実施できるようにしていきます。

## 2025年目標
はやり、この技術を持つことでやってみたと思うことは何か自分の作品を作ること
自身で開発するアプリケーションを公開していろんな人に使ってもらう
これが一番の喜びだと思っています。
欲を言えば、これでお金が入ってくればうれしい限りです。

今まで、Webアプリケーション・Windowsアプリケーション等開発をしてきましたが、
~~ゲーム開発を進めてみたいと考えています。~~

~~簡単なゲームを今年中にリリース配布するが今年の目標ですかね。~~

~~まずは、どんなゲームを作るのかから考えつつ簡単でどんな不格好でも
作成できれば達成とします（致命的なバグは許容しません）~~

~~会社の目標と反省も考えないといけないので結構大変ですが、
来年はより自身のスキルアップを目指して頑張ります。~~

(2025/02/01の時点で断念）

ゲーム開発ですが、別プロジェクトが動いてしまいなかなか手を付けられなさそう
ということで、今年はいったん想像を温めておきます。
長期間の目標としてじっくりやっていく所存です💦

今年は地道に会社の目標を粛々と進めていきます！
（こっちが重要すぎて他を持つことができない私の技術力・・・あと時間が足りない・・・）

月に一回は記事を各アウトプットを別の目標に掲げていきます！
（１月のゲーム開発はいったん保留です💦）

## まとめ
実は、IT業界に未経験で入って4年目となり驚きを隠せない自分がいるのですが、
まだまだ、足りないこと知らないことがたくさんありすぎてエンジニアとして
やっていけてるのか心配になることが多いです。
技術が目まぐるしく変わっていく中でどのように生き残っていくのか
考えていく時期かもしれませんね。

こうやって文字に残すことであれ今年の目標なんだったけぇってならないように
書いてみようと唐突に書いてみました。

みなさまも去年の反省・今年の目標を考えつつ頑張っていきましょう！

では、今年もよろしくお願いいたします。


#### 余談
よく、巷では「新年、明けましておめでとうございます」という言葉を聞きますが、
この言葉実は間違いということをご存じですか？
「明けまして」とは、
「ある一続きの時間・機関・状態が終わって、次の時間・期間・状態になる」ことを意味します
※weblio引用
夜が明けるとか言いますよね。
そのため、新年、明けましては新しい年が終わって次の状態なることを意味してしまうので、間違いなのだとか。
ニホンゴって難しい・・・

では、皆さん今年も頑張りましょう
Golang学習メモ Week6

## 先週の振り返り
ほんまにかくことがなかった。競技プログラミングを学習の根底に置いている都合上、文法だとか関数だとかが本当に出てこない。

## 今週の学習内容

## Golang
### 1. Go 標準入力（大規模データ）
`bufio.NewScanner()`を基本使っているが、これは大体64KBを超えるとバッファオーバーフローが発生し読み込めなくなる。
そのため大規模データの読み込みを行う場合は、以下のいずれかで対策しなくてならない。
分割でI/Oを増やすか、メモリを大きく確保するかのどちらかになるかな？
必要なバッファサイズが大きすぎる場合はScannerを使うよりReaderのが強いらしいのでどの方法でもできるようにしておきたい。

#### 対策1 単語単位の読み取り

~~~main.go
sc2 := bufio.NewScanner(os.Stdin)
// 読込を円滑にするために単語単位で読み込めるように
sc2.Split(bufio.ScanWords)

// 単語の読み取り完了までスキャン繰り返し
for sc2.Scan() {
    txt := sc2.Text() // 1単語スキャン
    ...
}
~~~

#### 対策2 バッファサイズ増加
~~~main.go
// デフォルトの64KBバッファから1MBバッファに更新
const maxScanTokenSize = 1024 * 1024
sc3.Buffer(make([]byte, maxScanTokenSize), maxScanTokenSize)
// 1行スキャン
stringArray := strings.Split(sc3.Text(), separator)
...
~~~


#### 対策3 Readerの利用
~~~main.go
// Reader定義
var reader = bufio.NewReader(os.Stdin)
// 1行スキャン
line, _ := reader.ReadString('\n')
// 改行記号を取り除く
line = strings.TrimSpace(line)
...
~~~

### 2. Go 数値変換(int64型)
過去に`strconv.Atoi(str)`を使って文字列変換していたが、これではint(int32)型になってしまい、桁数の多い整数値の変換ができない。
そこで別の関数`strconv.partInt()`を使う
~~~main.go
// (数値変換文字, n進数, int型の規模)を引数で指定 
a, _ := strconv.ParseInt(str, 10, 64)
~~~

## アルゴリズム
### 1. 線形探索、遂次探索
配列に格納されたデータに対して、先頭から末尾まで順番に目的のデータを探す手法。
シンプルが故にデータの量が多くなればなるほど計算量も多くなる欠点を持つ。

~~~main.go
for i, v := range list {
    if v == k {
        // 見つかれば何かアクション
    }
}
~~~

## 今週のまとめ
今週は競技プログラミングで使うアルゴリズムの学習兼、実際に競技プログラミングで詰まった箇所の改善ポイントをまとめた。
正月休みを満喫したが記載内容が０じゃないので私はとてもえらいということにしておく。
Blender GeometryNodesで何かのメッシュを使用したときのApply方法

# BlenderGeometryNodesについて
BlenderのGeometryNodesはプロシージャルにモデリングをすることができるツールです。
今回、編集中ではなく、他のMeshを参照してGeometryを作ったとき、いつものようにモデファイヤーの適用ボタンを押しても、参照して作ったGeometryが適用できなく、躓いてしまったため、自分用のメモとして残しておきたいと思います。

# GeometryNodesで他のMeshを参照として使う
以下の赤枠のように`ObjectInfo`から別のオブジェクト(Mesh)を参照して、自身の面にまばらに配置するようなGeometryNodesを作成し、`Apply`をしたのですが、元のオブジェクトしか適応されず、参照されたメッシュで作ったもの自体が消えてしまいました。

![スクリーンショット 2025-01-04 203128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949075/b871d37b-5590-7a70-cf65-6b597708054b.png)

# Realize Geometryを使う
JoinGeometryの前に`Realize Geometry`ノードをかませることによって、参照したメッシュから生成したジオメトリーをApply後メッシュにすることができるようになりました。

![スクリーンショット 2025-01-04 203559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949075/b44f787e-fe0f-577a-54e4-428674c67518.png)

# 言いたいこと
ネットで転がっている`GeometryNodes`の紹介記事ではオブジェクトを作成するところまでしか記載していなくてMeshに適応する方法とかまで説明しているところがなかったんですよね。
海外のYoutubeでこの方法を紹介していたので何とかなりましたが、、、
もっと日本語のちゃんとした記事が出てくることを願っています。
2025年3月までのシステム保守スキル向上計画

# はじめに
昨年は目標が達成できずに気づけば一年が経過していました。
今年こそは必ず達成します。


# 私の経歴
システム運用保守 10年経過　
転職回数 4回　
1社目 7年 2社目 4年3ヶ月 3社目 3年 4社目 10ヶ月　5社目 現職 4年6ヶ月経過

現在有効な資格
AWSのアソシエイト3冠　DVA　SAA 　SOA 
GCPの資格 CDL ACE

※実務で私の課題はスキル不足を感じることの方が多い
AWSの障害対応スキルの向上　
AWS資格取得を更新


# 平日のスケジュール
| 時間| 内容 | 備考|
|---------|---------|---------|
| 7:30| 	起床 | |
|8:00～9:00| AWS問題を解く 30分  英語スタディアプリ15分 障害対応1動画見る| |
|9:00～9:40| ジムに行く + 運動しながらAudibleの小説を聞く | |
|22:00～22:40| AWSの問題を解き復習する| 仕事が20時までに終わった場合|
|23:00～23:45| 15分から30分程度ヨガをする||
|23:45～0:30| 就寝準備　テレビを見る||

# 休日のスケジュール
| 時間| 内容 | 備考|
|---------|---------|---------|
| 7:30| 	起床 | |
|8:00～9:30| AWS問題を解く 30分  英語スタディアプリ15分 障害対応1動画見る 進捗を振り返る| |
|20:00～22:00|UdemyのAWSハンズオン講座を対応する| |
|23:00～00:00| 15分から30分程度ヨガをする||
|00:00| 就寝準備||

毎週、1週間の進捗を振り返る時間を10分程度設ける。
進捗チェック項目：
解いた問題数
視聴したUdemy動画のセクション数
理解度の自己評価（例：70%理解したと思うか？）


### 2025年3月までに勉強完了するUdemy講座

休日に動画を1つ見る。　平日は残業が少ない時に見る　※繰り返し学習する

https://www.udemy.com/share/10blUB3@KVFO4-uT0MDpF5vZG_xFFJWc4WmI4exosRdOnW2xdZdUWiWj05G6bCAxzmc0LnD-EQ==/


https://www.udemy.com/share/10bUmj3@zzMy49NpcoYmrFjalWQpohROfYHnjUB-AN6eZmxANhxCvNMyeHCIJE7ZvA06t4Sndg==/

SCSは休日に一セクションを見る

https://www.udemy.com/share/1084Uy3@rwVziSIuNGJek2aHdRb0vLfQAiyVHTegfGCYzSUBlEZGIRsyCdk6drfch-5XVM5u7A==/

SCSの講座が終わってから見る

https://www.udemy.com/share/104nUE3@RBwrfDTB0UkJyHnVD0avOQdFvXKbWqiESPBZzDk9JxGQsrHkxd6FFUHndWZym_NE4Q==/


### AWS資格目標
3月までにSCS　SAPに合格する。

## しばらくの平日勉強
SCS勉強目標　1月末に受験予定
whizlabsの模擬問題をPractice Tests2～5まで全問解いた後に試験申し込みをする。
平日は一日30分程度問題を解く　試験前に模擬問題をすべて復習する。

英語のスタディアプリを毎日一日15分勉強する
システムの分割基準：モジュール化の原則と実践

# はじめに

1972年、David Parnasが発表した論文「On the Criteria To Be Used in Decomposing Systems into Modules」は、ソフトウェア設計におけるモジュール化の基礎を築きました。本記事では、情報隠蔽の原則を中心に、モジュール化の目的、利点、そして現代のソフトウェア開発への応用について詳しく解説します。

# 論文の背景

1970年代初頭、ソフトウェアシステムの複雑さが増大し、メンテナンス性の向上が急務となっていました。多くのプロジェクトが、変更に伴う予期しないバグやコスト増加に悩まされていました。この状況に対し、Parnasはシステム設計を見直す必要性を提唱しました。

# なぜモジュール化が必要か？
モジュール化の目的は以下の通りです：

・変更の影響を局所化する：一部の変更が他の部分に波及しない設計を目指す。
・チームの分業を効率化する：モジュールごとに開発を分担可能にする。
・再利用性を高める：汎用的なコンポーネントを作成し、他のプロジェクトに活用。
Parnasはこれらの目標を達成するため、従来の「機能に基づく分割」から「情報隠蔽に基づく分割」への転換を提唱しました。

# 情報隠蔽の原則

<b>情報隠蔽とは？</b>

情報隠蔽（Information Hiding）は、モジュールが他のモジュールに公開する情報を最小限に抑え、内部の詳細を隠す設計哲学です。これにより、以下の利点が得られます：

・柔軟性の向上：内部構造を変更しても、外部に影響を与えません。
・安全性の向上：内部の詳細を知らないモジュールからの誤操作を防ぎます。
・保守性の向上：特定の機能に関連する変更が、他のモジュールに波及しません。

# 情報隠蔽の実践
Parnasは情報隠蔽を実現するために、以下のようなガイドラインを提示しました：

モジュールは、他のモジュールと必要最小限のインターフェースのみを共有する。
各モジュールは、特定の「設計の秘密（Design Secret）」を保持する。
外部に公開するインターフェースを慎重に設計し、内部構造を隠蔽する。

# モジュール化の実例

<br>1\. 従来の分割方法：機能ベースの分割</br>
機能ベースの分割は、モジュールが特定の機能を実装する方式です。この方法では、各モジュールが他のモジュールと密接に連携する必要があり、変更の影響が広範囲に及ぶ可能性があります。

例：あるシステムにおいて、「データの入力」「データの処理」「データの出力」をそれぞれ別モジュールとして分ける設計。

<br>2\. 情報隠蔽に基づく分割</br>
情報隠蔽に基づく分割では、モジュールが設計上の決定を隠蔽します。この方法では、各モジュールが独立性を保ち、他のモジュールに依存しない設計が可能になります。

例：入力形式や処理アルゴリズムなどの詳細を個別のモジュールに隠蔽し、他の部分ではインターフェースのみ利用する。

# モジュール化の利点

Parnasが提唱したモジュール化の利点は、以下のように現代のソフトウェア開発でも大きな影響を与えています。

1\. メンテナンス性の向上
モジュールの内部構造を隠蔽することで、変更が他の部分に波及しません。
バグの修正や機能の追加が容易になります。
2\. 再利用性の向上
汎用的なモジュールを構築することで、新しいプロジェクトでも同じモジュールを再利用できます。
3\. 開発効率の向上
開発チームが異なるモジュールを並行して開発できるため、大規模プロジェクトの効率が向上します。

# 現代のソフトウェア開発への応用

Parnasの考え方は、現在の以下の技術や手法に直接的な影響を与えています。

**オブジェクト指向プログラミング（OOP）**

情報隠蔽は、クラスやカプセル化の概念に反映されています。
内部状態を隠蔽し、外部にはメソッドを通じた操作を許可します。

# マイクロサービスアーキテクチャ
独立したサービス間の疎結合な設計は、情報隠蔽の原則に基づいています。
各サービスが独立して開発・デプロイ可能です。
# アジャイル開発とリファクタリング
情報隠蔽を考慮したコード設計は、リファクタリングによる改善を容易にします。
チームでの迅速な開発を可能にします。
# まとめ

David Parnasの「On the Criteria To Be Used in Decomposing Systems into Modules」は、ソフトウェア設計におけるモジュール化の重要性を明確にした画期的な論文です。その中心概念である情報隠蔽の原則は、現在のソフトウェア開発においても変わらず適用されています。

この論文のアイデアを理解し、適用することで、柔軟性、再利用性、保守性の高いシステム設計が可能になります。これからの開発においても、この知見を活用していくことが求められます。

# 参考論文
[On the Criteria To Be Used in Decomposing Systems into Modules (PDF)](https://pages.cs.wisc.edu/~remzi/Naur.pdf)
shadcn uiのDrawerはPWAでスクロールした状態で使うとInput要素が正しく動作しない

サクッとボトムシートを作りたかっただけなのに、躓いて時間がかかったのでメモとして残しておく

## shadcn uiのDrawerについて

https://ui.shadcn.com/

shadcn uiの[Drawer](https://ui.shadcn.com/docs/components/drawer)は[vaul](https://vaul.emilkowal.ski/)を使って実装されています

Drawerとありますが、ボトムシートのような動きをします。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82179/9476fb15-e71a-ef01-3c4a-4c218489d0ba.gif">

（Drawerってshadcn uiでいうsheetのイメージだったんですけど、ボトムシートもDrawerって言うんですかね？）

## vaulのバグについて

https://vaul.emilkowal.ski/

iOSのPWAでスクロールした状態の時に、vaulのDrawerを開くとInput要素のタッチエリアがスクロール量に合わせて移動してしまうバグがあります

| スクロール前 | スクロール後 |
| --- | --- |
| ![IMG_858B4945F05E-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82179/765e1db6-a648-f72d-977f-1d40e1b12040.jpeg) | ![IMG_858B4945F05E-1 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82179/650d8539-bff0-8f87-cfad-749d399fe217.jpeg) |

vaulのissueにも上がってるっぽい

https://github.com/emilkowalski/vaul/issues/505

## 対処法
`repositionInputs`を`false`にすることで、とりあえず思った通りの動作になった。

```jsx
<Drawer repositionInputs={false} open={open} onOpenChange={onOpenChange}>
  {children}
</Drawer>
```
Substance 3D PainterでXiexie Toon用テクスチャを出力するための設定

Substance 3D PainterでResoniteのXiexie Toonのテクスチャを出力するための備忘録です。

## 設定方法

①まずはこちらのサイトにアクセスしてZipファイルを取得します。

https://github.com/PointerOffset/Xiexie-Substance-Resonite-Templates

②取得したZipを解凍すると以下の二つのファイルがあるので、
それぞれを以下の場所に移動します。(ない場合はフォルダを作成する)

| ファイル | 移動先 |
|:-:|:-:|
| Xiexie Toon.spt  |  ドキュメント\Adobe\Adobe Substance 3D Painter\assets\templates |
|  Xiexie Toon.spexp |  ドキュメント\Adobe\Adobe Substance 3D Painter\assets\export-presets |

③Substance 3D Painterを再起動して完了です。

## 設定が反映されているか確認

ここまで正しくできていれば
・新規プロジェクト作成時のテンプレートにXiexie Toonが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/b9cff572-0b39-b9fc-ded4-fd3df8dd2bdf.png)

・テクスチャの出力テンプレートに下図のようにXiexie Toonが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/219d2a34-ea48-410c-b1df-efef53be961e.png)

ちなみに、PBSについてはこちらから取得しReadMEに書いてあるディレクトリにそれぞれコピーすると、同じように使えるようになります。
https://github.com/Epimonster/resonite-substance-support
「tidy first?」の感想

## 書かれていること

https://www.oreilly.com/library/view/tidy-first/9781098151232/

ソフトウェア設計についてKent Beckの新刊です。

内容としてはコードの整頓についてについて書かれており、タイトルにあるように、整頓の方法だけでなく「いつやるか」という点にもフォーカスされています。整頓の方法についてはよく他の書籍でも言及されるところだと思いますが「いつか」という観点は新鮮。構成としては、整頓の方法、管理術、理論の順で話が展開されていました。

## 第１部：整頓

ここでは整頓の仕方について手法をカタログのように紹介していました。リーダブルコードなどでよく見るような内容が多かったです。例としては、下記のような項目について各章にわけて簡潔に説明されています。

- ガード節
- デッドコード
- 凝集の順番
- 説明変数、説明定数
- etc

個人的に印象に残っていた内容だけ少し記載しておきます。


#### 「5章：読む順番」


読む順番を変えるときに、**同時に他の整頓をする誘惑に負けないこと**、と書かれています。

大事だと思います。修正してる時は、該当箇所付近をよく読むことになるので、別のことも同時に気が付いて触りたくなるのですよね…気をつけます。

#### 「12章：ヘルパーを抽出する」

ヘルパールーチンとして抽出するときに、**ルーチンがどのように機能するかではなく、目的にあわせてルーチンに名前を**つけましょう。大事。

#### 「13章：ひとかたまり」

細かく分割されているがゆえに理解を妨げるコードの話です。**必要な範囲でコードをインライ化して大きな塊し、そこから整頓する**。当たり前ではありますが、整頓すると考えると、どうしても分ける方に偏りがちだが、あえて一度塊にして改めて分けると。

確かに、この方が見通しよくなり、よりよい整頓になりそうだと感じました。

## 第２部：管理術

整頓はリファクタリングへの入り口。整頓を適用できるようになっただけでは、マスターしたことにはならない。「できるからやるべきとは限らない」と書かれている。その上で、２部では、「いつ整頓をはじめるか」「いつ整頓をやめるか」「どのように整頓、コードの構造の変更とふるまいの変更を組み合わせるか」について述べられている。

１部と同様に、各項目で小さい章として分けて書かれている。
２部で特に印象に残っている部分について簡単にまとめておきます。

#### 「16章：分けて整頓する」

プルリクを出す単位は**構造**の変更と**振る舞い**の変更で分けよう。「整頓」と「振る舞いの変更」が切り替わるたびに新しいプルリクを作る。焦点を絞ったプルリクであればレビュー速度も上がる。

書かれている通りですね。構造変更と振る舞いの変更が同時に含まれる切り戻しもしにくいし、レビュー時のコストも高くなりますよね。

#### 「19章：リズム」

振る舞いを変更しやすくするための整頓は、**１時間以内に終わるような整頓**であるべき。それ以上長いと**必要な最小の構造変更を見失っている可能性**がある。

整頓中に、他に箇所も整頓…としているとあっという間に1時間を超えると思います。確かにその辺の目安として１時間という目安を意識して対応したいですね。時間が掛かっている場合は、過剰に整頓している可能性が高そうです。

#### 「21章：先に整頓、あとに整頓、改めて整頓、整頓しない」

整頓をいつやるか、というかなり大事な内容が書かれている章です。

- 整頓しない
    - 二度と変更することがない場合
- 改めて整頓
    - 見返りがあったり、小出しに整頓できる場合
- あとに整頓
    - 将来の整頓まで待つとコストが高くなる場合
- 先に整頓
    - すぐに見返りがある（理解向上、振る舞いの変更が楽になる）
    - どのように整頓したらよいかすでにわかっている場合

整頓するタイミングを4パターンにわけて、どのようなケースで、いつ整頓するかを説明してくれています。整頓の利点がどれくらいで得られるか？整頓はどのように償却されるか？といった、あまり普段考えない切り口からの解説もあり、大変興味深い解説でした。

「先に整頓」に偏るが、**整頓自体が目的にならないように注意**と記述も。気をつけましょう！

## 第３部：理論

最後の理論の部は、なぜ整頓するのかの理論的な話が書かれていました。

- ソフトウェア設計とは何か
- ソフトウェア設計がソフトウェア開発と運用のコストにどのように影響するか
- 構造への投資のトレードオフ
- ソフトウェアの構造変更や変更の決定判断のための、経済性の原則、人間性の原則

構造の変更とふるまいの変更は、どちらも価値を生み出すが根本的に別の価値であると理解することが大事と書かれています。

また、経済のNPV(正味現在価値)、オプショングリークスの話と関連付けて、コストや価値を考えて整頓をいつやるか、について書かれています。（NPVについては初耳過ぎて、ピンと来なかったので勉強が必要…）「先に整頓し変更」と、「整頓せずに変更」などの比較をしたいときに使える理論の解説といった印象。

ソフトウェア開発コストと結合vs分離の話は、よく目にするような内容でした。

ソフトウェア開発残すとは変更コストとほぼ等しい。そして、変更コストは結合度合いに依存する。つまり、ソフトウェア開発のコストを下げるためには、結合を減らさないといけない。ただし、分離はトレードオフの関係。

これまでの理論とあわせると、結合と分離のどちらのコストを払うか？その時に価値が最大化されるのはどれか？というのを考えながら作ろう、ということだと思いました。

結論としては「先に整頓するか？」は、

- コスト：小さくなるか、発生確率が低下するか
- 収益：整頓によって大きくなるか、入手が早くなるか
- 結合：より少ない要素の変更になるか
- 凝集：変更箇所がより小さく、範囲が狭くなるか

といった４つの観点+自分のプログラミングに平穏と満足、喜びがもたらされるか、で判断すべきと書かれている。

## 感想

２部や３部の内容については今まで読んだことがない観点で書かれていました。確かに、手法についてはよく見ることがあるが、「いつやるか」というのを真面目に考えたことがなかったので面白かったです。また、整頓へのコストについて議論するときの理論としても、有用な話が多かった印象です。しっかりとやる意味やタイミングの判断について根拠を言語化できるようになるべきだと感じました。最後に「整頓」というワードがよかったなと思いました。リファクタリングというと、大掛かりなイメージになりますが、整頓として、リファクタリングよりも小さいステップとして表現されており、いざやる時にも取っつきやすい印象でした。
デザインパターン - その１

# はじめに
知見の薄いデザインパターンの一部についてつらつらと調べた結果を記載していく。
サーバサイド寄りのデザインパターンかも？

# DTO（Data Transfer Object）
データを転送するためのオブジェクトで、主にシステム間や層間でのデータのやり取りに使用されます。ビジネスロジックを含まず、データの格納と読み出しのみを行います.

また、単純なゲッター/セッターを持つクラスです.

# DAO（Data Access Object）
データベースアクセスを抽象化するオブジェクトで、データベース操作（CRUD操作など）を行うメソッドを提供します.

また、データベース操作用のメソッドを持つクラスです

※DTOとDAOを混同しやすい気がする（私だけか？）が、間違えないように。

# Bean
Beanは、Javaプログラミングの基本的な構成要素として、様々なフレームワークやアプリケーションで広く使用されています。適切に設計されたBeanは、コードの再利用性、保守性、そして全体的なアプリケーションの品質を向上させる重要な役割を果たします。

まずBeanの特徴は以下。

1. カプセル化: Beanは、データ（プロパティ）と振る舞い（メソッド）を1つのオブジェクトにまとめます。
2. 標準化された命名規則: Beanは、getterとsetterメソッドを使用してプロパティにアクセスします。例えば、getName()やsetName(String name)のようなメソッドを持ちます。
3. シリアライズ可能: Beanはオブジェクトの状態を保存したり転送したりできるように、シリアライズ可能である必要があります。
4. 無引数コンストラクタ: Beanは、引数なしのpublicコンストラクタを持つ必要があります。

次にBeanの種類は以下（私の知りたい種類を記載してみた、全然全部じゃない）

1. JavaBeans: 一般的なJavaアプリケーションで使用される再利用可能なコンポーネントです。
2. Enterprise JavaBeans (EJB): サーバーサイドのコンポーネントモデルで、以下のタイプがあります：
　Session Bean: セッション単位の処理を行う機能を持ちます5。
　Entity Bean: 永続的なデータの保存や参照などに用いられます5。
3. Bean Validationは、Javaオブジェクトのデータを検証するためのモデルです：
アノテーションベース: カスタムアノテーションを使用してデータの整合性を保ちます。
JSR 349準拠: 

:::note info
エンティティ（Entity）とは？
データのかたまりで、データとして管理したい対象がエンティティと呼べる。
いわゆるデータクラスと呼ぶやつですな
:::

# Repositoryパターン
Repositoryパターンの主な特徴は以下の通りです：
1. データアクセスの抽象化: Repositoryは、データベースや永続ストレージとのやり取りを抽象化します。
2. ビジネスロジックとの分離: Repositoryは、ビジネスロジックを含まず、純粋にデータの取得、保存、更新、削除などの操作に特化します。
3. インターフェースの提供: Repositoryは通常、データ操作のためのインターフェースを提供し、具体的な実装はこのインターフェースを実装するクラスで行います

Repositoryは1つのエンティティ（例：User）に対して作成するのが一般的です。
機能やロールでRepositoryを分けるのは避けましょう

# RepositoryパターンとDAOパターンの違い
似通っているのだが、、調べた限りではいかな違いがありそう。
（ここ100%噛み砕けていないかも。。）

主な違い
1. 焦点の違い
　Repository: ドメインモデル（ビジネスロジック）中心
　DAO: データベーステーブル中心
2. 抽象化のレベル
　Repository: より高レベルな抽象化を提供
　DAO: データベース操作に特化
3. 使用目的
　Repository: ドメインオブジェクトの永続化管理
　DAO: CRUD操作の簡潔な実装
4. 具体的な違い
　Repositoryは「集約」という単位でデータを扱い、ビジネスロジック層がデータモデルに依存しにくくなります
 　（**つまり、1 つの Repository に対応する DB のテーブル数は状況次第ってことになりそう**）
　DAOはテーブルと1対1で対応し、呼び出し側がデータモデルを意識する必要があります

# 終わりに
定期的にデザインパターンの勉強のし直しはしているのだが、、
プロジェクトで採用されているデザインパターンについては最低限理解できるようにしておきたい。

以上
pythonでscratchのdataを取得する

## はじめに
この記事では一からdataを取得するコードを作るのではなく、私の作成したモジュールを使用してやる方法を紹介します。ソースコードを見たい方は
[github](https://github.com/itijuku/scratchtool)をご覧ください。
※あくまで今回紹介するものは一部です。できることのすべてを見たい方は
[ドキュメント](https://github.com/itijuku/scratchtool/wiki/%5Bja%5Dscratchtool%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)をごらんください。

## インストール
```
pip install -U scratchtool
```

## フォロワーを取得
```python
import scratchtool as tool

user = tool.user("username")# usernameはご自身で変更してください
print(user.get_following())
```

## プロジェクトの参照数を取得
```python
import scratchtool as tool

project = tool.project("projectID")# projectIDはご自身で変更してください
print(project.get_views())
```

## 最後に
ほんとに一部のみ紹介しましたが、最初にもあるよう興味のある方は
[ドキュメント](https://github.com/itijuku/scratchtool/wiki/%5Bja%5Dscratchtool%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)こちらをご覧ください。
pythonスクリプトのインデントを整理整頓するプログラム作成


python初心者の頃に書いたスクリプトのインデントが、
スペースタブ混じりでスペース数タブ数もめちゃくちゃで非常に見づらい状態。
書き直したくてもその時間もなくせめてインデントを正常にして見やすくしたいと考えて

pythonスクリプトのインデントを整形するスクリプトを書こうと思い立った。

最初ChatGPTに丸投げしたがうまくいかなかったので
3時間ぐらいかけて作成してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638856/9e86089e-787c-d9a4-173b-a2be706a4551.png)


```pyindent.py
def process_indentation(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        lines = f.readlines()

    indent_white = {} # 直近のインデントテキスト情報保存 1:"\t",2:"\t\t"
    indent_level = 0 # 現在のインデントレベル
    
    splitlines = [["","",0]] ## [インデントテキスト,コード,インデント数]

    rownum = 0
    for line in lines:
        rownum += 1
        stripped_line = line.lstrip()  # 行頭の空白を除いた内容部分
        leading_whitespace = line[:len(line) - len(stripped_line)]  # 行頭の空白部分
        
        print("debug",len(leading_whitespace),len(stripped_line),line)
        
        if len(stripped_line) == 0 :
            pass # スペース行
            splitlines.append(["","",0])
        elif len(leading_whitespace) == 0 :
            # インデント無し
            splitlines.append([leading_whitespace,stripped_line,0])
            indent_level = 0
        elif len(leading_whitespace) > 0 :
            if splitlines[-1][0] == leading_whitespace :
                # indentが同じ
                pass
            elif len(splitlines[-1][0]) < len(leading_whitespace) :
                # indentが増える
                indent_level += 1
                indent_white[indent_level] = leading_whitespace
            elif len(splitlines[-1][0]) > len(leading_whitespace) :
                # indentが減る
                while True :
                    indent_level -= 1
                    if indent_white[indent_level] == leading_whitespace:
                        break
                
            # インデント有
            splitlines.append([leading_whitespace,stripped_line,indent_level])

    # 結果を出力ファイルに書き込み
    with open(output_file, 'w', encoding='utf-8') as f:
        for row in splitlines :
            print(row)
            f.write(" "*4*row[2] + row[1].strip() + "\n")

# 使用例
input_file = 'pysample.txt'  # 整理対象のPythonスクリプト
output_file = 'pysample2.txt'  # 整理後のファイル
process_indentation(input_file, output_file)

```


注意点は下記のような複数行のテキストがプログラム内にあると正常に動作しない

```py.py
def test() :
	text = '''aaa
bbb
ccc
'''
```
【テスト自動化】PlaywrightとMailosaurを組み合わせてメール認証を突破する

## 背景
昨年PlaywrightによるE2Eの自動テストの拡充を行なっていましたが、自分がQAとして関わっているプロダクトには以下のようなメール認証を必要とするシチュエーションがいくつかあり、そこを自動テストでどのように突破するかが課題になっていました。

- アカウント作成時のメール認証
- ログイン時にメールからコードを取得し入力する
- ユーザー招待時にメールの招待リンクを踏む

## Mailosaurについて
上記の課題を解決するために、いろいろと調べていたところMailosaurというサービスがあるとわかりました。
おそらく造語なので読み方がいまだに自信ないですが、たぶんメーラソーで問題ないと思います。

https://mailosaur.com/

イギリスにある企業が開発しているサービスです。公式HPによると使用している企業にはPayPalやUberなどの名前が掲載されていますが、日本語の情報は現状あまりないので日本で導入している企業はさほど多くないかもしれません。
ユーザー数や1日に受信可能なメール数により料金が変わります。（2週間のフリートライアルが可能です。）

## 使い方
個人的にはとても使いやすいサービスだと思っています。
Mailosaurの利用を開始するとメールサーバーを作成できるので、mailosaurドメインでQA対象のプロダクトのアカウント作成を行います。
例
```test@{your_server_id}.mailosaur.net```
そうすると、mailosaurのメールサーバーに届いたメール内に記載されているコードやリンクはAPI経由で容易に取得することができるのでPlaywrightと組み合わせることにより、自動テストでメール認証を突破することが可能になります。（もちろんGmailのように画面からメールを確認することも可能です。）
例えばログイン画面でメールからコードを取得して入力している箇所のコードは以下のような形になります。
``` ts
import MailosaurClient from "mailosaur";

const mailosaur = new MailosaurClient(YOUR_MAILOSAUR_API_KEY);
const serverId = YOUR_MAILOSAUR_SERVER_ID;

test("ログイン", async ({ page }) => {

  // テスト開始以後のメールを取得するために指定する
  const testStart = new Date();
  const testMailAddress = "test@abcde.mailosaur.net"
  const password = "password"

  // メールアドレス、パスワードを入力
  await page.mailAddressForm.fill(testMailAddress);
  await page.passwordForm.fill(password);
  await page.loginButton.click();
  // 送信されたメールを取得
  const email = await mailosaur.messages.get(
    serverId,
    {
      sentTo: testMailAddress,
      subject: "認証コードのお知らせ",
    },
    {
      receivedAfter: testStart,
    }
  );
  // メールからコードを取得する
  const code = email.html.codes[0].value;
  // コードを入力
  await page.codeForm.fill(code);
  await page.confirmButton.click();
});
```

`sentTo（送信先メールアドレス）`と`subject（件名）`を指定することにより、取得すべきメールを特定していますが、それだけだとテストを重ねると重複してしまうので`receivedAfter`を指定してテスト開始以降に送信されたメールに絞ることにより対象のメールを1件にすることもできます。

## 今後
今回は自動テストにおいてのメール認証突破に関する内容になりましたが、Mailosaurはメール送信やメール文面チェックなどのQAでも活用できると思いますので、活用の幅を広げていきたいと考えております。

https://herp.careers/v1/justincase/JWF43Evxcuut
また)Arduino IDEにESP32を登録して遊ぶ。(3.1.0)


参考

![o_coq750.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/40278417-5019-b72f-eadc-d09361f23537.jpeg)


https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html


https://interface.cqpub.co.jp/esp32-arduino-ide-2/


x 過去ログを見よ!!!

目的
ふたたびESP32で遊ぶ
M5Stackでの
環境構築を思い出す


● GithubからSTM32用のアドレスを取ってくる(参考を参照)
----



```

https://espressif.github.io/arduino-esp32/package_esp32_index.json

```


● Arduino IDEの設定にアドレスを登録する
----

![o_coq751.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3fea5e54-251e-ca17-46cb-166508267b37.jpeg)

![o_coq752.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7e0c83b0-0ca6-2279-df51-cee60698832c.jpeg)

![o_coq753.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f9258f14-52e5-b719-1c2c-305af12fa4c1.jpeg)



● ボードを選択する
----

![o_coq754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1162f842-6cda-96ce-a5c4-58df2f8917f6.jpeg)

![o_coq755.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3765ad08-ed55-1be7-212f-d136d2f4315a.jpeg)



あとは、お好みで!!!
【あけましておめでとうございますpart2】試験仕様書作成スクリプトをRubyで作成しました。

独り身 & 一人暮らしの年末年始って暇なんですよ。知ってましたか？

前回は「**Railsの`db/schema.rb`からDB仕様書を作成するスクリプト**」を作成したのですが、今回は「**どのアプリケーションにも適応可能な試験仕様書を作成できるRubyスクリプト**」を作成しました。

↓前回の記事↓

https://qiita.com/PDC-Kurashinak/private/39020b67c12d4c465f4b

:::note warn
試験仕様書といっても、7割くらい出来上がっている試験仕様書が作成されるくらいのスクリプトです。

以降で示している例も、わかりやすくするための例でしかありません。
:::

ソースコードをGithubに上げているので、詳細についてはそちらを参照してください。

https://github.com/pdc-kurashina/piman_test_create_tools

# 何のテストができる試験仕様書？

元々は、弊社内で使用しているアプリケーションの**試験仕様書作成業務の工数を削減したい**という考えから、以下のことができるRubyスクリプトを作成しました。

（以後、弊社で使用しているアプリケーションを<font color="red">**あけおめアプリ**</font>と呼びます。）

## 1. あけおめアプリのログインユーザのアクセス権限の試験

このツールを作成した一番の目的はこれです。ログインユーザの種別ごとに試験仕様書の結果が異なるので、これを**細かく見ながら試験仕様書を作成しなきゃいけないのがストレスでした**。

`settings.yml`を作成して、指定された形式で権限情報を記述しておくと、以下のように結果が異なる試験を自動で作成できます。

```txt:例
手順1. 管理者でログインして、メニューの「顧客」をクリックする。
結果1. 顧客一覧画面が表示されること。

手順2. 一般ユーザでログインして、メニューの「顧客」をクリックする。
結果2. 顧客一覧画面が表示されないこと。
```

## 2. 新規登録・複製・編集の試験

ここは自動で作成できたらラッキーくらいの感覚でした。

新規登録画面の試験では「**新規登録実行**」の試験、複製画面の試験では「**複製実行**」の試験、編集画面での試験では「**更新実行**」「**削除実行**」の試験が自動で作成できます。

## 3. テストケース管理ツール「TestRail」のインポート可能なCSV形式で出力される

デフォルトの形式では、弊社で使用しているフォーマットになっています。
項目が増えたり減ったりする場合にはちょっとソースコードをいじる必要があります。
これは、今後対応したいな。

```csv:現在のフォーマット
セクション,タイトル,前提条件,備考,手順,期待する結果,対応バージョン
```

---

大まかに上記2点かなと思います。

# 今後の発展について

以下の点について、実装できたらいいなと思っています。

* 新規登録/複製/編集時のバリデーションの試験 → `not: nulll`のバリデーションは実装済み
* 試験用データの自動作成
* 出力時のCSV構成を簡単に変えられるようにする

上記の上2つを実装するには、DB設計書では足りなくて、「**画面設計書**」の内容をRubyに読ませる必要があります。
案としては、以下の2点です。

* 生成AI（GPT-4o or Claude3.5）を使用して、Markdown/yml/csvのいずれかの形式に落とし込む
* ERB（SLIM）を正規表現を使って読み込み、Markdown/yml/csvのいずれかの形式に落とし込む

なるべくコストはかけたくないので、正規表現を使用する方法になるかなぁとは思っています。
あけおめアプリのViewコードがSLIMだから一般化できるか不安...

他にいい案があったら採用させていただきます。

以上
2年目クラウドエンジニアの振り返りと2025年の目標

今年の11月あたりからXを使い始めたのですが、最近になって2024年の振り返りや2025年の目標、抱負といった投稿をよく目にしたので自分も真似してみようと思いブログにしました。こんなやつもいるんだな～程度で読んでもらえると幸いです。

# 2024年振り返り
2023年はAzureの運用保守の案件に配属されてたので、Azureの資格をいくつかとったりしていました。なので2024年の初めのころはAzureをさらに深く理解していこうと思っていたのですが、終わってみるとほとんどAWSの１年になりました。ざっくり振り返るとこんな感じです。
### 1~3月
- Microsoft Certified: Identity and Access Administrator Associate（SC-300）取得
- Microsoft Certified: Azure Network Engineer Associate（AZ-700）取得
- AWS Certified Solutions Architect - Associate　取得

このころからAWSを触り始めてはいたのですが、まだAzureをメインにやっていました。SAAは会社の資格手当の規定に含まれてるし一応とっておこうくらいで取った記憶があります。この後IPAの春季試験を受けるのですが自分は３月頭くらいから準備を始めていましたね。

### 4~6月
- 応用情報技術者試験　合格
- AWS Certified Developer - Associate　取得
- AWS Certified Security - Specialty　取得

２年目に突入したのですが特に実感はなく、あまり環境の変化もありませんでした。強いて言えばAPを受ける前に入社した24卒の後輩の中にセキスぺ持ちがいることを知ってモチベーションが爆上がりしたことですかね。また、2024 Japan AWS Jr. Championsの発表があり、その中に同期の名前があったので少なからず影響を受けました。
### 7~9月
- AWS Certified SysOps Administrator - Associate　取得
- AWS Certified Solutions Architect - Professional　取得
- Terraform入門

このあたりから業務でAWSをがっつり触り始めました。また、2025 Japan AWS All Certifications Engineers目指しちゃおっかな？と思い始めたのもこのころだったと思います。
あとはTerraformを触れたのがうれしかったです。IaCは少しチュートリアルやってみたぐらいだったので、実際に業務で教えてもらいながら実装できたのはよかったです。
### 10~12月
- AWS Certified DevOps Engineer - Professional　取得
- AWS Certified Advanced Networking - Specialty　取得
- AWS Certified Data Engineer - Associate　取得
- Google Cloud Certified - Associate Cloud Engineer　取得
- 情報処理安全確保支援士試験　不合格！
- 初登壇

１１月に行われた[LT 大放出会〜2024 Japan AWS Jr. Champions と LT しませんか？〜](https://serverworks.connpass.com/event/333781/)というイベントで初めて登壇しました。かなり緊張しましたが、フィードバックや意見をリアルタイムでもらえるので参加してよかったと思います。
あとはセキスぺに不合格したことが悔しかったです。試験に落ちたのが久しぶりなのでリベンジに燃えています。

### １年を振り返って
AWSの案件に配属されたことがきっかけでAzureからAWSにシフトした１年でした。改めて振り返るといろいろ経験できたとは思いますが、来年はさらに飛躍したいと考えています。
あとは2023年に比べると資格取得のモチベーションが異様に高かった年でしたが、大きく３つの理由があると思います。
- 業務で使用している
- 会社が推奨している（資格手当がもらえる）
- コンプリート精神

資格取って意味あるの？という論争は割と目にしますが、自分は目に見えるステータスが好きというだけで取ってます。

# 2025年目標
- 情報処理安全確保支援士試験　合格
- CompTIA Security+　取得
- AWS Certified Cloud Practitioner　取得
- AWS Certified AI Practitioner　取得
- AWS Certified Machine Learning Engineer - Associate　取得
- AWS Certified Machine Learning - Specialty　取得
- Microsoft Certified: DevOps Engineer Expert（AZ-400）　取得
- Google Cloud Certified - Professional Cloud DevOps Engineer　取得

現在興味を持ってる分野が、セキュリティ、クラウドインフラ、SREの三つです。（この３つを同列に並べていいものかは微妙ですが...）
2025年はこの三つを伸ばしていきたいと考えています。資格に関しては見えている範囲で挙げてみましたが、１年の目標と考えるともっと少ない気がするので、また半年後アップデートしたいと思います。
### セキュリティ
今年一番力を入れたい分野です。一言でセキュリティといっても幅広いですが、まずは資格を取得し広く浅く理解していくことを考えています。
### クラウドインフラ
個人的にLinuxの勉強をしたいと考えています。Docker、kubernetesを少し触っているのですがLinuxから理解したほうがトラブルシューティングなどの面で強くなれそうだと思いました。
### SRE
そもそもSREに関する理解度が浅いのでそこからですね...オライリーのSREに関する書籍がいくつか会社にあったのでまずはそれを読むところから始めたいと考えています。

# 最後に
少しも触れませんでしたが生成AIもそろそろ勉強しないとマズいなとは思ってます...
【AWS】【S3】Webサイトのフェールオーバー

## 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/88c2644b-4789-08a3-090f-9ad0c014f375.png)


## 構築に必要なリソース
・S3

・Route53

## 構築手順
1. Sorryページ用のS3バケットの作成

2. Route53にて、フェールオーバールーティングポリシーの作成

3. EC2を停止し、Sorryページに遷移しているか確認作業

## 構築
### 1. Sorryページ用のS3バケットの作成
・バケット名：前回の記事のRote53で作成したドメイン名と同様の名前を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/6b22b73b-e844-2aa9-812e-3b6c5a838325.png)

・「パブリックアクセスをブロック」のチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/736ca1fc-4723-602c-ec28-784b2731846f.png)

・上記で作成したバケット内に画像ファイルおよびHTMLファイルのアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/5bd3d111-e30a-2e47-55fa-69706d01726e.png)

・上記で作成したバケットのポリシーを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/74b920bf-4f1e-a68c-cdef-269e6ba8407b.png)

・S3の静的ウェブサイトホスティングの有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/e0739784-897d-6a9a-110a-2af626173bbe.png)

・S3バケットのWebサイトエンドポイントへアクセスして、sorryページが表示されるか確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/35f7275d-34bf-2b8c-ad9a-e9476548c554.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/a20b5766-1916-368f-7e4d-d4bb11763bec.png)

### 2. Route53にて、フェールオーバールーティングポリシーの作成
・以前作成した「blog.aws-hiro.shop」のシンプルルーティングポリシーの編集を行う。（下図の赤枠参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/2c7ce2f8-d94e-ffba-3be3-828632111c69.png)

・追加でフェールオーバールーティングポリシーの作成（下図の赤枠参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/b83a59f5-8558-225c-bfd2-55c6969b3544.png)

・2つのフェールオーバールーティングポリシーが作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/7cb4b592-fb0d-34f8-b119-78c48218560d.png)


### 3. EC2を停止し、Sorryページに遷移しているか確認作業
・EC2を停止

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/99b45bb7-f74a-3dbf-9c74-6c0d35d71226.png)


・ドメイン名（blog.aws-hiro.shop）で検索し、Sorryページの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/23d27fb2-3f1b-7657-c4f8-f211fa93ea34.png)

## 構築を終えて
　今回のハンズオンをやってみて、資格試験で実際に出たRoute53のフェールオーバールーティングポリシーを使用したSorryページへの遷移についての理解がかなり深まりました。
 悩みどころだったのは、S3バケット名をドメイン名と同じ名前にしないといけなかったり、Sorryページの作成後にWebサイトホスティング機能の有効化やS3バケットポリシーの変更の必要性の部分でした。
今後もAWSの記事を投稿し、アウトプット力を高めていきたいと思います！
【AWS SAP】AWS Secrets Managerのレプリケーション機能

# 概要
AWS Secrets Managerの**シークレットのレプリケーション**機能を使用すると、シークレットを複数のAWSリージョンに自動的にコピーして、一貫性と安全性を保ちながら管理することができます。この機能は、災害復旧やグローバルなアプリケーションの要件を満たすために役立ちます。

## この機能がなかった場合の課題
1. **災害復旧の準備不足**  
   特定のリージョンで障害が発生した場合、他のリージョンに同じシークレットがないと、迅速な復旧が困難になります。

2. **手動管理の複雑さ**  
   複数リージョンで同じシークレットを手動でコピー・更新する作業は、ミスが発生しやすく管理コストが高いです。

3. **グローバルアプリケーションの非効率性**  
   グローバルに展開されたアプリケーションが、各リージョンで異なるシークレットを参照する場合、設定の整合性を保つのが難しくなります。

4. **セキュリティリスク**  
   手動でシークレットを移動する際に誤って漏洩するリスクが高まります。

## この機能を使うことのメリット
1. **災害復旧の強化**  
   シークレットが複数リージョンに自動的にコピーされるため、障害が発生した場合でも他のリージョンから即座にアクセスが可能。

2. **運用コストの削減**  
   シークレットの管理が自動化されることで、手動でのコピーや更新作業が不要になり、管理コストを削減できます。

3. **一貫性の確保**  
   複数リージョンで同じシークレット値を使用できるため、アプリケーションの動作が統一され、トラブルシューティングが簡単になります。

4. **セキュリティの向上**  
   シークレットの移動や管理が自動化されるため、手動によるヒューマンエラーや漏洩のリスクが低減されます。

5. **柔軟なリージョン設定**  
   必要なリージョンにだけレプリケートすることで、無駄なコストを抑えつつ効率的にシークレットを管理可能。

## シークレットのレプリケーション手順

```mermaid
flowchart TD
    A[シークレットを作成する] --> B[・レプリケーションルール設定<br>・ターゲットリージョンを指定]
    B --> C[ターゲットリージョン1<br>例: 米国西部]
    B --> D[ターゲットリージョン2<br>例: 中央ヨーロッパ]
    C --> E[シークレットを自動的にコピーする]
    D --> E
    E --> F[レプリケートされたシークレットを管理する]
```
### 1. **シークレットを作成する**  
   - 元となるリージョンとして東京リージョン（ap-northeast-1）を使用します。
   例: データベースの認証情報などのシークレットを作成。
### 2. **レプリケーションルールを設定する**  
   - レプリケーション先となる複数のターゲットリージョンを指定します。
   例: 米国西部（us-west-2）や中央ヨーロッパ（eu-central-1）。

### 3. **ターゲットリージョンごとの処理**  
   - 指定した各ターゲットリージョンに対して、シークレットが自動的にコピーされます。
   例: 米国西部（us-west-2）でのコピー処理、中央ヨーロッパ（eu-central-1）でのコピー処理。

### 4. **同期処理を実行する**  
   - 元のリージョンとターゲットリージョン間でシークレットの同期が行われます。

### 5. **レプリケートされたシークレットを管理する**  
   - ターゲットリージョンにコピーされたシークレットを各アプリケーションで利用可能にします。
   - アプリケーションが適切なシークレットを参照して動作します。