OmniAICreator/Qiita-1.07M huggingface dataset:
【余談】これからの「わたし」の話をしよう。

# いきなり衝撃発言
みなさんこんにちは、husuiです。涼しくなってきましたね。
UiPath（ユーアイパス）[^0]というRPA[^1]の会社で、若干業務よりの人として働いて **いました。**
[^0]: https://www.uipath.com/ja
[^1]: Robotic Process Automationの略です。

え？ **`「いました。」`**？

そうです。実はわたくし、 **2023/10/13（金）で卒業[^2]する** ことになったんです。
とくにネガティブな理由は無いです。安心してください。

~~あ、なのでプロフとか過去記事の導入部分とか後で修正します。「元」UiPathという感じで…~~
→プロフとか過去記事導入部分を修正しました！わかりづらいと思いますが（笑）
[^2]: 卒業　https://ja.wikipedia.org/wiki/%E5%8D%92%E6%A5%AD_(1967%E5%B9%B4%E3%81%AE%E6%98%A0%E7%94%BB)

# 露天風呂で思いついたRPA展開メソドロジー連載
これまでずっと自分自身でくすぶっていた「私見的RPA展開メソドロジー」を、これを機にQiitaに卒業までに一気に書いてみよう！と、大井町駅となりにあるおふろの王様[^3]の露天風呂で急に思いつき、急いで家に帰って構想を練ろうとするも、自分自身がバカなので構想を練ることができず、**「考えるより手を動かせ！」** という過去の誰かの謎の教えをうっすら思い出し、mac[^4]を開いて勢いで書き始めたのがこの第一弾の記事です。
[^3]: おふろの王様　https://www.ousama2603.com/
[^4]: mac book air M2 13inch https://www.apple.com/jp/shop/buy-mac/macbook-air/13%E3%82%A4%E3%83%B3%E3%83%81-m2

https://qiita.com/husui/items/9567ab182e80890b7e35

# そしてダラダラ書いてメソドロジー10記事目
本日時点（2023/10/12）でこのメソドロジー記事は **10記事目** に突入しました。しかし、残念ながらまだ終りが見えません。筆者自身の頭の中も終りが見えていないので、本当に完結するのか放送事故になるのかわかりません。
ちなみにこれまでの10記事のタイトルを見返してみると **さっぱり内容がわからないタイトルばかりだった** ので、今回一新しました。（実はそれでもわかりづらい）

こちらが最新の10記事目のリンクです。
なんかタイトルがアウトドアメーカーのキャッチコピーみたい。

https://qiita.com/husui/items/2ccd4ed2a3a4c02a2996

# 酷い手書きイラストで妥協
わかりやすい図表などを用いることもできたのですが、とてつもなくめんどくさいので、 **自分自身の手書きイラスト** を入れるようにしました。またこのイラストが酷いこと酷いこと。

今の時代だったら「いらすとや[^5]」を上手く組み合わせて画像を作ったり、生成系AI[^6]に頼んでイラストを作ってもらったりもできるのですが、とにかくスピード!!スピード!!スピード!![^7]を優先したので手書きのまんまです。すいません。
[^5]: https://www.irasutoya.com/
[^6]: 生成的人工知能　https://ja.wikipedia.org/wiki/%E7%94%9F%E6%88%90%E7%9A%84%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD
[^7]: 楽天主義＞成功のコンセプト https://corp.rakuten.co.jp/about/philosophy/principle/#success

ちなみに酷い手書きイラストを書くときに使用しているホワイトボードはこちらです。小さくてとっても重宝しています。おすすめ。↓コチラ↓

https://www.amazon.co.jp/gp/product/B00MHDGQPQ/

# 誰も書かないような記事を書いてみた「自爆ボタン」
ちょっとはテッキーな事も書いてたりします。
でも他のメンバーのみなさんのほうがとても製品知識的に実になる話を記事として書いていただいているので、私はまた全く違った切り口でコチラの記事を書きました。
これ意外と反応が良くて私のこれまでの記事の中でじつは一番のView数を出しているんですよね。

https://qiita.com/husui/items/40d02dd236b4812014a1

今見てみるとフリー画像とかも貼って、よくあるフツーのブログ記事みたいな書き方になっていてなんとも恥ずかしいですねー。

# 私の「推しの子(おっさん？)」
ちなみに先程「他のメンバーのみなさん」と言ったのですが、私が特に推しているメンバーさんがいらっしゃいます。内容的にとてもおもしろくて、技術的にもとても有用な記事を量産されていて私が最も尊敬しているお二人が以下です。

https://qiita.com/ManabuTech

↑@ManabuTech さんはツカミが上手いですよね。嫉妬するくらい記事が面白いです。そして技術ネタも面白い。特にAI系の記事がとても人気ですよね。

https://qiita.com/Kajiita

↑@Kajiita さんは私が先生と呼ぶほど尊敬している方で、呼吸をするようにQiitaを書いている方です。人柄が超絶面白いかたなのですが、記事の内容もとてもニッチなものから最新のものまで幅広いです。

# おわりに
おわりにといってもこの記事が私の最終回の記事ではないです。まだまだ「私見的RPA展開メソドロジー」は続けるし、これから自分が会得した技術的・マネジメント的なメモみたいなものも執筆していく予定です。

これからもどうぞよろしくお願いいたします！
次回お楽しみに。

https://qiita.com/husui/items/418fe5c46b37dd5b64f4
Railsにおけるデータベースのロックのユースケースや実装例まとめ

## ユースケース
Ruby on Railsのデータベースロック機能は、同時アクセスに関連する問題を回避するための重要なツールです。以下は、データベースロックを使用する一般的なユースケースのいくつかです：

1. **競合の防止**:
   複数のユーザーやプロセスが同時に同じレコードを更新しようとする場合、データの整合性を保つためにロックが必要です。例えば、銀行の口座残高のようなデータを更新する際に、同時に複数のトランザクションが発生しないようにするためにロックを使用します。

2. **連続したIDの生成**:
   カスタムの連続したIDを生成する際に、同時アクセスによるIDの重複を防ぐためにロックを使用することがあります。

3. **集計や集計結果のキャッシュ更新**:
   複数のレコードにわたる集計や、集計結果をキャッシュとして保存する場合、データの整合性を保つためにロックを使用することがあります。

4. **排他的なリソースのアクセス制御**:
   限られた数のリソース（例: イベントのチケット）に対するアクセスを制御する際に、ロックを使用してリソースの確保を行うことがあります。

5. **バッチ処理**:
   バッチ処理の中で複数のレコードやテーブルに変更を加える場合、他のプロセスやユーザーがその間にデータを変更することを防ぐためにロックを使用することがあります。

6. **マイグレーションやスキーマ変更**:
   データベースのマイグレーションやスキーマの変更を行う際に、他のトランザクションやクエリが実行されることを防ぐためにロックを使用することがあります。

これらのユースケースは、データの整合性を保つためにデータベースロックがどのように使用されるかの例です。ただし、ロックの使用には注意が必要であり、特にデッドロックのリスクやパフォーマンスの問題を考慮する必要があります。適切なロックの戦略とテストを通じて、これらのリスクを管理することが重要です。

## 他のプロセスやユーザーがレコードを変更する例

了解しました。データベースロックの背景や意義を理解するための具体例を提供します。

想像してみてください。あなたのショッピングサイトには、`Product`テーブルがあり、それぞれの商品には在庫数が管理されています。以下の2つのシナリオを考えてみましょう。

### シナリオ1: 在庫調整のバッチ処理

定期的に、外部の在庫管理システムとの同期をとるためのバッチ処理が走ります。このバッチ処理は、`Product`テーブルの各商品の在庫数を更新します。

### シナリオ2: ユーザーの購入操作

一方で、ユーザーはショッピングサイトを通じて商品を購入することができます。ユーザーが商品を購入すると、その商品の在庫数は1つ減少します。

---

これらの2つのシナリオが同時に発生する場合、以下のような問題が考えられます。

1. バッチ処理が商品Aの在庫を10として更新しようとしているとき、ユーザーがその商品Aを購入しようとします。もしバッチ処理が先に更新を終えた場合、ユーザーの購入操作は在庫数を9にするはずですが、バッチ処理との同時アクセスにより誤った在庫数が設定される可能性があります。

2. 逆に、ユーザーが先に購入操作を行い、在庫数を9にした直後にバッチ処理が在庫数を10として更新すると、ユーザーの購入が反映されない状態になります。

---

このような問題を防ぐために、`Product`テーブルのレコードを更新する際にロックをかけることで、同時アクセスによるデータの不整合を防ぐことができます。具体的には、バッチ処理が商品Aの在庫を更新する際には、そのレコードをロックし、その間はユーザーの購入操作が商品Aの在庫数を変更することができないようにします。同様に、ユーザーが商品Aを購入する際には、そのレコードをロックし、その間はバッチ処理が商品Aの在庫数を変更することができないようにします。

このように、データベースロックは、同時アクセスによるデータの不整合を防ぐための重要なツールとなります。

## 実装例

了解しました。上記のシナリオを考慮して、`Product`テーブルの在庫の更新やユーザーによる商品の購入を安全に行うための実装例を以下に示します。

