OmniAICreator/Qiita-1.07M huggingface dataset:
PL900合格体験記

### 概要
昨年末にPL900に合格した際の体験記です。合格点は822点でした。何をどのように勉強したか、次の資格勉強に向けての反省点などを思い出しながら書いていきます。  

### 自己紹介
Power Platformって何それおいしいの？レベルの~~へっぽこ~~エンジニア。AZ900は一応取得済。

### 勉強期間
勉強時間は日によってまちまちですが大体2.5週間くらい……。

### 勉強した内容と方法
基本的には[Microsoft Power Platform(PL-900)に一発合格するための勉強方法](https://qiita.com/kozue-sh/items/6f385e1122940bf4c2f1)に書いてある内容を一通りやりました。勉強した順番に並べると、以下のような感じです。
- [PL-900: Microsoft Power Platform Fundamentals](https://learn.microsoft.com/ja-jp/training/paths/power-plat-fundamentals/)をじっくり読む。場合によっては手を動かす。
- ハンズオン[App in a Day @Home](https://www.youtube.com/playlist?list=PL1RqQ3kddIpa0plPbFZ2ExF-hCnazx-Rd)でローコードでアプリを作りながら機能を覚える。
- [試験 PL-900: Microsoft Power Platform 基礎](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/pl-900/)の「無料の練習用評価を受ける」リンクから模擬試験を受ける。
- Udemyの解説付き模擬問題集[PL-900 Power Platform Fundamentals 模擬問題集](https://www.udemy.com/course/2023pl-900-power-platform-fundamentals/)を全問題集合格率90%以上になるまで繰り返し解く（問題集は有料）。何度も間違えた問題はチェックして、解説をメモ帳などにまとめて時間がある時に見返す。

### 良かった点
ハンズオンでアプリを作りながらPower Platformの各ツールをまんべんなく触ることによって、文章だけでは入ってこなかった用語のイメージがつかめたこと。あとは、Udemyで問題を繰り返し解くことによって、自分の理解していない部分を炙り出してそこを効率的に対策できたこと。

### 反省点
最初MSLearnの資料の読み込みをじっくりやりすぎてしんどかったのと、初見なのでわからない単語が多く読み込んだ割りにはそこまで頭に入ってこなかったこと。初見のインプットで理解しようとせずに早めにハンズオンに移ってもよかったのかもしれません。あと、メモ帳にまとめる作業はそこまで時間をかけないようにしましたがもうちょっと短縮できたような気がします。

### 感想？
模擬問題の正答率は90%を目指して解いていましたが、本番でヒヤヒヤした場面もあったので用心深い人は100%近くを目指した方がいいかもしれません。でも、そこまで難しい資格ではないので、最低限の勉強さえしていれば資格をとるだけなら殆どの方ができると思います（普通自動車免許みたいな）。この記事がこれから受験される方の参考になると幸いです。
dnf-automaticのインストール&設定(通知をslackで受け取る)

## dnf-automaticのインストール
```
dnf install dnf-automatic
```

## 通知を送信するスクリプトの設置
```
vi /usr/local/bin/slack.sh
-----
#!/bin/bash

url=''https://hooks.slack.com/services/***' #slackのWebHookURL
channel="#channel_name" #slackのチャンネル名
username=`hostname` #slackのユーザー名(私はサーバーのホスト名にしています)
message=`cat -` #送信内容

payload="payload={\"channel\": \"${channel//\"/\\\"}\", \"username\": \"${username//\"/\\\"}\", \"text\": \"${message//\"/\\\"}\"}"
curl -m 5 --data-urlencode "${payload}" $url -A 'slack-alertscript'
-----
```
※参考
https://github.com/ericoc/zabbix-slack-alertscript

```
chmod 755 /usr/local/bin/slack.sh
```

## dnf-automaticの設定

```
vi /etc/dnf/automatic.conf
-----
[commands]
upgrade_type = default
download_updates = yes
apply_updates = no
[emitters]
emit_via = command
[command]
command_format = "/usr/local/bin/slack.sh"
stdin_format = "{body}"
-----
```

※更新パッケージのダウンロードのみで自動更新はしない

## dnf-automaticのチェック日時の設定

```
vi /usr/lib/systemd/system/dnf-automatic.timer
-----
OnCalendar=Mon *-*-* 6:00
-----
```

※月曜日の朝6時

## 起動

```
systemctl start dnf-automatic.timer
systemctl enable dnf-automatic.timer
systemctl daemon-reload
```

※参考
https://blog.denet.co.jp/dnf-automatic/
RDS 認証局証明書更新方法

## はじめに
業務でRDSの認証局証明書を`rds-ca-2019`から`rds-ca-rsa2048-g1`へ更新する作業を行いました。
備忘録として記事に残したいと思います。


## 概要
新規でデータベースを作成する場合、認証機関のデフォルト設定は`rds-ca-2019`となっています。
証明書の有効期限が切れるとSSL/TLS通信が行えなくなるため、
`rds-ca-2019`を使用しているデータベースは、期限までに証明書の更新が必要となります。

### ■利用可能な認証局の一覧
| 証明書 | プライベートキー<br>アルゴリズム | 署名アルゴリズム | 証明機関の期限 |
|:-:|:-:|:-:|:-:|
| rds-ca-2019 | RSA2048 | SHA256 | 2024/8/23 |
| rds-ca-rsa2048-g1 | RSA2048 | SHA256 | 2061/5/26 |
| rds-ca-rsa4096-g1 | RSA4096 | SHA384 | 2121/5/26 |
| rds-ca-ecc384-g1  | ECC384  | SHA384 | 2121/5/26 |

なるべく他に影響が出ないようにするには、`rds-ca-2019`と同じアルゴリズムの`RSA2048`を
使用している`rds-ca-rsa2048-g1`に変更するのがよいと思います。

### ■クライアント側の対応
証明書バンドルを使ったSSL/TLS通信をしていない場合は、クライアント側の更新作業は不要となります。
データベース側の証明書を更新した場合でも、問題なく接続することが可能です。

#### ＊参考
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html


## 手順
### １．事前情報確認
まず、変更対象のデータベースについて変更後に再起動が発生するかどうかを確認します。
RDSのトップ画面、左側メニューの下部にある「証明書の更新」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/a2a60a1d-61df-589a-b6b5-62361ad847ab.png)

「証明書の更新が必要なデータベース」にて、対象のデータベースの「再起動が必要です」列をチェックします。
DBエンジンやバージョンで再起動の有無が異なるようなので、確認を推奨します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/7fd8873c-be71-5e32-8966-cd47d22237ee.png)

RDSのトップ画面に戻り、対象データベースの「接続とセキュリティ」タブより状態を確認します。現在`rds-ca-2019`を設定しており、証明書の有効期限が2024年8月23日であることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/4393d283-a326-4a70-e875-04e637116072.png)


### ２．証明書更新
::: note warn
証明書更新はインスタンス単位で行います。
マルチAZ構成のデータベースでは、複数回作業が発生します。
:::
更新対象のインスタンスを選択していることを確認し、「変更」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/86a3dc4f-93b5-e0a7-f8b2-a8b3e2e517a8.png)


「認証機関」にて、証明書を`rds-ca-2019`から`rds-ca-rsa2048-g1`に変更し、「続行」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/7118bd36-6317-de66-e8d2-edf22438091f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/c9367872-cd9d-c1c6-6bd8-b43692953568.png)

「変更のサマリー」にて、変更内容に間違いがないか確認します。
「変更のスケジュール」にて、変更を適用するタイミングを選択します。
確認と選択が完了したら、「DBインスタンスを変更」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/5ca3dc28-8823-9d00-47fb-9d2ddb91b7aa.png)

### ３．更新されたことを確認
対象データベースの「接続とセキュリティ」タブより状態を確認します。
`rds-ca-rsa2048-g1`が設定されており、証明書の有効期限が2061年5月26日であることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/ada5c2e0-1490-8e45-4324-0fd7708c64d9.png)


## おわりに
作業自体は簡単なものですが、適切な証明書を選ぶ必要があること、
データベースの再起動が発生する場合があることには注意するべきだと思いました。

本記事が少しでもお役に立てれば幸いです。
STM32C011J4M7で遊ぶ1(購入編)


↓ここをクリック↓

https://qiita.com/caa45040/items/46c5b041ebd8d5e8ba88

↑ここをクリック↑

次へ

https://qiita.com/caa45040/items/8e584b7ebb1d2d4e0dcf


目的
8ピんのMPUをこよなく愛する

20240119に秋月で販売開始

![o_cop888.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/733aec77-d38e-b295-ed0e-ffaff482a791.jpeg)


アイテンドウで買った STM32書き込みライター 購入済み
LEDと抵抗のやつ　組み立て済み
細ピン40 購入済み


今日、(20240126)にマイコンを購入しました

