OmniAICreator/Qiita-1.07M huggingface dataset:
robloxでassistant その78

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
Weldを使え。


# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```



local partA = Instance.new("Part")
local partB = Instance.new("Part")
partA.Position = Vector3.new(-5, 10, -10)
partA.Parent = workspace
partB.Position = Vector3.new(-5, 10, -14)
partB.BrickColor = BrickColor.Red()
partB.Parent = workspace
local weld = Instance.new("Weld", partA); 
weld.Part0 = partA; 
weld.Part1 = partB; 
weld.C0 = CFrame.new(0, 1, 0) * CFrame.Angles(0, math.rad(90), 0)


```


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/15448500-5aea-d213-119b-c558be8ff64a.png)


以上。
2024/5/27主にITとかセキュリティの記事

サイバーセキュリティの優先度が低い日本の経営層　「クラウド移行」の課題は？(5/25)
https://news.yahoo.co.jp/articles/f8fa6c544d74c41489f71824ee858a1dc8107101?source=rss

積水ハウス　29万人の個人情報漏洩(5/25)
https://news.goo.ne.jp/article/tvasahinews/nation/tvasahinews-000351226.html
https://www.home-tv.co.jp/news/content/?news_id=000351226
https://www.kfb.co.jp/news/ann/index.php?category=3&id=000351226

積水ハウス、サイバー攻撃で約29万人分情報漏洩 ほかに53万人分もか 会員制サイトで(5/25)
https://www.msn.com/ja-jp/news/world/%E7%A9%8D%E6%B0%B4%E3%83%8F%E3%82%A6%E3%82%B9-%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E6%94%BB%E6%92%83%E3%81%A7%E7%B4%8429%E4%B8%87%E4%BA%BA%E5%88%86%E6%83%85%E5%A0%B1%E6%BC%8F%E6%B4%A9-%E3%81%BB%E3%81%8B%E3%81%AB53%E4%B8%87%E4%BA%BA%E5%88%86%E3%82%82%E3%81%8B-%E4%BC%9A%E5%93%A1%E5%88%B6%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7/ar-BB1mZ15O

顧客情報１１万人分流出＝サイバー攻撃で―積水ハウス(5/24)
https://www.risktaisaku.com/articles/-/91816

中国軍ハッカーが仕掛けるマルウェアに対抗できるのか…米軍事情報当局トップが警告する日本の脆弱性(5/25)
https://gendai.media/articles/-/130644

GW豪州出張報告①：サイバー・セキュリティのエコシステムの重要性(5/25)
https://agora-web.jp/archives/240523210353.html

サイバー攻撃とは？その種類・事例・対策を徹底解説(5/25)
https://cybersecurity-jp.com/column/97647

名機「iPhone X」はいつまで使える？　Apple公式サポート終了後も使い続けて大丈夫？(5/25)
https://otona-life.com/2024/05/25/232169/

テレワークでのセキュリティの課題　匿名性を高める「非公開VPN」とは？(5/25)
https://news.yahoo.co.jp/articles/bd2ec781dea02b5ef5b0097dae6ee2ab3f131493?source=rss

クレカ情報漏えいか　通販サイト、最大３万人分　県物産振興協会(5/25)
https://www.yomiuri.co.jp/local/nagasaki/news/20240524-OYTNT50158/

医療従事1693人の情報流出　ワクチン接種対応　茨城県の委託事業者(5/25)
https://ibarakinews.jp/news/newsdetail.php?f_jun=17165581291891

なぜ日本人は自国のインテリジェンス体制が“異常”だと認識できないのか？(5/25)
https://wanibooks-newscrunch.com/articles/-/5137

孫正義氏の“AI革命”で日本飛躍へ。ソフトバンクGが25年秋に量産する「AI半導体」が世界を席巻する＝勝又壽良(5/25)
https://www.mag2.com/p/money/1452755

ＬＩＮＥ問題を契機に蘇る韓国の「反日」手のひら返す可能性　岸田首相が訪韓　「特定社会基盤事業者、厳しく追及するべき」峯村健司氏(5/25)
https://www.iza.ne.jp/article/20240525-CMSSLVJ325MBBIUN3TPEQMAK5I/

NETWORK黎明期の思い出(5/25)
https://blogs.itmedia.co.jp/satou55_makoto/2024/05/network.html?ref=rss

「ＶＩＰ激怒」証言に海兵隊司令官の録音ファイルまで…深まる捜査外圧疑惑＝韓国(5/25)
https://japan.hani.co.kr/arti/politics/50114.html
cable management for floor box

ConnectSystem.in is a comprehensive online platform designed to foster connections, collaborations, and interactions within a particular system or network. Whether you're an individual, a business entity, or an organization, ConnectSystem.in offers a range of features and services to facilitate seamless communication and collaboration.
Connect System India Pvt. Ltd. manufactures and supplies a product called "Table Connect"

The industry focus of Connect System India Pvt. Ltd. is in the field of Appliances, Electrical, and Electronics Manufacturing
This indicates that the company specializes in manufacturing and supplying electrical and electronic appliances, with a particular emphasis on this sector.
Connect System India Pvt. Ltd. manufactures and supplies a product called "Table Connect"
Table Connect is described as a stylish and functional solution for providing accessible power and communication connections to modern workplaces
It is designed to be easy to install without cutting the tabletop and does not occupy space on the table
The website also mentions that the Pull Connect Motorised version of Table Connect comes with an LED light that blinks when the product pops up
Click for More :- https://www.connectsystem.in/product/move-connect/
Javaで「インクリメント演算子とデクリメント演算子」の動作を確認してみた

# 概要

Javaで「インクリメント演算子とデクリメント演算子」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/ope/index6.html

# 実装

以下のファイルを作成しました。
```JSample6_1.java
class JSample6_1{
  public static void main(String[] args){
    int num = 5;

    num++;
    System.out.println(num);

    num--;
    System.out.println(num);

    ++num;
    System.out.println(num);

    --num;
    System.out.println(num);
  }
}
```

以下のコマンドを実行しました。
```
$ java JSample6_1 
6
5
6
5
```

# まとめ

何かの役に立てばと。
[Azure] Bicep の配列にハマる(n回目)

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！

## モチベ
何度もハマるから自分ようのメモ、きっと他にもハマるひとはいるはず。

## 忘れたときに Bicep の配列にハマる
結論から言えば問題は、**bicep の配列って記載した通りに入らない。**

## 具体例

```biep:VnetとSubnet 作る部分
param firewallSubnetName string = 'AzureFirewallSubnet'
resource vnet 'Microsoft.Network/virtualNetworks@2022-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [vnetAddressPrefix]
    }
    subnets: [
      {
        name: mainsubnetName
        properties: {
          addressPrefix: subnetAddressPrefix
        }
      }
      {
        name: bastionSubnetName
        properties: {
          addressPrefix: bastionSubnetAddressPrefix
        }
      }
      {
        name: firewallSubnetName
        properties: {
          addressPrefix: firewallSubnetAddressPrefix
        }
      }
    ]
  }
}

```

```Bicep:Azure Firewall 作る部分
resource firewall 'Microsoft.Network/azureFirewalls@2022-05-01' = {
  name: firewallName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'AzureFirewallIpConfig'
        properties: {
          publicIPAddress: {
            id: firewallPublicIP.id
          }
          subnet: {
            id: vnet.properties.subnets[2].id
          }
        }
      }
    ]
  }
}
```
:::note warn
下記部分の配列指定が今回問題。

          subnet: {
            id: vnet.properties.subnets[2].id
          }

 ”id: vnet.properties.subnets[2].id” にはどの Subnet が入るかわからない！！
 AzureFWのサブネットが入るとは限らない。
 **bicep に書いた通り配列に入るわけではない！**
:::

Azure Firewall には ”AzureFirewallSubnet” という専用の名前のサブネットが必要なので、正しく指定する必要がある。

ちなみに今回の場合だと下記のような Error Message が出現する
> (Subscription ID)/resourceGroups/(Resource Group)/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/myFirewallSubnet is invalid for Azure Firewall. Azure Firewall can only be created in subnet with name 'AzureFirewallSubnet'. (コード: SubnetNameMustBeAzureFirewallSubnet)

## 対処
他にも方法はある気がする。
結論、**配列を使わない指定方法ができればよい。**

### Azure Firewall Subnet を別だしで作る
あんまりかっこよくない気もするが、できる。 シンプルかも。
VNet を作成後に、Azure FirewallSubnet を単独で作る。
依存(親子)関係があるので parent 利用。

```bicep:Azure Firewall  Subnet 作成部分
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  parent: vnet
  name: firewallSubnetName
  properties: {
    addressPrefix: firewallSubnetAddressPrefix
  }
}
```

```bicep:Azure Firewall での指定部分(抜粋)
          subnet: {
           id: firewallSubnet.id
          }
```

### Existing を使う
これが一番スマートな気がします。
VNet 作成後に作成されたやつを Existing を使って呼びだす
```bicep:Azure Firewall  Subnet の Existing 呼び出し部分
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' existing = {
  parent: vnet
  name: firewallSubnetName
}
```

```bicep:Azure Firewall での指定部分(抜粋)
          subnet: {
           id: firewallSubnet.id
          }
