OmniAICreator/Qiita-1.07M huggingface dataset:
リスト末尾の空要素を削除する

### 読み飛ばし推奨
こんなCSVに遭遇しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2540018/f8f73f60-5d53-edd9-477e-672e404f6c83.png)


**列 ご と に 行 数 が 違 う。** おまけに途中に空欄がある。

取り合えずPython標準のcsvモジュールで列ごとにリストを作成してみると、

```python
import csv

col_x = []
col_y = []
values = []
with open("mapdata.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        col_x.append(row[0])
        col_y.append(row[1])
        values.append(row[2])

print(col_x)
# ['X軸', '0', '10', '', '30', '40', '50', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(col_y)
# ['Y軸', '100', '150', '200', '300', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(values)
# ['値', '235', '393', '471', '501', '607', '736', '900', '975', '1022', '1180', '1247', '1394', '1436', '1506', '1675', '1721', '1855', '1942', '2096', '2177', '2285', '2331', '2420', '2519']
```

うーん、X軸Y軸の後ろが空文字列で埋められちゃってますね……

## シンプルに解答
```python
def remove_trailing(__l: Sequence, empty=("", None, [])):
    if __l[-1] not in empty:
        return __l
    index = next((i for i, c in enumerate(reversed(__l)) if c not in empty), default=0)
    return __l[:-index]
```

### 解説
まずは引数から
```python
def remove_trailing(__l: Sequence, empty=("", None, [])):
```
`__l` が対象のリスト。関数の仕様上、リストでなくても動作するので型ヒントでは `Sequence` としている。
`empty=("", None, [])` は空と見なす値のタプル。例えば、 `Nan` という文字列も空の値と判定したいときはこのタプルを `("", None, [], "Nan")` とすればよい。

#### if分岐
```python
if __l[-1] not in empty:
    return __l
```
ここが今回の肝。最初にif文でチェックを入れること。これを省くと、最後の要素が空欄でなかったときに返り値が空のリストになってしまう。


#### indexの取得
```python
index = next((i for i, c in enumerate(reversed(__l)) if c not in empty), default=0)
```
`reversed(__l)` とすることで、リストを逆順にしたイテレータが取得できる。イテレータってなんだっけ？ という人向けに補足すると、要はループ処理時などで順に取得できるようになっているオブジェクトである。こういう適当なことを書くとコメント欄で詳しい人が論陣を張ってくれるそうなのでそちらを見てほしい。(おい)
逆順にしたうえで `enumerate` に放り込むと、リストの要素 `c` とそのインデックス `i` （厳密には逆順でのインデックス）が同時に得られる。そして、後ろの `if c not in empty` によって値が空でないときの `i` のみが残される。