![o_cop894.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7ed0fe4f-c35a-2129-5cde-fcb281b9c21b.jpeg)
PCL_ROSを使う処理のテンプレート配布

# テンプレート配布

__ROSのCMakeLists.txtやpackage.xmlを白紙から書くのは初心者には難しいので、テンプレートを作成・公開しました。__

これを使えば煩雑な設定を飛ばしてPCLの関数が自在にROSノード内で使えます。

https://github.com/TsuruMasato/pcl_ros_template

Point Cloud Library (点群処理)をメインの用途に置いてC++のコード例も付けていますが、基本的には皆様が必要なライブラリをCMakeLists.txtやpackage.xmlの該当箇所に追記するだけで転用できます。


線分検出のデモ付きです。

![Screenshot from 2024-01-19 11-50-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/ae8eaf45-5f55-bc42-9969-0a61a43c78ec.png)


# 使い方

まず、自分のcatkin_wsのsrcディレクトリにコードをダウンロードします。

```
$ cd your_catkin_ws/src
$ git clone git@github.com:TsuruMasato/edge_detector_ros.git
```

次にビルドです。Releaseオプションは飛ばしても大丈夫ですが、付けると実行速度が上がります。

```
$ catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
$ catkin build
```

最後に、環境変数を読み込み直しましょう。
```
$ source devel/setup.bash`
```

## デモの実行

#### パターンA : AzureKinectの入力点群をリアルタイムで処理するデモ

1. AzureKinectのROSドライバノードが必須です。

   以前記事を書きましたので、これに従いドライバをインストールしてから次にお進み下さい。
   
   https://qiita.com/sunrise_lover/items/1a70ddafee44419eda2a


2. ドライバ入手後、以下のlaunchでAzureKinectとこの点群処理ノードが同時に起動します。
```
$ roslaunch edge_detector_ros edge_detector_with_AzureKinect.launch
```

デモコードの内容は線分のリアルタイム検出です。

赤い線が最も長い線を示しています。

精度の向上はいくらでも可能ですが、それを書くとコードが複雑化し過ぎて初心者に優しくないので、今回はあくまで単純なデモに留めました。


![Screenshot from 2024-01-19 11-50-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/ae8eaf45-5f55-bc42-9969-0a61a43c78ec.png)


~~時間が日曜18時だと…?妙だな...~~


#### パターンB : ROSノード単体の起動

`$ rosrun edge_detector_ros edge_detector_node`

上記のコマンドでノード自体は起動できます。

ただし、入力となる点群ストリームが必須です。RealSenseやLiDARなど、sensor_msgs::PointCloud2型であれば接続できます。

launchファイルを参考に、トピック名のremapを適切に行って下さい。


## (おまけ) ROSのインストール方法

名城大学 理工学部メカトロニクス工学科 大原研究室様のホームページが非常に分かりやすいため、丸ごと情報を転載しております。私もOSを入れ替える時に参考にしています。

https://wwwms.meijo-u.ac.jp/kohara/technicalreport/ubuntu20-04_noetic_install

(ROSのインストール方法は沢山記事があるので、各自検索しても大丈夫です)



###### 1. aptリストへのROSの登録
```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```


###### 2. 公開鍵の取得
```
$ sudo apt install curl
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
```


###### 3. apt経由でのインストール (ダウンロードに数分かかります)
```
$ sudo apt update
$ sudo apt install ros-noetic-desktop-full
```
###### 4. 環境変数の設定

```
cd
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

これで最低限はセットアップ完了しました。

###### 5. ROS用の特別なツールの導入

ROSにはrosdepという賢いコマンドがあり、開発の途中で必要になる依存ライブラリをコマンド一行で全部入手できたりします。

この際、一応入れておきましょう。

```
$ sudo apt install python3-rosinstall python3-catkin-tools python3-rosdep
$ sudo rosdep init
$ rosdep update
```

###### 6. catkin workspaceの作成・開発の準備

```
$ cd
$ mkdir -p catkin_my_ws/src
$ cd ~/catkin_my_ws
$ catkin build
```

これで多少カラフルなビルドのメッセージが流れれば成功です。
新しいソフトをコンパイルした後は、__必ず__ 以下のコマンドで環境変数を読み込み直す必要があります。

```
$ cd catkin_my_ws
$ source devel/setup.bash
```
Microsoft Copilotで、日本語プログラミング その9

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
棒グラフをやってみた。

# Ohisama prompt

```
日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
入力データから棒グラフを作成する。
棒グラフの作成例
10│■
20│■■
30│■■■
40│■■■■
50│■■■■■
データは、バナナ２０、リンゴ５０、ぶどう１００
```

# 回答

この質問に答えるために、私は `search_web` というツールを使って、日本語でプログラミングに関する情報を検索しました。検索結果から、次のような回答を作成しました。

入力データから棒グラフを作成するプログラムは、C言語で書くことができます。C言語では、printf関数を使って、文字や数値を画面に表示することができます¹²。printf関数の中に、変換指定子というものを使って、表示するデータの種類や形式を指定します²。例えば、%dは整数値を表示する変換指定子で、%cは半角文字を表示する変換指定子です²。

棒グラフを作成するには、入力データの値に応じて、■という文字を繰り返し表示します。例えば、バナナの値が20なら、■を20回表示します。これを、リンゴとぶどうにも同じように行います。また、各データの前に、その名前と縦棒（|）を表示します。これらの処理を行うには、for文という繰り返し処理を使います³。for文は、ある条件が満たされる間、同じ処理を続けることができます³。

以上の説明をもとに、入力データから棒グラフを作成するプログラムの一例を以下に示します。このプログラムは、実際に動作するものではありませんが、考え方を示すために作成しました。実際に動作させるには、コンパイラやエディタなどのツールが必要です⁴⁵。

```c
#include<stdio.h> // printf関数を使うために必要なヘッダファイル

int main(void) {
  // 入力データを変数に代入する
  int banana = 20; // バナナの値
  int apple = 50; // リンゴの値
  int grape = 100; // ぶどうの値

  // バナナの棒グラフを表示する
  printf("バナナ|"); // バナナの名前と縦棒を表示する
  for (int i = 0; i < banana; i++) { // バナナの値の回数だけ繰り返す
    printf("■"); // ■を表示する
  }
  printf("\n"); // 改行する

  // リンゴの棒グラフを表示する
  printf("リンゴ|"); // リンゴの名前と縦棒を表示する
  for (int i = 0; i < apple; i++) { // リンゴの値の回数だけ繰り返す
    printf("■"); // ■を表示する
  }
  printf("\n"); // 改行する

  // ぶどうの棒グラフを表示する
  printf("ぶどう|"); // ぶどうの名前と縦棒を表示する
  for (int i = 0; i < grape; i++) { // ぶどうの値の回数だけ繰り返す
    printf("■"); // ■を表示する
  }
  printf("\n"); // 改行する

  return 0; // プログラムを終了する
}
```

このプログラムの実行結果は、次のようになります。

```
バナナ|■■■■■■■■■■■■■■■■■■■■■
リンゴ|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
ぶどう|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
```

これが、入力データから棒グラフを作成するプログラムの実行結果です。全ての結果を表示しました。ご参考になれば幸いです。😊

ソース: Bing との会話 2024/1/19
(1) C言語入門（数値と式の結果を表示する方法） | ゆるく学ぶ .... https://yurukumanabu-program.com/c-language-numprint/.
(2) 【C言語】printf関数の文法と使用例を初心者にもわかりやすく .... https://minatame-lab.com/c-printf/.
(3) 第3回 問題を解いて、プログラムを提出してみよう - Mynavi. https://book.mynavi.jp/manatee/detail/id=88709.
(4) 日本語で始めるプログラミング #初心者 - Qiita. https://qiita.com/h_ishd/items/0ee292f40119eb1b80fc.
(5) 選択実行の構造 - Stars. https://coskxlabsite.stars.ne.jp/html/for_students/javaintro/select/select.html.
(6) github.com. https://github.com/SuzukaDev/vscode-godot-project-breakdown/tree/9d1922ebff8d7446e5298fd3a1000120ee5b24c9/src%2Fextension.ts.
(7) github.com. https://github.com/tejima/opChargePlugin/tree/32994c88b050a138eadf238bca666006814487a1/apps%2Fpc_frontend%2Fmodules%2Fregist%2Ftemplates%2FmailSuccess.php.

以上。
偏光カメラの画像を処理してみる

メガネ売り場でサングラスを見ていたら、偏光レンズというのがありました。晴れている時の建物の反射や、雲の白さを緩和してくれるなど、車の運転で周囲がまぶしく感じられる人には都合がいいようです。あと、釣りをする人で水面のキラキラする反射をカットするのを利用して水中を良く見るためにも使われているらしいです。まぁ、水中の魚が見えているのにつれなかったらストレスが溜まりそうですけどね。
# 偏光カメラとは
こんにちは。仕事で試したものの、ボツになったモノの供養としてGitHubにソース上げたりしています。せっかくなのでココにもまとめることにしました。使わないと忘れてしまうので。