```

### 指定の仕方を工夫する < resourceID 関数を使う >

```bicep:Azure Firewall での指定部分(抜粋)
          subnet: {
            id: resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, firewallSubnetName)
          }
```

## あとがき
もっとスマートな対処を思いついたらまたアップデート予定
(調査中)Javaのkeytoolを使ったキーストアとトラストストアの処理(PKCSを使った例)

PKCS（Public-Key Cryptography Standards）を使用した例を見てみましょう。特に、PKCS#12フォーマットを使ってキーストアとトラストストアを管理し、JavaでのSSL通信に利用する方法を説明します。

## 基本概念
#### キーストア (Keystore):

自分の証明書と秘密鍵を格納するための場所です。
クライアント認証を行う際に、自分自身を証明するために使用します。

#### トラストストア (Truststore):

信頼できる証明書、特にサーバーの証明書や証明書を発行する認証局 (CA) の証明書を格納します。
サーバーとの通信を確立する際に、サーバーの証明書が信頼できるかどうかを検証するために使用します。
## PKCS#12のキーストアとトラストストアの作成

#### 1. キーストアの作成
OpenSSLを使って秘密鍵と証明書を生成:

```sh
openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -x509 -days 365 -out client-cert.pem
```

PKCS#12フォーマットのキーストアに変換:

```sh
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name client-cert
```

#### 2. トラストストアの作成

```sh
openssl pkcs12 -export -in server-cert.pem -out server-truststore.p12 -name server-cert
```

## Javaプログラムでの使用
以下は、PKCS#12フォーマットのキーストアとトラストストアを使用してSSL通信を行うJavaプログラムの例です。

```java
import javax.net.ssl.*;
import java.security.KeyStore;
import java.io.FileInputStream;

public class SSLClientPKCS12 {

    public static void main(String[] args) throws Exception {
        // PKCS#12キーストアの設定
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream keyStoreStream = new FileInputStream("client-keystore.p12")) {
            keyStore.load(keyStoreStream, "keystorePassword".toCharArray());
        }
        
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        keyManagerFactory.init(keyStore, "keyPassword".toCharArray());
        
        // PKCS#12トラストストアの設定
        KeyStore trustStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream trustStoreStream = new FileInputStream("server-truststore.p12")) {
            trustStore.load(trustStoreStream, "truststorePassword".toCharArray());
        }
        
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
        trustManagerFactory.init(trustStore);
        
        // SSLコンテキストの設定
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
        
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
        try (SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket("serverHost", 443)) {
            // 通信処理
            sslSocket.startHandshake();
            
            // 通信の実行コードは省略
        }
    }
}
```

## 解説
#### PKCS#12キーストアのロード:
KeyStore.getInstance("PKCS12")を使用して、PKCS#12フォーマットのキーストアをロードします。キーストアにはクライアント証明書と秘密鍵が含まれています。

#### PKCS#12トラストストアのロード:
同様に、PKCS#12フォーマットのトラストストアをロードします。トラストストアには信頼するサーバーの証明書が含まれています。

#### SSLコンテキストの初期化:
キーマネージャーとトラストマネージャーを使用してSSLコンテキストを初期化します。

#### SSLソケットの作成と通信:
SSLソケットを作成し、サーバーとの安全な通信を確立します。

これにより、PKCS#12フォーマットのキーストアとトラストストアを利用して、クライアント証明書を使ったSSL通信を行うことができます。
開発エンジニアがJSTQB FL試験に合格した話

# 目的
- ソフトウェアの品質について興味があり、まずは体系的な知識を得たい
- 短期的なゴールとして資格取得を選択

# 勉強期間
約3ヵ月間、週5日程度で、1日あたり30分程度の勉強  
（かなり怠惰な勉強スケジュールです）

# 勉強方法
JSTQBのシラバスを計3回読みました。  
問題演習は、テス友を使用しました。

https://jstqb.jp/syllabus.html#syllabus_foundation

https://www.qbook.jp/info-testomo/

実際に行ったことを時系列順に書くと、以下のような感じです。
1. JSTQBのシラバスを読む
1. テス友で問題を解く（10問、ないしは20問をモチベーションがある日に1回）
1. ある程度解けるようになってきたところで、シラバスをもう一度読む
1. テス友で章別に問題を解き、全ての章で正解率グラフを80%以上に乗せる
1. 細かいところを覚えるために、シラバスを章別に読む→読み終わったらテス友で問題を解く

<br>

受験前のテス友の履歴を貼っておきます。これから受けようと思っている人は参考にしてください。

![Screenshot_20240516-115459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/7f997415-db1f-25d8-ff3e-2a70fb9f866b.png)

![Screenshot_20240516-115709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/76dc065b-dac0-ce91-dd92-f27ec6abb414.png)

![Screenshot_20240516-115508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/dff1b707-d0e7-43b9-e16f-29c000011d66.png)

# 試験について
- 難易度はテス友と同じくらい
- 複雑な選択肢の形式はなかった
- 体感で8割くらいかな、という印象
- 時間面は、ゆっくり解いていたが、20分程度余った

# 試験結果
無事合格しました🎉  
5日後にWebで合否が分かり、2週間後に認定証が届きました。

![DSC_0173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/a327df86-ef90-28ad-0602-539dc331287c.png)

# FL試験を終えての感想
#### テスト担当者は、他者（主に開発エンジニア）との関係性が大事だということ
多くの企業で部署間の諍いみたいなものがあると思うのですが、このような資格試験のテキストで「立場が異なる者とのコミュニケーションが大事」というニュアンスのことが書かれているのにびっくりしました。  
エンジニア同士でも、良い関係性を築けていないとレビューがしんどかったりするので、プロダクト開発におけるコミュニケーションの重要性を再認識しました。

#### 形骸化していると思っていた社内の開発プロセスが、正しく運用すれば意外と機能するのではないかという発見
私が勤めている会社では、プロダクト開発において然るべきタイミングで複数回レビューを実施しているのですが、重箱の隅をつつくような指摘ばかりで、レビューの意義について疑問を感じる瞬間が多くあります。  
ただ、これはレビュー目的を定義できていない（もしくは周知できていない）だけで、既存のプロセスでもっとうまくできる方法がありそう、そんな気がしています。

# まとめと今後に向けて
今回JSTQB FL試験を受けてみて、エンジニアとしての視野が広がりました。  
ソフトウェアテストについてより深く学ぶために、SQuBOKを読むことと、上位の資格（JSTQB AL）に挑戦してみようと思います。
[Unity]ShaderGraphでBooleanを使ってノードを切り替える

# 概要
ShaderGraphでBooleanを使ったノード切り替えについてまとめます。コードで切り替えるとき少し癖がありました
# 本文
ShaderGraph内でBooleanプロパティをつないだBranchで赤色と青色を切り替えます。
![スクリーンショット 2024-05-27 000409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5a70c476-2979-4c19-7a06-d4172d331323.png)

Cube対してChangeColorスクリプトを張り付けます

![スクリーンショット 2024-05-27 003551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cbaf3902-b763-067f-0cc5-414c815791e7.png)

```cs