`next()` は競技プログラミングをやる人には見慣れた物だろうが、馴染みのない人もいるであろうから簡単に説明しておくと、先に述べたイテレータの次の要素を取得する関数である[*](https://docs.python.org/ja/3/library/functions.html#next "next() 組み込み関数 — Python 3.12.4 ドキュメント")。
今回は、`next()` の内部がジェネレータ式となっており、 `reversed` されたリストと繰り返し回数を順に取得している。取得された値は `if` 以下のチェックにかけられ、`True` となる値のみが、括弧内先頭の `i` として残される。
で、先頭の `i` として残された最初の一つ、すなわち、元のリストで言うと空の要素が何個続いたかの数値が、`next()` 関数によって取得される。

最後の `default=0` は、 `next()` 関数が何も取得するものがなかったときに使われる値である。今回だと、リストの中身が頭から尾っぽまで空っぽだった時に `0` を返す、ということである。これをサボると `StopIteration` という例外発生してあらびっくり、となるので注意されたい。


#### Return
```python
return __l[:-index]
```
特に説明は不要だろう。Pythonの名物スライスを用いて、後ろから数えて `index` 番目の要素より前の要素だけを返している。

### なぜリスト内包表記でやらないのか？

```python
def remove_trailing(__l: Iterable, empty=("", None, [])):
    return [c for c in __l if c not in empty]
```
**1行で終わるじゃん。**

と、思ったそこのあなた、**賢い**。これでいいならこうしてました。
今回はリストの途中にも空の要素があって、そこは残しておきたかったのでこういう少し回りくどい方法が必要でした。
とはいえ、他にもいろんな方法があるかと思いますので、こういうやり方もあるよ、という方は是非コメント欄かご自身の記事でご紹介ください。別記事立てる場合は、この記事へリンクを貼っていただけると探しやすくて助かります。
pythonでboolean型はあるのか調査

# 背景
pandasのデータフレームでflagを0、1で記載していたがＣ++の時の様にboolean型があるのか気になった。

# 調査結果
bool型は存在し利用可能。

## chat gptによるそれぞれの利点
###  0と1で記載する場合の利点  
- 互換性：他のシステムやフォーマット（例えば、CやC++）と互換性がある場合、0と1を使用することが一般的です。
- 計算：0と1を直接使用することで、計算や集計がしやすくなる場合があります（例えば、合計を取るときなど）。
### bool型を使う場合の利点
- 可読性：TrueとFalseは、人間にとって直感的で理解しやすいです。データの意味が明確になります。
- エラー防止：0と1だけでなく、他の整数が誤ってデータに含まれてしまうリスクを減らせます。bool型はTrueかFalseの2値しか取り得ないため、データの一貫性が保たれます。
- メモリ効率：bool型は通常1ビットで表現されるため、メモリ使用量が減る可能性があります（ただし、実際の実装によって異なることもあります）。

# 記載例
~~~python3
import pandas as pd

# サンプルデータフレームの作成
df = pd.DataFrame({
    'value': [10, 20, 30, 40, 50]
})

# value列が10より大きくて40未満の場合にTrueを、そうでない場合にFalseを新しい列is_midに追加
df['is_mid'] = (df['value'] > 10) & (df['value'] < 40)

print(df)

~~~
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（73/100）

【73日目】
トピック 8：SAPS/4HANAの製造指図（5/15）

≪問題73≫
製品バージョンの有効性と整合性を維持するには、どの要件を満たす必要がありますか。
（３つ選択）
□割当済の作業手順および部品表/配合表（BOM）が有効期間全体で有効であること。
□製品バージョンのロットサイズ範囲が割当済の作業手順のロットサイズ範囲内であること。
□作業手順または部品表/配合表（BOM）に対して削除フラグが設定されていないこと。
□割当済の作業手順がレート作業手順であること。
□割当済の作業手順に代替順序がないこと。

≪解答≫
■割当済の作業手順および部品表/配合表（BOM）が有効期間全体で有効であること。
■製品バージョンのロットサイズ範囲が割当済の作業手順のロットサイズ範囲内であること。
■作業手順または部品表/配合表（BOM）に対して削除フラグが設定されていないこと。
□割当済の作業手順がレート作業手順であること。
□割当済の作業手順に代替順序がないこと。

≪解説≫
◆製造バージョンの整合性を確保するためには、以下の要件を満たす必要があります。
（1）製造バージョンのロットサイズ範囲が、割り当てられた作業手順およびBOMのロットサイズ範囲内であること。
（2）割り当てられた作業手順およびBOMが、製造バージョンの有効期間全体で有効であること。
（3）割り当てられた作業手順およびBOMに削除フラグが設定されていないこと。
◆製造バージョンの整合性チェック機能を使用すると、製造バージョンのデータが作業手順のデータおよびそれに割り当てられているBOMのデータと整合しているかどうかを確認することができます。確認中に不整合が検出された場合、確認結果のログにエラーまたは警告メッセージが表示されます。また、確認結果は製造バージョンのチェックステータスとして更新されます。
Stable Diffusion 3 Mediumのインストール

他の記事を見てそのまんまにやったのですが、詰まったとこだけメモします

# 一応、自分の環境
M1 Macbook Pro (apple silicon)

# 手順
これ見てやった
https://towards-agi.medium.com/how-to-download-and-install-stable-diffusion-3-medium-446b37f354f7

UIは、Stable Swarm UIを選択

# 詰まったとこ: モデルとテキストエンコードの追加
モデルの追加ボタンがなかったので
git clone したStableSwarmUIのフォルダ直下の「Models」のフォルダの中の「Stable-Diffusion」のフォルダの中に、適当に「StableDiffusion_3M」てフォルダを追加して、「sd3_medium.safetensors」を入れた

テキストエンコードも、同じくStableSwarmUIのフォルダ直下の「Models」のフォルダの中の「clip」でフォルダの中に「clip_l.safetensors」「clip_g.safetensors」「t5xxl_fp8_e4m3fn.safetensors」を入れた

でブラウザをリロードして、プロンプトを入れて生成したら時間はかかるもののできるようになった。

# LoRaの入れ方
参考: https://soroban.highreso.jp/article/article-041

https://civitai.com/ とかでダウンロードして
StableSwarmUIのフォルダ直下の「Models」のフォルダの中の「Lora」のフォルダの中に新規フォルダを作ってダウンロードしたファイルを置く

対応するモデルのバージョンも入れる必要がある

# こちらの記事を作るために行いました
https://note.com/mae616/n/n50984d94218c?sub_rt=share_pb
AtCoder 勉強記録[C++] その24

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
本日は参加できなかったABC359のAB問題の復習に取り組んだ。
## A - Count Takahashi
[A - Count Takahashi](https://atcoder.jp/contests/abc359/tasks/abc359_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  string s;
  ll res = 0;
  rep(i, n) {
    cin >> s;
    if(s == "Takahashi") res++;
  }
  cout << res << endl;
}
```
### 解法
入力された`Takahashi`の数をカウントして出力する。
## B - Couples
[B - Couples](https://atcoder.jp/contests/abc359/tasks/abc359_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vec a(2*n);
  rep(i, 2*n) cin >> a[i];
  ll res = 0;
  for(int i = 1; i < 2*n-1; i++){
    if(a[i-1] == a[i+1]) res++;
  }
  cout << res << endl;
}
```
### 解法
`A`の要素のうち1から2*n-1の要素について両隣の値が同値である場合に題意を満たす。よって両隣が同値の場合をカウントし出力する。
sudo: service: command not foundのエラーで困っている人が見る記事

## 久しぶりに触ったらdockerが実行できなくなった
このコマンドが
```sh
docker compose up -d
```
このエラーになった。
```sh
Cannot connect to the Docker daemon at unix:///Users/[ユーザ名]/.docker/run/docker.sock. Is the docker daemon running?
```

## どうやらDockerデーモンが起動していないらしい
調べると[この記事](https://zenn.dev/yusuke_docha/articles/1f61ca5ba6acd8)のような解決法が出てきたが
```sh
sudo service docker start
```
別のエラーになった。
```
sudo: service: command not found
```

## 解決記事はいっぱいあったけど
[この記事](https://qiita.com/Mikenerian/items/5e9801342a8373ab518f)のようにパスを通せというものが多かったが、どれもうまくいかなかった。

## 解決策
ChatGPTが教えてくれた。

##### 1. Dockerデーモンが実行されているか確認する:

ターミナルで次のコマンドを実行して、Dockerデーモンのステータスを確認します。
```sh
docker ps
```
このコマンドがエラーを返さず、実行中のコンテナリストを表示する場合、Dockerデーモンは実行中です。

##### 2.Dockerデーモンを起動する:

Dockerデーモンが実行されていない場合、次のコマンドで起動します。
```sh
open /Applications/Docker.app
```

macOSでは、Docker.appを起動するとデーモンも自動的に起動します。

## 結果
2.のコマンドを実行した後に最初のコマンドを実行してみると成功した！
```sh
docker compose up -d
```
localhost:8080/にアクセスしたら任意のページを表示したい

```vue.config.js

module.exports = {
  pages: {
    index: {
      entry: 'src/main.js',
      template: 'public/index.html',
      filename: 'index.html',//これがあるブロックがlocalhost:8080/」でアクセス可能
      title: 'Home Page',
    },
    login: {
      entry: 'src/login.js',
      template: 'public/login.html',
      filename: 'login.html',
      title: 'Login Page',
    },
    about: {
      entry: 'src/about.js',
      template: 'public/about.html',
      filename: 'about.html',
      title: 'About Page',
    }
    // Add more pages as needed
  }
};
```

上記の例では、index、login、aboutの3つのエントリーポイントが定義されています。それぞれのエントリーポイントは異なるJavaScriptファイル (entryで指定)、HTMLテンプレート (templateで指定)、ファイル名 (filenameで指定)、ページタイトル (titleで指定) を持っています。

BASE_URLでアクセスした場合、どのページが表示されるかは、vue.config.jsのpagesオプションで定義したファイル名に依存します。例えば、index.htmlというファイルがBASE_URLでのデフォルトのページとして提供されます。

注意点として、vue.config.jsでのpagesオプションを使う場合、自動的にルーティングの設定が生成されるため、Vue Routerの設定との整合性に注意する必要があります。特に、ルーティングに関連する機能や動的なパスのマッピングがある場合は、vue-routerの設定と合わせて調整する必要があります。
エンジニアにおすすめの本〜あたしいLinuxの教科書

# きっかけ

元々C#ばっかり触っていたので
1. サーバーなにそれおいしいの？
2. 黒い画面怖い

こんな感じだったので状況を打破したくて買ってみました

# 本の紹介

この記事で紹介したい本

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942

同じ著者のlinuxに関する本

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797393106

- エンジニアおすすめ度:⭐︎⭐︎⭐︎⭐︎⭐︎
- 社会人おすすめ度:⭐︎

# ディレクトリ構成について

windows、linuxにはそれぞれ特徴的なディレクトリがそれぞれあると思います

1. opt
2. home
3. bin
4. etc

上記のようにwindowsのディレクト構成がわかっていない私がlinuxのこのディレクトリなに？？？となっていましたがこれらが説明されています。

# ショートカットについて

本書ではショートカットについても解説されています

1. control + h ※文字削除
2. control + b ※カーソル移動
3. control + r ※履歴の確認
4. control + p ※直前のコマンドの呼び出し

上記のようにショートカットを教えてくれます

個人的に「control + r」はそもそも頭の中に履歴を呼び出せるかな？と考えていなかったので嬉しいです

カーソル移動系に至ってはmacだとvscodeで同じショートカットが使えます　神

ショートカット大好き芸人にとっては垂涎ものでした

# パーミッション、パイプライン、vim

他にもlinuxを使う上で必ず付き合うことになるであろう機能、ツールの紹介がふんだんにされています

# 終わりに

1. Linuxのことがわからない人
2. サーバーのこと全くわからない人

にはとてもいい本になると思うのでぜひお買い求めください
Nuxt4に移行したらVuetifyのVDataTableがめちゃくちゃ重くなった話


## Nuxt4のマイグレーションを試してみた
先日、Nuxt3から4へのマイグレーションガイドが公開されました。
まだ正式リリースではありませんがガイドに従って設定することでNuxt4を試すことができます。

私も担当しているプロジェクトで、以下の記事を参考に移行を行ってみました。

https://zenn.dev/comm_vue_nuxt/articles/2b3ed4ed07723a

いくつか利点はありますが、特にfetch周りのパフォーマンスが大幅に改善されたと体感しました。

## Vuetifyとの相性？
しかしながら、VueのUIライブラリとしてメジャーなVuetify3と併用するときには注意が必要かもしれません。

実際に私が担当するPJではVDataTableというUIコンポーネントを多用しています。

https://vuetifyjs.com/en/components/data-tables/basics/#usage

どれも一般的な用途で、APIでデータを取得し、テーブルで表示するというものです。
問題が起きたのはテーブルの項目をselectするときです。
「やたら重いな・・・？」
明らかにNuxt3の時よりcheckの挙動が遅くなっています。

## 思いつく限りの原因を潰してみる
自身の書き方がまずいのかもしれない、Vuetifyのバージョンアップで改善されているかもしれないなど、いくつか思いつく方法を試してみました。

1. slot内でフォーマット関数を使わない
Vuetify2時代の記事ですが、「VDataTableのslotで関数を使うとSelectのたびに全項目でレンダリングが行われるのでNG」というコメントがありました(こちらは解決
実際にフォーマット関数にログを仕込んでみたところ、selectしていない行でも全件フォーマット関数が実行されていることを確認しました(既にクローズ)
https://github.com/vuetifyjs/vuetify/issues/5986#issuecomment-1205066197

コード値をEnumで文字列に変換したり、YYYY-MM-DD形式の日付をYYYY年MM月DD日にするなど、簡単な処理ではありましたが事前に変換しておくことで再計算を減らすことができました。

しかしまだVDataTableの挙動は重いままでした。

2.検索結果一覧、Select変数をshallowRefで定義する

shallowRefを使うことで、オブジェクトや配列で浅めに定義することでネストした変更の監視をしないため、適切に使うことでパフォーマンスの改善が見込めます。

https://ja.vuejs.org/api/reactivity-advanced#shallowref

しかしVDataTableはselectした際にどうやらオブジェクトを再生成してから再代入するようで、selectした時点で全件でのレンダリングが発生していました（この辺り認識曖昧で情報も少）

3. #[`item.data-table-select`]でプレーンな要素に置き換える
Vuetifyのコンポーネントは内部的にv-checkboxやv-text-field,v-checkbox-btnなど基本的なコンポーネントを利用していることが多いです。
VDataTableであればshow-selectプロパティをtrueにするとチェックボックスが表示されますが、これはVCheckboxBtnが利用されているようです。

https://vuetifyjs.com/en/components/checkboxes/

>TIP:
A simpler version, 
v-checkbox-btn
 is used primarily as a lightweight alternative in data-table components to select rows or display inline boolean data.

以前、内部的に利用されていたV-Text-Fieldをinputタグに変更することでパフォーマンスが改善されたことがありました。
それに倣い、今回もinputタグに変更してみました。
```html

...

<template #[`item.data-table-select`]="{item}">
 <input type="checkbox" @change="selectRow(item.id)" />
</template>

...
//selectRowは対象の行IDがselect配列に存在する場合は削除、存在しない場合は追加する処理
```

しかしながらこちらも効果がありませんでした。


4.VDataTableVirtualを使ってみる

https://vuetifyjs.com/en/api/v-data-table-virtual/#events

レンダリングパフォーマンスの改善は見られたがページング対応していないため要件が合わず。

5.ほかのUIライブラリを試してみる

今回はQuasarを試してみました。
VueのUIライブラリは多くありますが、Vuetifyに次ぐstar数だったこともありこちらのテーブルコンポーネントを試してみました。

https://quasar.dev/

https://quasar.dev/vue-components/table/


6.v-memoを試してみる

v-memoとは、変数の変化、特定の条件でテンプレートをメモ化するディレクティブです。

https://ja.vuejs.org/api/built-in-directives#v-memo

selectしている行以外のレンダリングを止めるためにslotを各セルごとではなく行全体で書くように修正し、選択している行以外のレンダリングを行わないようにできないかと試してみました。

しかしながら1行目と同じ内容が繰り返しレンダリングされてしまうようになってしまい断念しました（公式サンプルではv-forの中では機能しないという記載があるので、使い方が間違っているのかもしれないがVDataTableでどう書くのが適切かわからなかった）

### 最終的にどうなったのか

結果として5のUIライブラリを変えたことでパフォーマンスは大幅に改善しました。
Vuetifyは非常に素晴らしいライブラリなのですが、稀にパフォーマンスの面で問題が生じることがあるためピンポイントで他UIライブラリのコンポーネントを試したり、場合によってはフルスクラッチするのもありかもしれません。

QuasarのTableではVDataTableで設定していたプロパティとほぼ同じことができているので様子を見ながら置き換えていこうと思います。

shallowRefはテーブル構造等複雑なオブジェクトの一部のプロパティを書き換える際の不要な再レンダリングなど監視をゆるめたい場面で有効ですが、今回のケースではコンポーネント自体の仕様もありうまく活用できませんでした。


Vueの内部的な仕組みについてより勉強していく必要があると感じた課題でした。
STUDIOに触れて思うこと

# STUDIOに触れて思うこと

コーディング（HTML&CSS）のブロック要素、インライン要素の考え方が進歩した！！

以前は「　`<div>`はブロック要素だから、、　」と要素に囚われてしまっていました。
STUDIOに触れることで、`div`をBOXと表現しており、その考え方にしっくりきました。
良くも悪くも、一つのことをやり込んでからしか次に進めないのが自分の足枷になっていました。今回でいえば HTML&CSSの入口のところでウロウロしてました。


## 何がしっくりきたのか
〔１〕　外枠（`<div>`）と中身（`インライン要素`）の指定するべきことが明確になった
親要素に指定すべきこととインライン要素に適応すべきことがごっちゃになっている自覚はありましたが、何がどうごっちゃになっているのか、についてはわかっていませんでした。

〔２〕単位（`px`／`％`）の使い分け
親要素には`px`、子要素には`％`ね！と決めたがりの自分がいました。
それは、「この指定をすると、見た目はこう反映される。」がよくわかっていなかったから。今も完全にはわかりませんが、相対的な話なんだな、ということくらいまでは理解が進みました。

### 例えば
・親要素でコンテンツ幅を決めたいから、BOXの幅や高さに合わせてしっかり`px`で指定した方がいい。
・BOXに合わせたいけど、レスポンシブ対応するために`％`で指定し、あとはデバイスによしなにやってもらう。

# これから
コーディングといってもWordpressやSTADIOといった割と簡単にサイト制作できるツールがあるので、それでwebサイトの作りを知る、というのはコーディングを理解するために必要な過程でした。
コーディングの入口がHTML&CSSだったのは私にはあっていましたが、**人によってはSTUDIOとかから始めた方が挫折しなさそうだな**、とも感じました。

先輩デザイナーさん方も、もがきながら少しずつで進んだ結果、素晴らしいクリエイターさんになっていらっしゃると思うので、私もその後に続きたいと思った所存です！
引き続きよろしくお願いします！
自作PCを作ろう2 ～ISAを作ろう～

この記事はのちのちかなり書き変えることになるかもしれません．

# 前回のあらすじ
- FPGA上に自作PCを作ろう！
- まずはRAMを作ったよ！ (動かしてない)

# 基本構成
本当は効率的な方法とか考えて賢く作りたいんですが，そんな実力はないのでまずはそういうの無視して分かりやすい形で作ろうと思います．
機械語32ビット，イミディエイトデータ32ビットの計64ビットを一つの単位とします．
私は以前，RISC-VのISA(RV32I)をFPGA上に実装したことがあるのですが，即値が32ビットの中に入っていてよく分からなかったのでここでは分けることにします．
TD4でも分けていますしね．
よく考えたら，ISAを作るということはコンパイラも作らなければならないのでは…しんどいですね．

CPU内のレジスタについては，RISC-Vに倣って，32ビットが31個あることにします．
レジスタ内のアドレスは6ビットで指定し，プログラムカウンタは固定でアドレス`6'h1f`へ置くことにします．
レジスタとプログラムカウンタ合わせて32個って感じですね．

また，PYNQ Z2にはIOがたくさんありますので，これもCPU直結で動かせるようにしたいと思います．
レジスタのアドレスは`6'h00`～`6'h1f`の6ビットで表現しますが，IOは最上位ビットに`1`を指定することにします．つまり`6'h20`スタートのアドレスになります．
具体的なアドレスと割り当ては以下の通り．

|アドレス|割り当て|
|:-|:-|
|`6'h20`|タクトスイッチ．上位4ビットは0固定．書き込み禁止．|
|`6'h21`|DIPスイッチ．上位6ビットは0固定．書き込み禁止．|
|`6'h22`|LED．上位4ビットは0固定．|
|`6'h23`|RGB LED．上位2ビットは0固定．|
|`6'h24`|Pmod A．|
|`6'h25`|Pmod B．|
|`6'h26`|AR8～AR13．上位2ビットは0固定．|
|`6'h27`|A，AR_SDA，AR_SCL．上位5ビットは0固定．|
|`6'h28`|AR0～AR7．|
|`6'h29`|AR_RST．上位7ビットは0固定．書き込み禁止．|
|`6'h2A`|AR_MISO，AR_SCK，AR_MOSI，AR_SS．上位4ビットは0固定．|
|`6'h2B`|アナログピンはいったんオミット|
|`6'h2C`|XADCもいったんオミット|
|`6'h2C`|XADCもいったんオミット|
|`6'h2D`|GPIO0～GPIO7．|
|`6'h2E`|GPIO8～GPIO15．|
|`6'h2F`|GPIO16～GPIO23．|
|`6'h30`|GPIO24～GPI27．上位4ビットは0固定．|

ちなみに私は，RISC-V RV32IとTD4しかCPUを知らないので，基本的にこの二つを真似る形で作ろうと思ってます．

よくある質問
Q. RAXレジスタとかはどうするんですか？
A. どうしよう…考えてない…

# ISA
RISC-Vの真似で，「～～系」と名付けていくことにします．
また，以下の用語を使うことにします．
- type 何系のコマンドか
- func 機械語の種類
- mask マスク
- rs1 演算に使用するレジスタのアドレスひとつめ
- rs2 演算に使用するレジスタのアドレスふたつめ
- rd 演算結果を出力するレジスタのアドレス
- imm 即値を使用するか．\
      使用する場合はrs1またはrs2を無視し，即値のみまたはrs1と即値で演算を行う

```
 31  29 28  23 22  19 18 13 12  7 6  1  0
| type | func | mask | rs1 | rs2 | rd |imm|
```

## 演算系
ProcessingでP系．`type`は`3'h0`．
指定された処理と同時に，`pc`をインクリメントします．
maskは使用しないため`4'h0`固定．

以下，`func`は`5'h00`からスタートして1ずつインクリメントするとします．
- AND 論理積
- OR 論理和
- XOR 排他的論理和
- NOT 反転．なお，rs2は無視する
- NAND 否定論理積
- ADD 算術和
- SUB 算術差
- ADDI 算術和．符号を考慮する
- SUBI 算術差．符号を考慮する

## シフト系
ShiftでS系．`type`は`3'h1`．
指定された処理と同時に，`pc`をインクリメントします．
rs1で指定された番地の数値をrs2またはイミディエイトデータの数値分だけシフトしrdに格納します．
risc-vには算術左シフト命令はないようですが，ここでは実装することにします．
[参考](https://ameblo.jp/mcufamily/entry-12784216821.html)
また，maskは使用せず`4'h0`固定とします．

- SLL 左シフト命令
- SRL 右シフト命令
- SLA 算術左シフト命令
- SRA 算術右シフト命令

## 代入系
AssignmnetでA系．`type`は`3'h2`．
指定された処理と同時に，`pc`をインクリメントします．
rs1で指定された番地の数値または指定されたイミディエイトデータをrdに格納します．
`rs1`は使用しないため`6'h00`固定です．

- MOV イミディエイトデータをrdに格納する

## 分岐系
ForkでF系．`type`は`3'h3`．
rs1とrs2の数字を比較し，その結果がtrueなら`pc`にイミディエイトデータを足し，falseならインクリメントします．
maskとrdは使用しないため`0`固定とします．また，必ずイミディエイトデータを使用するため，`imm`は`1'b1`固定です．

- EQ 等しいか比較
- NE 等しくないか比較
- LT 小なりか rs1 < rs2
- GT 大なりか rs1 > rs2
- ELT 以下か rs <= rs2
- EGT 以上か rs >= rs2

## ジャンプ系
JumpでJ系．`type`は`3'h4`．
maskとrs2とrdは使用しないため`0`固定とします．

- JUMP rs1またはイミディエイトデータへジャンプ

## メモリ系
MemoryでM系．`type`は`3'h5`．
指定された処理と同時に，`pc`をインクリメントします．
メモリ書き込み・読み込みの命令．

- RM rs1またはイミディエイトデータで指定された番地のデータをrdへ読み込み
- WM rs1またはイミディエイトデータで指定された番地へ，rs2のデータを書き込み

# 次回の目標
早速これに従うCPUを作ろう！
と言いたいところですが，アセンブラとかコンパイラとか作ったらこのあたり作り直しになりそうな気がするのでまずアセンブラを作りましょう．
Java Virtual Threadについて調べる時間

# はじめに
Goのgoroutineは軽量スレッドモデルであり、従来の言語のスレッドモデルよりも小さな単位で実行単位を分け、コンテキストスイッチングのコストとブロッキングタイムを低減する概念です。Kotlinではcoroutineという名前で導入され、JDK21からはVirtual Threadが正式にリリースされました。

https://go.dev/tour/concurrency/1


# 従来のJavaスレッドモデル
従来のJavaのスレッドモデルはNative Threadモデルで、JavaのユーザースレッドからJNIを通じてカーネル領域を呼び出し、カーネルスレッドを生成してマッピングして作業を行う形態です。つまり、ユーザースレッドとカーネルスレッドの関係は1:1です。

このとき、JavaのスレッドはI/O、インタラプト、スリープなどの状況でblock/waiting状態になりますが、**この時に他のスレッドがカーネルスレッドを占有して作業を行うことをコンテキストスイッチングと言います。**

スレッドモデルは従来のプロセスモデルを細かく分け、プロセスの共通部分を共有しながら小さな複数の実行単位を交互に実行できるようにしました。しかし、Spring MVC / Tomcatを使用する環境ではリクエストごとに1スレッドを使用し、リクエスト量が増えるほどコンテキストスイッチングのコストも指数関数的に増加しました。

> https://github.com/openjdk/jdk21/blob/master/src/hotspot/share/runtime/javaThread.hpp#L78

# Virtualスレッドモデル

Virtualスレッドはプラットフォームスレッドと仮想スレッドに分かれます。つまり、プラットフォームスレッド上で複数の仮想スレッドが交互に実行されます。ここで、**仮想スレッドはコンテキストスイッチングコストが従来のJavaスレッドモデルよりも安価です。** つまり、仮想スレッドとプラットフォームスレッドの関係は1:Nです。

https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html

|           | Thread  | Virtual Thread      |
|-----------|---------|---------------------|
| Stack Size| ~ 2MB   | ~10KB               |
| Creating time| ~1ms  | ~1µs               |
| Context Switching | ~100µs | ~10µs        |

Threadは基本的に最大2MBのスタックメモリサイズを持つため、コンテキストスイッチング時のメモリ移動量が大きいです。また、生成するためにカーネルと通信してスケジューリングするため、生成コストも大きいです。

反対に、Virtual ThreadはJVMによって生成されるため、システムコールなどのカーネル領域の呼び出しが少なく、メモリサイズが一般のスレッドの1%に過ぎません。

プラットフォームスレッドの基本スケジューラはForkJoinPoolを使用します。これにより、プラットフォームスレッドプールを管理し、Virtual Threadの作業分配を行います。

つまり、JVMが直接アクセスするスレッドはプラットフォームスレッドであり、プラットフォームスレッドにマウントして実行する過程はcarrierThreadに実行対象仮想スレッドを割り当てる方式です。

> https://github.com/openjdk/jdk21/blob/master/src/java.base/share/classes/java/lang/VirtualThread.java#L131

## Virtual Threadの動作原理

1. 実行されるVirtual Threadの作業であるrunContinuationをcarrier threadのworkQueueにpushします。

2. Work queueにあるrunContinuationはforkJoinPoolによってwork stealing方式でcarrier threadによって処理されます。

3. 処理されたrunContinuationはI/O、スリープによる割り込みや作業完了時にwork queueからpopされ、park過程によって再びヒープメモリに戻ります。

JDK21からLockSupportにVirtual Thread判断ロジックを追加し、現在のスレッドがVirtual Threadの場合、park/unparkするようにして、従来のThreadモデルと完全に互換性のあるコンテキストスイッチングをサポートします。

## Kotlin Coroutineとの比較

Kotlinでは関数をsuspendとして宣言すると、軽量スレッドのように動作します。しかし、Coroutineはメソッド単位で必要な部分にだけ軽量スレッドを使用できます。また、JDK21以前のバージョンでも軽量スレッドを適用できる利点もあります。

ただし、Coroutineに入る前までは通常のThreadで処理され、Kotlinが作成したsuspend拡張関数を使用する必要があるため、プロダクションコードに変更が必要です。

また、suspend関数は特定の地点でrunBlockingを使用したり、suspend Controllerを作成する必要がありますが、これは応答をリアクティブ応答に変換することになります。

https://kotlinlang.org/docs/coroutines-overview.html

# 注意事項
- プーリング禁止:
    仮想スレッドは安価な使い捨て品なので、スレッドプールを作る行為は無駄になる可能性があります。
- CPUバウンド作業には非効率:
    I/O作業には有効ですが、CPU作業のみを行う場合、プラットフォームスレッドのみを使用するより性能が低下します。つまり、コンテキストスイッチングが頻繁に発生しない状況では従来のスレッドが適しています。
- Pinned問題:
    Virtual Thread内でSynchronizedやParallelStream、またはネイティブメソッドを使用すると、parkできない状態になり、これが性能低下を引き起こす可能性があります。この部分はSpringも内部でSynchronizedを使用している場合があるため、ReentrantLockに変換する動きがあります。
- Thread local:
    Virtual Threadは頻繁に生成・削除されるため、常に小さく保つことが重要です。
Salesforceのコンテンツ配信機能について解説

Salesforceのコンテンツ配信機能について解説


※Classic環境のみの出来る機能です

まずはファイルをSalesforceにアップロードしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bcfcd8f8-a91f-f6e3-c116-b1df48c16b36.png)


こちらが通常のファイル画面です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9480bb13-661e-0207-7033-19e2938354e3.png)


しかしながらユーザーの設定で「Salesforce CRM Content ユーザー」にチェックがついているユーザーの場合は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/803f8d2d-7c60-fadb-849a-77f44a2a3d28.png)


右上に「コンテンツ詳細ページに移動」ボタンが出ます。
こちらをクリックしましょう


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3ee15c65-c4a9-3f6e-0af8-900d6caa2878.png)


コンテンツ配信画面が出ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c28a53fc-9432-81bb-fc5c-bc35934c4d4d.png)