### シナリオ1: 在庫調整のバッチ処理

外部の在庫管理システムとの同期をとるためのバッチ処理において、商品の在庫数を更新する際には、その商品のレコードをロックする必要があります。

```ruby
product_id = ... # 更新対象の商品ID
new_stock_count = ... # 外部の在庫管理システムから取得した新しい在庫数

ActiveRecord::Base.transaction do
  product = Product.lock.find(product_id)
  product.update(stock_count: new_stock_count)
end
```

### シナリオ2: ユーザーの購入操作

ユーザーが商品を購入する際に、在庫数を減少させる操作も、同様に商品のレコードをロックする必要があります。

```ruby
product_id = ... # 購入対象の商品ID

ActiveRecord::Base.transaction do
  product = Product.lock.find(product_id)
  
  if product.stock_count > 0
    product.update(stock_count: product.stock_count - 1)
    # その他の購入処理（注文の保存、決済処理など）
  else
    # 在庫がない場合のエラー処理
  end
end
```

上記の実装により、バッチ処理やユーザーの購入操作が同時に発生した場合でも、`Product`テーブルのレコードは一度に1つのトランザクションからしか変更されないため、データの不整合を防ぐことができます。

ただし、このようなロックを使用する場合、デッドロックのリスクや、高いトラフィックが発生する場合のパフォーマンスへの影響などの点を考慮する必要があります。適切なロックの戦略を選択し、十分なテストを行うことが重要です。
Javaで「ファイルからの入力を行うスキャナを作成する」の動作を確認してみた

# 概要

Javaで「ファイルからの入力を行うスキャナを作成する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index4.html

# 実装

以下のファイルを作成しました。
```JSample4_3.java
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.File;

class JSample4_3{
  public static void main(String[] args){
    try{
      File file = new File("sample2.txt");
      Scanner scanner = new Scanner(file, "UTF-8");

      while (scanner.hasNextLine()){
        String dat = scanner.nextLine();
        System.out.println(dat);
      }
    }catch(FileNotFoundException e){
      System.out.println(e);
    }
  }
}
```

```sample2.txt
Hello.
It's nice weather today, is not it.
Goodbye. See you again.
```

以下のコマンドを実行しました。
```
$ javac JSample4_3.java 
$ java JSample4_3 
Hello.
It's nice weather today, is not it.
Goodbye. See you again.
```

# まとめ

何かの役に立てばと。
Rubyのeach文について

# はじめに


#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>


# each文とは何か


each文つまりeachメソッドは、配列またはハッシュの要素を１

つずつ取り出し、ブロック構文その要素を使った処理を記述できるメソッドです。


# eachメソッドの文法


```
配列.each do |変数|
処理
end
```

```
array.rach do |element|
putus element
end
# eachメソッドの返り値
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```


配列の要素を順に||内で取り出し、続く処理で変数を用いたプログラムを記述します。



# まとめ



- eachメソッドは、配列の要素を１つずつ取り出してくれるメソッド
- 取り出した要素に対して処理をすることができる
KotlinのWiremockの一部を置換してmappingsに登録したい

# はじめに

Wiremockの一部を置換して登録したいという状況があったので記事に残しておきます

# 問題

以下のようなjsonがあったとします

```resposnse.json
{
    "date": "1hours-ago"
}
```

これをWiremockで返却するときに登録したときの1時間前に設定したいと思いました

しかし以下のコードでセットアップをしたのですがうまく行きませんでした

```kotlin
        getFileNames(directory).forEach {
            mock.register(
                StubbuildFrom(read("$directory/$it")
                    .apply { replaceWordMapping.forEach { (oldValue, newValue) -> this.replace(oldValue, newValue) } })
            )
        }
```

# 解決方法

```kotlin
        getFileNames(directory).forEach {
            wiremock.register(
                Stub.buildFrom(read("$directory/$it")
                    .apply { replaceWordMapping.forEach { (oldValue, newValue) -> this.replace(oldValue, newValue) } })
            )
        }
```

この場合`this.replace(oldValue, newValue)`は破壊的変更でないため、とくにthisは変更されずに登録されているのが原因でした。

以下のようにセットアップでファイルを文字列として読み込んで変換前、変換後の文字列のマップを使って変換して別の変数に格納してWiremockに登録することでうまくいきました

```kotlin
        getFileNames(directory).forEach {
            var mappingJson = read("$directory/$it")
            var replaceJson = replaceWordMapping.entries.fold(mappingJson) {acc, entry -> acc.replace(entry.key, entry.value)}
            wiremock.register(Stub.buildFrom(replaceJson))
        }
```

`fold`を使うことでコンパクトにかけたかと思います。

# おわりに

いつか同じようなことをしたいときのためにメモとして残してみました
scm-manager で作るsvnリポジトリのバックアップは一筋縄でいかない

svnmanager とか使って svn リポジトリとか管理してたけど os の入れ替えとかなんだとかで 新しい php(8.0とか8.2とか)では動作しないので別の管理ツールを使おうとしてバックアップ体制を構築できずはまってしまう。

scm-manager が ui もそれなりに行けてるしインストールも簡単そうなので使ってはみたが、gitlab のようにまとめてバックアップする手段が提供されていないので自力でスクリプトを書くとかしなければならないが。

```sh
 $ ls /var/lib/scm/repositories/
27TsGaLhaD  9lTsGaDSvA
```
こんな感じで「つけた名前とは違う名前のディレクトリ」に配置されてしまい、`foo` リポジトリって名前を付けたはずなのにバックアップが `foo/back.gz` とかにできない。

幸い REST API が提供されているので

```python
import os
import requests
from requests.auth import HTTPBasicAuth
import subprocess
import json

url = "http://scm-server/scm/api/v2/repositories"  # 取得したいJSONデータのURLに置き換える
username = "scmadmin"
password = "xxxxxxxx"
backup_directory_root = "/home/vagrant/backup"
backup_cmd='/usr/local/bin/svn-backup-dumps.py'

try:
    response = requests.get(url, auth=HTTPBasicAuth(username, password))

    # ステータスコードが200 (OK) であるか確認
    if response.status_code == 200:
        # JSONデータを辞書に変換
        data = response.json()

        repositories = data["_embedded"]["repositories"]
        for repo in repositories:
            repo_name = repo["name"]
            repo_url = repo["_links"]["protocol"][0]["href"]

            backup_directory = f"{backup_directory_root}/{repo_name}"
            if not os.path.exists(backup_directory):
                os.mkdir(backup_directory)

            subprocess.run([backup_cmd, "-i", "-z", "-q", repo_url, backup_directory], shell=True)
            print(f"{repo_name} {repo_url}");

    else:
        print(f"HTTPエラー {response.status_code}: リクエストに失敗しました")

except requests.exceptions.RequestException as e:
    print(f"リクエストエラー: {e}")


```

こんな感じで ChatGPT に提案されたので使ってみたが、href は当然 `http://` なので `svn-backup-dumps.py` の引数として使えない。

結局 https://qiita.com/okadabasso/items/20ea792ca82f0ba9bafb のように metadata.xml を解析する羽目になった。
Viteってなに？ロゴがおしゃれで気になるあいつ。

# はじめに

皆さんはVite(ヴィート)についてご存知でしょうか？

__create react app__ が大好きで使いまくっていましたが、

サポート終了で使えなくなる？とかなんかで、、、

私が今携わっている製品開発で __<font color="Red">Vite__ を使うことになったので、

現状わかったことを書き置きます。

# Viteってどんなところがいいの？

“次世代フロントエンドツール”と謳うVite。

とにかく開発速度を重視して設計されたものであり、

開発時にブラウザのリロードを行わなくても即反映されてとても使いやすいらしい。

<font color="Red">__なんてったって、ロゴの色合いといい、形といい、おしゃれ。__</font>

![スクリーンショット 2023-10-11 18.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574859/23b668fd-e984-8585-40a3-d49642120e7e.png)


使いこなしたら得をしそうな匂いがぷんぷんしています。



# 使い始めてみて

確かにコードを書いてから反映されるまでが早いのなんの。
とっても使いやすいです。

ただ、今まではCreate-React-Appでまるっとフォーマット作っていた私。

テストの実行環境の設定なんて考えたことがなかったのですが、

Viteを使ってReactと組み合わせて0から作る場合、

テストを書きつつ開発するには　__テスト環境構築が必要__　らしい！？

そしてViteに相性のいいテストツールはJestではなく　__<font color="Red">Vitestらしい__　ので　
<font color="Gray">(とりあえず有識者意見採用😅)

使い方含めて下記サイトを参考にしながら設定しました。

https://qiita.com/KokiSakano/items/f23e979004f72d70165e#はじめに

Vitestでテストを書くのは初めてなので

上記のサイトを参考にしつつ、下記の公式サイトを参考にしつつ

テストを書きながら慣れていこうとしている段階です。

https://vitest.dev/api/

# おわりに

まだまだViteをマスターするには程遠いですが、諦めずに戦っていきます。

また新しくわかったこと、認識が違っていたことなどあったら更新しますね・・・
moduleのselfのclassの定数を外部から参照する

