OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studio (Arctic Fox)のセットアップ

## 環境

- OS: Windows 10 Home

## 事前準備

- BIOSの設定で、Intel Virtualization Technology (VT-X)を有効にしておく
 - ∵AVD（エミュレータ）の高速実行のためのIntel HAXMインストールに必要
- Windowsの設定「Windowsの機能の有効化または無効化」で、以下を有効にしておく
 - Windows ハイパーバイザープラットフォーム
 - 仮想化マシンプラットフォーム
 - ∵Intel HAXMインストールに必要

## インストール手順

- 以下からセットアップバイナリをダウンロードする
 - https://developer.android.com/studio
 - 2021/08/31時点での最新版は `android-studio-2020.3.1.23-windows.exe` (Arctic Fox)
- ダウンロードしたセットアップバイナリをダブルクリックしてインストールする

## 初期設定

Android Studio 起動後、以下を実行。

### ビルド時の文字化け防止の設定

- Help > Edit Custom VM Options を選択
- 開いたファイルに以下を記載し、保存  
```
-Dfile.encoding=UTF-8
```
- Android Studio を再起動

### ビルド等での詳細表示の設定

- File > Settings を選択
- Build,Execution,Deployment > Compiler を選択
- Command-line Options: `--stacktrace` を指定

### プラグインのインストール

- File > Settings を選択
- Plugins を選択
- 必要なプラグインをインストール
 - 例: IdeaVim, Save Actions

## トラブルシューティング

### Intel HAXMインストールに失敗した場合

以下の手順でIntel HAXMのみを再インストールできる。

