OmniAICreator/Qiita-1.07M huggingface dataset:
UE5 常にスタートアップに最新のプロジェクトをロードします。の罠 | Always load last project on startup

環境:Windows10 UE5.0.1

Unreal Engine の起動時に新規プロジェクトを作成する際に、Unreal Editor の左下に
![Qiita_0503_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/841a096b-4a6e-1946-8634-4f0e337f0447.jpeg)

> □ 常にスタートアップに最新のプロジェクトをロードします

英語版だと

> □ Always load last project on startup

というチェックボックスがあり、このチェックを入れると、
ライブラリーの __起動ボタン__ から、 __常に最後に開いたプロジェクトが開く__ ようになる。
![Qiita_0503_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/bf19119a-73b6-3e4f-9ab0-5a34ff9e69c8.jpeg)
この項目の問題点は、一度チェックを入れた際に、戻し方が分かりずらい点にあると思います。
エンジンの再インストールをしても、ユーザー情報が残っていると、設定がリセットされません。
UE5から、より初心者が触りやすい場所にチェック項目が置かれているので、対応方法を共有しておこうと思います。

# 解決方法1
プロジェクトを開いた状態で、
ファイル > プロジェクトを開く
のウィンドウの中で、チェックを外せる。
![Qiita_0503_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/87998f15-da4d-5fd2-9e40-c480fcd481a9.jpeg)
古いバージョンでは、環境設定にチェック項目があったらしいですが、現行ではこちらでチェックを外せるようになっています。