# これを参照したい
moduleのselfのclassの中にある定数を参照したい
```ruby
module Service
  class << self
    # バケット名
    BUCKET_NAME = ENV['BUCKET_NAME'] || "bucket-dev"
```

# 結論
singleton_classを間に挟む。
```ruby
Service.singleton_class::BUCKET_NAME
```


# こんなことしなくても
module直下に書けば`Serive::BUCEKT_NAME`で参照できます。
```ruby
module Service
  # バケット名
  BUCKET_NAME = ENV['BUCKET_NAME'] || "bucket-dev"

  class << self
```
TextViewをコピーできるようにするには（XML&Compose）

# XML
XMLのTextViewに以下のコードを追加します
```xml
android:textIsSelectable="true"
```
これだけでテキストのコピーが可能になります
コード上から変更する場合には`setTextIsSelectable()`を使用することで変更可能です。

ただしこれをtrueにすることで`focusable`, `focusableInTouchMode`, `clickable`, `longClickable`のフラグも同じくtrueになるのでコード上から変更する際には注意が必要です。

# Compose
テキストを`SelectionContainer`でラップすることでコピー可能になります
```kotlin
@Composable
fun SelectableText() {
    SelectionContainer {
        Text("This text is selectable")
    }
}
```
また、コピー可能テキストの中の一部のみコピー不可にしたい場合は`DisableSelection`でラップすることで実現できます。
```kotlin
@Composable
fun PartiallySelectableText() {
    SelectionContainer {
        Column {
            Text("This text is selectable")
            Text("This one too")
            Text("This one as well")
            DisableSelection {
                Text("But not this one")
                Text("Neither this one")
            }
            Text("But again, you can select this one")
            Text("And this one too")
        }
    }
}
```

# 出典
- TextViewについて
    - https://developer.android.com/reference/android/widget/TextView#setTextIsSelectable(boolean)

- Composeのテキストについて
    - https://developer.android.com/jetpack/compose/text?hl=ja
OpenSSLでオレオレ証明書を作成

# はじめに
OpenSSLでオレオレ証明書を作成してみました。

# 流れ
1. 秘密鍵(Private Key)を作成
2. 証明書署名要求(CSR)を作成
3. 自己署名証明書(CRT)を作成
4. PFXファイル作成

## 1. 秘密鍵(Private Key)を作成
以下のコマンドを実行して秘密鍵(Private Key)を作成します。
```
$ openssl genrsa 2048 > {鍵ファイル名}.key
```

## 2. 証明書署名要求(CSR)を作成
作成した秘密鍵を使って、
以下のコマンドを実行して証明書署名要求(CSR)を作成を開始します。
```
$ openssl req -new -key {鍵ファイル名}.key > {CSRファイル名}.csr
```

コマンドを実行すると以下のように情報入力項目が表示されますが、オレオレ証明書であればすべてEnterで進んでも良いです。
```
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

## 3. 自己署名証明書(CRT)を作成
今まで作成した秘密鍵と証明書署名要求を使って、
以下のコマンドを実行することで自己署名証明書(CRT)を作成します。
有効期間は3650日(10年)にしました。
```
openssl x509 -days 3650 -req -signkey {鍵ファイル名}.key < {CSRファイル名}.csr > {CRTファイル名}.crt
```

## 4. PFXファイル作成
今まで作成した秘密鍵と自己署名証明書を使って、
以下のコマンドを実行することでPFXファイル(PKCS＃12ファイル)を作成します。
```
$ openssl pkcs12 -export -inkey {鍵ファイル名}.key -in {CRTファイル名}.crt -out {PFXファイル名}.pfx
```
Raspberry Pi OS 2023-10-10 Release-note 翻訳

（追記：2023/12/7に、Raspberry Pi OS 2023-12-05 がリリースされています）
https://qiita.com/utaani/items/59a89671fe86dc8216ed

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2023-10-10:
- Debian bookworm リリースをベースにしました
- Raspberry Pi 5がサポート
- Raspberry Pi 4 および 5 プラットフォームでは、デスクトップは Wayfire Wayland 合成ウィンドウ マネージャーで実行されるようになりました。古いプラットフォームでは、openbox ウィンドウ マネージャーをX11の上で使用します。
- Wayland の実行時に lxpanel が新しい wf-panel-pi アプリケーションに置き換えられ、既存の lxpanel プラグインが移行されました。GPU パフォーマンスと電源プラグインが追加されました。
- pcmanfm が変更され、Wayland で実行するときには Wayland バックエンドを使用するようになりました。
- オーディオ制御サブシステムとして PulseAudio の代わりに PipeWire が使用されます。これをサポートするためにボリューム コントロール プラグインにさまざまな変更が加えられました。
- NetworkManager はネットワーク インターフェイスとして dhcpcd の代わりに使用されます。これをサポートするためにネットワークプラグインにさまざまな変更が加えられました。
- Raspberry Pi 構成ツールに追加されたデフォルトのブラウザーの選択時、Firefox ブラウザが Chromium の代替として選択可能になりました。
- Wayland でVNCサーバを実行する場合にRealVNC の代わりに WayVNC VNCサーバーが使用されます。
- Wayfire 環境をカスタマイズするためにすべてのカスタマイズおよび構成アプリケーションが変更されました。
- Wayland でスクリーンショットするときに scrot の代わりにGrimが採用されました。
- gpicview の代わりに eom イメージビューアが採用されました。
- qpdfview の代わりにEvinceドキュメントビューアが採用されました。
- Chromium Web ブラウザがバージョン 116 に更新されました。
- VLC メディア プレーヤーがバージョン 3.0.18 に更新されました。
- Wayland の実行中は拡大鏡プログラムは利用できません。Wayfire には画面ズーム機能が含まれています。
- CustomPC と Wireframe がBookshelfから削除されました。
- 多数の小さな変更とバグ修正。
- raspberrypi-kernel から Debian ベースのカーネル パッケージング (linux-image-rpi-*) に切り替えました。
- raspberrypi-bootloader から Debian ベースのファームウェア パッケージ (raspi-firmware) に切り替えました。
- /boot マウント ポイントが /boot/firmware に移動されました。
PostgreSQL の表を元にして Cloud Integration Hub のトピックを作成する

# はじめに
2023 年 10 月のリリースより、Cloud Integration Hub (以下 CIH) のトピック作成時の接続として JDBC V2 コネクタと JDBC_IC コネクタを使用可能になりました。
この記事では JDBC V2 コネクタを使用して PostgreSQL の表の定義を使用してトピックを作成する方法について記載します。

# JDBC V2 コネクタの設定
CIH のトピック作成時には PostgreSQL コネクタは使用できません。そのため、JDBC V2 コネクタで PostgreSQL へアクセスできるよう設定します。

*JDBC V2 コネクタの詳細については[ドキュメント](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/jdbc-v2-connector/preface.html)をご参照ください。

1. JAR ファイルの入手
PostgreSQL へ接続するための JDBC Driver を入手します。
2. JAR ファイルの配置
(Secure Agent インストールフォルダ)\ext\connectors\thirdparty 下に「informatica.jdbc_v2」というフォルダを作成し、さらにその中に「common」というフォルダを作成します。common 下に上記で入手した JDBC Driver の jar ファイルを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/f9882198-def2-9fcf-4aaf-ec5858f30442.png)
3. 接続の作成
管理者画面から JDBC V2 コネクタを使用する接続を作成します。接続テストに成功することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/5664820e-2aa4-400c-20bf-c7d0ab960312.png)

# トピックの作成
続いてトピックを作成します。

1. 統合ハブへアクセスし、「新規」から「トピック」を選択します。
2. 「次からテーブルを作成」で「接続」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/dd28960b-d280-3e00-2cc3-76f7c5128cc2.png)
3. 「接続の詳細」画面で上記で作成した接続を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/005a5833-eb9e-d53b-4827-9cf6e8611129.png)
4. スキーマを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/cf1aef95-7102-32b8-7ac2-c11e628739f2.png)
5. 定義を使用するテーブルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/b66f1f7a-99a1-996f-8b97-c08fb1a71a85.png)
6. テーブル名を指定して「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/efe88c82-5651-987c-292b-cda96e0ee11c.png)
7. 指定した表の定義を元にトピックのカラムが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/79337cb5-40b5-41cd-f022-1d929387dc75.png)

# おわりに
JDBC V2 コネクタや JDBC_IC コネクタを使用することで、より多くの接続先の定義を使用してトピックを作成できるようになりました。これまで選択できなかった接続先の定義を参照したい場合にご利用ください。

# 参考文書
* [JDBC V2 コネクタのドキュメント](https://docs.informatica.com/integration-cloud/data-integration-connectors/current-version/jdbc-v2-connector/preface.html)
* [CIH のドキュメントのトピック作成の章](https://docs.informatica.com/integration-cloud/integration-hub/current-version/cloud-integration-hub/topics/topic-structure-in-a-relational-database/create-topic-tables-in-a-relational-database.html)
ID群から無いものだけを抽出するSQL

# やりたいこと
なんかExcelとかでリスト渡されて、「このリストのうちDBに入ってないIDだけ抜き出しといて」みたいに依頼されることありませんかね。

SQLで直接やろうにも、
```sql
select * from table where id in (123, 456・・)
```
だと**DBに無いもの**は取れないし、
```sql
select * from table where id NOT in (123, 456・・)
```
だとDBの**テーブル全体**から無いものが取れるので**リストのうち**無いものは取れません。

どうすればいいのか・・fromの中に**直接**IDたちを書ければいいのに・・

**書けるんです。**

# fromに直接値を指定する
postgresqlでしか試してないですが、fromにvaluesが書けます。
```sql
select * from (values(123),(456)・・・)as tmp(id)
```
一個一個の値を()でくくらないといけないのがめんどくさいですがこれを使えばleft joinが使えるわけです。

```sql
select * from (values(123),(456)・・・)as tmp(id)
left join table on tmp.id = table.id
```

こいつの結果はこんな感じになるかと思います。
| tmp.id | table.id |table.name|
|:-:|:-:|:-:|
|123|123|hoge|
|456|\<null\>|\<null\>|
|789|789|fuga|
|・・・|・・・|・・・|

leftなので、from(values)で指定した一覧をもとに結果が出ます。
それで、今回の要求的にはDBに存在するものはいらないので、
```sql
select * from (values(123),(456)・・・)as tmp(id)
left join table on tmp.id = table.id
where table.id is null
```
としてやれば
| tmp.id | table.id |table.name|
|:-:|:-:|:-:|
|456|\<null\>|\<null\>|
|・・・|・・・|・・・|

こんな感じにリストにあるけどDBに無い一覧がリストをもとに取ることができるはずです。

リストにあるIDたちを(123),(456)・・と整形するのが少し面倒ですが
やりたいことが実現できたので残しときます。

# おまけ
ググれば出てきますが、from(values)に複数値指定した場合はこんな感じで書けるみたいです。
```sql
SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
  WHERE f.studio = t.studio AND f.kind = t.kind;
