OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング講座 第三回 「Cで図形を表示しよう」

環境テスト
``` c:hello.c
#include <stdio.h>

int main(void){
    printf("hello\n");
    return 0;
}
```

0:00-0:30
``` c:kuku.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            printf("%4d",i*j);
        }
        printf("\n");
    }
    return 0;
}
```

0:30-4:45
``` c:for1.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        printf("hello\n");
    }
    return 0;
}
```

4:45-36:40

``` c:for2.c
#include <stdio.h>

int main(void){
    int i;
    for(i=0;i<10;i++){
        printf("for %d\n",i);
    }
    printf("%d\n",i);
    return 0;
}
```

36:40-55:50
``` c:kuku.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            printf("%4d",i*j);
        }
        printf("\n");
    }
    return 0;
}
```

55:50-64:52

``` c:asu.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(i%2==0){
                printf("*");
            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}
```

やってみよう
``` c:ad1.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(i*j%2==0){
                printf("*");
            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}
```

``` c:ad2.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(i*j%3==0){
                printf("*");
            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}
```

``` c:ad3.c
#include <stdio.h>

int main(void){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(j<i){
                printf("*");
            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}
```

数字や不等号、printfを少し変えるだけでめちゃくちゃおもしろいものが出来るのでぜひ！
Cypressにテストデータを用意する(fixtureの使い方)

# Cypressでテストデータを用意するには

## 解決すべきイシュー
Integration内のファイルでテストデータを用意するとコードがごちゃごちゃになって気持ち悪い。テストデータを別のディレクトリ内に配置したい。



## 最初に知っておくべきこと

Cypressにはこのようにデフォルトでfixtureというテストデータ格納用のディレクトリが用意されている。

![スクリーンショット 2022-05-12 21.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632129/6bdb213d-cdec-0c2f-d28a-780a8e03102d.png)

## テストデータの用意の仕方

Jsonファイルか.jsファイルにテストデータを用意。
.jsの場合にはmodele exportを忘れないようにする。

fixtureというディレクトリがデフォルトで用意されている。
ここに好きなテストデータを用意できる。
テストデータは.jsonファイルを用意してjson形式で書くか、jsファイルに
![スクリーンショット 2022-05-12 21.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632129/75a3cfa0-369a-7587-e76a-b696576e9a4f.png)

![スクリーンショット 2022-05-12 23.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632129/3e5a5b71-0998-d2c9-036c-55c98aba4e86.png)


## テストデータの読び出し

Integrationファイルの頭でrequire

![スクリーンショット 2022-05-12 23.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632129/6a7da7c1-e54b-faa8-7225-e99487a53e87.png)


これでIntegration内でテストデータが利用できます
【Unity】［エラー］コンポーネント追加時に Can't add script

# どういうことか

Unityを学習している。
[こちらの記事](https://qiita.com/nmxi/items/7950fb12ef925efa276d)を参考に、スクリプトを書いてコンポーネントの追加をしようとしたら掲題のエラーが出た。

エラー文でググってみたら「**ファイル名とクラス名で不整合があるとダメだよ**」ということがわかったが、自分の場合はその不整合がなかった。

https://qiita.com/Masayuki-M/items/2cb0addaad955ccca4e7

## 原因

おわかりだろうか。

```C#
    void Update() {
       if (Input.GetKey(KeyCode.LeftArrow)) {
           transform.position += transform.foward * 0.1f;
       } else if (Input.GetKey(KeyCode.RightArrow)) {
           transform.position -= transform.foward * 0.1f;
       }
    }
```

そう、`foward` が間違っている。`forward`が正しい。
なので下のコードに直したらエラーが出ずに追加することができた。

```C#
    void Update() {
       if (Input.GetKey(KeyCode.LeftArrow)) {
           transform.position += transform.forward * 0.1f;
       } else if (Input.GetKey(KeyCode.RightArrow)) {
           transform.position -= transform.forward * 0.1f;
       }
    }
```

この間違いは気づきにくい。。
Xcodeだと直してくれそうだけど、VSCodeでC#の機能拡張入れても特に警告とか自動補完とか無くて全然気づくことができなかった。
VSCodeでPHP書いてるときもこんな感じだったっけか。。もう自動補完がない感覚を忘れてしまった。
Ubuntu Desktop Linuxのインストール方法

Ubuntu Linuxとは、Linuxのディストリビューションの一つで、デスクトップLinuxの中では有名なものの一つです。
では、Ubuntu Linuxのインストール方法を書いていきます。
準備するもの
*  PC（古くても良い。あまり新しいものはドライバが対応してないことがある。)
*  USBメモリ
*  インターネット環境、太いほうがいい  


デュアルブートは基本的に難しいので、Linuxのみ使うPCを準備して、Linuxのみ入れることをオススメします。
以下のサイトでUbuntu Desktopをダウンロードします。
https://ubuntu.com/
今だとUbuntu 22.04でしょう。　　Ubuntu Desktopの22.04 LTSをダウンロードします。ファイルサイズが3.6GBぐらいあるので注意。
大きなファイルなので少し時間がかかります。
次にダウンロードしたイメージをインストールのためUSBメモリに焼きましょう。以下のツールを使用します。
https://www.balena.io/etcher/
balena etcherはオープンソースなので無料でダウンロードできます。このサイトのBalana Etcherが使いにくいと感じる場合は、Linuxのみの場合になりますが、githubサイトにアクセスして、コマンドでインストールが可能です。
https://github.com/balena-io/etcher

僕はUbuntu Linuxを使っているので、以下の指示に従う必要があります。
https://github.com/balena-io/etcher#debian-and-ubuntu-based-package-repository-gnulinux-x86x64

Linux、Windows、MacOSで使用できます。

Balana Etcherを起動すれば、以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53172/b9cf189a-7b0f-35c8-40c6-ab3110a1c68e.png)


Flash from fileをクリックし、Ubuntu 22.04 LTSのisoファイルを選択してください。次に、Select targetで、USBメモリを選択してください。最後に、Flash!を押せば、USBメモリにOSのインストーラーが入ります。