こちらから配信期限やパスワードを設定しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/072455ef-d3c9-338f-e631-f5784067c5db.png)


こちらでコンテンツ配信が完了です

少し待てばURLが作成されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fcbf2cfa-7f00-f41a-b3c4-4b16f0aabf69.png)

作成されたURLを共有するとURLを知る人にSalesforceでアップロードした画像などを参照やダウンロードをさせることが可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8babc0b3-8eb0-5d0a-d104-cc12d30394df.png)
エンジニアにおすすめの本〜イシューからはじめよ

# きっかけ

1. 仕事の進め方が悪いと感じていた
2. 頭がいい人の思考法が知りたかった

# 本の紹介

https://www.amazon.co.jp/%E3%82%A4%E3%82%B7%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E2%80%95%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E3%81%AE%E3%80%8C%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E6%9C%AC%E8%B3%AA%E3%80%8D-%E5%AE%89%E5%AE%85%E5%92%8C%E4%BA%BA/dp/4862760856

https://youtu.be/9YGE1qRxmHA?si=ONUEklkvsAB7nDOG

- エンジニアおすすめ度:⭐︎⭐︎
- 社会人おすすめ度:⭐︎⭐︎⭐︎⭐︎⭐︎

「エンジニア」にはあまりおすすめではないと思ってしまいました。