```
これ型とかどう解釈されるんだろ。
Zennはじめました

Zennを始めてみました。

https://zenn.dev/kazh

Visual Studio Code で書いてGithubにpushすると投稿、更新できるのがとても勝手がよく、投稿はZennを主体にしたいと思っています。

Qiitaはこれからどのように利用しようか思案中です。

Zennの方もよろしくお願いいたします。
AzureとGCPの違い

# Abstract
Microsoft AzureとGCP(Google Cloud Platform)の違いについて記述する.

(AzureのGCPやAWSとの違いは、公式のMicrosoft Learnにも記述があるので、参照されたし)
# 重要な違い
- 管理階層と支払いの違い
    - Azureの管理階層は上から
        - 管理グループ(なくてもいい)
        - サブスクリプション
        - リソースグループ
        - 各リソース
    - GCPの管理階層は上から
        - 組織
        - フォルダ(なくてもいい)
        - プロジェクト
        - 各リソース
    - リソースの管理単位は、それぞれの4階層でおおむね一対一対応
    - GCPの「組織」は、Azureの「テナント」にほぼ対応 => テナントそのものが管理階層の最上位を兼ねている
    - Azureの支払いは
        - 「サブスクリプション」で管理
        - 請求情報が必ず「サブスクリプション」に紐づいていて不可分 => サブスクリプションが請求情報の本質
        - サブスクリプションを作成しないとAzureサービスを利用開始できない
    - GCPの支払いは
        - 各リソースの直上にある「プロジェクト」で管理
        - 請求情報が**必ずしも「プロジェクト」に紐づいているとは限らない**=>プロジェクトとは別に請求情報のエンティティが存在
# 概念の比較
|概念|Azure|GCP|
|----|----|----|
|組織のドメイン単位|Azureテナント|組織|
|リソースグループ|リソースグループ|プロジェクト|
|ブラウザの管理画面|Azure Portal|Google Console|

# 参考文献
https://nosu.hatenadiary.jp/entry/2020/12/22/144839
https://learn.microsoft.com/ja-jp/azure/architecture/gcp-professional/services
https://qiita.com/kenseitogari1/items/c969b2f69a44366ac3e0
めざせ、フルスタックエンジニア！

初めまして。

めざせポケモンマスター！をイメージして、、、記念すべき初投稿🎉です。
<font color="Gray">(世代がバレますね)</font>

フルスタックエンジニアを目指す、__over30歳 (女)__  @d_shofdieです。

よろしくお願いします！

全くコードを書いたことがなかったのですが、
何か一つでも”これができます”という知識を身につけたくて
意を決してフルスタックエンジニアに挑戦することにしました。


・ 技術にめちゃくちゃ興味がある、
・ 本をたくさん読んでいる
・ 寝る間も惜しんでコードを書いている

というタイプとはかけ離れた人です。

ただ・・・ <font color="Red">__どうにかしてフルスタックエンジニアなりたい！__ </font>と思い、
モチベーション維持のため甘い考えで、Qiitaの投稿を始めることにしました。

まずは自分の学んだことを保存していく、という目的でやっていきます。
(いずれは誰かの役に立てたらいいな...)

いいねがもらえるエンジニアになれるように💪

__毎日投稿を目指してコツコツ頑張ります！__
AWS Lambda 用のイメージから作成されたコンテナにVSCodeからAttachする際のエラー解決

# 目的
AWS Lambda 用のイメージから作成されたコンテナにVSCodeの「Remote - Containers」拡張機能からAttachする際、以下のようなエラーが発生し、接続できませんでした。

```terminal
tar: command not found
tar (grandchild): gzip: Cannot exec: No such file or directory
```

その解決方法の備忘録です。

# 問題
以下のようなDockerfileがあります。
イメージにはAWS公式のリポジトリから取得した**public.ecr.aws/lambda/python:3.11**を使用します。

```dockerfile
FROM public.ecr.aws/lambda/python:3.11 as dev

# requirements.txtを使用して関数の依存関係をインストールする。
COPY requirements.txt  .
RUN  pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# AWS ベースイメージには、環境変数「LAMBDA_TASK_ROOT=/var/task」が含まれています。
COPY app.py ${LAMBDA_TASK_ROOT}

# Dockerイメージ内の実行時のデフォルトコマンドを設定します。
CMD [ "app.handler" ]
```

このイメージによって作成されたコンテナにVSCodeからAttachする際、冒頭のエラーが発生します。
エラー内容は以下の2つ

:::note warn
・tar コマンドが Docker コンテナ内に存在しない
・tarがgzipを実行できない
:::

# 解決方法
VSCodeの「Remote - Containers」拡張機能は、コンテナ内部で tar コマンドを使っていくつかの操作を実行します。したがって、このコマンドが利用可能であることが前提となります。
なので、エラー内容に従って不足しているパッケージをインストールすればOK

```dockerfile
# tar と gzip パッケージのインストール (VSCodeでの開発に利用します。)
RUN yum install -y tar gzip
```

# まとめ
エラーはよく読みましょう（戒め）
AWSを基本からまとめてみた【AWS Lamda】

## AWS Lambdaとは？
- サーバレスを実現するためのプログラム実行環境を提供するサービス

## Lambdaのメリット
- サーバ管理が一切不要
- ちょっとした処理を少ないセットアップで実現可能
- スケーラビリティをかなり自動で確保してもらえる
- 実行された時間の分しか料金がかからない

## Lambdaのデメリット
- 特有の制限事項があるので、上手に活用するには慣れが必要
- プログラミング言語やフレームワークとの相性がある
- AWSのサービスと組み合わせて使うことが多く、AWSの知識が重要
- AWSにロックインされる

## Lambda 関数の実装時の課題
- Lambda 関数の実装する時は、マネジメントコンソール上ではなく、ローカルでコードを書いてアップロードする流れにしたいことが多い。

## API Gateway + Lambda によるWebAPI
- Lambdaを使ってサーバレスにWeb APIを実装する場合、『API Gateway』というサービスをトリガーとして使う
- API Gatewayというサービスがブラウザからのリクエストを受け止めて、Lambda関数に処理させるという流れになる

## Serverless Frameworkとは？
- Serverless Frameworkは、Lambda関数のコード、トリガー設定、関連して使用するAWSのリソースなどを管理できるOSSのツールです

## Serverless Frameworkには、以下のような特徴がある
- コマンド１つでLambda関数のデプロイが可能
- AWS Lambda以外にもGoogle Cloud FunctionsやAzure Functionsなどに対応
- プラグインが豊富で、よくある状況に簡単に対応が可能
- Cloud Formationの記法で、任意のAWSリソースの管理が可能

## AWS Cloud9とは？
- AWS Cloud9は、Webブラウザ上でコードを実装できる、統合開発環境のこと



## 参考サイト
[AWS Lambda / Serverless Framework 速習ハンズオン](https://itplusjp.udemy.com/course/aws-lambda-serverless-framework/learn/lecture/34766556#overview)
[AWS　Lambdaの最初の一歩　関数をつくって実行しよう！](https://www.youtube.com/watch?v=36lVbVHeIXE)
UnrealEngineをUbuntuで使う

Ubuntuで過去のバージョンのUnrealEngineを使ったり、UnrealEngineのGithubを見に行きたいときは以下の手順に従えば大丈夫。
# 環境
| OS | 
|:-:|
| Ubuntu 20.04 |
# 準備
## EpicGamesアカウントの作成とGithubの連携
EpicGamesのアカウントは以下のURLから作成できる。
[EpicGamesサインアップ](https://www.epicgames.com/id/register/customized?productName=fortnite&lang=ja&redirectUrl=https%3A%2F%2Fwww.epicgames.com%2Ffortnite%2Fsuccess&client_id=cd2b7c19c9734a2ab98dc251868d7724&noHostRedirect=true)

GithubアカウントとEpicGamesアカウントの連携
[EpicGamesとGithubの連携](https://www.unrealengine.com/ja/ue-on-github)
公式が画像つきで教えてくれる。

連携が完了すると、UnrealEndgineのGithubを見ることができるようになる。
[UnrealEngineのGithub](https://github.com/EpicGames/UnrealEngine)

# UnrealEngineのインストール
インストールするためにはまずソースコードをGithubからダウンロードする必要がある。
## GithubからZipをダウンロードする場合
[UnrealEngineのGithubページ](https://github.com/EpicGames/UnrealEngine)へ行き、右上のCodeからDownload ZIPをクリックする。
バージョンを指定したい場合は右側のReleasesからバージョンを見ることができるので選択する。
インストールしたいバージョンを見つけたらAssetsの中から好きな形式(.zipかtar.gz)のSource codeをクリックする。![UnrealEngine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/c3b0a44b-399d-91ad-4ef9-8da3e9214350.png)


## コマンドラインからダウンロードする場合
UnrealEngineをインストールしたいディレクトリでコマンドラインを開き、以下を実行。
```
$git clone git@github.com:EpicGames/UnrealEngine.git
```
バージョンを指定したい場合は以下のようにする
```
$git clone -b [指定したいバーション] git@github.com:EpicGames/UnrealEngine.git
```
```例：4.27を指定したい場合
$git clone -b 4.27 git@github.com:EpicGames/UnrealEngine.git
```
### Permission deniedと出たとき
以下のようにダウンロードに失敗する場合がある。失敗していない人は[UnrealEngineの構築](#unrealengineの構築)まで飛ばしてよし。
```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
```
これはGithubのアカウントにSSH鍵を登録していないことが原因で起こるため、登録を行う。
### 公開鍵、秘密鍵の作成
公開鍵と秘密鍵を作成し、公開鍵をGithubに登録する。

:::note alert
秘密鍵は絶対に誰にも見せてはいけない
:::
まず、鍵を作成したことがあるか確認するため鍵が入っているディレクトリに移動し、中身を確認する。
```
$cd ~/.ssh
$ls
```
何も表示されなければ生成したことが無いのでコマンドで生成する。
```
$ssh-keygen -t rsa
```
すると
```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
こうなるが、基本的にEnterキー連打で大丈夫。
Enterキーを押すとid_rsaとid_rsa.pubが生成される。