USBメモリに焼いたあとは、USBメモリをPCに刺し、BIOS設定を書き換えて再起動します。BIOS設定を書き換えるには、機種によって異なりますが、起動してメーカーのロゴが出た時点で、escキーを押す必要があります。そうすればBIOS画面が立ち上がります。BIOS画面ではマウスは使えず、キーボードで操作します。特徴的なUIなので、すぐ解ると思います。
BIOS設定画面は機種によって異なりますので、注意が必要です。
BOOT順序の一番目をUSBにする必要があります。
そして再び起動すれば、OSのインストーラーが走ります。
指示に従えば、Ubuntu Linuxがインストールされます。
Ubuntu Linuxのインストールが終わったら、OSのアップデートを必ずしてください。
「端末」を起動し、以下のコマンドを実行してください。
(注：GUIでのアップデートのみだと不十分なことがあるようです。かならず端末でもアップデートをお願いします。wifiに不具合起きます。また、端末でアップデートすればGUIでのアップデートは必要ありません）

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt autoremove
```
これで使用準備完了です。アップデートの後は必ず再起動をお願いします。

また、以下のようにまとめてアップデートを実行しても構いません

```
$ sudo apt update && sudo apt upgrade && sudo apt autoremove
```
[メモ]VisualStudioで使えるショートカット

2022.5.12 11日目

## やること
この記事はVisualStudioで使用できるショートカットに関してまとめていきます。（仕事で先輩に教えていただいたので、まとめておきたいと思ったので。）

環境
・VisualStudio2019
・Windows

## 用途毎のショートカット
私が使用しているものや、調べて知ったものをまとめています。

## 用途1.コード整理

#### ・Ctrl + R , Ctrl + G     
使用していないusingディレクトリを削除する

#### ・Ctrl + K , Ctrl + D
いらないスペースの削除
↑これ結構便利

#### ・Ctrl + K , Ctrl + F
VisualStudioに設定したインデントにコードを整理する
（選択した行のみ。Ctrl + A で全選択してからやると全て整理してくれます。）

## 用途2.コードを書く時
#### ・Alt + 十字キー↑↓
上下のどちらかに、選択した行を移動させる

#### ・Alt + Shift + 十字キー↑↓
上下どちらかを複数行選択
![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/f68f9c17-8ee1-6894-2201-14571ffda113.gif)
↑これ結構便利

#### ・Ctrl + K , Ctrl + C
選択範囲のコメント

#### ・F12
定義に移動

#### ・Shift + F12
参照へ移動（参照の一覧を下に表示？する感じ）


## 用途3.実行時に使える（Unityではスクリプトのアタッチ時）
#### ・F9
ブレイクポイントを設定

#### ・F10
ブレイクポイントで止まったところから、一行ずつ次に実行する行へ移動





こんな感じです。
他に何か見つけたり、思い出したり、知ったりしたものがあれば追記していきます。
今使っていないものは書いていないです。いいものがあれば知っていきたい…！
action textで画像が表示されない


## 現象
action textを利用したリッチテキストをレンダリングした際に画像が下のようにはてなのアイコンが表示されてしまう。

![スクリーンショット 2022-05-12 23.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960407/83bbd65b-60a1-16da-409c-1d8c9bbfb472.png)


## 発生エラー
```
LoadError (Could not open library 'vips.42': dlopen(vips.42, 0x0005): tried: 'vips.42' (no such file), '/usr/local/lib/vips.42' (no such file), '/usr/lib/vips.42' (no such file), '/Users/higuchiyuujirou/workspace/imagine/vips.42' (no such file), '/usr/local/lib/vips.42' (no such file), '/usr/lib/vips.42' (no such file).
```

## 対応
```
brew install vips
```

## 参考サイト
https://stackoverflow.com/questions/70849182/could-not-open-library-vips-42-could-not-open-library-libvips-42-dylib
無料でクラウド認定バッヂを集めちゃおう

# クラウド認定バッヂを集めちゃおう
この記事では IBM Cloud のバッヂを無料で自分のコレクションに追加します。
なお、筆者はIBM社員ではありません。

そして、全てがIBM Cloudサービスの技術情報かと思いきや、**クラウド一般技術**の勉強もできちゃいます。
例えば、クラウド入門「Cloud Core」は、AWS, Alibaba, Google, Azure, Oracle Cloudなど全てのクラウドに共通なクラウドの特長やクラウド市場など公平な講義も含まれるのでクラウド入門者に、お勧めです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/5bad7280-580a-5365-6c80-89339bf3c827.png)

## バッヂって何？
AWSやAzureなどのクラウドベンダー認定試験に合格すると、Credlyサイトがデジタルバッヂ（認証情報）を発行します。そのバッヂは、企業のプレゼンテーションの表紙などに掲示したり、LinkedIn、Twitter、Facebookに資格IDと一緒に共有して社外に技術力の証として示すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/cfe33569-6fee-d0a1-9232-99c3b14e1e9b.png)


## 無料で受験できるチャンスもある
最近は期間限定で、AzureやOracle Cloudなどのファンデーション（入門コース）の無料オンライン講習を受講すると、その特典として無料でクラウド認定試験を受験できるバウチャーをもらえることもある。

## IBM Cloud 無料受講できてバッヂが発行されるコースがある
各コース6時間とか8時間とかのオンライントレーニングを受講し、最後の理解度テストを受験するとCredlyで表示される様々なバッヂを取得することができる（下記、一部を抜粋）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/f322e51a-710b-c2e4-4dbc-4d9393a48e78.png)

受講するコースは下記IBMサイトで選べます

https://www.ibm.com/skills/badges/

Credlyサイトからも選べました

https://www.credly.com/organizations/ibm/badges

## 講義は英語なの？
グローバル企業（外資系）なので英語でした。でも大丈夫、**Chromeブラウザで日本語に機械翻訳**しちゃいましょう。

## それでは試しに、「Cloud Core」コースを受講してみます
このコースでは、「 （翻訳後）クラウドテクノロジーの基本を理解しており、IaaS、PaaS、SaaS、パブリック、プライベート、ハイブリッドマルチクラウドなどのクラウドプラットフォームとモデルを説明できます。」という人が修了できるBasicレベルとのことです。コース教材は「COGNITIVE CLASS」サイトを利用するので、最初にアカウントユーザをIBMidで登録しました。他にも、アカウントユーザ登録は、FacebookやGithub、GoogleなどのSSOを利用できます。

## コース受講申請
さっそく英語のログイン画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/43f3d15d-9dd9-0939-c621-41ad055d746c.png)

そしてChromeブラウザで日本語に翻訳ー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/797a1c1f-6f69-9807-9b22-1efdaed43011.png)

## クラウド入門を受講
コースシラバスが案内され、６つの章でそれぞれビデオ視聴し途中で３問くらいの理解度テスト（）がある。
全ての章を修了すると最後に無料の最終理解度テスト（Final Exam）がある。

```
モジュール1：クラウドコンピューティングの概要?
　　・はじめにと学習の目的
　　・ビデオ：クラウドコンピューティングの定義と本質的な特徴
　　・ビデオ：クラウドの簡単な歴史と進化
　　・ビデオ：クラウドコンピューティングに関する重要な考慮事項
　　・ビデオ：主要なクラウドサービスプロバイダーとそのサービス
　　・ハンズオンラボ：クラウドアカウントを作成する
　　・モジュールの概要
　　・段階的なクイズ

モジュール2：クラウドの採用とクラウド上の新しいテクノロジー
モジュール3：クラウドコンピューティングサービスと展開モデル
モジュール4：クラウドコンピューティングのコンポーネント
モジュール5：クラウドコンピューティングストレージおよびコンテンツ配信ネットワーク
モジュール6：新たなトレンド、クラウドネイティブ、DevOps、およびアプリケーションのモダナイゼーション
```

ビデオは英語だが、動画のとなりにセリフが表示される。これを日本語翻訳するとわかりやすい。
ときどき英語でセリフ表示されるが、一旦ブラウザをリロードして、再度日本語翻訳にすればたぶん上手くいく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/cc084b68-2d3a-8064-0b7b-ea2bf66c45e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/dcbebe33-b5ff-885c-9e7b-c2480b06e0cc.png)

## ハンズオンもやるの？
講義の途中で、IBM Cloud の無料で利用できるライトプランの開設方法が案内されます。この講座ではハンズオンは必須ではないので、ライトプランの登録はスキップすることも可能です。

## 証明書の発行とバッヂ発行
コース最後の理解度テストをしっかり合格すると証明書が発行され、Credlyのバッヂに案内されます。あとはいつもの様にLinkedinなどにリンクして公開しちゃいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/229bd887-b720-6a54-d80c-db0c4ba8f7ba.png)

## まとめ
僕の場合は２日間に時間を分けましたが、がんばれば無料で１日でクラウド認定バッヂを取得できます、きっと。
下記のいずれかのサイトで興味のあるコースを受講してみましょう。

https://www.ibm.com/skills/badges/

https://www.credly.com/organizations/ibm/badges
S3のファイルをCLIで一括ダウンロード ( + IAM最小権限の設定)

# はじめに
S3ファイルを複数ダウンロード一括でダウンロードするには、コンソールでは対応できず、CLIでできるようなので、IAMユーザーを最小権限で実行する方法をまとめます。

ついでにアップロードもできるようにします。

# 事前設定
S3バケット名`bucket-name`を作成し、バケット内に`/json/test.json`を作成

# CLIのセットアップ設定

下記の記事通りに設定します。

https://blackbird-blog.com/setup-aws-cli

上記記事の内、一部設定を変えます。
- profile名は、`s3-download`
- IAMユーザー名を`s3-download`
- IAMユーザーの権限は、次項に記載しています。

# IAMユーザー権限

## Action権限最小 + バケットを制限 + IP制限

S3のバケットの内`bucket-name`というバケット内のファイルのみを許可

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:IpAddress": {
          "aws:SourceIp": ["xxx.xx.xx.xx/32", "xxx.xx.xx.xx/32"]
        }
      }
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": ["s3:PutObject", "s3:GetObject"],
      "Resource": "arn:aws:s3:::bucket-name/*"
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}
```

## Action権限最小 + バケットを制限
S3のバケットの内`bucket-name`というバケット内のファイルのみを許可
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": ["s3:PutObject", "s3:GetObject"],
      "Resource": "arn:aws:s3:::bucket-name/*"
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}
```
## Action一覧

| Action  |内容  |Resource  | Condition  |
|---|---|---|---|
| ListAllMyBuckets  |権限のあるバケットのリスト表示  | * |IP制限|
| PutObject  |ファイルを書込（アップロード）  |arn:aws:s3:::bucket-name/*  |-|
| GetObject  |ファイルを取得（ダウンロード）  |arn:aws:s3:::bucket-name/*  |-|
| ListBucket  |バケット内のオブジェクトリストを表示  |arn:aws:s3:::  |-|

# ダウンロード
`bucket-name`バケットの`json`ディレクトリ配下のファイルをローカルの`./test`配下にコピーする
```terminal:ローカル
// バケット確認
$ aws s3 ls  --profile s3-download
2022-01-10 13:55:47 bucket-name

// ダウンロード
$ aws s3 cp s3://バケット名/ディレクトリパス  ローカルPCのパス  --recursive --profile プロフィール名

$ aws s3 cp s3://bucket-name/json/ ./test --recursive --profile s3-download

download: s3://bucket-name/json/test.json to ./bucket-name
```

`*.json`のみをダウンロードする場合
```terminal:ローカル
$ aws s3 cp s3://test_bucket/json/ ./folder --exclude "*" --include "*.json" --recursive --profile s3-download
```

# アップロード

```terminal
$ aws s3 cp ローカルPCのパス s3://バケット名/ディレクトリパス --recursive --profile

$ aws s3 cp . s3://bucket-name/json/ --recursive --profile s3-download
```


# S3に関する権限設定例

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-folder-user-access/
Node.jsのバージョン管理ツールvoltaの使ってみる(windows)

# はじめに
プロジェクトごとにNode.jsのバージョンを切り替えるツールについてwindows環境で**volta**が良さそうだったため、使ってみました。voltaを使えば、複数プロジェクトでバージョンが違うNode.jsプロジェクトがあった場合に、手動で切り替えなくても、プロジェクトを移動することで自動的にバージョンが切り替わります。
### インストール方法
windowsでは、インストーラーが用意されているため、下のリンクからダウンロード可能です。
[voltaのインストール(windows)](https://github.com/volta-cli/volta/releases/download/v0.9.2/volta-0.9.2-windows-x86_64.msi)
### Node.jsのインストール
Node.js v15を試しにインストールしてみます。
```bash
volta install node@15
node -v
v15.14.0
```
最新のLTSリリースをインストールするなら指定する必要はありません。
```
volta install node
```
### インストールしたNode.jsのバージョンを確認
```bash
#バージョンの一覧を表示
volta list all
⚡️ User toolchain:
    Node runtimes:
        v12.13.1
        v12.22.12
        v15.14.0 (default)
        v16.15.0
    Package managers:
    Packages:
#デフォルトのバージョンを表示
node -v
v15.14.0
```
### アンインストール
voltaには```uninstall```のコマンドが現時点で使用できないため、直接特定のバージョンのNode.jsを削除します。
具体的には、%LOCALAPPDATA%\Volta\tools\image\node\<バージョン>のディレクトリを削除します。
### npmのバージョン確認
Node.jsのインストールと同時にnpmもインストールされます。
```bash
npm -v
8.5.5
```
### ディレクトリごとにNode.jsのバージョンを固定する
プロジェクトのディレクトリまで移動して```volta pin```コマンドを実行します。
```bash
volta pin node@12.13.1
success: pinned node@12.13.1 (with npm@6.12.1) in package.json
```
するとpackage.jsonに下のように追記されます。これによって、プロジェクトのメンバー全員がNode.jsの同じバージョンを自動的に使えます。
```bash
"volta": {
   "node": "12.13.1"
 }
```
Node.jsのバージョンも変更されています。
```bash
node -v
v12.13.1
```
【備忘録】Ardupilot で障害物検出を行う（その1）

Ardupilot (rover)でGY-US42（ソナー）を用いて障害物検出の機能を追加したのでその方法を記載する。

## 環境
ハードウェア
・　オートパイロット：Cube Orange
・　非接触センサー　：GY-US42V2（ソナー）

ソフトウェア
・　ファームウェア　：Ardupilot (rover 4.2)
・　地上局　　　　　：Missionplanner(ver 1.3.77)

## 配線

![スクリーンショット 2022-05-13 115338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064722/2382493d-a9fd-421e-4a4b-fd8bf32bdbeb.png)

以下を参考に配線を行いました
https://ardupilot.org/rover/docs/common-rangefinder-gy-us42.html
https://qiita.com/Fumi_Saito/items/70bf8d61549cce47aa87

## 検出条件
・　検出距離　：　1m
・　回避方法　：　シンプルモード(停止)

## パラメータ設定
センサーの種類を距離計（RangeFinder）に、センサーの方向を前方に設定する。
|パラメータ|値|解説|
|-|-|-|
|AVOID_ENABLE|7|回避入力ソース ⇒ すべて使う|
|AVOID_MARGIN|1|回避距離マージン ⇒ 1m|
|AVOID_BACKUP_SPD|0|障害物から離れる最高速 ⇒ 0m/s（バック無効で車を止める）|
|PRX_TYPE|4|接続されている近接センサーの種類 ⇒ RangeFinder|
|RNGFND1_TYPE|2|接続している距離計の種類 ⇒ MaxbotixI2C|
|RNGFND1_ORIENT|0|接続している距離計の方向 ⇒ 前方|
|RNGFND1_MAX_CM|400|接続している距離計の最大距離 ⇒ 4m|
|RNGFND1_MIN_CM|0.2|接続している距離計の最小距離 ⇒ 0.2ｍ|

## 動作確認
車輪が回転しないようにしてセンサーに障害物を近づける。
以下の様になっていればOK

・　Sonar Range 　：　1.0ｍ以下
・　CH3 OUT　　　：　1500.00（ニュートラル）

通常時
![Snapshot_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064722/c91f9f1d-0ddb-79ad-4741-f1743b052978.png)

障害物検出時
![Snapshot_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064722/c14df104-e58a-4774-4056-1f6730f1b9f6.png)

## 参考
https://ardupilot.org/rover/docs/common-simple-object-avoidance.html
https://qiita.com/srs/items/eb50af277a29a129a5f9
Simple Data Integrator (SDI) とは

Simple Data Integrator (SDI) はデータベース間のデータ連携するソフトウェアです。 

![image.png](https://ja.sdi.ricct.com/img/sdi2.gif?t=20250331)

Simple Data Integrator（SDI）は、さまざまなリレーショナルデータベース（RDB）間のデータ連携をスムーズに実現するツールです。対応データベースには、Oracle、SQL Server、MySQL、PostgreSQL、DB2、Azure Synapse、BigQuery、Snowflake、ODBC接続可能な各種RDBが含まれます。

CSV、Excel、JSON、XMLといったファイル形式からRDBへのデータインポートや、RDBからファイルへのデータエクスポートにも対応しており、柔軟なデータ連携を可能にします。

インポート元・エクスポート先としては、ローカルファイルシステムのほか、FTP/FTPS、SFTP、AWS S3、OCI Object Storage、Azure Blob Storage など、各種クラウドストレージやリモートストレージに対応しています。

また、WebサービスやWeb APIからのデータ取得・連携にも対応しており、システム間の統合を効率よく行うことができます。

スケジューラー機能を活用すれば、指定した時間での自動連携や、ファイルの更新をトリガーとした処理の自動実行が可能です。

さらに、SDI Gateway Service は Proxy 機能を備えており、遠隔地とのセキュアなデータ連携をインターネット経由で実現できます。VPNや専用線の構築は不要で、手軽かつ安全に接続環境を整えることができます。

システムアーキテクチャ、動作環境につきまして下記のページに記述：
https://ja.sdi.ricct.com/userguide/systemarchitecture/

# 主要機能
### データ連携
- ソースDBのテーブル、ビュー、クエリからターゲットDBのテーブルへのデータ転送  
- CSV、Excel、JSON、XMLファイルからターゲットDBのテーブルへのデータインポート  
- ソースDBのテーブル、ビュー、クエリからCSV、Excel、JSON、XMLファイルへのデータエクスポート  
- SQL・ストアドプロシージャの実行  
- WebサービスやWeb APIとの連携  
- ワークフロー機能による連携処理の構築  
- 実行結果に応じたメール通知・イベント通知の送信  

### マッピング機能・監視
- データベースの可用性を監視し、障害の兆候を早期に検知  
- データ内容を監視し、イレギュラーデータや欠損、不整合などの異常を検出  

### スケジューラー
- 毎時、毎日特定時刻、週次、月次、リピート実行など、柔軟なスケジュール設定が可能  
- ファイルの更新をトリガーとして処理を自動実行  
- 複数タスクの並列（パラレル）実行および順次（シリアル）実行を制御  
- タスク失敗時の自動リトライ機能を搭載   

# 特徴
- シンプルな設計で、わずか3ステップでデータ連携やスケジューラー設定が完了  
- 基本的なデータ連携はノーコードで実現可能  
- 複雑な要件にも対応できるワークフロー機能を搭載  
- 離れた拠点間やマルチクラウド環境でのレプリケーション時にも、インターネット回線を利用してセキュアにデータ連携を実現  
  ハイブリッドクラウドにおけるデータ連携にも最適な設計  
- コールドスタンバイや自動フェイルオーバー機能を実装しており、システム要件や重要度に応じた柔軟な対策が可能  
- コマンドライン・インタフェース（`SdiCli.exe`）を利用することで、コマンドラインからマッピングタスクの実行が可能  


# ライセンス
|Edition|  価格  |  説明 |
|----| ---- | ---- |
|Developer Edition|無償(期限なし）|  開発、教育、デモ、非商業利用。機能制限なし |
|Express Edition|無償(期限なし）|マッピング数上限など機能制限あり|
|Standard Edition|有償|マッピング数上限など機能制限あり|
|Enterprise Edition|有償|全機能使用可能|

[Simple Data Integrator ライセンス](https://ja.sdi.ricct.com/license/licensesdi/ "Simple Data Integrator ライセンス")

以上です。

[Simple Data Integrator (SDI) 実践入門](https://qiita.com/RiCCT/items/3dc109ff82546459a8b0 "Simple Data Integrator (SDI) 実践入門")

# 参考資料
[SDI日本語公式サイト](https://ja.sdi.ricct.com/ "SDI日本語公式サイト")
[SDI English Official Website](https://sdi.ricct.com/ "SDI English Official Website")

<!-- Ver 2.1.2025.6 -->
eKYC とは

## 勉強前イメージ

わからんwww
eってなんぞ

## 調査

### eKYC とは

electronic Know Your Customer の略で、オンラインで本人確認を行うための技術になります。
元々対面や郵送で行う本人確認をKYCと呼びます。
そこにelectronicを追加したものがeKYCになります。

銀行や証券会社などで口座やクレジットカードを発行する際に使用されており利便性を高めています。
元々口座開設等はオンラインで出来ても本人確認は郵送が必要で時間がかかりましたが
電子化されることで郵送のときより早く口座が解説できるようになりました。

### eKYCのメリット

- セルフィーアップロード型

本人確認書類と写真を撮影

- フェデレーション型

事業者が口座開設時などの際に提出した顧客情報を提供

## 勉強後イメージ

口座作ったときとかに免許書の画像とかとった気がするー
あれがeKYCっていうやつか！

## 参考

- [フィッシング・不正利用を防止し、本人確認を効率化する「eKYC」とは？サービス提供事例も解説](https://biz.kddi.com/beconnected/feature/2020/200403/#:~:text=eKYC%E3%81%A8%E3%81%AF%E3%80%8Celectronic%20Know,%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%8CeKYC%E3%81%A7%E3%81%99%E3%80%82)
最大値プーリングをPythonで実装

最大値のプーリングをPythonで実装する方法
メモ書き
参考になれば幸いです。

```py
#ライブラリー呼び出し
import numpy as np

#下記データで最大値のプーリングをPythonで実装するには
#行列（データ）作成
array = np.arange(16).reshape(4, 4)
print("arrayは：", array)
#カーネル（フィルター）サイズ
kernel_size = 2
#ストライド（移動）サイズ
stride = 1

```


```py
#最大値でプーリングを実施する関数
def max_pooling(array, kernel_size, stride):
  a_h,a_w = array.shape
  print("a_h(行列横方向サイズ) : ", a_h)
  print("a_w（行列縦方向サイズ） : ", a_w)
  k_h = kernel_size
  k_w = kernel_size
  print("k_h（カーネルサイズ） : ", k_h)
  row = int((a_w - k_w)/stride +1)
  print("row(OUTPUT行列の横方向サイズ) : ", row)
  column = int((a_h-k_h)/stride + 1)
  print("column（OUTPUT行列の縦方向サイズ） : ", column)
  output = np.zeros((column,row))
  print("output行列（0行列）の作成：", output)
  for i in range(column):
    for j in range(row):
      temp = np.zeros((k_h,k_w))
      for m in range(k_h):
        for n in range(k_w):
          temp[m,n] = array[i*stride + m, j*stride + n]
      output[i,j] = temp.max()
      print("tempMAX(プーリングの最大値) : ", temp.max())
      print("temp.max()の値をi行目に入れる。 i : ", i)
      print("temp.max()の値をj列目に入れる。 j : ", j)
  print("プーリング後の最終出力は")
  return output
  

```


```py
#実際に出力
max_pooling (array, kernel_size, stride)

```

```py
#以下出力結果
a_h(行列横方向サイズ) :  4
a_w（行列縦方向サイズ） :  4
k_h（カーネルサイズ） :  2
row(OUTPUT行列の横方向サイズ) :  3
column（OUTPUT行列の縦方向サイズ） :  3
output行列（0行列）の作成： [[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
tempMAX(プーリングの最大値) :  5.0
temp.max()の値をi行目に入れる。 i :  0
temp.max()の値をj列目に入れる。 j :  0
tempMAX(プーリングの最大値) :  6.0
temp.max()の値をi行目に入れる。 i :  0
temp.max()の値をj列目に入れる。 j :  1
tempMAX(プーリングの最大値) :  7.0
temp.max()の値をi行目に入れる。 i :  0
temp.max()の値をj列目に入れる。 j :  2
tempMAX(プーリングの最大値) :  9.0
temp.max()の値をi行目に入れる。 i :  1
temp.max()の値をj列目に入れる。 j :  0
tempMAX(プーリングの最大値) :  10.0
temp.max()の値をi行目に入れる。 i :  1
temp.max()の値をj列目に入れる。 j :  1
tempMAX(プーリングの最大値) :  11.0
temp.max()の値をi行目に入れる。 i :  1
temp.max()の値をj列目に入れる。 j :  2
tempMAX(プーリングの最大値) :  13.0
temp.max()の値をi行目に入れる。 i :  2
temp.max()の値をj列目に入れる。 j :  0
tempMAX(プーリングの最大値) :  14.0
temp.max()の値をi行目に入れる。 i :  2
temp.max()の値をj列目に入れる。 j :  1
tempMAX(プーリングの最大値) :  15.0
temp.max()の値をi行目に入れる。 i :  2
temp.max()の値をj列目に入れる。 j :  2
プーリング後の最終出力は
array([[ 5.,  6.,  7.],
       [ 9., 10., 11.],
       [13., 14., 15.]])

```
Cognitive Search カスタム Web API スキルを実装する時は入力データの単位に気を付ける



[ドキュメント](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-custom-skill-web-api?WT.mc_id=Portal-Microsoft_Azure_Search)に書いてあることだが、動かしてみないと理解できなかった。
設計時に注意したい入力データの単位の注意点をまとめる。

- 複数のファイルが indexer に処理される場合、"データ レコード"も複数になり、`batchSize` が 1 でない限りは入力オブジェクト(`values`の中身)が複数になる
- 入力オブジェクトと同じ数だけ response body にオブジェクトを詰める必要がある
    - `recordId` 入力と出力で一致させる
- collection (ex. /document/normalized_images/* ) が入力になった場合も入力オブジェクトが複数になる
- 入力の構造体を調整する場合は [Shaper](https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-shaper) を利用する
- `batchSize` を小さくするとスループットが悪くなるので気をつける
dockerのVolumeにマウントするNFSサーバーをdockerで構築する

DockerのVolumeとしてNFSをマウントすることができるようです。

https://docs.docker.com/storage/volumes/#create-a-service-which-creates-an-nfs-volume

いっそのことNFSサーバーもDockerで構築したら面白いのではないかと思い、試してみました。

## GitHubを探索

そもそも私はNFSサーバーを構築したことがありません。
なので、まずはネットでそのまま使えそうなDockerfileを探しました。

探してみたところ、、、**GitHubにありました！！！**
しかも、**`Google Cloud Platform`のリポジトリ内に！**

すごーい😀

https://github.com/GoogleCloudPlatform/nfs-server-docker

## docker-composeの作成

上記リポジトリの`1/debian9/1.3/`ディレクトリに`Dockerfile`と`docker-entrypoint.sh`があります。
このまま使ってもいいですが、ベースイメージが古そうなのと、NFSのバージョンが固定だったので、`Dockerfile`だけ改変しました。あとはdocker-compose.yamlを作成しました。
（理解できませんでしたが、どうも`docker-entrypoint.sh`の中で色々処理をしてそうでした）

```Dockerfile:Dockerfile
# Copyright 2016 The Kubernetes Authors.
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# FROM gcr.io/google-appengine/debian9
FROM debian:bullseye-slim

ENV NFS_VERSION 1:1.3.4-2.1

ENV C2D_RELEASE 1.3.4

RUN set -x && \
    apt-get update && apt-get install -qq -y nfs-kernel-server && \
    rm -rf /var/lib/apt/lists/* && \
    mkdir /exports

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +rx /usr/local/bin/docker-entrypoint.sh

VOLUME /exports

EXPOSE 2049/tcp
EXPOSE 20048/tcp

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
CMD ["/exports"]
```

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

services:
  nfs-server:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      TZ: '=JST-9'
      USERID: 1001
      GROUPID: 1001
    volumes:
      - ./exports:/exports
    privileged: true
    restart: always
    ports: 
      - "2049:2049"
      - "20048:20048"
```

## 起動

```shell
docker-compose up -d
```

これでNFSサーバーが起動します。

## NFSサーバーをマウントする

NFSサーバーを使う側は`volumes`をこのように指定します。`device`の指定はNFSサーバーのルートから見たディレクトリの位置です。ディレクトリは存在していたほうが良さそうです。

```yaml
volumes:
  nfs-server:
    driver_opts:
      type: nfs
      o: "port=2049,addr=XX.XX.XX.XX,rw,nfsvers=4"
      device: ":/mount"
```
PowerAutomate: Microsoft 365 管理センター の通知を翻訳して Teams に通知する

# 背景
Microsoft 365 管理センター のメッセージセンターの内容は有用なんですが、
会社の環境だと管理センターへのアクセスそもそもが許可されてない

ってことで、それを翻訳した上で、会社環境の Teams で見られるようにした記録

結果はこんな感じ、自動翻訳なので、原文を先に貼り付けて、理解の補助にするぐらいが丁度よい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/00f557cd-a793-cc34-56a9-e1754a06fc34.png)


# 概要
1. [自宅環境でメッセージセンターの通知設定](#自宅環境でメッセージセンターの通知設定)
1. [会社メールで受信して、翻訳と共に、Teams へ転送](#会社メールで受信して翻訳と共にteams-へ転送)


# 詳細
## 自宅環境でメッセージセンターの通知設定
設定自体は簡単で以下程度
- 通知対象の選択
- 通知メールの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c24cce55-d00e-a4e5-d19a-cec63d1cc9da.png)

そうすると、こんな感じでメールで通知されてきます
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e321c6de-3208-1924-e7a6-506bc09ee1a4.png)


## 会社メールで受信して、翻訳と共に、Teams へ転送
### フロー全景
1. [メール受信トリガー](#メール受信トリガー)
1. [Body を翻訳](#body-を翻訳)
1. [原文 + 翻訳文　をTeams に投稿](#原文--翻訳文をteams-に投稿)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b6856206-d52b-1bec-0fae-89c1eb85a2e1.png)


### メール受信トリガー
Weekly Digest は不要だったので、件名でフィルター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/be91fd00-0e64-6db2-1de4-4ad3b36f1d22.png)

### Body を翻訳
翻訳アクションは以下を使う
[テキストの翻訳](https://docs.microsoft.com/ja-jp/connectors/translatorv2/#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E7%BF%BB%E8%A8%B3)

html の翻訳の場合、以下設定をしておかないと文字数制限にひっかかるようになるので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/4cefa1bc-cc33-ea5d-f679-8b26d0bf6cda.png)

:::note warn
制限について
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/264e6899-d304-cb5b-29a1-526ce59a3357.png)

"Text Type" を設定していないと、一発で越える可能性もあった記憶。
:::


### 原文 + 翻訳文　をTeams に投稿
原文 + 翻訳結果 を返信してやるだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b7278e38-dd23-09f1-5a6a-0511902120fe.png)

```json:Teams投稿内容
<p>
@{triggerOutputs()?['body/body']} 
========= 以降、翻訳 by Translate text ========= 
@{body('Translate_text')}
</p>
```

# あとがき
チャネルにメールアドレスで直接通知する道もあるけれど、その場合、スレッド化されてしまうので、Reply を利用して単一スレッドにまとめてます。
Python実践データ分析100本ノック備忘録（1章）

# 背景
独学でpythonによる機械学習を学んでいます。
kaggleにも挑戦しましたが基礎が全然身についてねーということを実感したので、
良書とよく聞く「Python実践データ分析100本ノック」に挑戦します。
知識の体系化のため、ちょくちょく備忘録を作っていきます。

# 第1章ノック1~で役立ちそうと思った知識
・データ結合は縦方向はcocat、横方向はmerge
左にメインとなるデータ、右に結合するデータで、how = leftとする。
keyには各データ共通のIDを、エクセルで試験群ごとにいろんなデータを並べるイメージ（理系あるある）
・データフレームから特定の列データを出すとき
```
join_data["price","quantity","item_price"]
×だめです、ネスト構造にしましょう。
join_data[["price","quantity","item_price"]]
○最高です。
```
・データ加工を行った際は、件数の確認等や検算を必ず行うこと。
ミスはデータサイエンティストとしての信頼を失います。
（最重要ですね、ただミスしてもいいぐらいゆるく生きたいという本音はあります。笑）

・統計量の把握に使えるメソッド
```
欠損値
.isnull.sum()
統計量
.describe()
```

・ピボットテーブルの書き方
```
.pivot_table(df, index, columuns ,values(集したい値）,aggfunc(集計方法）
```
・折れ線グラフ
```
plt.plot(横軸,縦軸,ラベル）
```
Androidアプリのメモリについて

# はじめに
メモリリークのエラー発生時に、使用可能なメモリとメモリ使用量について調査したのでまとめました。

# 開発環境
PC：MacBook Pro
OS：macOS BigSur
Android Studio：Arctic Fox 2021.1.1

# メモリ調査方法
`ActivityManager.MemoryInfo()`のメソッドを使用してメモリ情報を取得します。

```kotlin:MainActivity.kt
        // メモリ情報を取得
        val activityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
        val memoryInfo = ActivityManager.MemoryInfo()
        activityManager.getMemoryInfo(memoryInfo)

        // 利用可能なメモリーサイズ
        Log.d("メモリ情報", "availMem:" + memoryInfo.availMem)

        // 利用可能なメモリーサイズが不足の時、解放するか判断する、しきい値
        Log.d("メモリ情報", "threshold:" + memoryInfo.threshold)

        // システムがメモリ不足と判断しているか(メモリ不足の状況と見なす場合はtrue)
        Log.d("メモリ情報", "lowMemory:" + memoryInfo.lowMemory)

        // アクセスできる合計メモリ
        Log.d("メモリ情報", "totalMem:" + memoryInfo.totalMem)
```

上記を追加し実行すると以下のログが出力され、メモリ情報を確認できます。(端末によって数値は異なります)

```
 D/メモリ情報: availMem:1084989440
 D/メモリ情報: threshold:150994944
 D/メモリ情報: lowMemory:false
 D/メモリ情報: totalMem:2076913664
```

# 参考文献
・[Google developers(ActivityManager.MemoryInfo)](https://developer.android.com/reference/android/app/ActivityManager.MemoryInfo)
・[Google developers(アプリのメモリを管理する )](https://developer.android.com/topic/performance/memory?hl=ja#CheckHowMuchMemory)
Error: Requiring module "node_modules/react-native-tab-view/lib/module/TabBar.js", which threw an exception: Error: Requiring module "node_modules/react-native-reanimated/src/Animated.js"の解決方法

ググって対応
これで動いた！
module.exports = {
      ...
      plugins: [
          ...
          'react-native-reanimated/plugin',
      ],
  };
[golang]list内の重複した値を消す

```
package main
import "fmt"
func main() {

	people := []string{"tanaka", "sato", "koike", "tanaka", "sato"}

	unique := make([]string, 0, len(people))

	m := make(map[string]struct{})

	for _, v := range people {
		if _, ok := m[v]; ok { //重複している際はok(true)となる
			fmt.Println(ok)
			continue //continueが終わった後再びforループの先頭に戻る
		}
		unique = append(unique, v)
		m[v] = struct{}{} //重複を消す処理

	}
	fmt.Println(unique)　//出力：tanaka sato koike
}
```
HyperFormでお問い合わせフォームを実装してみた

## はじめに

バックエンドサーバを用意せずにお問い合わせフォームを簡単に実装できる [HyperForm](https://hyperform.jp/) がリリースされたので使ってみました。

## 実装

使い方は超簡単。
`<form>`タグの`action`にHyperFormで提供されたカスタムURLを設定し、POST送信するだけ。

```html
<form
  method="post"
  action="https://hyperform.jp/api/4Xn7BB8d"
  className="lg:mx-5"
>
```

https://github.com/koukibuu3/portfolio/pull/20/files#diff-b194f05d40e20775e80b69233f8339a8f3712b30fd1081a93da34a3892b9669dR10

こんな感じ。

特にお問い合わせが来る想定はしていないけど、ポートフォリオサイトに設定してみました。
https://koukibuu3.net/

## おわりに

今回はライトにformを書いただけだけれども、非同期でPOSTメッセージを送信してあげる使い方もできそう。
時間があるときにもう少しちゃんと実装してみようと思います。

爆速でお問い合わせフォームが作れるので、とてもオススメです。
ウォードライビング とは

## 勉強前イメージ

セキュリティ系のなにかだったようなきがする
ドライビングって運転とかそこらへん？

## 調査

### ウォードライビング とは

war driving と書き、不正アクセスの手法の一つ。
車で移動しながらセキュリティに不備がある無料のアクセスポイントを探してネットワークに侵入してクラッキングを行う。
ウォードライビング自体は移動しながらアクセスポイントを探す行為。
最近は許可されていない企業などのアクセスポイントに侵入することもウォードライビングと言われている。
機器やルーターの脆弱性を悪用したり、認証用のパスフレーズを割り出したりするなどは不正アクセスになります。

無線LANの電波を受けて自動的にアクセスポイントやSSIDを表示したりするようなソフトウェアも存在する。

元々wardialingというダイアルアップ接続が行われていた時代に、アナログモデムが応答する番号を探して番号リストを片っ端から自動ダイヤルする行為があり
それをもじってwar drivingと言われている。

## 勉強後イメージ

よく無料のアクセスポイントは危ないって言われるけど
こういうことだったのね。

## 参考

- [ウォードライビング 【war driving】](https://e-words.jp/w/%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%89%E3%83%A9%E3%82%A4%E3%83%93%E3%83%B3%E3%82%B0.html)
- [ウォー・ドライビング](https://atmarkit.itmedia.co.jp/fwin2k/keyword/wardriving/wardriving.html)
Angular get timezone iD and abbreviation 

// GET Timezone ID
const timezoneId = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(timezoneId);
// GET Timezone abbreviation(short name)
const abbreviation = Intl.DateTimeFormat([], {timeZoneName: 'short'}).formatToParts(new Date()).filter(({type, value}) => type === 'timeZoneName')[0].value;
console.log(abbreviation);
[Python] 辞書型とかのネスト先のデータを取得する方法

pythonでネストしたJSONデータにアクセスしたいことが結構あります。
jqを使うのを迷いつつ、でもifで繋げるのが面倒なので、簡易的にデータを抜く関数を作ってみました。
laravelで言うところの```data_get()```みたいなやつです。
対応はdict() or list()です。

## 構造
```
・ lib/
   |-- __init__.py
   |-- function_utils.py
  test.py
```


```python:test.py
from lib import FunctionUtils

def test():

    # ネストアイテム
    item_group = {
        "id": 1,
        "name": "hoge",
        "option": [
            {
                "sort": "ASC",
                "field": "price"
            },
            {
                "sort": "DESC",
                "field": "products"
            },
        ],
        "menu": {
            "name": "カツ丼",
            "special": False
        }
    }

    print(function_utils.nested_item_value(item_group,[]))
    print(function_utils.nested_item_value(item_group,['id']))
    print(function_utils.nested_item_value(item_group,['id','test']))
    print(function_utils.nested_item_value(item_group,['option']))
    print(function_utils.nested_item_value(item_group,['option',0]))
    print(function_utils.nested_item_value(item_group,['option',0,'field']))
    print(function_utils.nested_item_value(item_group,['option',0,'field','hoge']))
    print(function_utils.nested_item_value(item_group,['menu','special']))
    print(function_utils.nested_item_value(item_group,['menu',0,'hoge',True]))

test()
# -- 結果 ----------------------
{'id': 1, 'name': 'hoge', 'option': [{'sort': 'ASC', 'field': 'price'}, {'sort': 'DESC', 'field': 'products'}], 'menu': {'name': 'カツ丼', 'special': False}}
1
None
[{'sort': 'ASC', 'field': 'price'}, {'sort': 'DESC', 'field': 'products'}]
{'sort': 'ASC', 'field': 'price'}
price
None
False
None
```

```python: lib/__init__.py
from lib.function_utils import FunctionUtils
```

```python:lib/function_utils.py

class FunctionUtils:

 # ネストデータにアクセスする関数
 def nested_item_value(self,parrent_object,nest_list):
        """ return nested data """

        if not nest_list: return parrent_object

        result = ""
        for nest_key in nest_list:
            object_type = type(parrent_object)
            if object_type is not dict and object_type is not list:
                result = None
                break
            elif object_type is list:
                if type(nest_key) is not int:
                    result = None
                    break
                result = parrent_object[nest_key] if nest_key < len(parrent_object) else None
            else:
                result = parrent_object.get(nest_key,None)
            
            if result is None: break
            
            parrent_object = result
        
        return result
```

簡単に説明すると、
・```nested_item_value(parrent_object,nest_list)```の第１引数に対象データを、第２引数ではネスト順でkeyを[]指定します。
・第２引数が空配列の場合、第１引数の対象データを返します。
・ネスト先にデータが存在しないときは総じて```None```を返します
もっといい書き方があると思いますが、それはまた後日追記できればと思います。
もしあれば教えて下さい。m(_ _)m
【PowerAutomate】週次の定型メールを自動送信

## 概要

定型文のメールを毎週送る謎作業を、PowerAutomateで自動化してみました。

## 対象プロセスの整理

* タイミング：毎週金曜日16時(祝日の場合の取り決めなし)
* 送付先：毎回同じ(社内のみ)
* 送付元：毎回同じ(個人アカウントのメールアドレス)
* 件名：【○○通知】2022/05/07～2022/05/13
※前週の土曜日と、今週の金曜日(＝送付当日)を、yyyy/mm/ddで表現
* 本文：毎回同じ
※かつては「新規○件、変更○件」みたいな記載をしていましたが、しれっとやめました。
※参照してもらうファイル名も本文に記載していましたが、しれっとやめました。実際のファイル名の日付ではなく、「ファイル名_yyyymmdd.xls」とすることで固定化できました。

## PowerAutomateに変換

### 繰り返しの設定

![bot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/f85de400-6cc9-5c9a-7c78-944e48dbc400.png)

開始時刻の書式は、下記の通りです。
`2022-05-01T16:00:00Z`
未来日から実行開始するわけではないので、過去日で、書式が合っていればなんでもいいと思います。

### 日付処理用の変数の宣言

![bot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/488ed94d-ed0d-4a33-395b-8c17375e7955.png)

件名に記載する日付を処理するための変数を宣言します。
値には、それぞれ下記の式が入力されています。

**Date1(起点日＝前週の土曜日)**
`
formatDateTime(convertTimeZone(addDays(utcNow(), -6), 'UTC', 'Tokyo Standard Time'), 'yyyy/MM/dd')
`

**Date2(終点日＝今週の金曜日＝送信当日)**
`
formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'yyyy/MM/dd')
`

**Date2**は、ゼロ埋め・スラッシュ区切りで今日の日付を表現する式です。月は大文字のMMです、小文字のmmだと分になるため。
**Date1**は、同じ書式で「今日の日付から6日前」を表現しています。Date2の式の`utcNow`を、`addDays`で-6しただけです。送信日は必ず金曜日なので、6日前は土曜日になります。

### メール送信

![bot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/3b1a73e3-6bfc-88f2-62c5-e5199f16ef47.png)

件名に、先ほど宣言した変数Date1・Date2を入れています。
なお、メール送信時に**Outlookの署名は付加されない**ので、必要に応じて追記しておきましょう。署名設定を自動取得して付加する方法があるかも。

## まとめ

* 件名の日付の処理は、Excelなどと違う関数を使う必要があるので、ちょっと面倒でした。
* 定期的なメール送信の仕組み自体は、驚くほど簡単です。RPAの真骨頂を感じました。
* 自部署の作業工数は限りなくゼロに近づけることができましたが、会社全体でのムダ(と思われる)作業が減っていないのは心残りです。
* 16時ちょうどではなく、ランダムで数分遅らせる仕組みも作ってみようと思います。人間のあたたかみをプラス。

## 補足

作成したフローが私のアカウントに紐づいており、チームメンバーへの共有やエクスポートが現プランだとできませんでした。
つまり、私が現職を去る時は、他メンバーのアカウントで同じ仕組みを作ってもらう必要があります。
laravel-openapiライブラリ 導入方法

# 概要

- laravel-openapiの導入方法をまとめる。

# 方法

1. アプリケーションディレクトリで下記コマンドを実行する。

    ```terminal
    $ composer require vyuldashev/laravel-openapi
    ```

1. 下記コマンドを実行して構成ファイルを使える状態にする。

    ```terminal
    $ php artisan vendor:publish --provider="Vyuldashev\LaravelOpenApi\OpenApiServiceProvider" --tag="openapi-config"
    ```

1. 下記コマンドを実行してartisanコマンドに`$ php artisan openapi:XXX`系のコマンドが追加されていたら導入完了

    ```terminal
    $ php artisan list
    ```

    ```
    openapi
     openapi:generate              Generate OpenAPI specification
     openapi:make-callback         Create a new callback factory class
     openapi:make-extension        Create a new extension factory class
     openapi:make-parameters       Create a new Parameters factory class
     openapi:make-requestbody      Create a new RequestBody factory class
     openapi:make-response         Create a new Response factory class
     openapi:make-schema           Create a new Schema factory class
     openapi:make-security-scheme  Create a new SecurityScheme factory class
    ```

# 参考文献

- [https://vyuldashev.github.io/laravel-openapi/](https://vyuldashev.github.io/laravel-openapi/)
[Swift]簡単な入力バリデーションを実装してみる

## はじめに

アプリの初回登録時などにバリデーションを走らせたいことが多いと思うので
簡単なサンプルを載せておきます。
※個人的な使い回しも兼ねて

## コード

```swift: Validation.swift

import Foundation


enum ValidationResult {
    case valid
    case nameIsEmpty(section: String)
    case ageIsEmpty(section: String)
    case birthdayIsEmpty(section: String)
    
    var isValid: Bool {
        switch self {
        case .valid:
            return true
        case .nameIsEmpty:
            return false
        case .ageIsEmpty:
            return false
        case .birthdayIsEmpty:
            return false
        }
    }   
    var errorMessage: String {
        switch self {
        case .valid:
            return ""
        case .nameIsEmpty(let section):
            return "\(section)の入力がありません"
        case .ageIsEmpty(let section):
            return "\(section)の入力がありません"
        case .birthdayIsEmpty(let section):
            return "\(section)の入力がありません"
        }
    }
}

final class Validator {
    
    static let shared: Validator = .init()
    private init() {}
    
    func validationCheck(name: String?, age: Int?, birthday: String?) -> ValidationResult {
        
        guard let name = name, !name.isEmpty else {
            return .nameIsEmpty(section: "名前")
        }
        
        guard let age = age else {
            return .ageIsEmpty(section: "年齢(数字）")
        }
        
        guard let birthday = birthday, !birthday.isEmpty else {
            return .birthdayIsEmpty(section: "誕生日")
        }
        
        return .valid
    }
    
}


```

## 使い方

例えば登録ボタンを押して、その時に走らせたいのであれば下記をボタンタップのコード内に記載します

```swift: ViewController.swift
let result = Validator.shared.validationCheck(name: "受け取る値", age: "受け取る値", birthday: "受け取る値")

switch result.isValid {
case true:
    // 問題なかった場合の処理（保存するとか）
case false:
    // 問題があった場合の処理（エラー返す）
}
```

## 終わりに

今回は簡単なバリデーションを実装してみました。

パスワード時も応用すればできると思うので、また更新します。

間違ってる箇所があればご教授いただけると幸いです。
基本情報（論理回路と基本回路）

## 論理回路
論理回路という言葉が出てきた時に、「論理演算とどう違うんじゃ」と思いました。
「論理演算する回路が論理回路。そもそもパソコンは機械だからね」という説明を見たときに3回パソコンの前で頷きました。一人で。

まずは基本的な3つの回路である

* 論理積回路（AND回路）
* 論理和回路（OR回路）
* 否定回路（NOT回路）

3つの回路は**基本回路**と呼ばれているらしいです。

## 論理積回路（AND回路）
![AND-gate-US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/b497e6fe-1d35-b348-9cf4-fe3a893357ab.png)
AとB入力がどちらも1だと出力は1

真理値表が出てきたので、まとめてみます


|  A   |  B   |  Y   |
| :---: | :---:| :---: |
|   0  |  0  |  0  |
|   0  |  1  |  0  |
|   1  |  0  |  0  |
|   1  |  1  |  1  |

全部で4パターンですね。シンプル。

## 論理和回路（OR回路)
![OR-gate-US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/6f6b7350-43a0-7a70-d51a-522c13a9a3ef.png)
AかBのどちらかが1だと出力も1

|  A   |  B   |  Y   |
| :---: | :---:| :---: |
|   0  |  0  |  0  |
|   0  |  1  |  1  |
|   1  |  0  |  1  |
|   1  |  1  |  1  |

## 否定回路(NOT回路)
![128px-Not-gate-en.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/9cd52b99-cb55-63a7-671a-ce4a41469704.png)
おでんにしか見えない

|  A   |  Y   |
| :---: | :---: |
|   0  |  1 |
|   1  |  0 |

２パターンしかないですね。図で表すとわかりやすいですね。

## まとめ
組み合わせると複雑になるのでシンプルに考えるように鍛えます。
明日は引き続き回路を書いていきます。

## 参考
[論理回路](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%9B%9E%E8%B7%AF)
ライフサイクルマネージャでEC2のバックアップ自動化

# はじめに
EC2のバックアップを自動化するのにサードパーティ製品を利用しがちですが、マネコン上で設定できるのを見つけたので覚書きします。

# 内容
EC2のサーバーバックアップで下記のような機能を利用できます。
* AMIを取得する（またはEBSのスナップショット）
* スケジュール実行
* バックアップの世代管理
* バックアップを別リージョンへコピー

## バックアップ取得の設定
1. マネジメントコンソールでEC2のメニューから[Elastic Block Store]-[ライフサイクルマネージャ]を選択します。
1. [ライフサイクルポリシーを作成]ボタンをクリックします。
1. [ポリシータイプを選択]画面で[EBS-backed AMI ポリシー]を選択して[次へ]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/503f9b3e-99eb-e514-b9ad-f58dc9dd7412.png)

1. [設定を指定]画面で[ターゲットリソース]の設定を行います。ここではEC2にあらかじめ対象となるタグを設定しておいて、それを指定することにより対象のインスタンスを決めます。同じタグの付いた複数のインスタンスをまとめて行うことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/2476fdc6-8cfa-f45e-66e4-36fdb4f1f116.png)
そのほか、AMI作成前にインスタンスを再起動することもできます。設定が終わったら[次へ]ボタンをクリックします。
1. [スケジュール 1 を設定]画面でバックアップのスケジュールと何世代まで（またはどれだけの期間）保持するかを設定します。スケジュールの日次はUTCのためローカル時刻に換算する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/f3830836-40e8-7861-0e9d-89cbbc902be7.png)
ここでリージョン障害に備えてクロスリージョンコピーを設定することができます。設定が終わったら[ポリシーを確認]ボタンをクリックします。
1. 上記の設定を確認して[ポリシーの作成]ボタンをクリックします。
## 取得されたバックアップの確認
作成されたAMIはタグ[aws:dlm:lifecycle-policy-id]に上記で作成したポリシーIDが設定されるので、判別も容易です。
# おわりに
EBSのメニューに入っているので定期的なスナップショットしか作成できないかと思えば、AMIも同様に取れるという高機能。さらに災害対策のためリージョン間コピーまで自動化できます(リージョン間でコピーを行うとかなり通信料がかかると思いますのでご注意)。
# 参考文献

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ami-policy.html
毎日バックアップ

* MySQLのDBをバックアップ
* 毎日実行する
* 30日分確保する
* 30日より前のものは削除する

```shell
#!/bin/sh
umask 077

#30日分世代管理
period=30
dirpath='/path/to/db_back'

#ファイル名
filename=`bkup +%y%m%d`

# ダンプ実行
mysqldump --single-transaction -u username --password=xxxxxxxx db_name | gzip > $dirpath/$filename.sql.gz

# 古いバックアップファイルを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz
```

**そんな処理**
モジュラ逆数(Modular multiplicative inverse)を調べてみた。

オリジナル

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E9%80%86%E6%95%B0


# 実行環境

https://sagecell.sagemath.org/

https://live.sympy.org/


# 例
### 解法1:手計算で
(勉強中)

### 解法2:wolframalphaのPowerModで

https://www.wolframalpha.com/input?i=powermod%283%2C-1%2C11%29

Result
4

### 解法3:vbaで

Modular inverse　＜

https://rosettacode.org/wiki/Category:VBA


```vb
Private Function mul_inv(a As Long, n As Long) As Variant
    If n < 0 Then n = -n
    If a < 0 Then a = n - ((-a) Mod n)
    Dim t As Long: t = 0
    Dim nt As Long: nt = 1
    Dim r As Long: r = n
    Dim nr As Long: nr = a
    Dim q As Long
    Do While nr <> 0
        q = r \ nr
        tmp = t
        t = nt
        nt = tmp - q * nt
        tmp = r
        r = nr
        nr = tmp - q * nr
    Loop
    If r > 1 Then
        mul_inv = "a is not invertible"
    Else
        If t < 0 Then t = t + n
        mul_inv = t
    End If
End Function
Sub aaa_Sub_mi()
    ActiveSheet.Cells.Clear
    Cells(1, 1) = 3
    Cells(1, 2) = 11
    Cells(1, 3) = mul_inv(Cells(1, 1), Cells(1, 2))
End Sub
'3   11  4
```

### 解法3:Sageのpower_modで

x=power_mod(3,-1,11);x
4


### 解法4:sympyのmod_inverseで

```python
from sympy import *
print("#",mod_inverse(3,11))
# 4
```


# 逆数計算
  省略

# 応用
### 解法1:手計算とwolframのPowerModで
(勉強中)


### 解法2:wolframalphaのChineseRemainderで


https://www.wolframalpha.com/input?i=ChineseRemainder%5B%7B4%2C4%2C6%7D%2C+%7B5%2C7%2C11%7D%5D&lang=ja

結果
39

### 解法3:Sageのcrtで

x=crt([4,4,6],[5,7,11]);x
39


### 解法4: sympyのsolve_congruenceで

```python
from sympy.ntheory.modular import solve_congruence
print("#",solve_congruence((4,5),(4,7),(6,11)))
(mpz(39), 385)
```





# 参考

https://en.wikipedia.org/wiki/Modular_multiplicative_inverse

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03
Laravel8.x Sanctum とは

Laravel API認証サービス Sanctumについて

# ～ はじめに ～
まずLaravelが用意しているAPI認証はいくつか存在します。
## ・標準
####  - Basic認証
auth.basicミドルウェアを利用してBasic認証をすることが可能です。
onceBasicメソッドを利用すれば、ステートレスなBasic認証も可能になります。

## ・API認証系ライブラリ
### - Passport
OAuth2.0による認可、認証のための認可サーバ実装を簡単にできるようにしてくれます。

###  - Sanctum （今回のメイン）
7.x では「Airlock」だった
トークンベースの認証、クッキーベースの認証など、軽めの認証システムを提供してくれます。
バックエンドにLaravelを使うSPAや、モバイルアプリ作成に向けたもの。

# ～ Sanctum ～
## ・インストール
- composerでインストール
```
composer require laravel/sanctum
```
- Sanctumの設定ファイルとmigrationファイルを vendor:publish artisanコマンドで生成
```
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
```
- 最後にAPIトークンを記録するテーブルを生成
```
php artisan migrate
```

## ・概要
Sanctumは以下三つの認証を提供しています。
### ・[APIトークン認証](https://readouble.com/laravel/8.x/ja/sanctum.html#api-token-authentication)
Bearer認証方式、つまりTokenベースの認証方式です。


**createToken** メソッドによりトークンを発行でき、ハッシュ化して事前に用意したDBに保存されます。
```php
public function createToken(string $name, array $abilities = ['*'])
{
    $token = $this->tokens()->create([
        'name' => $name,
        'token' => hash('sha256', $plainTextToken = Str::random(40)),
        'abilities' => $abilities,
    ]);

    return new NewAccessToken($token, $token->id.'|'.$plainTextToken);
}
```
**plainTextToken** メソッドを使えばプレーンテキスト値を取得でき、クライアント側に送信できます。
```php
$token = $request->user()->createToken($request->token_name);
return ['token' => $token->plainTextToken];
```
あとは「Bearer」トークンとして「Authorization」ヘッダに含めて返せば、認証をしてくれます。

ただどのルートを保護するかは設定しておく必要があります。
以下のようにミドルウェアを通せば、認証してくれます。
```php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
```
特にセッションに関して設定を変えていないのであれば、
web.php に配置した場合は、**LaravelにもとからあるセッションのCookie認証を最初に行います。**
Cookieが送られてこなければ、APIトークン認証をするという形になります。

また別の認証ライブラリJetstreamをインストールすればこの作業自体も必要なくなるみたいです。
### ・[SPA認証](https://readouble.com/laravel/8.x/ja/sanctum.html#spa-authentication)
Cookieベースのセッション認証
Laravel標準で使われているセッション認証をAPI認証でも利用します。

セッションを利用するので、sanctum設定ファイルのstateful設定で明示されたドメインに限り、
CORS設定を行い、異なるサブドメインでもステートフルな処理が可能になります。
またCSRF対策も行ってくれます。

具体的な処理は書きませんが流れとしては

1. /sanctum/csrf-cookie にリクエストを送り、CSRFトークンを返してもらう。
2. /api/login に認証情報をPOSTリクエスト
3. 認証されsessionトークンがでステートフルな処理が可能になる。

### ・モバイルアプリケーション認証
モバイルアプリケーションからのリクエストをトークン認証します。
基本的な流れはAPIトークン認証です。

# ～ 最後に ～
LaravelライブラリSanctumについてでした。
細かい実装方法等は、[ライブラリ](https://readouble.com/laravel/8.x/ja/sanctum.html)を参照してください。
認可、認証系の話題は奥が深いなと感じました、、、触れるにはまだ早かったかもしれない、、

参考：
https://qiita.com/pikanji/items/040fa4ab6976059f3762
https://webxreal.com/laravel-sanctum-spa/
メモ：Amazon Managed Blockchainの環境構築を目指す。

※サブネット作成で詰まっているので調査中です。

# 下準備

## VPCを作成
まずはVPCを作成します。
VPCはAWS上に作成できる仮想ネットワーク空間です。

下の画像左上のVPCウィザードを起動を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/5405dda4-d0bf-5b71-41d9-e77622da9bdf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/8eae84a3-c1f4-08e4-1cc2-d261f90feb67.png)

VPCの設定を行います。
VPCの設定の各入力欄は下のように入れています。
* 名前タグ-オプション：(任意のVPC名)
* IPv4 CIDRブロック：10.0.0.0/16
* IPv6 CIDRブロック：IPv6 CIDR ブロックなし(デフォルト)
* テナンシー：(デフォルト)

入力が完了したら「VPCを接続」を押します。
VPCを表示のボタンを押すと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/86d27791-1d92-e3ea-0e08-c62adfda2e6b.png)

## VPCサブネットを作成
ここからは先ほどのVPCコンソールの画面に戻り、サブネットを作成していきます。下の画像のサブネットを押下し、次の画面右上の「サブネットを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/e2aa0b41-c944-13c6-ed40-93968dd182cf.png)

サブネットを作成画面が表示されるので、作成するサブネットに関する設定を入力します。
入力内容は下記のとおりです。
* VPC
  * VPC ID:VPC作成時にメモしたVPC IDを選択
* サブネットの設定
  * サブネット名：(任意のサブネット名)
  * アベイラビリティゾーン：(VPCを作成したリージョンを指定)
  * IPv4 CIDR ブロック：10.0.0.0/16(VPCの設定時に出てきた数字と合わせてください。
  * タグ-オプション：(デフォルト)
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/13707581-b605-b00b-0a40-90ab2997dffc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/93a6dad9-f849-922c-a454-8a75cff4f5ae.png)

ここでサブネットを作成しようとしたところ、下記のエラーが出ているので原因を調査中です。

**エラー文↓↓↓** 
CIDR アドレスが既存のサブネット CIDR: 10.0.128.0/20 と重複しています。
## EC2インスタンスにSSH接続する(※調査中)
### VPCインターネットゲートウェイを作成
VPCコンソール左側のメニューから「VIRTUAL PRIVATE CLOUD」
### ルートテーブルを定義(※調査中)

### セキュリティグループの作成(※調査中)

### キーペアを作成(※調査中)

# Amazon Managed Blockchain(※調査中)