using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    [SerializeField] private bool isRed;
    
    void Start()
    {
        GetComponent<Renderer>().material.SetInt("_ColorChange", isRed ? 1 : 0);
    }
}
```
InspectorからisRedフラグをON/OFFすることでシェーダーの機能を切り替えることができます。

:::note info
マテリアルにはSetBooleanみたいなメソッドは無いようで、SetIntを使って1もしくは0を指定することでtrue/falseを切り替えられます。
:::

:::note warn
Booleanでの切り替えは、内部的にはtrue側とfalse側の両方が計算されているらしいので処理負荷が気になる方は検討が必要そうです。
:::
Java開発環境の構築（Eclipse2024）

Java開発を行うために必要な開発環境（Eclipse）構築手順です。

## Eclipse2024環境構築

 |項目|環境情報|
 |:-|:-|
 |OS|Windows 11 HOME|
 |CPU|Intel Core i5-1235U 1.3GHz|
 |メモリ|16GB|
 |ブラウザ|Microsoft Edge|


1\. ダウンロードサイトへアクセス
Eclipse本体と日本語化パッケージが一体化された「Pleiades All in One」をダウンロードするため、以下URLへアクセスします。
 　[Pleiades All in One トップページ](https://willbrains.jp/)

2\. Eclipse2024をダウンロード
Eclipse2024（赤枠内）をクリックします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/b7c6e208-d7e2-039c-7574-2a7832f677d0.png">

3\. Java Full Editionをダウンロード
Windows X64 のJavaのDownload（赤枠内）をクリックします。
<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/7aa36fbb-7a0f-40d5-04fa-7a8b772c540f.png">

4\. ダウンロードの開始
ダウンロードを開始します。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/d08b186e-68b4-d884-473d-fda6fd9019f2.png">

5\. ダウンロードの終了とダウンロードファイルの表示
ダウンロード完了後、フォルダ（赤枠内）をクリックします。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/1fee7247-a3f3-dfec-e160-c06df5577fc0.png">

6\. ダウンロードファイルの解凍実行①
ダウンロードフォルダのファイルをダブルクリックします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/544e496e-5f75-eefe-d7cc-f985ac67a52d.png">

7\. ダウンロードファイルの解凍実行②
解凍（赤枠内）をクリックします。
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/0c5872bf-4c74-7d97-d306-60f22ac9737a.png">

8\. プログラムフォルダを開く
解凍完了後、自己解凍書庫画面が自動でクローズします。
「C:\pleiades\2024-03\eclipse」フォルダにアクセスします。
　※ 手順7で作成先フォルダを変更した場合は、指定したフォルダに変更してください。

9\. ショートカットの作成と移動
ショートカットを作成し、作成したショートカットをデスクトップへ移動します。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/f23b526d-57ed-bcce-c02c-177aec88f4da.png">

10\. Eclipseの起動①
デスクトップに作成したEclipseのショートカットをダブルクリックし、Eclipseを起動します。
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/0bb5ff13-0066-7c3c-9d92-407842ee34a5.png">

11\. Eclipseの起動②
次画面が表示されるまでしばらく待ちます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/3666131c-ca13-34ad-678c-1e35f335ddc8.png">

12\. Eclipseの起動③
デフォルト設定のまま起動（赤枠内）クリックします。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/077db7c5-bd86-6300-3351-a30dceba8ad3.png">

13\. Eclipseの起動④
起動するまでしばらく待ちます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/08a6989a-5cf3-6686-6c5c-71302deb139e.png">

14\. Eclipse起動完了
以下の画面が起動すればOKです。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728839/456cdef0-cb10-0b71-30b3-d285c3c52c8e.png">
Vite×ReactアプリケーションをAWS Amplifyにデプロイする

# はじめに
Vite×Reactで作成したアプリケーションをAWS Amplifyにデプロイしてみます。

# 環境
- react：18.2.0
- vite：5.2.0


# 1.React側の準備
Viteを利用してデプロイするアプリケーションを準備していきます。
今回はデフォルトのものを使用します。
次のコマンドでVite プロジェクトを作成します。

```bash
npm create vite@latest
```
https://ja.vitejs.dev/guide/

プロジェクトを作成出来たら、パッケージをインストールします。
```
npm i
```

ローカルでプロジェクトを起動してみます。

```
npm run dev
```
プロジェクトの起動を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/feed4833-9c87-e82c-112e-7d747b963ef9.png)

ここまでできたら、AWS Amplifyに連携させるためのリポジトリを準備しておきます。
GitHubのリモートリポジトリを作成し、上記のソースをリモートに上げておきます。

# 2. Amplify側の準備

## 新規アプリを作成

AWSにログインし、コンソール画面からAmplifyを選択します。
Amplifyのホーム画面で「新しいアプリを作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f0dd6384-a56d-0c8e-a6d7-e9be55042967.png)

今回はGitHubを利用しデプロイしていきます。
対象のReactアプリケーションを格納したリポジトリを選択していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/133a99f6-44ff-6d95-c0a5-5dfc91aed6c9.png)

GitHubとAmplifyを連携させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/67ec4d7e-0a36-fd11-7b93-61ff3f22066f.png)

「select repositories」から対象のリポジトリを選択し、
「install & Authorize」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/c024435e-6349-9384-bca8-95b6d9cba411.png)

次に表示される画面で、デフォルトで選択したリポジトリ名が表示されています。
デプロイ対象のブランチを選択し「次へ」をクリックします。今回は「main」ブランチをデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7c152f6d-861a-4b14-6698-b53c56245403.png)

次の画面では、デフォルトで「アプリケーション」ビルドコマンド、出力先のディレクトリが選択されています。今回はデフォルトのままの設定で「次へ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/efc6eba1-c113-2b13-cc5e-a66923136314.png)


最後に設定内容を確認し、「保存してデプロイ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/fe7d1cf8-f460-7de9-961a-6e13b45f1d89.png)

デプロイ直後は下記のようにデプロイ中となっていますが、少し待つと「デプロイ済み」に変更されます。
デプロイ済みになった後、「デプロイされたURLにアクセス」を選択すると、デプロイされたアプリケーション画面に遷移できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/cd5cc3fc-fce1-ca11-d4a6-a8dd96d9bc9a.png)

以下のように、ローカルで確認したものと同じ画面が表示されている事が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/4516ec71-db83-6bb5-42cb-85eb7241b953.png)

## 変更の自動反映を確認する

最後にローカルで開発した内容をデプロイ後の画面に反映させていきます。
デフォルトで生成されている`App.tsx`の`return`の中身を下記のように入れ替えてみます。

```tsx:App.tsx
import './App.css'

function App() {

  return (
    <h1>hello world!</h1>
  )
}

export default App
```

修正できたらコミット、プッシュを行いリモートリポジトリの`main`ブランチに修正を反映させます。
`main`ブランチを更新するとAmplifyでは再度ビルド中の表示になりますが、少し待つと再度「デプロイ済み」に切り替わります。
デプロイ後のURLにアクセスしてみると、以下のように`hello wordl!`が表示され修正内容が自動で反映されれている事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/62722857-af99-c20a-3aab-35a8f15b982d.png)
Proxmox仮想マシンのネットワークをNATモードにする方法

# 概要
Proxmox VEでは、仮想マシンを作成するとデフォルトではホストと同じネットワークにブリッジ接続されます。VMware ESXiのようにNATモードのネットワークに接続するための手順を以下に説明します。

### 手順

#### 1. NAT用の仮想ネットワークを作成

まず、NAT用の仮想ネットワークを作成します。これは通常、内部ネットワーク（ブリッジ）とiptablesを使用して行います。

- `/etc/network/interfaces` ファイルを編集します。

```bash
nano /etc/network/interfaces
```

- 次に、新しいブリッジを追加します。例えば、`vmbr1`を内部ネットワーク用のブリッジとして追加します。

```plaintext
auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.11.45/24
        gateway 192.168.11.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

auto vmbr1
iface vmbr1 inet static
    address 10.10.10.1/24
    bridge_ports none
    bridge_stp off
    bridge_fd 0

iface enp4s0f0 inet manual

iface enp4s0f1 inet manual