- 上記[事前準備](#事前準備)に記載のBIOS設定、Windowsの設定を行う
- Android Studioを起動し、Tools > SDK Manager を選択
- SDK Toolsタブを選択
- Intel x86 Acceleration Emulator (HAXM installer)のチェックをONにし、OKを選択
【GAS】ChatWorkの返信忘れをチェックする

##やりたいこと
ChatWorkのグループチャットが多くなってきて返信漏れが出てきたので返信していないものをリスト化したい

## おおまかな流れ
1. gasでChatWorkから1週間以内に更新があったグループチャットを取得する※
2. 取得したグループチャットの最後に送信されたチャット情報を取得する
3. チャット情報から必要な情報を取り出す
4. 取り出した情報をスプレッドシートにセットする

 ※[ChatWorkのAPIの制限](https://developer.chatwork.com/ja/endpoints.html)を考慮して1週間にした

## コード
```sample.js
function  notRepliedCheck() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();

  //フィルターがセットされていれば削除する
  if (sheet.getFilter() !== null) {
    sheet.getFilter().remove();
  }

  //スプレッドシートの値をクリアする
  sheet.getRange(2, 1, lastRow, 6).clear();

  // APIトークンをプロパティストアから取得
  const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN');

  const now = new Date();
  // 1週間前のタイムスタンプを変数にセット
  const oneWeekAgo = Math.floor(new Date(now - (1000 * 60 * 60 * 168) ) / 1000);

  const headers = {
    'X-ChatWorkToken': token
  };
  const options = {
    "headers": headers,
    "method": "get",
  };
  const url = "https://api.chatwork.com/v2/rooms";
  
  // グループチャットを全件取得
  const res = UrlFetchApp.fetch(url, options);
  const resArr = JSON.parse(res.getContentText());
  let dataArr = [];

  // 1週間以内に更新があったグループチャットのグループチャットの名前とルームIDをdataArrに格納
  for (let i = 0; i < resArr.length; i++) {
    if (resArr[i].last_update_time > oneWeekAgo) {
      dataArr.push([resArr[i].name, resArr[i].room_id]);
    }
  }

  // dataArrに含まれるグループチャットの最終メッセージを取得
  for (let j = 0; j < dataArr.length; j++) {
    let messages = UrlFetchApp.fetch(url + "/" + dataArr[j][1] + "/messages?force=1", options);
    messages = JSON.parse(messages.getContentText());
    let lsatMessageIndex = messages.length - 1;
    let sendTime = messages[lsatMessageIndex].send_time * 1000;
    sendTime = new Date(sendTime);

    // 最終メッセージからスプレッドシートに書き出したい情報をdataArrに追加する
    dataArr[j].push(messages[lsatMessageIndex].account.name);
    dataArr[j].push(Utilities.formatDate(sendTime, 'Asia/Tokyo', 'yyyy/MM/dd'));
    dataArr[j].push(messages[lsatMessageIndex].body);
    dataArr[j][1] = "https://www.chatwork.com/#!rid" + dataArr[j][1];
  }
  sheet.getRange(2, 1, dataArr.length, 6).setValues(dataArr);
  //フィルターをセットする
  sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).createFilter();
}
```
## できた
![スクリーンショット 2021-08-31 22.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205237/d7689a11-801d-cf90-b21d-a38245037992.png)
※C列にはアカウント名が入る
AWS日記30 (AWS Lambda - DLQ)

# はじめに
AWS Lambda 関数のデッドレターキューを試します。

非同期呼び出しが失敗した際に、メールを送信するように設定します。

今回は CloudFormation を利用して構築しました。
使用したテンプレートは[Github](https://github.com/tanaka-takurou/cloud-formation-templates/tree/master/dlq_for_lambda)に。


# AWS SAM テンプレート作成

AWS SAM テンプレートで Lambda, SNS の設定をします。

[参考資料]
[AWS SAM テンプレートを作成する](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)

### Lambda関数とデッドレターキューの設定は以下の部分
```yaml
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Ref MainFunctionName
      CodeUri: bin/
      Handler: main
      MemorySize: 256
      Runtime: go1.x
      Description: 'Sample DLQ Function'
      DeadLetterQueue:
        Type: SNS
        TargetArn: !Ref DLQSNSTopic
      Policies:
      - SNSPublishMessagePolicy:
          TopicName: !Ref DLQSNSTopicName
      Environment:
        Variables:
          REGION: !Ref 'AWS::Region'
```


# Lambda関数作成

※ Lambda関数は aws-lambda-go を利用しました。


```golang
func HandleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (Response, error) {
	log.Fatal("Error")
	return Response {
		StatusCode: 200,
		Body: "success",
	}, nil
}
```


# Lambda関数の非同期呼び出し
```bash
aws lambda invoke --function-name ServerlessDLQLambdaFunction --invocation-type Event response.json
```

# 終わりに
Lambdaの非同期呼び出しが失敗した際に、メールを送信するように設定しました。
今回はメール送信するため、デッドレターキューのタイプをSNSに設定しましたが、
SQSも選択できるため今後試して行こうと思います。


<details><summary>参考資料</summary><div>

[AWS Lambda 関数のデッドレターキュー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async.html#dlq)

[AWS::Serverless::Function DeadLetterQueue](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-deadletterqueue.html)

[【新機能】AWS LambdaがDead Letter Queueをサポートしました #reinvent](https://dev.classmethod.jp/articles/lambda-supports-dead-letter-queue/)

[Lambdaで利用できるDead Letter Queue（DLQ）とはどんな機能であるか調べてみた](https://dev.classmethod.jp/articles/lambda-dead-letter-queue/)

[Amazon API GatewayのREST APIからLambdaを非同期に呼んでみた](https://dev.classmethod.jp/articles/invoke-async-lambda-from-api-gateway-rest-api/)

[AWS日記⑥ (SNS)](https://qiita.com/tanaka_takurou/items/1e8322039b5b2ee35ec5)

[serverless-contact-page-go](https://github.com/tanaka-takurou/serverless-contact-page-go)
Pickerの選択肢を可変にする

# やりたいこと
- Picker.itemを動的に表示したい
- 例えば、Pickerの選択肢をDBに登録されている内容に応じて変更したい

![スクリーンショット 2021-08-31 22.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57455/0e1061cf-3e7f-6cc7-6660-df931c498fd9.png)


# 環境
- Expo 4.10.1
- 使用する Picker @react-native-picker/picker

# 実現方法
- PickerItemを配列で返す関数で実現する
- forの代わりに、DBに検索してきた結果でループし、Picker.Itemコンポーネントを要素だけ配列に収め、配列を返す

```javascript
createSelecter = () => {
    let items = [];
    for(var i = 0; i < 3; i++){
      let test = "選択肢 : "+i
      items.push(<Picker.Item label={test} value="test1" />)
    }
    return items
  }
```

- この関数をPicker側で利用する

```javascript
<Picker
 style={styles.picker}
 selectedValue="test"
 onValueChange={(itemValue, itemIndex) =>
   console.log("itemValue")
 }>
 {this.createSelecter()} <- ここ
</Picker>
```

## 例

```javascript
import React from 'react';
import {Text, View} from 'react-native';
import {Picker} from '@react-native-picker/picker';

class RegisterReason extends React.Component {

createSelecter = () => {
    let items = [];
    for(var i = 0; i < 3; i++){
      let test = "選択肢 : "+i
      items.push(<Picker.Item label={test} value="test1" />)
    }
    return items
}

render() {
    return (
      <View
      style={styles.window}>
        <View style={styles.container}>
            <Picker
              style={styles.picker}
              selectedValue="test"
              onValueChange={(itemValue, itemIndex) =>
                console.log("itemValue")
              }>
              {this.createSelecter()}
            </Picker>
        </View>
      </View>
    );
  }
}
```
Arcを使用してKubernetes に Azure App Service を実装とAWSのEC2の監視

#はじめに
azureのaz-304の資格取得に向けてマイクロソフトのラーニングパスで学んだひとつがAKS。

https://docs.microsoft.com/ja-jp/learn/modules/intro-to-azure-kubernetes-service/

もしかしたら今後仕事で関わる機会があるかもしれなく、何か演習をしたいと思いつつも上記ラーニングパスは概要の説明のみでないため、探していたところ以下演習を発見。
作業目的の一つは演習を実施して、webページ(Hellow world)を表示させること。

https://docs.microsoft.com/ja-jp/learn/modules/configure-application-kubernetes-arc/

また上記演習に加えてせっかくAzure ArcとAKSをセットアップするならAzureからAWSの EC2の監視が出来ますから実施することにしました。これが作業目的の2つ目になります。

https://www.softbanktech.co.jp/special/blog/cloud_blog/2020/0077/

#作業環境

```
Azure ArcとAKSのセットアップは全てポータルのcluod shellから実施
AWS Linux サーバ
```

#作業結果
〇作業目的1
![cloudmaster8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1949705/770b6787-db76-52b7-9d9e-34965dbd56c9.png)

〇作業目的2
![cloudmaster6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1949705/79b9d711-a214-3ae0-2eef-4429520bb2d0.png)

※「ip-xx.xx.xx.xx.ap-northeast-1.compute.internal」のIPアドレスの部分(xx.xx.xx.xx.)はくり抜いています。
登録できたIPアドレスはAWSのEC2の内部アドレスでした。

#作業工程　Azure ArcとAKSのセットアップ

以下上記マイクロソフトのサイトから引用となります。

「
・ラボ環境を準備します。
・Kubernetes クラスターを設定します。
・Kubernetes クラスターを Azure Arc に接続します。
・Azure Arc 対応 Kubernetes クラスターに App Service を実装します。
・App Service Web アプリを Azure Arc 対応 Kubernetes クラスターにデプロイします。
・ラボ環境をクリーンアップします。
」

作業を進めていく中で以下の箇所でエラーが発生し、クラスターに接続できませんでした。

タスク 2: AKS クラスターに接続する

```
az aks get-credentials -g $K8S_CLUSTER_RG_NAME -n $K8S_CLUSTER_NAME --admin
```

そのため以下のコマンドを実行したところ、クラスターに接続できるようになりましたので
以降の作業を進めました。

```
az aks get-credentials --resource-group k8sAKS-RG  --name k8sAKS-c22960 --admin
```

#作業工程　AzureからAWSの EC2の監視
上記ソフトバンクテクノロジーのサイトから引用しますがAWSのEC2で以下のように監視用のエージェントをインストールして進めていけば、作業結果にあるようにazureでAWSのEC2は登録することが出来ました。

```
wget https://aka.ms/azcmagent -O ~/install_linux_azcmagent.sh
bash ~/install_linux_azcmagent.sh
azcmagent connect --resource-group "＜リソース グループ名＞" --tenant-id "＜テナント ID＞" --location "＜リージョン＞" --subscription-id "＜サブスクリプション ID＞"
```

またAzureのVMも同様に登録できると記載はありますが実施してみたら以下メッセージが表示されて登録は出来ませんでした。

``
Azure Connected Machine Agent is designed for use outside Azure.
To connect an Azure VM for TESTING PURPOSES ONLY, see https://aka.ms/azcmagent-testwarning for more details.
``

AzureのVMの場合は以下の方法にて追加したらよいかと考えます。

https://docs.microsoft.com/ja-jp/learn/modules/manage-hybrid-workloads-azure-arc/5-use-manage-windows-server-instances

今後は他にもAzure Arcの活用方法はあると思いますので分かり次第またハンズオンが出来たらと考えています。
【UiPath】「お気に入りにしたアクティビティ」の情報はどこに保存されてるか

以下に保存されています。
別の環境にお気に入り設定を持っていきたい場合は当ファイルをコピーで行ける（はず）です。
<b>`C:\Users\[ユーザ名]\AppData\Roaming\UiPath\Favorites.xml`<b\>

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/16622eec-be32-e9a5-37b2-e8d2f38add78.png)|
|-|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/78a005c4-6f4f-d4b9-f537-35611400db57.png)|
|-|

ちなみに「最近使ったアクティビティ」は同階層にある`Recents.xml`に保存されてます。

##動作環境
UiPath Studio Pro 2021.6.0 Community License
Power Automate で Excel 転記を行う

# なぜ今更？
意外に情報が無くて面倒なことをされてる方が居たので、
今は Parse JSON も不要になって、超楽々なんですよ！ってことを伝えたかった

# 参考
Office Scripts も使っていいなら、こっちの方が高速で手間ないかもです

https://qiita.com/baku2san/items/2842e7e4223acab950ed

# 概要
1. 元となるExcel ファイルからテーブルの行を取得
  - 下図で、左側のファイルから右側のファイルへ転記
1. 対象となる行をフィルターして、一部のみ抽出
  - 下図の Filter 列(Column4)
1. 抽出した行に対し、コピー先となる Excel ファイルの対象行を更新
  - 下図 Key列(column1) で紐付け

転記イメージはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bedd3b16-e8c3-00e2-23e0-cacd4161d57e.png)

## 元となるExcel ファイルからテーブルの行を取得
1. [list-rows-present-in-a-table](https://docs.microsoft.com/ja-jp/connectors/excelonlinebusiness/#list-rows-present-in-a-table) で対象の Table を取得（日本語Doc：[テーブル内に存在する行を一覧表示する](https://docs.microsoft.com/ja-jp/connectors/excelonlinebusiness/#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%86%85%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E8%A1%8C%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f9030d02-e4fb-67cd-d0a2-e7745ca6295b.png)

## 対象となる行をフィルターして、一部のみ抽出
勿論、全行処理してもいいんですが、たぶんそんなことは余り無い筈

今回は、"Column4" という列で、True の行だけにフィルターする例を紹介

フィルター方法は２つ
### 1. 元のコネクターの設定：Filter Query
詳細は割愛。後日気が向いたら参考例を紹介するかも

```tex:FilterQuery
Column4 eq 'True'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/40e2798a-4f4f-2267-10a9-5d144b3a5433.png)

### 2. [filter-array-action](https://docs.microsoft.com/en-us/power-automate/data-operations#use-the-filter-array-action) でフィルター （[日本語Doc](https://docs.microsoft.com/ja-jp/power-automate/data-operations#use-the-filter-array-action)）
以下の感じで設定

```tex:FilterQuery
@equals(item()?['Column4'], 'True')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1d6e9387-f0e6-9bb8-f2e2-1cee65de167c.png)

:::note warn
警告
Excel内で Bool としていた場合（今回の例）以下のように、Advanced Mode で修正が必要 
:::
修正内容
1. 普通にまずはポチポチ選択
1. Advanced Mode 選択
1. Boolの判断結果を以下のように、文字列化
  - 変更前：@equals(item()?['Column4'], True)
  - 変更後：@equals(item()?['Column4'], 'True')

## 抽出した行に対し、コピー先となる Excel ファイルの対象行を更新
[update-a-row](https://docs.microsoft.com/ja-jp/connectors/excelonlinebusiness/#update-a-row) で更新対象の行を更新（[日本語Doc：行を更新](https://docs.microsoft.com/ja-jp/connectors/excelonlinebusiness/#%E8%A1%8C%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c63e3f8a-769f-2321-8370-3ccff4543f61.png) 

## 全体像
実行した場合の例はこんな感じ（Filter Arrayの右二つはごみですが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/721d3456-c395-622e-d5a7-3d69eaf3f1ad.png)

# 最後に
Sample作って思ったのは、以下

- Filter するなら、Excel 側でBoolはやめておいた方が良い。上に記述したけど嵌るし、ポチポチで出来ないので。
- 以下は覚えておこう

| item参照 | 用途 |
|:-:|:-:|
| items('Loop名')['列名']|Loopで Current Item 利用する場合|
|  item()['列名']|Filter ArrayやSelectでItem 利用する場合

# 参考
今回は、Excel のデータ取得部分をテーブル化したが、もしテーブル化出来ない場合は以下のような取得・書き込みを利用します

https://qiita.com/baku2san/items/3c85559c882b45dc660e

https://qiita.com/baku2san/items/e7c10aef86b12abb5b38
独学プログラマーのまとめ　その7

###8章　モジュール

- 不屈の努力と情熱は、何歳でも奇跡を起こす。
    - ジョージ・ワシントンの言葉 
- モジュールとは分割したコードでPythonファイル(.py)のこと。
- モジュールを使うにはまず**インポート**する。
    - インポートとはPythonにこれから使うモジュールはどれなのかを伝えること。 
- インポート構文と使い方は以下の通り

```Python
import [モジュール名]
[モジュール名].[コード]
```
[コード]は関数や変数などの名前でありモジュールの中で使いたいものを指定する。
例として組み込みモジュールであるmathモジュールではコード(関数)powを使って羃乗（累乗）を計算できる。

```Python
import math
math.pow(2, 3)
```
> 8.0

モジュール(.py)を他のモジュールからインポートするとそのモジュールのコードは全て実行される。
もしインポートされた時に実行されたくない場合は`if__name__ == "__main__":`の文下に書くと実行されなくてすむ。
もちろんPythonで直接実行した場合はそのまま実行される。
【Laravel】upメソッドとdownメソッドについて

#はじめに
今回は、マイグレーションファイルを作成したときに記述されているupメソッドとdownメソッドについて簡単に解説していきます。

#upメソッド
データベースに新しいテーブルやカラムなどを生成するための処理を記述する部分です。
デフォルトでidカラムとタイムスタンプの２つが既に記述されているので、その書き方にしたがって、追加したいカラムを記述していきます。

・新規登録時

```php:作成日時_create_menus_table.php
public function up()
{
    Schema::create('menus', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('menu_name');
        $table->timestamps();
    });
}
```

・カラム追加時

```php:作成日時_menus_add_columns.php
public function up()
{
    Schema::table('menus', function (Blueprint $table) {
        $table->bigInteger("user_id")->unsigned();
        $table->increment("time_require")->nullable();
    });
}
```

※　`->unsigned(　)`は、マイナス値を除く場合、`->nullable(　)`は、必須ではない場合に記述します。

#downメソッド
テーブルを削除するための処理を記述する部分で、rollbackを実行したときに走る用として書きます。
downメソッドは新規登録の場面では既に記述されていますが、カラムの追加や削除を行うときはdownメソッドにも記述する必要があります。
記述の仕方は簡単で、upメソッドに記述したカラムに対応したdropColumnを記述するだけです。

・新規登録時

```php:作成日時_create_menus_table.php
public function down()
{
    Schema::dropIfExists('menus');
}
```

・カラム追加時

```php:作成日時_menus_add_columns.php
public function down()
{
   Schema::table('menus', function (Blueprint $table) 
   {
        $table->dropColumn("user_id");
        $table->dropColumn("time_require");
   });
}
```

#おわりに
この２つのメソッドがテーブル操作の基本になるので、しっかり理解しておきましょう。
基本的なpythonの文法まとめ

#基本的な使い方
・セルに入力できる状態でEscを押すと入力できない状態になる。
・その状態でaを押すと、前にセル追加
・ｂを押すと後ろにセル追加
・ｍでマークダウン（説明などをする部分）、ｙでコードのモードになる。

#文字列
##文字列.format()
```py
name = "nana"
birthplae = "japan"

"私の名前は{}です。出身は｛｝です。".format()
```
もしくはこちら。

```py
f"私は{name}です。出身は{birthplace}です"
```

##改行（\n）はprintと一緒に。
```py
print("aaa\nbbb")
```
これで、

aaa
bbb

と出力できます。


##書式化
書式化演算子の％を使うことで、書式を設定できる。

```py
print("10進数=%d,16進数=%x,10進浮動小数点=%f" %(16,16,16))
```
→10進数=16,16進数=10,10進浮動小数点=16.000000

##大文字と小文字の変換

➀小文字から大文字へ

```py
'hello'.upper()
```

→'HELLO'

②大文字から小文字へ

```py
'HELLO'.lower()
```

→'hello'

##改行部分で分ける
```py
message = "aaa\nbbb"
message.split('\n')
```
→['aaa', 'bbb']
ソフトウェアの最新バージョンを確認する（homebrew/linuxbrew を利用）

こんにちは。
ソフトウェアの最新バージョンを確認する方法を考え、homebrew/linuxbrew を用いるシェルスクリプトを作りました。

```apache2``` を確認した動作例は：


```console
$ ./check_latest_version.sh apache2
httpd: stable 2.4.48 (bottled)
Apache HTTP server
https://httpd.apache.org/
```

```check_latest_version.sh
#!/bin/sh
command -v brew > /dev/null || { echo "Please install homebrew/linuxbrew"; exit 1; }
for formula in "$@"; do
  [ -z "$count" ] && count="count" || echo
  brew info "$formula" 2>/dev/null | head -n3
done
```
Data Loaderでオブジェクト・項目アクセス権限を設定する

オブジェクトや項目へのアクセス権限は「項目権限オブジェクト」で管理されています。
ということは、このオブジェクトのレコードを追加すれば、プロファイルや権限セットによるアクセス権を付与したりすることができるということ。

もしかして：マウスをポチポチせずとも、セキュリティ設定は可能なのか？

~~その可否を解明するため、我々調査隊はアマゾンの奥地へと向かった――。~~


#項目権限（FieldPermissions）オブジェクト
プロファイルや権限セットで有効化された項目権限の情報が載ったオブジェクトです。このオブジェクトには以下の項目があります。詳しくは[こちら](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_fieldpermissions.htm)で確認できます。

| 項目名 | データ型 | 説明 |
|:-:|:-:|:--|
|ParentId   |参照関係   |権限セットオブジェクトへのリレーション項目   |
|SobjectType   |picklist   |権限をいじるオブジェクトのAPI名   |
|Field   |picklist   |権限をいじる項目のAPI名   |
|PermissionsEdit   |boolean   |オブジェクト・項目への編集権限   |
|PermissionsRead   |boolean   |オブジェクト・項目への参照権限   |

注意するべきはField項目で、ここの記述は**[オブジェクトのAPI名].[項目のAPI名]**の形で行います。

:::note info
取引先オブジェクトの従業員数項目なら、
Account.NumberOfEmployees
といった記述をします。Apexなどで、項目の指定をする時と同じ表記ですね。
:::

さて、これらの項目を含めたCSVファイルを作成して、Data Loaderを通して作成すればいいのですが…
そのためには、ParentId項目に入れる権限セットオブジェクトのレコードIDを入手する必要があります。

#権限セット（PermissionSet）オブジェクト
読んで字の如く、権限セットに関する情報の詰まったオブジェクトです。詳しくは[こちら](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_permissionset.htm)。
少しわかりにくい表現になってしまいますが、このオブジェクトには権限セットの情報だけではなく、**プロファイルによる権限セットの情報**も含まれています。

項目は多いですが、今回の操作に主に関係するものは以下の通りです。


| 項目名 | データ型 | 説明 |
|:-:|:-:|:--|
|Id   |id   |レコードのID   |
|ProfileId   |参照関係   |プロファイルによる権限セットの場合、そのプロファイルのID   |
|Label   |string   |権限セットの表示ラベル   |
|Name   |string   |権限セットのAPI参照名   |

#Data Loderでのアクセス権限設定手順
**①権限セットオブジェクトからIDを取得**
まず、項目権限オブジェクトのParentIdに入れるための、権限セットオブジェクトのレコードIDを取得します。
Data Loderで「Export」を選択して、権限セットオブジェクトを選択します。

:::note warn
「Show all Salesforce objects」にチェックを入れないと権限セットオブジェクトは表示されません。
:::

エクスポートする項目として、Id・ProfileId・Label・Nameを選択して、エクスポートを実行します。

:::note
出力する項目として、「Profile.Name」を手動入力でクエリに追加すると、プロファイル名が分かるようになるので、入力しておくとよいでしょう。
忘れた場合は、「ProfileId」項目のIDで検索を行えば、プロファイル名を特定できます。面倒ですが。
:::

**②インポートするCSVファイルの作成**
項目権限オブジェクトを作成するためのCSVファイルを作ります。前に提示した5つの項目を設定する必要があります。
作成例は以下の通りです。

| ParentId | SobjectType | Field | PermissionsRead | PermissionsEdit |
|:-:|:-:|:-:|:-:|:-:|
|0PS***************   |Account   |Account.NumberOfEmployees   |TRUE   |TRUE   |
|0PS***************   |Account   |Account.Industry   |TRUE   |FALSE   |

**③Data Loaderでインポート**
後はインポートするだけです。Data Loderで「Insert」を選択して、項目権限オブジェクトを選択します。

:::note warn
「Show all Salesforce objects」にチェックを入れないと項目権限オブジェクトは表示されません。
:::

後は、項目のマッピングをしてインサート、という普段Data Loderでインサートするのと同じ手順です。

#まとめ
Salesforceにおけるセキュリティで、おそらく一番最初にいじくるであろうプロファイルのオブジェクト・項目へのアクセス権限。そして次にいじくるであろう権限セットでのオブジェクト・項目へのアクセス権限。
数が少なければ、宣言的にマウスをポチポチして設定してもいいですが、（特に権限セットの）数が多くなればなるほど、手間や時間がかかるものです。こういった場合に、Dataloderで権限セットオブジェクトを一括で作成すれば、セキュリティ周りのミスも減るのかもしれません。
フィボナッチ数列を行列を使わずに対数オーダーで求める

$u_n$をフィボナッチ数列とする. すなわち

```math
\begin{align*}
u_0 &= 0, \quad u_1 = 1 \\
u_{n+2} &= u_n + u_{n+1}.
\end{align*}
```

この数列の第$n$項を求める問題を考える.

積み上げ式と呼ばれる以下のような方法がよく用いられる:

* $a=0$, $b=1$とおく
* $a, b = b, a + b$ という処理を$n$回繰り返す.
* $a$は$u_n$と等しい.

$n$が大きい時にもっと高速に求める方法を考えてみる.

行列を用いて計算する方法もあるが, ここでは整数だけでやる方法を考えてみる.

## 主張

以下の式とメモ化再帰を利用して, フィボナッチ数列を計算すると $O(\log(n))$である.

``` math
\begin{align*}
u_0 &= 0, \\
u_1 &= 1, \\
u_{n} &= u_{\frac{n}{2}}^2 + 2 u_{\frac{n}{2} - 1} u_{\frac{n}{2}} & \quad (n\text{が偶数のとき}) \\
u_{n} &= 2u_{\frac{n-1}{2}}^2 + 2u_{\frac{n-1}{2} - 1}u_{\frac{n-1}{2}} + u_{\frac{n-1}{2} - 1}^2
&\quad (n\text{が奇数のとき})
\end{align*}
```

## ソースコード

``` python
from functools import lru_cache


@lru_cache(maxsize=None)
def fib(n: int, mod=None) -> int:
    if n < 0:
        return (-1)**(n % 2) * fib(-n)
    elif n in (0, 1):
        return n

    m = n // 2
    fibm = fib(m, mod=mod)
    fibm2 = fib(m - 1, mod=mod)
    if n % 2 == 0:
        res = fibm**2 + 2 * fibm * fibm2
    else:
        res = 2 * fibm**2 + 2 * fibm * fibm2 + fibm2**2

    if mod:
        res %= mod

    return res
```

ただしここで, $n$が負の値の時は$(-1)^n u_{-n}$を返すようにした (一般化されたフィボナッチ数列という).

## 計算量の評価

式より $u_n$を$u_{\lfloor \frac{n}{2} \rfloor}$ と$u_{\lfloor \frac{n}{2} \rfloor - 1}$ から計算している.

* 最初の段に$u_n$を書く
* nが0でも1でもなければ $n$の下の段に $\lfloor \frac{n}{2} \rfloor, \lfloor \frac{n}{2} \rfloor - 1$がそれぞれ存在しなければ追加する, という処理を再帰的に実行する.

のようにして, 段の列を作成する.

例えば $n=10$のときは

``` math
\begin{align*}
& 10 \\
& 5, 4 \\
& 2, 1 \\
& 1, 0
\end{align*}
```

である.

作り方から この列の長さは$O(\log(n))$である.

それぞれの段の長さは高々3であることを示す.

まず, それぞれの段は連続する非負整数の列である.
これは帰納法で示すことができる.

今考えている列の要素のうち0でも1でもないような要素の数が1であるとき, $n$が偶数の場合と奇数の場合それぞれについて考えると

``` math
\begin{align*}
& 2k \\
& k, k-1
\end{align*}
```

及び

``` math
\begin{align*}
& 2k - 1 \\
& k - 1, k-2
\end{align*}
```

要素数が2のとき

``` math
2k, 2k-1 \\
k, k-1, k-2
```

及び

``` math
2k+1, 2k \\
k, k-1
```

要素数が3のとき

``` math
2k+1, 2k, 2k-1 \\
k, k-1, k-2
```

及び

``` math
2k, 2k-1, 2k-2 \\
k, k-1, k-2
```

となる.

いずれも長さは3以下であるから, それぞれの段の長さは高々3である.

## 数式部分の証明

$n$が自然数の時

``` math
\begin{align*}
u_{n} &= u_{\frac{n}{2}}^2 + 2 u_{\frac{n}{2} - 1} u_{\frac{n}{2}} & \quad (n\text{が偶数のとき}) \\
u_{n} &= 2u_{\frac{n-1}{2}}^2 + 2u_{\frac{n-1}{2} - 1}u_{\frac{n-1}{2}} + u_{\frac{n-1}{2} - 1}^2
&\quad (n\text{が3以上の奇数のとき})
\end{align*}
```

を示す.

フィボナッチ数の加法定理と呼ばれる以下の定理を思い出しておく:

自然数$s, t$に対して

``` math
u_{s+t} = u_{s-1}u_{t} + u_s u_{t+1}
```

が成り立つ(参考URL: [フィボナッチ数列の加法定理](https://yassu.gitlab.io/article/2020/02/27/fib-addition-theorem/)).

1) $n$が偶数のとき:

$n = 2k$とおく. フィボナッチ数の加法定理より

``` math
\begin{align*}
u_{2k} 
&= u_{k-1}u_k + u_k u_{k+1} \\
&= u_{k-1}u_k + u_k (u_{k-1} + u_k) \\
&= u_k^2 + 2 u_{k-1}u_k.
\end{align*}
```

2) $n$が3以上の奇数のとき:

$n=2k + 1$とおく. フィボナッチ数の加法定理より

``` math
\begin{align*}
u_{2k+1}
&= u_{k + (k+1)} \\
&= u_{k-1}u_{k+1} + u_k u_{k+2} \\
&= u_{k-1}u_{k+1} + u_k (u_k + u_{k+1}) \\
&= u_k^2 + u_{k-1}u_{k+1} + u_k u_{k+1} \\
&= u_k^2 + u_{k-1}(u_{k-1} + u_k) + u_k (u_{k-1} + u_k) \\
&= 2u_k^2 + 2u_{k-1}u_k + u_{k-1}^2
\end{align*}
```

後は $k$を$n$に戻せば 示される.
【 開発 Tips 】 HoloLens 2 アプリケーションのログ出力を確認する方法 ( UnityPlayer.log )

# はじめに
今回は Unity + HoloLens 2 開発に関する Tips **( 初学習者向け )** をご紹介したいと思います。

HoloLens 2 アプリケーション実行時に、端末に保存されるログファイル
 ( UnityPlayer.log ) の確認方法について、備忘録も兼ねてまとめておきます。

# UnityPlayer.log とは
Unity アプリ実行時に、アプリケーションに関する情報
 ( Plugin, Module, Build など ) やシステムログを記録するログファイルです。

- [LogFiles - Unity Manual](https://docs.unity3d.com/2020.3/Documentation/Manual/LogFiles.html) 

# 端末に保存された UnityPlayer.log の確認方法

### 1. Device Portal ( https://127.0.0.1 ) にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/1d430a01-77d5-dcbd-8383-cd9360a1d016.png)

Device Portal の有効化、接続方法に関しては以下、公式サイトをご確認ください。

- [Using the Windows Device Portal - Microsoft Docs](https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/using-the-windows-device-portal)

### 2. (サイドメニュー) System > File explorer を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/dbafb4ad-07d4-403f-7c39-7bf07b10a6a4.png)

### 3. User Folders > LocalAppData へ移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/b085f1ca-d81f-9637-2ca2-b8625dc92bee.png)

### 4. インストール済みのパッケージ名一覧が表示されるので、対象のパッケージ名を選択します。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/6078a93d-3681-2be3-4361-3aadb875c014.png)

### 5. TempState を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/d6299fd5-5b2d-0b69-89e9-6c8e99dade78.png)

### 6. UnityPlayer.log をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/1ddb161f-319d-52a1-da1a-a349adc897c5.png)

### 7. UnityPlayer.log を任意のエディターで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/42e057b4-c9f3-159b-a9ec-8d412cc7d7f5.png)

# 終わりに

HoloLens 2 実機でアプリケーションを操作している際に、不具合等で正常に動作しなかった場合に、
こちらの UnityPlayer.log を確認することで、どの処理で不具合が起きているのか？ログ内容からエラーの原因を特定することに役立てることが可能です。

実際、HoloLens 2 のハンドトラッキングが予期せぬ動作をした際に、以下のエラーログを発見し、問題を解決することができました。

エラー出力 : <font color="red">**HandConstraintPalmUp requires a palm joint, but none was provided by ArticulatedHand Controller Right.**</font>

ArticulatedHand Controller から何もデータが提供されていないということで、OpenXR の設定を見直すと、以下内容のチェックが抜けていました。
( 解決方法 ) Unity Player Settings > XR Plug-in Management > OpenXR Feature Group で Microsoft HoloLens にチェックにチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5142948a-aa7f-b36c-b337-9140783d6bf3.png)


# 参考文献
- [LogFiles - Unity Manual](https://docs.unity3d.com/2020.3/Documentation/Manual/LogFiles.html) 
- [Using the Windows Device Portal - Microsoft Docs](https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/using-the-windows-device-portal)
ProgressViewのアニメーションが適用されない



Swiftをやってて、ProgressViewがアニメーションされないと悩んでる人がもしかしたらいるかもしれないと思って、今回書いてみました。

例えば自分の場合は、レベルアップする感じのゲージ(ProgressView)をアニメーションを用いて表示させています。


そういうのを実装させるときに、次のように書くと動かない場合があります。

```php

import UIKit

class ViewController : UIViewController{

  override func viewDidLoad() {
        super.viewDidLoad()

   UIView.animate(withDuration: 1.0, delay: 1.0, options: .curveEaseInOut) { [self] in

                progressView.progress += 1

            } completion: { Bool in
                //アニメーションが終わった時に呼ばれる
            }

}
```

やり方の理屈としては動くはずなのに、動かない。

なので、次のようにしてみてください。

```php

import UIKit

class ViewController : UIViewController{

  override func viewDidLoad() {
        super.viewDidLoad()

   UIView.animate(withDuration: 1.0, delay: 1.0, options: .curveEaseInOut) { [self] in

              //  progressView.progress += 1//①これを、

              progressView.setProgress(1, animated: true)//②これに変える(以上)

            } completion: { Bool in
                //アニメーションが終わった時に呼ばれる
            }

}
```

こうすることで、動くようになったのではないかと思います。

では、さよなら！
[Objective-C][Xcode]GitレポジトリにはあるのにXcodeからは参照されてない素敵なファイルどもを駆逐する　駆逐したいな　とりあえず頑張る

# 忘れ去られちゃった子を見つけてあげる
はい。Xcodeはファイル削除するときに「参照のみ削除」なんてことができるので、
しばらくすると存在を忘れ去られるファイルというのが出てきます。

ごめんなさい。出てきました。僕が作ったんじゃないけど。

そんな奴らを大量のファイルから探し出します。

こんな感じ

```bash
proj=`find \`pwd\` -name "*.pbxproj" -print`

for file in `find . -name "*.h"|tr -d ' '` ; do
basename=`basename $file`;count=`grep -c $basename $proj`;if [ $count -eq 0 ] ;then echo $file;fi
done
```

ここで出力されてきたファイル名を頼りにファイルを実削除します。

なぜ tr -d ' ' でパスから空白を削除しているかというと、
[HogeHogeApp Watch Extension/Fuga.h] とかがあると、空白で分割されて
$fileに入ってくるからです。これうまくやる方法パッと思いつかなかったので。

# 同様に「参照されていないクラスのファイルを探す方法」

```bash
for file in `find . -name "*.h"|tr -d ' '` ; do
basename=`basename $file .h`;count=`grep -rl $basename *|wc -l`;if [ $count -le 3 ] ;then echo $file;fi
done
```

最低限、Fuga.h Fuga.m と project.pbxproj には名前があるはずなので、
それしかなかったら出力。.hしかないファイルとかも出てくるけどそれは目視で確認。
これで引っかからない子もいるけど、コメントとかもあるから、うん仕方ない。

```
#import "Hoge.h"
```
を探してあげた方がいいんじゃないの？とも思いますが、インポートはされずにStoryBoardから参照されてるだけの子もいるので。一応ね。

Swiftとかなら結構ツールがあるんだけど、Objective-Cはもう相手にされていないのか、なかなかツールがないんだよね。
**AppCode買えっていう正論は置いておいて。**

XcodeGenとかを使ってる場合は、それぞれよしなに。
RESTとSORP[概要を箇条書きにしてまとめてみた]

#RESTとSORPについて

RESTとSORPについて調べてみたので、箇条書きにしてまとめた。

参考にしたサイトもリンク貼っているので、もう少し知識を掘り下げたい場合に探す手間が省けると思います。
といいつつ、今はRESTのほうが使われているのでSOAPについてはあまり触れていません。



##SOAP(SimpleObject Access Protocol)概要

・SOAPは通信規約の一つ。メッセージの記述にXMLを用いる。
・SOAPで送受信されるXML形式のデータをSOAPメッセージ（SOAP message）という。
(参考: [SOAP 【Simple Object Access Protocol】](https://e-words.jp/w/SOAP.html))
・RESTと同様、データ転送にHTTPを用いる。
・SOAPは規格が決まっている（Microsoft がSOAP をインターネット技術特別調査委員会 (IETF) に提出し、標準化されている）。
（参考: [SOAP と REST の違いは何ですか？] (https://www.xlsoft.com/jp/blog/blog/2021/06/23/smartbear-19976/)）
・SOAPは様々なプログラミング言語で使用できるようだが、各言語によって扱う難易度が異なる。
（参考: [同上] )
・SOAPは巨大で複雑な仕様のため敬遠されるようになり、シンプルで軽量なRESTが普及していった。








##REST(REpresentational State Transfer)概要

・WEBサービスに利用されるアーキテクチャ。
・パラメータを指定し、そのサービスのURLにHTTPでアクセスする。
・RESTで用いられるHTTPメソッド(GETとかPOSTとか)はCRUD操作と対応付けられる。
・データはXMLやJSON形式で扱う（JSONが一般的）。
(参考: [REST入門 基礎知識] (https://qiita.com/TakahiRoyte/items/949f4e88caecb02119aa))
・設計原則として4つ提言されている。
（参考: [REST 【Representational State Transfer】] (https://e-words.jp/w/REST.html)）
・設計原則にステートレス（状態を持たない）とあるが、Cookie使ったりすることもある（設計原則に厳密に従わなくてもいい）。
・高速で軽量であり、IoTなどにも利用される。
・最近のWEBサービスは大体RESTであり、SNSサービス（TwitterやFacebookなど）とかもREST。
（参考: [0からREST APIについて調べてみた] (https://qiita.com/masato44gm/items/dffb8281536ad321fb08)）




感想

SOAPも記載していますが、とりあえずREST中心に覚えといたほうがいいかなと思います。
SOAPは軽く見つつ、RESTについては参考記事も一緒に見ていただければ！
UbuntuにAnsibleをインストールする手順

Linux環境にAnsibleをインストールします

## 使用環境

・ ホストOS: Windows10 Home
・ ゲストOS: WSL2 Ubuntu20

## 手順

下記コマンドを上から順に実行する。
[公式doc](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu)そのままの手順です

```bash
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
```

下記コマンドを実行してバージョンが表示されれば成功です。

```
$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.2 (default, Jul 16 2020, 14:00:26) [GCC 9.3.0]
```

ちなみにデフォルトではAnsibleは/usr/bin/ ディレクトリにインストールされます

```
$ which ansible
/usr/bin/ansible
```

### 参考資料

[Installing Ansible - Ansible Documentation](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu)
PPAP とは

## 勉強前イメージ

ピコ太郎しか出てこないーーー

## 調査

### PPAP とは

パスワード付きZIPファイルを送り、パスワードを別で送るメール送信手法です。
下記の頭文字を取ったものです。
`P` : passwordつきzipファイルを送ります。
`P` : passwordを送ります。
`A` : 暗号化します
`P` : プロトコル

元々は情報漏えい防止などのセキュリティ観点で使用されていましたが、
昨今ではセキュリティ上の課題があることで廃止される動きが進んでいます。

### セキュリティ上の課題とは

- パスワードの盗み見を防げるとは限らない

パスワードとファイルを別で送ったとしても
メールが盗聴されてる場合にはどちらも見られてしまうので
ファイルの中身も見られてしまいます。

- パスワードが解析できる

暗号化されたパスワードはかんたんに解析できてしまう事実はあります。

- ウイルスチェックをすり抜ける

パスワード付きzipファイルはウイルス対策ソフトをすり抜けてしまいます。
それを利用して、マルウェアを送るという手法も存在しますので推奨されていません。

### 対策

対策として、ファイル転送サービスの利用が安全にファイルを送ることが出来ます。

## 勉強後イメージ

パスワード付きzipファイルはアカンってよく聞く

## 参考

- [PPAPとは – パスワード付きZIPファイルの概要と課題](https://ent.iij.ad.jp/articles/1905/)
- [セキュリティのPPAP方式とは何か？ その問題点について解説](https://www.re-stec.co.jp/column/file-transfer/ppap-security)
Akashic Engineマルチプレイゲームにおける通信遅延を考慮したアニメーション同期

[Akashic Engine](https://akashic-games.github.io/) でマルチプレイゲームを作る際、通信遅延を考慮した他プレイヤーアクションのアニメーションタイミングの調整テクニックを紹介します。

# はじめに

マルチプレイゲームの場合、他プレイヤーのアクションはサーバを介して通知されるため、時間が遅れて自マシンに届きます。そのため、音ゲーなどのアニメーションのタイミングが重要なゲームだと、他プレイヤーの行動が遅れて反映されるような望ましくない形で表示されてしまいます。そこで、通信ラグを計測してアニメーションを調整することで、全プレーヤが同じ内容の画面を見ているようにします。

# 作りたい動作

飲み会などで最後に行う一本締めのワイワイ感をマルチプレイゲームにしたいと思い、幹事のかけ声にタイミングを合わせて「一本」するゲームを作ろうと思いました。仕様は以下の通りです。

* ゲーム開始時、プレイヤーが「一本」すべき時刻をプログラム内部で決める
* 上記時刻に合わせて幹事を模したキャラクターがかけ声をかける
* プレイヤーが幹事のタイミングに合わせて「一本」ボタンを押す
* 「一本」ボタンが押されたことを他プレイヤーに通知する
* 他プレイヤーが「一本」したことはリアルタイムに自分の画面に反映される

「一本」はリアリティを持たせるために下記のようなアニメーションを再生して表現します。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234545/6f2289e1-961f-5ad3-3183-66c52e4b3c6f.gif)

他プレイヤーが「一本」している様子は下記のように見えるようにします。

![d87307b88eb2249345ac021b6a454091.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234545/adcea099-7c89-33c4-1c72-fa11dd97df8e.png)

# 実装方法

まず、以下のように「一本」を実装しました。

* プレイヤーがボタンをクリックした際、自分が「一本」したことをイベントとして通知する

```typescript
const button = new g.Sprite({ /* ... */ })

// ボタンが押下されたとき、イベントを発火する
button.onPointDown.add(() => {
  g.game.raiseEvent(
    new g.MessageEvent({ 
      type: "ippon",
      playerID: g.game.selfId
    })
  );
});
```
  
* イベントを受信したら、他プレイヤーの「一本」としてアニメーションを再生する

```typescript
// avatars.プレイヤーID に、指定したプレイヤーの画像を格納する
const avatars: { [index: string]: g.FrameSprite } = { /* ... */ };

scene.onMessage.add(e => {
  // イベント受信時、アニメーションを再生する
  if (e.type === "ippon") {
    avatars[e.playerID].start();
  }
});
```

# 困ったこと

`scene.onMessage` に登録したイベントハンドラで、イベント受信時に `g.FrameSprite#start()`を呼び出してアニメーションするようにしました。
ところが、サーバ処理による通信遅延によって、本来の開始タイミングより遅れてアニメーションが開始するため、他プレイヤーが遅れて「一本」したように見えてしまいました。

![Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234545/3471c0f2-5226-796b-1146-5fc144fb1cf9.png)

この問題を解決する前に、Akashic Engineの `tick` 管理とイベント通知仕様について説明します。

# クライアントの同期の仕組み

Akashic Engineではクライアントから送られたイベント情報を、同じタイミングで全クライアントに送信する機能を提供しています。クライアントのゲーム時刻は `tick` というフレームカウントで管理されていますが、すべてのクライアントが同じ `tick` に同じイベント内容を受け取るよう動作します。

# 描画内容を同期させるには

通信遅延の分、アニメーションが遅く開始されてしまいます。送信元と同じアニメーションにするため、受信側はアニメーションの開始フレームをずらしましょう。そのため、送信イベントに何 `tick` 目に「一本」したか情報を付加します。

```typescript
// 現在tick目かを変数に格納する
let tick = 0;

scene.onUpdate.add(() => {
  tick++
});

const button = new g.Sprite({ /* ... */ })

// ボタンが押下されたとき、イベントを発火する
button.onPointDown.add(() => {
  g.game.raiseEvent(
    new g.MessageEvent({ 
      type: "ippon",
      playerID: g.game.selfId,
      tick: tick // 「一本」した時刻を他プレイヤーに通知する
    })
  );
});

// avatars.プレイヤーID に、指定したプレイヤーの画像を格納する
const avatars: { [index: string]: g.FrameSprite } = { /* ... */ };

scene.onMessage.add(e => {
  // イベント受信時、アニメーションを再生する
  if (e.type === "ippon") {
    avatars[e.playerID].frameNumber = tick - e.tick;
    avatars[e.playerID].modified();
    avatars[e.playerID].start();
  }
});
```

`g.FrameSprite` のアニメーション開始フレームを `tick - e.tick` とすることで、すでに通信遅延フレーム分進めたところでアニメーションを開始します。

これにより、プレイヤー間でアニメーションを擬似的に同じにすることができます。

![Qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234545/fbb8670d-023f-bb05-1c76-1df3df9f111c.png)
あなたの夏のgit commit、見てみませんか？

楽しい時は短いもので、なんともう夏も終わってしまいます。
そこで私は思いました、**「私はこの夏、何をしたのだろう？」**と・・・
ということで、コミットを一覧にするマクロを作ってみました！

##デモ画像
![qiita 使用画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612249/5f55b95d-866e-4dfd-2598-ad85c4cc99b8.png)

##使い方
以下のコマンドを、調べたいリポジトリの親ディレクトリ(workspaceなど)で実行してください[^1]

```bash:terminal
git clone https://github.com/WTomoharu/git-commit-viewer.git
cd git-commit-viewer
node index.js
```

そして、`localhost:3000`にアクセスすれば、
あなたのコミット履歴を見ることができます！

##詳細
リポジトリは[https://github.com/WTomoharu/git-commit-viewer](https://github.com/WTomoharu/git-commit-viewer)となります。
実行オプションなどは、README.mdに記載してあります。

##安全について


#### 負荷について
デフォルトでは、リポジトリの検索時には`max-depth=3`とし探索する深さを制限するとともに、検索後に.gitの最終更新日順に50個に絞り込んでから`git log`を実行しています。

#### セキュリティについて
実行されるコードは[こちら](https://github.com/WTomoharu/git-commit-viewer)にて全て公開しておりますので、心配な方はご確認をお願いします。
（Node.jsの権限って、実行してもらうには広すぎますよね・・・


## 終わりに
私が夏休みに頑張ったことが、コミット履歴として見れるのは、
ちょっとした満足感があり、少し嬉しくなりました。
あなたも、コミット履歴で自分の頑張りを見てみませんか・・？

[^1]: Git・Node.jsを前提として話を進めています。ない方は事前のインストールをお願いします。
【Python/IrfanView】読み取り画像のROI確認作業を手抜きする（Windowsのみ）


# IrfanViewとは

知る人ぞ知る、**昔ながらのWindowsの画像処理向けの無償ツール**。
ディレクトリ内の画像を確認したり、ディレクトリ内のファイルを一気に画像を変換したり出来る便利なやつ。
Windows 95時代から存在する古参だ。

https://www.irfanview.com/

## IrfanViewの仕様など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/45f4a17a-089c-a295-f5cb-6fd2fd6530ce.png)

　こいつ、**なんとコマンドプロンプトからの直接のコマンドを受け付ける**。

　今となれば、一括変換はOpenCVがPythonにデフォルトで付いているのであまり需要はないかもしれないが・・・

　表示したり画像処理をかけたりといった作業に対しては、わざわざPyQtやwxPython、tkinterなどで画像処理専用の画面を作らなくても良いので、専用の画像処理ツールがない環境でまじめに画像表示を作らなくていい場合、最もチープな画像確認ツールとして今でも使えると思う。

　そんなIrfanViewを、Pythonを使って外部実行する。

## 考え方

- subprocess.Popenで非同期処理でIrfanViewを実行する
 - 同期処理だと、PythonはIrfanViewの処理終了まで待機する必要があるため
 - 非同期にすれば、コマンドを送ったりやボタンをちまちま押すだけで好きな画像を表示するツールが出来る
- IrfanViewは大体Program Filesフォルダにi_view64.exe(64bit版の場合)みたいな感じで格納されている
 - 環境変数を設定するか、jsonファイルか何か用意してダイレクトに設定を書いてしまおう

```json
{
    "Extension" : {
        "Path_irfanview" : "C:\\Program Files\\IrfanView\\i_view64.exe"
    }
}

```

## コマンド集

https://www.etcwiki.org/wiki/IrfanView_Command_Line_Options

英語だが、日本語版もどっかにあったはず
最近では、ライブラリがあれば一括変換などは簡単にやってくれるので、あくまで表示する機能を使うにとどめる

あると便利そうなのは

- /bs
 - 画像をディスプレイの大きさに合わせて表示
- /crop, /resize, /resample
 - 画像サイズの変更や切り抜き
- /gray, /rotate_h, /hflip, /sharpen, /contrastなどの
 - 画像処理関係の処理


## ソースコード

こんな感じのソースコードを書くだけでirfanviewを立ち上げることが出来る
画像処理をかけることも可能.
ただし同一ディレクトリの画像ファイルに移動すると、その画像が読み込まれて、画像処理内容も消えてしまう。

```Python
import subprocess
from subprocess import PIPE

tr_path = "test.bmp"
tr_area = "/crop=({0},{1},{2},{3})".format(50, 100, 50, 50)
tr_title = "/title=切り抜き画像　注目座標：({0}, {1})".format( 50, 100)        

proc = subprocess.Popen( [self._graph_parameter["Extension"]["Path_irfanview"], 
			tr_path, tr_area, tr_title, "/bf"], stdout=PIPE, stderr=PIPE)
  

```

複数枚の指定したファイル名の画像のみ読み取る場合はこちら
画像処理は効かないので注意

```Python
import subprocess
from subprocess import PIPE

tr_path1 = "test1.bmp"
tr_path2 = "test2.bmp"

proc = subprocess.Popen( [self._graph_parameter["Extension"]["Path_irfanview"], 
			tr_path1, tr_path2], stdout=PIPE, stderr=PIPE)
```

Popenをイベントごとに送るようにすると、irfanViewが立ち上がって、指定した画像を読み取ってくれる

## 感想

Popen1行で画像が表示できる点は良い。
テストするときなどに使えると思う。

あくまでテスト用途なので、この機能を主機能にした設計はあまり望ましくない。
Prism コードサンプル学習：13-IActiveAwareCommands

# Prism コードサンプル学習：13-IActiveAwareCommands

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/62280f71acf9eeb96fcd>

## 13-IActiveAwareCommands

本サンプルは、前回の記事のCompositeCommandsのプログラムがベースとなっていますが、振る舞いが異なります。

- [前回](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/12-UsingCompositeCommands)の場合、上部のボタンを実行するとすべてのビューのコマンドが実行される
- [今回](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/13-IActiveAwareCommands)の場合、上部のボタンを実行すると表示されているビューのコマンドのみ実行される

上記の振る舞いの差がどこで生まれているかを以下で確認します。

- 1箇所目の差分は、CompositeCommandのコンストラクター引数にtrueが渡されていた点です。
  - コンストラクターにtrueが渡されると_monitorCommandActivityフィールドに値が渡されます。（[該当コード](https://github.com/PrismLibrary/Prism/blob/master/src/Prism.Core/Commands/CompositeCommand.cs#L33)）
  - _monitorCommandActivityフィールドに値が渡ると、[ShouldExecute](https://github.com/PrismLibrary/Prism/blob/master/src/Prism.Core/Commands/CompositeCommand.cs#L183)メソッドで実行すべきか否かが判定されるようになります。

  ```cs
  namespace UsingCompositeCommands.Core
  {
      public interface IApplicationCommands
      {
          CompositeCommand SaveCommand { get; }
      }
  
      public class ApplicationCommands : IApplicationCommands
      {
          private CompositeCommand _saveCommand = new CompositeCommand(true);
          public CompositeCommand SaveCommand
          {
              get { return _saveCommand; }
          }
      }
  }
  ```

- 2箇所目の差分は、TabViewModelクラスがIActiveAwareインターフェイスを実現していた点です。
  - TabViewModel.IsActivateプロパティが変更されると、コマンドのIsActivateも同時に変わります。
  - [過去記事](https://qiita.com/mngreen/items/41d3bd3159be3b279a5f)で読み進めた通り、TabControlが切り替わるタイミングでTabViewModel.IsActiveプロパティが切り替わると思われます。
  
  ```cs
  namespace ModuleA.ViewModels
  {
      public class TabViewModel : BindableBase, IActiveAware
      {
          // ... ここまで前回サンプルと同じコード ...
  
          bool _isActive;
          public bool IsActive
          {
              get { return _isActive; }
              set
              {
                  _isActive = value;
                  OnIsActiveChanged();
              }
          }
          private void OnIsActiveChanged()
          {
              UpdateCommand.IsActive = IsActive;
  
              IsActiveChanged?.Invoke(this, new EventArgs());
          }
  
  
          public event EventHandler IsActiveChanged;
      }
  }
  ```

- TabControlが切り替わり、コマンドのIsActiveプロパティが表示されているもの以外はfalseになるので、結果として表示されているViewのコマンドのみが実行されています。

## おわりに

今回はIActiveAwareCommandsと前回記事の差分を確認することで、利用方法を学びました。
このコマンドを利用すれば、表示されているビューのコマンドのみ実行させることができそうですね。
次回、[14-UsingEventAggregator](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/14-UsingEventAggregator)について見ていこうと思います。
LeetCodeを使って、未修得の言語の書き方を改善していく。

コーディングテストができるサービスにLeetCodeがあります。

LeetCodeで問題に正解すると、
実行速度とメモリ使用量の分布図と自分の位置を見ることができます。
また、分布別のサンプルコードもみることができるので、
自分の書いたコードと比較することで、コード改善の参考になるかもしれないです。

![スクリーンショット 2021-08-31 19.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178099/88e142d3-8b76-f60b-bc38-479a560534cb.png)

[LeetCode](https://leetcode.com)

英語なのが難点かもしれませんが、
普通に開発で英語ドキュメント読んでいる方であれば、問題なく使えるのではないかなと思います。

コーディングテストでは、正誤判定の他、実行速度とメモリ使用量を知ることができます。
実行速度とメモリ使用量は多少ブレがでますが、参考にはなります。

有料プランもありますが、無料でもかなり遊べます。
有料プランはGAFAMのコーディングテストの過去問や、ちょっと発展したコーディングテストができるみたいです。
興味のある人は遊んでみてから課金するのもいいかもですね。

## LeetCodeを使ってコードを改善する

LeetCodeは解答して正解した後であれば、他のコードを参考にすることができます。
正解すると、左側にAcceptedと表示されるのでクリックします。
そうすると、実行速度とメモリ使用量の分布図をみることができます。

![スクリーンショット 2021-08-31 19.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178099/10eb2b89-38a4-21e3-4475-f3097d43a455.png)

実行速度とメモリ使用量は多少ブレるものですが、自分のコードが効率が良いかどうかある程度知ることができます。
また、クリックするとサンプルになるコードが読めるので、どれが可読性が良いかというのを比較することができます。

![スクリーンショット 2021-08-31 19.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178099/c793e69b-dfe7-9d54-dcdd-a035b27c8ae9.png)

本やブログ、公式ドキュメントを読むのもいいと思いますが、
自分の書いたコードと他の人のコードを比較できるのは利点かなと思います。

なお、普段使っていなくて、これから覚えていきたいコードを書くときは、
普段使いしているコードで解答してから書き直してみると、違いがつかめて良さそうです。
Xcode 10.3 を macOS Big Sur で使用する


**libMainThreadChecker.dylib** を Xcode 12.x から取り出し、Xcode 10 に入れる。

:::note info
正常に起動し、ビルド→アーカイブ作成できるようになります
:::

:::note warn
ただし、アプリ作成は、Xcode12.xから作成してください
Xcode12.xのオーガナイザーからXcode 10.3で作成したアーカイブを指定し、アプリを作成してください
:::


Xcode 12.x

```
Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
```

Xcode 10.3

```
Xcode_10.3.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
```





[参考](https://developer.apple.com/forums/thread/667235?answerId=649167022#649167022)
今日から始めるHTML (HTMLとは)

<h1>この記事について</h1>
<p>ほんとうに今日から始めました。</p>
<p>ですので、初心者の書いた日記程度のものですので、期待せずに読んでください</p>

<h1>HTMLとは</h1>
<p>HTMLは、HyperTextMarkupLanguage(ハイパーテキストマークアップ言語)の略です。</p>
<p>ハイパーテキストとマークアップが特徴である言語、みたいな感じですかね。</p>
<h1>ハイパーテキストとは</h1>
<p>文書ファイルなどを結びつける仕組みのこと。普段使う「リンク」という言葉に近いようです。HTMLには、文書と文書を結びつけて、ページ間を飛び回れるようになる仕組みが備わっているのです。今では当たり前のような技術ですね</p>
<h1>マークアップ</h1>
<p>文字通り目印をつけることですね。何の目印を付けるかというとテキストに意味（テキスト上での位置づけ）を付け足します。</p>
<p>人間がWEBサイトを作成するとき、「ここがタイトルで、ここが見出しで…」と考えます。しかし、機械はそんなことを考えてはくれないのでただ文字を羅列するだけになってしまいます。</p>
<p>そこでHTMLでは、タグというものをテキストにつけて見出しやタイトルといったテキストの意味を人間から機械に伝達します。</p>
<h2>人間ってすごいという雑談</h2>
<p>例です。</p>
<p>私は、昨日我が家でパンを食べた。</p>
<p>上の文章をよんだとき、日本人は瞬時に行為者が「私」で行為が「食べる」であることが分かりますが、機械にはわかりません。（人間ってすごい）</p>
<p>(行為者)私（行為者）は昨日我が家でパンを(行為)食べた(行為)。</p>
<p>こうしてあげると機械でも理解しやすくなるかと思います。</p>
【TypeScript入門】TypeScriptでオブジェクト思考開発

## はじめに
TypeScriptでオブジェクト思考を学んだのでまとめてみました。

## クラスの３つの役割
1. まとめる：ある機能についてのデータと振る舞いをまとめる
1. 隠す：外部から参照・改変できないようにする
1. たくさん作る：同じ機能を持つクローンを量産できる

## 用語の整理
* プロパティ
    * クラスが持つデータ。フィールド、メンバ変数ともよばれる
* メソッド
    * クラスで宣言する関数のこと
* コンストラクタ
    * クラスからインスタンスを作るとき行う初期化
* インスタンス
    * クラスから作られたオブジェクト
    * クラスの機能をもつクローンみたいなもの

## アクセス修飾子の整理
* private: そのクラスでのみアクセス可能
* protected: そのクラスとサブクラスのみアクセス可能
* public: どこからでもアクセス可能（デフォルト）


```typescript
class Position {
  // private修飾子のついたプロパティは、Positionクラスから生まれたインスタンスのみで使用できる
  constructor(private suji: Suji, private dan: Dan) {}
}
```

## 抽象クラスはインスタンス化できない
* 抽象クラス(abstract修飾子のついたクラス)
* 抽象クラスはインスタンス化できない
* 継承でサブクラスを作るためのクラス


```typescript:通常のクラスの場合
class Piece {
  // protected修飾子のついたプロパティは、Pieceクラスとサブクラスから生まれたインスタンスで使用できる
  protected position: Position

  constructor(private readonly player: Player, suji: Suji, dan: Dan) {
    this.position = new Position(suji, dan)
  }
}

new Piece('first',1,'1') // OK
```

```typescript:抽象クラスの場合
// Pieceは抽象クラス
abstract class Piece {
  // protected修飾子のついたプロパティは、Pieceクラスとサブクラスから生まれたインスタンスで使用できる
  protected position: Position

  constructor(private readonly player: Player, suji: Suji, dan: Dan) {
    this.position = new Position(suji, dan)
  }
}

new Piece('first',1,'1') //NG コンパイルエラーになる
```

## 抽象クラスを使って、サブクラスを宣言する

```typescript:抽象クラス
// Pieceは抽象クラス
abstract class Piece {
  // protected修飾子のついたプロパティは、Pieceクラスとサブクラスから生まれたインスタンスで使用できる
  protected position: Position

  constructor(private readonly player: Player, suji: Suji, dan: Dan) {
    this.position = new Position(suji, dan)
  }

  // パラメーターに渡された位置へ駒を移動するメソッド
  // publicなので、サブクラスでオーバーライド（上書き）できる
  moveTo(position: Position) {
    this.position = position
  }


  // 移動できるかどうか判定するメソッド
  // abstractをつけて宣言しておき、サブクラスで具体的に実装する
  abstract canMoveTo(position: Position, player: Player): boolean
}
```

上記の抽象クラスからサブクラスを宣言する。canMoveTo（）のパラメーターと戻り値は同じだが、具体的な実装が異なるものが作れる

```typescript:サブクラス
// Pieceクラスを継承したOshoクラスを宣言
class Osho extends Piece {
  canMoveTo(position: Position, player: Player): boolean {
    // 移動先に指定された位置(position)と現在の位置(this.position)を比較
    const distance = this.position.distanceFrom(position, player)
    // 移動先との距離が2未満、つまり1マス以内なら移動できる
    return distance.suji < 2 && distance.dan < 2
  }
}

class Fu extends Piece {
  canMoveTo(position: Position, player: Player): boolean {
    const distance = this.position.distanceFrom(position, player)
    // 移動先との距離が前方1マスであれば
    return distance.suji === 0 && distance.dan === 1
  }
}
```
Javascriptにおける ”this” とは？

# はじめに
Reactやコンポーネント思考を利用するには必須といっていいほどの__"this"__について何となくでいつも使ってましたが、今回しらべるふと意味を調べられずにはいられなくなったので備忘録として残したいと思います。
*内容に不備や言葉足らずなところがあるかと思いますがご了承ください。

## thisとは？
__"this"__ってなんだ？
みんな大好きWeblio辞書で調べてみました。
> 主な意味：
>この、ここの、こちらの、こういう、(たった)今の、現在の、今…、当…、ある(一人の)
>__(空間的，時間的，心理的に話し手の近くにある対象を指す)__
>引用 : https://ejje.weblio.jp/content/this

ほぉ～・・・だよね。って思いましたがカッコ内にある内容がJavascriptととしての"this"の意味合いと
マッチしており（注：個人的主観）おおおおおおっ！となりました！！

### Javascriptとしての"this"
では早速本編に入っていきます。

下のコードを見てください。
特に何の変哲もない一般的なオブジェクト宣言とその呼び出しになります。

```javascript:this.js
const dog = {
  value: 'ブルドック',
  voice() {
    console.log(this);
    console.log(this.value);
  }
}
dog.voice();
```

dogオブジェクトの中にvalue変数とvoiceメソッドが定義されています。
voiceメッソドにはthisの中身とthisプロパティのvalueを表示するようにしています。
この実行結果が下記になります。

```console:result
{
  value: "ブルドック",
  voice: voice() {
    console.log(this);
    console.log(this.value);
  }
}
"ブルドック"
```

thisの中身を見たときにおお。。。dogオブジェクトそのままやん！！！！
そのとき最初に調べた"this"の意味と一致したのです。
まさにthisを指定した一空間を表示しているではありませんか！！！

>>__(空間的，時間的，心理的に話し手の近くにある対象を指す)__


ではさらに次のコードを見てみてください。
dogオブジェクトをanimalオブジェクトでラップしcatオブジェクトを追加しています。
それで再度実行した結果も併せてみてみましょう。

```javascript:this.js
const animal = {
  dog: {
    value: 'ブルドック',
    voice() {
      console.log(this);
      console.log(this.value);
    }
  }
  cat: {
    value: 'ペルシャ',
    voice() {
      console.log(this);
      console.log(this.value);
    }
  }
}

animal.dog.voice();
```

```console:result
{
  value: "ブルドック",
  voice: voice() {
    console.log(this);
    console.log(this.value);
  }
}
"ブルドック"
```

おお？さっきと実行結果が同じ？しかも同空間にあるはずのcatオブジェクトが含まれていませんでした。
この結果から分かるようにthisが指定された全範囲をスコープとするわけではなく、
__thisが指定された一階層上の範囲まで__効力が及ぶようになっているみたいです。

## 小難しい話編
一旦ここまでで大まかなthisについての説明は完了となります。
ここからは少し細かな話になります。

### グローバル変数としての”this”
定義したオブジェクトをよくグローバル変数として別定義して利用することもあるかと思いますが、
その場合の"this"についても見ていきましょう。
結論から言うと、”this”は元のオブジェクトを参照するのではなくグローバルオブジェクト(ブラウザであればWindowオブジェクト)を参照するようになっています。

```javascript:this.js
const dog = {
  value: 'ブルドック',
  voice() {
    console.log(this);
    console.log(this.value);
  }
}

const glDog = dog.voice;
glDog();
```

```console:result
[object Window] {
  addEventListener: function addEventListener() { [native code] },
～～～～中略～～～～～
  },
  window: [circular object Window]
}
undefined
```

先に述べたように変数に代入して利用した場合は、グローバルオブジェクトを参照するためdogオブジェクト内に定義してあるvalue値呼ばれずグローバルオブジェクトのvalue値を呼びに行こうとしてundefinedとして返されます。
(もちろんグローバルオブジェクト内にはvalueなんてものはないのでundefinedですねｗｗｗ)

もし変数として利用したい場合にはオブジェクトごと変数へと代入して利用することができます。
下記の通りです。

```javascript:this.js
const dog = {
  value: 'ブルドック',
  voice() {
    console.log(this);
    console.log(this.value);
  }
}

const glDog = dog;
glDog.voice();
```

```console:result
{
  value: "ブルドック",
  voice: voice() {
    console.log(this);
    console.log(this.value);
  }
}
"ブルドッグ"
```

んーーー、こんなことしてまで別だしして使う必要もないかと思いますがこんな感じです。

# まとめ
一旦こんな感じでthisについてまとめてみましたがいかがでしたでしょうか？
もやもやしながら使っていたものが理解しながら利用することで実装のヒントとして利用することができるかもしれません。
次回は"this"に最もかかわりの深い"bind"について投稿できればなと思っています！
ご閲覧ありがとうございました！！！

# 参考文献
[【初心者向け】JavaScriptのbindって何？？を理解する(call, appyも一緒に)](https://reffect.co.jp/html/javascript-bind)
aurora-mysql低コスト運用の注意点

Aurora-MySQL低コスト運用時の注意点
RDS-MySQLとの比較

# Performance Insights使う際のコスト
Aurora r6g.large 以上($225/month)
RDS    t3.medium 以上($75/month)
aurora-serverless は未対応

# 同じインスタンスでもちょっと高い
Aurora t3.small $0.063 / 1h
RDS    t3.small $0.052 / 1h

Aurora r6g.large $0.313 / 1h
RDS    r6g.large $0.26  / 1h

# インスタンスの種類ちょっと少ない
ここら辺欲しい
RDS    t3.micro  $0.026 / 1h
RDS    m6g.large $0.021 / 1h

# max_connections値、ちょっと少ない
Aurora t3.small   45
Aurora t3.medium  90
Aurora t3.large  135
RDS    t3.micro   85
RDS    t3.small  170
RDS    t3.medium 341
(RDS版は諸説あります。実際にこの値まで接続できるわけではないが）

# 補足
AuroraもRDSの一部だけど気にしない
AuroraはMulti-AZしなくてもストレージが分散されるのは強い