OmniAICreator/Qiita-1.07M huggingface dataset:
Conga Batch List View Button


元の質問
[Conga Batch List View Button](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdPP2SAN)


+ [【クラッシク版】Create a Conga Batch List View Button](https://documentation.conga.com/composer/latest/create-a-conga-batch-list-view-button-143199358.html)
+ [【Lightning 版】Create a Conga Batch List View Button ](https://documentation.conga.com/composer/latest/create-a-conga-batch-list-view-button-lightning-experience-165940986.html)
+ [Conga Batch List View Button in Lightning Apex Test](https://developer.salesforce.com/forums/?id=9062I000000XveMQAS)
WSL2 Ubuntu20.04 に PHPENV をインストールするメモ

参考にした記事だけでは何故かうまく行かなかったので、加筆して転載

# インストール

```bash
# パッケージの更新
sudo apt-get update
sudo apt-get -y upgrade

# phpenv インストール
curl -L https://raw.githubusercontent.com/phpenv/phpenv-installer/master/bin/phpenv-installer | bash
```

インストール後のメッセージに従い.bash_profileに設定を追加する。

```bash
WARNING
 |  # Seems you still have not added 'phpenv' to the load path.
 |  
 |  # Load phpenv automatically by adding
 |  # the following to ~/.bash_profile:
export PHPENV_ROOT="/home/your_user_name/.phpenv"
if [ -d "${PHPENV_ROOT}" ]; then
  export PATH="${PHPENV_ROOT}/bin:${PATH}"
  eval "$(phpenv init -)"
fi
```

```bash
# メッセージに従い、.bash_profile に上記を追加
vi ~/.bash_profile
# profile再読込
source ~/.bash_profile 


# バージョンを表示して利用できることを確認
phpenv -v

# phpのビルドに必要なライブラリ等のインストール
sudo apt -y install build-essential

sudo apt -y install libxml2-dev libssl-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libmcrypt-dev libreadline-dev libtidy-dev libxslt-dev autoconf

# 参考サイトで足りないものを追加
sudo apt-get install zsh zsh-dev
sudo apt-get install curl
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install git
sudo apt-get install pkg-config
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
sudo apt install libonig-dev
sudo apt install libzip-dev
# composer で使うのでついでに
sudo apt install php-cli php-mbstring unzip

# php-buildによるビルドを複数スレッド使って高速化する
export PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4
```

# バージョンを指定して php をインストールしたり切り替えたりする

## 参考記事

https://qiita.com/suisuina/items/7a4a273d506a5b71e37b

```bash
#インストール可能なバージョン確認
phpenv install -l

#インストール
phpenv install {version} 

#インストールバージョン確認
phpenv versions

# 全ディレクトリで使うバージョンを指定
$ phpenv global {version} 

# カレントディレクトリのみで使うバージョンを指定
$ phpenv local {version} 

# hashの更新
$ phpenv rehash

# 現在のバージョン確認
$ php -v
```


# phpenv install -l で最新のPHPバージョンが見当たらない

下記コマンドでリストを更新する

```bash
$ phpenv update
```

# 参考

https://qiita.com/ryo-endo/items/0e689e02cb87e09f4c7a
gnuplot メモ

# gnuplotメモ

久々に使うと絶対に忘れているので、思い出す用のメモ。
随時追加していきます。

## 設定

### セパレータ変更

```
gnuplot> show datafile separator
        datafile fields separated by whitespace
---
gnuplot> set datafile separator ","
```

### 日付

```
gnuplot> show timefmt
        Default format for reading time data is "%d/%m/%y,%H:%M"
---
gnuplot> set xdata time
gnuplot> set timefmt "%Y/%m%d %H:%M:%S"  # as 2022/01/02 01:23:45
```

### 図のラベル

```
gnuplot> show xlabel
        xlabel is "", offset at (character 0, 0, 0) textcolor lt -1
gnuplot> show ylabel
        ylabel is "", offset at (character 0, 0, 0), rotated by -270 degrees in 2D plots textcolor lt -1
---
gnuplot> set xlabel "Date"
gnuplot> set ylabel "DiskFreeSpace[GB]" 
```

### レンジの変更

```
gnuplot> show xrange
        set xrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
gnuplot> show yrange
        set yrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
---
gnuplot> set xrange ["1/1/1970 00:00":"2/1/1970 00:00"]
gnuplot> set yrange ["0":"1000"]
```

## 描画

### 直線を書く

```
gnuplot> fConstLine(x)=10
gnuplot> plot fConstLine(x) with lines  # (x=10の線を引く)
```

### メモリ

```
gnuplot> show xtics format
...
          labels are justified automatically, format "% h" and are not rotated,
...
---
gnuplot> set xtics format "%m/%d %H:%M"
```

# オプション値

## timefmt

- %Y/%m/%d
- %H:%M:%S
- %B -> 月名(December)
- %b -> 月名の3文字省略(Dec)
- %j -> 1年の何日目か(1-365)
- %s -> 1970/01/01 00:00:00 からの秒数
マーケティングビジネス実務検定B級を受けてみた

# はじめに
この記事はマーケティングビジネス実務検定B級受験したい、
勉強内容がよくわからないから参考情報がほしい、
そんな方に参考になるよう、どのような勉強を実践したかの備忘録です。

# 前提
- マーケティング知識はほぼゼロ
- マーケティング関連の書籍を興味本位で読んだことがあるレベル

# 使用したテキスト
- [アドバンス マーケティング・ビジネスハンドブック〈改訂2版〉](https://www.marke.jp/prepforexam/8790.html)

# 結果
- なんとか合格
- 試験結果、点数の詳細は確認できない
- 試験後、メールでダウンロード期間が指定された解答集のリンクが送られてくる
- おそらく合格ギリギリのラインだと思う


# 勉強期間・時間
- 1ヶ月
- 平日1～2時間、土日1～3時間



# 勉強方法
公式テキストのみを使用
勉強順序としては、
1. テキスト全体を確認程度に読む(1週間)
1. テキスト内容が14章あるため、各章を読み込む(1週間半)
1. 各章末に練習問題があるので、その問題を解き、わからなかった点を見直す(3～4日)
1. マーケット用語や文脈の要点をしぼりながら、再度テキストを復習


# 1. テキスト全体を確認程度に読む
まずやったことは、ざっとテキストに目を通しました。
マーケティングに関して０知識なので、とにかくマーケティング業界、用語を目にしなければいけないと考え、何も考えずテキストを読みました。
正直この作業が面倒だったかなと。
知らない情報、用語がたくさんでてくることに加え、書籍のボリュームがあるので軽く目を通すだけでも流れをつかむのに苦労しました。
気合いです。


# 2. テキスト内容が14章あるため、各章を読み込む
全体の長れ、理解を分割する作業。
各章を読み込むことで、マーケティング知識の輪郭をつかむイメージです。
時間をかけて読み込むことで、各章の用語、業界知識の理解を深めました。
テキスト全14章と結構量があるので、1週間半ほど学習に時間がかかっています。


# 3. 各章末に練習問題があるので、その問題を解き、わからなかった点を見直す
各章末に練習問題があるので、その問題を解きます。
個人的にはこの作業が一番重要で、問題の傾向、
知識の不足を認識し、足りないインプットが何か把握できたことが良かったです。
問題形式としては選択問題、〇×問題がほとんどです。

# 4. マーケット用語や文脈の要点をしぼりながら、再度テキストを復習
復習の作業。
練習問題を実施し、どのように問題が出題されるか想定しながらの再学習になります。
マーケティング用語の再確認、文脈の要点を考えながらのインプットを実施していきます。

# 試験を受けてみて
上記の学習内容でいざ試験を受けてみての感想は、「よく受かったな」というのが第一印象。
理由として、全体の6割問題なし、3割自信なし、1割はわからないという微妙な手ごたえだったからです。
思った以上に回答に迷ってしまい、試験結果に自信はありませんでした。

以下出題形式の抜粋↓

(1)マーケティング知識
問題1　正誤式20題・40点・制限時間30分
問題2　選択式20題・60点・制限時間30分
問題3　語群選択式15題・60点・制限時間15分
問題4四答択一式10題・40点・制限時間15分

(2)マーケティング事例
問題1　正誤式20題・40点・制限時間30分
問題2　選択式5題・20点・制限時間10分
問題3　四答択一式5題・20点・制限時間10分
問題4　語群選択式5題・20点・制限時間10分


# 反省点
マーケティング用語説明のインプット・復習の時間をもう少し作るべきでした。
うる覚えと感じる問題が多く、テキストの細かい説明まで頭に入っていれば試験内容に余裕をもてたと思います。
勉強時間そのものを増やさなければいけなかったのかもしれません。
学習にお金をかけられる方は、練習問題テキスト購入がおすすめです。([こちら](https://www.marke.jp/item/materials))
どのような知識が不足しているか再確認できると思うので。
何とか合格できたのが幸いでした。

# 終わりに

効率的というよりかは地道なインプットが求められる学習でした。
これから試験を受けられる方のお役に立てれば幸いです。
お読みいただきありがとうございました。
JavaScriptで配列同士を比較して、重複・差分データを抽出する方法

## はじめに
JavaScriptでオブジェクトの配列同士の比較で詰まったので、備忘録として残します。
ベストな方法ではないかもしれませんが、1つのやり方として誰かの参考になればとも思います。

## やりたいこと
以下の二つの配列があったと仮定する。
「expense1」と「expense2」で重複するデータだけ抽出したい。
```javascript:main.js
const expense1 = [
  { name: '住居費', const: 50000 },
  { name: '水道光熱費', cost: 10000 },
  { name: '保険料', cost: 20000 },
  { name: '通信費', cost: 12000 },
  { name: '美容費', cost: 8000 },
];

const expense2 = [
  { name: '住居費', const: 50000 },
  { name: '教育費', cost: 15000 },
  { name: '水道光熱費', cost: 10000 },
  { name: '交際費', cost: 9000 },
  { name: '雑費', cost: 3000 },
];
```

## 使用するメソッド
- filterメソッド
  配列から条件に一致した要素のみを抽出し新しく配列を作成。

- findメソッド
  配列から条件に一致した"最初の値"を返す。
  複数ある場合は最初にマッチした要素を返す。

## 重複したデータのみ抽出

```javascript:main.js
const arrayComparison = (expense1, expense2) => {
  const duplication = expense1.filter((cost1) => {
    console.log(cost1) //expenseItem1の中身を1つずつ取り出す
    //{name: '住居費', cost: 50000}
    //{name: '水道光熱費', cost: 10000}...etc
    return expense2.find((cost2) => {
     console.log(cost2) //expenseItem2の中身を1つずつ取り出す
    //{name: '住居費', cost: 50000}
    //{name: '教育費', cost: 15000}...etc
      return cost2.name === cost1.name; //nameが同一の最初の要素を返す
    });
  });
  return duplication;
};
```
結果↓
```javascript:main.js
[
  { name: '住居費', const: 50000 },
  { name: '水道光熱費', cost: 10000 },
];
```
ちなみに、省略して記述する方法は下記の通り
```javascript:main.js
const arrayComparison = (expense1, expense2) => {
  const duplication = expense1.filter((cost1) =>
    expense2.find((cost2) => cost2.name === cost1.name)
  );
  //結果は上記の通り
};
  );
```

## 差分データのみ抽出
上記を応用して差分データのみを抽出する方法

### 追加で使用するメソッド
- mapメソッド
  配列のデータを加工して新たな配列を作成。

- includesメソッド
  配列や文字列の中から特定の要素、文字列が含まれているかチェック。

## 差分を抽出する関数
```javascript:main.js
const arrayComparison = (expense1, expense2) => {
  const duplication = expense1.filter((cost1) =>
    expense2.find((cost2) => cost2.name === cost1.name)
  );

  const duplicationName = duplication.map((cost) => {
    return cost.name;
  });  //duplicationからnameデータだけ抽出した配列を作成
       //['住居費', '水道光熱費']
  
  const expenseDiff = expense1.filter((cost) => {
    return !duplicationName.includes(cost.name);
  });
  // expense1内にduplicationNameが含まれていないデータのみを抽出

  return expenseDiff;
};
```
結果↓
```javascript:main.js
[
  {name: '保険料', cost: 20000}
  {name: '通信費', cost: 12000}
  {name: '美容費', cost: 8000}
];
```
Python,Ruby,PHP,Java,JavaScript,Perlのライブラリ・モジュールの比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのライブラリ・モジュールの比較

# Python

https://qiita.com/ryuichi1208/items/cb5f850a9811d2a4bc3a

# Ruby

https://qiita.com/sugamaan/items/d7871da28c0160b69609

# PHP

https://qiita.com/mikakane/items/2719df714df5b3fc6adf

# Java

https://qiita.com/haruto167/items/162551100449ea5c7e6d

# JavaScript

https://qiita.com/Nako4/items/1d8eaf731bf4370b84a7

# Perl

https://perlzemi.com/blog/20091116124667.html
【Flask】url_forを使用して画像ファイルを表示する方法

Flaskのurl_forを使用して画像を表示する方法を紹介します。

## ディレクトリ構成

今回例として使用するディレクトリ構成は以下のようになってます。

```bash
flask$ tree .
.
├── __pycache__
│   └── func.cpython-310.pyc
├── main.py
├── static
│   ├── images
│   │   ├── default.png
│   │   ├── home.png
│   │   └── logo.png
│   ├── js
│   └── style
│       └── style.css
└── templates
    ├── index.html
    └── layout.html

9 directories, 18 files
```

static/images/default.pngファイルを表示するやり方を記載します。

## static配下を使用するためには

今回、cssファイルやjsファイル、imageファイルはstaticディレクトリ配下に入れています。
こちらを使用するために、main.pyに以下を記載します。

```python:main.py
app = Flask(__name__, static_folder="./static/")
```

これによりmain.pyを実行するとurl_forでstaticを指定した際に、
static配下を使用することができるようになります。

## url_forを使用して画像ファイルを表示する方法

index.htmlは以下になります。

```html:index.html
<ul>
  <li>
    <a href="{{ url_for('aaa')}}">
      <img src="{{ url_for('static', filename='/images/default.png')}}" alt="">
      <p>aaa</p>
    </a>
  </li>
  <li>
    <a href="{{ url_for('bbb')}}">
      <img src="{{ url_for('static', filename='/images/default.png')}}" alt="">
      <p>bbb</p>
    </a>
  </li>
  <li>
    <a href="{{ url_for('ccc')}}">
      <img src="{{ url_for('static', filename='/images/default.png')}}" alt="">
      <p>ccc</p>
    </a>
  </li>
</ul>
```

url_forを使用している以下部分になります。

```html
<img src="{{ url_for('static', filename='/images/default.png')}}" alt="">
```

これによりstatic配下のimages/default.pngを表示することができます。

ちなみにこちらをChromeの検証ツールで覗いてみると以下のようになります

```html
<img src="/static/images/default.png')}}" alt="">
```

純粋にHTMLで記述すると上記のようになります。

staticを指定することでcssやimageファイルがバラバラになることがないのが、
良い点かと思います。
VS Codeでgitのリポジトリが表示されない

## TL;DR

`Ctlr+Shift+U`（macは`Shift+Cmd+U`）を押して、出力ペインから`Git`を選択して表示されている`safe.directory`設定を行うんだ…！

```sh
git config --global --add safe.directory c:/git_repos/repo_dir
```

![Visual_Studio_Code-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76242/ddb68004-dd2e-11e7-405f-d8316393a785.png)


## 想定している状態

PCをクリーンインストールまたは新しく買ってきた場合、ホームディレクトリ内に`.gitconfig`ファイルがなく、VS CodeのGit自動実行時にカレントディレクトリがセーフディレクトリ指定されていないことがあります。
VS Codeで`.git`ディレクトリが含まれるディレクトリを開いてもリポジトリがあると認識してもらえません。

このとき、VS Codeの出力ペインの`Git`の出力を見ると、次のような出力が確認できます。

```sh
[2022-09-07T22:49:11.156Z] fatal: detected dubious ownership in repository at 'C:/git_repos/repo_dir'
To add an exception for this directory, call:

	git config --global --add safe.directory C:/git_repos/repo_dir
```

## 対処法

素直に出力に表示されているコマンドを実行します。その後、VS Codeを閉じて起動し直すとセーフディレクトリ設定が反映され、リポジトリとして認識されます。

```sh
git config --global --add safe.directory C:/git_repos/repo_dir
```

## 設定の確認

ホームディレクトリにある`.gitconfig`に、セーフディレクトリ登録したリストが表示されているのでそれを目視できます。

```config:~/.gitconfig
[user]
	name = your_user_name  # git config --global user.name で表示されるもの　
	email = 12345678+your_user_name@users.noreply.github.com　　# git config --global user.email で表示されるもの
[safe]
	directory = C:/git_repos/repo_dir     # さっきのコマンドで登録したもの
    directory = ...                       # 登録した数だけ列挙される
```

ちなみに、コマンドを実行しなくてもこの`~/.gitconfig`の`[safe]`以下をエディタで編集してもセーフディレクトリ設定は有効になります。

## 参考リンク

- [git config --global --add safe.directory '...' が出たとき - Qiita](https://qiita.com/RoaaaA/items/2ca93e2ea585b321f777)
Raspberry Pi OS 2022-09-06 Release-note 翻訳

(追記: 2022/9/26にRaspbian OS 2022-09-22がリリースされています)
https://qiita.com/utaani/items/9031f76362d01fdc2e05

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

2022-09-06:
 - lxpanel - テキスト検索付きの新しいメイン メニュー プラグイン
 - lxpanel - マイク音量と入力選択が付いた新しい個別のオーディオ入力プラグイン
 - lxpanel - wifi および bluetooth プラグインを開くためのキーボード ショートカットを追加
 - lxpanel - 通知の表示が、起動直後とそれぞれの通知間で、短い遅延で表示されるように
 - rc_gui - 有効なホスト名のみを設定できるように
 - piwiz - ユーザー名として「root」を使用できなくなりました
 - gtk3 - 描画後にメニューのサイズを変更できるようになりました
 - raspi-config - dhcpcd と Network Manager を切り替えるオプションを追加
 - lxpanel - Network Manager と互換性のある新しいネットワーク プラグインを追加
 - piwiz - Network Manager との互換性を追加
 - バグ修正 - デスクトップ アイテムがマウント解除されたとき、ファイルマネージャーが 100% の CPU 使用率になる問題
 - バグ修正 - ウィンドウ マネージャーがインターナショナル キーボード レイアウトの切り替えを妨げていた問題
 - バグ修正 - システム トレイの再描画がより堅牢に
 - バグ修正 - さまざまな lxpanel プラグインで翻訳が表示されない問題
 - バグ修正 - アップデータ プラグインが x86 イメージで失敗する問題
 - バグ修正 - rfkill でブロック解除されたときに Bluetooth ハードウェアの電源を強制的にオンにする問題
 - バグ修正 - rc_gui のメッセージ ボックスが正しく中央に配置されない
 - バグ修正 - Wayland と X11 間のセッションの切り替えがより堅牢に
 - バグ修正 - raspi-config での ALSA デバイスの切り替えがサードパーティ デバイスと互換性を持つように
 - NetworkManager をインストール (デフォルトでは無効)
 - フル イメージに OpenJDK 11 ではなく OpenJDK 17 をインストールする
 - picamera2 をインストール
 - metadata_csum オプションを使用してrootパーティションをフォーマットできるように
 - bootパフォーマンスのフォーマットをクラスタごとに 4 セクタとし、性能を少し向上
 - bootパーティションから「フラッシュ」マウント オプションを削除
 - Raspberry Pi ファームウェア 48cd70fe84432c5d050637b61e4b7b9c831c98bf
 - Linux カーネル 5.15.61
LPC812MAXのPWMを使う(1)


x mbed2リビジョン144
x リビジョンの変更ができる人むけ




目的
使ってみたかった
LED等を繋げる
sg90でためしていないけど


![o_con727.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fbf31548-77f1-9c05-9c6d-dab4558ed3c5.jpeg)


![o_con728.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0a060f6c-d893-cc54-bc6a-913c861f405c.jpeg)





```c++


//PWM_SG90_812_1

#include "mbed.h"

//data SG90
// 2400us 2.4ms
#define s_max  2400
// 500us 0.5ms
#define s_min  500
#define s_r    (2400-500)
#define s_c    ((2400-500)/256)
#define SN(n6) (500+(((2400-500)/256)*n6))

//PWMのピンの設定
PwmOut servo(P0_16); //812

//RED LEDの設定
DigitalOut myled(P0_7); //812

//メイン関数
int main()
{

    //周期の設定
    servo.period_ms (20); // servo requires a 20ms period

    int offset = 127; //センターへ設定　1.450ms

    servo.pulsewidth_us( SN(offset) ); //センターへ移動

    //無限ループ
    while(1) {

        myled = 1;       //RED LED OFF
        //250ミリ秒まつ
        wait_ms(250);

        myled = 0;       //RED LED ON
        //200ミリ秒まつ
        wait_ms(250);

    }//while

}//main



```


![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37e04221-6468-bab6-0016-c488655c1c0a.jpeg)



-15-
The Build Custom Theme Layout experience for Experienced Sites 


# There was an unhandled exception. Please reference ID: PPUFAAGG. Error: Restforce::UnauthorizedError. Message: INVALID_SESSION_ID: Session expired or invalid.  Here are some notes; 


Actually from the above Developer Link Provided; the Solution by Jakub Burkiewicz 20 is as follows;  

+ Launch your Org
+ Configure credentials with the "Get Your Logins Credentials" tab in the "Playground Starter" app
+ Go to the "Hands-on" Orgs page in your Trailhead account (link in dropdown available when you click on your name/avatar)
+ Click the "Connect Org" button
+ Login to Org with your credentials from step 1
+ Check if you can launch Org from the new connection - if it works (you don't want to lose your data and code), you can remove the old connection

This has worked on my end I have been able to Verify my Challenge and it has worked. 

実際には、提供された上記の開発者リンクから; Jakub Burkiewicz 20 による解決策は次のとおりです。

+ 組織を立ち上げる
+ 「Playground Starter」アプリの「Get Your Logins Credentials」タブで資格情報を構成します
Trailhead アカウントの「ハンズオン」組織ページに移動します (自分の名前/アバターをクリックすると、ドロップダウンのリンクが表示されます)。
+ 「組織の接続」ボタンをクリックします
+ ステップ 1 の資格情報を使用して Org にログインします。
+ 新しい接続から Org を起動できるかどうかを確認します。動作する場合 (データとコードを失いたくない場合)、古い接続を削除できます。

これは私の課題を検証することができ、うまくいきました。

[I am working on the Build Custom Theme Layout experience for Experienced Sites in #TrailheadChallenge and run into an Error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdMgH)
DirectShowで動画再生

# 実行環境
Visual Studio2019 C++
Windows10
# DirectShow
DirectShowは、Microsoft Windowsのメディア ストリーミング アーキテクチャであり、高品質のビデオとオーディオの再生またはキャプチャを実行できる。
# 動画再生
**追加依存ファイルに「Strmiids.lib」を設定。**
![Strmiids.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/fb48cab4-792a-1633-e01a-18b21ac7dfff.png)
**コード**
```C++:main.cpp
#include <dshow.h>

int main(void)
{
    IGraphBuilder* pGraph = NULL;
    IMediaControl* pControl = NULL;
    IMediaEvent* pEvent = NULL;

    //COMライブラリを初期化。
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return 0;
    }
    //FilterGraphManagerを作成。
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder, (void**)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return 0;
    }

    //FilterGraphManagerにクエリを実行して、フィルターグラフを作成。
    //IMediaControlはストリーミング再生を制御する。
    hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
    //IMediaEventはGraphManagerからのイベントを取得するためのメソッドがある。
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
    //指定したファイルを再生するためのフィルターグラフを作成。
    //第一引数にファイル名、第二引数はNULLでよい。
    hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
    if (SUCCEEDED(hr))
    {
        //フィルターグラフを実行(動画再生)。
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            long evCode;
            //動画再生が完了するまで待機。
            pEvent->WaitForCompletion(INFINITE, &evCode);

        }
    }
    //各ポインタを解放。
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    //COMライブラリを解放。
    CoUninitialize();
    return 0;
}
```
**mp4ファイル再生には対応していない。**
**ファイルによっては、ノイズが発生したりする。**
# 参考
[Microsoft公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/win32/directshow/directshow)
LPC812MAXで周波数を作てみた。(約1khzぐらい)(PWM利用)


x mbed2リビジョン144
x リビジョンが変更できる人むけ


目的
だいたい1khzを作った


秋月で一番安いPCオシロ


![o_con726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bfc0ca07-9b54-91a2-f568-eee60b5b8fb5.jpeg)




![o_con725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/17524b9f-0219-deff-62e8-70543b57762f.jpeg)



参考

https://os.mbed.com/users/okini3939/notebook/PwmOut_jp/



```c++


//PWM_generator_812_1

#include "mbed.h"

//1khzの時は、1000と設定
#define XHZ (1000)
#define XHZ_A  (1000000/XHZ)
#define XHZ_B ((1000000/XHZ)/2)

//PWMのピンの設定
PwmOut servo(P0_16); //812

//RED LEDの設定
DigitalOut myled(P0_7);

//メイン関数
int main()
{

    //周期の設定
    servo.period_us(XHZ_A);

    //間隔の設定
    servo.pulsewidth_us(XHZ_B);

    //無限ループ
    while(1) {

        myled = 1;       //RED LED OFF
        //250ミリ秒まつ
        wait_ms(250);

        myled = 0;       //RED LED ON
        //200ミリ秒まつ
        wait_ms(250);

    }//while

}//main




```



![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d49b4729-224c-f268-2371-b874747155d7.jpeg)


-14-
ステージの内容を見る

# ステージの状態を表示する
```
git ls-files
```
```ステージの内容を確認```することができる

```
git ls-files -s
```
```-s```のオプションをつけると詳細な情報が表示される。
```ファイルの名前```と```ステージされたファイルのハッシュ値```が表示される。

```
git show ハッシュ
```
ファイルのハッシュ値を指定すると```ステージの内容を確認```することができる。

# 演習
```
**************@mbp **** % git ls-files -s
100644 **************************************** 0	.gitignore
100644 **************************************** 0	.ruby-version
100644 **************************************** 0	20220418.md
100644 **************************************** 0	20220419.md
100644 **************************************** 0	20220420.md
.
.
.
100644 **************************************** 0	tmp/storage/.keep
100644 **************************************** 0	vendor/.keep
```
たくさんステージにあったコミットしていなかった。

```
***********o@mbp training % git show *******
Hello!
I am a student.
hogehogehogehoge!!
hogehoge!!
```
できた。

これからもコツコツ頑張ろう。
MCC(マシューズ相関係数)を求める(SPSS Modeler データ加工逆引き8-4)

# MCC(マシューズ相関係数)を求める（混同行列）

![スクリーンショット 2022-08-14 8.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4b47cd98-c24f-b812-e61b-23d95d2e8568.png)

## 1.想定される利用目的

・予測モデルの性能評価
・実装後のモデルメンテナンスのための性能指標の算出

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/mcc.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-14 8.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0ff59fcf-0dae-63a8-f0df-7784fdf2675f.png)

a.入力するデータは以下の通りです。故障有無とその予測の2列のデータです。
![スクリーンショット 2022-08-12 11.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/833c5174-cdd7-ff80-f384-4c8de52da9b3.png)

b.[レコード集計]ノードを編集します。
![スクリーンショット 2022-08-14 8.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/815d8492-d7fe-645c-6c75-c94b635735d1.png)

[プレビュー]します。混同行列(Confusion Matrix) になるようにラベリングします。
![スクリーンショット 2022-08-14 8.56.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/91642fca-c76d-4e05-4cc5-25c44272db39.png)

c.[フィールド作成]ノードを編集します。[派生]モードを[名義型]にします。
![スクリーンショット 2022-08-13 17.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5e133fe4-8cfb-29eb-ae2c-23292d5c931d.png)

[プレビュー]します。
![スクリーンショット 2022-08-13 17.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d77ba603-fdc6-8389-1ac4-6f9af489cb8f.png)

d.[行列入替]ノードを編集します。
![スクリーンショット 2022-08-14 8.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e8a092c8-64f1-3c5d-c542-014c8a7e5c64.png)

[プレビュー]します。
![スクリーンショット 2022-08-14 8.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d2c272ee-32fe-be65-e672-7a5082d3bcc2.png)

e.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-08-14 8.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/23e11d0b-047f-0287-1a01-ef6fb7ce59d6.png)

[プレビュー]します。MCCが求められました。
![スクリーンショット 2022-08-14 9.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f543b41-2793-335b-efab-1280cb23e20e.png)

#### 注意事項

TNを考慮しない適合率と再現率を利用するF1スコアに対して、不均衡の陰性に感度が高いと言われています。業務視点で利用を検討してください。相関係数であるため1から-1の範囲をとり0が最も低いスコアになります。

## 4.参考情報

#### モデルの性能指標について解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-04/

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-09/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【Live2D】ワープデフォーマのサイズを変更する

Ctrlを押しながらワープデフォーマの縁をドラッグ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/0f3e728d-d620-2f58-bbbd-1862fbc2a94a.png)
例えばこのデフォーマが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/664389e8-1b29-3d91-e2aa-cc99ff287851.png)
パラメータ次第では親になっているワープデフォーマから突き出すとチュートリアルでも言われている通り良くないことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/cfbf7034-47e9-8d2b-5951-7b58c8f188d1.png)
Ctrlを押しながら赤枠のポッチをドラッグし、最も広がった状態でも収まるようにサイズ変更を行うことで調整できます。
Sambaを導入しフォルダ共有する

*Samba*を用いて、*Windows*と*Linux*の間で(~~ゆるゆるの設定で~~)フォルダ共有をするための方法について、至極簡単にまとめました。

*Ubuntu 22.04LTS*の環境で行いました。なお、*Samba*は**LAN内のみ**で運用してください。

なお、当然ですが、

```
sudo apt update && sudo apt upgrade -y 
```

を行い、基本的なアプデは事前に完了してください。


## Sambaのインストール

```
sudo apt install samba
```
としてください。基本、これだけです。


## 共有フォルダの作成

次に、_共有するためのフォルダ_、を作らないといけませんよね。


まず、

```
cd /
```
で一番上の階層に行ってから、

```
sudo mkdir /KyoyuFolder/
```

として、フォルダを作ってください(後述しますが`home/`以外ならどこでもいい？みたいですが、深い階層にはフツ〜はしませんよね、普通ね)。

次に、通常NAS的に用いる場合は他のパソコンからの読み書きをすべて許可するハズなので、`KyoyuFolder/`において、

```
sudo chmod -R 777 .
```

としてフルに読み書きの権限を与えるようにしてください。次に、

```
ls -l
```

などをして権限が*drwxrwxrwx*になったことを、確認しておいてください。

下記が確認例です。

```
drwxrwxrwx  2 root root     4096  9月  8 23:53 KyoyuFolder/
```

## smb.confの設定

まず
`home`ディレクトリについてですが、通常は非公開の設定にするはずですよね。

なので当然ですが、`/home/yohyasushi`なんかに共有フォルダとか作ったら見えません。しやめたほうがいいです、そういうことは。

なので、

```
;[homes]
;   comment = Home Directories
;   browseable = no
```

は**no**のままにしておいてくださいね、ここ要注意。

*smb.conf*は、

- Global Settings
- Authentication
- Domains
- Misc
- Share Definitions

のパートに別れ、今回主にいじるのは*Share Definitions*の部分のみです。

*Samba*の設定は基本的に*smb.conf*に記載していきます。

```
/etc/samba/smb.conf
```
を管理者権限でもって開いてください。

そして末尾に、

```
[share]
path = /KyoyuFolder
public = yes
browseable = yes
read only = no
guest ok = yes
writable = yes
create mask = 0777
directory mask = 0777
```

を書き込んでください。`path = `へ入力する値は、当然ですがフォルダ設定により異なってきますよ。

ここで私がドツボにハマったのが、`create mask = 0777` と `directory mask = 0777` を書けていなかったために、**下層にファイルやフォルダを持つフォルダごとコピーできなかった**、でした。

`KyoyuFolder/`の階層に単発で`text.txt`なんてのは他のパソコンからでも書き込めるのですが、なぜか深くなるとだめ。

それにたいして、上記の2行の書き込みが必要でした。要注意です。

*smb.conf*をいじったあとの構文チェックは、

```
sudo testparm
```
で行ってください。

## Sambaの再起動など

その後、*Samba*の再起動を

```
sudo systemctl restart smbd nmbd
```

などとして行ってください。

システム起動時に*Samba*も自動的に起動させたいでしょうから、

```
sudo systemctl enable smbd nmbd
```

を当然、行ってください。

正常に手順が終了していたら、他のパソコンからファイルの読み書きができるはずです。


## Windowsパソコンからのアクセスについて

タスクバーに、

```
\\nuc-ubuntu
```

などと入れてください。私の環境では、*nuc-ubuntu*が共有フォルダを構えた端末名です。*Windows*の環境では、バックスラッシュじゃなくって￥マークになりますが、意味は同じです。注意してください。

以上です。


## 主な参考文献

[Ubuntuサーバー徹底入門   中島 能和](https://www.amazon.co.jp/dp/4798155764/)
【環境設定】JupyterLabのテーマをDarkにする方法（画面を黒くする方法）

## 背景
- JupyterLabのテーマはデフォルトLightで明るくて目が痛い。
- JupyterLabの画面を黒くして目に優しい環境で開発をしたい。

## 目標
- JupyterLabのテーマをDarkにする。

## JupyterLabのテーマをDarkにする方法
### 1. JupyterLabを起動する。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/f38e779c-b395-541b-418c-449ab3bc80d9.png)

### 2. 上部のタブからテーマを変更する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/5100e491-414a-2b86-16af-b06d3e536e5c.png)

### 3. テーマがDarkになり目に優しい黒を基調とした画面になる。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/bc371115-ac5c-66ad-b0f1-5c801130fa7f.png)

## 参考資料

## 個人ブログ
https://takuma-tech.com/2023/01/09/359/
べき乗・べき根・対数の整理メモ (JavaScript)

数学よわよわ村の民でlogがいっつもごちゃるのでほぼWikipediaコピっただけ 間違ってたら教えてほしいです

# 冪乗(べきじょう): exponentiation

$$
\Huge{🌱^🕒= 🌳}
$$

$$
\large{底^{指数} = 冪}
$$

- 🌱: 底 (base)
- 🕒: 指数 (exponent)
- 🌳: 冪 (power)

$$
5^2 = 5 \times 5 = 25
$$

```js
const base = 5;
const exponent = 2;
const power = base ** exponent; //=> 25

// const power = Math.pow(base, exponent); //=> 25 (同じ)
```

- 指数関数(exponential function) とも呼ぶ
- 指数が自然数のとき **累乗(るいじょう)** と呼ぶ
- 指数が2のとき **平方(square)** と呼ぶ (面積 $m^2$ でお馴染み)
- 指数が3のとき **立方(cube)** と呼ぶ (体積 $m^3$ でお馴染み)
- 底がネイピア数 $e$ のとき **自然指数関数(natural exponential function)** と呼ぶ
  ($e^n$) ($\exp n$) (`Math.exp(n)`)
  「指数関数」のみで「自然指数関数」を指すこともある

ネイピア数 $e$ が何かは説明できるほど分かってないので数学大好き村の民に聞いてください

# 冪根(べきこん): nth root

$$
\huge{\sqrt[ 🕒 ]{ 🌳 } = 🌱}
$$

$$
\large{\sqrt[次数]{被開平数}=冪根}
$$

- 🌳: 被開平数 (radicand)
- 🕒: 次数 (degree)
- 🌱: 冪根 (root)
- $\sqrt{}$: 根号 (radix, radical sign)

$$\sqrt[2]{25} = 5$$

```js
const radicand = 25;
const degree = 2;
// const root = radicand ** (1/degree); //=> 5
// この方法だと小数点計算の誤差が多発する
// 次数が2ならMath.sqrt, 次数が3ならMath.cbrtを使うべき

const root = Math.sqrt(radicand); //=> 5 (平方根)
```

- 冪乗根(べきじょうこん)とも呼ぶ
- 次数が自然数のとき **累乗根(るいじょう)** と呼ぶ
- 次数が2のとき **平方根(square root: sqrt)** と呼び、次数は通常省略する ($\sqrt{x}$) (`Math.sqrt(n)`)
- 次数が3のとき **立方根(cubic root: cbrt)** と呼ぶ ($\sqrt[3]{x}$) (`Math.cbrt(n)`)

# 対数: logarithm

$$
\Huge{\log_🌱{🌳} = 🕒}
$$
$$
\large{\log_底{真数} = 対数}
$$

- 🌳: 真数 (anti-logarithm)
- 🌱: 底 (base)
- 🕒: 対数 (logarithm)

$$
\log_{5}{25} = 2
$$

```js
const anti = 25;
const base = 5;
const logarithm = Math.log(anti) / Math.log(base); //=> 2
// Math.log(anti) は 底がネイピア数eの自然対数
// 底が2ならMath.log2(anti)、底が10ならMath.log10(anti)が用意されてるのでそちらを使う
```

- 底はしばしば省略され、$e$ や10となっていることが多い (どこかに明記されるはず)
- 底が $e$ のとき **自然対数(natural logarithm)** と呼ぶ ($\ln n$) (`Math.log(n)`)
- 底が10のとき **常用対数(common logarithm)** と呼び、数値の桁数を数えるのに使える
  `Math.ceil(Math.log10(12345)); //=> 5`
- 計算量の計算で$O(\log N)$と書いた場合など、情報科学では底2とすることが多いらしい
  二進数の桁数を数えるときにも使える
  `Math.ceil(Math.log2(0b10101)); //=> 5`

何でそうなるかは説明できるほど理解できてないのでWikipediaや数学大好き村の民に聞くこと

## 冪根の`root = radicand ** (1/degree)`って何なの

(たしか結城先生の本かなんかで読んだ気がすることをうろ覚えで書く)

$x^n$ の指数 $n$ について
$n$ が1増えると $x$ をかける回数が増える
$n$ が1減るなら $x$ をかける回数が減る、ではなく、$\frac{1}{x}$をかけていると考えてみる

$x^3 = x \times x \times x$
$x^2 = x^3 \times \frac{1}{x}$
$x^1 = x^2 \times \frac{1}{x} = x$
$x^0 = x^1 \times \frac{1}{x} = \frac{x}{x} = 1$

マイナスにも拡張してみる

$x^{-1} = x^0 \times \frac{1}{x} = \frac{1}{x}$
$x^{-2} = x^1 \times \frac{1}{x} = \frac{1}{x^2}$
$x^{-3} = x^2 \times \frac{1}{x} = \frac{1}{x^3}$

つまり

$x^{n+1} = x^n \times x$
$x^{n-1} = x^n \times \frac{1}{x}$

じゃぁ次数が $\frac{1}{n}$ とかになったら？

$2^2 = 2 \times 2 = 4$
$2^1 = 2^2 \times \frac{1}{2} = 2$
$\large{2^{\frac{1}{2}} = \Huge{?}}$
$2^0 = 2^1 \times \frac{1}{2} = 1$

# この先は君の目で確かめてくれ！

~~大丈夫？〇通の攻略メモだよ~~
draw.ioを操作するライブラリを書いてみた

## 背景
+ 画面イメージをdraw.ioを作成し、仕様書に手で貼り付けるなど、面倒な作業があったので自動化したかった。
+ 自動化する中で、draw.ioを操作するライブラリを作る必要があった
+ Golangの実践の機会を増やしたかった
## 作ったもの
自動化まではまだ達成できていないが、draw.ioで使われるデータをいじれるようなライブラリを作った。  
このライブラリを使うことで、draw.ioに自動で図形を挿入したり,draw.ioのライブラリを楽に作れるようになる。（使用例は別で記事を作成する予定）[Githubのリンクはこちら](https://github.com/capybara-alt/libdrawio)
```golang:main.go
	// drawioファイルをロードし、MxFile構造体にマッピング
	mxfile, err := libdrawio.NewMxFile("./mxfile_test_1.drawio")
	if err != nil {
		t.Fail()
	}
    
    // MxFile構造体のDiagramの値を取り出す

	// drawioファイルのdiagramタグの値をDecompressメソッドの引数に渡すことで、MxGraphModel構造体にマッピングできる
	mxGraphModel, err := libdrawio.Decompress(value)
	if err != nil {
		t.Fail()
	}

    // MxGraphModelに対して操作をする（図形を挿入など）

	// MxGraphModelをCompressメソッドで圧縮することで、draw.ioで使えるようにする
	compressed, err := mxGraphModel.Compress()
	if err != nil {
		t.Fail()
	}


	// drawioファイルに書き込み
	if err = mxfile.Write("./out.drawio"); err != nil {
		t.Fail()
	}
```

## 追記
同様のライブラリをPythonでも作成した。
[Githubのリンクはこちら](https://github.com/capybara-alt/pydrawio)
エリック・エヴァンスのドメイン駆動設計 2章を読んでまとめてみた

# はじめに
私はエンジニア未経験です。現在はエンジニアへ転職活動中です。
なのでここに記載してあることは一個人の考え方・理解であり、間違っている箇所は多々あります。
とあるきっかけでこの本を買い、読んでいるので、自分なりにまとめていこうと思います。

こちらで1部 １章について記載してあります。
https://qiita.com/Hiyokokeko/items/02f4cc40dfad70dee6a6

# 2章　コミュニケーションと言語の使い方
## この章の課題
**開発者同士やビジネス側でコミュニケーションと言語をどう使っていくか？**
<br>
ドメイン駆動設計はUML（統一モデリング言語）で描かれた図だけじゃない。
モデルを使ったコミュニケーションは色々な幅広い用途で使われている。
例えば、**ドキュメント**であったり、ホワイトボードに描いた**簡素な略図**であったり、
**日常会話**などもモデルは役立つ。

## コミュニケーションがうまくいかない時

ドメインエキスパートと開発者の言葉が違ってくると、間に通訳が必要となってくる。
ビジネスに詳しい開発者に聞けば、そのことがわかったり、逆に
多少開発に詳しいビジネスの人がいて、その人に聞けばなんとかなる場合もあるけど...
それらは通訳側に余計なコストもあるし、誤解を招く場合もある。
　　　　　↓よって
その通訳がいないとチームのコミュニケーションがにぶって、**知識のかみ砕き**ができない。
　　　　　↓そこで出てくるのが
**「ユビキタス言語」**

### ユビキタス言語
ユビキタス言語とは・・・モデルに基づいた言語であり、全員で同じ言葉でコミュニケーションを行うための共通言語である。

ドメインエキスパートと開発者の間や、ドメインエキスパート同士も、開発者同士もコミュニケーションで使うべきである。
それには上記でも書いた、ドキュメントや簡略図や日常会話が含まれる。
言語が使われていけばいくほど、理解もよりスムーズなものになる！

言語を使っていく過程で、意見が食い違ってくるならお互いで新しい言葉を作成するのも！？
まあケースバイケースということで。

言語が変更されたら、クラス図やコードも含めて変更する。
**ユビキタス言語の変更はモデルの変更**という認識をすること。

ドメインエキスパートは理解を伝えるために使いにくかったり、不適切だったら異議を唱える。
開発者は設計を妨害することになるあいまいさや不整合を見逃さないようにする。

## 声に出してモデリングする
- 会話をすることで単語の解釈や意味が違っていることが自然に見つかる。
- 会話をすることでニュアンスを理解し、違いが解消される。

声に出して表現すべきことをより簡単に言う方法を見つけて、それらを図やコードにも反映していく。

## １つのチームに１つの言語
ドメインエキスパートも開発者も同じ言語を使っていこう！

- 開発者だけが知っておけば良い知識（技術用語や技術のデザインパターンなど）
- ドメインエキスパートだけが知っておけば良い知識（設計に出てこない一般的なビジネス用語など）
それぞれの知識はあるけども、共通して同じ意味を持つ言葉があるなら同じ言葉（ユビキタス言語）を意識して使っていきましょうねという考え。

## モデルをどうやって表現するのか
モデルは**図やドキュメント（言語）やコード**で表現できる。
### 図において
メリット・・・コミュニケーションや説明がしやすい
デメリット・・・全てを図にするのは困難である（オブジェクトのふるまいやオブジェクトに対する制約など）

説明のためにはクラス図などUMLだけでなく、視覚的にわかりやすいものを使う。

### ドキュメント（言語）において
メリット・・・図で表現できないことをはっきりと伝えられる
デメリット・・・実態から取り残されてしまうことがある（コードの進化やプロジェクトで使われる言語の進化から）

ドキュメント（言語）は特に注意が必要で、なぜなら古くなりやすいから。
**役に立つドキュメントを最新の状態で保つことが重要**。
そのためには、ドキュメントを最小限にとどめてコードと会話の補足を目的とすること。
そうして、プロジェクトの活動に織り込まれる生きたドキュメントを作成していく。

### コードにおいて
メリット・・・あいまいではない、実際の動作と結びついている
デメリット・・・背景を伝えることが困難、理解がしづらい
<br>
**以上これらのメリットを活かすこと、適材適所で使っていきましょうということ。**

# まとめ
- 1部の中で読んでいてかなり需要な部分だと考える。
- 同じ言葉を使うようになれば、開発されているプロダクトの状況をドメインエキスパートが理解して意見することができる環境ができるのが大事。

次回は3章　モデルと実装を結びつけるを記載したいと思います。
Homebrewでbrew doctorしたらWarning: "config" scripts exist outside your system or Homebrew directories. とエラーが…


こんにちは、`ぺい`といいます！IT業界未経験の初心者エンジニアです。早く戦力になれるように日々学習しています。
macを使っているエンジニアの方は必ず使っているパッケージ管理ツールといえばHomebrewですよね！環境構築の際はこれがないと始まらないくらいの必須ツールですが、頻繁に使っていると気づかないうちに調子が悪くなっちゃうようです。自分もpythonの学習環境を整えるためにHomebrewを使って各種ツールをインストールしてましたが、今回それが原因でエラーが出ちゃいました。

# 1.エラー
ターミナルでbrew doctorを実行したところ、下記のエラーが発生。ちなみにbrew doctorはHomebrewが正常に動作しているかを自動で検証してくれるコマンドです。
````
$ brew doctor
Warning: "config" scripts exist outside your system or Homebrew directories. `./configure` scripts often look for *-config scripts to determine if software packages are installed, and which additional flags to use when compiling and linking.
`````
よく分からんし、作業に支障をきたすほどの異常は出ていなかったのでしばらく放置してましたが、なんか気持ち悪いので解決策を探すことに…(正確に言えばエラーではなく警告っぽい)

# 2.解析
調べてみると、結構同じ現象に苦しんでいる方々が多いらしく、いろんな記事に解決方法が書いてありました。
````
Warning: "config" scripts exist outside your system or Homebrew directories. `./configure` scripts often look for *-config scripts to determine if software packages are installed, and which additional flags to use when compiling and linking.
`````
これは、**Homebrewコマンドの指定PATH先にconfigファイルが複数あるので、システムが混乱する可能性がある**とのことです。で、そのconfigファイルとは何か調べてみると、自分が以前python学習のためにインストールしたpython関係のパッケージ管理ツール等でした。
要するに、Homebrewのコマンドを実行した時に、そのファイルのパスを通っているため、Homebrew君が **おれの通り道にいらんファイル置かんでくれ** と言ってただけでした。

# 3.解決策
原因はわかったので、いよいよ解決したいところです。結論、Homebrewが余計なパスを通らないように**Homebrewの環境変数を設定**すればいいですね。
そこで、環境変数の設定ができる.zshrcに以下のように記入しました。ちなみに、自分の使っているシェルはzshです。bashを使用されている方も多くいらっしゃるので、まず自分がなんのシェルを使っているか確かめましょう。以下のコマンドで調べてください。

````
$ echo $SHELL
#zshの場合下記のように表示される
/bin/zsh

#bashの場合下記のように表示される
/bin/bash
````

自分の使っているシェルがわかったら、環境変数の設定を行います。
**zshの場合は .zshrcに記載**
**bashの場合は .bash_profileに記載**

#### 自分はvimで記入しました。 
````~/.zshrc
#で一番下に記入
alias brew='PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin brew'
````
````~/.bash_profile
#一番下に記入
alias brew='PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin brew'
````
以上です。その後、ターミナを再起動してみましょう。

# 4.確認
````
$ brew doctor
Your system is ready to brew.
````
無事うまく行ったようです。

# 5.最後に
プログラミング学習や業務の際にHomebrewを使って各種パッケージ管理ツールをインストールすることが多いと思いますが、その際にHomebrewの環境がおかしくなる可能性があることを学びました。今回はその解決方法も学べたのでよかったです。
　また、今回初めてQiitaに投稿しました。これから初心者エンジニアとして学習を続け、自分が得た知識を共有していこうと思いますので、皆様どうぞよろしくおねがいします。

# 6.参考記事
1. **[brew doctor したら Warning: "config" scripts exist outside your system or Homebrew directories.と出た時の解決法初心者的理解](https://qiita.com/yutoman027/items/ae11bf22bdbcd645c92a)**
2. **[Homebrewのエラー解消日記](https://qiita.com/sonio/items/9fa4b7aef1174e1bb6fb)**
3. **[【zsh, bash】macでPATHを通す方法 - not found と出てしまったら](https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def)**
(https://qiita.com/yutoman027/items/ae11bf22bdbcd645c92a)**
4. **[【Mac】brew doctorコマンドで「Warning: A newer Command Line Tools release is available」と表示されたときに確認すること](https://zenn.dev/ryuu/scraps/0491e831f729c0)**
5. **[【M1 Mac】anyenvを入れた環境でbrew doctorしたらWarning: "config" scripts exist outside your system...が出た時の対処法](https://zenn.dev/ryuu/scraps/fddefc2ca60f88)**
6. **[.bash_profileと.bashrcのまとめ](https://qiita.com/takutoki/items/021b804b9957fe65e093)**
Rのdevtools::check_win_develで発生したerror reading from connectionはmode="wb"オプションで解決

# Rの`devtools::check_win_devel`で発生した`error reading from connection`は`mode="wb"`オプションで解決
CRANパッケージ作成に向けて、パッケージの事前テストをしたらWinsowsのテスト環境だけで発生するエラーにハマった話。
原因はダウンロードする際のファイル形式にあることがわかった。
## 事象
* ある開発中のRパッケージに対して、`devtools::check_win_devel()`を実行
* 実行結果を確認すると、unix系のテスト環境では発生しなかったエラーが発生していた
### 起きたエラー
```R
Error in load("ファイルパス") : error reading from connection
Calls: "実行したコマンドが書かれている"
Execution halted
```
## エラーを見て考えたこと
* `load()`だしファイルパスのミスでしょ
* `tempdir()`（Rのセッションごとに一時的に作成されるディレクトリ）に`download.file()`したファイルを`load()`してるので、ファイルパスの問題ではないか
* windowsテスト環境におけるRコマンドの実行なので、パスの表記の問題ではないか。スラッシュ、バックスラッシュが適切でないとか？
## 調査結果
* `load`関数でなく、その１ステップ前の`download.file`関数に原因があった。
* このERRORに至るまでのステップを整理すると
```R
download.file("https://以下略、に置いている.RDataファイルのURL", "ダウンロード先のファイルパス")
load("ダウンロード先のファイルパス")
# これ以降ERRORでストップ
```
* このERROR、修正対象は`download.file()`なのにERRORが生じるタイミングが`load()`なのがいやらしかった
* 調べていくと、Windows環境においては`download.file`関数には`mode="wb"`のオプションを付けて、バイナリファイルの転送に対応しないといけないらしい
	* （参考）[R Documentation Download File from the Internet](https://stat.ethz.ch/R-manual/R-devel/library/utils/html/download.file.html)
		* （引用）`Windowsでは、Unix系と異なり、テキストファイルとバイナリファイルを区別し、テキスト転送の場合は \n の行末を \rn (別名 'CRLF') に変更するので、バイナリ転送の選択 (mode = "wb" or "ab") は重要である。`
* 以下の人もWindows環境では`download.file(temp.doc.name, temp.destfile.name, mode = "wb")`にしろって言ってる
	* （参考）[Error in readRDS("<Rds file name here>") : error reading from connection](https://community.rstudio.com/t/error-in-readrds-rds-file-name-here-error-reading-from-connection/11192/9)
	* （参考）[Help with download.file-how to skip over empty urls and save using destfile](https://community.rstudio.com/t/help-with-download-file-how-to-skip-over-empty-urls-and-save-using-destfile/142126)

## 修正結果
* コードを下記の形式に書き換えて
```R
if(.Platform$OS.type == "windows") {
     # download for windows
     download.file("https://においてるファイルのURL",
                   "ダウンロード先のファイルパス",
                   mode="wb")
     } else {
     # download for unix
     download.file("https://においてるファイルのURL",,
                   "ダウンロード先のファイルパス")
     }
load("ダウンロード先のファイルパス")
```
* 再度`devtools::check_win_devel`でテストするとエラーが発生しなくなった
* ちなみにmode="w"がデフォルト値らしいので`else`では`mode="w"`の設定になっているはず。
## メモ
`download.file()`がWindows環境でうんともすんともいわなくなるなら、WindowsOSの場合は`mode="wb"`をデフォルト値にするようにしてくれたらいいのではないかと思った。各自が上記のような修正を加えるのではなく、`download.file`側で修正したほうが全体でみたときにかかるコストが少ないのではないだろうか。←自分のパッケージ設計に実は何か原因があるとかのオチだったらすみません。反省して窓拭き掃除してゴミ除きます。
WordPressの問い合わせデータをFilemakerと連携させる

## 経緯
WEB屋ですが最近、Filemakerに興味があって勉強していてWEBとFilemakerを連携できないかと思い
WordPressのプラグインで有名な「mw wp form」と連携させてみました。(自分用メモも兼ねています。)

## WordPress側
まず、mw wp formの問い合わせデータがどう保存されているかDB内部を調べるとカスタム投稿として保存されているようです。(まぁそうだろうなとは思っていましたが)
post_typeがmwf_〇〇にショートコードのidで問い合わせデータ自体はそれぞれのキーでカスタムフィールド

contact formにはapiありますが、mw wp formにはapiがおそらくありませんので独自のエンドポイントを作成します。
(誰でも問い合わせ情報が見れるようになるので対応する必要あり)

以下ソースコード

```php:function.php
<?php
add_action('rest_api_init', 'add_custom_endpoint');

function add_custom_endpoint() {
  ///wp-json/custom/v1/contact
  register_rest_route('custom/v1', '/contact', array(
    'methods' => 'GET',
    'callback' => 'contact_api',
  ));
}

function contact_api(WP_REST_Request $request) {
  $data = array();
  if(!empty($_GET["key"]) && $_GET["key"] == "〇〇"){
      // レスポンス
      $args = array(
        'posts_per_page' => -1,
        'post_type' => 'mwf_〇〇',
        'order' => 'asc',
        'post_status' => 'publish',
      );
      $contacts = get_posts($args);
      if(!empty($contacts)){
        foreach($contacts as $post){
          setup_postdata($post);
          $data[] = array(
            'id' => $post->ID,
            'date' => get_the_date('Y.m.d',$post->ID),
            'title' => get_the_title($post->ID),
            'name' => get_post_meta($post->ID,'name',true),
            'address' => get_post_meta($post->ID,'address',true),
            'email' => get_post_meta($post->ID,'email',true),
            'tel' => get_post_meta($post->ID,'tel',true),
            'subject' => get_post_meta($post->ID,'subject',true),
            'other' => get_post_meta($post->ID,'other',true),
            'link' => get_the_permalink($post->ID),
          );
        }
        wp_reset_postdata();
      }
      $response = new WP_REST_Response($data);
      $response->set_status(200);
  }else{
    $response = new WP_REST_Response($data);
  $response->set_status(400);
  }


  return $response;
}
```

## Filemaker側
Filemaker側でデータを読み込み際にどうするかというとスクリプトを書きます。(アクセスでいうVBAみたいな感じ)
ただ、結構このスクリプトが癖があって手こずります。

<ul>
<li>ループ<br>
→回数を指定できないのでif文でループを終了させるしか方法が無い
</li>
<li>よくあるidからレコードを取得<br>
→「スクリプト検索実行」を実行してからデータを取得するのがまで分かりづらい<br>
(普通に実行して「テーブル::〇〇キー」とするだけで取得できるのですが、若干はまりました。)
</li>
<li>エラー処理<br>
→検索実行してデータが見つからない場合Filemakerが気を効かせてエラーダイアログが出るのですが消し方が分からなかった
(エラー処理オン オフで対応できる)
</li>
<li>
jsonの最大ループ回数をどう取得するかがFilemakerで分からなかった<br>
→ValueCount(JSONListKeys ($json ; ""))
</li>
<li>配列を宣言するのが分かりづらい<br>
→変数を指定する際に繰り返し数の値を変更すると自動的に配列判定になるっぽい？
</li>
</ul>

やっている事としては、
「urlから挿入」でjson取得してきてループした際にidが無ければ「新規レコード/検索条件」で挿入。
あれば更新するだけです。

![test01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/5f776871-aee0-3875-39ea-f0500fef0bec.jpeg)



# 感想
僕自身ローコードツールの独自言語みたいなものとかは遊びで触るのですが、Filemakerのスクリプト今風じゃなくて若干使いづらい印象は受けました。
ただ、Filemakerのスクリプトは慣れれば早いかけると思いますし、中小企業では複数人で一斉利用する機械あまりないので、こういうツールを使うのもありかなと思いました。(わざわざ予算かけてWEB化する意味ある？みたいなものもありますよね)

Filemakerは老舗で中小企業での採用実績も多いですし。
(ワイヤレス改め)PoE防犯カメラで猫の帰宅を確認する その4(表示デバイス編)

## 1. はじめに

Agent DVRの監視カメラ映像を、Androidタブレット2台とEcho Show 15で表示させていましたが、3台ともなぜか毎朝ホーム画面に戻って、ブラウザを立ち上げ直さなければなりません。WindowsのChromeだと問題なく表示され続けるので、表示デバイスをWindowsに変更します。

その1：
ワイヤレス防犯カメラで猫の帰宅を確認する その1 - Qiita
https://qiita.com/mayo00/items/ff8ea7c0977a92ac12d4

その2：
ワイヤレス防犯カメラで猫の帰宅を確認する その2(PoE給電編) - Qiita
https://qiita.com/mayo00/items/8e29ae0c42f9b31f30a9

その3：
(ワイヤレス改め)PoE防犯カメラで猫の帰宅を確認する その3(PoEカメラ編) - Qiita
https://qiita.com/mayo00/items/3514f3692706f405ccc0

## 2. 使用機材

- 恵安 23.8インチモニタ一体型ベアボーンPC
- 手のひらサイズPC HDMI 2出力＋15.6インチモバイルモニタ×2

## 3. タッチパネル設定

Windowsでタッチ対応モニタを2台繋いだままだと、2画面目をタップした時に、1画面目がタップされた扱いになるので、コントロールパネルから設定変更します。

コントロールパネル→ハードウェア→タブレットPC設定→セットアップ

## 4. Agent DVRのURL

URLに「?mini=true」をつけると、上下のバーがなくなります。

```
http://localhost:8090/?mini=true
```

参考：
Agent DVR API
https://www.ispyconnect.com/userguide-agent-api.aspx

## 5. Chrome起動オプション

1画面の場合、「--start-fullscreen」でフルスクリーン起動します。
192.168.2.201＝Agent DVR PCのIPアドレス

```
"C:\Program Files\Google\Chrome\Application\chrome.exe" --start-fullscreen http://192.168.2.201:8090/?mini=true
```

2画面の場合、「--window-position」を追加してウィンドウ位置を指定します。
これだけだと2つ目が1つ目のタブとして起動してしまい、2画面目に表示されません。
「--user-data-dir」で設定のディレクトリを別々に指定すると、それぞれのモニタに表示されます。設定ディレクトリは予めからディレクトリを掘っておきます。

```
"C:\Program Files\Google\Chrome\Application\chrome.exe" --start-fullscreen --window-position=0,0 --user-data-dir="C:\ChromeDir\1" http://192.168.2.201:8090/?mini=true
```

```
"C:\Program Files\Google\Chrome\Application\chrome.exe" --start-fullscreen --window-position=1920,0 --user-data-dir="C:\ChromeDir\2" http://192.168.2.201:8090/?mini=true
```

## 5. 問題点

2画面の場合に、スタートアップにショートカットを2つ入れて自動起動しているのですが、なぜか1画面目のAgent DVRの上下のバーが表示あれます。
LeetCode Problems解いた：13. Roman to Integer

LeetCodeの問題集、```13. Roman to Integer```がacceptされたので、備忘録として。

## 概要
ローマ数字をアラビア数字の整数に変換する、というアルゴリズムを作成する問題。
## コード
今回はC#での記述。
<details>

```csharp:Solution.cs
public class Solution {
    public int RomanToInt(string s) {
        // 初期設定
        int num = 0;
        string tmpstr = s; //区切られる文字列の入れ物
        int arraySize;
        //文字と数字の対応表(処理の都合で降順に並べている)
        Dictionary<string, int> romanDict = new Dictionary<string, int> {{"M",1000},{"D",500},{"C",100},{"L",50},{"X",10},{"V",5},{"I",1}};
        //処理部；大きい数字から処理
        foreach(KeyValuePair<string, int> dictItem in romanDict){
            //foreachで取り出された要素のキーで文字列を分割
            string[] tmparr = tmpstr.Split(dictItem.Key);
            arraySize = tmparr.Length;
            //キーが示す整数で加算する処理
            for(int i = 0; i < arraySize - 1; i++){
                if (tmparr[i] == ""){
                    num = num + dictItem.Value; //空文字なら加算
                }else{
                    num = num + dictItem.Value - romanDict[tmparr[i]]; //文字が入ってるなら引いてから加算
                }
            }
            //残った右端をtmpstrに入れ替えて、次のループへ持っていく。
            tmpstr = tmparr[arraySize - 1];
        }
        return num;
    }
}
```
</details>

## 考え方
まず20ぐらいまでのローマ数字しか見たことがなかったので、どう読むのか、というところからスタート。
結局どんな仕組みだったかというと、

* 左から大きい順に並んでいる
* 左から順に足す
* 4、9を表す際は左に引く数字がつく。(4：IV→5−1、9：IX→10−1　etc.)

という感じ。なので、ローマ数字を左から、大きい数字を表すアルファベット順に見ていって足す、という処理をしたい。
1. 「大きい数字を表すアルファベット順に見ていって」をするため、順番に並べた辞書を準備。(l.8)

1. 「大きな数字を表すアルファベット順に見る」ため、foreachで1.の辞書内を巡回。(l.10)

1. 文字列tmpstrを分割、加算処理(l.12−21)
例)"MCMXCIV"=1994 を"M"で分割
 →["","C","XCIV"]という配列になる。この時、""="M"=1000、"C"="CM"=900となる。
つまり、区切った後の配列の要素を見て、要素が空文字であれば区切った文字が表す整数を加算、空文字でなければ[区切った文字]-[入っている文字]を加算すればよい。
そして、一番右(配列の一番最後；"XCIV")は、必然的にMより小さい文字の集まりになるので、今度はそれをtmpstrとし、次に大きな整数を表す文字で分割する。以下繰り返し。

<details>
<summary>"MCMXCIV"=1994の詳細フロー</summary>
<p>Loop1: tmpstr="MCMXCIV" → Mで分割 → ["","C","XCIV"] → num=1900、tmpstr="XCIV"</p>
<p>Loop2: tmpstr="XCIV" → Dで分割 → ["XCIV"] → num=1900+0、tmpstr="XCIV"</p>
<p>Loop3: tmpstr="XCIV" → Cで分割 → ["X","IV"] → num=1900+90、tmpstr="IV"</p>
<p>Loop4、５: tmpstr="IV" → L,Xで分割 → ["IV"] → num=1990+0、tmpstr="IV"</p>
<p>Loop6: tmpstr="IV" → Vで分割 → ["I"] → num=1990+4、tmpstr="I"</p>
<p>Loop7: tmpstr="I" → Iで分割 → exit → return　num(=1994)</p>
</details>

## 自分の結果
計算速度：上から数えて約90%のところ(超下の方)
メモリ使用量：上から数えて50%強のところ(真ん中ぐらい)
あまり早く動作するアルゴリズムにはならず。
## 備考
SwiftのrandomElement()で詰まった話

## 概要

普段Pythonを仕事で使用していて、動的言語しか経験のない私がモバイルアプリを作りたくてSwiftを学習した際に型のせいで詰まったところを共有したいと思います。

基礎的なところなので、初心者以外の人にはあまりお役に立てないかもしれません。

## 環境

|ツール|バージョン|
|:-:|:-:|
|xcode|13.4.1|

## 詰まった内容

下記のような課題がありました。

* **全てのアルファベットを格納した配列型のデータからランダムに6つの文字列を抽出してパスワードを作成するシステムを作成してください**

上記の課題に対して私は下記のコードを実装しました。

```swift
let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet.randomElement()
}
print(password)
```

すると下記のようなエラーが発生しました。

```bash
Value of optional type 'String?' must be unwrapped to a value of type 'String'
```

どうやらオプションタイプの`alphabet.randomElement()`を`String`に確定させないといけないようです。

あれ？`randomElement()`って配列型のデータからランダムでデータを取ってくるのではないのか？

`alphabet`は文字列しか含まれていないし、なぜだ？

というわけで、[公式ドキュメント](https://developer.apple.com/documentation/swift/array/randomelement())で情報を集めに行きました。

すると返り値の記載で下記のように記載がありました。

> A random element from the collection. If the collection is empty, the method returns nil.

上記によると`nil`も返ってくる可能性があることがわかりました。

つまり`randomElement()`の返り値は**Optional型**（**nil**を含む可能性がある）ということです。

先ほどのコードをもう一度見てみましょう。

```swift
let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet.randomElement()
}
print(password)
```

ここでは`password`は**String型**、`alphabet.randomElement()`は**Optional型**になります。

よって、**型が異なり異なる型同士は演算できない**ので先ほどのエラーが発生しました。

これを踏まえて先ほどのコードを下記のように修正すると文字列を生成することができました。

```swift
let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet[Int.random(in: 0...25)]
}
print(password)

// => mkcves
```

## まとめ

動的言語では起こらないエラーに遭遇しましたが、エラー内容はいたって初歩的なことでした。

メソッド等が何の型を返すのかということもしっかり気にした上で実装していかないと静的言語は難しいということを実感しました。

少しでも私のような初心者の役立てていただけたら嬉しいです。

ありがとうございました。
CCMS監視でMTEクラスが表示できない時の対処法

ちょっとつまったので情報共有として投稿しときます。表示できない条件がいくつかあるようなので情報共有します。

# モニターセットでMTEクラスが(AbortedJobs)見つからない場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/2a41c7bd-e966-f1e3-95fc-e77a2faba825.png)

## ドンピシャなSAPノート発見：1999116 - MTE "AbortedJobs" is missing
このnote曰く、

>This is not a issue/bug.
(中略)
>MTE "AbortedJobs" will appears when there is a canceled job on the instance.
The MTE "AbortedJobs" appears immediately if manually producing a "canceled job" on certain instance.

これはバクではなく、まだキャンセルされたジョブがないのでMTEクラスが無いようです。

XMLをアップロードして監視モニターセットを作成しようとした際にアップロードエラー出たので十分エラーだと思うのですが、SAPがエラーではないというならエラーではないんでしょう、、

## T-code:SM37から直近のキャンセルジョブを見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/b85858c2-ab86-b42f-240b-f92d099b8abb.png)
キャンセル自体は出ているのですが、直近では吐いてないですね。

## キャンセルするためにジョブを作成
今回はこのジョブをコピーして、実行時にわざと中断させてみます。SAP_SLD_DATA_COLLECT

## ジョブ発生後めでたく表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/49c6c1fa-fead-013c-7563-33017311ffe5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/44386580-c051-703c-1b67-92270e6b20b2.png)

2020/09/07の日付でめでたく、MTEクラスも表示されました。


# 不要になったり、パスが変わるMTEクラスの場合
今回はキャンセルジョブがないことで、表示されないMTEクラスでしたがアップデートにより不要になるMTEクラスも存在します。

例えばこれR3RollPaging とか。
2066796 - CCMS: PROC Memory monitoring

>The following nodes under \\[SID]\[ABAP application server name]\R3BasisSystem\MemoryManagement\R3RollPaging were removed:

MTEクラスが変わることでパスも変わることがあるので注意してください。
>The MTE-Class R3RollPaging was renamed to R3Paging.

# MTEクラスのノードを削除した場合
オリジナルの監視セットを作成するためにノード(MTEクラス)を削除するときがあります。
一度、削除してしまうとMTEクラスが一時的に見えなくなるのですが、SAPを再起動することで表示できます。