もっとビジネスを始める時取り掛かっている時の大枠の話のような本だと思いました

# イシューとは

githubでもあると思いますが本書では

「問題に答えを出す必要性の高さ」

と言われています。難しい。

要はある問題や課題について答えを出さないといけない重要度のような指標かなと思います

複数の問題を抱えている人の一つの指標になったり大きな問題、バグに対しての指標になるのではないかと思います

# 解の質

こちらも難しいですね

「ある問題、課題に対してどこまで明確に答えを出せているか」

このような指標のようです

要はどれだけバグの原因や仕組みを理解できているか、流れをどれだけ理解できているかの指標かと思います

# 犬の道を避ける

本書の結論はここになります

とにかく時間をかけて問題、課題、バグを解決してはダメです

「イシュー度の高さ✖️解決内容の質の高さ」

この掛け算の結果を挙げることがビジネスマンとしてのバリュー、生産性につながると書かれています

# 終わりに

本書はどこまでエンジニアに活用できるか正直わかりませんでした

要件定義や設計を行っている方であれば根本の考え方やフレームワークなど使えそうだと感じましたが私の場合だとまだまだ活かしきれないと感じました

要件定義、設計またはコンサルなどされている方には大いに役立つものだと感じていますのでぜひ読んでみてください
Hugging Faceのssh鍵の作り方