### Githubに公開鍵を登録する
id_rsa.pubの方をGithubに登録する。
[設定ページ](https://github.com/settings/ssh)を開いて、New SSH keyをクリックする。
![SSHSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/45a80426-7447-4d1b-e18f-241d09c1532f.png)
開いたページでtitleに任意の名前、Key typeはAuthentication Key、Keyにid_rsa.pubの中身を入力し、Add SSH keyをクリックする。
![AddSSHKey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/386f699f-b98b-db17-0ffd-b1d20de2f951.png)


登録後、コマンドで
```
$ssh -T git@github.com
```
と入力し
```
Hi [githubのアカウント名]! You've successfully authenticated, but GitHub does not provide shell access.
```
と返ってくれば、登録完了。

## UnrealEngineの構築
ソースコードがダウンロードできたら以下のコマンドを実行する
```
$cd UnrealEngine
$./Setup.sh
$./GenerateProjectFiles.sh
$make
```
結構時間かかるので終わるまで待機。

## UnrealEngineの起動
UnrealEngineのディレクトリ内で以下のコマンドを実行すれば起動できる。
```
$./Engine/Binaries/Linux/UE4Editor
```

# 参考
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
[UbuntuにUnrealEngine 4をインストールする](https://abillyz.com/mamezou/studies/446)
CSVファイルから一発で親ノードと子ノードを作成しリレーションを張るcypherクエリ

# はじめに
こんにちは。ponponnsanです。最近neo4jでグラフデータベースを触る機会があり、cypherクエリを作成する機会があったので、書いておきます。

# Neo4j Desktop
## CSVファイルから親ノードと子ノードを作成しリレーションを張る
CSVファイルはローカルの

`C:\Users\user_name\.Neo4jDesktop\relate-data\dbmss\dbms-12345678\import`

に入っているものとします。
```
LOAD CSV WITH HEADERS FROM 'file:///example.csv' AS row
WITH row
LIMIT 300
MERGE (parent:FileName {name: row.file_name, label: row.labels})
MERGE (child:path  {URL: row.url, label: row.labels})
MERGE (parent)-[:PATH {path: row.path}]->(child)
```

# python経由

```python
def send_urls(csv_file_path):
    cypher_query = """
    WITH $data AS data
    UNWIND data AS row
    MERGE (parent:FileName {name: row.file_name, label: row.labels})
    MERGE (child:path  {URL: row.url, label: row.labels})
    MERGE (parent)-[:PATH {path: row.path}]->(child)
    """

    with open(csv_file_path, mode="r", encoding="utf-8") as file:
        csv_reader = csv.DictReader(file)
        with driver.session() as session:
            for row in csv_reader:
                print(row)
                session.run(cypher_query, data=row)
```

# ほかの役立つ記事
https://qiita.com/euonymus/items/82260dbbda4df7c2f68f

https://gist.github.com/ykst/60ecf2b21fc1ed937ec01af163fdf6a0
OpsRamp ワークフローのUserタスクについて

本記事では、OpsRamp ワークフローのUserタスクについて説明します。
![userTask.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/2681e5be-4b16-dcf4-7e75-814bff7ebc9d.png)


# 概要
OpsRamp ワークフローのUserタスクは、ユーザまたはユーザグループに割り当てるタスクが作成され、ワークフローはこのタスクの完了を待ちます。これにより、ユーザが介入するワークフローを作成することが可能です。

# 設定の説明
プロパティには、以下の意味があります。
Subject: タスクのサブジェクト
Description: タスクの説明
Resource Id: タスクに関連するリソースのId
Priority: タスクの優先度
Due Date: タスクの完了期限
Assignee Group: タスク担当グループ
Assignee: タスク担当者
![properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d27f092a-071f-7217-92b1-df53592062fd.png)



# 使用例
[【OpsRamp】承認ボタンでカスタムステータスの自動変更(サービスデスク-ワークフロー)](https://qiita.com/yusawada/items/d26178bec46eb5112738)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Visual Studio 2022(ARM64)で拡張機能をインストールしたい

# 1. はじめに
* Mac AppleシリコンでWindowsを起動した時にVisual Studioから拡張機能をインストールするとエラーが発生してしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/a00ca8db-5a5c-2fa9-f895-4c19cf44f4e4.png)
* なんとかエラーを回避してARM版でも拡張機能をインストールしたい

# 2. 開発環境
* MacBook Pro Apple M2
* Parallels Desktop 19 (Windows 11)
* Visual Studio 2022 Community (ARM64)
* Microsoft RDLC Report Designer 2022

# 3. 事前準備
## 3.1. Microsoft Market Placeからのダウンロード
* 必要な拡張機能をダウンロードしておく
* 今回は「Microsoft RDLC Report Designer 2022」をインストールする

https://marketplace.visualstudio.com/

## 3.2. 7-zipのインストール
* 7-zipをインストールしておく

https://www.7-zip.org/download.html


# 4. VSIXファイルの修正
## 4.1. VISXファイルを7zipで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4aada234-db8f-648f-388e-174feaea9c9b.png)

## 4.2. extension.vsixmanifestを編集する
* ファイルを見つけて右クリックで編集を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4e39d10b-6021-2bc6-69e8-94c6961eed90.png)

## 4.3. ProductArchitectureをarm64に編集する
```XML:変更前
  <Installation InstalledByMsi="false" AllUsers="true">
    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
      <ProductArchitecture>amd64</ProductArchitecture>
    </InstallationTarget>
  </Installation>
```
```XML:変更後
  <Installation InstalledByMsi="false" AllUsers="true">
    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
      <ProductArchitecture>arm64</ProductArchitecture>
    </InstallationTarget>
  </Installation>
```

# 5. VSIXの実行
* EXEを実行するとインストールができた

# 6. 参考文献

https://stackoverflow.com/questions/76706915/cant-install-vsix-visual-studio-extensions-on-arm64
中高校生のみなさまへ。<２/2>「高校入試問題。円の難問2023千葉県数学3(3)」をsympyとFreeCADで作図しました。

④[qiitaの<1/2>前ページ](https://qiita.com/mrrclb48z/items/d69e52a2ed6ee9b0d4fe)を見て、**変な事やって作図しているなあ。** 
と、思われたと思います。

# 中高校生のみなさんには、簡単な問題でした。
図から、点A,線分AB,線分AEを消す。(スマホなら指で隠す。)　線分BFの長さを求める。です。
```
(改題) なんとかなると思います。
図から、点A,線分AB,線分AEを消す。(スマホなら指で隠す。)
∠FEDが直角。
EG=1cm,GF=2cmであるとき、線分BFの長さを求めなさい。
```
弧CD側から見て下さい。
```
(改題のしつこい解説)
弧CD側から見て下さい。
∠CBD=∠CED -------------------①  

点Eに直角2つアルヨネ。                
∠BEC     =∠FED   
∠BEC-∠FEC=∠FED-∠FEC
∠BEF     =∠CED -------------②
②①より　∠BEF=∠CBD(∠FGB）----③

∠BEF共通,③より.裏向きの？相似あり。
　△BFG ∽ △EFB 
BF/EF=FG/FB
BF*FB=EF*FG
BF^2 =3*2
BF   =√6
？？？　ここまできても、6cm、30°,60°　をまだ、使っていません。
(以下省略)　
```
# 参考
(youtube 5:31)  

https://www.youtube.com/watch?v=c_b1k414_ZE

# 必要条件の勉強中

https://www.google.com/search?q=%E3%81%B2%E3%81%A3%E3%81%8F%E3%82%8A%E8%BF%94%E3%81%97%E3%81%9F+%E7%9B%B8%E4%BC%BC&oq=%E3%81%B2%E3%81%A3%E3%81%8F%E3%82%8A%E8%BF%94%E3%81%97%E3%81%9F%E3%80%80%E7%9B%B8%E4%BC%BC&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQABiiBDIHCAIQABiiBDIHCAMQABiiBDIHCAQQABiiBNIBCTIxODg2ajBqN6gCALACAA&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

https://www.google.com/search?client=ms-android-huawei&sca_esv=572370827&sxsrf=AM9HkKkjQ_iU57SOprHbWg2ZhN2zBLPdOQ:1696978642134&q=%E3%81%B2%E3%81%A3%E3%81%8F%E3%82%8A+%E6%84%8F%E5%91%B3&sa=X&ved=2ahUKEwjLlp-JyuyBAxUesFYBHdiVCDsQ1QJ6BAhBEAI&biw=816&bih=454&dpr=1.5

https://www.google.com/search?q=%E4%B8%80%E6%9D%AF%E3%81%82%E3%82%8B&oq=%E4%B8%80%E6%9D%AF%E3%81%82%E3%82%8B&gs_lcrp=EgZjaHJvbWUyBggAEEUYOdIBCDIwMDFqMGo3qAIAsAIA&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

＞**最後は相似だね。**（数学を数楽に 様　5:23)
大人の方には、
最後は掃除だね。
意味が深いですね。

# 勉強になりました。
このような問題もあるという事でした。

①円の問題に、線分ABの**カザリ(飾り)を後からつけた?** イメージです。
②(いつものゆうどうです。）[自転車君(共通テ2022)](https://qiita.com/mrrclb48z/items/297442a71820732d3ea3)とは、意味が異なると思いました。
　(1)(2)がわからくても(3)が解けるです。

# チョット気になる。
???アポロニウスの円??? とコメントがありました。
私が理解できたら、追加書きしたいと思います。

**以上。本日は、お疲れさまでした。**
CSSカスタムプロパティを使ってみる

# 概要
- 同じデザインのボタンだけどキャンペーンごとに色を変更したい
- 更新・修正の手間を減らしたい
- CSSファイルで（！）
という要件に対してCSSカスタムプロパティとCSSの@importを駆使して対応します

# 使う技法
### CSSカスタムプロパティ
カスタムプロパティ記法(`--hoge-color: red;`)の形で定義し、`var()`の形式でアクセスが可能（個人的には「CSS変数」と呼ぶ方がイメージしやすいです😄）

```
:root {
  --hoge-color: red;
}
.hoge {
  color: var(--hoge-color);
}
```

### @import
他のcssのパスを指定し読み込む

```
@import "hoge.css";
```

## 実践
① ボタンのベースを作成
```
.btn {
  color: #fff;
  background: #cc0000;
  display: block;
  width: 120px;
  padding: 15px 3px;
  border-radius: 6px;
}
```

---
② 文字色と背景色を変数化
```
:root {
  --txt-color: #fff;
  --bg-color: #cc0000;
}
.btn {
  color: var(--txt-color);
  background: var(--bg-color);
  display: block;
  width: 120px;
  padding: 15px 3px;
  border-radius: 6px;
}
```

---
③ btn部分を別シートに分割し、import
```
@import "parts.css";
:root {
  --txt-color: #fff;
  --bg-color: #cc0000;
}
```

(parts.css)
```
.btn {
  color: var(--txt-color);
  background: var(--bg-color);
  display: block;
  width: 120px;
  padding: 15px 3px;
  border-radius: 6px;
}
```

---

④ 「クリスマスの時期に使うcssファイル」「正月の時期に使うcssファイル」などキャンペーンごとにそれぞれファイルを用意して色を定義

xmas.css
```
@import "parts.css";
:root {
  --txt-color: #dc143c;
  --bg-color: #006400;
}
```

newyear.css
```
@import "parts.css";
:root {
  --txt-color: #fff;
  --bg-color: #ff4500;
}
```

これでキャンペーンごとに色を変えつつ、ボタンデザインの更新・修正をする場合はparts.cssファイルの更新のみで済む構成になります。


## その他
- 変数名はグローバルなので名前が衝突しないよう注意が必要です
- 色だけではなくpxや文字列の値を定義することも可能です

CSSファイルで動的ぽく書けるようになってきたのは面白いですね👏
ではまた。
モバイルデバイス管理（MDM）とは何ですか？

モバイルデバイス管理（MDM）とは何ですか？

MDMはテクノロジーオーケストラの指揮者のようで、組織内のすべてのデバイスが調和して演奏されることを確実にします。これは、スマートフォン、タブレット、およびその他のモバイルデバイスをネットワーク内で監視、管理、および保護できる包括的なソリューションです。

ビジネス運営の効率化：

企業にとって、MDMは命綱のような存在です。ITチームはリモートでデバイスを構成し、必要なアプリとセキュリティ機能を装備することができます。デバイスをなくした場合も、MDMを使用してデータを保護するためのリモートロックとワイプ機能を提供します。

セキュリティの向上：

リモートワークの増加とBYOD（自分のデバイスを持ち込む）トレンドの台頭に伴い、データのセキュリティを確保することが非常に重要です。 MDMは、パスワードの強制から暗号化、脅威検出まで、会社のデータと個人データの保護を担保する堅牢なセキュリティ機能を提供します。

効率的なアップデートとサポート：

アップデートは面倒なことがありますが、MDMを使用すれば問題ありません。それはソフトウェアのアップデートを合理化し、デバイスが最新のパッチと機能を備えていることを確認します。さらに、MDMはトラブルシューティングを簡素化し、テックサポートを容易にします。

デバイス管理の未来：

モバイルデバイスへの依存がますます高まるにつれ、効果的な管理の必要性も高まります。モバイルデバイス管理は単なるツールだけでなく、私たちのデジタルに接続された世界での必要不可欠なものです。

ソース: https://www.trio.so/blog/mobile-device-management/
Saas on AWS 2023のサーバーレスワークショップに参加してきたのでメモメモ

どうもこんにちは。

今回は**Saas on AWS 2023**に参加してserverless workshopに参加してきたので、備忘録としてメモします。

# Saas on AWSとは？

**Saas on AWS**とは、Saasシステムを武器にして会社を経営している方や、開発しているエンジニアの方の話を聞くことができるイベントです。

その傍では、いくつかのワークショップが開催されています。

# ワークショップについて

今回のイベントでは、以下の３つのワークショップが用意されていました。

- Saas Boost Workshop
- Saas Serverless Workshop
- Saas AuthN/Z Workshop

今回は２つ目の「Saas Serverless Workshop」に参加してきました。

# ワークショップの流れ

ワークショップは、簡単なマニュアルが配布され、それを見ながら自分で開発を進めていきます。

具体的な手順をメモしていきます。

## STEP1：使用するサービスの簡単な使い方

STEP１で使用したのは以下の４つです。

- Cloud9：VScodeのようなIDE（統合開発環境）
- API Gateway：APIの開発
- DynamoDB：NoSQLの使用を目的としたデータベース
- CloudWatch：APIやDBのログを閲覧

STEP1ではそれぞれの使い方を簡単に学びました。

## STEP2：簡単なSaasアプリケーションの開発

### 1. アーキテクチャの確認

今回のワークショップで作成するアーキテクチャを確認しました。

（公開しない方が良さそうなので、簡易的な図を作成しました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/c0160676-49dd-30ef-c034-9002acc69f05.png)

なんとなくですが、ユーザが操作したらAPI経由で処理が行われるんだなっていうのがわかりました。

### 2. API Gateway、DynanoDBで使用する関数の追加

cloud9上で指定されたファイルの指定された関数にコードを書きました。

ただし、これは「コピペ」です。

追加したコードによって、APIを使用してDynamoDBからコードを取得できるようです。

### 3. Cognitoで使用する関数の追加

cloud9上で指定されたファイルの指定された関数にコードを書きました。

もちろん、これも「コピペ」です。

追加したコードによって、Cognitoへユーザーの登録ができるようです。

### 4. 登録した情報をDBからデータを持ってくる時に使用する関数の追加

cloud9上で指定されたファイルの指定された関数にコードを書きました。

やっぱり、これも「コピペ」です。

追加したコードによって、登録した「テナント」の管理者の登録、閲覧表示をすることができるようです。

#### 5. デプロイ

AWS側で用意されたshファイルを使用して、アプリケーションのデプロイを行いました。

デプロイが完了すると、アプリケーションにアクセスできます。

#### 6. 実際に動かしてみる

デプロイをしたら実際にデータの登録ができるか、閲覧ができるかなどの確認を行いました。

#### 7. Cognitoの確認

Cognitoとは、AWS Cognitoというユーザーなどの認証情報を管理できるサービスです。

ここではアプリケーション上で登録したデータが登録されていることを確認しました。

手順３で追加したコードによってCognitoにデータを保存できているのでしょうか。

#### 8. DynamoDBの確認

DynamoDBに登録したデータが保存されていることを確認しました。

どこのコードでDynamoDBに保存していたのかは確認が必要です。

## STEP3

### 1. API Gatewayで使用するコードを追加

API Gateway Lambda Authorizerで使用するコードを追加しました。

すごく難しく感じましたが、やっていることは簡単で

1. 関数からAPIを呼び出す
1. APIからLambdaのコードを呼び出す
1. LambdaコードでCognitoの認証トークンを検証する
1. 認証に必要なデータを取得する

の流れを作るコードを完成させた模様です。

### 2. アクセスの認証に必要なコードを追加

手順１の続きの流れを完成させるためのコードを追加しました。

1. 取得した認証データを使用してアクセスを認証する

### 3. ロギングとメトリクス収集を一元化するコードを追加

ログを記録するコードを追加している模様です。

#### 4. DynamoDBのデータと他のデータを紐付けるためのコードを追加

DynamoDBのデータを他のテナントデータの紐付けを行なっている模様です。

#### 5. デプロイ実行

AWS側で用意されたshファイルを使用して、アプリケーションのデプロイを行いました。

デプロイが完了すると、アプリケーションにアクセスできます。

### 6. 実際に動かしてみる

デプロイをしたら実際にデータの登録ができるか、閲覧ができるかなどの確認を行いました。

### 7. DynamoDBの確認

DynamoDBに登録したプロダクトと注文が保存されているかを確認しました。

ここまでやってアプリケーションの大枠は完成しました。

STEPは７まであったのですが、セッションを聞きたかったのでSTEP3まで実施して終了しました。

# まとめ

今回のワークショップで理解できたこととしては、以下のこととなります。

- サーバーを使用せずとも、CloudFormationを使用してアプリケーションを構築することができる
- Cognitoを使用することで容易にユーザー認証の仕組みを完成させることができる

STEP3までしかできなかったのが原因だと思いますが、DynamoDBやAPI Gatewayへの理解は深められなかったなぁという印象です。

ただ、自分の中では AWSサービスを使用した良い経験になりました。

機会があったらサーバーレスのシステムを構築して、API Gatewayなどを使用して外部サービスと連携できるようなシステムを制作してみたいです！

以上
Laravel10 で加減算の API を作成 (POST)

## プロジェクトの作成
データベースは SQLite で作成

```bash
laravel new post-api
cd post-api
touch database/database.sqlite
```

## Controller の作成

```bash
php artisan make:controller SampleController
```

app/Http/Controllers/SampleController.php を修正

```php:app/Http/Controllers/SampleController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
	public function getSum(Request $request){
			$data = $request->all();
			$sum = $data['aa'] + $data['bb'];
		   return ['sum' => $sum];
	   }

	   public function getDiff(Request $request){
			$data = $request->all();
			$diff = $data['aa'] - $data['bb'];
		   return ['diff' => $diff];
	   }

}
```

## routes/api.php を修正

```php:routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

use App\Http\Controllers\SampleController;

Route::post('sum', [SampleController::class, 'getSum']);
Route::post('diff', [SampleController::class, 'getDiff']);
```

## ルーティングの確認

```text
$ php artisan route:list

  GET|HEAD   / ................................................................ 
  POST       _ignition/execute-solution ignition.executeSolution › Spatie\Lara…
  GET|HEAD   _ignition/health-check ignition.healthCheck › Spatie\LaravelIgnit…
  POST       _ignition/update-config ignition.updateConfig › Spatie\LaravelIgn…
  POST       api/diff ................................ SampleController@getDiff
  POST       api/sum .................................. SampleController@getSum
  GET|HEAD   api/user ......................................................... 
  GET|HEAD   sanctum/csrf-cookie sanctum.csrf-cookie › Laravel\Sanctum › CsrfC…

                                                             Showing [8] routes
```

## サーバーの起動

```bash
php artisan serve --host 0.0.0.0
```

## Httpie で動作確認

```bash:go_httpie.sh
http --print=b POST http://localhost:8000/api/sum aa=23 bb=18
http --print=b POST http://localhost:8000/api/diff aa=23 bb=18
```

## Curl で動作確認

```bash:go_curl.sh
curl -X POST -H "Content-Type: application/json" \
    -d '{"aa":65,"bb":21}' http://localhost:8000/api/sum
#
echo
#
curl -X POST -H "Content-Type: application/json" \
    -d '{"aa":65,"bb":21}' http://localhost:8000/api/diff
#
echo
#
```

## 参考情報
[Laravel10 で加減算の API を作成 (GET)](https://qiita.com/ekzemplaro/items/4409bc14c739b49da267)
Node-REDをRocky Linux 8にインストールする手順

### ステップ1: NVM (Node Version Manager) のインストール
1. まず、`user`アカウントで以下のコマンドを実行して、NVMをインストールします。
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
```
2. 次に、以下のコマンドを実行して、NVMの設定を`~/.bash_profile`に追加します。
```bash
echo "
export NVM_DIR=\"$([ -z \"${XDG_CONFIG_HOME-}\" ] && printf %s \"${HOME}/.nvm\" || printf %s \"${XDG_CONFIG_HOME}/nvm\")\"
[ -s \"$NVM_DIR/nvm.sh\" ] && \. \"$NVM_DIR/nvm.sh\" # This loads nvm
" >> ~/.bash_profile
```

### ステップ2: Node.jsとnpmのインストール
1. 以下のコマンドを実行して、Node.jsの最新のLTS (Long Term Support) バージョンと最新のnpmをインストールします。
```bash
nvm install --lts --latest-npm
```
2. 以下のコマンドを実行して、デフォルトのNode.jsバージョンを最新のLTSバージョンに設定します。
```bash
nvm alias default 'lts/*'
```

### ステップ3: Node-REDのインストール
1. 以下のコマンドを実行して、Node-REDをグローバルにインストールします。`--unsafe-perm`フラグは、特定のシステムでのインストールの問題を回避するために使用されます。
```bash
npm install -g --unsafe-perm node-red
```
2. 以下のコマンドを実行して、Node-REDを起動します。
```bash
node-red
```
3. ファイアウォールの設定を行い、ポート1880を開きます。
```bash
sudo firewall-cmd --zone=public --add-port=1880/tcp --permanent
sudo firewall-cmd --reload
```

### ステップ4: Node-REDのサービス起動の設定
1. Rocky Linuxのターミナルを開きます。
2. 以下のコマンドを実行して、Node-REDのためのsystemdユニットファイルを作成します。`ユーザー名`と`グループ名`を実際のユーザー名およびグループ名に置き換えてください。
```bash
cat <<EOL | sudo tee /etc/systemd/system/node-red.service
[Unit]
Description=Node-RED
After=network.target

[Service]
ExecStart=/bin/bash -i -c '$(which node) $(npm -g root)/node_modules/node-red/red.js'
Restart=always
User=ユーザー名
Group=グループ名
Environment="PATH=$(npm -g bin):/usr/bin:/bin"
Environment="NODE_PATH=$(npm -g root)"

[Install]
WantedBy=multi-user.target
EOL
```
3. 以下のコマンドを実行して、systemdにユニットファイルの変更を反映させます。
```bash
sudo systemctl daemon-reload
```
4. 以下のコマンドを実行して、Node-REDをサービスとして有効化し、起動します。
```bash
sudo systemctl enable --now node-red.service
```
5. 以下のコマンドを実行して、サービスの状態を確認します。サービスの状態が "active (running)" と表示されれば、Node-REDが正常にサービスとして起動しています。
```bash
sudo systemctl status node-red.service
```
これでNode-REDがサービスとして設定され、サーバ起動時に自動的に起動するようになりました。また、以下のコマンドを使用して、サービスの起動、停止、および再起動を行うことができます。

- Node-REDの起動: `sudo systemctl start node-red.service`
- Node-REDの停止: `sudo systemctl stop node-red.service`
- Node-REDの再起動: `sudo systemctl restart node-red.service`

--- 

なお、この `ExecStart` パラメータは、systemd サービスが起動する際に実行するコマンドを指定します。具体的には、Node-REDを起動するコマンドを指定しています。各部分の説明は以下の通りです。

1. `/bin/bash -i -c`:
   - `/bin/bash`: Bash シェルを指定します。
   - `-i`: このオプションは、インタラクティブシェルを起動することを指定します。これにより、シェルはユーザーからの入力を受け付け、出力を表示することができます。
   - `-c`: このオプションは、次に指定するコマンドを実行することを指定します。

2. `'$(which node) $(npm -g root)/node_modules/node-red/red.js'`:
   - `$(which node)`: `which`コマンドは、指定されたプログラムのフルパスを返します。この場合、`node` コマンドのフルパスを返します。この構文は、環境にインストールされたNode.jsの実際のパスを動的に取得します。
   - `$(npm -g root)`: `npm -g root`コマンドは、グローバルにインストールされたNode.jsモジュールのルートディレクトリのパスを返します。この構文は、グローバルモジュールのルートディレクトリのパスを動的に取得します。
   - `/node_modules/node-red/red.js`: これはNode-REDのメインスクリプトへのパスを指定します。このスクリプトを実行することで、Node-REDが起動します。

全体として、この `ExecStart` パラメータは、環境に依存せずにNode-REDを起動するコマンドを指定します。これにより、特定のNode.jsおよびNode-REDのインストールパスを事前に知る必要がなく、システムにインストールされたバージョンを使用してNode-REDを起動することができます。
よく使うdockerコマンドまとめ

# はじめに
こんにちは。だんだんと寒くなってきました。秋を超えて冬を感じています。ponponnsanです。dockerを使っている際によく使うコマンドをまとめようと思います。

# dockerを使用する
## コンテナを立ち上げる
```bash
docker run -it --name ubuntu ubuntu
```
--nameの後ろはコンテナ名が来ます。

-itオプションでインタラクティブモードを有効に。

インタラクティブモードは、Dockerコンテナ内で対話的にコマンドを実行できるモードです。このモードを使用することで、ターミナル上で直接コンテナ内のシェルにアクセスし、コマンドを入力して実行することができます。

### 2回目以降立ち上げる場合は以下のコマンド
```bash
docker start ubuntu
```
startの後ろにコンテナ名が入ります。

## コンテナの中に入る
```bash
docker exec -it container_name bash
```

`docker exec -it container_name /bin/bash`でも動作します。

:::note warn
それでも中に入れなかった場合
「sh」か「/bin/sh」を利用するといける可能性があります。
`docker exec -it container_name sh`
:::

# docker composeを使用する

## コンテナを立ち上げる
```bash
docker compose up --build
```
イメージの構築から、コンテナの起動までを一発でやってくれます。

```bash
docker compose up 
```
`up`コマンドのみでは、キャッシュがある場合はそのキャッシュを使ってイメージの構築から、コンテナの構築・起動までしてくれます。

```bash
docker compose up -d
```
`-d`を付けるとバックグラウンドでコンテナが起動します。



## コンテナを削除する
```bash
docker compose down
```
コンテナやネットワークの停止を削除します。

```bash
docker compose down --rmi all|local
```

`--rmi`を付けるとサービスが使っていないイメージを削除します。
`all`: あらゆるサービスで使う全イメージを削除します。
`local`: カスタムタグ（ all | local ）が無いイメージのみを削除します。

```bash
docker compose down --remove-orphans
```

`--remove-orphans`を付けるとCompose ファイルで定義されていないサービス用のコンテナも削除します。

```bash
docker compose down -v
```
`-v(--volumes)`を付けるとCompose ファイルの volumes セクション内で宣言された名前付きボリュームと、コンテナに接続している匿名ボリュームを削除します。

## コンテナの中に入る
```bash
docker compose exec service_name /bin/bash
```

dockerの中に入るには、`docker exec -it container_name bash`もありますが、上記のコマンドだとコンテナ名をいちいち確認しなくて済みますね！素晴らしいです。

## dockerの中に入ってpythonファイルを操作する
```bash
docker compose exec container_name python python/path/to/file.py
```

## dockerの中に入ってbashファイルを操作する
```bash
docker compose exec container_name bash bash/path/to/file.sh
```


# dockerのいらないものを削除する-prune-

`docker compose down`をしたとして、オプションを付け忘れることもあり、削除されないイメージやvolumeがたまるのもあるあるだと思います。
そんな時に役に立つ、`prune`コマンドについて紹介します。

## 使用していないすべてのイメージ、コンテナ、ネットワークを削除する
```bash
docker system prune
```
上記のコマンドで使われていないすべてのイメージ、コンテナ、ネットワークを削除できます。これで容量が空き、さくさく動かせることができるため、おすすめです。

また、ボリュームはデフォルトでは削除されないため、ボリュームを削除するには オプションで`--volumes`を使う必要があります。

```bash
docker system prune --volumes
```


# 参考記事
https://kaneco.net/m1-mac-docker-ubuntu/

https://qiita.com/tegnike/items/bcdcee0320e11a928d46

https://docs.docker.jp/engine/reference/commandline/compose_down.html

https://qiita.com/yusuke_mrmt/items/e05d7914065824384a6b

https://kuzunoha-ne.hateblo.jp/entry/2019/02/08/203000

https://docs.docker.jp/config/pruning.html
【AWS】RDS for MySQL5.7の延長サポート

#目次
[1.はじめに](#はじめに)
[2.延長サポートについて](#延長サポートについて)
[3.所感](#所感)

## はじめに
先日(2023/9上旬)、RDS for MySQL5.7の標準サポート終了日についてAWS側から発表がありました。


### ◆Amazon RDS でサポートされている MySQL メジャー バージョン
以下現時点での各MySQLのEOL
|MySQLのメジャーバージョン|コミュニティリリース日|RDSのリリース日|コミュニティサポート終了日|RDS標準サポート終了日|
|:---|:---|:---|:---|:---|
|MySQL 8.0<br>現在のマイナーバージョン: 8.0.34|2018 年 4 月 19 日|2018 年 10 月 23 日|2026年4月|2026 年 7 月 31 日|
|MySQL 5.7|2015 年 10 月 21 日|2016 年 2 月 22 日|2023年10月|2024 年 2 月 29 日|

詳細は以下AWS公式にてご確認ください。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html#MySQL.Concepts.VersionMgmt.ReleaseCalendar

## 延長サポートについて
EOLの発表と同タイミングで「延長サポート」についても発表がありました。

延長サポートの説明として、公式サイトに記載ある内容を流用させていただきます。
>MySQL 5.7、PostgreSQL 11、およびそれ以降のメジャーバージョンを実行している Amazon Aurora および Amazon RDS データベースインスタンスの Amazon RDS 延長サポートを、コミュニティのサポート終了後も継続いたします。Amazon RDS 延長サポートを利用すると、ビジネス要件を満たすのに役立つ新しいメジャーバージョンへのアップグレードを最大 3 年間延期できます。延長サポートは、Aurora MySQL 互換エディション、Aurora PostgreSQL 互換エディション、RDS for MySQL、RDS for PostgreSQL でご利用いただけます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/09/amazon-aurora-rds-extended-support-mysql-postgresql-databases/

### ◆延長サポート利用時の注意点
###### 1.延長サポートを有効にする必要がある
###### 2.RDS の標準サポート終了日より前にリリースされた最後のマイナーバージョンでのみ利用可能
###### 3.延長サポートは追加料金が発生する
延長サポートの詳細については以下をご確認ください。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/extended-support.html

## 1.延長サポートを有効にする必要がある
2023 年 12 月から、AWS コンソール、CLI、および API を使用して Amazon RDS 延長サポートが有効になります。
## 2.RDS の標準サポート終了日より前にリリースされた最後のマイナーバージョンでのみ利用可能
現在(2023/10上旬)最新のMySQL5.7のマイナーバージョンは「5.7.43」
## 3.延長サポートは追加料金が発生する
RDS 延長サポートは、時間あたりの vCPU ごとに料金が設定され、延長サポート1年、2年目と3年目の料金は違います。

以下延長サポート料金を表にまとめました。
|リージョン|1 年目と 2 年目の料金<br>(vCPU 時間あたり)|3年目の料金<br>(vCPU 時間あたり)|
|:---|:---|:---|
|アジアパシフィック (東京)|$0.120|$0.240|

### ◆例.db.t2.medium(2vCPU)の場合
※1ヵ月100%稼働は30.5日x24時間=732時間
- 2年目迄の料金
    - 1か月利用料金
732時間×$0.240(2vCPU)=175.68ドル
```
[日本円]
175.68x148=約26000円
※1ドル＝148円で計算
```
- 3年目からの料金
    - 1か月利用料金
732時間×$0.480(2vCPU)=351.36ドル　　
```
[日本円]
351.36x148=約52,000円
※1ドル＝148円で計算
```
ここに通常のRDS利用料金が発生してきます。
かなり料金が高めなことがわかります。

## 所感
延長サポートについては、あくまでメジャーバージョンアップ実施するまでの猶予期間として考えたほうが良いでしょう。ただ、思った以上に追加コストが発生しますので、やはりRDSの標準サポート終了日までにメジャーバージョンアップ実施した方が良いかと思います。