OmniAICreator/Qiita-1.07M huggingface dataset:
EmEditorからVSCodeへの移行をざっくり

# 動機
マークダウンで書くときはVSCode、プレーンテキストはEmEditorといった具合にエディタを行き来するのが手間と感じ始めたため、徐々にVSCodeへ移行していく決断をしました。その際の設定を残せればなと。

## 日本語丸数字が等幅フォントにならない
たとえば、デフォルトでは「①」の文字が潰れて見えます。↓で回避できた。
```json
"editor.fontFamily": "'BIZ UDゴシック', Consolas, Myrica M"
```

- 参考ＵＲＬ
  - [日本語丸数字の見栄えが悪いので、等幅フォントを設定する](https://qiita.com/yut-nagase/items/319d548e7254d4919953)

## 日本語の単語の区切りを認識できない
「Ctrl + →」や「Ctrl + ←」といったショートカットやダブルクリックで単語選択したい時、直感的にカーソルが移動しません。
```json
"editor.wordSeparators": "`~!@#$%^&*()-=+[{]}\\\\|;:'\\\",.<>/?、。「」（）；：・？＜＞＋－＊／｛｝｜～＆％＄＃”！’　にをはがのとも"
```

単語選択という点ではEmEditorの方が優れていると感じています。
- 参考ＵＲＬ
  - [Visual Studio Code でいくつかの日本語の問題対応を行ってみる](https://www.off-soft.net/ja/software/develop2/japanese-problem-with-visual-studio-code.html)

## カーソル位置の単語をハイライトしないようにする
直感的でない文字にハイライトされるため精神衛生上、あまりよろしくないと思われ。解除解除
```json
"editor.occurrencesHighlight": false
```

## カーソルの点滅をチカチカしないようにする
```json
"editor.cursorBlinking": "solid"
```

## 文字サイズが小さい
これは人の好みに依るところが大きいですが、デフォでは少し小さい気がします。私はサイズを「18」にしてピッタリと感じました。
```json
"editor.fontSize": 18
```

## 空白文字を表示できるようにする
```json
"editor.renderWhitespace": "all"
```

## タブ文字
タブ文字を半角スペース4つ分で指定する。
```json
"editor.detectIndentation": false
"editor.tabSize": 4
```

## Ctrl + マウスホイールで文字サイズを変更できるようにする
```json
"editor.mouseWheelZoom": true
```

# できないこと・やり方が分からないこと
## 水平ルーラー
今、何文字目を入力しているのかを水平ルーラーで確認していましたが、デフォで表示する機能はないようです。垂直ルーラーを使えば、なんとなく分かりそうですが、もう少し詳しく知りたいところです。
```json
"editor.rulers": [100]
```
スクリプトから ScriptableObject を書き換える場合の注意点

ツールなどでScriptableObject を書き換える場合、
書き換え後に以下を実行します。

```
#if UNITY_EDITOR
    EditorUtility.SetDirty(scriptableObject); // scriptableObjectは書き換えたScriptableObject
    AssetDatabase.SaveAssets();
#endif
```

これで書き換えた内容がセーブされます。
プロキシ環境下Windowsにdenoをインストールする

## 元の手順(PowerShell)
こちらより

https://deno.land/manual@v1.21.0/getting_started/installation#download-and-install

PowerShellの場合
```
iwr https://deno.land/x/install/install.ps1 -useb | iex
```
このままだとプロキシを突破できないので元ファイルを書き換えて実行します。
(元ファイルは[こちら](https://deno.land/x/install/install.ps1))

## 実行手順

1. 以下のファイルを作成・編集(38行目付近)して保存
2. ファイルを右クリック
3. 「PowerShell で実行」を選択

```install.ps1
#!/usr/bin/env pwsh
# Copyright 2018 the Deno authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.

$ErrorActionPreference = 'Stop'

if ($v) {
  $Version = "v${v}"
}
if ($args.Length -eq 1) {
  $Version = $args.Get(0)
}

$DenoInstall = $env:DENO_INSTALL
$BinDir = if ($DenoInstall) {
  "$DenoInstall\bin"
} else {
  "$Home\.deno\bin"
}

$DenoZip = "$BinDir\deno.zip"
$DenoExe = "$BinDir\deno.exe"
$Target = 'x86_64-pc-windows-msvc'

# GitHub requires TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$DenoUri = if (!$Version) {
  "https://github.com/denoland/deno/releases/latest/download/deno-${Target}.zip"
} else {
  "https://github.com/denoland/deno/releases/download/${Version}/deno-${Target}.zip"
}

if (!(Test-Path $BinDir)) {
  New-Item $BinDir -ItemType Directory | Out-Null
}

# こちらの プロキシURL と ユーザー名 を書き換える
Invoke-WebRequest -Proxy プロキシURL -ProxyCredential ユーザー名 $DenoUri -OutFile $DenoZip -UseBasicParsing

if (Get-Command Expand-Archive -ErrorAction SilentlyContinue) {
  Expand-Archive $DenoZip -Destination $BinDir -Force
} else {
  if (Test-Path $DenoExe) {
    Remove-Item $DenoExe
  }
  Add-Type -AssemblyName System.IO.Compression.FileSystem
  [IO.Compression.ZipFile]::ExtractToDirectory($DenoZip, $BinDir)
}

Remove-Item $DenoZip

$User = [EnvironmentVariableTarget]::User
$Path = [Environment]::GetEnvironmentVariable('Path', $User)
if (!(";$Path;".ToLower() -like "*;$BinDir;*".ToLower())) {
  [Environment]::SetEnvironmentVariable('Path', "$Path;$BinDir", $User)
  $Env:Path += ";$BinDir"
}

Write-Output "Deno was installed successfully to $DenoExe"
Write-Output "Run 'deno --help' to get started"
```
備忘録）wsl2利用するためBIOSを有効化する【win10】

# はじめに
MACでDocker for Desktopを使い始めたので、windowsでも設定したいと思っていたら、wsl2の仮想化設定が必要だったので、少しメモしておきます
※この時点でwsl自体は設定済み

【実行環境】
Windows10 
バージョン21H2(OSビルド19044,1679)
LENOVO G510機種

# BIOS有効化されてるか確認
windowsアイコンを右クリックして、タスクマネージャーを開き**パフォーマンスタブの仮想化**項目で有効になっているか確認します（有効になっていればBIOSの有効化はOK）
![スクリーンショット 2022-04-29 001715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702325/118954a4-1246-c361-af14-6147e97d15de.png)

# BIOS有効化
**設定**→**更新とセキュリティ**→**回復**→**PCの起動をカスタマイズする欄にある「今すぐ再起動」ボタン**→**トラブルシューティング**→**詳細オプション**→**UEFI ファームウェア**→**再起動**→**System Configuration**→**Virtualization TechnologyをEnterキーでクリックしてEnabledに変更**→**Exit Saving Changesを選んで再起動**

:::note warn
PC環境によって少し手順が異なるかもなので注意
:::

LENOVO公式の手順が動画で説明しててとても分かりやすかったです

https://support.lenovo.com/jp/ja/videos/VID100750
digdagでPostgreSQLのVACUUM ANALYZEを実行する

digdagからPostgreSQLのクエリを実行するときに、
大量データをtruncate, insertで中間テーブルを作ってから、すぐに次の処理で使いたい場合、統計情報がうまく更新されずにクエリが劣化する場合がある。
対処方法として次の処理を行う前にvacuum analyzeをかけてクエリが重くならないようにする方法があるが、digdagのトランザクション設定をオプションで指定する必要がある。

# 検証環境
```
PostgreSQL 13.4
digdag 0.9.41
```
# 実行ファイル
pg_query.dig
```yml:pg_query.dig
#PostgreSQLクエリ実行
+pg:
  _export:
    pg:
      host: ${env.postgres_host}
      port: ${env.postgres_port}
      user: ${env.postgres_user}
      password: ${env.postgres_pass}
      database: ${env.postgres_database}
#      strict_transaction: false
      schema: "schema"
  +query:
    pg>: sql/query.sql
```
query.sql
```sql:query.sql
/*******************************************************
大量データ処理のため、中間テーブルを作成して、最終テーブルを作成する
*******************************************************/

--中間テーブルのクリア
TRUNCATE
 schema.wrk_table
;

--data_tableなので中間テーブルを作成する
INSERT INTO
 schema.wrk_table
SELECT
 colA
,colB
FROM
 schema.data_table
WHERE
 colC = 'C'
;

--VACUUM ANALYZE
VACUUM ANALYZE schema.wrk_table;