# 一応、自分の環境
- M1 Macbook Pro (Apple Silicon)

# 経緯
Stable Diffusion 3 Medium をインストールしたかったんだけど、結局下記のやり方でやって没になりました。
https://towards-agi.medium.com/how-to-download-and-install-stable-diffusion-3-medium-446b37f354f7
知見だけメモしたいので残します。

# 手順
Hugging Faceのページに飛んで、また導かれるままにアカウント登録とEmail認証をする。

三点リーダーをクリックしてclone repositoryを選択
![CleanShot 2024-07-18 at 20.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435274/4a369fd5-fd6e-67db-39ce-78108e177b54.png)

やり方が出てくる。
![CleanShot 2024-07-18 at 20.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435274/25f3e7b5-9adc-2a28-52c9-182e6e969a45.png)
書いてるのを日本語翻訳しながらやる
```
$ git lfs install
```
は自分はエラーになって、元々色々brewで入れているので
```
$ brew update
$ brew install git-lfs
```
をした。

参考: https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear

git clone はsshでしたかったので切り替えて
![CleanShot 2024-07-18 at 20.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435274/59cb908c-c379-fa47-bb8c-7571bfc1c11f.png)

```
$ ssh-keygen
```
で鍵作って、公開鍵をコードの上のリンク https://huggingface.co/settings/keys で登録して、
公開鍵のファイル名が、id_rsaでなかったのでPCの.ssh/configに下記を登録した
```
Host hf.co
HostName hf.co
IdentityFile ~/.ssh/id_hogehoge <=作った秘密鍵
User git
```
で、git clone
Teraterm ショートカットレシピ

みんな大好きTeraterm！
いろんなマシンに繋ぐとき、毎回Hostやシリアルポートの設定などを変更しているとキレそうになると思います。

本記事ではそんなあなたと私に向けて最強()のTeratermショートカットレシピを提供します。

Tera Termを導入からショートカットを作るまでの過程で、いちいちググらずにこの記事（とリンク先）を見ておけばOKといえるものを目指します。

# Tera Termについて
https://teratermproject.github.io/

# ヘルプページ
https://teratermproject.github.io/manual/5/ja/

# コマンドラインマニュアル
https://teratermproject.github.io/manual/5/ja/commandline/teraterm.html

https://teratermproject.github.io/manual/5/ja/commandline/ttssh.html

# シュートカットレシピ
以下のコマンドをショートカットとして作成することで、ワンクリックでTeratermを用いたマシン接続が行えます。
## SSH接続
実行ファイルパスやIPアドレス、その他のパラメータは任意の値に置き換えて使用してください。
### パスワード認証
```bat
"C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.42.1 /auth=passwd /user=<root> /passwd=<password>
```
### 公開鍵認証
```bat
"C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.42.1 /auth=publickey /user=<username> /passwd=<password> /keyfile=<keyfilepass>
```
### 使用オプション
#### /auth
認証方式を指定
よくある passwd/publickey を覚えておけばいいです。
#### /user
ユーザー名
#### /passwd
パスワード
コマンドでショートカットを作成すると平文で保存されるので注意。
#### /keyfile
秘密鍵ファイルのパス

## シリアルポート接続
```bat
"C:\Program Files (x86)\teraterm\ttermpro.exe" /C=3 /BAUD=14400
```
### 使用オプション
#### /C
COMポートの番号
#### /BAUD
シリアルポートのスピード

# まとめ
SSHとシリアルポートのどちらの方法もまとめているページがなかったので作成しました。
皆さんのお役に立ちましたら幸いです。良いTeratermライフを！
ChatGPT先生へ「直角三角形に内接する正方形」

```
"直角三角形に内接する正方形"
```
正方形の辺の長さの求め方...
```
sympyで
```
```python
import sympy as sp

# 底辺と高さをシンボルとして定義
a, b = sp.symbols('a b')

# 正方形の辺の長さの式
s = a * b / (a + b)

# 結果を表示
s
```


# 自作
```python
from sympy import *
var('x,a,b',real=True,poitive=True)
x=solve(Eq(x*x+(a-x)*x*Rational(1,2)+sqrt(a**2+b**2)*0*Rational(1,2)+((b-x)*x)*Rational(1,2),a*b*Rational(1,2)),x)[0]
print("#",x)
# a*b/(a + b)
```

# 過去問


'




過去問

○"直角三角形に内接する正方形"
一致する結果はありません
https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%22%E7%9B%B4%E8%A7%92%E4%B8%89%E8%A7%92%E5%BD%A2%E3%81%AB%E5%86%85%E6%8E%A5%E3%81%99%E3%82%8B%E6%AD%A3%E6%96%B9%E5%BD%A2%22&oq=%22%E7%9B%B4%E8%A7%92%E4%B8%89%E8%A7%92%E5%BD%A2%E3%81%AB%E5%86%85%E6%8E%A5%E3%81%99%E3%82%8B%E6%AD%A3%E6%96%B9%E5%BD%A2%22&gs_l=partner-web.12...0.0.2.24113.0.0.0.0.0.0.0.0..0.0.csems%2Cnrl%3D10...0.....34.partner-web..12.34.6633.YZMQM6whePM

○"内接正方形"
一致する結果はありません
https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%22%E5%86%85%E6%8E%A5%E6%AD%A3%E6%96%B9%E5%BD%A2%22&oq=%22%E5%86%85%E6%8E%A5%E6%AD%A3%E6%96%B9%E5%BD%A2%22&gs_l=partner-web.12..0i512i4i37l4j0i512j0i512i4i37j0i30i15j0i5i30l3.10816.28050.0.30745.17.17.0.0.0.0.293.3735.0j4j13.17.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..1.16.3517.u2png54pYy8




何だか、奥が深そうな気がします。
Web会議の録画データをOpenAIのWhisper APIで文字起こしする方法（要課金）

## 背景

ZoomでWeb会議を行った際に画面録画をしましたが、議事録作成をするために後から見返すのは大変です。Microsoft Teamsであれば会議の録画と同時に文字起こしを行う機能がありますが、会議が終了した後に録画データを使用して文字起こしを行う場合、どのようにすれば良いかについて説明します。

ここでは、既に終了した会議の録画データをOpenAIのWhisper APIを使用して文字起こしを行う方法を紹介します。

## 前提

### OpenAI APIのサブスクリプション
Whisper APIを使うためには、OpenAIの課金が必要です。
課金と言ってもプリペイド方式であり、自動チャージを有効にしなければ、プリペイド以上に課金される心配はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/ff0d1da7-a195-789c-1fb8-cffcb8238822.png)

## 手順

### Step 1: 音声ファイルの抽出
Web会議などでMP4などの動画形式のファイルの場合、事前にMP3などの音声ファイルの抽出が必要です。
VLC Media Playerを利用して、以下の通り作業を行います。
https://www.videolan.org/vlc/index.ja.html

1.「メディア」から「変換 / 保存」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/0c52698b-d575-a058-164e-6fd89053c2d2.png)

2.「追加」をクリックし、対象ファイルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/6b63b114-54e7-c64a-cb0b-85c79e4cd9e6.png)

3.「変換 / 保存」右▼の「変換」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/2d35a8e7-8423-fff7-d06b-ffb2122c324e.png)

4.「変換」を選択。「出力ファイル」を入力し、「開始」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/12e8494d-961a-ae56-57a1-ad653f4a3f5f.png)

以上の手順により、mp3ファイルのみが抽出できます。

### Step 2: 文字おこしスクリプトの取得と実行

以下URLにアクセスし、記載内容に従ってスクリプトを実行します。
https://github.com/flathill/Whisper-Audio-Transcription

本スクリプトは、Windows 11のWSL2上で動作確認を行っています。動作しない場合は、ご連絡ください。

参考までに、45分程度のWeb会議の音声データ45MBの文字おこしに必要な費用は、0.5ドル程度でした。
GitHub ActionでDockerをビルドしてECRにPush

## はじめに
AWSのリソースに対する認証は、OpenID Connect (OIDC)を使用し、GitHub ActionsでDockerをビルドしてECRにPushした時のメモ。

