OmniAICreator/Qiita-1.07M huggingface dataset:
「あの言語のあれ」まとめ

# 「あの言語のあれ」まとめ

## なにこれ

最近あっちこっちの言語を行き来しているので、
「あの言語のあれ、この言語でどう書くんだ？」
をまとめたものが欲しくなったので備忘録的にまとめていきたいと思います。
徐々に追記していく感じで書いていきます。
分類は特に深く考えてつくってないです。
載せてほしいものがあればコメントまたは
編集リクエストいただければ気づいたときに対応します。

## コレクション操作系

### map

コレクションの要素に対して関数を適用した新しいコレクションを返す。

<details><summary>Common Lisp</summary>

```common-lisp
(defvar xs (list 1 2 3))
(mapcar (lambda (x) (* x 2)) xs) ; (2 4 6)
```

</details>

<details><summary>JavaScript</summary>

```js
let xs = [1,2,3];
xs.map(x => x*2); // [2, 4, 6]
```

</details>

<details><summary>C#</summary>

```csharp
List<int> xs = new List<int>() { 1, 2, 3 };
xs.Select(x => x*2); // [2, 4, 6]
```

</details>

### filter

コレクションの要素のうち、条件を満たす要素のみからなる新しいコレクションを返す。

<details><summary>Common Lisp</summary>

```common-lisp
(defvar xs (list 1 2 3 4))
(remove-if-not (lambda (x) (equal (mod x 2) 0)) xs) ; (2 4)
```

</details>

<details><summary>JavaScript</summary>

```js
let xs = [1,2,3,4];
xs.filter(x => x%2===0); // [2, 4]
```

</details>

<details><summary>C#</summary>

```csharp
List<int> xs = new List<int>() { 1, 2, 3, 4 };
xs.Where(x => x%2==0) // [2, 4]
```

</details>

### zip

各コレクションの同一インデックスの要素を一つの新しいコレクションにまとめる。

<details><summary>JavaScript</summary>

```js
// すべてのコレクションの要素数が同じことが前提
let a = [1,2,3];
let b = ["a","b","c"];
const zip = (...arrays) => arrays[0].map((_,i) => arrays.map((x,_) => x[i]));
zip(a,b); // [[1,"a"],[2,"b"],[3,"c"]]
```

</details>

<details><summary>Common Lisp</summary>

```common-lisp
(defvar a '(1 2 3))
(defvar b '(a b c))
(mapcar #'list a b) ; ((1 A) (2 B) (3 C))
```

</details>


<details><summary>C#</summary>

```csharp
int[] a = { 1, 2, 3 };
string[] b = { "a", "b", "c" };
a.Zip(b, (xa, xb) => new dynamic[] { xa, xb }); // [[1,a],[2,b],[3,c]]
```

</details>

## コレクション処理系

### reduce

畳み込み。
※良い説明が思いつかないので要追記

<details><summary>Common Lisp</summary>

```common-lisp
(defvar xs (list 1 2 3 4))
(reduce (lambda (x m) (+ x m)) xs :initial-value 0) ; 10
```

</details>

<details><summary>JavaScript</summary>

```js
let xs = [1,2,3,4];
xs.reduce((x,m) => x+m, 0) // 10
```

</details>

<details><summary>C#</summary>

```csharp
List<int> xs = new List<int>() { 1, 2, 3, 4 };
xs.Aggregate(0, (m,x) => x+m) // 10
```

</details>

## コレクション生成系

### range (aka. iota)

整数値`a`から整数値`b`までの連番のコレクションを生成して返す。

<details><summary>Common Lisp</summary>

```common-lisp
(ql:quickload :alexandria)
(alexandria:iota 4 :start 2) ; (2 3 4 5)
```