--最終テーブルを作成
INSERT INTO
 schema.final_table
SELECT
 t1.colA
,t2.colD
FROM
 schema.wrk_table t1
INNER JOIN 
 schema.name_mst t2
 ON t2.colB = t1.colB 
;
```

実行すると以下エラーが発生した
`Failed to execute given SQL script [ERROR: VACUUM cannot run inside a transaction block]`
VACUUMは同一トランザクション内で使えない。

以下の通り、strict_transactionをflase指定すると問題なく実行できた
クエリが途中で失敗した場合、ロールバックされずに途中まで更新されるので注意すること。
```yml:pg_query.dig
#PostgreSQLクエリ実行
+pg:
  _export:
    pg:
      host: ${env.postgres_host}
      port: ${env.postgres_port}
      user: ${env.postgres_user}
      password: ${env.postgres_pass}
      database: ${env.postgres_database}
      strict_transaction: false
      schema: "schema"
  +query:
    pg>: sql/query.sql
```

参考：
[公式ページ](https://docs.digdag.io/operators/pg.html)
BitTorrent とは

## 勉強前イメージ

トレントもよくわかってない。。。。

## 調査

### BitTorrent とは

ネットワーク上で [P2P](https://qiita.com/miyuki_samitani/items/9254c11de1137e1fef19) (端末同士のやりとり)での方式で
ファイルのやり取りを行うためのプロトコル。
また、BitTorrentを採用したファイル共有ソフトのことを指します。

BitTorrentはクライアント同士の情報をP2Pで通信し合いながらダウンロードを行います。
ダウンロード中のクライアントもアップロードに協力するというプロトコルになります。

また、BitTorrentは一次配布者からダウンロードした人は二次配布者になり、他の人に配布するというような形式で
サーバ・クライアント形式で課題であった、多くの人がダウンロードすると遅くなる問題が
BitTorrentだと配布者が増えれば増えるほどファイルの配信速度が向上します。

## 勉強後イメージ

BitTorrentっていうプロトコルと、そのプロトコルを使ってるファイル共有ソフトってことか。
どうもファイル共有ソフトって聞くとwinnyとかライムワイヤーを想像してしまう....

## 参考

- [BitTorrent 【ビットトレント】 BT](https://e-words.jp/w/BitTorrent.html)
- [BitTorrentとは何ですか？](https://jp.bitcomet.com/faq/bittorrent.htm)
Debian11 bullseyeにシステムトレイを追加したときのメモ

# メモ

+ Tweaksの設定項目になかったので困っていた
+ TopIconsを入れるととりあえずできた
  + https://github.com/phocean/TopIcons-plus
  + https://github.com/ubuntu/gnome-shell-extension-appindicator
    + Tweaksを使うのかと思ったらブラウザ経由でONにすることができた 
+ TopIconsはメンテナンスモードのようなので将来も使えるかは若干不安
【JavaScript】Uncaught TypeError: Cannot read properties of undefined (reading 'dates')

# 問題点
JavaScriptのコードを書いている該当ページ以外のページに移動すると、下記のエラーが出る。

```console:console
Uncaught TypeError: Cannot read properties of undefined (reading 'dates')
```

# エラー文の意味

TypeErrorとあるので、タイプミスをしているのか？
と思ったが、どうやら違うよう。

その後の文が重要。
``Cannot read properties of undefined (reading 'dates')``
``未定義のプロパティを読み取ることができません(reading 'dates')``

直訳すると上記ですが、ニュアンス的には下記が正しいらしい。
``undefinedに対してdatesというプロパティは読み込めません``
ここではundefinedが何なのかが重要。

ということで調べてみると、、、
undefinedは下記の実際のコード中の定数datasetに値することがわかった。

「undefinedな値に対して何かプロパティにアクセスしようとした時に、そんなアクセスは不可能ですと教えてくれるのが、このエラーの本質的な意味」だそうです。←[参考](https://techacademy.jp/magazine/26836)

# 実際のコード
```javascript:application.js
document.addEventListener('turbolinks:load', () => {
  const dataset = $('#condition-show').data()
  const dates = dataset.dates　←ここでエラーが出ている。
  axios.get(`/conditions/${dates}.json`)
  　　　.then((res) => {

　　　　　　　　以下省略

```

コードの2行目の定数``dataset``がundefinedになっているため、

3行目の``dataset.dates``の箇所でundefined(``dataset``)に対してdatesというプロパティは読み込めませんというエラーが出てしまっている。

# 問題点における原因
当初の問題点に戻ると、

JavaScriptのコードを書いている該当ページ以外のページに移動するとエラーが出る。
ということでしたが、
この原因は、他のページでは定数``dataset``の値が存在しないため``dataset``がnullになってしまう。
ということがわかりました。

# 解決策

```javascript:application.js
document.addEventListener('turbolinks:load', () => {
　　　　const dataset = $('#condition-show').data()
  if (!dataset){ return false; }←これを追加
  const dates = dataset.dates
  axios.get(`/conditions/${dates}.json`)
    .then((res) => {

    以下省略

```
```
if (!dataset){ return false; }
```
上記を追加することで、``dataset``がnullの場合にそれ以降のコードを読み込まないようにしてくれます。

# 参考
https://qiita.com/makky/items/f546df8533c3c3ce9b2f

https://techacademy.jp/magazine/26836
backtesting.pyでアウトオブサンプルテストをする

**システムトレード検証と実践** を読みながらシステムトレードの勉強中です。システムトレードではシステムの評価に過去のデータを使ったバックテストを行います。今回の参考書では、

<dl>
<dt>ヒストリカルバックテスト</dt>
<dd>
システムのパラメータを、過去のデータを用いて最適化し、システムの成績を評価する
</dd>
<dt>アウトオブサンプルテスト</dt>
<dd>
直近のデータを一部残し、その他のデータでシステムのパラメータを最適化した後、残しておいた直近のデータでシステムの成績を評価する
</dd>
<dt>ウォークフォワードテスト</dt>
<dd>
アウトオブサンプルテストを期間をずらしながら複数回、最適化と評価を行い、各評価期間の成績を繋げることでシステムの成績を評価する
</dd>
</dl>

の3つのバックテストについての紹介があり、システムの詳細な評価のためにはウォークフォワードテストが必要とのことです。

Pythonでバックテストを行うライブラリはたくさんあるのですが、日本語の情報が多いのは[backtesting.py](https://kernc.github.io/backtesting.py/)かと思います。ドキュメントにはヒストリカルバックテストの例のみ記載があり、ウォークフォワードテストは少し手を加える必要がありそうです。

ウォークフォワードテストを実装する前に、アウトオブサンプルテストを実装する必要があるため、その方法を考えました。ついでに指標をクイックスタートから少し変更し、TALibの指数移動平均を用いたシステムを作ります。

```python
from backtesting import Strategy, Backtest
from backtesting.lib import crossover
from backtesting.test import GOOG
from talib import EMA

# 移動平均線のクロスで売買する

class EmaCross(Strategy):
    n1 = 10
    n2 = 30

    def init(self):
        # TALibの指数移動平均は直接渡せる
        self.ema1 = self.I(EMA, self.data.Close, self.n1)
        self.ema2 = self.I(EMA, self.data.Close, self.n2)

    def next(self):
        if crossover(self.ema1, self.ema2):
            self.position.close()
            self.buy()

        elif crossover(self.ema2, self.ema1):
            self.position.close()
            slef.sell()

df = GOOG

# インサンプル期間のデータでパラメータを最適化
df_in = df.query('"2005-01-01" <= index < "2010-01-01"')
bt_in = Backtest(df_in, EmaCross, cash=100_000, commission=.002)
stats_in = bt_in.optimize(
    n1=range(5, 30, 5),
    n2=range(10, 70, 5),
    maximize='Equity Final [$]',
    constraint=lambda param: param.n1 < param.n2,
)

# アウトサンプル期間のデータでシステムを評価
df_out = df.query('"2010-01-01" >= index')
bt_out = Backtest(df_out, EmaCross)
# runメソッドに、インサンプル期間の結果(_stats_in)の中に
# 入っている戦略のパラメータを展開代入する
stats_out = bt_out.run(**stats_in._strategy._params) 
print(stats_in)
print(stats_out)
```

実行するとインサンプル期間の評価結果と、最適化に使っていないアウトサンプル期間の評価結果が表示されます。
最適化時のリターンは年率46%でしたが、アウトサンプル期間のリターンは年率4%に減っています。

これでアウトオブサンプルテストをできるようになりました。
ウォークフォワードテストもこの調子で実装できそうです。
【Swift】指定した文字列以前(以降)を削除する

指定した文字列以前(以降)を削除する！！
# ソースコード
```swift:usage
let text = "今日のお昼はカルボナーラを食べた！"
let targetString = "カルボナーラ"
let removeBeforeText = text.removeBefore(targetString: targetString)
let removeAfterText = text.removeAfter(targetString: targetString)
print(removeBeforeText)      // カルボナーラを食べた！
print(removeAfterText)      // 今日のお昼はカルボナーラ
```
```swift:extension
extension String {
    func removeBefore(targetString: String) -> String {
        let location = self.searchLocation(searchString: targetString)
        if location < 0 {
            return self
        }
        return String(self.dropFirst(location))
    }
    
    func removeAfter(targetString: String) -> String {
        let location = self.searchLocation(searchString: targetString)
        if location < 0 {
            return self
        }
        return String(self.dropLast(self.count - location - targetString.count))
    }
    
    func searchLocation(searchString: String) -> Int {
        let location = NSString(string: self).range(of: searchString).location
        if location >= self.count {
            return -1
        }
        return location
    }
}
```
もっと良いやり方があれば教えてください:bow_tone1:
[RSpec]Expected response to be a <3XX: redirect>, but was a <200: OK> - deviseによるログイン / アカウント登録のテスト

RSpec初心者です。
deviseのユーザー認証に関するテストで表題の文言と共にテストに失敗したので、意味を調べました。

```console
Failures:

  1) DeviseSessions POST #sign_in パラメータが正しい場合 ユーザー個別ページにリダイレクトされること
     Failure/Error: expect(response).to redirect_to user_url(user.id)
       Expected response to be a <3XX: redirect>, but was a <200: OK>
...
```

## 原因

Createアクション実行後にユーザープロフィールにリダイレクト（status 302）されるところ、Createに失敗してフォームが再表示されている。


>The error message means that the create action is failing, and instead of >redirecting to the user's profile (status 302), it renders the form again (status 200)

参考：https://stackoverflow.com/questions/32386685/expected-response-to-be-a-redirect-but-was-200
EC2(Amazon Linux2)の起動テンプレート作成

今回はEC2起動時に事前登録したテンプレートから起動する設定をお試ししてみます。検証用で何度も同じ設定のサーバを立てる際の工数削減や設定間違いの防止に便利な機能です。

# 今回のゴール
起動テンプレートを利用して、以下環境が設定済み状態でEC2起動を起動できるようにする

[AWS環境]
 ・指定VPC内の所定のサブネットにデプロイ
 ・グローバル（パブリック）IPを付与
 ・指定AMI（Amazon Linux2）を利用
 ・インスタンスタイプをスポットインスタンスに指定

[OS環境]
 ・ホスト名を"test-server"に設定
 ・タイムゾーン、言語を日本仕様に設定
 ・モジュールを最新版にアップデートする
 ・"test-admin"というユーザを追加し、パスワード認証でログインできるように設定






# 作業の流れ


①VPCとサブネットおよびセキュリティグループを作成
②起動テンプレートを作成
③EC2の起動・デプロイ
④設定の確認



# 実際の設定
まず①ですが、この作業は各所に詳しい記事がありますので、本記事では割愛します。一般的にEC2をデプロイして、SSHで接続できる環境であれば問題ありません。では②から始めていきます。
AWSコンソールにログインして、EC2の管理画面を開くと以下のようなメニューが左側に表示されます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/8cf49c2d-6c8b-3885-92d0-8380e5d0ea56.png)

[インスタンス]内の[起動テンプレート]を選択します。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/e3cdf833-be22-a2b7-5c09-d0d57f269b1a.png)
次に[起動テンプレートの作成]をクリックします。以下参考に設定をしていきます。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/850a39d0-238b-82f8-dd09-66aa87edf0c8.png)

・テンプレート名は任意の名前に設定
・タグも任意で設定
・テンプレートコンテンツはAmazon Linuxを選択

![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4465c14d-97f1-4c4b-0717-9659127a7506.png)

・インスタンスタイプで[t2.micro]を選択
・キーペア、サブネット、セキュリティグループは利用する環境のものを選択
・パブリックIPの自動割当ては「有効化」を選択
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/12dca0c7-d720-fbe1-84c9-b3a96e2074e3.png)
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/97f974ff-f215-8dd4-64f0-bca51277decc.png)
・「購入オプション」スポットインスタンをリクエスト」にチェックを入れる
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/ce77f47b-144f-dcb4-93a3-e010ee05d1e3.png)

記載するスクリプト内容は以下になります。

    #!/bin/bash

    #モジュールのアップデート
    yum update -y 

    #言語を日本語に設定
    localectl set-locale LANG=ja_JP.UTF-8

    #タイムゾーンを日本に設定
    timedatectl set-timezone Asia/Tokyo
   
    #ホスト名を"test-server"に設定
    hostnamectl set-hostname test-server

    #ユーザ名"test-admin"を作成
    useradd test-admin

    #test-adminのパスワードを設定 
    echo XXXXXXX | passwd --stdin test-admin

    #test-adminがrootに昇格できるように設定
    usermod -G wheel test-admin
    sed -i 101i"test-admin      ALL=(ALL)       ALL" /etc/sudoers

    #パスワード認証でSSH接続できるように/etc/ssh/sshd_configのファイルを修正
    sed -i "63d" /etc/ssh/sshd_config
    sed -i "63i PasswordAuthentication yes" /etc/ssh/sshd_config

    #再起動
    reboot

最後のRebootですが、ユーザーデータに記載した内容はEC2の初回起動時に1回処理されるだけなので、rebootをしても起動・再起動でループすることはないです。

これで起動テンプレートができたので、これを使って③のEC2の起動・デプロイをしてみます。
![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/ec4bbd08-3705-b8ec-e573-ad2df8948ffe.png)

最後に④ですが、EC2が所定のサブネットにデプロイされており、SSH接続した際に表示されるホスト名が"test-server"になっていること、また"test-admin"でパスワード認証でログインできればOKです。

# おわりに
同じ設定のサーバを何度も立てる際の手間や設定ミス防止の観点から起動テンプレートを利用すると仕事が捗ると思います。
他にも色々書きたいのですが、時間がない...
特にActive Directory系で色々検証した設定を書きたいので、追々アップします。

# 参考にしたサイト
https://dev.classmethod.jp/articles/spotinstances-launch-templates/
https://open-groove.net/linux-command/sed-edit-files/
https://qiita.com/momoken/items/bc8236da4396751d8553
prometheusのアラートルールで正規表現を使う際にメタ文字（ドットとかdとか）を含む場合のハマリポイント

アラートルールのexprを記述している際にドハマりして数時間溶かしたので供養。

https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/

にある通り、正規表現には以下のRE2を使っている。

https://github.com/google/re2/wiki/Syntax

ただし、正規表現を使ったmatcherの場合、メタ文字を含む際には、以下のようにしてはいけない。

```
{instance =~ ".*\.recovery\d*\..*"}
```

エラーになる様子は [ここ](https://prometheus.demo.do.prometheus.io/graph?g0.expr=node_disk_io_now%7Binstance%20%3D~%20%22.*%5C.recovery%5Cd*%5C..*%22%7D&g0.tab=1&g0.stacked=0&g0.range_input=1h)を見ると分かる。


以下のようにして、エスケープを2重にする必要がある。

```
{instance =~ ".*\\.recovery\\d*\\..*"}
```

成功している様子は[ここ](https://prometheus.demo.do.prometheus.io/graph?g0.expr=node_disk_io_now%7Binstance%20%3D~%20%22.*%5C%5C.recovery%5C%5Cd*%5C%5C..*%22%7D&g0.tab=1&g0.stacked=0&g0.range_input=1h)。

理由は、バックスラッシュをエスケープと認識させるためにエスケープする必要があった…。

Ansibleのテンプレートでもよくハマるやつーーー
【統計検定準1級対策④】ポアソン分布の確率関数，期待値，分散，母関数まとめ

## 結論
>確率関数
>```math
>f(x) = \frac{\lambda^x}{x!}e^{-\lambda}\ \ (x=0,1,2,\cdots)
>```
>期待値，分散
>```math
>E[X] = V[X] = \lambda
>```
>母関数
>```math
>G(s) = e^{\lambda(s-1)}
>```

## 期待値の導出
期待値の定義：$E[X] = \sum_{x}xf(x)$から，

```math
\begin{align*}
E[X] &= \sum_{x=0}^{\infty}x\frac{\lambda^x}{x!}e^{-\lambda}\\
&= 0+\sum_{x=1}^{\infty}x\frac{\lambda^x}{x!}e^{-\lambda}\\
&= \lambda e^{-\lambda}\sum_{x=1}^{\infty}\frac{\lambda^{x-1}}{(x-1)!}\\
&= \lambda e^{-\lambda}\cdot e^{\lambda}\ \ (\because \text{Taylor展開の式：}e^x=\sum_{n=0}^{\infty}\frac{x^{n}}{n!})\\
&= \lambda
\end{align*}
```

## 分散の導出
関係式：$V[X]=E[X^2]−(E[X])^2$から，

```math
\begin{align*}
V[X] &= \sum_{x=0}^{\infty}x^2\frac{\lambda^x}{x!}e^{-\lambda} - \lambda^2\\
&= \sum_{x=0}^{\infty}(x^2-x+x)\frac{\lambda^x}{x!}e^{-\lambda} - \lambda^2\ \ (\text{ムリヤリ変形})\\
&= \sum_{x=0}^{\infty}(x(x-1)+x)\frac{\lambda^x}{x!}e^{-\lambda} - \lambda^2\\
&= \sum_{x=0}^{\infty}x(x-1)\frac{\lambda^x}{x!}e^{-\lambda} + \sum_{x=0}^{\infty}x\frac{\lambda^x}{x!}e^{-\lambda} - \lambda^2\\
&= \left(0 + 0 + \sum_{x=2}^{\infty}x(x-1)\frac{\lambda^x}{x!}e^{-\lambda}\right) + \left(0 + \sum_{x=1}^{\infty}x\frac{\lambda^x}{x!}e^{-\lambda}\right) - \lambda^2\\
&= \lambda^2 e^{-\lambda}\sum_{x=2}^{\infty}\frac{\lambda^{x-2}}{(x-2)!} + \lambda e^{-\lambda}\sum_{x=1}^{\infty}\frac{\lambda^{x-1}}{(x-1)!} - \lambda^2\\
&= \lambda^2e^{-\lambda}\cdot e^\lambda + \lambda e^{-\lambda}\cdot e^\lambda - \lambda^2 \ \ (\because \text{Taylor展開の公式})\\
&= \lambda
\end{align*}
```

## 母関数の導出
確率母関数の定義：$G(s)=E[s^X]$ から，

```math
\begin{align*}
G(s) &= \sum_{x=0}^{\infty}s^x\frac{\lambda^x}{x!}e^{-\lambda}\\
&= e^{-\lambda}\sum_{x=0}^{\infty}\frac{(s\lambda)^x}{x!}\\
&= e^{-\lambda}\cdot e^{s\lambda}\ \ (\because \text{Taylor展開の公式})\\
&= e^{\lambda(s-1)}
\end{align*}
```

## ポアソン分布は二項分布の極限であることの証明

二項分布の確率関数 
```math
{}_{n}C_{x}p^x(1-p)^{n-x}
```
において，$p=\frac{\lambda}{n}$とおき，$n\to\infty$の極限をとるとポアソン分布になります。

実際，

```math
\begin{align*}
\lim_{n\to\infty} {}_{n}C_{x}\left(\frac{\lambda}{n}\right)^x\left(1-\frac{\lambda}{n}\right)^{n-x} 
&= \lim_{n\to\infty} \frac{n(n-1)\cdots (n-x+1)}{x!}\frac{\lambda^x}{n^x}\left(1-\frac{\lambda}{n}\right)^{n-x}\\
&= \lim_{n\to\infty} \frac{n(n-1)\cdots (n-x+1)}{n^x}\frac{\lambda^x}{x!}\left(1-\frac{\lambda}{n}\right)^{n}\left(1-\frac{\lambda}{n}\right)^{-x}\\
&= \lim_{n\to\infty} 
1\cdot\left(1-\frac{1}{n}\right)\cdots\left(1-\frac{x-1}{n}\right)
\frac{\lambda^x}{x!}
\left\{\left(1-\frac{\lambda}{n}\right)^{-n/\lambda}\right\}^{-\lambda}
\left(1-\frac{\lambda}{n}\right)^{-x}\\
&= \frac{\lambda^x}{x!}e^{-\lambda}\ \ \left(\because \lim_{n\to\infty}\left(1+\frac{1}{n}\right)^n=e\right)
\end{align*}
```

## まとめリンク
[【統計検定準1級対策】確率分布の確率関数，期待値，分散，母関数まとめ](https://qiita.com/matsuda-blog/items/4573b08f75b3d3c49c16)
【Javascript】splitの結果に区切り文字を含める方法とその理由

# やりたいこと

```Javascript
'abc_def'.split('_') = ['abc', '_', 'def'];  // 実際は['abc', 'def']
```

例によって[Stackoverflow](https://stackoverflow.com/a/25221523)に答えがあり引数に区切り文字を`()`で囲んだ正規表現リテラルを渡せばよかった。

```javascript
'abc_def'.split(/(_)/g);
```
![Screen Shot 2022-04-28 at 21.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51303/cf55e4c2-a0fd-e8af-a71f-2133529dbe72.png)

# なぜこうなるのか

自分の正規表現知識が足りないだけかと思ったが[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#description)にも書かれているECMAScriptの仕様だった。

> If separator is a regular expression with capturing parentheses, then each time separator matches, the results (including any undefined results) of the capturing parentheses are spliced into the output array.

つまりは`()`内にマッチした部分も結果に含められるようになる。
なのでちょっとしたパースもできる。覚えておくと役に立ちそう。

```javascript
'<div>abc<span>def</span></div>'.split(/(<\/?[a-z]+>)/g)
  = ['', '<div>', 'abc', '<span>', 'def', '</span>', '', '</div>', '']
```
【AWS】AWS Organizations 組織内のリソースにタグを強制する方法（SCP、タグポリシー）




今日は、AWS組織のセキュリティを高める方法の一つである「ポリシー」という機能の中で、組織・組織単位（OU）内のリソースに対してタグを強制する際に使える①サービスコントロールポリシー（SCP）と ②タグポリシー について書いてみます。

こちらの記事は、
1．そもそもSCP、タグポリシーってなに？
2．SCP、タグポリシーを使ってタグを強制する方法
のテーマで書いていきます。


## 0. SCPとタグポリシーを有効にしましょう。

まずSCPとタグポリシーを使うために、サービスの有効化が必要です。
AWS Management Consoleの「組織」＞「ポリシー」画面より有効化することができます。
青い文字になっている各ポリシーを選択して中に入ると、そのポリシーの詳細確認と有効化・無効化などの操作ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/e4b20aa3-3d72-a0dd-af8b-f48db3fbcc2f.png)


## 1-1. サービスコントロールポリシー（SCP）とは？
サービスコントロールポリシー（SCP）は、用途によって様々な内容で作成することができます。AWSで提供しているSCPの例を下に貼りますのでご参考ください。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples.html
例えば、AWS Configの設定をユーザーが勝手にいじれないようにする、指定したリソースタイプのみ作成を許可する、AWS Control Towerなどによって作成されたログアーカイブを削除できないようにする、などなど、組織内の各AWSアカウントに対して明らかに禁止にしたいアクションがある場合SCPを設定しコントロールできますのでとても便利だと思います。

## 1-2. タグポリシーとは？
そもそも「タグ」とは何者なのかご存知でしょうか。
（AWSドキュメント：リソースのタグとは）https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_tagging.html
↑のAWSドキュメントを見ると理解できると思いますが、タグは簡単に説明しますと、AWSアカウント内の様々なリソースを管理する際、把握・管理しやすくするために付けるラベルみたいなものです。（タグそのものに関しては、また別の記事で詳しく説明いたします。）

ていう「タグ」というものを、組織内で標準化して付けるために存在するものが「タグポリシー」となります。
タグポリシーは、以下のようなケースに対応できます。
- 「Name」というタグは絶対つけてほしい（name、NAMEはだめ）
- EC2 instance, S3 bucket には絶対「Owner」というタグをつけてほしい
- 「Environment」というタグをつけてほしいけど、そのバリューは prod, dev, testの中の1つじゃないとダメ

より詳しいタグポリシーに関する説明は以下のAWSドキュメントをご参照ください。
（AWSドキュメント：タグポリシーとは）https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_tag-policies.html


## 2. SCP、タグポリシーを使ってタグを強制する方法

上までの説明を読むと「え、待って、タグポリシーだけでタグ付けの強制できるんじゃない？なんでSCPも必要？」と思われる方いらっしゃるかと思います。
私も最初そう思い作業を始めましたが、SCPが無いと「タグ付け」自体の強制はできなかったため、この記事を書きました。

タグポリシーは「タグ付け」自体の強制はできません。
ユーザーがタグ付けをするっていう前提で、タグのキーとバリューの値の設定を強制するものがタグポリシーとなります。

（例）EC2インスタンスに「Owner」タグを指定するようタグポリシーを組織にアタッチ
- EC2インスタンスに「OWNER」タグをつけると、Denyされる
- EC2インスタンスに何もタグをつけないと、Denyされない 
→ タグ付けできてるかどうかは、タグポリシーによって判断しないため

ですので、タグ付けを強制するには、以下のようなSCPをアタッチする必要があります。
（AWSドキュメント：リソースのタグ付けの SCP の例）https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples_tagging.html
このSCPをアタッチすることで、ユーザーは特定のタグをつけずにリソースを作成できなくなります。また、その特定のタグを削除できないようにすることもできます。

色々な条件付きでこのようなタグ付け強制のSCPの実装が可能ですので、上記のドキュメントを参考しながらSCPを作成してアタッチしてみましょう。✌('ω'✌ )三



## 参考URL
1. （AWSブログ：Implement AWS resource tagging strategy using AWS Tag Policies and Service Control Policies (SCPs)）https://aws.amazon.com/jp/blogs/mt/implement-aws-resource-tagging-strategy-using-aws-tag-policies-and-service-control-policies-scps/
非 Owner ユーザーにおける CodePipeline と GitHub v2 Source Action の連携

# 背景

CodePipeline で GitHub を Source Action とする場合、v1 と v2 が選択できる。
2022/04 現在、v1 は非推奨の方法となっている。

> GitHub バージョン 1 アクションは OAuth トークンを使用して GitHub で認証し、別のウェブフックを使用して変更を検出します。これはもはや推奨される方法ではありません。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/update-github-action-connections.html

必然的に v2 を選ぶことになるが、非 Owner な GitHub アカウントで作業したときにハマったのでメモしておく。

# v2 連携するために必要な手順

以下が詳しい。

https://qiita.com/KensukeTakahara/items/6ed83e83620b86b748b7

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/connections-github.html

ざっくりと記すと、以下のようになる。

1. GitHub コネクションを作成する
1. AWS Connector を GitHub にインストールすることで、コネクションを利用可能にする
1. パイプラインの Source Action で GitHub (バージョン 2) を選択する

# ハマった点

## 非 Owner アカウントで AWS Connector のインストールができない

手順の 2. にて、GitHub コネクションを有効化するために AWS Connector というものを GitHub にインストールする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/7d1642d2-3b9d-7e2a-30d2-ac8719012bb8.png)

パイプラインで扱いたいリポジトリを含む GitHub の Organization を選択するわけだが、選択した Organization において自身が Owner 権限を持っていない場合、以下のようなエラーになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/0e3bba0d-a327-f6e1-f842-cc8a553d163f.png)

## マネージドコンソールを操作する人が Owner の GitHub ユーザーでログインしている必要がある

エラー発生後、以下のようなメールが Organization のメール宛に届く。

```
Integration Installation Request
@tsubasaogawa requests you to install AWS Connector for GitHub for <Organization Name>

Hello there!

You’re receiving this email because @tsubasaogawa has requested the installation of AWS Connector for GitHub at your organization <Organization Name>.

To review the request, please click here.
```

「click here」から AWS Connector をインストールする画面にいけるようだったので、Owner 権限を持っている人に代わりにインストールしてもらった。

これで Organization に AWS Connector がインストールされたはず。コネクションの有効化もできる算段だったのだが、以下の画面で「GitHub アプリ」にインストール済の Connector が表示されなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/cd001491-dc0b-b2c6-055e-ac46124e28bd.png)

原因は、作業時にやはり非 Owner の GitHub ユーザーでログインしていたため。Owner ユーザーでログインされていれば、以下のように「GitHub アプリ」にサジェストされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/09718101-0e41-939e-3fdd-55411be0cc3f.png)


# まとめ

GitHub の Owner ユーザーで作業すれば、上記のような問題は生じずにスムーズに進めるはず。逆に非 Owner ユーザーの場合は、一時的に Owner にしてもらうなどしてから作業するのが確実と思われる。
ローカルでDocker-rails環境を立ち上げる

## 背景

ふと時代に取り残されているような、周囲に置いていかれるような不安に駆られてしまいまして、コンテナをローカル環境で使い始めました。
デプロイする際の手間が減ること、コンテナを簡単に削除できることからRubyアプリケーションを作成する時は今後も使い続けていこうと思いました。
導入の際に実際に行ったことを手順に落として残しておこうと思います。

## 手順
①Dockerfile, docker-compose.yml, Gemfile, Gemfile.lockを作成します。

#### なぜDockerfileとdocker-compose.ymlを分けるのか？

- コンテナを分けるため管理がしやすい

- 実行コマンドが簡潔

といった理由で今回は分けて記述します。

Dockerfile
```Dockerfile
FROM 
ruby:2.5
RUN apt-get update -qq && \             #←ここの\が抜けているとエラーになる
  apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install
COPY . /myapp
```

```docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7.30
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ********
    ports:
      - "3306:3306"
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - gem_data:/usr/local/bundle
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true

volumes:
  gem_data:
```

Gemfile
```Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'
```

Gemfile.lockには何も記載しません。

### ②rails newの際に実行したコマンド

docker-compose run web rails new . --force --database=mysql --skip-bundle

runの後に実行するserviceを指定します。
docker-compose.ymlで指定したserviceであるwebを実行していきます。

### ③docker-compose build
新しくローカルのファイルを更新した際は一度buildを実行する必要があります。
Gemfileにmysqlを追加した場合等、都度行います。

### ④docker-compose up (-d)
buildしたコンテナにdocker-compose up を実行します。
-d　をつけるとバックグラウンドで実行してくれます。

### ⑤起こしたエラー

```
traceback (most recent call last): file "docker-compose", line 3, in <module> file "compose/cli/main.py", line 92, in main typeerror: can only concatenate str (not "dict") to str
```

docker-compise.ymlに記載したコマンドに\が入っていないことが原因でした。

```
error response from daemon: oci runtime create failed: container_linux.go:380: starting container process caused: exec: "db:create": executable file not found in $path: unknown
```
ActiveRecordでNoDatabaseErrorが出ている際に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/c667c90e-6d1d-b5c1-71d3-a19aeca6fc83.png)


docker-compose run web bundle exec rake db:create
↓
docker-compose build
↓
docker-compose up -d
としなかったことが原因。

created databaseの文言が表示されると解消されます。

### ⑥config/database.ymlの書き換え

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: *********                       #passwordとhostは変更が必要
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```


### ⑦再度docker-compose build, docker-compose up
ローカルのファイルに変更を加えたため、再度実行します。

### ⑧your on railsの画面

![スクリーンショット 2022-04-28 20.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/22914051-27a8-f247-90a2-59bcd56b338f.png)

無事環境構築できました！
Arduinoのタイマー割り込みで遊ぶ


目的
オリジナルI2C超音波距離センサーからの値を定期的に受信したい。
とりあえず500msで割り込みをかけた。


![o_con360.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/71c52605-33a7-7828-eb83-b0a38856ffce.jpeg)




参考


ArduinoのTimerを初心者が1からなんとなくわかるためのメモ


https://qiita.com/suzukinori/items/939cc9f49e535c4eadd7



```c++



// 1/100秒の指定
#define AA 50
#define BB (65536-((62500/100)*AA))

void setup() {
  Serial.begin(9600);
  
  TCCR1A = 0; // 初期化
  TCCR1B = 0; // 初期化
  //TCNT1 = 3036; 
  TCNT1 = BB;
  TCCR1B |= (1 << CS12);  //CS12 -> 1  prescaler = 256
  TIMSK1 |= (1 << TOIE1); //TOIE -> 1
}

ISR(TIMER1_OVF_vect) {
  Serial.println(millis());
  //TCNT1 = 3036;
  TCNT1 = BB;
}

void loop() {
}




```
Azure Purview データカタログ内のアセットを認定する

## はじめに

Azure Purview データカタログに存在する特定のアセットを、認定・表示する機能が GA されました。
[General availability: Asset certification in Azure Purview data catalog](https://azure.microsoft.com/ja-jp/updates/azure-purview-certify-assets/?WT.mc_id=AZ-MVP-4038156)

データカタログの拡大に伴い、データ利用者が信頼できるアセットを逐一判断することは難しくなります。

そこで、データ管理者や責任者が本機能を利用することにより、信頼できるアセットをあらかじめ明示できる、という利用イメージです。

今回は、Azure Purview データカタログのアセットに対して本機能による認定を実施し、認定プロセスや認定されたアセットの見え方などを検証しました。

## 想定読者

- Azure Purview の使用経験がある方
- データ管理者や責任者など、データガバナンスを推進する立場の方

## アセットの認定

Azure Purview Studio から操作を行います。
各項目の内容は公式ドキュメントにまとまっています。
[Azure Purview データ カタログでの資産の認定](https://docs.microsoft.com/ja-jp/azure/purview/how-to-certify-assets)

### 前提条件

アセットの認定を実施するには、対象のコレクションに対するデータキュレーターのロールが必要です。
![スクリーンショット 2022-04-28 200420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/af28594f-bc44-e579-f7d8-dc2e6f553d6d.png)

### 単一のアセットを認定する

データカタログ内の任意のアセットに移動し、「Edit」を選択します。
![certificated_label_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/c6ceabd5-ad49-93d4-da62-6444668c7f2c.png)


「Certified」フィールドをオンにし、変更を保存します。
![certificated_label_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/8cd8684e-903e-dfd3-c651-9cd7ea062a4a.png)

データカタログに戻ると、認定したアセットに「Certified」というラベルが付与されています。
![certificated_label_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/0bf8d3f4-5b61-e3c9-f5a6-c29f1cf21a87.png)

### 複数のアセットを同時に認定する

認定したいアセットの右側にあるチェックボックスを有効にし、「View selected」を選択します。
![certificated_label_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/145eeaa7-db64-af52-100c-77cfbf3b4839.png)

「Bulk edit」を選択すると、編集項目を選択する画面が表示されるので、単一の場合と同じく「Certified」属性を有効にします。
![certificated_label_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/59d2b761-f6da-7f06-c00f-89abd474b6ee.png)
![certificated_label_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/3c60a217-9be6-a477-65e8-0f6f7cbd6ea3.png)

## 認定されたアセットの表示

データカタログを参照し「関連」or「関連性」でソートした場合や、データカタログを検索した際に、認定されたアセットが優先して上位に表示されます。
![certificated_label_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871738/70fc771f-2d19-49f6-1fb4-ea2aea5b3a21.png)

ただし、左側のメニューにあるようなフィルタリングには対応しておらず、**「データカタログ内の認定されたアセットのみを表示する」といった操作は 2022 年 4 月現在ではできない**ようです。

## まとめ

今回は、Azure Purview データカタログのアセット認証機能を検証し、手動でアセットの認定を行う設定プロセスや、データカタログ上でどのように表示されるか確認しました。

簡単な操作でアセットの信頼性を共有できるため、データ管理者/利用者の双方に価値のある機能ではないかと思います。
Windows Server 2022 Azure Editionのバグ

:::note information
注意
本稿は2022年4月28日時点のもので、以降にデプロイしたWindows Server 2022 Azure Editionでは不具合が解消されている可能性があります。
:::

久しぶりの投稿になります。
検証を行っている間に偶然見つけたバグです。

# バグの症状

Azure上のWindows Server 2022に「Azure Edition」なるものがあります。
SMB Over QUICやHOT Patch、Azure Extended Network、の3つの機能が利用できるWindows Server OSですが、なんと<font color="Red">**ライセンス認証できない**</font>というバグがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/94394629-71f3-c29d-c9c3-3bc49ffcd85f.png)

# 一般的にAzure上のVMがWindowsライセンス認証できない構成パターン

1.  NSGで送信方向Any Any Denyでインターネット接続をすべて拒否している場合
2.  [強制トンネリング](https://qiita.com/hidekko/items/c6da30484e3dda87e7b1)でWindows VMのライセンス認証元IPアドレスがAzure以外のものになっている

の2パターンが最有力候補です。
しかし本件はWindows OSのバグのため、この2点はどちらもあてはまりません。
NSGで送信方向で宛先がInternetでPermit、Azure基盤から直接インターネットに接続されている、という状態でも起こります。

# 回避策

回避策というほどのものではないですが、SRで問い合わせたところ、<font color="Red">**「ライセンス認証できていないのは表示上の問題で実際はライセンス認証できている」**</font>とのことでした。
念のためPowerShellでライセンス認証されているか確認し、認証されていれば表示上の問題ということで無視して良いようです。

# PowerShellでの確認

以下のコマンドをPowerShellで実行してください。
```
Get-Date; cscript c:\windows\system32\slmgr.vbs /ato
```
と
```
Get-Date; cscript c:\windows\system32\slmgr.vbs /dlv
```
です。

結果が
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/885121b5-a174-58a0-fc4d-f7b0c5082be7.png)
この<font color="Red">赤枠</font>のようになっていればOKということでした。

本件あまり知られていないようなので周知の意味も込めて記事にしました。

今日はここまで。
反実仮想機械学習と反実仮想説明の違い

## これは何？

近年、機械学習に関連する研究において「反実仮想機械学習（Counterfactual Machine Learning，CFML）」や「反実仮想説明（Counterfactual Explanation，CE）」と言ったキーワードが見られるようになりました。これらはいずれも「反実仮想（Counterfactual）」というキーワードを含んでいます。反実仮想とは以下を意味します。

> 文法で、事実と反対のことを想定すること。「もし〜だったら…だろうに」のような言い方。
> 引用元：[反実仮想とは - コトバンク](https://kotobank.jp/word/%E5%8F%8D%E5%AE%9F%E4%BB%AE%E6%83%B3-687195#:~:text=%E3%81%AF%E3%82%93%E3%81%98%E3%81%A4%E2%80%90%E3%81%8B%E3%81%9D%E3%81%86%E3%80%94%E2%80%90,%E3%81%AB%E3%80%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E8%A8%80%E3%81%84%E6%96%B9%E3%80%82)

それゆえ、名称が似ていますが、その内容は異なります。本記事では筆者（@daikikatsuragawa）なりに理解した、反実仮想機械学習と反実仮想説明の違いについて紹介します。補足や助言などありましたら「コメント」や「編集リクエスト」をいただけると幸いです。

## 比較表

※おそらくレイヤーが異なるであろう２つの技術・手法についての比較であるため、いびつに感じる箇所もあるかと思います。

| 比較内容 | 反実仮想機械学習（Counterfactual Machine Learning，CFML）  | 反実仮想説明（Counterfactual Explanation，CE） |
| --- | --- | --- |
| 分野 | 因果推論／効果検証 | 説明可能なAI |
| 概要 | 過去に収集したデータを用いて仮想的な施策を設計し、その性能を評価する技術の総称である。オフライン実験による機械学習を用いた対策の改良を可能にする。つまり、オンライン実験をせずとも、意思決定の支援や失敗の防止が期待される。| 機械学習による予測の結果に対して、状態を覆すために必要な説明変数（または特徴、属性など）の変化量を算出し、例として提示する説明手法である。これにより、予測を受けた人は状態を覆すために必要となる具体的な目標、行動をイメージすることができ、その行動を促進する効果が期待される。 |
| 反実仮想の捉え方 | 過去に収集されたデータにおける観測されえたが実際は観測されなかったデータ。（例：実際はクーポンを受け取っていない人に対してクーポンを受け取っていたという場合） | 予測を受けた人の状態を覆すために必要な説明変数の変更量の例。（例：「もしこの説明変数がこれだけ変動していたら予測結果は覆っていただろう」と言える例） |
| 関連 | Off-Policy Evaluation（OPE）／Off-Policy Learning（OPL）／Individual Treatment Effect（ITE）／Unbiased Recommender Learning／Unbiased Learning-to-Rank | Permutation Feature Importance（PFI）／Partial Dependence（PD）／Individual Conditional Expectation（ICE）／Feature Attribution Methods／SHapley Additive exPlanations（SHAP）／Local Interpretable Model-agnostic Explanations（LIME） |

## 参考

https://www.ai-gakkai.or.jp/resource/my-bookmark/my-bookmark_vol35-no4/

https://www.amazon.co.jp/%E6%96%BD%E7%AD%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%E3%80%9C%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E6%8A%80%E8%A1%93%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%B4%BB%E7%94%A8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%AD%A3%E3%81%97%E3%81%84%E8%80%83%E3%81%88%E6%96%B9-%E9%BD%8B%E8%97%A4-%E5%84%AA%E5%A4%AA-ebook/dp/B09B9H3KLL/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1650903687&sr=8-1

https://www.fujitsu.com/jp/about/research/article/202102-aaai-21.html

https://www.microsoft.com/en-us/research/project/dice/

https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%92%E8%A7%A3%E9%87%88%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%80%9C%E4%BA%88%E6%B8%AC%E5%8A%9B%E3%81%A8%E8%AA%AC%E6%98%8E%E5%8A%9B%E3%82%92%E4%B8%A1%E7%AB%8B%E3%81%99%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E6%A3%AE%E4%B8%8B-%E5%85%89%E4%B9%8B%E5%8A%A9-ebook/dp/B09BBY1LP9/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1650903631&sr=8-3
マルチモニタ環境で画面間をカーソルが移動しないことがある場合の解決法

# 発生した問題
マルチモニタを使用している際、モニタ間でカーソルを移動させようとすると移動できない時がある。
当環境では3番のモニタから4番へ移動するときに発生、マウスの速度が遅い時に発生？
Windows10で画面出力にはGeforce RTX 2060Superとマザーボードでの出力を併用中。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/36865602-41e4-2876-d589-a8b70ac44390.png" width=50%>
# 解決法
上記の設定画面から、モニタのレイアウトを再設定。
NVIDIAコントロールパネルから複数のディスプレイの設定でレイアウトを再設定。
（4番のモニタはマザーボード出力のためNVIDIAコントロールパネル上は表示なし）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/53b3b005-3451-185d-cb41-20e812cb4080.png" width=50%>

##### 備忘録
OS側のレイアウトとNVIDIA側のレイアウト設定間で何かしらの不整合があるっぽい？
NVIDIA側でレイアウト設定をするとOS側のレイアウト設定が滅茶苦茶になり、一回キャンセルを押して
もう一度NVIDIA側で再設定をしてから決定を押すと正しく設定できた。
iGPU Multi-Monitorを利用してグラボとマザボ併用した4画面設定だから起きた問題なのかどうか……
とりあえず解決出来たので良しとして本質的な原因究明は置いておく。
[Python実践]Loggingに挑戦してみよう！《基礎編》〜公式ドキュメントをもとに解説〜

# はじめに

今回はPythonの「Logging」の基礎について解説していこうと思います！

応用編はこちらにになります。

https://chaldene.net/logging-senior

「**Logging**」はPythonの実務などでよく使われるので、Pythonエンジニアを目指している方は是非この記事でマスターしていってください！

この記事はPythonの公式ドキュメントを参考にしています。

Pythonに限らず、プログラミング言語の公式ドキュメントは非常に読みにくいので、この記事でわかりやすく解説していきます。

「**Loggingよく見かけるんだけど全くわからない...**」

「**Pythonエンジニアを目指して学習中**」

「**Pythonスキルのレベルアップをしたい！**」

このような人のお役に立てれば幸いです。

それでは早速本題に入っていきましょう！

:::note info
「Logging」はPythonの基礎を理解していないと難しいので、Pythonの基礎を理解していない人は以下を参考に学習してください！
:::

https://chaldene.net/python-book

# 概要

まずは「Logging」がどういったものなのかなどの概要から見ていきましょう。

「Logging」とは以下のようなものです。

:::note 
- プログラムが実行されているときに起こったイベントを追跡してくれる。
- 重要度を設定して、特定のイベントが発生したことをメッセージと共に知らせてくれる。
:::

この説明だけでは理解できないと思うので、この記事を通して理解していってください！

## 用途

「Logging」の概要を見てきましたが、実際どのような場面で使用されるのでしょうか？

:::note 
- プログラム実行中に発生した状態の監視や障害の分析。
- 特定の動作に関する警告やエラーの警告。
:::

上記のような場面で主に使われます。

## 例外処理との違い

もしかしたら「例外処理とどう違うの？」と思う人がいるかもしれないです。

なのでここで２つの違いを解説していきます。

まずは用語の整理からしていきましょう。

まずは「例外処理」から。

- 想定内のエラーの処理。

次に「Logging」。

- 記録を取る。

こうみるとずいぶん違いますね。

「Logging」はその名の通り「ログ」をとっているイメージですね。

記録を取ることで「エラーが起きそうか。」や「エラーが起きていないか。」、「動作の確認」などを行うことができます。

一方「例外処理」は、「エラーが起きたときにどうするか」を行うだけなので違いがよく分かりますね。

## 重要度レベル

概要の説明の部分で、「重要度を設定して...」とありました。

ここではその「重要度」について解説していきます。

「重要度」は以下の５つで、下にいくほど重要です。

:::note 
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
:::

１つ１つ特徴を見ていきましょう！

### DEBUG

問題を診断し、詳細な情報を確認する。

### INFO

想定された通りのことが起こったことの確認。

### WARNING

想定外のことが起こった、もしくは問題が起こりそうであることを知らせてくれる。

### ERROR

より重大な問題により、ソフトウェアがある機能を実行できない。

### CRITICAL

プログラム自体が実行を続けられないことを表す、重大なエラー。

以上のような特徴があるので、なんとなく理解しておきましょう。

## デフォルトLevel

「Level」とは先ほどの「重要度」のことです。

この「Level」にはデフォルトレベルがあります。

このデフォルトレベル以上の「Level」が出力されます。

このデフォルトレベルは「WARNING」です。

では早速コードで確認してみましょう！

```python
import logging

logging.debug('Debugだよ！')
logging.info('Infoだよ！！')
logging.warning('Warningだよ！！！')
logging.error('Errorだよ！！！！')
logging.critical('Criticalだよ！！！！')

# WARNING:root:Warningだよ！！！
# ERROR:root:Errorだよ！！！
# CRITICAL:root:Criticalだよ！！！
```

出力を確認してみると「Warning」以上のメッセージが出力されていますね。

では「Level」を変更してみましょう。

```python
logging.basicConfig(level=logging.ERROR)

logging.debug('Debugだよ！')
logging.info('Infoだよ！！')
logging.warning('Warningだよ！！！')
logging.error('Errorだよ！！！！')
logging.critical('Criticalだよ！！！！')

# ERROR:root:Errorだよ！！！
# CRITICAL:root:Criticalだよ！！！
```

1行目の部分で「Error」にレベルを設定してから出力を確認してみると、しっかり「Error」以上のメッセージが出力されていますね。

# 続き

これより先は以下の記事にまとめています。

https://chaldene.net/logging-basis

より詳しくLoggingについて学ぶことができるので、興味がある方はぜひ！
（もちろん無料です！）
サクッとWEBアプリに高負荷をかけたテストしたい

# 対象読者

- WEBアプリに対して、高負荷をかけてもサーバがダウンしないか確認したい人。
- Auto Scaring（負荷に応じてCPUなどのリソースを増減する）することを確認したい人。
- ブラウザを何個か立ち上げて、画面をひたすら叩くといった人力テストをしたくない人。

# 解決策

このApachBench（ab）を利用します。

https://httpd.apache.org/docs/2.4/programs/ab.html

# 利用手順

まずはターミナルを立ち上げて、abコマンドと叩きます。
Macの場合、標準で入っているぽいです。
Windowsの場合は、Windows Subsystem Linux(WSL)を導入しましょう。
以下は、WSLでabコマンドを叩いたときの挙動です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/69654208-5ed6-a41e-f33d-b5581766b11c.png)
コマンドが見つからないと表示されるので、インストールします。

```shell:abをインストールする
apt-get update
apt install apache2-utils -y
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/19a2427c-8579-ccc8-8c41-e565b6b850a2.png)
インストールできました。

abコマンドは以下のように使います。
```shell:abコマンドサンプル
ab -n <総リクエスト数> -c <同時接続数> <URL>
```

## 使用例

実際に自分のＰＣ上に立ち上げたWEBサーバに対して、大量のリクエストをぶん投げます。

```shell:abコマンド実行例
root@******:~# ab -n 10000 -c 1000 http://localhost:3000/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            3000

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      1000
Time taken for tests:   3.240 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2110000 bytes
HTML transferred:       120000 bytes
Requests per second:    3086.86 [#/sec] (mean)
Time per request:       323.954 [ms] (mean)
Time per request:       0.324 [ms] (mean, across all concurrent requests)
Transfer rate:          636.06 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   73 257.4      6    1080
Processing:    21  209  51.7    212     334
Waiting:        5  112  50.9    107     309
Total:         22  282 276.5    217    1394

Percentage of the requests served within a certain time (ms)
```

## abコマンド実行したあとに確認するポイント

- **Concurrency Level**	: 同時実行数
- **Time taken for tests**	: 	テスト時間
- **Complete requests**	: 	総リクエスト数
- **Failed requests**	: 	失敗したリクエスト
- **Total transferred**	: 	転送量（全体）
- **HTML transferred**	: 	転送量（HTML）
- **Requests per second**	: 	1秒間あたりのリクエスト数
- **Transfer rate**	: 	転送レート


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/ed0635dd-c1c3-f83b-90c0-0f3f9621cb3d.png)
2回コマンド実行したときのCPU使用率状況です。


以上です。
WindowsのanacondaでGMTを使用して地図を描く

anacondaを利用すればWSLを使わずに簡単にGMTを使うことが出来ると聞き、実際に使用してみました。導入から簡単な使用法まで書いていこうと思います。

ちなみにこれがマダガスカルッ！！
![madagascar.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/a91499dd-574d-0efc-6bf5-6cbbdf7e3ff5.jpeg)



# GMT(Generic Mapping Tools)
手軽に地図を描画できるツールとして有名なもの。
筆者は今までmacで利用していたがWindowsでも利用したいと導入した。
公式サイト
[GMT6](https://www.generic-mapping-tools.org/)

# 環境構築
[PyGMT](https://www.pygmt.org/latest/install.html)より引用したコードを使用します。
## はじめに
今回はpygmtというライブラリを使用しますが、anacondaであれこれやる前にGMT6をインストールする必要があります。
[GMT6](https://www.generic-mapping-tools.org/)から最新版をインストールしておきましょう。

##GMTを扱う環境の準備
まずはanaconda、baseからターミナルを開き、以下のコードを実行します。

```py
conda config --prepend channels conda-forge
```

次にanacondaの環境を新しく作成します。
ここでは公式に従い名前をpygmtにします。

```py
conda create --name pygmt python=3.9 numpy pandas xarray netcdf4 packaging gmt
```

これでpygmtを扱うために必要なライブラリの入ったpygmtという環境が構築されるのでそのままそちらに切り替えましょう。

```py
conda activate pygmt
```
切り替えたらPyGMTをインストール。

```py
conda install pygmt
```

ついでにアップデート。

```py
conda update pygmt
```

これで完了です。
正常に動作するかテストしてみましょう。
```py
import pygmt
pygmt.show_versions()

fig = pygmt.Figure()
fig.coast(region="g", frame=True, shorelines=1)
fig.show()
```

成功していればこういった画像が生成されるはずです。
![test1024_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/f4dfae32-a73c-f199-d6b7-e727ae74c0b8.jpeg)

# 使い方
簡単な使い方を自分が忘れないために書いていこうと思います。

```py
fig = pygmt.Figure()
fig.coast(shorelines="1/0.5p", region=[30, 60, -30, -5], projection="M25c")
fig.show()
```
これで冒頭でお見せしたマダガスカルの画像が出来上がります。
shorelinesで海岸線の太さを指定、regionで経度、緯度、projectionではメルカトル図法を使用すると指定しています。
なんかmplと似ている…？

これに色々追加していく感じになります。

## フレーム(外枠)とグリッドの追加、タイトルの追加
```py
fig.basemap(frame=["ag", '+t"Madagascar Island"'])
```
![textploted_mad.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/f17240b2-fdb8-3b39-6ac7-605a4674c0e8.jpeg)


## 海岸線を描く

```py
fig.coast(land="black", water="skyblue")
```

![color_mad1024_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/9835afe0-fb74-abe2-7fee-de6d71befa9a.jpeg)

## プロットする
c0.5cの意味は"circles of 0.5 centimeter size"。

```py
fig.plot(x=47.5166, y=-18.9333, style="c0.5c", color="white", pen="black")
```

![ploted_mad.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/39fdb31f-8b38-b49d-e6ca-01183f08f994.jpeg)

## テキストを表示する
表示する座標、入力するテキスト、テキストのフォント(太さ、書体、色)を設定しています。
他にも枠をつけたり、斜めに表示することもできます。

```py
fig.text(x=47.5166, y=-18.9333,text="Madagascar", font="18p,Helvetica-Bold,red")
```
![textploted_mad.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1252522/86804c61-a80b-f6a9-e0d9-83dabbd4eb6e.jpeg)

他にも色々とできるようなので興味のある方は調べてみてください。
B2C Commerce Alerts for Slackを設定してみる

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。


この記事では、Business ManagerからSlack連携をし、アラートをSlackに飛ばすための設定を紹介します。
下記３つのヘルプを参考に設定しましたので、詳細はこちらをご覧ください。

* [Get a Slack Token for Commerce](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/content/b2c_commerce/topics/admin/b2c_slack_bot_token.html?resultof=%22%73%6c%61%63%6b%22%20)
* [Connect a Slack Workspace to Business Manager](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/content/b2c_commerce/topics/admin/b2c_connect_slack_to_business_manager.html?resultof=%22%73%6c%61%63%6b%22%20)
* [Configure B2C Alerts in Business Manager and Slack](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/content/b2c_commerce/topics/admin/b2c_configure_alerts_for_your_site.html?resultof=%22%73%6c%61%63%6b%22%20)

また、Slack アプリを作成しますので、アプリについての詳細は[こちら](https://api.slack.com/authentication/basics)を参照してください。


## 手順

###  Slackアプリを作る

1. [アプリ](https://api.slack.com/)のページへ遷移し、`Create an App` を選択。作成済みの場合はそのアプリを選択 。
2. ポップアップが出てくるので  `From an app manifest` を選択。
3. 任意のワークスペースを選択して、次へ。
4. このmanifestスニペットのnameとdescription, display_nameを好きなものに編集してコピペする。
```yml
_metadata:
  major_version: 1
  minor_version: 1
display_information:
  name: <name>
  description: <description>
  background_color: "#2d9c0b"
features:
  bot_user:
    display_name: <display_name>
    always_online: false
oauth_config:
  scopes:
    bot:
      - groups:read
      - channels:read
      - chat:write
      - chat:write.public 
```

5.`Create`  を選択する。



### チャネルを作る

Slackのサイドバーの`Add Channels` からチャネルを作成。


### チャネルにアプリを招待する

作成したチャネルにアプリを招待する。 @{作成したアプリ名}　でメンションするのが一番早いです。


### SlackアプリのBotトークンを利用してCCのBusiness Managerに設定する

1. [ここ](https://api.slack.com/apps/)へ行き、作成したアプリを選択する。
2. 左ナビの `OAuth & Permissions` を選択する。
3. `OAuth Tokens for Your Workspace` にトークンが表示されているのでそれをコピー。
4. Business Manager の **管理 ＞ 通知設定 ＞ Slack** タブを選択
5. ワークスペースへの接続を追加するボタンをクリック。
6. トークンの項目に先ほどコピーしたトークンを利用。
7. 作成したSlackのチャネルを選択し、接続を追加する。
8. Business Managerの **管理 ＞ 通知設定 ＞ 設定** タブに移動し、通知を送りたいイベントに作成したSlackチャネルを設定する。



## 実際にアラートを飛ばしてみる

顧客リストに紐づいたイベントに設定して、パスワードの文字数の要件を８文字以下に変更すると下記のようなアラートが飛んできました。さらに設定を戻すと修正された旨が飛んできます。

![スクリーンショット 2022-04-28 18.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/6a0dffea-69c6-ece4-6ea7-364ef88a7ae7.png)
UE4 CreateDefaultSubobjectではまった ver4.26.2


CreateDefaultSubobjectで初期化したときは作成されているが
使用時になぜかnullptrになる問題

https://forums.unrealengine.com/t/createdefaultsubobject-becomes-nullptr-before-reaching-beginplay/486746/2

parent classをCharacterに付け替えて再度元に戻すと正常に動作

特定の更新をC++で行うと発生することがあるらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/12f9df59-656b-15d5-b8c5-dba0f3ddb71f.png)
AttributeSetがnullになっていた時はDetailsのAttributeSetを確認。
あと、どうしてもわからない場合は親をBaseClassに付け替えて元に戻したときに初期化されるので
その際の差分をバージョン管理システムかローカルで差分を比較するとよいかもしれない
GitだとかPerforceであればUE上から変更されている差分がわかりやすい

UE5でも発生してほかの変数などが付け替えでリセットされてしまって困ったので追加部分を調査。