### 前提
* ECRのリポジトリは作成済であること
* GitHubのルートリポジトリにDockerfileを登録してあること

### ざっくりした流れ
以下の順に作業を行った。
1. IAMからIDプロバイダを作成
2. IAMロールを作成する
3. IAMポリシーを作成してIAMロールにアタッチ
4. GitHub Actionsのワークフローを作成  


### IAMからIDプロバイダを作成
プロバイダのタイプで、OpenID Connectを選択し、
* プロバイダのURLには、 https://token.actions.githubusercontent.com を指定する
* 対象者には　sts.amazonaws.com　を指定する

作成したIDプロバイダのARNはメモしておく。

### IAMロールを作成する
カスタム信頼ポリシーにJsonを張り付ける。
作成したロールのARNはメモしておく。

```
{
    "Version": "2012-10-17",
    "Statement": 
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "<作成したIDプロバイダのARN>"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/*"
                }
            }
        }
    ]
}
```

### IAMポリシーを作成してIAMロールにアタッチ
IAMポリシーのアクセス許可をJsonで指定
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "<ECRのリポジトリのARN>"
        }
    ]
}
```
### GitHub Actionsのワークフローを作成
mainブランチへpushしたときに実行。

```name: Build and Push Docker Image to ECR
on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    permissions:
      id-token: write
      contents: read

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

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: <IAMロールのarn>
          aws-region: ap-northeast-1

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Build, tag, and push image to Amazon ECR
        env:
          ECR_REGISTRY: <AWSアカウント>.dkr.ecr.ap-northeast-1.amazonaws.com
          ECR_REPOSITORY: <ECRのリポジトリ名>
          IMAGE_TAG: latest
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
```
Wingetでストアアプリをダウンロード

## 気が付いたら、WingetでWindowsのストアアプリがダウンロードできるようになっていた件について。

マスター作成時に、いろいろストアアプリを入れておきたかったことがあったのですが、
その時点では、どうしてもダウンロードできなかったのですが・・・・。

https://jpwinsup.github.io/blog/2024/06/10/UserInterfaceAndApps/winget-store-download/

6月ぐらいにこの記事が上がってたようで、かつWingetでダウンロードできるようになったと。
ずっと、Wingetバージョンアップしたら、できるのままだったのですが、可能になったようです。
まだ、プレビュー版ですが、テストを実施

で、その記事を参考にそのまま、「Snipping Tool」をダウンロードしてみたのですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396469/6b4f78e3-d3c7-9922-be13-671b1037f5fc.png)
ダウンロード中に停止、いつまでも変わらないので、Ctr+Cで中断
上記のリンクを使ってブラウザ上でダウンロードし、すでにダウンロードした物に混ぜ込んだあと、再度同じコマンドで実行したら、うまくいきました。



インストールに関しては、下記記事を参考にし、

https://jpwinsup.github.io/blog/2020/10/19/UserInterfaceAndApps/MicrosoftStore/DownloadOfflinePackage/


Add-AppxProvisionedPackage -Online -PackagePath "C:\temp\9MZ95KL8MR0L\Microsoft.ScreenSketch_2022.2405.32.0_neutral_~_8wekyb3d8bbwe.msixbundle"  -SkipLicens -DependencyPackagePath @( `
"C:\temp\9MZ95KL8MR0L\Dependencies\Microsoft.UI.Xaml.2.8_8.2310.30001.0_x64__8wekyb3d8bbwe.appx",`
"C:\temp\9MZ95KL8MR0L\Dependencies\Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__8wekyb3d8bbwe.appx",`
"C:\temp\9MZ95KL8MR0L\Dependencies\Microsoft.WindowsAppRuntime.1.5_5001.178.1908.0_x64__8wekyb3d8bbwe.msix"`
)

で、動作しました。
自由と責任のバランスを実現する:Netflixのカルチャーメモが示す新たな指針を見てみよう。

こんにちは、KDDIアジャイル開発センターのVPoE 岡澤です。
今回は、Netflixが最近更新したカルチャーメモについてお話ししたいと思います。このメモは、Netflixの企業文化を理解する上でとても重要なドキュメントであり、私たちのアジャイル組織にも多くのヒントを与えてくれます。

2009年に公開されたNetflixのカルチャーメモは、企業文化の新しい基準を作り、多くの企業に大きな影響を与えました。このメモでは、従業員に自由と責任を与えることで、創造性と生産性を最大限に引き出すことを目指しています。その結果、Netflixは優れた人材を集め、維持し、革新的な企業文化を築き上げました。他の企業もこのカルチャーメモから学び、独自の企業文化を作る際の参考にしています。

## 学ぶべきポイント

最新(2024.6)のバージョンアップポイントを簡単にまとめ、カルチャーメモから学べる点と各組織に活かせるポイントを紹介します。

詳細を確認したい方はこちらからどうぞ。
https://jobs.netflix.com/culture?lang=English

### バージョンアップポイントのまとめ

Netflixのカルチャーメモは、以下の点でバージョンアップされています：

- **意思決定の促進**: 社員が自らの判断で行動できるよう、意思決定を積極的に促す文化を強化。
- **情報のオープンな共有**: 情報を広く、オープンかつ丁寧に共有することで、透明性を高める。
- **率直なコミュニケーション**: 直接的で率直なコミュニケーションを奨励。
- **優れた人材の確保**: 常に優秀な人材でチームを構成し続ける。
- **ルールの最小化**: ルールを極力作らないことで、柔軟な対応を可能にする。
- **インクルージョンとダイバーシティ**: 多様性を尊重し、包括的な環境を作ることを重視。
- **持続可能な成長**: 短期的な成果だけでなく、長期的な成長を目指す。
- **従業員のウェルビーイング**: 従業員の健康と幸福を重視し、バランスの取れた働き方を推奨。

### 主要な変更点とその意義

#### 1. プロセスよりも人
「プロセスよりも人」は、従業員が独立して行動する自由を維持しつつ、責任感を強調しています。これは、Netflixが引き続き従業員に大きな自由を与えつつも、効果的なプロセスとそうでないプロセスを区別することを求めていることを示しています。また、この理念は、プロセスよりも人を優先し、ずば抜けて責任感を持った人材(Unusually Responsible Person)が重要であることを示しています。

#### 2. コアプリンシプルの強調
新しいカルチャーメモでは、「ドギドキするほど面白い （Uncomfortably Exciting）」や「素晴らしく、常により良く（Great and Always Better）」といったコアプリンシプルが強調されています。これらは、Netflixが革新を追求し続ける姿勢を示しており、常に改善を目指す文化を反映しています。

#### 3. 多様性と包摂性の強化
今回の更新では、多様性（Diversity）と包摂性（Inclusion）の重要性がさらに強調されています。Netflixは、異なる背景や視点を持つ従業員が集まることで、より豊かなアイデアと創造性が生まれると考えています。これにより、全ての従業員が自分らしく働ける環境を提供しようとしています。

### カルチャーメモからの学び

#### 1. 自由と責任のバランス
Netflixの「プロセスよりも人」というアプローチは、従業員に自由を与えることで、創造性とイノベーションを促進しつつ、ずば抜けて責任感のある人(Unusually Responsible Person)、つまり自発的で自己認識力や自己管理能力が高い人材である必要があります。アジャイルを推進するチームにおいても非常に重要な要素になります。

#### 2. オープンなコミュニケーション
オープンなコミュニケーションは組織の健全性を保つために不可欠です。私たちも、定期的なフィードバックとオープンな対話を通じて、チームのパフォーマンスを向上させることができますね。
このベースには、チームメンバー、顧客、パートナー企業に対して尊敬や謙虚から始まることがとても大切です。

#### 3. 継続的な改善
「素晴らしく、常により良く（Great and Always Better）」については、私たちのアジャイル開発の根幹にある継続的な改善の精神や常に現状に満足せず、より良い方法を模索し続ける姿勢を持ち続けることが重要です。誰かが改善するのではなく、率先して改善し続けることのが大切ですね。

#### 4. 多様性と包摂性の強化
多様性と包摂性の強化は、私たちの組織にも適用できる重要なポイントです。異なる背景や視点を持つメンバーが集まることで、より豊かなアイデアと創造性が生まれ、イノベーションが促進されます。

### 各組織へ活かせるポイント

#### 1. 自律的な意思決定の促進
社員が自らの判断で行動できる環境を整えることで、迅速な意思決定と高いモチベーションを実現できます。これには、情報のオープンな共有と透明性が不可欠です。今回は、実現にあたり個人のずば抜けた責任感が必要と強調していますね。

#### 2. インクルージョンとダイバーシティの推進
多様性を尊重し、包括的な環境を作ることで、組織全体のイノベーションを促進します。これにより、より多様な視点を取り入れた意思決定が可能となります。こういった点もマインドフォロー含めて組織として加速していくようにしていきたいですね。

#### 3. 持続可能な成長とウェルビーイングの重視
短期的な成果だけでなく、長期的な成長を目指し、従業員の健康と幸福を重視することで、持続可能なビジネスが実現できるので、視座のアップダウンと時間軸の行き来がとても重要ですね。

### 結論

Netflixの最新のカルチャーメモは、重要なことをギュっとまとめて記載しており、私たちにとっても多くの学びを提供してくれます。自由と責任のバランス、オープンなコミュニケーション、継続的な改善、そして多様性と包摂性の強化の重要性を再確認し、常に進化し続ける企業文化を築いていきましょう。

詳細を確認したい方はこちらからどうぞ。
https://jobs.netflix.com/culture?lang=English
サブネットのIPv4 を CIDR 表記で決める

# はじめに
サブネットのIPアドレスってどうやって決めるんだ？
各サブネットのIPアドレス：251個ってなんだ？
ってなったので、調べたことをまとめておきます

初心者ですので、誤り等ございましたら教えていただけますと幸いです！

ここら辺の学習に入る前に、一度動画を見て全容を把握しました
わかりやすかったのでこちらの動画おすすめです！

https://youtu.be/7J_crzU5KP8?si=2-NWu3PKtRSF6UAZ

# VPCとは
「Virtual Private Cloud」の略で
AWSを使用するために仮想ネットワークを構築するサービスです

# サブネットとは
VPCのIPアドレス範囲の中で、さらに小さな仮想ネットワークを作成するAWSのサービスです
VPCの箱のなかにそれぞれのサブネットの箱があるイメージです↓

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/aefa32a1-dac0-55e4-f4b8-1ed86a02dfc5.png">

::: note info
サブネットで指定できるIPアドレスの範囲 🌱
・ VPCで定めたIPアドレスの範囲内でしかサブネットのIPアドレスは指定できません！
・ サブネットが複数ある場合は、範囲を重複してIPアドレスを指定できません！
:::

# 今回作成したい条件

- VPCのCIDR：192.168.0.0/16
- 各サブネットのIPアドレス：251個
- ルートテーブル：2つ（パブリック／プライベート）

# VPC作成
AWSにてVPCの作成を行います

![スクリーンショット 2024-09-10 10.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/4acc2447-9103-ddab-70c6-9ca96613bfaf.png)



次に条件である、各サブネットについてIPv4 CIDRブロックにIPアドレスが251個になる方法をメモします

# サブネット作成
先に結論を言ってしまうと、サブネットを作成する時に、CIDRの入力フォームの右側に出てくる数字が使用できるIPアドレスの個数です（厳密には出てくる数字−５です）

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/689ccf8c-92de-78d6-a2f1-b61c73881965.png">

256Ips - 5 なので、 251個で問題ないですね
作成すると詳細に利用可能なIPv4アドレス 251 と出ました！

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/d9ac66e9-5c09-6601-2731-d9d251b24f81.png">


# なぜ"５"を引くのか

使うことができない5個のIPアドレスがあるからです
今回サブネットに使用した 192.168.1.0/24 では以下の5つのIPアドレスは使用することができません↓

- 192.168.0.0：ネットワークアドレス
- 192.168.0.1：AWS予約（VPC ルータ用）
- 192.168.0.2：AWS予約（DNS用）
- 192.168.0.3：AWS予約（将来予備）
- 192.168.0.4：ブロードキャストアドレス

こちらの記事を参考にしました

https://na7log.com/aws-subnet-ipaddress-remain/

# なぜ "/24" なのか
IPアドレスは本来、32bitの2進数で表現されます
8bit.8bit.8bit.8bit↓
`例1:11111111.11111111.11111111.11111111`

これを人間に読みやすくするため32bitを4つに分け、
10進数の数字の塊で表現しています
例1を10進数に書き換えると以下になります↓
`例2:255.255.255.255`

IPアドレスはネットワーク部とホスト部で構成されます
今回251個確保したいのは、ホスト部の部分です

- ネットワーク部：「どのネットワークですよ～」な情報（が書いてある部分）
- ホスト部：「どのコンピュータですよ～」な情報（が書いてある部分）

/24は、前から24bitまでがネットワークアドレス部となる
そうすると必然的に8bitがホスト部となる

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/a0ed3dd1-1048-34ba-4612-a3774f0de31e.jpeg">

こちらの記事を参考にしました

https://wa3.i-3-i.info/word17257.html

# 被らないよう2種類作る

①192.168.0.0/24
②192.168.32.0/24

正直ここの数字はなんでもいいので、
①192.168.0.0/24
②192.168.1.0/24

とか連番でもいいのですが、
後々サブネットを増やすことを考慮し、
12・36間隔で作成することが現場では多いとのことです

こちらの記事を参考にしました

https://zenn.dev/sudoukky/articles/071bba2729aa65

# おわりに
理解するとそんなに難しくないんだけど、
最初はちんぷんかんぷんでした😤

この記事も参考にしました
ありがとうございました！

https://zenn.dev/aosan/scraps/39ded0dc5b6a59
試験勉強苦手なので面白おかしくまとめてみる 基本情報1

## 導入
試験勉強でまじめに参考書なんかと向き合う事が苦手な人。
結構いると思いますが皆さん如何でしょうか？
僕は**超苦手**です！
という訳で出来ないことをやり続けるのはあほくさいと思ったので、
自分なりに分かりやすくまとめていこうと思います。
同じ悩みで困っている人がいたらその人にも伝わると良いなと思います。

## 浮動小数点

**え？ここから？**
と思った人。申し訳ないですがここからです。
自分は参考書を読んでいてこのあたりで、文章が多くてきつかったです。
なのでまずは浮動小数点を自分なりにまとめてみたいと思います。

### 前提
そもそも浮動小数点とは実数（小数点のついた数字）を扱うために使用される形式です

## 単精度浮動小数点
ではよく使われている単精度といわれる表現のされ方を確認してみます。

全体で32bit使用して数値を表現しますが、内訳はこちら↓
|符号部|指数部|仮数部|
|---|---|---|
|1bit|8bit|23bit|

要するに左から1桁、8桁、23桁で用途が違うという事ですね。
~~なんて分かりずらいんだ~~

ではどのような用途か確認してみましょう

**符号部**　
- 0と1で正の数が負の数を指定できます。マイナスの場合は1を設定します。

**指数部**
- 後で補足をしますがこの数字を使うことで、小数点の位置を調整します。
- 使いたい値に＋127するらしい。

**仮数部**
- 実際に表示したい数値の素が入っている。
- 実は-1された値が入っているので、使用するときは1足さないといけない（暗黙の１と呼ばれたりするらしい）
- これをいろいろして最終的に表示する数値になります。

## 実際に数値にするにはどうするの？
ﾊｲ、問題はここですよね。
色々あるのはわかったけどどうすれば良いの？

結論から言うと
（2の指数部乗）× （仮数部＋１） 
上記に符号部のマイナスかプラスを付ける事になります。

**what???** ってなりましたか？僕はなりました。
文字だとやっぱりわかりづらいですね。

なのでここは2進数から10進数では無く、10進数から2進数にするイメージで確認してみましょう。

## 10進数から2進数にすることでイメージできる浮動小数点

では仮に10.075という値を浮動小数点にするとします。

①まず2進数にしてみます。
1010.11になります（あってる？）

②使用したい数値を1.xxxxの形にします。
これは暗黙の1とか言われていて統一することで、いろいろメリットがあるらしい。

という訳で形を変えたものがこちら↓
1.01011　×　2^3

**なんとなくパーツで別れてきました°˖✧◝(⁰▿⁰)◜✧˖°**

ではここから各部に当てはめていきましょう

**符号部**：一番簡単、正の数なのでここは０でいいですね。

**指数部**
1. ここには、何乗することで仮数部を元の数に戻せるか？という値が入ります。
1. よってまずは、2 ^ 3から3を取り出します。
1. その後お約束として、3に127を足します（バイアスというらしいですね）
1. 結果130になったので2進数に直して代入します。

**仮数部**：ここも簡単1.01011から「1.」この部分を外して入れるだけ

後は足りない桁をゼロで補うと、

|符号部|指数部|仮数部|
|---|---|---|
|0|10000010|01011000000000000000000|

という様になります！！
なんとなく10進数から2進数に直した方が、普段使っている数字が変わっていく様子が想像できて分かりやすいのではないでしょうか？
2進数から10進数に直したい時は逆の手順で進めて行けば良さそうですね。

## 余談
自分が分かりづらかった箇所をまとめてみましたが、皆さんは分かり易かったでしょうか？
（わかりづらい！という方は申し訳ないです。）

ご指摘やアドバイスがあれば対応したいと思います！
ではまた次の記事でお会いしましょう。(@^^)/~~~
【MariaDB（MySQL）】インストール直後にrootでログインしたい

## はじめに

MariaDB（MySQL）のインストール直後にrootでログインしようと以下を実行しましたが、認証されなかったため、ログイン方法を調べました。

```sql
$ mysql -u root -p
```

## 環境

- MariaDB 11.4

## 結論

OSのroot権限で単に`# mariadb`（MySQLの場合は`# mysql`）とすればログインできます。