というのを、[解決方法2の記事を書いた後に教わりました。](https://twitter.com/seiko_dev/status/1521424510293262336?s=20&t=VqKJZOyu3MQf-puALm68DQ)
恒吉星光先生ありがとうございます。m(_ _)m

# 解決方法2
一応少し面倒な方法も残しておきます。

変更方法は、以下のパスのtxtファイルを削除することで直ります。

``C:\Users\Your-UserName\AppData\Local\UnrealEngine\5.0\Saved\AutoLoadProject.txt``
> __Your-UserName__
> __5.0__

この二つは、ユーザー名とバージョンによって変更してください。
__AutoLoadProject.txt__ を削除することで、設定が解除になります。

AppDataフォルダ等が表示されない場合は、
エクスプローラ＞表示＞オプション＞表示＞隠しファイル表示

![Qiita_0503_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/bb151fc9-c42e-1b8a-4c07-ec9009bb1007.jpeg)

ユーザー情報内の、テキストデータを削除するだけで、どうやら良さそうです。
不用意に押すと面倒なので、お気を付けください。

こういった、初心者が陥り易そうな項目を[__≫【こちらのページでまとめています】__](https://ue5study.com/unrealengine-basic-operation/)
Symbol SDK (2.x,3.x系) を Create React App / Vite (React 18) で使うための Polyfill 仕込み (Experimental)

ちゃんとバージョンなんかを書いてませんが、タイトルと`package.json`を参照して判断ください。

# TL;DR

ソースを参照。

## Create React App + Symbol SDK example

https://github.com/44uk/cra-react-with-symbol-sdk-example

## Vite + React + Symbol SDK example

https://github.com/44uk/vite-react-with-symbol-sdk-example


# 仕込み

## NodeライブラリのPolyfillを設定

https://github.com/niksy/node-stdlib-browser

SDKがNodeライブラリに依存するため、Polyfillを組み込んでいます。

Polyfillするには色々な方法があるようですが、`node-stdlib-browser`が一番簡単だったので採用しました。

Vite版では`vite.config.ts`に設定を追記します。

https://github.com/44uk/vite-react-with-symbol-sdk-example/blob/main/vite.config.ts

Create React App版では`react-app-rewired`を用いて、`webpack`設定に割り込みます。

https://github.com/44uk/cra-react-with-symbol-sdk-example/blob/main/config-overrides.js


## js-sdk(3.x系)がモジュール選択に失敗するのを回避

```js
	if (value instanceof ByteArray)
		return new module[value.constructor.name](value.bytes);
```

https://github.com/symbol/symbol/blob/dev/sdk/javascript/src/RuleBasedTransactionFactory.js#L43

`value.constructor.name`という箇所が曲者で、`rollup`や`webpack`のコンパイル時に、クラス名が変更されてしまうことにより、実行時に意図したコンストラクタ名が取得できず、モジュールの選択に失敗します。

これをクラスにプロパティで名前をつけることで回避しています。

```js
Object.defineProperty(PublicKey, 'name', { value: 'PublicKey' })
```

https://github.com/44uk/cra-react-with-symbol-sdk-example/commit/3b72d83c4a1b459d4069e295fa3831dad5a57a88#diff-ed19e3c9c7aff516242e6f93a04574be1d413df0b1fbd6181ad714152f8eeebbR25

なお、この処理は`patch-package`で適用するようにしてあります。

https://github.com/44uk/cra-react-with-symbol-sdk-example/blob/main/patches/symbol-sdk-3%2B3.0.0.patch

まだ対応が必要なクラスがあるかもしれませんので、発見次第更新していきます。

なお、サンプルではトランザクションのペイロード作成までしか確認していないので、このパッチによって発生する他の問題については不明です。


## 2.x系と3.x系のSDKを同居

一つのサンプルに両系統のSDKを動かす都合で、3.x系はパッケージ名の衝突を回避させています。

```json
    "symbol-sdk-3": "npm:symbol-sdk@^3.0.0",
```

https://github.com/44uk/cra-react-with-symbol-sdk-example/blob/main/package.json#L19

```js
import { facade, CryptoTypes } from 'symbol-sdk-3'
```

https://github.com/44uk/cra-react-with-symbol-sdk-example/blob/main/src/symbol-sdk-v3.js#L1

どちらか一方を使う場合は考慮しなくてよいでしょう。


# BigIntについて

SDK 3.x系では大きな整数を扱うために、BigIntのシンタックスを使用しています。

https://github.com/symbol/symbol/blob/7a6943710a4ac8a3ae9c5d472d496aa0ce283787/sdk/javascript/test/facade/SymbolFacade_spec.js#L15

BigIntは新しいブラウザならほぼ対応しているようですが、未対応のブラウザを考慮する場合は気をつけて下さい。
（気をつけるも何もどうしようもないか。2.x系を使うしかないですね）

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#browser_compatibility
pipでpygmtをインストール

# はじめに
PyGMTはanaconda環境で使うことが推奨されているが、pipでもインストールすることができる。
しかし、pipでインストールしたのみでは、エラーが発生するのでその解決方法を解説する。
# インストール環境
- Ubuntu 22.04
- Python 3.10
- GMT 6.3.0（aptでインストール）
# pipでインストール
[ドキュメント](https://www.pygmt.org/v0.4.0/install.html#using-pip)にある通りに実行する。
```bash
pip3 install pygmt
```
:::note warn
記事執筆時（2022/5/3）ではPyGMT 0.6.1がインストールされた。PyGMTはバージョンにより、対応するPythonとGMTのバージョンが異なるので、注意すること。（[リンク](https://www.pygmt.org/v0.6.1/index.html#compatibility-with-gmt-python-numpy-versions)）
:::

PyGMTをimportするとエラーが発生する。
```python
import pygmt
```
エラー内容
```bash
pygmt.exceptions.GMTCLibNotFoundError: Error loading GMT shared library at 'libgmt.so'.
libgmt.so: cannot open shared object file: No such file or directory
```
# 解決方法
libgmt.soの場所を確認する。
```bash
$ gmt --show-library
/usr/lib/x86_64-linux-gnu/libgmt.so
```
libgmt.soの名前を確認する。
```bash
$ ls /usr/lib/x86_64-linux-gnu/libgmt*
/usr/lib/x86_64-linux-gnu/libgmt.so.6  /usr/lib/x86_64-linux-gnu/libgmt.so.6.3.0
```
名前が異なる場合はシンボリックリンクを作成する。
```bash
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libgmt.so.6 libgmt.so
```
環境変数を設定する。
```bash
export GMT_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
```
:::note 
.bashrcなどに書き込むと良い。
:::

# 動作確認
```python
import pygmt
pygmt.show_versions()
```
これで情報が表示されればOK。
同じ領域のデータを塗りつぶす

## はじめに
同じ属性で隣り合ったマスを塗りつぶすアルゴリズムを考えます。

下図のようなint型のデータを持つ2次元配列があったとします。
<img width="300" alt="p220503.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638945/8a2e1219-cb82-0733-034b-0d67d99af460.png">


たとえば、5列目、2行目の"0"を指定した時、
そのマスと隣り合った"0"のマスのすべてを別の値("3")へ置き換える（=塗りつぶす）ことを考えます。

すると下図の結果が得られることを期待値とします。
<img width="300" alt="p220503-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638945/882dc7d9-b035-7e4a-6bb8-7f7670763d7b.png">


## 作戦
スタート地点(5列目,2行目)と、塗りつぶされる値(0)、塗りつぶし後の値(3)はinputされるとします。

スタート地点から上下左右を見て、塗りつぶされる値(0)があるか確認します。

あった場合は、その地点を指定の値(3)で置き換え、またその地点から上下左右を見て、塗りつぶされる値(0)があるか、確認します。

つまり、  
"その地点の値を置き換え、さらに上下左右を確認する"  
という処理を何度も繰り返し呼び出し続ければよさそうです。(=再帰呼び出し)


## サンプルプログラム
- 以下のようなサンプルを組んでみましょう。
```C++:sample.cpp
#include <iostream>

// 例題データ準備
const int row = 8;	// 行
const int col = 11;	// 列
int data[row][col] = {
	{	1,	1,	1,	1,	1,	2,	2,	1,	1,	1,	2,	},
	{	2,	0,	1,	1,	0,	0,	0,	0,	2,	0,	1,	},
	{	2,	0,	1,	0,	0,	2,	0,	0,	0,	0,	1,	},
	{	1,	1,	1,	1,	0,	2,	0,	1,	0,	0,	2,	},
	{	1,	1,	0,	1,	0,	0,	1,	0,	1,	0,	1,	},
	{	2,	0,	0,	0,	0,	0,	1,	1,	0,	0,	1,	},
	{	1,	0,	1,	1,	0,	2,	2,	1,	0,	2,	2,	},
	{	1,	1,	1,	2,	2,	1,	1,	1,	1,	1,	1,	},
};

// 指定地点の値を置き換え、さらにその地点から上下左右の値を確認する処理
// x, y = 指定地点の列(x)、行(y)
// checkNo = 塗りつぶされる値
// swapNo = 塗りつぶし後の値
void
fill(int x, int y, int checkNo, int swapNo)
{
	data[y][x] = swapNo;	// 塗りつぶし色へ置き換え

	// 上下左右に"checkNo"の値があるかチェックし、あれば再帰呼び出し
	if (data[y - 1][x] == checkNo) {	// 上
		fill(x, y - 1, checkNo, swapNo);
	}
	if (data[y][x + 1] == checkNo) {	// 右
		fill(x + 1, y, checkNo, swapNo);
	}
	if (data[y + 1][x] == checkNo) {	// 下
		fill(x, y + 1, checkNo, swapNo);
	}
	if (data[y][x - 1] == checkNo) {	// 左
		fill(x - 1, y, checkNo, swapNo);
	}

}

// データを画面に出す関数
void print(char const* str)
{
	std::cout << str << std::endl;

	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			std::cout << data[i][j] << ", ";
		}
		std::cout << std::endl;
	}
}

// メイン
int main()
{
    // 処理前のデータ確認
	print("before");

    // 塗りつぶしを実行！
	// （Input：5行目, 2列目から開始、"0"の値を"3"へ書き換える）
	fill(5, 2, 0, 3);

    // 処理後のデータ確認
	print("after");
}
```

- 実行結果
```
before
1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2,
2, 0, 1, 1, 0, 0, 0, 0, 2, 0, 1,
2, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1,
1, 1, 1, 1, 0, 2, 0, 1, 0, 0, 2,
1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1,
2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
1, 0, 1, 1, 0, 2, 2, 1, 0, 2, 2,
1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1,
after
1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2,
2, 0, 1, 1, 3, 3, 3, 3, 2, 3, 1,
2, 0, 1, 3, 3, 3, 3, 3, 3, 3, 1,
1, 1, 1, 1, 3, 2, 3, 1, 3, 3, 2,
1, 1, 3, 1, 3, 3, 1, 0, 1, 3, 1,
2, 3, 3, 3, 3, 3, 1, 1, 3, 3, 1,
1, 3, 1, 1, 3, 2, 2, 1, 3, 2, 2,
1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1,
```

:::note warn
- 注意
    - 上記サンプルは配列の範囲外アクセスのガード処理とか全然していないので実処理では入れてください。
:::

## おわりに
同じ属性で隣り合ったマスを塗りつぶすアルゴリズムをC++で組んでみました。  
再帰呼び出しは苦手視しているのですが、うまくハマるとすごく面白いですね。
Go + echo + Air + Dockerで最小限かつホットリロードなAPI開発環境を作る

GoのREST API開発環境を作りたく、まずは最小限の環境を作ってみた
似たような記事はたくさんあるが、自分としては記事の数だけヒントを貰うことができたため自分の記事も誰かの役に立つと考え、備忘録も兼ねてここにメモしておく

# この記事のゴール
- Dockerコンテナ上でGo（echo）を稼働させる
- Airを使い、ホットリロードを効かせる
- ローカルホストにアクセスするとHello, world!を出力する

# ファイル構成
```bash
- app_name  # root
  - .air.toml  # Airの設定ファイル、自動出力
  - docker-compose.yml
  - Dockerfile
  - go.mod
  - go.sum
  - main.go
```

# Go Moduleの作成
:::note warn
Go及びDockerはインストール済みであることを前提に書いています
:::
```bash
$ mkdir app_name
$ cd app_name
$ go mod init github.com/username/app_name
```

# echoの導入、実装
まずはechoをインストールする
（余談ですが、importにechoを直接書いて`go mod tidy`するか、下記のように`go get`でインストールするかどちらが良いんでしょうかね）

```bash
$ go get -u github.com/labstack/echo
```

ルートアクセス時、Hello, worldを画面に出力するコードを実装する
```main.go
package main

import (
	"net/http"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, world!")
	})
	e.Logger.Fatal(e.Start(":8080"))
}
```

実装後、`go run main.go`でechoによるWebサーバを起動
とりあえずこれでルートにアクセスするとHello, worldは出力されるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505169/bc46c786-c996-7990-846b-c739673fa59d.png)

# Airの導入、初期設定
今のままでは、main.goを修正する度に再ビルドが必要となり、開発体験が悪い
そのためソースファイルを修正すると自動でビルドされる仕組み、つまりホットリロードを導入する
Goでホットリロードを実現するためのライブラリとして、代表的なものは下記の通り
※Star数は2022/5/3現在の数値

| 名称 | Star数 | 備考 |
|:-:|:-:|:-:|
| [Air](https://github.com/cosmtrek/air) | 6,647 |  |
| [Fresh](https://github.com/gravityblast/fresh) | 3,313 | 更新停止？ |
| [realize](https://github.com/oxequa/realize) | 4,225 | 更新停止？ |

今回は継続してメンテナンスされておりStar数も多いAirを利用する
以下コマンドでインストール及び初期設定を行う

```bash
$ go install github.com/cosmtrek/air@latest
$ which air  # ~/go/bin/air

$ air init  # .air.toml（設定ファイル）が出力される
```

設定ファイルは特に編集不要でそのまま使用可能
ただ、個人的にはログに時間出力したいため、下記設定のみ変更した
```
[log]
  time = true
```

# Airによるechoの起動
```bash
$ air
```
下記のように表示されれば成功！
Airを介してechoが起動していることが分かる
試しにmain.goのHello, worldの文を変更し保存すると再ビルドのログが出力され、ブラウザも更新すると文章が変更されているはずです
```
  __    _   ___  
 / /\  | | | |_) 
/_/--\ |_| |_| \_ , built with Go 

mkdir ~/app_name/tmp
watching .
!exclude tmp
building...
running...

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
```

# Dockerの導入
ここまでは全てローカルで実行している
後はこれらをDocker上で実行するため、`Dockerfile`と`docker-compose.yml`を記述する

```Dockerfile
# Dockerfile
FROM golang:1.18

# ログに出力する時間をJSTにするため、タイムゾーンを設定
ENV TZ /usr/share/zoneinfo/Asia/Tokyo

ENV ROOT=/go/src/app
WORKDIR ${ROOT}

# ModuleモードをON
ENV GO111MODULE=on

COPY . .
EXPOSE 8080

# Airをインストールし、コンテナ起動時に実行する
RUN go install github.com/cosmtrek/air@latest
CMD ["air"]
```

```docker-compose.yml
version: '3'
services:
  app:
    build: .
    volumes:
      - ./:/go/src/app
    ports:
      - "8080:8080"
```

この設定により、`docker-compose up`でコンテナ起動時にAirを介してechoによるWebサーバが起動するようになった
データベース側のコンテナ設定も続けて書いていく必要があるが、本当に最低限の構成をとりあえず組むのが目的なので、今回はここまで
ここまで見ていただき、ありがとうございました。
MPI_Bcastの性能予測：基本編

# はじめに
```MPI_Bcast```は、MPI集団通信の中でも比較的よく使われる命令ではないでしょうか。
```MPI_Bcast```に限らずですが、集団通信は、全てのノードが通信に参加するため通信コストがかかりやすく、故にスーパーコンピュータ上で計算を実行する際には集団通信にかかる時間がボトルネックになりがちです。
したがって、集団通信をただなんとなく使うのではなく、きちんと性能などに関して知識を得た上で使う事が望ましい事では無いでしょうか。
(本当はそうなっていないのがいいのだとは思いますが…)
そこで、本稿では、```MPI_Bcast```に関してその性能を予測する方法などに関して、備忘録的に残しておきたいと思います。
これを見て「あれ…？私の集団通信遅すぎ…？」となる方が一人でも減るといいですね。

# ```MPI_Bcast```のコスト予測
まず、ここで今更書く事でも無いような気もしますが、Bcastとはbroadcast(放送)の略で、あるプロセスが持っている変数の値(メッセージとか言います)を、その他のプロセス全てに教える事です。
この送信元のプロセスをルートプロセスと言い、以下このルートプロセスの番号は$0$としておきます。
さて、プロセスは**基本的に**他のプロセスとは同時に1つとしか通信できません。
したがって、ルートプロセスが他の全てのプロセスに同時にデータを投げる、という事はできません。
この制約の下でどの様にBcastするかという話ですが、パッと思いつくのは
「プロセス$0$が$1$にデータを送信し、$1$はそれを受信。次に、$1$が$2$にデータを送信し、$2$はそれを受信。次に、$2$が$3$に…」
というパターンでしょうか、バケツリレー方式です。
これは、chainと呼ばれています(**ここには絵を描こうと思ったのですが面倒なので後回しにしています**)。

一方で、ルートプロセスが全ての責任を負って、
「プロセス$0$が$1$にデータを送信し、$1$はそれを受信。$0$は次に$2$にデータを送信し、$2$はそれを受信。次に、$0$は$3$に…」
というパターンもありなのではないでしょうか(**ここには絵を描こうと思ったのですが面倒なので後回しにしています**)。
これはbasic linearと呼ばれています。

さて、いずれのパターンにしてもですが、基本的には総プロセス数を$P$とした時、$P-1$回の送受信が発生しています。
そこで、これらの手法で```MPI_Bcast```した際のコストに関して、その通信時間を簡単に見積もってみましょう。
見積もりの方法はいくつかありますが、今回は恐らく一番簡単な、Hockneyモデル(https://doi.org/10.1016/S0167-8191(06)80021-9) を用いたいと思います。
(通信時間モデルには他にもLogGPモデルや、PlogPモデルと呼ばれる物もあるので、気になる方は調べてみてください。)

さて、Hockneyモデルでは、まず、通信時間を、通信を行う際の準備に必要な時間(レイテンシとか言います)と実際の転送にかかった時間に分割します。
前者を$L$と書き、後者を$M / B$と書きますと、通信1つにかかる時間$t$は、以下の用に書けます。
```math
t = L + \frac{M}{B}
```
ただし、ここで$M$はメッセージのサイズ(byte)、$B$はプロセス間の通信の速度(バンド幅 byte/sec)です。
この通信が$P - 1$回発生するので、結局この```Bcast```一回にかかる通信時間$T$は、
```math
T = (P - 1)\left(L + \frac{M}{B}\right)
```
となります。

さて、実際にはこれら以外にも木構造ベースの通信アルゴリズムが存在しています。
例えば、二分木構造を用いて、
「プロセス$0$が$1$にデータを送信し、次に$2$に送信。プロセス$1$はプロセス$3$に、その次に$4$に送信、同時にプロセス$2$はプロセス$5$に、その次に$6$に送信…」
とするものです(**ここには絵を描こうと思ったのですが面倒なので後回しにしています**)。
データを受信したプロセスが同時に通信する事で、通信回数は同じでも通信ラウンドの数をへらす事が可能になります。
結果、通信時間は、
```math
T = 2 \left(\left\lfloor \log_2 P \right\rfloor - 1\right) \left(L + \frac{M}{B} \right)
```
に削減する事が可能になります(導出は略)。
これはbinary treeと呼ばれています。
また、split binary treeという物も存在していますが、一旦省略します。

また、二項木構造を用いて、
「プロセス$0$が$1$にデータを送信する。次に、$0$が$2$に、$1$は$3$に。次に、$0$は$4$に、$1$は$5$に、$2$は$6$に、$3$は$に$。…」
とする物もありでしょう(**ここには絵を描こうと思ったのですが面倒なので後回しにしています**)。
通信時間は、
```math
T = \left\lceil \log_2 P \right\rceil \left(L + \frac{M}{B} \right)
```
となります。
これはbinomial treeと呼ばれています。

# ここまでの結論
さて、これらの事から、実際にグラフを書いてみるまでもなくbinomial treeが最速なので、```MPI_Bcast```を行う時は深いことを考えずとりあえずbinomial treeを使えばいい、という様に見えます。
しかしながら、実際には$L$や$B$は、ネットワークスイッチの状況やプロセスとノードのマップのされ方など、ハードウェア的な部分から決まり、故にアルゴリズムに依存します。
したがって、性能予測をしようと言いつつも、結局のところやってみないとわからない、という面も多々あります。

また、ではここまでで紹介した事だけで終わりかというとそうでもなく、実際にはパイプライン転送と呼ばれるアルゴリズムが適用され、更に効率的な転送を行える様になっています。
これは(2)で書く事にしましょう(いつになるか全くわからないけど…)。
Requirements on Communication Management, No.716, AUTOSAR R21-11 (26) AP

Requirements on Communication Management, No.716, 2021-11

https://www.autosar.org/fileadmin/standards/adaptive/21-11/AUTOSAR_RS_CommunicationManagement.pdf

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Terms| Description|
|:--|:--|
|Fully qualified service ID |A fully qualified name of a service used as a system-wide unique identifier, e.g. ’com.someOEM.adas.collisionwarner’.|
|Data ID| A unique identifier of an instance of data transmitted. |

## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|445|the|その|
|2|227|of|の|
|3|215|to|に|
|4|177|rs_cm_|rs_cm_|
|5|175|communication|通信|
|6|169|a|a|
|7|164|shall|しなければならない|
|8|157|management|管理|
|9|135|service|奉仕|
|10|134|rs_main_|rs_main_|
|11|131|application|応用|
|12|114|e|e|
|13|109|and|と|
|14|95|be|です|
|15|74|on|の上|
|16|71|autosar|AUTomotive Open System Architecture(短縮名)|
|17|65|case|場合|
|18|65|requirements|要件|
|19|64|an|と|
|20|62|for|にとって|
|21|62|method|方法|
|22|61|in|の|
|23|58|data|与件|
|24|56|description|説明|
|25|56|use|使用する|
|26|54|c|c|
|27|53|material|材料|
|28|52|d|d|
|29|52|dependencies|依存関係|
|30|51|is|は|
|31|51|rationale|根拠|
|32|50|supporting|対応|
|33|49|by|に|
|34|48|protocol|規約|
|35|46|provide|提供|
|36|45|document|文書|
|37|44|it|それ|
|38|37|id|identifier, 識別子(短縮名）|
|39|36|r|r|
|40|35|applications|応用|
|41|34|able|できる|
|42|32|ap|adaptive platform(短縮名)|
|43|32|autosar_rs_communication|autosar_rs_communication|
|44|31|event|行事|
|45|30|result|結果|
|46|29|not|いいえ|
|47|29|that|それ|
|48|29|value|価値|
|49|27|which|どれの|
|50|26|are|それは|
|51|26|this|これ|
|52|25|draft|下書き|
|53|25|other|他の|
|54|24|field|分野|
|55|24|get|得る|
|56|24|methods|方法|
|57|24|support|対応|
|58|23|call|電話|
|59|23|or|また|
|60|22|instance|実例|
|61|21|developers|開発者|
|62|21|provided|提供した|
|63|20|adaptive|適用|
|64|20|interface|界面|
|65|19|as|なので|
|66|19|events|行事|
|67|19|information|情報|
|68|19|platform|土台|
|69|19|possible|可能|
|70|18|current|現在|
|71|18|has|もっている|
|72|17|after|後|
|73|16|specific|明確|
|74|16|used|使用済み|
|75|15|binding|縛る|
|76|15|ip|internet protocol(短縮名）|
|77|15|received|受け取った|
|78|14|any|どれか|
|79|14|based|基づいた|
|80|14|called|と呼ぶ|
|81|14|change|変化する|
|82|14|different|違う|
|83|14|some|いくつかの|
|84|14|trigger|引き金|
|85|14|with|と|
|86|13|can|できる|
|87|13|changes|変更|
|88|13|from|から|
|89|13|network|通信網|
|90|13|services|奉仕|
|91|13|state|状態|
|92|13|time|時間|
|93|12|all|すべて|
|94|12|between|の間に|
|95|12|check|検査|
|96|12|may|五月|
|97|12|means|意味|
|98|12|non|非|
|99|12|raw|生|
|100|12|response|応答|
|101|12|safety|安全性|
|102|12|send|送信|

# 参照(reference)

[1] Standardization Template, AUTOSAR_TPS_StandardizationTemplate
[2] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
[3] Requirements on E2E, AUTOSAR_RS_E2E
[4] Main Requirements, AUTOSAR_RS_Main
docstringのテンプレートを出力してくれるautoDocstringのVS Code拡張が素敵だった

Pythonの関数（メソッド）の内容に合わせてdocstringのテンプレートを生成してくれるautoDocstringというVS Codeの拡張機能をお仕事とプライベートで使っていたら結構気に入ったのでその紹介です。

# autoDocstringでできること

- Pythonの関数やメソッドの引数名や型アノテーションなどに応じたdocstringのテンプレートをVS Code上で生成してくれます。
  - ※JSDoc的なもの含め、他の言語だと割とその辺をしっかり生成してくれる一方でPythonだと（出力されるdocstringのスタイルがずれていたりなど）個人的にしっくりくるものが無く、今まではスニペット的にクリップボードへ定型文登録などして過ごしていました。
- PEP257やGoogleスタイル、NumPyスタイルなどメジャー所のdocstringのスタイルはサポートされています。

※そもそもdocstringとはなんぞや・・・という方は必要に応じて以下の記事などをご確認ください。

https://qiita.com/simonritchie/items/49e0813508cad4876b5a

# インストール

特に煩雑な対応は必要なく、普通にVS Codeの拡張機能の一覧でautoDocstringなどと検索してインストールするのみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/01cd14b3-b441-0647-2743-1532d4797ab7.png)

# 設定を行う

インストール後にVS Codeの設定画面でautoDocstringなどと検索すると設定が色々出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/f12dbcbd-fb77-2773-718c-4a67485bc58a.png)

色々と設定はありますが、私は以下の2点を変更しています。

## docstringのスタイル

PEP257やGoogleスタイル、NumPyスタイルと色々なdocstringのスタイルがありますが、私は仕事もプライベートのPythonプロジェクトも両方ともNumPyスタイルを使っているためまずはスタイルはNumPyに変更していきます。

Docstring Formatという設定で変更することができます。numpyがNumPyスタイルとなります。

これはプロジェクトに応じて様々だと思いますのでプロジェクトに合わせて選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/6dff280b-0722-a1b6-e661-c996642891f0.png)

## クォーテーションの後に改行を入れるかどうか

私は基本的にクォーテーション（`"""`）の後に改行を入れて説明文を書くことが多いのでStart On New Lineにチェックを入れておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/38d80331-0917-f4c1-f54c-158b68dac360.png)


## 実際に使ってみる

以下のような適当な関数で試してみます。

```py
from typing import List


def sample_func(name: str, ids: List[int]) -> List[str]:
    ...
```

使い方は簡単で、関数内で`"""`といったようにdocstring用の３つの連続したダブルクォーテーションを入力するとGenerate Docstringというメニューが表示されるので十字キーで選択してEnterを押せばDocstringのテンプレートが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/74e68eb9-005a-a697-8ac4-bd12a486a92e.png)

対象のメニューを選択すると以下のようにテンプレートが生成されます。引数名や型アノテーションの内容も反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/cbd03920-cb6a-9473-3ec0-a24092d69206.png)

最初は関数の概要部分にフォーカスが当たっており、編集が終わったらTabキーを押すことで次のフォーカスの個所に切り替えることができます（対象の各個所にハイライトがされている状態であれば）。

軽く使っていた感じ、NumPyスタイルの場合以下のような注意点があります。

- 返却値部分は`result : str`といったように返却値名も書かれたりしますが、生成されるdocstringでは型のみの表示となるため必要な場合には自分で書き足す必要があります。
- 文字列のリストといったケースではNumPyスタイルでは`list of str`といったような書き方がされることが結構ありますがこの辺りは型アノテーションそのままで`List[str]`とか`list[str]`といった具合に設定されます。

# 余談

以前以下の記事で書いたようにNumPyスタイルのdocstringのLintを作っていまだにずっと使っているのですが、説明などが漏れていた場合にはチェックに引っかかるもののautoDocstringを使って`_summary_`や`_description_`といった記述になっていてもそのままLintを通ってしまうので、その辺に説明などがなっていたら弾く・・・といったようにアップデートをそのうちしておきたいところです・・・（そのうち仕事などで`_description_`などの表記のままうっかりコミットなどしそうな気がします・・・）。

https://qiita.com/simonritchie/items/84c4d4b2528309c30359

# 参考サイト

https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring

https://dev.to/tmchuynh/vscode-extensions-im-in-love-with-oab
Minikube on Colima 環境構築

以前、[Minikube on MacOS Monterey 環境構築](https://qiita.com/trtrbohz/items/7f842bb927589cb2218b)という記事で hyperkit を使って Minikube をローカル環境に構築する方法を記載した。

今回は[colima](https://github.com/abiosoft/colima)をご紹介しようと思う。
colima のコンセプトは「『Container runtimes on macOS (and Linux) with minimal setup.』 最小限のセットアップ作業で macOS & Linux 上にコンテナランタイムを構築する」。 
実際にやってみると、前回の [Minikube on MacOS Monterey 環境構築](https://qiita.com/trtrbohz/items/7f842bb927589cb2218b) より簡単！

インストール等は[colima](https://github.com/abiosoft/colima)のH.P.に以下のように記載してある。
```
# Homebrew
brew install colima

# MacPorts
sudo port install colima

# Nix
nix-env -iA nixpkgs.colima
```

使い方も簡単！
```
brew install kubectl
colima start --with-kubernetes
```

他にも、以下の様に色々な使い方が可能
```
$ colima start --help
Start Colima with the specified container runtime (and kubernetes if --with-kubernetes is passed).
The --runtime flag is only used on initial start and ignored on subsequent starts.

Usage:
  colima start [flags]

Examples:
  colima start
  colima start --runtime containerd
  colima start --with-kubernetes
  colima start --runtime containerd --with-kubernetes
  colima start --cpu 4 --memory 8 --disk 100
  colima start --dns 8.8.8.8 --dns 8.8.4.4
  colima start --mount $HOME/projects:w


Flags:
  -c, --cpu int           number of CPUs (default 2)
  -d, --disk int          disk size in GiB (default 60)
  -n, --dns ipSlice       DNS servers for the VM (default [])
  -h, --help              help for start
  -m, --memory int        memory in GiB (default 2)
  -v, --mount strings     directories to mount, suffix ':w' for writable
  -r, --runtime string    container runtime, one of [containerd, docker] (default "docker")
  -k, --with-kubernetes   start VM with Kubernetes
```

試しに、colima VM のカスタマイズも以下の様に実施することができた。
1CPU, 2GBメモリ, 10GiBストレージ
```
colima start --cpu 1 --memory 2 --disk 10
```
簡単！

後は、ホストPCのボリュームマウント。ヘルプにあるように　＄HOME　下に projects フォルダを作成。
```
colima start --mount $HOME/project:w
```

今回は colima を紹介。
【CarrierWave】Nil location provided. Can't build URIというエラーの対処

#### エラーの内容
AcitiveAdminで作成した管理画面の中の画像なしの投稿の詳細画面を見にいくと、以下のエラー達が出た。
```
ArgumentError in Admin::News#show

Nil location provided. Can't build URI.
```

#### 解決策(公式ドキュメントに従ったもの)
こちらのエラーも調べると、表示するデータがないのでエラーが出ているとのことだった。
画像の設定がない場合の表示を指定する解決策が提示されている記事があるかと思います。
エラー原因と解決策は他の記事に譲るとして、CarrierWaveの公式ドキュメントに解決策の部分
について言及されていた部分を載せておきたいと思います。

###### Providing a default URL
In many cases, especially when working with images, it might be a good idea to provide a default url, a fallback in case no file has been uploaded. You can do this easily by overriding the default_url method in your uploader:(DeepL和訳:デフォルトURLの提供。多くの場合、特に画像を扱う場合、ファイルがアップロードされなかった場合の予備として、デフォルトのurlを提供するのは良い考えかもしれません。アップローダーのdefault_urlメソッドをオーバーライドすることで、簡単にこれを行うことができます。)

```
class MyUploader < CarrierWave::Uploader::Base
  def default_url(*args)
    "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  end
end

```
公式ドキュメント該当部分のURL:
https://github.com/carrierwaveuploader/carrierwave#providing-a-default-url

image_uploader.rbをみにいくと、上記のドキュメントのようにメソッド(default_url)とその中身が記述がされており、それらはコメントアウトされていたので解除しました。
そうすると、当初のエラーが解消されました。
完全数、過剰数、不足数について

# 完全数について

完全数とはある数の約数を足し合わせた数がその数になる数の事である。
ただし、その数自身は足し合わせない。

例えば、6は完全数である。
6の約数は1,2,3,6であるが6を除いた数を足し合わせると1+2+3=6になる。
この数を完全数という。

最も小さな完全数は6である。 完全数は6、28、496、8128、33550336、8589869056、……と続くが、1万以下の完全数は8128までの4つしかない。 これまでに完全数は51個見つかっている。 2018年に見つかった51番目の完全数は4900万桁以上もある。

中世の『聖書』の研究者は、「6 は『神が世界を創造した（天地創造）6日間』、28 は『月の公転周期』で、これら2つの数は地上と天界における神の完全性を象徴している」と考えたとされる。

古代ギリシアの数学者は他にもあと2つの完全数 (496, 8128) を知っていた。以来、完全数はどれだけあるのかの探求が2500年以上のちの現在まで続けられている。

6 と 28 がなぜ「完全」であるかは中世の学者の議論の対象になり、6 は神が創造した1週間（日曜日は神が天地創造を終えて休んだ安息日で、キリスト教ではこれを除外する）、28 は「月の公転周期」とされた。

聖アウグスティヌス（? - 604年）はこれとは一線を画し、「6 はそれ自体完全な数である。神が万物を6日間で創造したから 6 が完全なのでなく、むしろ逆が真である」としている。

ピタゴラスは完全数はその約数の和に等しいだけでなく、他にもいくつかエレガントな性質を持つ事に気がついた。
一例として完全数はつねに連続した自然数の和として表す事が出来る。
6 = 1 + 2 + 3
28 = 1 + 2 + 3 + 4 + 5 + 6 + 7

エウクレイデスはそれまでに見つかっていた完全数はつねに二つの数の積で表され、その一方は2のべき数、他方は次の2のべき数から1を引いたものになる事を発見した。
6 = 2^1 x ( 2^2 - 1 )
28 = 2^2 x ( 2^3 - 1 )
496 = 2^4 x ( 2^5 - 1 )
8128 = 2^6 x ( 2^7 - 1 )

今日ではコンピュータを使って完全数の探索が続けられており、2^216090 x ( 2^216091 - 1 )という十三万桁を超える巨大な数がエウクレイデスの規則に従う事がわかっている。
2005年には1830万4103桁の完全数が発見された。

約数の和がその数自身よりも1だけ小さい数はたくさんある。
ところが、約数の和がその数自身よりも1だけ大きい数は一つも存在しないようなのだ。
ギリシャ人たちは「わずかに過剰な数」を一つも見つけられず、なぜ見つけられないのかを説明することも出来なかった。

そして、2500年の時を経た今日でも、数学者たちは「わずかに過剰な数」が存在しない事を証明出来ずにいる。

# 余談(プログラミングにより完全数を求める)

10000までの完全数を求めるプログラム(Pythonコード)

```python
for i in range(2,10000+1):
	sum = 0
	for j in range(1,i):
		if i%j == 0:
			sum += j;
	if i == sum:
		print(i)
```

実行結果

```
6
28
496
8128

```

その数の約数の和がその数より1小さい不足数はたくさんある
その数の約数の和がその数より1大きい過剰数はない

10000までの1大きい過剰数を求めるコード

```python
for i in range(2,10000+1):
	sum = 0
	for j in range(1,i):
		if i%j == 0:
			sum += j;
	if i+1 == sum:
		print(i)
```

その解は無い。

10000までの1小さい不足数を求めるコード

```python
for i in range(2,10000+1):
	sum = 0
	for j in range(1,i):
		if i%j == 0:
			sum += j;
	if i-1 == sum:
		print(i)
```

実行結果

```
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192

```
React-Leaflet > leaflet.locatecontrolを使う


https://github.com/domoritz/leaflet-locatecontrol


## Child

LocationMarker.tsx


```
import { useEffect } from 'react';
import { useMap } from 'react-leaflet';
const Locate = require('leaflet.locatecontrol');

import 'leaflet.locatecontrol/dist/L.Control.Locate.min.css';

export const LocationMarker = () => {
  const map = useMap();
  const option = {
    //   showCompass: false, // ロケーションマーカーの上にコンパス方位を表示する
    position: 'topright',
    flyTo: true, //パンをスムーズにし、マーカーの位置にズームします
    //   returnToPrevBounds: true, //ユーザーの場所の中央に配置する直前に地図の境界を保存します。
    //   keepCurrentZoomLevel: true, //ビューを設定するときにのみパンします。
  };

  useEffect(() => {
    const lc = new Locate(option);
    lc.addTo(map);
  }, []);
  
  return null;
};

```


## Map側

```
  省略
   
  return (
    <MapContainer>
      <LocationMarker />
    </MapContainer>
  );
```
【Vagrant】ある日突然ArgumentErrorで起動に失敗するようになった件

初めてVagrantを使う現場に参画し
試行錯誤で環境を立てて実装を進めていたところ
突然Vagrantが立ち上がらなくなったことがありました。

### 出力されたエラー文
```
$ vagrant up
C:/HashiCorp/Vagrant/embedded/gems/2.2.4/gems/vagrant-2.2.4/plugins/providers/virtualbox/driver/version_5_0.rb:582:in `read_state': invalid byte sequence in UTF-8 (ArgumentError)
```

## 発生原因
いくつか上記エラーとなるケースがあるようですが、自分の場合は
`$ snapshot save {NAME}`で名前付きスナップショットを作成した際に
日本語でスナップショット名をつけてしまったのが原因でした。

[参考サイト：Snapshotとは](https://weblabo.oscasierra.net/vagrant-snapshot/)

本件`snapshot`実行時はエラーとならず、再起動時にエラーが発生したため
何が原因かの分析に苦戦してしまいました。。

## 解消方法

***該当のスナップショットをVirtualBox経由でリネームor削除する***

CUIで実行しようとすると同様のエラーが発生してしまうため
VirtualBox経由でスナップショットの削除を行いました。

[参考サイト：VirtualBoxでスナップショットを管理する手順](https://atmarkit.itmedia.co.jp/ait/articles/1010/14/news128_3.html)
5分くらいで作るReact+GitHub Pagesの自動デプロイ環境

Reactで作ったページをGitHub Pagesに自動デプロイするメモ。
mac環境で作成しています。その他実行時のバージョンは以下。
- node: 18.0
- npm: 8.6.0
- create-react-app: 5.0.1

## React プロジェクトを作成する
```bash
npx create-react-app react-gh-pages
```

## GitHub Actionのworkflowを作成する
作成したReactプロジェクトに移動し、ymlファイルを作成します。
```bash
cd react-gh-pages && mkdir -p .github/workflows/ && touch .github/workflows/deploy.yml
```
作成したymlファイルに下記の内容をコピペします。
```yml
name: Build and Deploy

on:
  push:
    branches: [master]

permissions: write-all

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: "npm"

      - name: Build
        run: |
          npm ci
          npm run build

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./build

```

## package.jsonにGitHub PagesのURLを追記する。
URLは、デフォルトだと`https://<GitHubアカウント名>.github.io/<リポジトリ名>/`になっているので今回はそれを追記しています。
```json
  "homepage": "https://hono3bono3.github.io/react-gh-pages/"
```

## コミットしてGitHubにpush
ソースコード側の作業は完了なのでここまでの内容をリポジトリに反映させます。
今回はゼロから作成したので、GitHub CLIで直接リポジトリを作成しています。
```bash
git add .
git commit -m "GitHub Pagesの設定追加"
gh repo create
```

## GitHub Pagesに公開するブランチを設定する
push後、GitHubのリポジトリ上で`Actions`タブを開くと、先ほど作成したworkflowが実行されているので
完了するまで待ちます。
![スクリーンショット 2022-05-03 16.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/f290ac22-6ba1-f5fd-3123-b2c4ad25dca7.png)

完了後、`Setting`タブを開き、左の`Pages`をクリックする。SourceのNoneをクリックすると
gh-pagesブランチが作成されているので選択しSave. 
![スクリーンショット 2022-05-03 16.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/c6fb9834-a225-285f-ae55-fe08ab374f4b.png)

再度、`Actions`タブを開くと、新しくworkflowが走っているので完了するまで待ちます。
![スクリーンショット 2022-05-03 16.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/937e74c1-1ac2-24eb-fa98-e176f3a33463.png)

完了後、URLにアクセスすると反映されているのが確認できます。
![スクリーンショット 2022-05-03 16.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/9e8f6665-cb49-c99f-46fa-773a3099b7d0.png)

あとは `master`に変更が入るたびに、build ~ deployまで自動で回るようになっています。

![スクリーンショット 2022-05-03 16.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/bb3361f9-6431-f6a4-4503-0deb7a59678f.png)
![スクリーンショット 2022-05-03 16.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602156/bfac0c57-ca5e-6b1a-1364-abf07875fe1e.png)

ソースコードは下記URLに公開しています。
https://github.com/hono3bono3/react-gh-pages

## 参考資料
- [GitHub Pages でReact Appを公開](https://qiita.com/pure-adachi/items/173f5dda05a391d2b956)
- [GitHub Actions](https://docs.github.com/en/actions)
自作強化学習フレームワークのオリジナルアルゴリズムの作成方法


この記事は自作している強化学習フレームワーク [SimpleDistributedRL](https://qiita.com/pocokhc/items/a2f1ba993c79fdbd4b4d) の解説記事です。
githubは以下となります。

https://github.com/pocokhc/simple_distributed_rl

この記事はドキュメントに移行しました。
以下を参照してください。

https://pocokhc.github.io/simple_distributed_rl/pages/custom_algorithm.html
自作強化学習フレームワークのオリジナル環境の作成方法


この記事は自作している強化学習フレームワーク [SimpleDistributedRL](https://qiita.com/pocokhc/items/a2f1ba993c79fdbd4b4d) の解説記事です。

githubは以下となります。

https://github.com/pocokhc/simple_distributed_rl

この記事はドキュメントに移行しました。
以下を参照してください。

https://pocokhc.github.io/simple_distributed_rl/pages/custom_env.html
Gtkアプリ３　開発する上での注意点　随時更新

### Gtkアプリ３　開発する上での注意点

開発運用していた時に、起きたこと気がついたことを随時更新してきます。


###### UIを更新する際は同期処理の方がよい
#### 非同期処理にすると更新する際に落ちることがある。

##### 起きたこと
Timer関数でWebAPIのデータを非同期処理で取得後、UI(ラベルなど)の更新を非同期で処理したら落ちることがある。

##### 対策
UIの情報の更新を同期処理に切り替えたら安定した。awaitやasyncを外した。


#### ボタンイベントに非同期処理をつけて連打すると落ちることがある

```cs
private async void on_test_clicked(object sender , EventArgs e)
↓
private void on_test_clicked(object sender , EventArgs e)
```

##### 対策
UI処理理に使っていたTask、asyncを外した。

#### Gtk.ListStoreを何度もClearするとクラッシュすることがある

```cs
Gtk.ListStore　testStore = new Gtk.ListStore (typeof (testModel));
testStore.AppendValues (testModel);

#Gtk.ListStoreをクリアする
treeView1.Model = null;
ListStore.Clear()

```

##### 対策
Clearの後にtreeViewのModelをnullをいれる
Modelをnullをした後でClearする


#### try catchでエラーハンドリングする前にクラッシュするエラーが起こりlog4に出力できない

##### 起きたこと
C言語のGtkライブラリ側でエラーが起き、C#側のcatchでエラーハンドリングできない

##### 対策
Gtk3アプリをターミナルから起動させるとターミナルも一緒に起動する。
ターミナルで内でログを出力させる。Console.WriteLine();などを使う
ターミナル内ではC言語側のエラーログも出力できる

現在の行数を取得する

```cs
 var stackFrame = new StackFrame(1, true);
 string num = stackFrame.GetFileLineNumber().ToString();
 Console.WriteLine(memo + "行番号 " +  num );
```

### メモリ関連のエラー 1

#### メモリを消費し続けて開放されていないとエラーが起こる

```cs
エラー　free(): invalid next size (fast)
```

```cs
long currentSet = Environment.WorkingSet
Console.WriteLine("現在のメモリ使用量は{0}byteです。", currentSet.ToString("N0"));
// → 現在のメモリ使用量は38,432,768byteです。と表示される。
```
https://takap-tech.com/entry/2015/07/07/115839

メモリが使用量を消費し続けているプログラムを調査する

##### 対策
メモリの使用量が増え続けている箇所を修正する
メンバー変数をローカル変数にする
Task関数をメンバー変数からローカル変数にすると安定した

### メモリ関連のエラー 2

#### メモリの二重解放エラー

メモリの開放がCloseとDisposeで二重に行われていた。

```cs
P.Close()
P.Dispose()
```

```cs
エラー　double free or corruption 
```

#### 対策
Dispose系をfinallyで実行する


```cs
try{
               
}catch (Exception e){
      Console.WriteLine(e);
}finally{
  if (P != null){
      P.Dispose();
  }                
}
```

#### ダンプファイルを出力し検証する

C言語側のライブラリでクラッシュが発生したら、ダンプファイルを出力させ中身を検証することができる。

```
エラー　Segmentation fault (コアダンプ)
```

#### コアダンプを有効にする

```bash
ulimit -c unlimited
```
#### コアダンプが有効になっているか確認する

```bash
ulimit -a
```

生成されたダンプファイルをデバッグする
gdbコマンドを使う

```bash
gdb ./ダンプファイル.out core
```

https://qiita.com/aqua_ix/items/2e9d4fd2eb0fc4db22cb

[Telegram Botを使う](https://qiita.com/iota_11/items/b681f21d9bb6ec24f14d)に続く
100日後くらいに個人開発するぞ！day015

## 今日は初級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/64d6e304-2a28-52e4-c934-e40a6e6ef621.png)

## HTML＆CSS道場レッスン初級編を修了！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/bda2de67-0bc1-8f62-a2d6-4c3a7bb99c5b.png)

## 今日のアウトプット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/041aa926-d459-5a58-5fcd-47aad3627098.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/faa1ba47-cb94-a9f6-2d41-86f86a549a1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/6570b811-b1bd-bf68-183e-f30645e44f8c.png)
テンプレートエンジンでハマった

C#でテンプレートエンジンを使いたい

Mustacheを以前利用していたが、もう少し高度なことをやろうと思い探したところ、ShopfyがメンテナンスしているLiquidが良さそう。

それのC#で動く版。
直近もメンテナンスされている。
https://github.com/sebastienros/fluid
が、クラスのネストしたものが表示されなかったりとやりたいことができない。

同様のプロジェクトに
https://github.com/scriban/scriban
があったが、独自過ぎるので言語を変えたいとかの場合に困るので遠慮する。

また、こちらも試してみる。
https://github.com/dotliquid/dotliquid
fluidではエラーも出なかったのが、dotliquidではエラー表示されて原因が分かった。

```
is invalid because it is neither a built-in type nor implements ILiquidizable
```

Liquizableじゃないってことなのですが、
https://github.com/dotliquid/dotliquid/wiki/DotLiquid-for-Developers
によると、
Type is an integral type (int, string, decimal, etc.), list or array of integral types, or anonymous type
タイプが限られます。

が、新しいバージョンから、
クラスに対して
```
    [LiquidType("*")]
    internal class MyClass
    {
```
のようにすれば独自クラスも使えるようになります。

テンプレートエンジンでうっかりクラス内容などを書き出してしまってセキュリティーホールにならないようにの配慮と思います。

【追記】
fluidでも同様のことがありました（まぁ、当たり前ですよねｗ）
https://github.com/sebastienros/fluid
こちらはエラーも出てくれなかったのと英語ちゃんと読んでませんでした。

------引用開始---------
Allow-listing object members
Liquid is a secure template language which will only allow a predefined set of members to be accessed, and where model members can't be changed. Property are added to the TemplateOptions.MemberAccessStrategy property. This options object can be reused every time a template is rendered.

Alternatively, the MemberAccessStrategy can be assigned an instance of UnsafeMemberAccessStrategy which will allow any property to be accessed.

Allow-listing a specific type
This will allow any public field or property to be read from a template.
-----引用終了----https://github.com/sebastienros/fluid

以下、DeepLの翻訳です

Allow-listing object members
Liquid は、あらかじめ定義されたメンバーへのアクセスのみを許可し、モデルのメンバーを変更できないようにする、安全なテンプレート言語です。プロパティは TemplateOptions.MemberAccessStrategy プロパティに追加されます。このオプションオブジェクトは、テンプレートがレンダリングされるたびに再利用することができます。

あるいは、MemberAccessStrategy に UnsafeMemberAccessStrategy のインスタンスを割り当てて、どのようなプロパティにもアクセスできるようにすることも可能です。

Allow-listing a specific type（特定の型のリストアップを許可する）
これは、任意のパブリック・フィールドまたはプロパティをテンプレートから読み取ることを許可します。

なので、ページにあるように、Optionを追加してやればこちらも表示されました。

こうなると、メンテナンスされているFluidの方を使おうかな。。。
1日１企業紹介　株式会社JMDC（英文表記：JMDC Inc.）

株式会社JMDC（英文表記：JMDC Inc.）

従業員数	270名

設立日	2002年1月31日

事業内容	医療統計データサービス

レセプト・健診データと大きくかかわりを持つ会社。
設立から20年近くも経っている。
前身は株式会社日本医療データセンターという会社で
2013年に現在の社名に変更したらしい


事業内容大きく分けて３つ
①ヘルスビッグデータ
②遠隔医療
③調剤薬局支援

①が一番気になるので調べてみた（①がJMDCの稼ぎ頭なのでとりあえずここを押さえておく）

メディカルデータベース株式会社という会社とタッグを組んでサービスを提供している。
二つのデータベースを持ち、一つが保険者で稼働しているレセプト・健診データが収集されているデータベース
で二つ目が医療機関で稼働しているレセプトとDPC調査データが収集されているデータベース

また、おそらく二つ目の医療機関データベースの医療機関レセプトと電子カルテを紐づけ臨床検査値を取得している
（施設数４０程度とのこと）

RWDでのデータベースは検査値がないことが多いことから、上記のDBが発展させていきたいと
JMDCも思っているのかしら。。。

また収集されたデータにおいて２次利用可能なもので分析結果を提供するサービスを展開している。
このサービスも面白そうではあるが、どの程度の売り上げなのかがわからなかった。
分析結果を論文にして投稿はしているっぽい。

最後にここに転職する際に必要なスキルが以下（必須スキルはぬるかったので無視）

歓迎条件

機械学習（データサイエンス）を活用した本番サービスの開発経験
AWSやGCPなどクラウド環境における機械学習サービスの実装経験
ヘルスケアの特定領域に特化したデータサイエンスの経験（ウェアラブルデータを用いたサービスの開発経験もしくは研究実績など）
医学研究用の生物統計の専門知識または臨床知識
アクチュアリー会員

自分がまったく詳しくない「AWSやGCPなどクラウド環境における機械学習サービスの実装経験」はやっぱりどこの会社でも
需要があるんだなと思って焦りを感じました。。。。。
LibTorchにPyTorch_JNI.dllが入っていない!!

PyTorchの公式サイトでStable、Windows、LibTorch、C++/Javaを選ぶとLibTorchというC++向けのライブラリがダウンロードできます。
しかし、このLibTorchにはPyTorch_JNI.dllというファイルがありません。

このファイルはStableではなく、LTSのバージョンになら入っています。
PythonとC++/Javaを併用したい人とかは、バージョンを落とすことも考慮してみてはいかがでしょう。

現在は配布されているトレーニング済みのPyTorchのモデルを、TorchScriptのものに変換してJavaで動かそうとしています。
Controllerの呼び出し前後にログ出力する方法

# はじめに

SpringBootのControllerの呼び出し前後で引数や処理時間をログに出力したく、
調べたところAOPで実現できたので、まとめておく。

# 基本となる書き方

```java
@Aspect
@Component
public class [任意のクラス名] {

    @Around("execution(public * xxx.yyy.zzz.controller.*.*(..))")
    public Object [任意のメソッド名](final ProceedingJoinPoint pjp) throws Throwable {

            // 前処理

            Object result = pjp.proceed();

            // 後処理

            return result;
        }
    }
}
```

# @Aroundについて

Advice(アドバイス)の1つ。処理時間を計算するために採用した。
他に```@Before```や```@After```、```@AfterReturning```、```@AfterThrowing```がある。

# @Aroundの引数について

ポイントカット指示子のこと。
上記コードでは、xxx.yyy.zzz.controllerパッケージの任意のクラス名、(publicな)メソッド名、引数に対して実行する。

# クラス名の取得
ProceedingJoinPointから取得できる
```java
pjp.getSignature().getDeclaringTypeName()
    -> "xxx.yyy.zzz.controller.[クラス名]" が返ってくる
```

# メソッド名の取得
ProceedingJoinPointから取得できる
```java
pjp.getSignature().getName()
    -> "[メソッド名]"が返ってくる
```

# 引数の取得
ProceedingJoinPointから取得できる
```java
// 引数名
String[] methodArgNames = ((CodeSignature) pjp.getSignature()).getParameterNames();
// 引数の値
Object[] methodArgValues = pjp.getArgs();
```

# コードの全文
```java
@Aspect
@Component
public class ControllerLogger {

    private static final Logger logger = LoggerFactory.getLogger(ControllerLogger.class);

    @Around("execution(public * xxx.yyy.zzz.controller.*.*(..))")
    public Object logging(final ProceedingJoinPoint pjp) throws Throwable {
        // ごちゃごちゃするのでtry-with-resourcesを使用しているが、どうしても例外処理っぽく見える
        try (var scope = new Scope(pjp)) {
            return pjp.proceed();
        }
    }

    private static class Scope implements AutoCloseable {

        private final String declaringTypeName;
        private final String name;
        private final String[] methodArgNames;
        private final Object[] methodArgValues;
        private final long startMs;

        private Scope(final ProceedingJoinPoint pjp) {
            declaringTypeName = pjp.getSignature().getDeclaringTypeName();
            name = pjp.getSignature().getName();
            methodArgNames = ((CodeSignature) pjp.getSignature()).getParameterNames();
            methodArgValues = pjp.getArgs();
            startMs = System.currentTimeMillis();
            logger.info("Controller start : " + declaringTypeName + "#" + name + " " + buildArgs());
        }

        @Override
        public void close() {
            final var endMs = System.currentTimeMillis();
            logger.info("Controller end   : " + declaringTypeName + "#" + name + " " + buildArgs() + " in " + (endMs - startMs) + " ms");
        }

        private String buildArgs() {
            final var result = new StringBuilder();
            result.append("[");
            for (int i = 0; i < methodArgNames.length; i++) {
                if (i != 0) {
                    result.append(", ");
                }
                result.append(methodArgNames[i] + "=" + String.valueOf(methodArgValues[i]));
            }
            result.append("]");
            return result.toString();
        }
    }
}
```
# 参考にした記事

https://qiita.com/NagaokaKenichi/items/386af61b6866d60964e8

https://reasonable-code.com/aop-method-args/
stackoverflowの黒ポップアップを消去したいときのプラグイン 公開しました。

# 概要
[stack]:https://stackoverflow.com/questions/1340872/how-to-get-javascript-caller-function-line-number-and-caller-source-url?noredirect=1&lq=1

[stackoverflow][stack]ページを開いたときに黒の比較的大きいポップアップ画面が表示され、その下にある記事が見えないため、苦労することがあります。そのため、プラグインでこのポップアップ画面を消去するようにしました。この画面はYour Privacyという画面です。クッキーを許可すれば、消えますが何か不安な場合は使えると思います。

# プラグインのインストールについて


プラグインのインストールは、下記のリンクから行えます。(無料)
[Chrome Webstore](https://chrome.google.com/webstore/detail/stackoverflow%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-v11/icjapgcpfekdkpjonlpckkahldepdgpi?hl=ja)
# 使い方
黒いポップアップをクリックすると消えます。


# あとがき
プログラミングをしていると、ネットで調べたいことが頻繁に発生します。その時に、何か、広告もそうですが、見たい情報が隠れていることが多々あります。[stackoverflow][stack]サイトはよく使用しますが、この黒画面が多々、見受けられ、苦労します。それを簡単に解消するためのプラグインです。
お試しください。
去年のロボカップの反省

## はじめに
[ロボカップジュニア](https://www.robocupjunior.jp/)は19歳以下の子供が自律型ロボットを作って競う大会であり、私はその中の「ワールドリーグレスキューライン」に参加しました。
私の去年のロボカップでの結果はノード大会2位、ブロック大会2位で、残念ながら全国大会への切符を手にすることはできませんでした。今更ながら一人反省会をしたいと思います。
※個人の特定につながるので具体的なノード名、ブロック名は伏せます。

## ロマンに溺れた
私の去年の大会を一言で表現するなら「**ロマンに溺れた**」だと思います。初めてのロボット大会でエキサイティングになった結果、1つのロボットにEV3本体2つ、センサー7つ、モーター4つを搭載する巨人を生成してしまいました。
周りにはよく「戦車」と揶揄されましたね笑。(実際、戦車みたいな見た目をしてました笑)
あの戦車は重すぎるがあまり、坂を登ることができず、レスキューゾーンに到達することもできませんでした。
**反省はしています。後悔はしていません。**

## 具体的な問題点&原因
### ハードウェア面
1. 坂を登れない。 → 機体の重量。重い。
1. 坂を下る時、半ば転がり落ちる様だった。 → 機体の重量&重心の位置
1. 壁の横を回転するときによくぶつかった。 → 機体のサイズ。デカい。
1. 銀色のラインを正確に判定できなかった。 → カラーセンサーと床の距離が常に一定でなかった。
1. よく異音がした。 → 中央と左右が十分固定されていなかったため、ギアがずれた。
1. ギャップを認識できなかった。 → ライン中央にカラーセンサーを設置していなかった。
### ソフトウェア面
1. レスキューゾーンでのプログラムが十分でなかった。 ← 計画的に制作しなかった。
1. 障害物を避けるときに左右どちらに回るかを判断する機能がなかった。

## 解決策
### ハードウェア面
1. 坂を登れない。 → 機体の軽量化
1. 坂を下る時、半ば転がり落ちる様だった。 → 機体の軽量化&低重心
1. 壁の横を回転するときによくぶつかった。 → サイズを小さくする。
1. 銀色のラインを正確に判定できなかった。 → タイヤとタイヤの間にカラーセンサーを設置する。
1. よく異音がした。 → 機体を四角い枠で囲う
1. ギャップを認識できなかった。 → うーん笑
### ソフトウェア面
1. レスキューゾーンでのプログラムが十分でなかった。 ← 計画的に制作する。
1. 障害物を避けるときに左右どちらに回るかを判断する機能がなかった。 ← 今年はちゃんと作る。

## 良かったところ
* 転輪付きクローラーを採用したため、バンプに関しては怖いものなしだった。 ← 機体の巨大化の原因でもあるから今年は採用しないかな。
* タッチセンサー2つで機体の傾きを検知し、修正することができた。 ← 今年も取り入れたい。
* PD制御でなめらかなライントレースができた。 ← 今年はPID制御に発展させたい。

## さらなる展望
* [MicroPython](https://pybricks.com/ev3-micropython/index.html)に挑戦したい。
* これまでにない機能を搭載したい。←懲りてない
* 色の判定にRGBやHSVを使いたい。
* モーターの回転数センサーで坂やバンプの検知に挑戦したい。
PC98:テキストＶＲＡＭを直接書き換えて文字表示する

# やりたいこと
テキストＶＲＡＭに直接書き込むことで文字を表示したい。

# 方法
+ 表示位置
X（横位置０～８０）  Y(縦位置０～４０)
__0A000H__ をスタートアドレスとしてoffsetを __2X+160Y__ で計算し、 __0A000H:offset__ に文字コードを書き込む。
+ 属性
ATT(色、アンダーライン、取消ライン、バックカラーとか）
__0A200H__ をスタートアドレスとしてoffsetを __2X+160Y__ で計算し、 __0A200H:offset__ に文字属性を書き込む。

# コード
~~~tvram.asm
; X, Y に1文字(CHR)を表示するプログラム
;
; PC-9821Cx model S2 MEM16MB ODP
; Turbo C++  Version 1.01 Copyright (c) 1990 Borland International
; Turbo Assembler  Version 2.0  Copyright (c) 1988, 1990 Borland International
;

code segment
	assume cs:code, ds:code
	
	org 100h
;
;Ｘ、ＹからテキストＶＲＡＭアドレス(di)を計算する。
;	di = X*2 + Y*2*80
;

start:
	mov bx, word ptr [X]
	mov di, bx
	shl di, 1            ; di = X * 2

	mov ax, word ptr [Y]
	mov bx, 160          ; 160 = 2 * 80
	mul bx               ; mul bx  is  ax <= ax * bx
	add di, ax           ; di = X*2(di) + Y*160(ax)

	mov bx, [CHR]        ; CHR を表示させる
	mov ax, 0a000h       ; TextVRAM スタートアドレス = 0a000h
	mov es, ax
	mov word ptr es:di, bx
	mov ax, 0a200h       ; TextVRAM 文字属性スタートアドレス= 0a200h
	mov es, ax
	mov bx, word ptr [ATT]     ; 文字属性
	mov word ptr es:di, bx

	mov	ax, 4c00h
	int	21h

CHR dw  120,'$'
X	dw	30,'$'           ; 横４０文字目
Y	dw	15,'$'           ; 縦１５行目　に表示
ATT dw  1011111b,'$'     ; 文字属性

code ends
end start
~~~
[エラー解決] $dataが未定義です   (@foreach ( $data as $item ))

   p.78 繰り返しのディレクティブ(PHPフレームワーク Laravel入門)

@foreach ( $data as $item)

//index.blade.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello/Index</title>
    <style>
body { font-size:16pt; color:#999; text-align:center;}
h1{ font-size:50pt;  color:#00bfff;
    margin:-20px 0px -30px 0px letter-spacing:-4pt;}
    </style>    
</head>
<body>
    <h1>Blade/index</h1>
    <p>&#064;foreachディレクティブの例</p>
    <ol>
    @foreach ( $data as $item )
    <li>{{$item}}
    @endforeach
    </ol>    
</body>
</html>




//まとめ

▶︎元々こちらのindexアクションメソッドに記述したが、うまく動作せず。
 public function index(){
    // $data = ['one', 'two' ,'three' ,'four' ,'five'];
    // return view('hello.index', ['data'=>$data]);
}
▶︎こちらのpostアクションメソッドに記述したら、正常に動作した。
     public function post(Request $request){
    // return view('hello.index',['msg'=>$request->msg]);
        $data = ['one', 'two' ,'three' ,'four' ,'five','six',];
        return view('hello.index', ['data'=>$data]);

}



＊＊
(まだ方法がわからず文字化け的になってしまっていますが)
左バーのMarkdownで本文を見る、で見ると、コピペしたものがそのまま見ることができました。
Javascriptの".."(ダブルドット)、"::"(ダブルコロン)

Javascriptのコードを眺めていたら、下記の様な表記を見かけて、「！？？？」となった。いろいろ調べてもなかなか明快な説明のページが見つからなかったので、メモ。

    var event = input..*::record..*::event;

通常、"."(シングルドット)は、オブジェクトの直下の子要素を表すが、".."は、任意の階層の「子孫」要素を表す。
また、"::"(ダブルコロン)は、名前空間を表すが、その名前が"\*"となっているので、"*::"は任意の名前空間を表す。
従って、上のコードは、inputオブジェクトの子孫要素の中の任意の名前空間のrecord要素の中の子孫要素の中の任意の名前空間のevent要素、ということになる。
React18→React17へのダウングレードの仕方



今回の投稿は(エラーの表示を一旦なくすために使用した)
**Reactのダウングレードの仕方**についてメモしたものになります。
`ダウングレードの方法`は(2)に記載しておりますので飛ばしていただいて構いません。

<font color="Red">※ エラーについては根本的な解決には至ってないのかもしれませんのでご了承ください </font>
<font color="Red">※ エラー内容についても自分用にメモとして残しております。</font>

# (1)どういったエラーか
Next.jsとmicrocmsを使用してのブログを作成後、デプロイした際の以下の3つのエラーが起きました。

三つのエラーを見ていきます。
![Group 6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029408/93390720-0cce-fb7b-191e-52f82def7941.jpeg)
左から(エラーの中身と日本語訳[DeepL使用])
①https://reactjs.org/docs/error-decoder.html/?invariant=425

:::note alert
「Text content does not match server-rendered HTML.」
訳: テキストコンテンツがサーバーでレンダリングされたHTMLと一致しない。
:::

②https://reactjs.org/docs/error-decoder.html/?invariant=418

:::note alert
「Hydration failed because the initial UI does not match what was rendered on the server.」
訳: 初期UIがサーバーでレンダリングされたものと一致しないため、Hydrationに失敗しました。
:::

③https://reactjs.org/docs/error-decoder.html/?invariant=423

:::note alert
「There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering.」
訳: ハイドレーション中にエラーが発生しました。このエラーはサスペンス境界の外側で発生したため、ルート全体がクライアントレンダリングに切り替わります。
:::

# (2)エラーを無くした方法(ダウングレード方法)
色々とコードを見直したり、書き換えたりしましたがエラーはなくならず、、、
「*もしかしたらReact18に原因があるのでは？*」と考えダウングレードすることにしました。

①package.jsonの記述を変更
[変更前]

```json
"react": "18.0.0",
"react-dom": "18.0.0",
```

[変更後]

```json
"react": "^17.0.2",
"react-dom": "^17.0.2",
```

②インストール

```terminal
 npm install --save react@17.0.2 react-dom@17.0.2
```
※ ちなみにですがnpm 5.0.0以降からは"--save"の記述はいらないようです

https://qiita.com/havveFn/items/c5beda8572aa8c1e6be6

再びデプロイするとエラーの表示は一旦なくなりました。

# (3)まとめ
エラー表示は一旦なくなりましたが、下の記事にあるように根本的な解決には至ってないのかもしれないと考えてます。

https://qiita.com/aiji42/items/748bf3ef3c7ca65535db

具体的に良い解決策が見つかりましたらそちらも投稿しようと思います。