※参考: [JavaScriptでrange関数作ってみた](https://qiita.com/RyutaKojima/items/168632d4980e65a285f3)

</details>

<details><summary>JavaScript</summary>

```js
let range = (a,b) => [...Array(b-a+1)].map((_,i) => a+i);
range(2,5); // [2,3,4,5]
```

※参考: [JavaScriptでrange関数作ってみた](https://qiita.com/RyutaKojima/items/168632d4980e65a285f3)

</details>

<details><summary>C#</summary>

```csharp
int a = 2;
int b = 5;
Enumerable.Range(a, b-a+1).Select(x => x); // [2,3,4,5]
```

※参考: [色々な言語でrange関数的な処理の書き方[Python,C++,D,C#,JS,VB,HSP,Lisp,Scheme,Clojure]](https://qiita.com/yosgspec/items/87d83a4a9b7a99ee34dc#c-1)

</details>
Pythonを選ぶ理由

# Pythonを選ぶ理由
これを書いた自分はPythonが本業ではなく、Pythonはあくまで仕事を効率化するための小道具としての利用。

このような目的の場合、やりたいことを、手早く簡単に実現できることが重要。
特に、以下No.1またはNo.2の用途であれば、個人的にはPython一択。

|No|用途|Python以外の手段|選択|
|:--|:--|:--|:--|
|1|テキストデータの整形、変換、データ取り込み、グラフ化|手作業、エディタのマクロ機能|Python一択|
|2|Windowsで動作する簡単なGUIアプリケーションの作成|C# Windows.Forms/C言語 Win32|Python一択|
|3|Excelの自動操縦|Excel VBA|基本はExcel VBA|
|4|C言語で作られたDLLの呼び出し|普通にC言語で呼び出す|基本はDLLと同じ言語|

No.3やNo.4の場合、Pythonの豊富なライブラリと連携することで、できることの可能性が広がる。
逆にその必要が無くコーディング規模も小さければ、従来の手段が無難。

# Pythonの生産性が高い理由
主に以下の3つ。

1. 直感を裏切らない、一貫した文法
1. [公式ドキュメント](https://docs.python.org/ja/3/)が非常に充実しており、学ぶべきことは公式で完結
1. 豊富な標準ライブラリとパッケージ

Pythonは学習コストが低いだけでなく、学習した成果を再利用するコストが低い。
コーディング時にドキュメントを見返す必要があまりないのが、非常に大きい。

# GUIアプリケーションの補足
ここでは詳細を説明しないが、Pythonの標準GUIインターフェースであるtkinterが無難。
公式ドキュメントからもリンクされているTkDocsが、tkinterに関する事実上の公式ドキュメント。

また、PyInstallerで1つのexeファイルにできるので、Python環境が無いマシン向けに配布することができる。

exe化のデメリットとして、ファイルサイズが最低5MB程度になり、起動時にウィンドウが出るまで数秒のラグがある。ただし現在のPC環境で5MB程度はさほど問題にならない。起動時のウィンドウが出るまでの時間も、PyInstallerにスプラッシュ画像を表示させる機能がある。(2021年7月～)

* [TkDocs](https://tkdocs.com/)
* [PyInstaller](https://pyinstaller.org/en/stable/)
* [Python公式::tkinter](https://docs.python.org/ja/3/library/tkinter.html)

# Excel自動操縦の補足
ここでは詳細を説明しないが、pywin32パッケージを使用する。ネット上に情報も多い。
* [pywin32](https://pypi.org/project/pywin32/)

# DLL呼び出しの補足
ここでは詳細を説明しないが、ctypesを利用する。多少学習コストが必要なので、初心者向きとは言えない。
また32bitでコンパイルされたDLLを呼び出すには、32bit版のPython実行環境をインストールしている必要があることにも注意。
* [Python公式::ctypes](https://docs.python.org/ja/3/library/ctypes.html)
Scrum開発の学習メモ

# Ⅰ. スクラムとは
複雑な問題に対応する適応型のソリューションを通じて、人々、チーム、組織が価値を生み出すための軽量級フレームワークである

# Ⅱ. スクラムを採用する目的
１．マネジメント、環境、作業技術の相対的な透明化
２．イテレーション的なアプローチを採用して、予測可能性を最適化してリスクを制御する


# Ⅲ. スクラムの論理
１．論理
①. 経験主義
説明：知識は経験から生まれ、意思決定は観察に基づく

②. リーン思考
説明：ムダを省き、本質に集中する

２．三つの柱
①. 透明性
説明：プロセスや作業は見える

②. 検査
説明：作成物と進捗状況は、頻繁かつ熱心に検査する

③. 適応
説明：適用しているプロセスや方法論を採用する

# Ⅳ. スクラムの構成
「３－５－３」
１．「3つの役割」
①. プロダクトオーナー
②. スクラムマスター
③. 開発者

２．「5つのイベント」
①. スプリント
②. スプリントプランニング
③. デイリースクラム
④. スプリントレビュー
⑤. スプリントレトロスペクティブ

３．「3つの成果物」
①. プロダクトバックログ
②. スプリントバックログ
③. インクリメント

※説明を割愛する

# Ⅴ. 価値基準（共識）
「5つの価値基準」
１. 確約
説明：スクラムチームは、ゴールを達成し、お互いにサポートすることを確約する

２. 集中
説明：スクラムチームは、ゴールに向けて可能な限り進捗できるように、スプリントの作用に集中する

３. 公開
説明：スクラムチームとステークボルダーは、作業や課題を公開する

４. 尊敬
説明：スクラムチームのメンバーは、お互いに能力のある独立した個人として尊敬し、一緒に動く人たちからも同じように尊敬する

５. 勇気
説明：スクラムチームのメンバーは、正しいことをする勇気や困難な問題に取り込む勇気を持つ

# Ⅵ.進み方
１．プロジェクトオーナーは、複雑な問題に対応するための作業をプロダクトバックログに並べる
２．スクラムチームは、スプリントで選択した作業を価値のインクリメントを変える
３．スクラムチームとステークホルダーは、結果を検査して、次のスプリトに向けて調整する
４．振り返り 

# Ⅶ. 参考文献
スクラムガイド  |  2020年11月
Windows 10 Home EditionでOracleを動かしたい

## 概要
Windows 10 Home EditionのPCでOracleを動かしたいという話
何も考えずにインストールできればよかったのだが、
Homeはどうもサポートしていないのでどうしたものかという話
> Windows 10 x64 - Pro、EnterpriseおよびEducationエディション

[システム要件 https://docs.oracle.com/cd/E96517_01/xeinw/requirements.html#GUID-4A3A99E7-655E-4202-A7DD-48257DE2B970](https://docs.oracle.com/cd/E96517_01/xeinw/requirements.html#GUID-4A3A99E7-655E-4202-A7DD-48257DE2B970
)

## 環境
| モノ     | バージョン                        |
|:-----|:-----------------------|
| OS   |Windows10 Home（64bit） | 
| Oracle Express Edition|21.3.0|

## Docker Desktopを使いたかったがあきらめた
「あれ、もしかして簡単そう」という唯一の理由で以下サイトに従ってトライした

https://docs.docker.jp/docker-for-windows/install-windows-home.html

手順の以下部分の表示で、オプションが表示されなかった。

> 2.　確認画面が出たら、 Enable WSL 2 Features （WSL 2 機能を有効にする）のオプションが、設定ページで選択されているかどうかを確認します。

インストールには成功するものの、その後は何も起動されない状態が続いた。
オプションが表示されないことが原因かどうかもわからず、
幾度となくインストールとアンインストールを繰り返したが、結果もかわらず。
同じような事象を探してみても見つからないのでここで挫折した。

Dockerそのものがなんなのか理解できていないが、
ここで上手くいかなかったことが逆に「Dockerでやるぞ」というモチベーションにつながる

## WSL2でUbuntuでDockerでOracle
Windows上でLinux(Ubuntu)を動かしてそこでDockerを入れて
Oracleのコンテナを動かすというそんな感じの理解をした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172106/09c49f2c-7f0b-6925-575a-62a66faaccfb.png)
ハローワールド用のコンテナとOracleのコンテナのイメージ

DOCKERはいわば丼（どんぶり）。天丼、かつ丼、牛丼などの乗せるものは自由で、
乗せる具材は自前で用意するものと、公式で作られているもの（Docker 公式イメージ）が
あるという、今はこんな理解だが間違っているところもありそうだ。

Oracleは自分でイメージを作成する必要がある
PostgreSQLは公式のイメージがあるらしい。（今度やる）


## 参考にさせてもらったサイト!
[Windows10 Home で WSL2 を使えるようにし、Ubuntu をインストールして Windows Terminal から起動するまでの手順](https://nodachisoft.com/common/jp/article/jp000032/)
[WSL2のUbuntuでDockerを使う](https://zenn.dev/sprout2000/articles/95b125e3359694)
[【Docker】Oracleを無料で簡単にローカルに構築する](https://zenn.dev/re24_1986/articles/29430f2f8b4b46)

ここからはメモ。

### Windowsでやること
- 設定その１
``` 
--- Linux 用 Windows サブシステムを有効にする
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
--- 仮想マシンの機能を有効にする
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
- 設定その２ Linux カーネル更新プログラムパッケージをインストールする
```
--- WSL 2 を既定のバージョンとして設定
wsl --set-default-version 2
```
- Microsoft Store から Ubuntuをダウンロードする
- Windows Terminalもダウンロードする

### Ubuntuでやること

- イメージを作成するやつをダウンロード https://github.com/oracle/docker-images
- \\\wsl$ でダウンロードしたファイルをUbuntuで見えるところに置く
- コンテナイメージを作成するシェルをたたく
``` 
images\OracleDatabase\SingleInstance\dockerfiles\buildContainerImage.sh -v 21.3.0 -x -i

確認のコマンドはこれ。これでイメージ準備完了
docker images
```
- コンテナ定義ファイルを作成する
```docker-compose.yml
version: '3'

services:
  db:
    image: oracle/database:21.3.0-xe
    container_name: oracle21c
    ports:
      - 1521:1521
    volumes:
      - db-store:/opt/oracle/oradata
    environment:
      - ORACLE_PWD=ここはパスワードを入れる
volumes:
  db-store:
```
- 起動（結構時間かかる。ログみるコマンドは何度もたたいた）
```
docker-compose up -d
docker-compose logs ログみる
```
ここまで。

そのほかコマンド
```
docker ps --all
docker start xxx
docker stop  xxx
sudo service --status-all
sudo service docker start
docker container exec -it コンテナのID bash
find / -name sqlplus
```
## 最後に
なんでOracleを動かしたいのかを忘れてしまった
AWS認定デベロッパアソシエイト合格日記

# はじめに
[AWS認定ソリューションアーキテクトアソシエイト合格日記](https://qiita.com/kazutxt/items/f3e0a80fe8de3b184ece)に合格したら、欲が出てDeveloperも欲しくなったので挑戦してみました。

# AWS認定試験の全体像
* [AWS認定試験の概要](https://qiita.com/kazutxt/items/dce1c5df12d5ab27020a)

# デベロッパアソシエイトの試験概要
* 問題数は65問
* 試験時間は130分
* 合格スコアは100-1000のスコアで720以上(≒正解率72%前後)
* 試験料は15,000円
* 試験範囲
    * デプロイ 22%
    * セキュリティ 26%
    * AWS のサービスによる開発 30%
    * リファクタリング 10%
    * モニタリングとトラブルシューティング 12%


# 受験前のステータス
現時点でのスキル・知識を整理

* SAAを2週間前に合格したばかり
* ICT及びプログラミングのある程度ある
    * SIerで10年ぐらいの実務経験
    * 情報処理技術者試験で高度試験(ITアーキテクト/NWスペシャリスト/安全確保支援士など)をいくつか保有
    * 複数のプログラミング言語(Node/Java/Python/C/Dartなど)を扱える
    * 業務以外にもプライベートでアプリをリリースしたり、サーバ立てたり、ラズパイで遊んだりする
* AWSは約1年
    * CloudFront,WAF,ALB,ECS,Code4兄弟,Dynamo,S3,Lambda,APIGWなどを使って簡単なWebサイトを構築
    * 3案件ほど経験


# 勉強方法と時間(1.5週間/35Hぐらい)

1. 試験について調べる (2H)
2. 書籍で勉強 (10H)
    * [ポケットスタディ AWS認定 デベロッパーアソシエイト](https://www.amazon.co.jp/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-AWS%E8%AA%8D%E5%AE%9A-%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E8%A9%A6%E9%A8%93%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4798063401)
        * 途中で、SAAとかぶっているところ多い&Codeシリーズとか日常的に知っているから知っているところはパスしながら消化
2 .AWSWeb問題集で勉強(20H)
    * https://aws.koiwaclub.com/
5. 勉強ノートで復習(3H)
    * 作った勉強ノートを読み返して不明点や整合性のつかない部分の確認
    * 暗記


# 活動記録
* GW終わり
    * SAAを忘れないうちに知識を切らさないように1週間の短期決戦

# 受験した所感
* 難しいものはなかった。見直しするまえに合格の手応えがありました。
* Cognito/Dynamoストリームが多かった
* 過去問とほぼ同じ問題が数問あり、かつ難易度も過去問側のほうが難しいかったので安心して解くことができました。

## 超注意
* 選択肢を2つ選べと合ったのですが、英文で読むとconbination stepとあり、2つの組み合わせで達成できる方法を選べになり、ニュアンスがだいぶ変わる問題がありました。

# 結果
* 合格
    * 点数は851
        * 分野 1: 展開 22%
        * 分野 2: セキュリティ 26%
        * 分野 3: AWS サービスを使用した開発 30%
        * 分野 4: リファクタリング 10%
        * 分野 5: モニタリングとトラブルシューティング 12%
    * 全セクションで「コンピテンシーを満たしている」の判定

# 振り返ってみて
* SAAでUdamyがいらないといったのがまさに正解で、過去問繰り返しが最短最強でした

# 次の目標
* SysOpsAdministrator取りたいのですが、改定されてラボ試験があるからどうしよう・・・


# 備考(SAAとDVAのよく出るマネージドサービスの違い)
## SAAのみ
* 移行
* DirectConnect
* IAM/Organization
* コスト
* FSx
* Strage

## DVAのみ
* Codeシリーズ
* APIGW
* Cognito
* Amplify
* CloudFormation
* ElasticBeanstalk
* StepFunctions

## 共通
* Lambda
* S3 /Glacier
* RDS
* Dynamo
* ElastiCache
* SQS/SNS
* CloudWatch
* VPC
【入門】Sentence BERT

## はじめに
自然言語処理の勉強も始めました。すぐに忘れてしまうのでアウトプットを兼ねてBERTの改良モデルである「Sentence BERT」についてまとめました。

## 対象読者
- 自然言語処理初心者


## Sentence BERTとは？
自然言語処理モデルであるBERTの一種です。

事前学習されたBERTモデルに加えて、「Siamese Network」という手法を使い、BERTよりも精度の高い文章ベクトルの生成ができます。

BERTを改良したモデルとして2019年に発表されました。

https://arxiv.org/abs/1908.10084


## Sentence BERTの何がすごいの？　BERTと何が違うの？
BERTと違って、複数の文章のクラスタリングに有効です。

BERTでも、ラベル付きデータを用意してファインチューニングを行い、２つの文章を高精度で比較することは可能です。ただ、複数の文章をクラスタリングするには精度が悪かったり精度がいまいちだったり課題がありました。BERTで複数の文章をインプットとして推論するように実装するのはおすすめできません。複数文章をインプットとしてクラスタリングする場合にSentence BERTが役に立ちます。

この課題がSentence BERTでは「Siamese Network」という手法を使うことにより改善されています。

実際、文章の類似度を見てみても、精度が高い結果が得られました。BERTだと65時間かかるものが、なんと5秒に短縮されています。これは少し極端な例だと思いますが、Sentence BERTの効率性の良さが読み取れると思います。あと、「BERTの精度を維持した状態」というのがポイントです。

論文を引用すると以下のとおりです。


>BERT（Devlin et al。、2018）とRoBERTa（Liu et al。、2019）は、セマンティックテキスト類似性（STS）のような文ペア回帰タスクに新しい最先端のパフォーマンスを設定しました。ただし、両方のセンテンスをネットワークにフィードする必要があるため、計算のオーバーヘッドが大きくなります。10,000のセンテンスのコレクションから最も類似したペアを見つけるには、BERTを使用した約5,000万の推論計算（約65時間）が必要です。BERTの構造により、意味的類似性検索や、クラスタリングなどの教師なしタスクには適していません。

>この出版物では、Sentence-BERT（SBERT）を紹介します。これは、シャムおよびトリプレットネットワーク構造を使用して、コサイン類似性を使用して比較できる意味的に意味のある文の埋め込みを導出する、事前トレーニング済みのBERTネットワークの変更です。これにより、BERTの精度を維持しながら、最も類似したペアを見つけるための労力が、BERT / RoBERTaの65時間からSBERTの約5秒に短縮されます。

>SBERTとSRoBERTaは、一般的なSTSタスクと転送学習タスクで評価され、他の最先端の文埋め込み方法よりも優れています。


また、BERTはトークンごとのベクトル化するのに対して、Sentence BERTは文章単位でベクトル化します。ここが、文章同士の類似度で精度の高い結果が得られる理由でもあります。

## Sentence BERTの仕組み
Pooling層を追加しているのが特徴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606425/8b61292b-b794-b1ac-3f29-732ba4788f4a.png)



## Sentence BERTで何ができるの？
Sentence BERTでは以下のことができるようになります。

- 文章分類
- チャットボット、FAQ自動生成
- 感情分析
- など
- 
これだと、BERTとあまり変わらないですね。Sentence BERTの何がいいのでしょうか？　それはBERTと比較して精度が大幅に向上しています。BERTでもファインチューニング次第で精度を高くすることが可能ですが、かなり限定的であることがBERTの課題です。それがSentence BERTによって、BERTよりも広範囲に高い精度が得られるようになりました。

また、BERTと比較して効率がよいのも特徴です。実際推論に要する時間も短くなっています。

## Sentence BERTの利用方法
Sentence BERTの論文の実装としては、「Sentence Transformers」があります。このフレームワークを利用して手軽に始めることが可能です。

https://www.sbert.net/


### 事前学習モデル
#### b-xlm-r-multilingual
これはsentence transformersモデルです。センテンスと段落を768次元のベクトル空間にマッピングし、クラスタリングやセマンティック検索などのタスクに使用できます。

#### bert-base-nli-mean-tokens
sentence transformersの学習方法に記載されているモデルですが、品質が悪く現在は非推奨となっていました。

事前学習モデルのリストは以下にあります。

https://www.sbert.net/docs/pretrained_models.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606425/57636e2b-0144-33ba-769a-47496c8f5362.png)



### 事前学習モデル一覧
#### 使用方法
- Sentence Embeddingsの計算
- Semanticテキスト類似度
- Semantic検索
- リトリーブ＆リランク

### Triplet Loss
よく「Triplet」というワードが登場しますが、トリプルの類似語で「３つの組」という意味があります。これは特徴量を「positive」、「negative」、「anchor」の３つに分類していることから「Triplet」と呼ばれています。

## Sentence Transformers実践
### インストール方法
インストールは簡単です。すぐに利用できます。
```
!pip install sentence-transformers
```

その他、詳細は以下へ。

https://www.sbert.net/
プラグインアップデートでJenkinsが起動しなくなった時

plugins フォルダ内の jpi ファイルのタイムスタンプを見て、アップデート対象だったプラグインを削除（どこか別フォルダに退避）する。

アップデート前のパッケージは .bak 拡張子で保存されているので、それを .jpi にリネームして復旧させる。
Ubuntu 22.04 でVPN接続（IPSec）する

# 概要

Ubuntu 22.04　DesktopをインストールしたらVPN(IPSec)接続できなかったのでできるようにしたメモ。

# 前提

20.04 の時は、下記の方の記事で[network-manager-l2tp](https://github.com/nm-l2tp/NetworkManager-l2tp)を自力でビルドしたら使えていた。

https://qiita.com/flum1025/items/0623fb8a3a804be3c4f0

今回の22.04はこれでも無理だった、、、

# 解決方法

下記のissueに作者の方が解決方法を記載してくれていた。
https://github.com/nm-l2tp/NetworkManager-l2tp/issues/180

# kl2tpd のビルドとインストール

元のxl2tpdのバイナリではだめなようで、go製の[kl2tpd](https://github.com/katalix/go-l2tp)を先にビルドしておく。

```bash
$ git clone https://github.com/katalix/go-l2tp
$ cd go-l2tp/cmd/kl2tpd
$ go build
$ sudo cp kl2tpd /usr/local/sbin
```
※ 上記のissueでは ```go get github.com/katalix/go-l2tp``` で取得できるみたいだったが、goのパッケージの仕組みがわからないので手動でビルドしています。

## kl2tpd 版 NetworkManager-l2tp のビルド

kl2tpdのバイナリを使うよう設定が変更されている[こちら](https://github.com/katalix/NetworkManager-l2tp)のブランチからビルド。

```
$ sudo apt install g++ libtool libssl-dev libnss3-dev autoconf autopoint automake intltool
$ sudo apt install strongswan git libgtk-3-dev libnma-dev libsecret-1-dev libnm-gtk-dev libnm-util-dev network-manager-dev libnm-glib-vpn-dev dh-autoreconf libglib2.0-dev ppp-dev intltool
$ git clone https://github.com/katalix/NetworkManager-l2tp
$ cd network-manager-l2tp
$ sudo ./autogen.sh

$ ./configure \
  --disable-static --prefix=/usr \
  --sysconfdir=/etc --libdir=/usr/lib/x86_64-linux-gnu \
  --libexecdir=/usr/lib/NetworkManager \
  --runstatedir=/run \
  --with-pppd-plugin-dir=/usr/lib/pppd/2.4.9

$ make
$ sudo make install

```

## network-manager のGUIから設定

Ubuntuの'設定' -> 'ネットワーク' -> 'VPN' から設定。


![ipsec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97287/17864198-2e15-4862-33fe-b358db050d92.png)

右枠は```sudo /usr/lib/NetworkManager/nm-l2tp-service --debug```の出力結果。
何かの不具合が出た場合はここからデバッグできる。
ヒューマンインターフェイス

## ヒューマンインターフェイス
<b>利用者とコンピュータの接点のこと。
## 画面設計・帳票設計
レイアウト、デザイン、タイトルの位置文字の大きさなどを共通化しておく
### 画面設計の留意点
<b><font color = blue>パンくずリスト</font> - トップページからそのページへの経路情報
### GUI
<b>画面上のアイコンやボタン、メニューなどをマウスでクリックすることで、視覚的に操作するインターフェース。
主なGUI部品
<font color = blue>ラジオボタン</font>
<font color = blue>チェックボックス</font>
<font color = blue>スピンボタン</font>
<font color = blue>プルダウンメニュー</font>
<font color = blue>ポップアップメニュー</font>
### シグニファイア
<b>物体に対してできることを示す手がかりのこと
## 入力チェック
入力データが正しいかチェックする。
<b><font color = blue>ニューメリックチェック</font>
<font color = blue>シーケンスチェック</font>
<font color = blue>重複チェック</font>
<font color = blue>フォーマットチェック</font>
<font color = blue>論理チェック</font>
<font color = blue>リミットチェック</font>
<font color = blue>照合チェック</font>
### チェックディジット検査
<b>入力データの数値から、一定の規則に従って検査文字(<font color = blue>チェックディジット</font>)を求め、検査文字を入力データの末尾に付加することで、入力データに誤りがないかどうか検査する方法。
## ユニバーサルデザイン
<b>国籍や年齢、性別、身体的条件などに関わらず、誰もが使える設計のこと。
<font color = blue>アクセシビリティ</font>
<font color = blue>ユーザビリティ</font> - <font color = blue>インタビュー法を用いる</font>
### UX
<b>使いやすさや機能にとどまらず、使うことで利用者が楽しく快適な体験ができるかどうかまで含んでいること。
物体検出とは(2022.5.29)

未完成記事です。現在、資料を集めつつ、書いています。自分の別の記事([きゅうりの仕分けから始めるAI(2022.5.29)](https://qiita.com/tan0ry0shiny/items/55d245768be875e316b2))の一項目になっています。随時更新しますので、生暖かい目で見て頂ければと思います。ご意見・アドバイス等は大歓迎です。
# 物体検出とは
キーワード：画像認識、セグメンテーション
基本的な物体検出についてはSonyの小林さんが分かり易い動画を出して下さっています。まずはこちらの動画を一度見て頂くのが早いかと思います。（参照：「[小林(2022.5),"実践Deep Learning：物体検出",YouTube](https://youtu.be/5nmVHoA-A2E)」）
YouTubeの冒頭にもありますが、DeepLearning自体について知りたい方は同じく小林さんが上げて下さっている動画（[小林(2022.5),"Deep Learning入門",YouTube](https://youtube.com/playlist?list=PLg1wtJlhfh23pjdFv4p8kOBYyTRvzseZ3)）をご覧になると良いと思います。ただ、こちらは結構な量になっている様ですので、ざっくり知りたい方やDeepLearningについては大体分かっている方などはこのまま読んで頂ければと思います。
## 目標(タスク)：一枚の画像の中にある複数の物体を同時に検出
画像に写っている物体の種類、位置、サイズを検出します。画像分類との違いは、一枚の画像の中にある複数の物体を同時に検出できる事です。
## 学習方法：学習データと教師データ、物体検出器、
### 学習データと教師データ
画像分類と同じように、元になる入力画像を用意します。次に入力画像に期待する検出結果の画像を用意し、これらのペアを物体検出器で学習します。画像分類とは目標が違うので、教師データが異なります。画像分類では犬の画像には「犬」、猫の画像には「猫」というラベルデータ（具体的にはラベルとなる整数）が使われますが、物体検出では検出するボックスのサイズやラベルが教師データになります。例えば、以下の画像の場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/89d86b46-5cb3-77bd-37bc-cf953805bedf.png)
信号機に当たる教師データは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/fa8fcef4-5b1d-3bf3-7a15-0ccef687aef7.png)
の様なテキストデータになります。13が信号機のラベルにあたり、その後の4つの数字が信号機を囲む座標に当たります。この座標の指定の仕方はプログラムによって変わるという認識です。私も自分で実行した数少ない経験から言っているので、ご指摘等頂けると幸いです。

### 物体検出器
いろいろあります。自分ではやったつもりになっていて実は実行した事が無かったので、詳細は他の記事に任せます。以下の参考1は物体検出の流れがコンパクトにまとまっている印象です。

# 参考
1. [Tellus xDataProject(2022.5),"06_機械学習における物体検出概論", YouTube](https://youtube.com/playlist?list=PLR0xSg0L4wAcCg_awi_KprxYxn6ctPDsK)
1. [小林(2022.5),"実践Deep Learning：物体検出",YouTube](https://youtu.be/5nmVHoA-A2E)
1. [小林(2022.5),"Deep Learning入門",YouTube](https://youtube.com/playlist?list=PLg1wtJlhfh23pjdFv4p8kOBYyTRvzseZ3)
OpenSSL(1.1.1o)をSH4向けにクロスコンパイルする


## 概要
- WSLにSH4のクロスコンパイル環境を構築
- OpenSSLのソースコードをSH4用のバイナリにコンパイルします。

## 実行環境
- Windows 10 Home 21H2
- WSL2
- Ubuntu 18.04.6 LTS
~~~shell:実行環境
$ cat  /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
~~~

## SH4コンパイラのインストール
SH4のクロスコンパイラとして`gcc-sh4-linux-gnu`をインストールします。
また、`make`などのツールチェインをインストールする為に`build-essential`もインストールします。
~~~shell:インストール
$ sudo apt-get update
$ sudo apt-get install -y build-essential gcc-sh4-linux-gnu
~~~

~~~shell:動作確認
$ sh4-linux-gnu-gcc --version
sh4-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
~~~

## OpenSSLのクロスコンパイル
記事の作成時点で最新のバージョン`1.1.1o`を`wget`を使ってダウンロードします。
~~~shell:ソースコードの入手・展開
$ wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz
$ tar xzf openssl-1.1.1o.tar.gz
$ cd openssl-1.1.1o/
~~~

MakeFileを作成する為の設定です。
`linux-generic32`と`--cross-compile-prefix=/usr/bin/sh4-linux-gnu-`は必須オプションです。
~~~shell:環境に合わせてMakeFileを作成
$ ./Configure linux-generic32 no-asm no-sse2 no-ssl3 no-zlib no-bf no-camellia no-cast \
 no-cms no-comp no-dso no-idea  no-md2 no-mdc2 no-rc2 no-rc5 no-ripemd no-seed -fPIC \
 --cross-compile-prefix=/usr/bin/sh4-linux-gnu-
~~~

MakeFileが生成されたら、コンパイルを行います。
コンパイルを効率化するために、並列コンパイルの設定として`-j`を付与します。
~~~shell:コンパイル
$ make -j$(grep -c ^processor /proc/cpuinfo)
（多少時間がかかります）
~~~
コンパイルが終了したら、SH4向けのバイナリが生成されていることを確認します。
~~~shell:バイナリの確認
$ file apps/openssl
apps/openssl: ELF 32-bit LSB executable, Renesas SH, version 1 (SYSV), dynamically linked,
interpreter /lib/ld-linux.so.2, BuildID[sha1]=（省略）, for GNU/Linux 3.2.0, not stripped
$ file libssl.so.1.1
libssl.so.1.1: ELF 32-bit LSB shared object, Renesas SH, version 1 (SYSV), dynamically linked, 
BuildID[sha1]=（省略）, not stripped
$ file libcrypto.so.1.1
libcrypto.so.1.1: ELF 32-bit LSB shared object, Renesas SH, version 1 (SYSV), dynamically linked,
BuildID[sha1]=（省略）, with debug_info, not stripped
~~~

## 参考情報
[SH4用クロス環境の作り方 (2015年版)](https://pyopyopyo.hatenablog.com/entry/20150826/p1)
[[クロスコンパイル1] openssl-1.1.1コンパイル](https://www.codetd.com/ja/article/12211252)
勉強メモ50_Windowsコマンドを使ってフォルダの中で一番更新日付が新しいファイルのみ特定フォルダにコピーする

# 0 はじめに


# 1 下記のWindowsコマンドを使って実施する。パスはその現場に合わせて書き換える


```batch:copy.bat
@echo on
for /F "tokens=1" %%F in ('dir C:\Users\rinchome\Desktop\aa /b /o:D /a:-d') do set fname=%%F
set hoge=%fname%
echo %hoge%
set hoge2=%hoge:~0,2%
echo %hoge2%
copy C:\Users\rinchome\Desktop\aa\%fname% C:\Users\rinchome\Desktop\aa\dst\%hoge2%
```
M1 Mac(Monterey12.3.1)でOpenMPI.jlを動かす


# M1 MacでOPENMPI.jlを実行する
M1 Macで、juliaの並列計算が行えるかどうかテストを行いました。

ここでは、並列計算を実行するための環境設定とサンプルコードが動くかどうかを確かめてみます。
サンプルコードは、こちらを参照
https://docs.juliahub.com/MPI/nO0XF/0.15.1/examples/01-hello/


## パッケージのインストール

open-mpiのインストールをする

```
brew install --build-from-source openmpi
```

次にMPI.jlのインストールをする。パッケージモードで以下を実行する。

```
add MPI
```

これで準備が整ったかと思い、以下のドキュメントを参照して、サンプルコードを回してみると
https://docs.juliahub.com/MPI/nO0XF/0.15.1/examples/01-hello/

実行すると、以下のエラーが出てしまった。



```
┌ Warning:     You appear to have run julia under a different `mpiexec` than the one used by MPI.jl.
│     See the documentation for details.
└ @ MPI ~/.julia/packages/MPI/08SPr/src/environment.jl:38
```

openmpiとMPI.jlをインストールしたのに、それがjulia側から見えておらず、並列計算がうまく実行できていないようです。

そこで、　juliaを開いて、環境変数を以下のように設定するとうまくいきました。
open-mpiのバージョンは各自のものを設定します。
こちらの記事を参考にしました。

https://zenn.dev/h_shinaoka/articles/c0b5386d6f548b
 

```
ENV["JULIA_MPI_BINARY"] = "system"
ENV["JULIA_MPI_PATH"] = "/opt/homebrew/Cellar/open-mpi/4.1.2"
ENV["JULIA_MPI_LIBRARY"] = "/opt/homebrew/lib/libmpi.dylib"
ENV["JULIA_MPI_ABI"] = "OpenMPI"
ENV["JULIA_MPIEXEC"] = "/opt/homebrew/bin/mpirun"
using Pkg
Pkg.build("MPI"; verbose=true)
```

https://docs.juliahub.com/MPI/nO0XF/0.15.1/examples/01-hello/
の実行結果は、

```
$ mpirun -np 4 julia helloworld.jl 
Hello world, I am rank 0 of 4
Hello world, I am rank 1 of 4
Hello world, I am rank 2 of 4
Hello world, I am rank 3 of 4
```

きちんと動いた。
また、ブロードキャストのコードの方は

```
$ mpirun -np 4 julia b.jl         
 Running on 4 processes
rank = 1, A = ComplexF64[1.0 + 2.0im, 2.0 + 4.0im, 3.0 + 6.0im, 4.0 + 8.0im, 5.0 + 10.0im]
rank = 3, A = ComplexF64[1.0 + 2.0im, 2.0 + 4.0im, 3.0 + 6.0im, 4.0 + 8.0im, 5.0 + 10.0im]
rank = 2, A = ComplexF64[1.0 + 2.0im, 2.0 + 4.0im, 3.0 + 6.0im, 4.0 + 8.0im, 5.0 + 10.0im]
rank = 0, A = ComplexF64[1.0 + 2.0im, 2.0 + 4.0im, 3.0 + 6.0im, 4.0 + 8.0im, 5.0 + 10.0im]
rank = 0, B = Dict("foo" => "bar")
rank = 2, B = Dict("foo" => "bar")
rank = 1, B = Dict("foo" => "bar")
rank = 3, B = Dict("foo" => "bar")
rank = 0, f(3) = 14
rank = 1, f(3) = 14
rank = 2, f(3) = 14
rank = 3, f(3) = 14
```

reduceのコードは、以下のようにM1マックに対応していない機能があるため動かなかった。

```
ERROR: ERROR: ERROR: ERROR: LoadError: LoadError: LoadError: LoadError: User-defined reduction operators are currently not supported on non-Intel architectures.
```


send/receiveのコードは

```
$ mpirun -np 4 julia send.jl  
0: Sending   0 -> 1 = [0.0, 0.0, 0.0, 0.0]
1: Sending   1 -> 2 = [1.0, 1.0, 1.0, 1.0]
2: Sending   2 -> 3 = [2.0, 2.0, 2.0, 2.0]
3: Sending   3 -> 0 = [3.0, 3.0, 3.0, 3.0]
1: Received 0 -> 1 = [0.0, 0.0, 0.0, 0.0]
0: Received 3 -> 0 = [3.0, 3.0, 3.0, 3.0]
3: Received 2 -> 3 = [2.0, 2.0, 2.0, 2.0]
2: Received 1 -> 2 = [1.0, 1.0, 1.0, 1.0]
```

サンプルコードは動くことを確かめた。

## リビルド

自作パッケージの環境の中で、juliaのバージョンをアップデートした場合、MPIもリビルドしないといけないようです。

例えば、QCMaterial.jlという自作パッケージが存在したとして、そのディレクトリに移動して、
``julia --project=@. ~/QCMaterial.jl`` を実行します。
そのあと以下のような環境変数を設定して、MPIをリビルドしたらうまく計算が回りました。

```
ENV["JULIA_MPIEXEC"] ="/opt/openmpi/3.1.5/gcc-9.3.0/bin/mpirun"
ENV["JULIA_MPI_BINARY"]="system"
Pkg.build("MPI", verbose=true)
```

## まとめ
M1 MacでOPENMPI.jlの動作を確かめた。無事に動くことを確認しました。
NestJSでHTTPリクエストを取り扱う

NestJSの中でHTTPリクエストを投げたり、結果を取得したりする方法をまとめます。

### 前提
 - NestJS
 - TypeScript

# モジュールをインストール
```bash
$ npm i --save @nestjs/axios
# or
$ yarn add @nestjs/axios
```

# リクエストを投げる
サービス内でHTTPリクエストを投げる場合は、`HTTPService`を使えば大丈夫です。

```TypeScript
//////////////////////////////////////////////////////////////////////////
//  このコードは意図した通りに動きません！
//////////////////////////////////////////////////////////////////////////
import { HttpService } from '@nestjs/axios';
import { lastValueFrom, map } from 'rxjs';

@Injectable()
export class HogeService {
  constructor(
    private httpService: HttpService,
  ) {}

  async GetData() {
    // ※これは期待通りにならない
    const result = await this.httpService.get("http://www.example.com/");
  }
}
```

上のコードは意図した通りに動きません。
その理由は、`httpService.get()`が`Observable`を返すので、一般的なaxiosの使い方とは違う方法が必要なためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20639/01985022-a704-c8f3-8505-54ba23995ffc.png)

`Observable`はリアクティブプログラミングで用いられる用語です。

## リアクティブプログラミング
ストリームと呼ばれるデータの流れを扱います。

 - pipe: データを受け取ったときの処理を書く
    - map: 新しい値を返す
 - lastValueFrom:最後の値を取得（ObservableからPromiseに変換）

:::note
`toPromise()`を使うサンプルコードもありますが、現在は非推奨です。
:::

## 意図した通り動くコード
リアクティブプログラミングを意識して書く必要があります。
```TypeScript
import { HttpService } from '@nestjs/axios';
import { lastValueFrom, map } from 'rxjs';

@Injectable()
export class HogeService {
  constructor(
    private httpService: HttpService,
  ) {}

  async GetData() {
    const result = await lastValueFrom(  // ObservableをPromiseに変換して最後の値を取得。
      this.httpService
        .get("http://www.example.com/")
        .pipe(map((response) => response.data)),  // pipe()でデータ取得時の処理を記述。mapで取得した内容のうちdataを返す
    );
  }
}
```

# まとめ
NestJSの`HTTPService`ではリアクティブプログラミングを意識したコードを書く必要があります。
React好きの少年「あそこを見て！デフォルトインポートと名前付きインポートが混在しているよ！」

### ある日
React好きの少年「磯野！Reactしようぜ！」
ワイ「ええで、とりあえずコンポーネントをexport/importしてと。」

```
Warning: React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
```

Reactのプロジェクトを始めようとしてexport / importでつまづいたところを書いてみます。
しょうもないミスだけど初心者の人は気づきにくいところかも。

前提：実行環境はCodesandboxです。

これでexportして
```
export const App =()=> {
・・・省略・・・
};
```
importすると
```
import App from './App.jsx'
```

エラーをもう一度見てみると、
```
Warning: React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
```
直訳すると「要素のタイプが無効です: 文字列 (組み込みコンポーネントの場合) またはクラス/関数 (複合コンポーネントの場合) を期待したのに、: undefined と表示されました。コンポーネントを定義されたファイルからエクスポートし忘れたか、デフォルトインポートと名前付きインポートが混在している可能性があります。」

いろんな記事を見てみたがどれも当てはまりそうにありませんでした。
- [【React】「Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.」エラーの対処法](https://cpoint-lab.co.jp/article/202005/15172/)
- [【React】Element type is invalid: expected a stringの対処法](https://qiita.com/GalaxyNeko/items/150d96f45ac1611468d4)

ただ、このエラーはexportやimportによく見られるものだということは確定したのでdefaultについても調べてみる。

- [export dedaultについての記事](https://qiita.com/notch0314/items/e9f2b704a340824393b8)

defaultはexportしたものに任意の名前などをつけてImportできるんだそうです。なるほど。
天下のMDNでImportの方法を調べてみます。
[MDN Import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)
```
import defaultExport from "module-name";
import * as name from "module-name";
import { export1 } from "module-name";
```
ここで、**通常のexportは{}がいる**、と気づきます。
先程の
```
import App from './App.jsx'
```
を
```
import {App} from './App.jsx'
```
に変えてみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534683/4728d443-7690-4094-b458-279ff204f20b.png)
治りました。
つまりexportだけでなくimportの方法にも注意が必要ってことでした。エラーメッセージの
> デフォルトインポートと名前付きインポートが混在している可能性があります。

の部分が教えてくれました。

時間かかりましたが色々調べて学びもあったのでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534683/6903fae7-4044-3610-7feb-a536970a6750.png)
Zendesk ヘルプセンターの記事に目次を自動挿入表示する方法

# これは何？
Zendeskのヘルプセンターの記事に目次を自動挿入する方法です。
記事内の見出し1、見出し2、見出し3等の内容を使って自動で目次を作成します。

自動挿入されるのは、以下のような目次です。
![イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30859/6eee0874-0dd1-d5b9-1d5d-37334d168dae.jpeg)

# どこまでカスタマイズできるか？
この目次自動作成機能は、カスタマイズも用意です。
例えば、
- 見出し2と見出し3が存在する場合のみ目次を自動挿入する
- 目次には、見出し2の階層までしか表示しない
- 目次に番号等を振る
です。

CSSやJavascriptの知識が少しでもあれば、上記はどれも簡単にカスタマイズできます。

# 前提知識
- html、css、javascriptの知識が多少ある方

# 実現方法と仕組み
本方法は、Zendesk専用の仕組みで無く、『見出しを設置できるjQueryプラグイン』を使っています。
具体的には、『Table of Contents jQuery Plugin - jquery.toc』というもの。
つまり、もくじの自動生成はjQueryプランでやっており、デザインはCSSで調整しているという感じです。


# 実装方法
## 1. tocプラグインをダウンロードして、assetsフォルダに入れる
以下よりTable of Contents(toc) jQuery Pluginをダウンロードします。
https://ndabas.github.io/toc/

そして、ダウンロードしたら、assetsの中に配置します。
- jquery.toc.js
- jquery.toc.min.js

## 2. tocプラグインの設定jsを作成
tocプラグインは、色々カスタマイズできるようになっています。
下記ページを読んだり、ググればカスタマイズ例が色々載っていますので、分かる方はご自身でやってください（笑）
https://ndabas.github.io/toc/

以下は、あくまでサンプルです。
サイト構造によっては変更が必要ですが、cssとjavascriptが分かれば、どこを変えれば良いか分かるはずです。

assetsフォルダ配下に、『tag_add.js』というファイルを作ります。
```
$(document).ready(function() {
  // アーティクルページ内のh1とh2の要素を取得。ただ、1つめは記事タイトルなので除外。
  var hTags = $('.article-body h1, .article-body h2').not('#article-title h1').first();

  // h1とh2が記事に存在すれば、見出しを挿入。h3のみがあった場合でも目次を自動挿入したいなら、上記でh3も追加
  if (hTags.length){
    // tocにより目次を挿入するためのhtmlタグを準備
    var tocTag = '<div id="toc-container"><ul id="toc"></ul></div>';

    // もくじをどこに入れるか指定する。記事タイトルの下に目次が入るように指定
    $('#article-title h1').after(tocTag);

    // 目次に表示する見出しを指定。h1-h3まで表示する
    $("#toc").toc({content: ".article-body", headings: "h1,h2,h3"});
  }
});
```

## 3. 記事ページで読み込む設定
最後に記事ページの上部にスクリプトタグで、(2)のjsを読み込むように設定します。

![スクリーンショット 2022-05-29 17.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30859/a5c89229-959b-df00-5d09-2ae6f52f6051.png)

```
<script src="{{asset 'tag_add.js'}}"></script>
```

# カスタマイズ
カスタマイズする際は、tag_add.jsファイルを変更する形になります。
ググれば色々設定例も転がっています。

デザインについては、CSSを変更すればＯＫです。
目次内の見出しに番号を振りたい場合は、CSSで行います。
list-style-typeで、色々な形で番号振ったりできますので、お好みでどうぞ！
http://www.htmq.com/style/list-style-type.shtml
Makeを使って、店舗名を入れるとその情報を教えてくれるLINEBotを作ってみました。

我が社の社内でのとある会話です。
**`●●店って担当者誰？`**
**`▲▲店の店舗コードってなんだっけ？`**
私は小売業界で勤務しているのですが、私の部署ではこのような会話をよく耳にします。
PC使って保存しているエクセルシートを見ればわかる内容なのですが、
みんな調べるのがめんどうなので、周りの人に聞きます。（即答はしてもらえません）
最近会社がフリーデスク化され、紙で出力して貼っておくようなアナログ的なやり方も無理。
さらには出張で店舗～店舗を移動していることもしばしばあります。
そんな微妙な立ち位置の店舗情報をシュッと取り出せたらいいなと思い
Make(旧Integromat)を使ってノーコードでLINEBotを作ってみました。


#### 最終的にできた動作とシナリオはこちら
動画
![Record_2022-05-29-11-04-16_AdobeCreativeCloudExpress (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/276c9186-0764-dd22-a5a5-642f6243e380.gif)
シナリオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/e3d49da5-0728-aac9-decf-f95e40d337b5.png)


**今回使用したもの**
- [SSSAPI](https://sssapi.app/)・・・GooglesheetをAPI化してくれるサイト
- [Make](https://www.make.com/en)・・・異なるツール同士を連携できるノーコードツール
- Googlesheet　　　　　　　　　　　　　　　　　
- LINEDeveloperアカウント
## 手順
#### STEP1　GooglesheetをSSSAPIを使ってAPIに変換する
Googlesheetには下記画像のようなデータを入力しておきます。
右側はAPPIに変換した後、プレビューで確認したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/23f266bc-123a-e8a0-38f2-976b51954747.png)

:::note info
完全一致しないと検索でヒットしないので、Googlesheetには検索されやすそうなワード（漢字、ひらがな、漢字+店舗）の3パターンを記入
:::

SSSAPIを使ってAPIに変換する手順はこちら↓↓↓

https://sssapi.app/help/add_api


#### STEP2　MakeでHTTPモジュールとLINEモジュールを繋げる
Makeを使って**HTTPモジュール**(Make a request)と**LINEモジュール**（Send a Push Message）を
作成し繋げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/b73b8e9a-085e-82fc-4c8b-385d98883589.png)

最初、URL欄に取得したAPI+event+message.Textのまま実行したところ、●●店と検索してもエラーで返されました。

:::note warn
ひらがなや漢字はそのままだとエラーになるので、**encodeurl**を使って文字コードに変換させる必要があります。
:::





#### STEP3　Routerモジュールの分岐設定
**Routerモジュール**を使って検索したデータがない時とデータがあるときに分岐させます。
ここでデータがない場合の条件をどうするか迷いました。
そこで一つ前**JSONモジュールのStatus code**を確認すると、**入力データがある場合（成功のとき）は200**、
**入力データがなかった場合（失敗のとき）は404**となっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/316a0a1b-1e00-78e3-efe5-e6a300132b83.png)

ということでRouterモジュールの分岐条件は下記のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/88a2f536-efcd-94b7-af7e-49eee6c26b5c.png)




これで分岐部分もうまく動くようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671003/c9e78f32-a4f8-3f3e-1f35-5497759acf81.png)


#### 終わりに
【感想】
Makeを使い初めてBotを作りましたが、時間がかかった分、うまくいったときの感動しました。
ただお試しで作ったBotなのでかなり雑な部分はあります。ほかにも使えそうな内容を勉強して実用的な物に作り変えていけたらいいなと思います。
一応、会社の人にも使ってもらったところ**ゆるいけど、使えるね**と言ってもらえました。

【反省】
- 今回は想定されるワードをあらかじめ入力していますが、検索したワードが完全一致しないでも近いワードを推測して返すようなことができたらいいなと思っています。
- SSSAPIは50行までしかAPIに変換できないため、データ量が多い場合は別の方法を検討する必要があります。
PowerShell+WebView2で任意のヘッドライン等のWebページを表示し定期リロードする

様々な Web ページをパネル表示するためのツールを作成した。
正直 iframe を使った HTML ファイルで十分だとは思うが、PowerShell + XAML + WebView2 の使い勝手も確かめる意味もあり作成した。

# ツール配布先
ツール自体は下記リポジトリに設置しているので readme の初期設定を行えばすぐに使えるはずだ。
なお、MIT ライセンスとするため、自由に修正や修正版を公開して良い。

https://github.com/tkmry/PSMultiBrowsePanel/tree/main

# 実行サンプル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/5aebcbf3-8623-2444-e18a-a9efda696519.png)

# 今後の課題
誤クリック防止や、キャプションバーを消す、リロード処理を単にリロードするだけでなく指定のURLに戻す処理など。

# 参考
作成する為に下記を参考とさせていただいた。

* PowerShellをはじめよう　～PowerShell入門～: PowerShellでストップウォッチを自作する
  https://letspowershell.blogspot.com/2015/11/powershell.html
* GridというPanel | C#等と戯れる日々
  http://tawamuredays.blog.fc2.com/blog-entry-34.html
* [PSv2]PowerShellでクロージャ＆カリー化 - PowerShell Scripting Weblog
  https://winscript.jp/powershell/204
* スクリプトブロックについて - PowerShell | Microsoft Docs
  https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-7.2
three.jsのpost-processingでエラーが出てつまづきました。"Uncaught TypeError: Failed to resolve module specifier "three". Relative references must start with either "/", "./", or "../"."

# three.jsのPostprocessingでつまづきました！

無事解決したので完成品

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/1e6f129d-491c-042a-965c-fff715b22b58.gif)

### 注意事項
自分でこんな記事を書いておいて変なんですが、three.jsについて調べるときは必ず公式のサイトで調べてください！


### three.jsでpostprocessingを使う方法
https://threejs.org/docs/#manual/en/introduction/How-to-use-post-processing


### エラー文

```
Uncaught TypeError: Failed to resolve module specifier "three". Relative references must start with either "/", "./", or "../".
```

### 解決までの流れ

#### (1)ひとまずエラー文で検索をしたらThree.jsのフォーラムがヒット

https://discourse.threejs.org/t/error-relative-references-must-start-with-either-or/13573


#### (2)↑を読むと何やらgithubで議論が行われているとのこと。依存関係のお話であることはわかる。
https://github.com/mrdoob/three.js/pull/21113

#### (3)もう1度、three.js公式のpostprocessingの使い方記事を見る。するとnpmを使うこと前提で話が進んでいることがわかった。
https://threejs.org/docs/#manual/en/introduction/How-to-use-post-processing

#### (4)three.jsのnpmを見てみると、サンプルファイルがあった。
https://www.npmjs.com/package/three

#### (5)こちらのjsfiddleを見ながらthree.jsに追加
https://jsfiddle.net/7u84j6kp/


```html:index.html
<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
    
<script type="importmap">
	{
		"imports": {
			"three": "https://unpkg.com/three/build/three.module.js"
		}
	}
</script>
```

#### (6)es-module-shims.jsについてはこちら
https://www.npmjs.com/package/es-module-shims

#### (7)postprocessingの使い方を参考にやっていたら新たなエラーが発生
ここに書かれているファイルが足りないって言われてるのかな〜と推測。
おそらく、three.jsのexampleにあるはず！

![スクリーンショット 2022-05-29 16.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/aee60291-96d7-e9af-709d-bccd5426e008.png)


#### (8)必要そうなファイルを追加してみる
postprocessingの使い方ページには、EffectComposerとGlitchPassとRenderPassしかimportしてなかったので、その3ファイルだけあればいいと思っていたが、実際にはそんなことなかった。

![スクリーンショット 2022-05-29 17.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/572f407f-7e3a-a5b7-330c-ae6527356cee.png)


#### (9)よかった！無事完成！

githubはこちら
https://github.com/i-am-ethan/threejs-postprocessing


![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/cf7bdbe8-d3aa-a9ec-a898-1a4bde868f04.gif)
ABC予想と不完全性定理の数学的な範囲と科学分類

科学には、その理論の有効な範囲がある。
数学にも、それぞれの理論の有効な範囲があるかもしれない。

大事なのは、有効な範囲だけにとどまっていては、新しい理論の鍵が見つからないかもしれないことだろう。
経済学では、電気工学の理論に基づいた微分方程式を模擬して計算することがある。

経済学を書いたサミュエルソンをはじめ、多くの経済学者が微分方程式を解いているか、学生に解かせているか、計算機が説いた結果を利用している。

金融では特に、微分方程式をよく利用する。場合によっては金融工学という名前をつけた講座もあるかもしれない。

微分方程式を直接解くのが面倒な時は、三角関数で表現するか、指数関数で表現することもある。三角関数で解くときには、周期的な現象と、周期性のない現象とに分離することがある。

ある理論が、別の理論と関係ないというのは自由だし、
ある理論が、別の理論と関係があるというのも自由だ。
工学的な感覚でいえば、答えが出る方がいいだけで、答えが出ない立場には賛成しないだけ。
数学の感覚が、つかめていない。動画をいろいろ拝見した。

加藤文元による宇宙際タイヒミュラー理論（英語字幕付き）[PROPER]
https://www.youtube.com/watch?v=kq4jbNl4lJk&t=280s

abc Conjecture and New Mathematics - Prof. Fumiharu Kato, Oct 7, 2017 (with English subtitles)
https://www.youtube.com/watch?v=fNS7N04DLAQ

『宇宙と宇宙をつなぐ数学』加藤文元先生インタビュー　第1回　「IUT理論の現在地」
https://www.youtube.com/watch?v=pNotF9QaNKM

『宇宙と宇宙をつなぐ数学』加藤文元先生インタビュー　第2回　「数学としての正しさと美しさ」
https://www.youtube.com/watch?v=vhVK9MVAPsQ&t=49s

『宇宙と宇宙をつなぐ数学』加藤文元先生インタビュー　第3回　「宇宙人と共有できる数学、できない数学
https://www.youtube.com/watch?v=vO2XeDq3QSY

楽天ブログでの望月新一先生vs NHKスペシャル 数学者は宇宙をつなげるか？ abc予想
https://www.youtube.com/watch?v=zTPUMPihjJU

# 科学哲学と認識論
対象の限定の仕方は認識論という名称で呼ぶことがある。
認識論の背景の理論を科学哲学と呼ぶことがある。

何を、どういう名前で呼ぶのも自由だ。
大事なのは、ある立場にとって、役にたつ考えがなにかということだろう。

ある理論の大家は、しばしば新しい理論を認めないことがある。
その個人が解きたい問題が違うだけだということなのかもしれない。

## 科学分類
科学三分類・四分類・五分類と算譜(program) 仮説(93) 統計と確率(7)
https://qiita.com/kaizen_nagoya/items/a2f2b9cc3a51b6af7603

連続と離散、時間と空間、物理量と生物量。統計と確率(2)
https://qiita.com/kaizen_nagoya/items/d0980c6bf9d3079aa98d

# 参考資料
望月新一　ABC予想論文を読む 。新人にお勧めの基本動作。pdftotext処理編
https://qiita.com/kaizen_nagoya/items/edc7857de19fe2d70bf6

望月新一　ABC予想論文を読む 。新人にお勧めの基本動作。pdftotext処理失敗編
https://qiita.com/kaizen_nagoya/items/b14e15e495d397c30c7e

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【React】Material-UI、Material-Icons使い方メモ

最近Reactを楽しんでいます。
今回はReactで使える便利なライブラリ、**「Material-UI」「Material-Icons」** の使い方を自分用にメモしておきます。

## Material-UI

### インストール

基本的に[公式サイト](https://mui.com/material-ui/getting-started/installation/)を見ればOKなんですが、一応メモします。

```
npm install @mui/material @emotion/react @emotion/styled

or

yarn add @mui/material @emotion/react @emotion/styled
```
**2022/05/29時点では、v5.8.1**がインストールされました。

### シンプルなボタンを設置する

```tsx
import Button from '@mui/material/Button'; // Button UIをインストール

const TheButton = () => {
  return (
    <div>
      <Button>ボタン</Button>
    </div>
  );
}
```

**Reactのコンポーネントと同じ書き方が出来るのでとても使いやすいです。**


![スクリーンショット 2022-05-29 15.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/9f6fb00e-d66d-f699-e646-2d7ece67680f.png)

### ボタンの見た目を変える

現状、ボタンらしさが足りないので、別バージョンを指定して見た目を変えます。



```tsx      
<Button variant="contained">ボタン</Button>
```

variantにcontainedを指定して、背景色のありのボタン作りました。

![スクリーンショット 2022-05-29 16.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/29feadfc-f8d3-b3df-296a-d90543da8032.png)

ボタンの見た目変更も簡単にできます。

さらに詳しい設定は公式ページを確認しましょう。
[公式のButtonページ](https://mui.com/material-ui/react-button/)




## Material-Iconsを使ってアイコンを表示

続いて、**アイコン付きのUI使いたい場合、「Material-Icons」を使います。**

### インストール

[こちらから](https://www.npmjs.com/package/@mui/icons-material)確認。

```
npm install @mui/icons-material

or

yarn add @mui/icons-material
```



### アイコンを選ぶ
まずは[公式サイトから](https://mui.com/material-ui/material-icons/)使いたいアイコンを選択します。

**サイドのFilledなどの選択でアイコンのスタイルを変える**こともできます。

- Filled・・・色が塗りつぶした
- Outlined・・・アイコンが白抜きになる
- Rounded・・・アイコンの角が丸くなる。アイコンによっては形が変わる
- Two tone・・・アイコンの白抜き部分に色がつく
- Sharp・・・角が尖ったアイコンになる

またアイコンによっては変化しないものもありますね。


![スクリーンショット 2022-05-29 16.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/8468cae2-fed0-8a36-3a56-9308fc1e6bb7.png)


アイコンを選択すると**importする為のコードが表示されるのでcopyしましょう。**

![スクリーンショット 2022-05-29 16.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/cd108784-c38c-bf52-4a5c-e8cc7403f838.png)



### アイコン付きボタンに変更

```tsx
import Button from '@mui/material/Button';
// アイコンインポート
import AccessAlarmIcon from '@mui/icons-material/AccessAlarm';

const TheButton = () => {
  return (
    <div>
      <Button variant="contained">
        {/* アイコンを子要素に入れる */}
        <AccessAlarmIcon />
        ボタン
      </Button>
    </div>
  );
}
export default TheButton;
```

Buttonの中に入れ子にするだけで簡単にアイコン付きボタンが出来ました！

![スクリーンショット 2022-05-29 16.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/9cf73c74-6c9b-dd22-d9c3-b4b017d3802e.png)

### CSSで微調整
ちょっとアイコンとテキストが近いので**CSSで調整します。**

```tsx
<Button variant="contained">
  <AccessAlarmIcon style={{marginRight: 8}}/>
  ボタン
</Button>
```
余白を付けていい感じになりました。

![スクリーンショット 2022-05-29 16.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769210/97f3baf3-b3af-dabc-6103-2f367651e251.png)

以上、「Material-UI」「Material-Icons」の基本的な使い方でした。

## 参考

https://mui.com/material-ui/getting-started/installation/

https://mui.com/material-ui/react-button/

https://mui.com/material-ui/material-icons/
C# 基礎演習（for,while,switch）

## for文の演習

1から10までメッセージボックスを表示。5だったら「ここで半分です」も表示

```C#
private void button1_Click(object sender, EventArgs e)
        {
            for(int i = 1; i <= 10; i++)//初期化;条件式;変化式;
            {
                if(i == 5)//変数iが5だった場合の処理
                {
                    MessageBox.Show(i.ToString());//実行する処理
                    MessageBox.Show("ここで半分です");
                }
                else//変数iが5以外の処理
                {
                    MessageBox.Show(i + "");
                }
            }
```
## while文の演習

1から10までメッセージボックスを表示。5だったら「ここで半分です」も表示

```C#
private void button1_Click(object sender, EventArgs e)
        {
            int i = 1;
            while (i <= 10)//変数iが10まで繰り返す
            {
                if(i == 5)//変数iが5だった場合の処理
                {
                    MessageBox.Show(i.ToString());
                    MessageBox.Show("ここで半分です");
                    i++;
                }
                else//変数iが5以外の処理
                {
                    MessageBox.Show(i.ToString());
                    i++;
                }
            }
```

## switch文の演習

寿司ネタのおみくじ

```C#
static void Main(string[] args)
        {
            //   switch (変数)
            //   {
            //       case 値A: //変数が値Aのとき実行される
            //           文A
            //break;   // 文Aの実行が終わったらswitchから抜ける。
            //       case 値B: //変数が値Bのとき実行される
            Console.WriteLine("お寿司おみくじ");
            Console.WriteLine("１：まぐろ２：サーモン３：いくら");
            int sushi = int.Parse(Console.ReadLine());
            switch (sushi)//変数sushiに代入された数値による分岐
            {
                case 1:
                    Console.WriteLine("大吉");
                break;

                case 2:
                    Console.WriteLine("中吉");
                    break;
                case 3:
                    Console.WriteLine("凶");
                    break;

            }
```

## switch文の演習(2)

```C#
 static void Main(string[] args)
        {
            //月を表す数値を入力し、その月の日数を表示するプログラムを作成しなさい。2 月は 28 日とします。
            //また、1 ～ 12 以外の数値が入力された場合に、“入力が間違っています”と表示しなさい。
            Console.WriteLine("月を入力せよ。日数を出します");
            int month = int.Parse(Console.ReadLine());
            switch (month)
            {
                case 2:
                    Console.WriteLine("28日です");
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    Console.WriteLine("30日です");
                    break;
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    Console.WriteLine("31日です");
                    break;
                default:
                    Console.WriteLine("入力が間違っています");
                    break;
            }
```
勉強メモ49_windowsコマンドを使用して文字コードUTF-8でデータありの新規のプロパティ－ファイル（sample5.properties）作成

# 0 はじめに
大量のプロパティファイルを作成する必要があったため、サンプルデータ付きの文字コードUTF-8
のプロパティファイルを作成

# 1 取り急ぎ、下記のバッチを動かしたときに「sample5.properties」ファイルが作成されるが、一応開いたときに文字コードがUTF-8になっていることを確認

```winbatch:sample.bat
@echo off
@REM Shift_JIS
chcp 932
set HOGE=ほげ

echo ほげ>sample1.txt
echo %HOGE%>sample2.txt

@REM UTF-8
chcp 65001
set HOGEHOGE=ほげほげ

echo ほげ>sample3.txt
echo %HOGE%>sample4.txt
echo %HOGEHOGE%>sample5.txt
echo %HOGEHOGE%>sample5.properties
type nul > sample6.properties

pause
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/e57f8ed3-708c-2ccc-814c-4603c2bc0a56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/a2010f8d-a6c0-30a9-d5d0-e544405375a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/90f81e60-5f51-4599-019e-1a4e285ee67e.png)
DOM Crash Course memo

# JavaScript DOM Crash Course

youtubeのメモ

## Document Object Model

・ブラウザによって作られたnodeやelementのツリー
・DOMの読み込み/書き込み/操作をするのにJavaScriptがつかわてる

### HTMLの中身全てを見る
```
console.dir(document)
```


### ドメインを確認する
```
document.domain
```

### URLを確認する
```
document.URL
````

doctypeを確認する
```
document.doctype
```

formを確認する
```
document.forms
```

リンクを取得する
```
document.links
```

画像を取得する
```
document.images
```

### エレメントを取得する
```
document.getElementById
document.getElementByClassName
```

```
document.querySelector
document.querySelectorAll
```

※ querySelectorとquerySlectorAllの違い
https://1-notes.com/javascript-queryselectorall-and-queryselector/

### 親ノードを指定する
```
parentNode
```

### 親エレメントを指定する
```
childNodes
```

### 子ノードを指定する
```
childNodes
```

### nodeやエレメントの指定方法いろいろ
```
firstChild
firstElementChild
lastChild
lastElementchild
nextSibling
nextElementSibling
previousSibling
previousElementSingling
```

### createElement

```
document.createElement('div')
newDiv.className = 'hello'
newDiv.id = 'hello1'
newDiv.setAttribute('titile', 'Hello Div')
```



## innerTextを取得する
```
innerText
```

## HTMLを取得する
```
innerHTML
```

観たyoutube
https://www.youtube.com/watch?v=0ik6X4DJKCc&list=PLillGF-RfqbYE6Ik_EuXA2iZFcE082B3s

エレメントとnodeの違い
https://kuroeveryday.blogspot.com/2018/11/difference-between-dom-and-node-and-element.html
VSCode のデフォルトターミナルをGit bashに変更する

OS: Windows 11
VSCode: 1.61.2
Git: 2.36.1.windows.1

### 手順
1. [[Git]](https://git-scm.com/download/win) をダウンロード＆インストールする
1. VSCode を開く
    * Gitインストール前に開いていても以降の手順に影響はなかった
1. Command Palette を開く
    * Ctrl+Shift+Pを押すか、Viewメニューから選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57869/1bf12990-8073-bd66-1a3f-7ea670f62285.png)
1. 「Terminal: Select Default Profile」を選択する
    * 「terminal profile」などと打って検索できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57869/4de08d3b-31e1-1eaa-309f-ab6f7d4e46ae.png)

1. 選択肢から「Git Bash」を選ぶ

### 動作確認
1. Ctrl+@ もしくは View -> Terminal
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57869/1723a1d8-40ec-9ce9-eab6-dba43e33f3be.png)

## 参考
参考先では手順が複雑だったが、より簡単にできた。
* [WindowsのVSCodeでGit Bashをターミナルに設定する](https://qiita.com/psychoroid/items/63cc0ece70fce0f0cfc0)
* [VScodeのターミナル設定をする](https://qiita.com/boymelancholy/items/53ef8d5cd947b6df2650)