## 解説

10.4と古いバージョンしか見つからず恐縮ですが、MariaDBの公式ドキュメントを見ていきます。

https://mariadb.com/kb/en/authentication-from-mariadb-10-4/

:::note info
以降の引用は全て本公式ドキュメントからであり、翻訳は機械翻訳を利用しました
:::

> First, it is configured to try to use the unix_socket authentication plugin. This allows the root@localhost user to login without a password via the local Unix socket file defined by the socket system variable, as long as the login is attempted from a process owned by the operating system root user account.


> まず、unix_socket 認証プラグインを使用するように構成されています。これにより、ログインがオペレーティング システムの root ユーザー アカウントによって所有されているプロセスから試行される限り、root@localhost ユーザーは socket システム変数によって定義されたローカル Unix ソケット ファイルを介してパスワードなしでログインできるようになります。

デフォルトでunix_socket認証となっているため、rootユーザーであればパスワードなしでMariaDB（MySQL）にログインできるようです。

## rootパスワードの設定方法

ログイン後、必要であればrootのパスワードを設定することも可能です。

> Second, if authentication fails with the unix_socket authentication plugin, then it is configured to try to use the mysql_native_password authentication plugin. However, an invalid password is initially set, so in order to authenticate this way, a password must be set with SET PASSWORD.