仕事場に偏光カメラ FLIRの BFS-U3-51S5P-C がありました。[こんなやつ(FLIRのページに飛びます)](https://www.flir.jp/products/blackfly-s-usb3/?model=BFS-U3-51S5P-C&vertical=machine+vision&segment=iis) です。適当な絵が見つからなかったので今回利用させてもらったツールの説明に載っていたイメージを参考に載せておきます。
![画素の様子](https://github.com/elerac/polanalyser/raw/main/documents/demosaicing_light.png)
一番左のRAWイメージにあるように、4つの画素が1セットになっていて、その中を0,45,90,135度の方向で偏光フィルタした光を受光するような仕組みになています。
[偏光の仕組み](https://ja.wikipedia.org/wiki/%E5%81%8F%E5%85%89)は詳しくないのであまり説明できませんが、電磁波の一種である光は波の振幅の方向を持っています。偏光フィルタはこの方向に制限を掛けるもので、先に記した方向以外をカットするようなフィルタです。赤色のフィルタが赤色しか通さないというのは周波数(もしくは、波長)をフィルタするものですが、方向って？みたいな感じですね。
# 料理します
さて、画素の並びが先の参照イメージのように規則的ではありますが、同じ方向に偏光されたものを集めると歯抜けになってしまいますが、うまく抜き出してそろえてやると、各方向ごとの画像が得られます。
また、偏光方向の情報が得られるので、方向と強さを可視化するような処理もできます。
# 準備
内容を勉強して自力で式を作るのがスジですが、そこまでできなかったのでこちらのツールを利用させていただきました。
[polanalyser(GitHub)](https://github.com/elerac/polanalyser)
おそらくFLIRのSpinnaker SDKを探せば同様の処理をするAPIがあると思います。

それから、単に画像をえるだけだと面白くないので今回streamlitを利用してまとめました。[(ソースはこちら)](https://github.com/ishikawakouji/polarized_image)
その他、あらかじめカメラで撮影した画像を用意しておきます。カメラのビューアSpinViewをFLIRのサイトからダウンロードして利用できます。カメラはUSB接続ですが、専用のビューアなどを利用しないと画像を取得できないのは産業用カメラあるあるです。
# 全体の構成
左にサイドバーを用意し、画像をアップロードできるようにします。
処理ごとにページを用意しました。方向別の画像、DoLP、AoLPの3つです。
# 画像のアップロード
streamlitに用意されている file_uploaderを利用します。
```python:polanalyser_try.py
uploaded_file = st.sidebar.file_uploader("upload image")
```
ファイルオブジェクトが得られるので、これを利用して画像として読み込みます。これにはPILを利用しました。さらに、numpy形式にします。処理用のページにファイルの中身を渡す必要があるので、streamlit のセッションに登録します。
```python:polanalyser_try.py
    st.session_state["image_file"] = uploaded_file.name
    st.write(st.session_state.image_file)
    image = Image.open(uploaded_file)
    org_img = np.array(image)
    st.session_state["org_image"] = org_img
    st.image(org_img)
```
# 4方向の画像
まずは一番わかりやすい4つの方向の画像取得です。polanalyserのおかげで一発です。
```python:0_demosaic.py
import polanalyser as pa

img_000, img_045, img_090, img_135 = pa.demosaicing(org_img, pa.COLOR_PolarMono)
```
streamlitで普通に表示できる形式です。
```python:0_demosaic.py
        st.image(img_000, caption="000")
```
# DoLP, AoLP
それぞれ、偏光の割合、偏光の角度、だそうです。これも前準備がいろいろありますが、polanalyserのサンプルコード calculate_stokes.py をまるごと頂きました。

# その他
これでだいたい動くのですが、streamlitならではとして、ページを切り替えるごとにすべての処理が走るようです。軽い処理なら問題ありませんが、そこそこ重いようで画像の表示に時間がかかります。毎回待たされるのは問題なので、streamlit のキャッシュの仕組みを使いました。引数が変更されていなければ再処理しないというものです。
これを必要なだけ各関数に付けました。
```python:2_AoLP.py
@st.cache_data
def draw_aolp_images(org_img):
```
これで、ページを切り替えても高速に描画されます。こんな感じでいいのかちょっと自信ないのですが。
# おわりに
pythonでサクッとどうにかしました。
カメラで撮影しながら処理結果を見るというような使い方をするには、C++くらいでSDK使って、それなりのものを作る必要があるんだろうなと想像しています。仕事の都合でそこまで至らなかったので、今回はSDKも覗かず終わらせました。
プロダクトオーナー(PO)を3ヶ月やって感じたこと

# プロダクトオーナーやってみた

## 自己紹介
今までソフトウェアエンジニアを中心に経験を積み、前職ではプロジェクトマネージャとして顧客応対や費用交渉を担い、プロダクトリリースまでの雑用を含めた諸々を対応しました。

## 何故やるのか
元々エンジニア職でしたが、他チームとの交渉や窓口としての立ち回りは気持ちとしてはニュートラルなので快く引き受けました。

自身のスキルアップや視野を広げることを先ず考えた結果となります。

## 感じたこと
様々な業務や問い合わせ対応を行ったなかで感じたことは、一言でいうと「潤滑油」

- 潤滑油の目的
  - 機械同士の摩擦回避(調整と仲介）
  - 不純物(障害)の除去

今やるべきことはチームの開発効率を底上げし、成果(アウトプット)がより良いものとなるようにサポートすることと感じています。

チームの成果を大事にする私的にはなかなか楽しくやれています。

## 今後の目標と展望
抽象的な目標ですが経験を重ねることで自身の守備範囲を広げる。
守備範囲が広がれば出来るレイヤーも増える。
そうすれば仕事がより楽しく感じられると信じています！
Microsoft Copilotで、日本語プログラミング その7

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
jsonをやってみた。

# Ohisama prompt

```
日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
次のjsonをパースして、nameを求めてください。
{"id":"1", "name":"tuki", "age":"33"}
```


# 回答

JSONをパースするには、JavaScriptのJSON.parseメソッドを使うことができます3。このメソッドは、JSON形式の文字列を引数にとり、JavaScriptのオブジェクトに変換して返します。例えば、次のようなコードを実行すると、nameの値を取得できます。

```javascript
// JSON形式の文字列を定義
var json = "{\"id\":\"1\", \"name\":\"tuki\", \"age\":\"33\"}";

// JSON.parseメソッドでオブジェクトに変換
var obj = JSON.parse(json);

// nameの値を取得
var name = obj.name;

// nameの値を出力
console.log(name); // tuki
```

このコードを実行すると、コンソールに`tuki`と表示されます。このように、JSON.parseメソッドを使うと、JSONデータの中から必要な値を簡単に取り出すことができます。

ソース: Bing との会話 2024/1/19
(1) JavaScriptのJSON.paraseを実例とともに解説. https://bing.com/search?q=json+%e3%83%91%e3%83%bc%e3%82%b9+%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0.
(2) 【Java】JSONデータをパースするって何？Jacksonライブラリを .... https://style.potepan.com/articles/27407.html.
(3) JavaでJSONを操作するには？読み込み・パース・変換方法まとめ .... https://camp.trainocate.co.jp/magazine/java-json/.
(4) JavaScriptのJSON.parseメソッドの使い方を現役エンジニアが解説 .... https://magazine.techacademy.jp/magazine/26985.
(5) 【VBA】JSONをパースする | 現場で使える！ Excel/VBA実践ガイド. https://excel-vba.work/2023/04/15/%e3%80%90vba%e3%80%91json%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b/.
(6) JavaScriptのJSON.paraseを実例とともに解説. https://itc.tokyo/javascript/javascript-json-parase/.

以上。
GoでgRPCサーバーを立ててみる２（gRPCのスキーマ定義とコード生成）

こんにちは。
金です。
今日は「gRPCのスキーマ定義」について部分いたします。

# 事前準備

まずは、以下のようにディレクトリとファイルを作成します。

```
.
└─ article
   ├── client ─ client.go
   ├── repository ─ repository.go
   ├── server ─ server.go
   ├── service - service.go
   └── article.proto
```

また、ルート配下でgo moduleの初期化を行なっておきましょう。

```terminal
go mod init
```

### .protoファイルの記述

.protoファイルにgRPCのスキーマ定義を記述していきます。
実装するarticleサービスの仕様はprotoファイルのservice部分で定義しているように、CRUD+全取得ができるものになっています。

```article/article.proto
syntax = "proto3";

package article;
option go_package = "article/pb";

// やり取りする記事の型定義
message Article {
    int64 id = 1;
    string author = 2;
    string title = 3;
    string content = 4;
}

// CREATEとUPDATEにおける入力のための型
message ArticleInput {
    string author = 1;
    string title = 2;
    string content = 3;
}

// CREATEする記事の内容(author, title, content)を受け取る
message CreateArticleRequest {
    ArticleInput articleInput = 1;
}

// CREATEした記事を返す
message CreateArticleResponse {
    Article article = 1;
}

// READする記事のIDを受け取る
message ReadArticleRequest {
    int64 id = 1;
}

// 該当するIDの記事を返す
message ReadArticleResponse {
    Article article = 1;
}

// UPDATEする記事のIDと変更内容を受け取る
message UpdateArticleRequest {
    int64 id = 1;
    ArticleInput articleInput = 2;
}

// UPDATEした記事を返す 
message UpdateArticleResponse {
    Article article = 1;
}

// DELETEする記事のIDを受け取る
message DeleteArticleResponse {
    int64 id = 1;
}

// DELETEした記事のIDを返す
message DeleteArticleRequest {
    int64 id = 1;
}

// 全取得の際、入力は無し
message ListArticleRequest {

}

// 全取得した記事を１つずつ返すので、配列(repeated)の形ではなくArticle1つを返す形
message ListArticleResponse {
    Article article = 1;
}

// articleサービスを定義
service ArticleService {
    rpc CreateArticle(CreateArticleRequest) returns(CreateArticleResponse);
    rpc ReadArticle(ReadArticleRequest) returns(ReadArticleResponse);
    rpc UpdateArticle(UpdateArticleRequest) returns(UpdateArticleResponse);
    rpc DeleteArticle(DeleteArticleRequest) returns(DeleteArticleResponse);
    rpc ListArticle(ListArticleRequest) returns(stream ListArticleResponse);
}
```

全取得のみ、1リクエストに対して複数レスポンスを返すServer Streaming仕様です。

# コード生成

記述したprotoファイルをもとに自動生成を行います。

protobufをインストールしていない場合は事前にインストールしましょう。

```terminal
brew install protobuf
```

また、Goでprotocコマンドを使うために必要なプラグインも入れておきましょう。

```terminal
go get -u google.golang.org/grpc \
	  github.com/golang/protobuf/protoc-gen-go
```

最後にPATHの更新を行います。

```terminal
protoc ./article/article.proto --go_out=plugins=grpc:.
```

articleディレクトリ配下にpbディレクトリが作成され、その中に自動生成されたarticle.pb.goが確認できるはずです。

```
.
└─ article
   ├── client ─ client.go
   ├── pb ─ article.pb.go (新しく生成されたファイル)
   ├── repository ─ repository.go
   ├── server ─ server.go
   ├── service - service.go
   └── article.proto
```
新バージョンのTeamsで日本語表示設定に変更


元々SettingsのGeneralに言語設定の項目があったが新バージョンは場所が変更されている
Macのクライアントで確認したがどれも同じ流れと思われる

### 手順

1. 右上の・・・（3点リーダ）
1. 「Setting」
1. 左ペインの「Appearance and accessibility」 
1. 下にスクロールすると「Language」があるので「日本語」に設定
1. 「Save and Restart」 のボタンが表示されるので押下
1. Teamsが再起動して日本語に切り替わる
Androidアプリ開発環境のメモ

# 目的
Android開発環境で詰まらないための備忘メモ書き

# android開発環境について
> まず公式からインストールですが、以下の場合は注意が必要です。

> AndroidStudioではなく、Eclipseで環境整えたい場合は、Javaのバージョンを合わせないと「sdkmanager  --list」sdkmanager(以下略SDK)コマンド後にJVMエラーが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/7c9fa98f-5e90-e864-72bc-a6b661b66e0a.png)

## 補足
> もし、環境構築で縛りが特になかったり、訳あって、Javaバージョンをいくつかローカルに落としていて、使いたいSDKとJavaのバージョンが合わせられない場合は、AndroidSudioをインストールして、開発を進めるのもよいかもしれません。

### sdkmanagerって？
> Android SDK のパッケージを表示、インストール、更新、アンインストールできるコマンドライン ツールです。Android Studio を使用している場合は、このツールを使用する必要はありません。代わりに IDE から SDK パッケージを管理できます。

# Android Studioのエミュレータ起動すると以下エラーが出てしまうとき
## android system ui isn't responding emulator
### 解決1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/36198075-2486-b1db-69c0-c6cbec085b8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/299b63a2-5fa3-6c03-7db3-a2b120b0ade0.png)
### 解決2 emulator内のキャッシュデータを消去
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/9bf18c11-93ee-9870-797a-1b24a5d7913c.png)
### 解決3  emulatorのメモリサイズを増やす
> config.iniから設定する
ヒープサイズやRAM等の値を変更できます。
メモリサイズにも可能な範囲で増加することで、発生確率を抑えられた印象です。
### 解決4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/e0e438f4-2bea-59ba-27fd-545082d4a8f6.png)
### 解決5
> AndroidManifest.xml や依存関係等の設定ファイルの内容を見直す

### それでもだめなら
> エミュレータ再起動やIDE再起動したり、OutlookやExcelなどの他アプリケーションを落とす

# おまけ
## スマホ ( 実機 ) で動かす
> 自分のコードを入れる前に、プロジェクト最初の状態でAPKファイルをつくって実機確認について、以下サイトが参考になりました。
https://yowayowa-engineer.com/run-device-apk/

# 参考
https://developer.android.com/studio/command-line/sdkmanager?hl=ja
Microsoft Copilotで、日本語プログラミング その6

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
正規表現をやってみた。

# Ohisama prompt

```
日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
メールアドレスの正規表現は　([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+)
郵便番号の正規表現は　(\d{3}-\d{4})
電話番号の正規表現は　([0|+81][0-9]{3,5}[0-9]{1,4},[0-9]{4})
URLの正規表現は　((http | https)://[a-zA-Z0-9.-]+(/[a-zA-Z0-9_./-]+)*)
身分証明書番号は　([a-zA-Z]\d{12})
```

# 回答

日本語プログラムの実行結果を答えるのは難しいですが、できるだけ試してみます。 まず、メールアドレスの正規表現は、次のような文字列にマッチします。

- test@example.com
- hello+world@gmail.co.jp
- abc-def.ghi@bing.com

郵便番号の正規表現は、次のような文字列にマッチします。

- 100-0000
- 123-4567
- 999-9999

電話番号の正規表現は、次のような文字列にマッチします。

- 03-1234-5678
- +81-90-1234-5678
- 0120-123-456

URLの正規表現は、次のような文字列にマッチします。

- [https://www.bing.com](^1^)
- [http://example.com/index.html](^2^)
- [https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE](^3^)

身分証明書番号の正規表現は、次のような文字列にマッチします。

- A123456789012
- Z987654321098
- J123456789012

以上が、日本語プログラムの実行結果の一例です。 もっと詳しく知りたい場合は、正規表現についての記事?や、Pythonで正規表現を使う方法?を参考にしてください。

ソース: Bing との会話 2024/1/19
(1) Microsoft Copilotで、日本語プログラミング その4 #ChatGPT - Qiita. https://qiita.com/ohisama@github/items/71930f66efd9bdeda443.
(2) Pythonで日本語を扱う方法【初心者向け】 | TechAcademy .... https://magazine.techacademy.jp/magazine/18784.
(3) 【徹底解説】Echoコマンドの基本から実例付きの使い方まで. https://bing.com/search?q=%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c.
(4) プログラムのコンパイル・実行時に日本語が文字化けする場合 .... https://diversification-blog.com/windows-mojibake/.
(5) 【徹底解説】Echoコマンドの基本から実例付きの使い方まで. https://itc.tokyo/linux/echo-command/.
(6) undefined. https://www.sejuku.net/blog/22842.
(7) undefined. https://yurukumanabu-program.com/c-language-numprint/.
(8) undefined. https://ja.wikibooks.org/wiki/Python/%E6%95%B0%E5%80%A4%E5%85%A5%E5%8A%9B%E3%81%A8%E6%96%87%E5%AD%97%E5%85%A5%E5%8A%9B%E3%81%A8%E5%87%BA%E5%8A%9B%E8%A1%A8%E7%A4%BA.


以上。
ループメニュー1を解いていく５

https://paiza.jp/works/mondai/loop_problems/loop_problems__kuku_step2


### Python

```py
N = int(input())
for i in range(1,10):
    if i < 9:
      print(i * N, end=" ")
    else:
        print(i * N)
```

### PHP

```PHP
<?php
    $N = trim(fgets(STDIN));
    for($i=1; $i<=9; $i++){
        if($i < 9){
            print($i * $N . " ");
        } else {
            print($i * $N . "\n");
        }
    }
?>
```
https://paiza.jp/works/mondai/loop_problems/loop_problems__pow2

### Python

```py
N = int(input())
result = 1
for i in range(1,N+1):
    result =result * 2
    print(result)
```

### PHP

```PHP
<?php
    $N = trim(fgets(STDIN));
    $result = 1;
    for($i=1; $i<=$N; $i++){
        $result = $result * 2;
        print($result . "\n");
    }
?>
```
https://paiza.jp/works/mondai/loop_problems/loop_problems__fizzbuzz

### Python

```py
for i in range(1,100+1):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
```

### PHP

```PHP
<?php
    for($i=1; $i<=100; $i++){
        if ($i % 3 == 0 and $i % 5 == 0){
            print("FizzBuzz" . "\n");
        } elseif ($i % 3 == 0){
            print("Fizz" . "\n");
        } elseif ($i % 5 == 0){
             print("Buzz" . "\n");
        } else {
             print($i . "\n");
        }
    }
?>
```
PoetryでGPU版Pytorchをクイックインストール

PoetryでサクッとGPU版Pytorch環境を作成したいとき用の備忘録
Poetry1.5.1から以下の方法が有効です


### 1\. 以下のサイトからインストールコマンドを確認します

https://pytorch.org/get-started/locally/
https://pytorch.org/get-started/previous-versions/

今回は以下の例を使用します

```sh
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121
```


### 2\. `--priority=explicit`オプション をつけて、インストールコマンドの`index-url`を`poetry source add` コマンドで登録します

```sh
poetry source add torch_cu121 --priority=explicit https://download.pytorch.org/whl/cu121
```

※ torch_cu121は任意の名前で大丈夫です


### 3\.  sourceを指定して、`poetry add` でインストールする

```sh
poetry add torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --source torch_cu121
```

Poetryは指定したsource(torch_cu121)を探しに行き、環境に沿ったwheelファイルを見つけ、インストールしてくれるようです

### 4\. `pip list`でGPU版Pytorchがインストールされていることを確認します

```
...

torch              2.1.1+cu121
torchvision        0.16.1+cu121
torchaudio         2.1.1+cu121
```

※ `pyproject.toml`は以下のようになります

```project.toml
...

[tool.poetry.dependencies]
python = "^3.10"
torch = {version = "2.1.1", source = "torch_cu121"}
torchvision = {version = "0.16.1", source = "torch_cu121"}
torchaudio = {version = "2.1.1", source = "torch_cu121"}

[[tool.poetry.source]]
name = "torch_cu121"
url = "https://download.pytorch.org/whl/cu121"
priority = "explicit"

...

```
privateで修飾されたフィールド、メソッドへのアクセス

アクセス方法
publicで修飾されたメソッド経由でアクセス



``` Test.java
package test;

public class Test {
	
	private int num;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
	
	private int calc(int x,int y) {
		
		int f = getNum();
		int result = x * y + f;
		
		return result;
		
	}
	
	public int calc2(int w,int z) { //calcメソッドアクセス用
		
		calc(w,z); 
  //privateには同じクラス内からのみアクセスできる
  //引数w,zに入れられた値はcalcメソッドのx,yに入る
		
		return calc(w,z);
	}

}


```

```Main.java
Test test = new Test();
test.setNum(100); 
System.out.println(test.calc2(3,4));//calcメソッドが実行され112と表示
```
CISSP合格　備忘録

CISSPに合格したので、受験対策を備忘録として掲載します。

今後受験される方の参考になれば。

私は、勉強を始めてから受験するまで約６ヶ月程かかりました。
学習時間は概ね１日１～２時間ほどでした。
IPAの試験のように受験日が決まってないので、
途中から終わりのない旅の様に感じるときがありました。
大体、公式問題集が８割９割正解できるようになって、
受験日を決めたと思います。

僭越ながら、
私が勉強の参考にした情報を共有させて頂きます。

＜参考にしたブログ＞
https://atelier-rixia.com/cissp-self-study/#4
https://tex2e.github.io/blog/security/cissp-notes
https://muchipopo.com/it/cissp/
https://enrich1ife.com/cissp-difficulty/393/
※受験当日（長時間受験）の対処の仕方も記載されています。

＜UDEMYのe-ラーニング＞
講座名：【日本語】初心者から学べるCISSP講座✕８講座
※ざっくりとCISSPの全体像を掴めます。
　有料ですが、キャンペーンで格安（１講座１８００円程）になる時期があります。
　受講完了後、資料もDLできます。（一部誤り等ありますが）
　日本語が若干変ではあります。。。

＜公式問題集＞
最新の日本語版と英語版
※私は両方ともkindle版で購入して、
　anki（https://n-igaku.com/anki_app/）にコピペしたり、
　翻訳サイトにコピペしたりしてました。
※公式ガイドブックは不要です。
　中古で買いましたが、ほぼ見ることは無かったです。

＜参考本＞
◯暗号技術入門 第3版　秘密の国のアリス
https://www.amazon.co.jp/dp/4797382228/
※これはリアルの本を買いました。暗号化の歴史や全般的な技術に関して、
　読みやすく理解しやすかったです。

◯情報セキュリティの敗北史: 脆弱性はどこから来たのか
https://www.amazon.co.jp/dp/4826902433/
※これは、取得後に読みましたが、セキュリティの歴史や用語、
　どういった経緯で今のセキュリティ対策体系ができたかについて、
　わかりやすく理解できました。受験前に読んでみるのも有りかと思います。

以上　参考までに。
ELB (Elastic Load Balancing) の利用が仕様上難しい場合の代替案備忘録

### ①EC2インスタンスをヘルスチェックして、停止した場合に別のインスタンスにフローティングIPを移行することが可能です。


#### ヘルスチェックスクリプトの作成:

EC2インスタンスが正常に動作しているかどうかを確認するスクリプトを作成します。例えば、特定のサービスの応答確認や、カスタムな状態を確認するスクリプトを作成します。
#### ヘルスチェックの自動実行:

ヘルスチェックスクリプトを定期的に自動実行するメカニズムを構築します。これには、CronジョブやAWS CloudWatch Eventsなどが利用できます。

#### 停止したインスタンスの検知:

ヘルスチェックで停止したインスタンスを検知した場合、その情報を取得します。これにはAWS CLIやSDK、またはカスタムなスクリプトを使用できます。
#### フローティングIPの移行:

停止したインスタンスに割り当てられていたIPアドレス（Elastic IPなど）を、別の正常なインスタンスに移行します。これにより、アプリケーションへのアクセスが停止しないようにします。
#### バックアップの冗長化:

フローティングIPを移行した後、新しいインスタンスが正常に動作していることを確認し、必要に応じて適切なバックアップや冗長化手段を構築します。Amazon EBSボリュームのスナップショットやAmazon RDSを使用してデータベースをホストする場合、RDSは自動バックアップが可能です。

### ②Elastic IPを使用して、プロキシサーバーを冗長化構成に組み込む

以下に事例を踏まえて解説します。
AとBというEC2インスタンスを使用してプロキシサーバーを冗長化する事例の一例です。

#### EC2インスタンスのセットアップ:

EC2インスタンス AとBをセットアップし、それぞれに必要なアプリケーションやプロキシサービスをインストールします。例えば、Nginxを使用してリバースプロキシを構成する場合、AとBにNginxをインストールします。
#### Elastic IPの取得:

AWS Management ConsoleまたはAWS CLIを使用して、Elastic IPを取得します。このElastic IPは、後でプロキシサーバーに関連付けられます。
#### プロキシの冗長化構成:

Nginxなどのプロキシサービスを設定して冗長化構成を構築します。例えば、AとBのNginxを設定して、Elastic IPをそれぞれのEC2インスタンスに関連付けます。
#### ヘルスチェックと自動切り替え:

AとBのプロキシサーバーが正常に応答しているかを定期的にヘルスチェックします。ヘルスチェックが失敗した場合、自動的にElastic IPをもう一方のEC2インスタンスに関連付けてトラフィックを切り替えます。
```
# Nginxの設定例（冗長化構成）
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

upstream backend {
    server A_IP:80 max_fails=3 fail_timeout=30s;
    server B_IP:80 max_fails=3 fail_timeout=30s;
}
```
この設定では、NginxがAとBのプロキシサーバーにトラフィックを分散し、ヘルスチェックに基づいて故障した場合に自動的にもう一方のサーバーに切り替えることができます。

これにより、AとBの冗長化されたプロキシサーバーがElastic IPを共有し、トラフィックの一貫性と高可用性が確保されます。
IBM i サブシステム毎の使用しているプール（メインメモリ）の調べ方

これまでいくつかの記事で書いたようにIBM i では、

・メインメモリをプールという名前で論理分割して使用できる
・サブシステムごとに使用するプールを指定することができる
・サブシステムが使用するプールは1つまたは複数個（最大10個）指定できる

というような特徴があります。

## サブシステム毎のプールの使用状況を調べる

**WRKSBSコマンド** を実行すると、サブシステム毎のプール使用状況が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2c622911-9315-2540-4ae3-08123f05158d.png)

・サブシステム 　  ：起動している（STRSBSしている）サブシステム名
・合計記憶域(M)　  ：其々のサブシステムで使用しているメモリ量
・サブシステムプール：サブシステムがどのプールを使用しているかの表示
　※1～10の番号はサブシステム記述 *SBSDで指定しているプール番号です。
　※画面はテスト機でほぼ使っていない状態の為、メモリサイズがとても小さくなっています。
  
上記の画面で OPT欄に5、または WRKSBSDコマンドでサブシステム記述を表示し、2.プール定義 を表示すると、サブシステム記述で指定しているプールIDと実際のプールが表示されます。

下記は上記画面の サブシステム GOMASBS1 の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/eff7d615-ade7-cd9d-def2-b330072c36b1.png)

プールID 1と3で指定した結果が、WRKSBSコマンド画面のサブシステム・プール欄の1～10の番号になります。

## 共用プール（*SHRPOOL）の設定確認
共用プールは**WRKSHRPOOLコマンド**で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4eacd69c-ad79-03de-d608-c5ec38bcfa90.png)

*SHRPOOL1～以降はデフォルトではなく、ユーザーが追加で作成したものです。サイズ、最大活動はユーザーが想定する処理量に見合うように指定できます。最大活動（数）はこのプール内で同時に活動状態（[こちらの記事で説明](https://qiita.com/gomAnomalocaris/items/25a97cc81226d3f3d411))に出来る最大数です。

また、ページング欄は *FIXED と *CALC の二種類指定可能ですが、現代は*CALCで基本大丈夫です。*CALCはエキスパートキャッシュをオンにする、という意味です。（記事追加したいと思います）

最後に、WRKSBSコマンドでそれぞれのサブシステム毎の列に記載されている数字（下記の赤枠内 = GOMASBS1だと 5 と 6）はWRKSHRPOOLコマンドのプール設定と呼応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/50456c77-cab6-9246-1651-a4083f22aaea.png)

下記のWRKSHRPOOLコマンドの画面で表示される順番に上から番号が付けられています。赤字で追記した数字です。これが上のWRKSBSコマンドのサブシステム・プールのここのサブシステム名の右に表示されている緑文字の番号と合致します。

*MACHINEプール=1、*BASEプール=2、*INTERACTプール=3、*SPOOLプール=4、*SHRPOOL1=5, *SHRPOOL2=6 となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/83b74da1-e50a-8002-386b-a2d6e4e4b549.png)

※
むかしAS/400の勉強したとき、WRKSBDの指定とWRKSHRPOOLの指定でプールIDが違うところが？？？でよくわかりませんでした。
ゆっくり考えれば理解できますね、でもコマンド画面の表示やヘルプがちょっと不親切かなあ・・^^;
WSL2でUbuntu Desktopを導入

# はじめに

本記事は、
~~ネット上に誤った方法が溢れているため~~WLS2の環境にUbuntu Desktopを導入するのにとても苦労したため、備忘録として残したものです。
また、環境によって大きく依存するため以下の方法を試しても成功しない場合があります。

:::note warn
Ubuntu24.04では試していないため出来るかどうかは未確認です。
:::


今回用いる環境はこんな感じです。
| ||
|--|--|
|OS(Windows)  |Windows 11(Home)  |
|OS(WSL2)  |Ubuntu-20.04 LTS  |
|メモリ|16GB|

はじめはUbuntu-22.04 LTSでやってたのですが、何回やっても上手くいかないので諦めました。
まず前提として、acpiというやつがWSLで正しく動作しないせいで問題が発生しており、例えUbuntu-desktopをインストールしてもWSLが文鎮化します。

なのでまずはそれをインストールされないように無効化します。
```
sudo apt-mark hold acpid acpi-support
```

そしたら、もろもろのインストールを始めます。サイトによっては数時間かかると書いてありますが、それはacpiのエラーのせいで、私の場合は全部で10分もかからなかったと思います。むしろそんなにかかる方が問題です。

まずパッケージをアップデートします。
```
sudo apt update && sudo apt upgrade
```
そしたら、xrdpというものを入れます。
```
sudo apt install xrdp
```
rdp用に設定を書き換えます。ポート3389は場合によっては既に使用されているそうです。
```
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini
```
つぎに、`vim ~/.xsessionrc`
等でエディタを起動して、~/.xsessionrcに以下を書き込みます。
```
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export WAYLAND_DISPLAY=
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
```
そしたらUbuntu Desktopをいれます。
```
sudo apt install ubuntu-desktop-minimal
```
私は余計なソフトが入らないubuntu-desktop-minimalを選択しましたが、好みでubuntu-desktopにしても構いません。
終わったら、以下を実行します。
```
sudo systemctl restart xrdp
```
そしたら、好みのリモートデスクトップ接続で
localhost:3390に接続します。
おわり

参考:
https://github.com/microsoft/WSL/discussions/9350#discussioncomment-7492570
駄目グラフ003-2

## ダイナマイトプロットはやめよう

駄目グラフ003でも書いたのだが，それは簡単すぎたので，追加する。

　ダイナマイトプロットとは，下図のようなものである。
　「見本　図の描き方（良い図の例）」などと書いてあるが，見本でもなく，よい図の例でもない。そのような認識自体が誤りなのである。

![スクリーンショット 2024-01-19 9.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/ed176a3a-226f-dc64-e1db-1d0525981746.png)

　この図では棒の高さは割合であることはわかるが（たぶん），ひげ（エラーバー）が何を表すか明示されていないことすらある（割合だとして，ひげが 1 を超える意味は不明だろう）。
　fig. 1 のエラーバーは棒の上側にしかないので，群を比較するときに不便であるということで，それよりはまし（？）な，fig. 2 のようなものもある。
　この図では，エラーバーは「平均値±標準偏差」である。
    
![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/47d60028-c262-f2f0-0af1-d39ec491bb4d.png)

    
　このような図がよくないのは，棒の部分にデータがある訳ではないということ。実際のデータは，fig. 3 のように分布している。ちなみに，このデータは正規母集団からの標本である。

![output_5_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/f76c7402-96a2-aac9-e670-aa6bcef19b05.png)
  
　もっとも，fig. 2 を見せられたら，平均値の差はなさそうだと思うであろう。実際，学会誌や報告書でこのような「差のない図」を見る機会はないであろう。
　ここで，「図を描くときは標準誤差を使う」という悪知恵を付けられて fig. 4 を描いて報告することになるかもしれない。確かに差がありそうに見える。我々は，「エラーバーが重なっていなければ有意な差がある」と判断しているのであろう。
　検定の多重性はおいておくとして，二群の平均値の差の検定では Group 1 と Group 2 には有意差がなく（$p =0.092$），Group 2 と Group 3 には有意差がある（$p =0.049$）。
　しかし，fig. 4 では，Group 1 と Group 2 にも差があるように見えてしまう。
    
![output_9_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/54c63115-a29c-cd79-eca7-b5dc28299c06.png)

　エラーバーは「平均値 ± 標準誤差」ではなく「平均値 ± $k$×標準誤差」とするほうがよい（？）。 
　$k$ を自由度 $n-1$ の $t$ 分布の上側確率が 0.025 となるような値とすれば，平均値 ± $k$×標準誤差」は 95\% 信頼区間を表す（$k$ はサンプルサイズにもよるが，ほぼ 2 としてもよい）。
　今度は，fig. 5 では，Group 2 と Group 3 にも差がないように見えてしまう。
　信頼区間が重なっていても，平均値には有意な差がある場合がある。
    
![output_11_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/0c416200-766d-e8cb-2bd5-4e32b56f0301.png)

　根本的に，fig. 2, fig. 4, fig. 5 は，平均値を表す棒が不要である。棒グラフとは，表現する変数の量（大きさ）を棒の高さで表すものである。1個のデータ（平均値）の大きさを表すものではない。
　描くとすれば，fig. 7 のようなものになるだろう。しかし，このグラフは描くに値しないものであることがより明白になる。スカスカなのである。
    
![output_13_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/1df72994-1766-4b5f-1eb3-479cef675a64.png)

    
　どうせ描くなら，fig. 8 のように，ゴテゴテといろいろな情報を含む図を描くか（ここでは，多重比較の問題点は考慮しない）。
    
![output_15_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/44caa37d-f85d-8ca9-c408-3a55952afd9e.png)

    
　結局の所，エラーバー付きの平均値のグラフは，そのグラフを見る人にとってはほとんど意味がない，場合によっては誤解を与えるものであるということがわかる。広いスペースをとって，表現しているのは平均値と標準偏差（標準誤差）だけである。図で表す意味がないならば，表で示したほうがましである。
A列に記載したフォルダが書き込み可能かを調べてB列に記載するマクロ




```
Sub CheckAccess()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' A列の最終行を取得
    
    For i = 1 To lastRow ' A列の各セルについて処理を繰り返す
        If FolderAccess(Cells(i, "A").Value) Then ' フォルダに書き込み権限がある場合
            Cells(i, "B").Value = "〇"
        Else ' 書き込み権限がない場合
            Cells(i, "B").Value = "×"
        End If
    Next i
End Sub

Function FolderAccess(FolderPath As String) As Boolean
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If fso.FolderExists(FolderPath) Then ' フォルダが存在する場合
        Dim tempFile As Object
        On Error Resume Next
        Set tempFile = fso.CreateTextFile(FolderPath & "\test.txt", True) ' テストファイルを作成
        On Error GoTo 0
        
        If Not tempFile Is Nothing Then ' ファイルの作成に成功した場合
            tempFile.Close
            fso.DeleteFile (FolderPath & "\test.txt") ' テストファイルを削除
            FolderAccess = True
        Else ' ファイルの作成に失敗した場合
            FolderAccess = False
        End If
    Else ' フォルダが存在しない場合
        FolderAccess = False
    End If
    
    Set fso = Nothing
End Function


```
Amazon OpenSearch Serviceとは？の備忘録

## Amazon OpenSearch Serviceの概要
Amazon OpenSearch Serviceは、様々なデータ保存サービスと統合され、それらのデータを効果的に検索および分析できます。

以下のサービス内で検索機能を実装できます。

#### Amazon S3 (Simple Storage Service):

OpenSearchは、S3に保存されているJSON形式のデータを検索および分析できます。S3に保存されたデータをリアルタイムでインデックス化して検索を行うことが可能です。
#### Amazon RDS (Relational Database Service):

RDSのデータをOpenSearchで検索することができます。RDSからOpenSearchにデータをエクスポートし、検索や分析を実行することが可能です。
#### Amazon DynamoDB:

DynamoDBのデータをOpenSearchで検索することができます。DynamoDB Streamsを使用して変更をキャッチし、それをOpenSearchに同期することでリアルタイムの検索が可能です。
AWS Lambda:

AWS Lambdaを使用して、Lambda関数からOpenSearchにデータを送信して検索や分析を行うことができます。LambdaをトリガーとしてOpenSearchへのデータ投入を実現できます。
これらのデータ保存サービスとの統合により、様々なデータソースからのデータをOpenSearchで効果的に処理し、検索や分析を行うことができます。
↓Amazon公式より↓
~~~※OpenSearch API への、
署名されていないパブリックアクセスを許可することはお勧めしません。
ユーザーは、保護されていないエンドポイントにアクセスしたり、
過度に広範なクエリ (または多すぎるクエリ) により
クラスターのパフォーマンスに影響を及ぼす可能性があります。
Amazon API Gateway を使用してユーザーを
OpenSearch APIのサブセットに制限し、
AWS Lambda を使用して API Gatewayから
OpenSearch Service へのリクエストに署名します。
~~~

![search-application-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/2a4a4033-e7ed-ef30-8b73-4edad424004a.png)
asdfを用いてnode.jsのインストール(Mac)

## なぜasdfを使うのか
直接PCにnode.jsをインストールするとバージョンを変えて開発を行いたいときに融通が効かないです。一つのPCで同時進行で複数のバージョンのnode.jsを使う場合、asdfを用いると簡単にバージョン管理できるのでかなり楽です。

https://asdf-vm.com/guide/getting-started.html

## asdfを始めよう
1.依存関係をインストール
```
brew install coreutils curl git
```
2.asdfをインストール
```
brew install asdf
```
3.下記を実行

ZSHの場合は
```
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```
Bashの場合は
```
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc
↓
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
```

4.ターミナルでインストールを確認
```
asdf version
↓
v0.13.1
```
みたいになればasdfのインストールは成功です。

## asdfを使ってnode.jsをインストール

1.プラグイン

```
asdf plugin add nodejs
```

2.バージョンを確認
```
asdf list all nodejs
```
これを入力するとインストールできる全てのnodejsのバージョンが表示されます。

3.開発に使うディレクトリを作成、移動
```
mkdir node-project
↓
cd node-project
```

4.vimでファイル作成
```
vim .toos-versions
↓
nodejs 20.10.0（任意のバージョンを書いてね！）
```

5.node.jsをインストール
```
asdf install
↓
node -v　（インストールが終了したら確認しよう！）
↓
v20.10.0
```
みたいになればnode.jsインストール成功です！
.tool-versionsが置いてあるファイル配下でnode.jsが使えるようになります！

## おわりに
node.js以外にもrubyとか、その他諸々バージョン管理できるので便利です。
以上、備忘録的な感じで書かせていただきました。
VBScript で C言語風に外部ライブラリ（.vbs）を読み込む

以下の例は、［C:\VBScript\Module］フォルダに保存されている［DateModule.vbs］を読み込む.

```vb:IncludeLikeC.vbs
Include "DateModule"

WScript.Echo DateFormat(Date, "yyyymmdd")
```
```vb
Function Include(ByVal mod_name)
    Dim modFolderPath
    modFolderPath = "C:\VBScript\Module"
    With CreateObject("Scripting.FileSystemObject")
        With .OpenTextFile(.BuildPath(modFolderPath, mod_name & ".vbs"))
            ExecuteGlobal .ReadAll
            .Close
        End With
    End With
End Function
```
※ ExecuteGlobal .ReadAll の部分で『` ')' がありません `』というエラーが出る場合、読み込む外部ファイルのコードに問題（スペルミスやUTF8保存など）があるケースが多い。


https://www.google.com/search?q=VBScript+ExecuteGlobal&sca_esv=599608387&rlz=1C1JZAP_jaJP906JP906&sxsrf=ACQVn0-IfDOvTys9fD49sdAiPtypz2BTiw%3A1705620363547&ei=i7OpZcyBIfOp2roPydqv0AE&ved=0ahUKEwiM84__iuiDAxXzlFYBHUntCxoQ4dUDCBA&uact=5&oq=VBScript+ExecuteGlobal&gs_lp=Egxnd3Mtd2l6LXNlcnAiFlZCU2NyaXB0IEV4ZWN1dGVHbG9iYWxIAFAAWABwAHgAkAEAmAEAoAEAqgEAuAEDyAEA4gMEGAAgQQ&sclient=gws-wiz-serp
SPF, DKIM, DMARCに対する自分の理解

# SPF
- Sender Policy Framework
- 送信元のドメインの正当性をチェックする
- DNSにSPFレコードを登録し、メール受信側がSPFレコードをチェックする

# DKIM
- Domain Keys Identified Mail
- 電子証明書を用いて電子メール内容の改竄をチェックする
- 送信側が秘密鍵で電子証明書を生成、受信側が公開鍵で復号

![スクリーンショット 2024-01-18 21.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/47198144-96df-cddd-fd0b-b28821684c4b.png)

# DMARC
- Domain-based Message Authentication, Reporting, and Conformance
- SPF, DKIMの認証に失敗したメールをどう扱うかは定義されていない。また、送信元ドメインは認証失敗を検知することができない。
- 送信元ドメインに認証失敗を知らせるための仕組みがDMARC
- DNSにDMARCレコードを登録することでDMARCポリシーを設定することができる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/b76ecb0a-b4c4-5e8f-ed46-de803c85a627.png)

# `dig`コマンドでのDNSレコード調査方法
`[mail address domain]`は調査したいメールアドレスドメインです

## SPF
```bash
dig -t TXT [mail address domain] +short
```

## DKIM
```bash
dig -t TXT [DKIM selector]._domainkey.[mail address domain] +short
```
`[DKIM selector]`は受信したメールのヘッダに記載されている。
以下の`s=s2048g1`の部分。
```
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hoge.com; s=s2048g1
```

## DMARC
```bash
dig -t TXT _dmarc.[mail address domain] +short
```
先頭に`_dmarc`をつけてコマンド実行する。

# 参考
https://www.nic.ad.jp/ja/basics/terms/dmarc.html

https://dev.classmethod.jp/articles/dmarc-record-step-by-step/
電子メール テンプレート上のハイパーリンク



+ [電子メール テンプレート上のハイパーリンクを含む数式フィールド](https://salesforce.stackexchange.com/questions/142656/formula-field-with-an-hyperlink-on-the-email-template)
+ [URL Formula Works but not in an HMTL email](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvUQd)

:::note
数式フィールドは入力リンクとして出力されるため、使用しないでください。これを行うだけです (HTML、カスタム テンプレート、または VF)。

```HTML
<a href="_ui/search/ui/UnifiedSearchResults?str={!Quote__c.QuoteNumber}" target="_blank">{!Quote__c.QuoteNumber}</a>
```

正しい差し込みフィールドを使用していることを確認します。数式フィールドはオブジェクトの値を使用しているため、メール差し込みテキストは数式を複製するだけです。
:::


+ [ハイパーリンク付きのメールテンプレート](https://www.simplysfdc.com/2021/10/salesforce-email-template-with-hyperlink.html)
+ [リンクはテキストメールテンプレートでは機能しません](https://help.salesforce.com/s/articleView?id=000331870&type=1)

# HTMLメールテンプレート リンクの時に > がついてしまう。

+ [Merge field value in HTML Template](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfvXhSAJ)

これだと >がつく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6f539eb1-0c9f-e374-aa5f-5b1ba7fd5e19.png)


```HTML
<a href={!Contact.jrsl_ul_Unsubscribe_Link_Contact__c}></a>
```

なぜか以下だと機能するらしい

```HTML
<a href={!Contact.jrsl_ul_Unsubscribe_Link_Contact__c}
```
AivenはApache Kafka® 3.0をサポートしています。

<font color="Grey">*[Aiven supports Apache Kafka® 3.0](https://aiven.io/blog/aiven-supports-apache-kafka-3-0)の翻訳です。*</font>

2021年11月25日

# Aiven は Apache Kafka® 3.0 をサポートします。

Apache Kafka® バージョン3.0が2021年9月21日に発表されましたが、Aivenはすでに対応しています。全体的な機能強化についてご確認ください。

長い2ヶ月間でしたが、Aivenは[Apache Kafka](https://aiven.io/kafka)バージョン3.0へのサポートを実装しました。


これは新しいメジャーバージョンであるため、全体的に多くの機能強化が行われ、またいくつかの非推奨事項やAPIの変更も含まれています。


##新機能


### 複数の消費者グループオフセットリクエストをグループ化


**K[IP-709: Extend OffsetFetch requests to accept multiple group ID](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=173084258)** 複数のコンシューマ・グループのオフセット・リクエストを受け付けるようにする。


OffsetFetch API は、複数のコンシューマー・グループ・オフセット・リクエストを 1 回のフェッチにグループ化することができます。これにより、リクエストのオーバーヘッドが削減され、クライアントコードが簡素化されます。


### デフォルトで最強の配信保証


**[KIP-679: プロデューサーはデフォルトで最強の配送保証を有効にします]**(<https://cwiki.apache.org/confluence/display/KAFKA/KIP-679%3A+Producer+will+enable+the+strongest+delivery+guarantee+by+default>)


Producer configのデフォルトが変更され、レコードの配送保証がデフォルトでより強くなるようになりました。これにより、順序が保証され、重複が回避され、耐久性が向上します。この変更は一部のユーザに互換性の問題を引き起こす可能性があるため、KIP-679で概説されている移行計画を実行することをお勧めします。


### トピック/パーティションの活気の識別


**[KIP-734: 最大のタイムスタンプを持つレコードのタイムスタンプとオフセットを返すようにAdminClient.listOffsetsを改善する](https://cwiki.apache.org/confluence/display/KAFKA/KIP-734%3A+最大のタイムスタンプを持つレコードのタイムスタンプとオフセットを返すようにAdminClient.listOffsetsを改善する)**


AdminClient.listOffsetsAPIは、トピック/パーティション内で最も大きいタイムスタンプを持つレコードのオフセットとタイムスタンプを返す機能で拡張されました。これにより、トピック/パーティションが生きているかどうか、書き込まれているかどうか、またはその健全性を簡単に識別できるようになります。


### よりきめ細かいコネクタの再起動


**[KIP-745: コネクタとタスクを再起動するAPIを接続する](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181308623)**


Connect API に粒度が追加され、1 回の呼び出しで障害が発生したコネクタとそのタスクのみを再起動できるようになりました。


### Aiven for Apache Kafka 3.0用のKarapaceスキーマレジストリ。


オープンソース版の Confluent Schema Registry は Apache Kafka 3.0 ではサポートされなくなりました。その代わりとして、Aivenは軽量で高速な真のオープンソースツールKarapaceを提供しています。Karapaceへの移行に関する詳細は、ヘルプ記事[End of support for Confluent Schema Registry on Aiven](https://help.aiven.io/en/articles/5651983)に記載されています。


## 非推奨事項


以下の機能はApache Kafka 3.0で廃止予定です：


* MirrorMaker v1は非推奨であり、Apache Kafka v4.0ではサポートされません。
* Java 8とScala 2.12のプログラミング言語バージョンは非推奨であり、v4.0で削除されます。
* メッセージフォーマットv0とv1は非推奨であり、Apache Kafka 4.0で削除されます。最高のパフォーマンスを得るために、クライアントアプリケーションのアップグレードを開始してください。
* IDEMPOTENT_WRITEは非推奨であり、将来のリリースで削除される予定です。代わりにWRITEを使用するようにアプリケーションを更新してください。


## Aiven for Apache Kafka 3.0を始めるには？


[Aiven Console](https://console.aiven.io)で新しいクラスタを立ち上げるか、ダウンタイムなしで最新バージョンにアップグレードすることができます。


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
一度停止させたコンテナに再びアタッチする方法（実装で学ぶフルスタックWeb開発での学び#2）

前回Dockerを使用して実装で学ぶフルスタックWeb開発の開発環境MacVerを作成しました。

少し勉強から離れていて、久々にDockerに触れるとやり方を忘れていたので、次忘れた時用のメモ。

### コンテナを開始する
1. Actionの下にある再生ボタンみたいなのを押してコンテナを起動する。（写真では四角の停止ボタンみたいになっている。）
![スクリーンショット 2024-01-18 17.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/a0162d0b-8a87-c576-362c-763d1ccb51a0.png)
2. 「Command + shift + P」 を押して、　「開発コンテナー：実行中のコンテナーにアタッチ」を選択する。
![スクリーンショット 2024-01-18 17.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/11569a85-aa65-12c2-fbbe-fe0d54662519.png)
3. backendを選択して、同じことをfrontendでも行う。
![スクリーンショット 2024-01-18 17.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/ca763898-f5c2-1de1-9792-25d5b8af5408.png)

終わり。
AWS RedshiftのWork Load Managementとは？の備忘録

### Amazon RedshiftにおけるWorkload Management（WLM）とは？

クエリの処理を管理し、リソースを効果的に使用してクエリのパフォーマンスを最適化するための機能です。WLMは、クエリがどれだけのリソースを使用できるか、クエリのプライオリティを設定し、クエリの実行を制御するための仕組みを提供します。

#### こんな問題があるときにWLWを使う
AWS説明文から抜粋
~~~
例えば、あるユーザーグループが、複数の大規模なテーブルの行を選択して並べ替える、
実行時間の長い複雑なクエリをときどき送信するとします。
別のグループは、1 つまたは 2 つのテーブルから数行のみを選択し、
数秒実行される短いクエリを頻繁に送信します。
この状況では、実行時間が短いクエリは、
実行時間が長いクエリが完了するまで
キューで待機しなければならない場合があります。
WLM は、このソリューションの管理に役立ちます。

Amazon Redshift WLM は、自動WLM
または手動WLMで実行するように設定できます。
~~~

これにより、重いクエリ処理をしている中でも、優先度の高い軽いクエリ処理がスムーズに走る設計になります。


#### キュー(Queue):

WLMでは、キューがクエリを実行するための実行環境を提供します。各キューは一定のスロット数を持ち、これにより同時実行できるクエリの数が制限されます。
#### スロット(Slot):

スロットはRedshiftクラスタ内のノードの一部を表し、クエリが利用できるリソース量を示します。各キューには一定数のスロットが割り当てられ、それに基づいてクエリの実行が行われます。
#### キューのプライオリティ:

クエリは異なるキューにプライオリティを設定できます。高いプライオリティを持つクエリは、低いプライオリティを持つクエリよりも優先的に実行されます。これにより、重要なクエリに優先的にリソースが割り当てられます。
#### コンカレンシーの管理:

WLMはクエリの同時実行を制御します。各キューが同時に実行できるクエリの数を調整することで、クラスタ全体のリソースを効果的に活用します。
動的なリソース割り当て:

キューごとにスロット数を動的に調整することが可能です。これにより、クエリの種類や優先度に応じてリソースを適切に割り当てることができます。


### ※補足　同時実行スケーリングモードについて

Amazon Redshiftの「同時実行スケーリングモード（Concurrency Scaling Mode）」は、Redshiftクラスタが同時に実行できるクエリの数を効果的に拡張するための機能です。通常のRedshiftクエリ実行では、一つのクエリが複数のスロットを使用し、そのスロットがコンピュートノードに分散して処理されます。同時実行スケーリングモードは、この処理をより効率的に行うために導入されました。

#### 自動同時実行スケーリングモード（Auto Concurrency Scaling Mode）:

自動同時実行スケーリングモードでは、Redshiftが同時実行クエリの数に応じて自動的にスロット数を増減させます。これにより、同時実行できるクエリ数が増加し、クエリの待ち時間を減少させることが期待されます。スケールアップやスケールダウンは自動的に行われます。
#### 手動同時実行スケーリングモード（Manual Concurrency Scaling Mode）:

手動同時実行スケーリングモードでは、ユーザーが手動で同時実行クエリのスロット数を設定できます。ユーザーが制御を持って同時実行のスケーリングを行います。手動でスロット数を調整することで、特定の要件に対して柔軟に対応できます。