source /etc/network/interfaces.d/*
```

### 2. ネットワーク設定の再読み込み

ネットワーク設定を再読み込みして、`vmbr1`が正しく適用されているか確認します。

```bash
systemctl restart networking
```

#### 3. NATとIPマスカレードの設定

ホストマシンでNATを設定し、内部ネットワークの仮想マシンが外部ネットワークにアクセスできるようにします。

- `iptables`を使用してNATを設定します。

```bash
# IPフォワーディングを有効にする
echo 1 > /proc/sys/net/ipv4/ip_forward

# IPフォワーディングの設定を永続化するために以下を編集
nano /etc/sysctl.conf
# 以下の行のコメントを外す
net.ipv4.ip_forward=1

# iptablesルールを追加
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE

# ルールを保存
apt install iptables-persistent
netfilter-persistent save
netfilter-persistent reload
```

#### 4. Proxmoxでの仮想マシンのネットワーク設定

次に、仮想マシンをこの内部ネットワークに接続します。

1. Proxmox VEのWebインターフェースにログインします。
2. 対象の仮想マシンを選択し、「Hardware」タブをクリックします。
3. 「Add」ボタンをクリックし、「Network Device」を選択します。4. 「Bridge」に`vmbr1`を選択し、「OK」をクリックします。

もしくは、既存のネットデバイスを以下の通り編集してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/adccc6e4-943d-d1e9-c85d-ba135a7f1a6b.png)

うまくいかない場合は、以下のような操作も確認してください。

##### 4.1. プロキシ再起動

Proxmoxのネットワーク設定は、プロキシ再起動が必要な場合があります。Proxmoxの管理サービスを再起動してみます。

```bash
systemctl restart pveproxy
systemctl restart pvedaemon
```

##### 4.2. `vmbr1`の存在確認

`ip a`コマンドを実行して、`vmbr1`が正しく作成されているか確認します。

```bash
ip a
```

出力に`vmbr1`が表示されていることを確認してください。

##### 4.3. ProxmoxのWeb UIの確認

ブラウザのキャッシュをクリアするか、ブラウザをリフレッシュしてProxmoxのWeb UIに再度アクセスし、`vmbr1`がリストに表示されるか確認します。

#### 5. 仮想マシンのネットワーク設定

仮想マシンを起動して、適切なIPアドレスを設定します。例えば、Windows 10の場合、次のように設定を行います。
![2024-05-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/d3b828ea-9a0d-f65c-f465-c68806d9f468.png)

#### 6. 接続確認

インターネットにアクセスできるか確認します。
![2024-05-27 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/0df74805-46be-5892-efff-5cbacad5f71b.png)

### まとめ

これで、Proxmox VEでVMwareのNATモードのようなネットワークを設定し、仮想マシンをそのネットワークに接続する方法が完了です。この設定により、内部ネットワークに接続された仮想マシンがホストのインターネット接続を通じて外部ネットワークにアクセスできるようになります。
情報バイアス

以前に選択バイアスについて書いたので今回は情報バイアスについて書いてみようと思います。

https://qiita.com/murasaki1994/items/4496264fb529ef09d45d

# 情報バイアス
情報の扱いや測定方法が不十分であるために一方的に偏って測定結果が出てしまう事を情報バイアスと言います。
情報バイアスには主に2種類あります。

## 思い出しバイアス
過去の事象に対しての思い出しやすさの違いによって生じる。

例として、症例対象研究(結果から原因を探る研究)で調査票を用いた原因に関する調査を行ったとき、陽性の記載者は陰性の記載者より熱心にその原因を探そうと思い出そうと努力したかもしれないという可能性があった。
もしそうなら原因と結果の関連が無くても1よりも大きなオッズ比が観察される。
そこで記録からある情報(第三の因子)を入手したところオッズ比が下がった。

## 質問者バイアス
質問者が行う情報の引き出し方によって生じる。

例としてある期間に薬剤Aを使ったか研究参加者に尋ねるとする。
質問者が薬剤Aについて思い出すよう何度も繰り返し尋ねたり、解答を誘導するように尋ねる事で薬剤Aの服用割合が実際と異なる場合がある。

## 制御方法
1. 情報の偏りをできるだけ小さくする
主観的な情報ではなく客観的な情報を収集する。
2. それでもすべて無くすことができない場合には差異誤分類ではなく非差異誤分類とする努力をする
原因から結果の発生について定義をあらかじめ決めておく

### 差異誤分類と非差異誤分類
コホート研究や介入研究では曝露群と非曝露群で誤分類が発生する確率が同じ場合と異なる場合ではその影響の大きさが違ってくる。
同じ場合を<b>非差異誤分類</b>といい、異なる場合を<b>差異誤分類</b>という。

# まとめ
情報は正しく手に入れましょう

# 参考文献
情報バイアス | 疫学用語の基礎知識
https://jeaweb.jp/glossary/glossary013.html

基礎から学ぶ 楽しい疫学　第4版
Pythonで二次元リストを簡潔にコーディングする(リスト内包表記)

この記事はPythonの二次元配列を簡潔にコーディングする方法について記載する．

# 標準入力
標準入力が以下のようだったとする

![スクリーンショット 2024-05-26 21.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/fea19d9a-0491-5418-b74a-9d4d26ca9ec2.png)

# Pythonでの内包表記
内包表記（List Comprehension）を使って，ユーザーから入力された行列 A を二次元リストとして作成する． 
```example.py
H, W = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(H)]
```
:::note info
`map()`は配列の要素を第一引数に指定された型に変換する
`map(int, ["1", "2", "3"])`ならば`[1, 2, 3]`となる．`
:::

:::note info
`for _ in range(N)`はN 回のループを実行する．`_ `は，ループ変数が使用されないことを示すために一般的に使用される変数名である．
:::

`for _ in range(H): `
H 回のループを実行する．
_ は,ループ変数が使用されないことを示すために一般的に使用される変数名．

`input().split()`
ユーザーから入力された文字列を空白で分割し，文字列のリストを返す．
>競プロの標準入力ではよく使うので覚えておこう

`map(int, ...)`
map() 関数を使って，分割された文字列のリストの各要素を整数に変換する．

`list(...)`
map() 関数の結果をリストに変換する． 

最終的に，A は H 行 W 列の整数からなる二次元リストになる．


# 全ての要素が0の二次元リストを作る
```py
H, W = map(int, input().split())
B = [[0] * W for _ in range(H)]
```
これで全ての要素が0であるH×Wの二次元リストができる．

# 二次元リストに出力を[]を使わずに
```py
for row in B:
    print(row)
```
だと，以下のような出力になる時，
```
[5, 5, 5]
[5, 5, 5]
[5, 5, 5]
```
[]を使わずに以下のように出力するには，
```
5 5 5
5 5 5
5 5 5

```
以下のようなコードにすればいい．
```example.py
for row in B:
    print(*row)
```
B の各行 row について，`*`を使って要素をアンパックし，空白区切りで出力する．

# 二次元リストの処理でTLEを防ぐには
各i行j列における和を全て計算して結果を二次元リストに格納したい時
ある行(または列)での全ての要素の和を計算する時，各i行j列それぞれで`sum関数`を使うと非常に計算量が多いコードとなる．
```bad_example.py
for i in range(H):
    row_sum = sum(A[i])
    for j in range(W):
        col_sum = sum(A[k][j] for k in range(H))
        B[i][j] = row_sum + col_sum - A[i][j]
```

各マス (i, j) について，行の合計と列の合計を計算するために，それぞれ sum(A[i]) と sum(A[k][j] for k in range(H)) を使用している．これらの計算は，各マスごとに行われるため，時間計算量が O(H^2 * W) になる．与えられた制約のH と W の最大値が 大きい場合，このアプローチでは大きなケースでTLEになる可能性が高い．そのため以下のようなアプローチを取ると良い．
```good_example.py
# 行の合計を計算
row_sums = [sum(row) for row in A]

# 列の合計を計算
col_sums = [sum(A[i][j] for i in range(H)) for j in range(W)]

# 各マスの値を計算(A[i][j]は行と列の合計計算で重複しているので減算)
B = [[row_sums[i] + col_sums[j] - A[i][j] for j in range(W)] for i in range(H)]

```
:::note info
*行の合計を計算では何が行われているのか*
`for row in A:`
行列 A の各行 row に対してループを実行する．

`sum(row)`
各行 row の要素の合計を計算する．

`[... for row in A]`
内包表記を使って，各行の合計を要素とするリストを作成．


*列の合計を計算では何が行われているのか*
`for j in range(W):`
列のインデックス j に対してループを実行する．(W は列数)

`sum(A[i][j] for i in range(H))` 
各列 j の要素の合計を計算する．内包表記を使って，行のインデックス i に対してループを実行し，A[i][j] の値を合計する．(H は行数)

`[... for j in range(W)]`
内包表記を使って，各列の合計を要素とするリストを作成する．
:::

前処理で行の合計と列の合計を計算しておくことで，各マスの値を効率的に計算できるようになる．
このアプローチにより，時間計算量が O(H * W) に削減され，TLEを回避できる．
【Next.js】Imageコンポーネントのsrcの記述方法

## Local Images

`.jpg`, `.png`, `.webp`のいずれかのファイルを`import`する。

```jsx
import Image from 'next/image'
import profilePic from './me.png'
 
export default function Page() {
  return (
    <Image
      src={profilePic}
      alt="Picture of the author"
    />
  )
}

```

上記の方法で　`src` を記述すると画像の `width`と `height` は自動的に決定されます。
また、`blurDataURL` も自動で設定され、 `placeholder` を `blur` に設定するだけでプレースホルダーが表示されるようになります。

以下は `placeholder`　を　`blur`に設定した場合のデモページです。

https://image-component.nextjs.gallery/placeholder

## Remote Images

`src`にURL文字列を記述します。

```jsx
import Image from 'next/image'
 
export default function Page() {
  return (
    <Image
      src="https://s3.amazonaws.com/my-bucket/profile.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

```

Local Images とは異なり、 `width` や `height` は自動計算されないため、必ず指定する必要があります。
また、 `placeholder`　を `blur` に設定する場合には `blurDataURL`　を指定しなければなりません。

外部画像を使用するには `next.config.js` に `remotePaterns`　を追記する必要もあります。

```js:next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'example.com',
        port: '',
        pathname: '/account123/**',
      },
    ],
  },
}

```

https://nextjs.org/docs/app/building-your-application/optimizing/images
個人開発・勉強の壁を乗り越えれるか(個人開発投稿の振り返り)

## どんな投稿をしてるか

個人開発を題材にして、毎日投稿が目標。
毎日投稿といいつつも、全然毎日投稿できてない。。
[前回の振り返り](https://qiita.com/kare-pan/items/e3367c91f1037987236b)から、投稿したのは4本。

* [Django REST frameworkとReactでJWT認証](https://qiita.com/kare-pan/items/9c0141cd3326f46aaa9f)
* [個人開発記録　2024/05/07](https://qiita.com/kare-pan/items/21aa787c6ee0593e287d)
* [個人開発記録　2024/05/06(djangoでログイン機能を実装)](https://qiita.com/kare-pan/items/7a910401dc0035761813)

個人開発以外の投稿

* [WEBエンジニアとしてレベルが上がった気がする経験と考え方](https://qiita.com/kare-pan/items/3974318f739564c2c732)

## よかった点

[前回の振り返り](https://qiita.com/kare-pan/items/e3367c91f1037987236b)からよかった点は以下。

* まとまった情報が投稿できた
    * 今までの投稿よりは少し体系的な情報が投稿できた
* 朝活するようになった
    * 業後では時間がぶれるため朝に少しでもやる習慣ができた
* ちょっとview数がアップした

前回の課題であった、記事の質については、ある程度まとまった内容を投稿することで改善できました。

業後では残業やその日の疲れがモチベーションを左右するため、朝6時半に起床し、30分から1時間を個人開発の時間として使った。
朝活は様々なメリットがあるため、読者の皆様もやってみてはいかがでしょうか？
私が一番いいと感じたメリットは、生活習慣が整うことです。
今までは毎日寝る時間も起きる時間もバラバラで、特に寝る時間は遅いと2時、3時になっていました。
朝活をしてからは遅くとも0時までには寝て、土日も含めて6時半に起きるようになりました。
土日の朝の時間が格段に増えたためQOLが上がった気がします。

## わるかった点

* 進捗が鈍化
* 投稿数が減った
* やりたいことがぶれる

上記で挙げた3点は以下の通り、完全に**悪循環**でした。
進捗が鈍化→投稿数が減る→やりたいことがぶれる→進捗が鈍化...

### なぜ進捗が鈍化したか

これは単純に実装内容が少し難しくなったからだと思います。
前回の振り返り時点でやったことは、プロジェクト作成や単純な表示や登録のみだったため、目標が達成しやすかったです。
今回やったことはログイン回りのカスタムであったり、reactでどうやってログイン情報を扱うかなど、少し発展的は内容が含まれていました。

### 負のループのはじまり

進捗が鈍化すると、投稿ができなくなります。
もちろん「なにもできませんでした」という投稿はできるのですが、あまりにも投稿するのに忍びない内容なのでそういった内容の投稿は避けました。

こうして、進捗や投稿数が思い通りにならないと
**「これ、ほんとにやるべきなのか。もっとやるべきことあるのでは？」**
という悪魔の声が聞こえてきます。

実際にやらない理由を探すのに必死でした。

* AIが来てるから、それを勉強したほうがいいのでは？
* いいアイデア思いついたから、それをやったほうがモチベが上がりそう
* やる気をだすための動画を探そう
    * 動画探してる最中にショート動画を見だす

これらが間違っているわけではないですが、ここで逃げ出す奴が
AIの勉強をしたとて、いいアイデアが思いついたとて、やりきることなどないでしょう。

## どうするか？

### とにかくやる

* 毎日投稿
* 毎日開発

結局のところ、記事の質が低くてもとにかく投稿する。
これしかない。とにかく手を動かして、少しでも毎日前進する。
当たり前すぎるけど、毎日決めたことをやる。

### 自分が今どういうフェーズか

純資産1500億円のアレックス・ホルモジさん曰く、達成するまでの道のりは、6個のフェーズに分かれているらしいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2263720/33afba33-fd36-b00c-7d09-7b8d2aa330fb.png)

私は今、2にいます。
最初はこれやりきったら、なんかあるかもと始めました。
しかし、簡単なアプリ作成一つでもやることが多く、ほんとにやり切れるかどうか、少しモチベーションが下がりはじめています。。
**とにかくやりきる**という目標を掲げてがんばっていきたいと思います。

達成の6個のフェーズの詳細は以下動画をご視聴ください。

https://www.youtube.com/watch?v=NAypdDUvE2s&t=2s
スタートアップ企業で未経験エンジニア | 2ヶ月目を振り返る

気がついたら2ヶ月目も終わろうとしてます。
だんだんと慣れてきたエンジニアキャリア2ヶ月目を簡単に振り返ろうと思います。
## やったこと
### Shopify機能実装
→週に3-4セクションくらいは作ったり改修したりしてました。難しくない実装がとめどなく押し寄せる環境にメンタルやられるところでした。幸いクライアントとの関係もよく、優先度を下げたり調整できたおかげでなんとか全部やり切りました。

具体的にやったことの例
- LP用セクション（KV、テキストセクション、画像セクション...）の作成
- 謎のカート追加処理エラー対応（僕らの前に請け負ってた企業が作った謎ロジックを1から作り直すパワー作業）
- webhookを使って基幹システムと連携→JSON考えたやつすげぇって思ったのでいつか記事にします

### 新規Shopifyストア構築
初めてのストア構築作業でした。とはいっても軸のソースコードを今回向けに改修するだけなんですが、着手して２週間でテスト→リリースという感じで、納期がきつかったです。
（終わった感だしましたがまだ絶賛やってます。）
できるエンジニアはソースが綺麗と風の噂で聞いてたが、まさかここまでとは...と思わされました。
```
{% comment %} 〜機能 {% endcomment %}
//処理

{% comment %} 〜機能 {% endcomment %}
//処理
```
よく考えたら普通こうだろ、ってエンジニアの人は思うかもしれませんが、初心者からするとこれのめんどくささや丁寧さにびっくりさせられます。

特に人のコードを見るのが初めてだった私は、ここまで丁寧な実装を求められているんだと実感しましたが、当人は「無意識だった」といっていました。

→実際に構築していて思うのが、「これは説明かかなくてもわかるでしょ」という思い込みが潜在意識の中にあって、いざ何もコメントを書かずにソースを人に見せた時、「このコードはどういうこと？」と聞かれることが特に僕は多かったです。
そんな中で先輩の適切な改行、適切なインデント、抜け目ない説明コメントを見て、あまりのわかりやすさにさすがにまだまだ実務経験が足りないなと痛感しました。

### 新規Shopifyストア構築要件定義
ここは前職でもやっていたものの、実は1番しんどかったです
いわゆるリプレイス案件なんですが、顧客連携、ポイント連携など自社の既存システムからの移行事項が多く、機能要件が本当にSaaS構築か？というレベルでゴリゴリでした。

前職だといわゆる0から構築が多かったので新規用の要件定義ができれば良かったものの、今では何かからリプレイスする案件の方が割合は多く、どうやって移行するか、もし自社の独自システムがあるなら基幹側のどんなAPIと繋ぐのかとか、そもそもテーマはLiquidベースでいいの？Hydrogenじゃないとできない？など、考えることが多かったです。

※ちなみに↑みたいな話が多く、最近は「Reactの学習しておいてね〜」「来月Laravel案件入る〜？」と言われてしまい、絶賛勉強中です。このスピード感がすごく好きで自分はベンチャー向いてるなと思いました。

## 2ヶ月目の学び
5月駆け抜けてみて、「少しの仕事でも自分をアピールする」ことの大切さを学びました。
実は↑以外にも、Shopify Flowでの不正注文対策フローの構築やShopifyアプリ調査表作成など、今まではなかった文化の醸成も行ってきました。
その甲斐あってか、Shopifyの新規提案に僕をアサインしていただく機会がめちゃくちゃ増え、やっとベンチャー企業らしい忙しさになってきたぁ！と思っています。

自分の限られた出場機会でどれだけ自分の強みをアピールできるか、それによって多分この先の自分の立ち位置がすごく変わってくるんだろうなと思いました。もしフロー構築や表作成をしなかったら新規提案なんて夢のまた夢だったかもしれないし、今後もReactやLaravelのアサイン機会を逃したら次いつ回ってくるかわからない、という気持ちで常に仕事をしてます。
自分はまだ2ヶ月目だってことを知っててアサインしてくれていて、「絶対ミスするなよ！」という環境ではないので、できるできない関係なくなんでも手を挙げるようにして、まずは経験をしようと思ってます。

また地味に、自分のアピール力は大学の時のゼミの就活対策で培われた能力が存分に活きているなと感じました。
就活対策もこんなところに活きるなら捨てたもんじゃないなと思いました。

何はともあれ、2ヶ月目もなんとかくらいつけたので、この調子で3ヶ月目も頑張りたいですし、何より来月どんな仕事をするのかワクワクしてます。

夏には自由研究と称して何かサービスを作る予定なので、それに向けての自習も忘れずに、これからも頑張ります。
AWS Secrets Manager

# はじめに
この記事はAWS SAA試験勉強のための、AWS Secrets Managerに関する知識のまとめです。


# AWS Secrets Managerとは
データベースやその他のサービスの認証情報を安全に暗号化してシークレットとして保存・取得する仕組みを提供するサービスです。

# パラメーターストア
EC2インスタンスがパラメーターストアにアクセスして認証情報を取得するためには、パラメーターストア内のシークレットを読み取る権限をEC2インスタンスに付与する必要があります。

# 自動的にローテーションする機能
AWS Systems Managerパラメーターストアではなく、AWS Secrets Managerのみが認証情報を自動的にローテーションする機能を有しています。

# AWS Secrets Manager シークレット
AWS Secrets Manager シークレットは、パスワード、ユーザーネームやパスワードなどの一連の認証情報、OAuth トークン、または、暗号化された形式で Secrets Manager に管理することができます。このシークレットにTSL証明書をインポートして、保存とダウンロードを管理することができます。
pywinautoをインポートしている時にtkinterのfiledialog.askdirectory()が使えない話

# 問題
tkinterのフォルダ選択ダイアログを開くメソッドとしてfiledialog.askdirectory()がある。
tkinterのfiledialog.askdirectory()とpywinautoを同時に実行するとフリーズする。

# 解決策
こちらのissueが参考になった
https://github.com/pywinauto/pywinauto/issues/517

要約するとpywinautoとaskdirectory()でCOMのスレッドの立て方が異なるために干渉するらしい。

以下のようにすればいいらしい
```python
import sys
sys.coinit_flags = 2  #これを挿入

import pywinauto
import tkinter.filedialog
```
CloudFormationでParameter指定できるようにする

## はじめに

最近、IaC（Infrastructure as Code）でAWS環境を構築する必要がありましたが、IaCの知見がない私は環境ごとにYAMLファイルを作成するという非効率な方法をとっていました…

正直環境ごとにファイル内の設定を書き換えるのは手間がかかるので、もっと便利な方法がないかと探していてこの方法にたどり着きました！

備忘録としてこの記事では、AWS CloudFormationテンプレートでパラメータを指定し、環境ごとに異なるリソースを作成する方法について説明します！

## 前提条件
- AWSアカウント
- AWS CloudFormationの基本的な知識

## CloudFormationテンプレートの例

以下に示すのは、環境ごとに異なるリソースを作成するためのCloudFormationテンプレートの例です。

```
AWSTemplateFormatVersion: "2010-09-09"
Description: Prefix

Parameters:
  Prefix:
    Type: String
    AllowedValues:
      - dev
      - stg
      - prd
    Description: Prefix
  DevelopAccountId:
    Description: Develop Account ID
    MaxLength: 12
    MinLength: 12
    Type: String
    Default: ************
  StagingAccountId:
    Description: Staging Account ID
    MaxLength: 12
    MinLength: 12
    Type: String
    Default: ************
  ProductionAccountId:
    Description: Production Account ID
    MaxLength: 12
    MinLength: 12
    Type: String
    Default: ************

Conditions:
  CreateDevResources: !Equals [!Ref AWS::AccountId, !Ref DevelopAccountId]
  CreateStagingResources: !Equals [!Ref AWS::AccountId, !Ref StagingAccountId]
  CreateProdResources: !Equals [!Ref AWS::AccountId, !Ref ProductionAccountId]
  CreateDevOrStagingResources:
    !Or [Condition: CreateDevResources, Condition: CreateStagingResources]
```

## パラメータの詳細

このテンプレートでは、以下のパラメータを使用しています。

- Prefix: 環境のプレフィックスを指定します。dev, stg, prdのいずれかの値を取得
- DevelopAccountId: 開発用のAWSアカウントIDを指定します。12文字の文字列
- StagingAccountId: ステージング用のAWSアカウントIDを指定します。12文字の文字列
- ProductionAccountId: 本番用のAWSアカウントIDを指定します。12文字の文字列

## 条件の詳細
このテンプレートでは、以下の条件を使用しています。

- CreateDevResources: 現在のAWSアカウントIDが開発アカウントIDと一致する場合にtrue
- CreateStagingResources: 現在のAWSアカウントIDがステージングアカウントIDと一致する場合にtrue
- CreateProdResources: 現在のAWSアカウントIDが本番アカウントIDと一致する場合にtrue
- CreateDevOrStagingResources: 現在のAWSアカウントIDが開発またはステージングアカウントIDと一致する場合にtrue


## おわりに
この記事ではCloudFormationテンプレートでパラメータを使用し、環境ごとに異なるリソースを作成する方法を紹介しました。この方法を使用することで、開発、ステージング、本番環境ごとに異なる設定を1つのYAMLファイルで簡単に管理することができます。
IBMCloud Windows環境からのメタデータアクセスの設定

## 記事概要

Windows環境から、IBMCloudのVPCメタデータにアクセスする際にデフォルトのルーティング設定の場合、メタデータがある領域へのルーティングテーブルがないためエラーとなる。
従ってWindows環境の場合、ユーザにて追加でルーティングの設定をする必要がある

デフォルトの状態でメタデータにアクセスした際は、下記のようなエラーとなる
・Trusted ProfileでIBMCloudへのログインを試行した例
リンクローカルアドレスへのネットワークアクセスに失敗している
```
"http://169.254.169.254/instance_identity/v1/token?version=2022-03-01": dial tcp 169.254.169.254:80: connectex: A socket operation was attempted to an unreachable network.
```

参考
[VPC インスタンス・メタデータの概要](https://cloud.ibm.com/docs/vpc?topic=vpc-imd-about)

## 設定内容
下記Docsに記載の通り、ルーティング設定が必要

[インスタンス・メタデータ・サービスを使用するための Windows サーバーのセットアップ](https://cloud.ibm.com/docs/vpc?topic=vpc-imd-windows-configuration#imd-windows-add-route)

ルーティングを追加した後、リンク・ローカル・アドレスを使用してインスタンス・メタデータにアクセス可能となる
Amazon EKS

# はじめに
この記事はAWS SAA試験勉強のための、Amazon EKSに関する知識のまとめです。

# Amazon EKSとは
Amazon Elastic Kubernetes Service (Amazon EKS) は、AWS で Kubernetes を簡単に実行できるようにするマネージド型サービス。

# Amazon ECSとの違い

ECSはAWS独自のコンテナオーケストレーションを採用していますが、EKSはKubernetesを採用しています。

# VPCとのプライベート接続

AWS PrivateLinkのインターフェースVPCエンドポイント を使用して、VPC と Amazon Elastic Kubernetes Service 間にプライベート接続ができます。

# メトリクスとログの収集と可視化

Amazon ECS、Amazon EKS、および Amazon EC2 の Kubernetes プラットフォームに対して、**CloudWatch Container Insights** を設定することで、コンテナ化されたアプリケーションとマイクロサービスのメトリクスとログを収集して可視化することができます。

# AWS Load Balancer Controller 
アプリケーションを頻繁にテストできるようにするためには、バージョン切り替えやテスト実行時のトラフィック処理をコントロールする機能が必要です。AWS Load Balancer Controller によって Amazon EKSコンテナーのKubernetes クラスター向けの AWS Elastic Load Balancer を管理して、コンテナ間のトラフィックルーティングを実施することができます。

# ブルーグリーン・デプロイメント


ブルーグリーン・デプロイメントは、ユーザートラフィックを、アプリケーションやマイクロサービスの以前のバージョンから、ほぼ同一の新しいリリースに徐々に転送するアプリケーション・リリースモデルで、両バージョンが稼働中の状態で実施するものです。
古いバージョンはブルー環境、新しいバージョンはグリーン環境と呼ばれます。


# Cluster Autoscaler

Cluster Autoscalerは、Amazon EKSクラスタ内の**ノード数**を自動的に増減させる機能です。
linux kali の設定

ハッキングラボの作り方を読んで
https://www.amazon.co.jp/ハッキング・ラボのつくりかた-仮想環境におけるハッカー体験学習-IPUSIRON/dp/4798155306/ref=pd_aw_vtp_m_sccl_1/355-1945200-3178018?pd_rd_w=r4JNj&content-id=amzn1.sym.15c9b40b-c86d-4e4f-b8db-1e18316e97eb&pf_rd_p=15c9b40b-c86d-4e4f-b8db-1e18316e97eb&pf_rd_r=N4HVDFPQ7DJP0MPC0CA4&pd_rd_wg=pWX9C&pd_rd_r=31f40fe6-0023-44b0-a255-be4e9eca0241&pd_rd_i=4798155306&psc=1

NW環境
ホストOS
kali ver 

# 本読んでやってみてつまづいたところを挙げていく
○最初に
本書内で使用するソフトウェアの仕様変更などでスムーズに本の内容通りには進まなかった。仕様は変わるからしょうがない。

以下の書評コメントにすごく助けられた。ありがとうございました。
https://www.amazon.co.jp/gp/aw/review/4798155306/R3CJQ5WDSPL1D5?ref_=cm_sw_r_mwn_dprv_9DHD380EXV405Z8E0PFX_1&language=en_US

### 日本語入力は諦めた。日本語情報をインストールしようとすると失敗した。

### NWアダプターはデフォルトで2つのインターフェースが機能していた。
固定ip振るためにnetworkファイルに色々書いたけどダメだった。
kaliのメニューからNETWORKを検索してnetwork advenced settingみたいな名前のGUIからホストオンリーアダプターの固定ipを指定。
実在するルーターにpingできた。
仮想インターフェースにpingできた。firewallの規則変更
yahoo.co.jpあてのpingは失敗。tracerouteでyahooまでの経路調べたけどNATの設定でドロップされているっぽい？それかwindowsのFirewall。firefoxでyahoo開けるからHTTPは許可されていている。nslookupもできた。
経路情報は登録されているので調査終了。

### SSH設定は必須じゃないのでスルー
本書通りだとうまくいかないらしい

### control + altキーでTerminalが開けた
デフォルト設定

### めんどくさくなったので終了
環境構築が面倒だったので諦めた。いつか気分が乗ったらやることに。というより、仕事の関係で先にやった方がよさそうなことが出てきたので一旦保留。
リバースシェル、バックドアの設置はやってみたかったな。

### セキュリティについて感じたこと
・よくわからんファイルをダウンロードしない/インストールしない
・使用しているOS/RT/FW/ソフトウェアなどで脆弱性が公表されたら使用をやめるかバージョン上げる
・サポート期限切のソフトなどを使用しない
・端末のファイヤーウォールを使用する
上のことを守っていればハッキングは中々されないんじゃないのかなぁ。
あと、セキュリティ対策ソフトっていらなくないか？
6・気づけば私４・を2個あげてるやん

ありがたいことに昨日初コメントを頂きまして、日報のようになっている点についてのご指摘だったのですが、いやあこれに関しては私が悪いねえ
でも、辞める気はないかな。
それは、なんでかって言われたらいつか私は成功するし、そんな奴のリアルな生活はインスタのショート動画で流れてくるようなキラキラしたり、ストイックなものじゃないんだよって伝えられるものだってことが分かってるから。
まあ今の勉強量じゃ先は長そうだけどね（笑）
なら私のこの記事は日報じゃないと思わせるべく、今日学んだ一部でも書いていきますかな。
<img class="~" src="リンク先”＞
とか久々すぎて思い出すのに時間かかっちゃいました。
でもやっぱり文字打つだけで形になるって面白いよね
今は、学びがないと思われてもいつかは有料級の記事出していくから今後ともご贔屓よろしくお願いします
では、みなさん良い夢を〜
Planner: Task Details(タスクの詳細) への Deep Link の作成

# 背景

プランナーのタスクを、Teams のタブに追加した際に、そのタスク詳細へのリンクを作りたい、という要望があった。

タブlinkは難しかったので、代替案として、Planner でのタスク詳細へのリンクを提示した。

# 概要

```url: Deep Link of the task details
https://tasks.office.com/{tenant}.onmicrosoft.com/Home/Task/{task ID}?Type=TaskLink&Channel=Link
```

{tenant}: 参加しているテナントの名称
{task ID}: 該当タスクの ID。 Plan ID ではなく、Task の ID

## 実際に飛んだ状態

こんな感じで、
- ブラウザー上のプランナーで
- タスクの詳細へ
飛ぶことが出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9c85bef1-a654-571c-3446-9d75176cd05f.png)

# あとがき

- Teams の Tab への リンクを作れるようになるといいなぁと思いつつ調べる気力は今のところない・・ :sweat:
Gemini for Google Workspace で営業・マーケティングをレベルアップ！プロンプト作成入門

みなさんこんにちは。営業・マーケティング向けの記事になりますが、本記事には若干の技術的要素が含まれています。どのような要素が含まれているか最後まで考えながら読んでみてください。

# Gemini for Google Workspaceで営業・マーケティングをレベルアップ！プロンプト作成入門
Google WorkspaceにGeminiが搭載され、業務効率化の新たな扉が開かれました。この記事では、Geminiを最大限に活用するためのプロンプト作成術を、営業・マーケティング担当者向けに解説します。具体的なプロンプト例も交えながら、Gemini を駆使して日々の業務を効率化し、成果を最大化する方法を学びましょう。

## プロンプトとは？Geminiとの対話

Geminiは、Google Workspaceに組み込まれた AIパートナーのような存在です。プロンプトとは、このパートナーとの「対話」を始めるための言葉です。効果的なプロンプトを作成することで、Geminiはあなたの業務を強力にサポートしてくれます。

## プロンプト作成の基礎：4 つの要素

効果的なプロンプトを作成するには、以下の 4 つの要素を意識することが重要です。

* ペルソナ
    * 誰に話しかけるのかを明確にすることで、Geminiの口調やスタイルが変わります。「あなたは優秀なマーケティング担当者です」のように伝えてみましょう。
* タスク
    * Geminiに何をやってほしいのかを具体的に指示します。「競合分析をしてください」「キャッチコピーを考えてください」など、明確な指示が重要です。
* コンテキスト
    * タスクに関連する背景情報を提供します。例えば、市場分析を依頼する場合は、業界や競合他社の情報を共有することで、より精度の高い分析結果が得られます。
* フォーマット
    * どのような形式で結果が欲しいのかを伝えます。「箇条書きでまとめてください」「表形式で比較してください」など、希望する出力形式を指定しましょう。

## プロンプト作成のガイドライン(Geminiとの対話はスムーズに！)

Gemini はあなたの言葉から意図を汲み取ろうとします。そのため、以下のガイドラインを参考に、プロンプトを作成してみましょう。

* 自然な言葉で話しかける
    * まるで同僚に頼むように、Geminiに話しかけるイメージでプロンプトを作成します。
* 具体的に指示する
    * 曖昧な表現は避け、Geminiにしてほしいことを明確に伝えましょう。
* 質問を繰り返す
    * 期待する結果が得られない場合は、プロンプトを修正して再試行します。Geminiとの対話を繰り返すことで、より良い結果に近づけます。

## 営業担当者向けプロンプト例

ここでは、営業担当者が Geminiを活用する際の具体的なプロンプト例を紹介します。

### 顧客との関係構築

```
[顧客名]との初回ミーティング後のフォローアップメールを作成してください。
話し合った重要なポイントを要約し、未解決の質問があれば回答してください。
```

```
[顧客名]が私たちの新しいサービスを購入してから1か月が経ちました。
感謝の気持ちを伝えるとともに、他に何か提供できることはないか尋ねるメールを作成してください。
[他の製品]についての情報を加えてください。
```
### 新規顧客への電話の準備

```
[顧客名]との営業電話で使用するスクリプトを作成してください。
電話はビデオ通話で行われ、30分を予定しています。

[自社製品/ソリューション]が顧客の潜在的な課題をどのように解決できるか、
[自社]の配送システムがどのようにシームレスかつタイムリーな配送を保証するか、
競争力のある価格設定とボリュームディスカウント表、[顧客の業界]における顧客事例などを
スクリプトに含めてください。
```

```
[製品名]のエレベーターピッチを作成してください。
主な利点、競合他社との差別化ポイント、[製品名]が解決する課題などを含めてください。
```

## マーケティング担当者向けプロンプト例

マーケティング担当者がGeminiを活用する際の具体的なプロンプト例を以下に示します。

### 市場調査とトレンド特定

```
[業界]業界の市場調査を行い、新しいトレンドを特定する必要があります。
[URL]を使用して、新たなトレンドや変化する消費者嗜好を明らかにしてください。
```

```
新しいメッセージのA/Bテストが必要です。現在のメッセージは[メッセージ]です。
3つの異なる広告コピーのバリエーションを作成してください。
```

### コンテンツの作成と配信管理

```
[名前]が[会社]に[役職]として入社することを発表するブログ記事を作成してください。
[経歴の詳細を2、3点共有する、例えば、以前の役職と会社、専門組織への関与など]。
```

```
コンテンツの拡散状況を追跡するためのプロジェクトトラッカーを作成してください。
チャネル、所有者、URL、優先度（低、中、高）の列を含めてください。
```

## Geminiで可能性を広げよう！

Geminiは、あなたの創造性と生産性を最大限に引き出す強力なツールです。この記事で紹介したプロンプト作成のヒントや例を参考に、Geminiを活用して、あなたのビジネスを新たなステージへと導きましょう。


## まとめ
みなさん気が付きましたか？この記事は下記のプロンプトガイドの情報を元にGeminiを使って作文したものです。ブログを書くことももちろんできますが、それよりファイルの内容を分析して読みやすい情報に簡単に加工できるという点が個人的にはすごく魅力的でした。具体的なプロンプトのアイデアは上記の通りとなりますので、色々と試してみてください。

https://inthecloud.withgoogle.com/gemini-for-google-workspace-prompt-guide/dl-cd.html
未経験の30代が、独学でエンジニアになって10年経つまでを振り返る

# はじめに
現在の40代のアプリエンジニアです。10数年前に独学でアプリを作って以来、もう10年近くフリーランスとして活動中。年収は年によってばらつきはあるけども、だいたい1000万円弱。最近よくフリーランスの環境とか、未経験でもエンジニアになれるか等、聞かれることが何回かありました。そこで、参考になるかはわかりませんが、私のキャリアを紹介しようと思います。

元々、私は大学卒業後は大学院に進み、しかも博士課程まで進み、さらに30過ぎまでオーバードクターとして大学で研究員をしていました。専攻は純粋な文系学問。Excelは使えましたが、プログラミングはまったく経験なし。

そんなある日、私はiPhoneを買いました。当時最新のiPhone 4です。しかも、iPhone 3GSからAppStoreが一般の開発者に解放され、誰でもアプリを公開できるという。ここから私のエンジニア人生が始まりました。以下、おおまかに年表形式で。

## 2012-2014年
2012年3月に、初めてXcodeをダウンロードした記録が残っています。そこから書店に行き、「iPhoneアプリ開発入門」と書いてある本を片っ端から購入。起きている時間のほぼすべて、本を片手にコードを書きました。
現在でも本棚に残っている当時の本は、約40冊ほど。本も読み慣れてくると読み方が分かってくるもので、途中からは私が作りたかったアプリに役立つサンプルが載っているものを読んでいました。そしてなにより、言語の習得は**質より量**が重要です。**書いたコードの意味が分からなくとも、何がなんだかさっぱりでも、それでも前へ進み続けること**が大切。

2013年、私は自身初めてのアプリをリリースします。開発期間は7ヶ月。当時、本業の研究がひと段落して、時間があったことが幸いしました。
ただしこのアプリ、本のサンプルを繋ぎ合わせたような出来で、完成度は素人レベル。完成度の低さに自分でも納得できていなかったのですが、「リリースする」という経験をしたくてなんとかリリースにこぎつけました。
当時はprovisioning profile周りがいろいろと大変で、開発に使用していたMacBook Airを窓からフリスビーにするか、フタを逆極めしてヘシ折るかで10分悩んだこともありました。エラー、大変なのよね。。

その後、私は2つほどアプリをリリースします。ですが、それはいずれも素人クォリティ。。。アプリを3つ作っても、なかなかクォリティが上がらないことが当時の私の悩みでした。そこで私は、ある決断をします。**そうだ、武者修行の旅に出よう**と。

## 2014-2018年
当時、副業ブームが来ていたこともあって、ランサーズやクラウドワークスといった副業サイトが伸びていました。私もそこに登録して、**格安で開発案件を請け負う**という、武者修行を始めたのです。
お金をもらって開発を請け負えば、嫌でも気合が入るだろうという目論見です。お金が目的というわけではなく、自分のクォリティを上げることが目的でした。最初は「開発の一部を手伝ってくれ」といった簡単な案件から始め、ブラックな開発会社の炎上案件、一緒にベンチャーを作ろという案件まで、いろいろと手を出しました。副業なので、最悪お金をもらわなくとも良かったのです。

おかげで実力はメキメキと付きました。中でも、某◯イバーエージェントの案件に参画することがあり、それは私にとってエンジニアとしての基礎知識を得る大きな体験になりました。その案件は、◯イバーエージェントが某社から買い取ったアプリを自社開発に切り替えるというプロジェクトで、買取に伴い、いくつかの改修を行う案件でした。元の開発会社はベトナムの開発会社で、ちゃんとしたエンジニアの書いたコードを見ながら、GitHubをベースに（当時はまだGitHubを使えてなかった）開発する形は、今でも大きな経験になったと思っています。初の大型案件ですね。

そんな中、2017年末には、某◯ンサーズ事務局から表彰されかかるほど私は実績を上げていました。本業はいまだ大学の研究員でしたが、エンジニアとしてもやっていける自信がつきました。

## 2018-2024
大学の研究員を辞め（いまだに別の形で大学に籍はありますが）、フリーランスとしてやっていくことに決めました。◯ンサーズはもうやめにして、エージェントを通したフリーランス案件に参画するようになりました。

エージェントが紹介してくれた案件は、私の実績（個人名でリリースしたアプリは13個、◯ンサーズで参画した案件は30以上、CTOとして参画したベンチャー2社）を考慮してか、良い案件ばかりであったと思います。基本的にフルリモートで、名の知れた企業ばかり。技術的に高度な案件もありましたが幸い完遂することができ、良い待遇を維持できていると感じています。時間的に余裕もあったので、Objective-CからSwiftへの転換、UIKitからSwiftUIへの転換（こちらはまだ進行中）もクリア。Swiftもバージョンアップを重ねて難読化が進んでいますが、しっかりキャッチアップできています。

それよりも、この時期に力を入れていたのは、起業です。

当時、コワーキングスペースを初めて使い始めたこともあって、「アプリを作ってくれ、一緒に起業しよう」という話がいくつかありました。大きなものは2つほど関わり、どちらもアプリ自体は私が作ってリリースしました。ただ、どちらもビジネスとしては成功しませんでした。

私の関心として、エンジニアリングには未だ大きな関心はあったものの、それを社会にいかに実装するか、何を作るべきかということは考えるようになりました。その結果、今年に入って大きなプロジェクトを始めています。

## 振り返りとこれから
エンジニアリングが好きで、学ぶ力があること。これは自分の強みだと思っています。土日に趣味でアプリを作れる人間は、そうでない人に比べて技術面で優位を得られます。
困難に直面した時も、いまは検索にメンタリングサービス、ChatGPT、なんでもある。コードを書いてできることであれば、やる気さえあれば何でもできます。

他方、社会に貢献すること、事業を作ることにも興味があります。これからの数年はそちらに力を入れていく予定。
ただし、それが可能なのは**エンジニアリングに詳しいから**であると思っています。iPhoneで何ができ、何ができないか。それと社会の中の需要を合わせることで事業が作れると思っています。なのでエンジニアリングから離れることはない。その上で、それを活かす方法を考えていきたいと思っています。

簡単でしたが、私のここ10年の振り返りです。何かの参考になれば幸いです。
SpringBoot DIコンテナ

# 概要
SpringBootではDIという概念がありますが、「いちいちnewしなくて済む！」という理解しかなく…改めて調べて得た内容をここにまとめます。

# DIとは
DIとは「Dependency Injection」の略で、「依存性の注入」と訳されます。
DIはソフトウエア開発のデザインパターンの１つで、DIを用いることで、コンポーネントを構成するインスタンスの生成と依存関係の解決をソースコードから分離することができます。あるクラスAのaメソッドで、あるクラスBをnewして使用している場合、クラスAのaメソッドはクラスBに依存している、と言えます。

## 依存しているとどんなよくないことが起きるか 例
### 結合度の高いクラスになる
aメソッドはクラスBに依存しているため、例えばクラスBの実装が完了していないと、部分的に差し替えたりと効率が悪くなります。
### テストがしにくい
aメソッドのテストをしようとしても、クラスBの実装を考慮してテストをしなければならなかったり、都度インスタンス化する必要があるなど、テスト観点上都合が悪いです。
### メモリの利用効率が悪い
aメソッドが呼ばれるたびにクラスBがnewされているので、都度メモリを消費し、効率が悪いです。

# DIコンテナ
上記を解決するのが、SpringBootでいうところのDIコンテナになります。
SpringではDIコンテナというところでインスタンスの管理を行います。
このDIコンテナで管理されるコンポーネントをBeanと呼びます。
クラスをBeanとして定義することで、DIコンテナに管理させます。
Bean定義する場合、クラスに下記アノテーション（ステレオタイプアノテーション）を付与します。
|アノテーション|説明|
|-|-|
|@Controller|Spring MVCと連携ができる。コントローラークラスに付与。|
|@Service|業務ロジッククラスに付与|
|@Repository|データアクセスクラスに付与|
|@Component|上記に該当しないクラス|

# 注入
上記でBean登録したクラスを使用したい（注入）場合、@Autowired をクラスAに記載することで、依存性の注入ができる。
@Autowired でインスタンスを生成しているのではなく、DIコンテナにあるBeanを渡してもらってる（注入）しています。

# 注意点
なんでもかんでもDIコンテナに登録して注入させるようにすればいい、ということではありません。
注意すべきは、Beanはデフォルトだとシングルトンになるため、複数のスレッドで１つの同じインスタンスを共有している状態になります。
なので、インスタンス変数を持っているクラスをDIした場合、注入先で利用されるたびにインスタンス変数が変わりうるためスレッドセーフになっていません。
なので、EntityやDTOなど値を保持するクラスなどはDIしない方がよいです。
インスタンス変数と違って、ローカル変数（メソッド内で使用している変数）の場合はスレッドセーフになります。

# 参考文献
https://tech-blog.yayoi-kk.co.jp/entry/2022/12/09/000000

https://www.shookuro.com/entry/2017/04/09/133135

https://qiita.com/uqichi/items/5f59817beb3dff9c0c1e

https://qiita.com/NagaokaKenichi/items/34bc62e572256c5710e1

https://www.slideshare.net/slideshow/spring-121307860/121307860

https://xtech.nikkei.com/it/article/COLUMN/20070820/279950/

https://www.shookuro.com/entry/2017/04/09/133135#google_vignette

https://www.i-vinci.co.jp/techblog/599

[Spring徹底入門: Spring FrameworkによるJavaアプリケーション開発](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3%81%AB%E3%82%88%E3%82%8BJava%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BENTT%E3%83%87%E3%83%BC%E3%82%BF/dp/4798142476/ref=sr_1_2?crid=3QC7O16LEOBK4&dib=eyJ2IjoiMSJ9.gYKse1d39hB6CLySFspy9y0GG01BtVNLwwnW1qKQ3-GBcSHWV90ZC26jYW6inCNAdMXCSjpdLaSpdPAIyWbC5OwtBmJPC4tP8edy73Q82QLdipyCa8fBtBEZok-it9L1Ouprx9HAQ7WzjalNaJ_l5xVWnJoiDvvQ-yEYvh4tUIErTmMu3IRG5dv34cFH-pdAUlrmI3sqFpcAKbkAuC6FKkLub230EKxtltFm346bzyCdyH3Qdti0UoeIGXRp2XHmYTDR4lR--zrQ6gwADJfSXUe2jGSDwPbv8XhWBvOL8Gk.0xDItgnEeuIkxwm4BqSLFjiKWeogpPZof0OKaGxdOek&dib_tag=se&keywords=spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80&qid=1716728370&sprefix=Spring%E5%BE%B9%E5%BA%95%2Caps%2C187&sr=8-2)