> 次に、unix_socket 認証プラグインで認証に失敗した場合、mysql_native_password 認証プラグインを使用するように設定されます。ただし、無効なパスワードが最初に設定されるため、この方法で認証するには、SET PASSWORD を使用してパスワードを設定する必要があります。

パスワードを設定するSQLの例です。

```sql
SET PASSWORD for root@localhost = PASSWORD('');
```

しかし、特に必要でなければrootのパスワードは設定しないことが推奨されているようです。

> However, just using the unix_socket authentication plugin may be fine for many users, and it is very secure. You may want to try going without password authentication to see how well it works for you. Remember, the best way to keep your password safe is not to have one!

> ただし、多くのユーザーにとっては、unix_socket 認証プラグインを使用するだけで十分であり、非常に安全です。パスワード認証なしで試してみて、それがどの程度機能するかを確認することもできます。パスワードを安全に保つ最善の方法は、パスワードを持たないことです。

## おわりに

rootの初期パスワードを確認する方法を調べると、`/var/log/mysqld.log`を確認する記事が多かったのですが、筆者の環境ではこのファイルは存在せず上手くいきませんでした。

結局`# mariadb`するだけなので解決策としては簡単なのですが、誰かの役に立てばと思い記録しておきます。
Embrace the Future with ChatOpenAI Japan: Your AI Resource Hub

In an era where technology is advancing at an unprecedented pace, artificial intelligence (AI) has emerged as a pivotal force driving innovation and transformation across various domains. At ChatOpenAI Japan, we are committed to providing you with comprehensive insights and updates on AI developments, helping you stay informed and ahead of the curve.

The AI Revolution: Transforming Industries
At ChatOpenAI Japan, we explore how AI is revolutionizing industries and enhancing our daily lives. From streamlining business operations to improving healthcare outcomes, AI's impact is far-reaching and profound. Our platform offers detailed articles, expert opinions, and the latest news on AI trends, ensuring you have access to valuable information and resources.

Key Features of ChatOpenAI Japan
Cutting-Edge AI Applications: Discover how AI is being utilized in various sectors to drive efficiency and innovation.
Expert Analysis: Read insights from leading AI researchers and industry experts.
Community Interaction: Engage with a vibrant community of AI enthusiasts and professionals.
ChatGPT 日本語: Enhancing Communication
One of the highlights of our platform is [ChatGPT 日本語](https://chatopenai.jp/), a sophisticated AI language model that facilitates seamless communication in Japanese. Whether you're learning Japanese or need accurate translation services, ChatGPT 日本語 offers exceptional precision and ease of use, making language barriers a thing of the past.

Stay Informed with the Latest AI Trends
AI technology is continually evolving, with new innovations and applications emerging frequently. At ChatOpenAI Japan, we are dedicated to keeping you updated on the latest developments. Our blog covers a diverse range of topics, including AI ethics, practical applications, and future trends, ensuring you have a well-rounded understanding of the AI landscape.

Join the AI Movement
As AI continues to shape the future, it is essential to stay engaged and informed. At ChatOpenAI Japan, we invite you to join our community and explore the limitless possibilities of AI. Whether you're a tech enthusiast, a professional, or simply curious about AI, our platform provides the resources you need to navigate the AI-driven world.

Visit ChatOpenAI Japan today and embark on a journey of discovery and innovation. Learn how AI is transforming industries, improving lives, and paving the way for a smarter future. Together, we can harness the power of AI to create a better, more efficient world.
RDS Blue/Green DeploymentsでMySQL 5.7->8 へアップグレードした話

## 背景

Webサービスを運用していくにあたり、RDBのアップグレードに迫られる場合があります。ありますよね？

弊社のあるプロダクトのバックエンドについても Aurora MySQL 2.11.1(MySQL 5.7系) で稼働しておりましたが、Aurora MySQL v2系は 2024/10/31 を以って標準サポートが終了します。

Aurora MySQL v3 で現時点で利用可能な最新LTSバージョンは 3.04.2 (MySQL 8.0.28) になるため、MySQL 5.7 から MySQL8へのアップグレードが必要になってしまいました。

今回はそんなDBアップグレードを「RDS Blue/Green Deployments」でやってみた、という記事になります。

## RDS Blue/Green Deploymentsって？

以下はAWSの公式Docです

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/blue-green-deployments-overview.html

ざっくりと言うと、現行DB環境（Blue）に対し、論理レプリケーションされたステージング環境(Green)を作成してくれるものです。
Green環境はBlue環境と異なるバージョンのインスタンスで作成することができるため、今回はGreen環境をAurora MySQL 3.04.2 (MySQL 8.0.28) で作成しています。

## どうやったか

今回行ったアップグレード手順をざっくりと記載していきます。

### 現行DBのバイナリログを出力する

Blue/Green構成を作成するにあたり、Blue環境のバイナリログ (binlog_format) をオンにする必要があります。
BlueのDBクラスターパラメータの`binlog_format`を`ROW`にしてDBを再起動します。

### Blue/Green環境の作成

AWS マネージメントコンソールから、該当のAurora クラスターを選択し、 Blue Green Deployment を作成します。
作成時にGreen環境のバージョンを指定できるため、今回は「Aurora MySQL 3.04.2 (compatible with MySQL 8.0.28) 」を選択しました。
Blue/Green構成の作成には弊社環境で60分程度かかります。作成中もBlue環境は特段停止しないためサービスを止めずに作成可能です。


### Green環境でテスト

Green環境が作成されたら、テストを行います。


検証環境をGreen環境のエンドポイントに向け、各種テストを行います。
ここでは主にmysq5.7->8にアップグレードすることによりアプリケーションの振る舞いに影響がないかどうかを確認しました。

### Blue/Greenの切り替え

テストが完了したら、Blue/Greenの切り替えを行います。

1~2分程度DBが停止したのち、BlueとGreenが切り替わります。

### Blue/Green構成の削除

その後しばらく運用してみて動作に問題がなさそうであれば、Blue/Green環境を削除します。
Blue/Green環境を削除すると、旧Blue環境が個別のDBクラスタとして残るため、こちらも任意のタイミングで削除します。


## やってみての所感

上記手順で特に不具合もなくアップデートを完了することができました。
以下の点が特に嬉しかったです。

- レプリケーションを簡単に構築てきる
- Green環境上で思う存分テストできる
- 1~2分程度の停止時間で新DBへの切り替えが完了する（これがすごく嬉しい！）

## 最後に

弊社CBcloudではバックエンドエンジニアを募集しています！！
Railsでのアプリケーション構築がメインになりますが、本記事のようにAWSをはじめとしたクラウドインフラに触れる機会も多くあり、スキルアップを狙える環境だと思います。ご興味があれば以下からエントリーください！

https://recruit.cb-cloud.com
SAPサービス(HEC/RISE等)のよくある役割分担表資料の格納場所

## 順を辿っていくならば
### How to find the Roles & Responsibilities (R&R) document

下記のリンクで動画が用意されています。
How to find the Roles & Responsibilities (R&R) document
で検索かけてみて下さい。

https://sway.cloud.microsoft/9UuBdnelwBKWimBH?ref=Link


## 直リンクはこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/e7964fdc-1f69-f5cc-ec26-aa814c9c10d8.png)

言語やプロダクトポリシーからでソートを掛けて検索してみて下さい。


https://www.sap.com/about/agreements/policies/hec-services.html?sort=latest_desc
【WordPress 6.6】WordPressがa要素に追加するunderlineを無効化する

TL;DR
==

WordPressにa要素へunderline追加するのをやめさせるには、theme.jsonに以下の記述を追加します。

```json
{
	"styles": {
		"elements":{
			"link":{
				"typography": {
					"textDecoration":"none"
				}
			}
		}
	}
}
```