OmniAICreator/Qiita-1.07M huggingface dataset:
Sigfoxのモジュールを自作してみた

# 概要
Sigfoxのモジュールを使用して、とある製品の開発を行いたかったので、
プロトタイプとしてDIP化されているSigfoxモジュールが無いかと探していたのですが、
2022年2月時点では、既にDIP化されているモジュール販売を行っている業者がいませんでした。

### 無いなら作ればいいじゃない！

ってことで今まで培ってきた知識を使用し、試作用のDIP化したモジュールを開発しました。
他にも困っている人がいるかも知れないので、今回作成したモジュールの販売も行います。

同じようなことでお困りの方は、買ってみてください。
ちなみにきちんと技適が取れているモジュールとアンテナを使用しているので、
電波法にひっかかることもありません。

# 回路図
![スクリーンショット 2022-04-04 22.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/8eba05af-8700-7a7a-c41e-45b272388077.png)


# PCB
![スクリーンショット 2022-04-04 22.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/69e5e852-fac5-7bc7-6fad-bd890e17650b.png)

# 完成品
![sIMG20220404223928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/15f13dd2-1c48-e1b4-f8f9-6629ba7c9c6a.png)
![sIMG20220404223939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/98e87bc6-6193-5198-3250-d041403ad626.png)

# 販売
メルカリで販売していますのでほしい方は購入されてください。
https://qiita.com/Kurogara/items/49e5350c0e859b5a8380
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/b71cbae0-1267-913b-bbd3-20bcb7f26371.png)


# 大変だったこと
#### モジュールとアンテナの技適確認が面倒くさい
 技適は組み合わせできちんと承認されているか確認する必要があります。
 最悪電波法にひっかかれば「１年以下の懲役又は100万円以下の罰金、
 また公共性の高い無線局に妨害を与えた場合は、
 ５年以下の懲役又は250万円以下の罰金の対象」となります。

 めちゃめちゃ怖いですよね。。。

 なので今回はきちんとメーカーさんに確認を入れながらしたんですが、
 メーカーによっては無視されるところもありました。
 今回アンテナで採用したのはきちんと組み合わせが認証取れている
 三省電機様の「STDANTEMD-008」です！！
 三省電機様、色々面倒くさい質問にも快くご対応頂きまして誠に有難うございました。

#### アンテナのインピーダンス設計が面倒くさい
アンテナはノイズの影響をめちゃくちゃ受けやすいので
インピーダンスをうまく調整する必要があります。
配線の持っていきかたも少々考えました。

#### BOMの仕入先は統一した方がいい
始めは仕入先をバラバラにしてしまっていたので、面倒くさいことになってしまいました。
今はDigikeyで統一しています。

#### kicadで円弧の配線が書けない
以下のサイトを参考にさせて頂き、配線の円弧を実施しました。
https://jo4efc.blogspot.com/2020/06/kicad.html
またPCがMacのため、pluginsの場所がわからずめちゃめちゃ苦労しましたが
PCB作成画面のコンソールから「import pcbnew」のあとに「print(pcbnew.GetWizardsSearchPaths())」を
打ち込むことで無事pluginsの保存先がわかりました。
SQL Server 便利SQL

## 全テーブルを出力
``` sql
select s.name +'.'+t.name
from sys.tables t
join sys.schemas s on t.schema_id = s.schema_id
order by 1
```

## 指定したスキーマ内の全テーブルを出力
``` sql
select s.name +'.'+t.name
from sys.tables t
join sys.schemas s on t.schema_id = s.schema_id
where s.name ='SchemaName'
order by 1
```

## 指定したテーブルの列情報を出力
``` sql
select 
	 s.name+'.'+t.name AS TableName 
	,c.name            AS ColumnName 
	,d.name            AS DataType
	, c.max_length     AS Length
	,c.is_nullable     AS [Nullを許容]
from sys.tables t
join sys.schemas s on t.schema_id = s.schema_id
join sys.columns c on c.object_id = t.object_id
join sys.types   d on d.system_type_id = c.system_type_id
where t.name      = 'tablename'
order by c.column_id
```

## 制約名の一覧を取得
``` sql
select 
  s.name+'.'+t.name tablename 
, c.name
, d.name
from sys.schemas             s with(nolock)
join sys.tables              t with(nolock) 
on   s.schema_id = t.schema_id
join sys.columns             c with(nolock)
on   t.object_id = c.object_id
join sys.default_constraints d with(nolock)
ON  t.object_id = d.parent_object_id
and c.column_id = d.parent_column_id

order by s.name, t.name , c.column_id
```

### 列削除のSQLを作成
SQL Serverは削除対象の列に制約があると列削除できずエラーになります。
先行して制約削除のAlter tableを実行する必要があります。SQLは以下
``` sql
declare @TableMame   varchar(50)
declare @ColumnName varchar(20)
set @TableMame ='dbo.table';
set @ColumnName='column1'
select 
 'alter table '+s.name+'.'+t.name + ' drop CONSTRAINT ' +d.name as '制約削除SQL'
from sys.schemas               s
join sys.tables                t on t.schema_id = s.schema_id 
join sys.columns               c on t.object_id = c.object_id 
left outer join sys.default_constraints   d on d.parent_object_id = c.object_id and d.parent_column_id = c.column_id
where  s.name+'.'+t.name = @TableMame
and    c.name = @columnName


```

## ColumnのPK情報を取得
``` sql
select
     s.name+'.'+t.name           TableName
    ,c.name                      ColumnName
    ,case when p.key_ordinal is null then 0 else 1 end IsPrimaryKey
from sys.tables  t with(nolock)
join sys.columns c with(nolock) on   t.object_id = c.object_id
join sys.schemas s with(nolock) on   t.schema_id = s.schema_id

left outer join  (
    select
         t2.object_id  
        ,c2.column_id  
		,i.key_ordinal
    from sys.tables          t2 with(nolock)
    join sys.key_constraints d2 with(nolock)
    on   t2.object_id = d2.parent_object_id
    and  d2.type = 'PK'            
			
    join sys.index_columns i with(nolock)
    on  d2.parent_object_id = i.object_id
    and d2.unique_index_id  = i.index_id
    
	join sys.columns c2 with(nolock)
    on  i.object_id = c2.object_id
    and i.column_id = c2.column_id
) p
on  c.object_id = p.object_id
and c.column_id = p.column_id
order by 1,2,c.column_id
```
【反面教師】AWSの無料利用枠を勘違いし、ちょっと泣きたくなった話

# ある日

2022/3月、AWSの無料枠の範囲でこんなことをしていた。

環境構築後は、インスタンスなどは停止した状態で放っておいた。

https://qiita.com/yokoo-an209/items/547d9a495a0a83855031


そして、ふとメールを見るとAWSからこんな通知メールが

![スクリーンショット 2022-04-04 21.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/81b8c47f-8450-5e8a-30fa-d684fe7b68b7.png)


**`Total in JPY: 8,954*`**

「ほぇ？」

一瞬なんのことを言ってるかよくわからなかったが、冷静になりよくみてみると・・・

「あれ、もしかしてこれ先月の請求のこと言ってる？　
まだ登録して12ヶ月以内だから無料枠のはずなのにどういうこと？？」

悪い予感を抱えながら、`Billng`を見にいくと・・・・

![スクリーンショット 2022-04-04 22.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/f749e58d-2a80-d1f7-8677-9f39e5692298.png)


![スクリーンショット 2022-04-04 22.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/ecf4eefc-24de-5951-ef8b-96ba9de78862.png)


ガチやん！！！　泣きたい😢

# 勘違いしていたこと
- AWSはサービス開始後は、12ヶ月の無料枠があるがそれは↓リストにあるような**対象サービス**に絞られると言うこと
- （12ヶ月の間は、ほぼ全ての基本的なサービス（リソース）が無料だと勝手に思い込んでいた）


https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=tier%2312monthsfree&awsf.Free%20Tier%20Categories=*all#Free_Tier_details


# 高い原因
詳細を見てみると、`NAT Gateway`や`マルチAZのRDSインスタンス`、アタッチしているがEC2が起動していないことによる`ElasticIPの課金`などが大きな要因となっているようだ
（通常のEC2やRDSはもちろんちゃんと無料分として扱われている）

![スクリーンショット 2022-04-04 22.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/fc849e06-929c-4375-0910-f28c01d0d409.png)


# 再発防止策
- これまでCloudWatchの請求アラームで`$5`を超えたらアラートが来るように設定していたが、それを見直し
- AWS Budgetを使用し、コスト管理を実施

https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-best-practices.html#budgets-best-practices-actions



# さいごに

何も稼働せずただ放置していただけなので、勉強代にしては高すぎた・・・

いい教訓となった出来事でした。


（未来の自分へ）

利用するときは、対象サービスが無料かどうかちゃんと確認しなさい。ジム代より高くつくぞ。
Nablarchを使ったバッチアプリケーションのデバック方法

# はじめに
こんばんわ、きりです。
本記事は[Nablarchを使ってみよう](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17)のサブ記事として作成しております。

今回はNablarchバッチアプリケーションのデバッグ方法について、整理していきます。

本記事以外のコンテンツは[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)から閲覧可能です。

なるべく、初心者目線で作成するつもりですが、分かりづらい部分ありましたら、コメント頂きたいです。

# 動作環境
|種類|バージョン|
|---|---|
|OS|macOS Monterey 12.2.1|
|Eclipse|2022 Full Edition|

※Eclipseのダウンロードについては、[こちら](https://qiita.com/kirin1218/items/02bfeb333335842c56ae)の記事をご確認ください。

# 準備
[Nablarchを使ったバッチアプリケーションの作成](https://qiita.com/kirin1218/items/eb3033ecb1520b497cc2)に従い、Nablarchのバッチアプリケーションをダウンロードおよびプロジェクトの読み込みを行ってください。

# ビルド
プロジェクト名を右クリック>実行>実行の構成 をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/9dbf7730-480e-4251-4492-f55bcb91d739.png)

Mavenビルドを選択、新規の起動構成ボタンをクリック。
メインタブにて、以下の項目を入力、適用後、実行ボタンをクリックします。
|項目|値|例|
|---|---|---|
|名前|任意の値|mvn-compile|
|基底ディレクトリー名|${project_loc:myapp-batch}||
|ゴール|compile||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/aea684df-b1ab-30de-8496-560750e87d34.png)

# デバッグ
パッケージ・エクスプローラまたは、プロジェクト・エクスプローラからSampleBatch.javaファイルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/55c35245-7682-a2a7-5b62-20a86f9c0197.png)

８４行目の行番号部分をダブルクリックし、ブレークポイントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/186f5e5d-8829-7542-a874-3e1785fa8cb7.png)

プロジェクト名を右クリック>デバッグ>デバッグの構成 をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/73aa71e3-734d-4b0a-a7ec-ab525cc4c9ce.png)

Javaアプリケーションを選択>新規の起動構成をクリック。
メインタブにて、以下の項目を入力
|項目|値|例|
|---|---|---|
|名前|任意の値|run-app-batch|
|プロジェクト名|myapp-batch||
|メイン・クラス|nablarch.fw.launcher.Main||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/57f72d90-f55e-5c6f-9a3d-59e8546b4e13.png)

引数タブにて、以下の項目を入力し、適用ボタンをクリックし、最後にデバッグボタンをクリックします。

|項目|値|
|---|---|
|プログラムの引数|-diConfig classpath:batch-boot.xml -requestPath SampleBatch -userId batch_user|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/0d476540-009d-7ffa-5239-04d0654dc817.png)

デバッグが期待通り開始されると、84行目で停止します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/3f037213-aa19-d105-7f07-98348acc33f7.png)

それ以降のデバッグ操作について、[こちら](https://qiita.com/kirin1218/items/76d6ee9cfa284bb49165#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E6%89%8B%E9%A0%86)のデバッグ手順を確認してみてください。

# 最後に
JavaにはJUnitのような単体テストの仕組みが存在しますが、変数の状態や細かい処理の流れを確認するにはデバッグが最適です。
Flutterでpub addしたらエラー出たからメモ

`flutter pub add xxxxx`
でインストールしようと思ったらエラー
```bash
Building with plugins requires symlink support. Please enable Developer Mode in your system settings. Run start ms-settings:developers to open settings.
```
下記を実行する
```powershell
start ms-settings:developers
```
開発者向け設定のウィンドウが立ち上がるので「開発者モード」のスイッチをオンにする
![スクリーンショット 2022-04-04 221152.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/d7c624e9-45bc-d059-ed85-dd6a376ec5bf.jpeg)
または左下の虫眼鏡マークから「開発者向け」と検索すると上記のウィンドウが出てくる

再度実行するとインストール成功。おわり
UE5 Preview版でプレイするとクラッシュしたときの対処

UE5 Preview版 VRテンプレートでプロジェクトを新規作成した際にプレイボタンを押すと100%クラッシュする事象が先日発生しました。

ログ内容は
Assertion failed: InMinuend.Num() == InSubtrahend.Num()...
BufferVectorOperations.cpp] [Line: 458] Input buffers must be equal length...
といった感じです。

VRプラグインがUE5がクラッシュする原因との記事も見つけたのですがVR開発をしたいので外すわけにもいかず...と色々試したところ、
Epic Games LauncherのライブラリのEngineバージョンのオプションからインストールすることができる「デバッグに必要なエディタシンボル」をインストールするとクラッシュが発生しなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613482/c149f667-e151-fef6-56df-017aaaf5e4f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613482/a6ab40db-5a8b-0a97-b9d1-7a74bae5ca10.png)

言われてみたら確かにデバッグに必要な資源がなかったらデバッグ起動はできないよなーとは思うものの、なぜ最初からデフォルトでインストールしてくれないのか？となぜこんなにもエラーメッセージが分かりにくいのか？とちょっと思ってしまった。
VCI(Virtual Cast Interactive)で使うUnityプロジェクトファイルでAssetフォルダー以外から「Lua」フォルダーを参照を行う方法

# はじめに
UnityでAssetフォルダー以外からフォルダーを参照を行うために``シンボリックリンク作成``を行う説明になります.

# 対象読者
・Unity始めたばかりでAssetフォルダー以外から参照方法がわからない人.
・VCIを作っていてファイルに参照が外部から直接選べなくなって困った人.
・複数のプロジェクトファイルを作っていて、共通の自作``main.luaテンプレート``、``Luaモジュール``を使いたい人.

# Assetフォルダー以外からフォルダーを参照を行う方法
**=== 理由 ===**
・VCIでLuaの開発を行うフォルダーが下記である.
``C:\Users\Name\AppData\LocalLow\infiniteloop Co,Ltd\VirtualCast\EmbeddedScriptWorkspace\VCI名``
・VCIのUnityでLua参照できる場所が``Asset``フォルダー内のみの参照になってしまった.
・VCIのLuaファイルのリビジョン管理に別でバージョン毎に管理していた.
・外部参照出来ないと作業やリビジョン管理が大変になってしまう.

**=== 目的 ===**
・ド忘れ防止
・他のVCI製作者への共有

# 手順
**1.コマンドプロンプトをオープン**
検索で``cmd``を入力し``管理者として実行``をします.
![Inkedスクリーンショット 2022-04-04 211206_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/2a0d302b-0d08-af62-3715-19fa58f9fa56.jpeg)


**2.コマンドプロンプトの表示場所のファイル移動**
今回はUnityのプロジェクトファイルはCドライブ以外に置いてあるので、
``cd``の移動コマンドに``/d``をつけてファイルパスを入力し移動を行います.
```text:cmd.txt
cd /d [ファイルパス]
```
![Inkedスクリーンショット 2022-04-04 185932_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/88fb71a4-977f-2ef4-0d6c-c38e481b929e.jpeg)


**3.シンボリックリンクの作成** 
今回目的のフォルダーをコマンドで下記の形式にてファイルパスを入力を行います.
```text:cmd.txt
mklink /D [ファイル名] [リンク元のファイルパス]
```
![Inkedスクリーンショット 2022-04-04 193724_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/9850789e-2bcf-8621-f975-3fa02562ab99.jpeg)

**4.シンボリックリンクが作成結果** 
下記に``VCI_Lua``のシンボリックリンクが作成されました.
![スクリーンショット 2022-04-04 193909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/c637d830-e5a4-0c3f-1046-b2091ff2690e.png)
作成された``シンボリックリンク``の``ファイルパス``は下記にある左側の``Assets``になっており,
右側が元の``ファイルパス``になります.
![スクリーンショット 2022-04-04 194145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/7690ef00-7e39-9ee2-991d-d3800655ef53.png)
シンボリックリンクを解除を行うまではこの２か所のフォルダーはリンクされどちら側で編集を行っても反映されます.
下記画像の通り``Unity``からも``Asset``ファイル内として認識されています.
![スクリーンショット 2022-04-04 194909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/523bb2a5-6a55-a62b-6bd1-e61f23eef20f.png)
``Unity``で開いたことにより元のリンク元では``.mata``ファイルが生成されました.
![スクリーンショット 2022-04-04 194951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/275064d5-08d8-11b7-dc35-3922dc6191c2.png)
これで、無事に直接``Lua管理用``のフォルダーを参照ができるようになりました.
もっと早く知りたかったですが,どうしようもないのでこれからのファイル管理に使って行こうと思います.
# まとめ
**利点**
・一括で複数の``UnityAssets``のアップデートが可能である.
・一括管理が行える.
・``VCI``に関係なく``Unity``のプロジェクトで使う事が可能である.
・``UnityAssets``でも応用ができ,ストレージの圧迫を抑える事ができる.
**欠点**
・リンクされると困る場合(Unityのバージョンによって使えなくなるもの等)には使えない.
・``.mata``ファイルが生成されると困る場合には使えない.
courseraのMachine Learning講義を受けてみた2

# 多量変数の線形回帰
変数が多くなるとき、その式をいちいち羅列して記入するのはダサい。

以下のようにするとかなりおしゃれ
```
f = a0*x0 + a1*x1 + a2*x2 + .... + an*xn

これを
A = [a0,
     a1,
     a2,
     .
     .
     an]

X =　[x0,
      x1,
      x2,
      .
      .
      xn] (x0 = 1)

とすると、
f = transpose(A)*X
```

## 実践的なテク
### フィーチャースケーリング
住宅価格の予測において、二つの特徴量を用いたとする。

x1が土地面積（100～10000）
x2が部屋数（1～5）

このとき、x1,x2の範囲にかなり差があるため、J(a0,a1,a2)はかなり歪んだ等高線を描く。

歪んだ等高線の場合、最急降下法を行うとあっちへ行ったり、こっちへ行ったりするため、非常に時間がかかる。

これを改善するために、計算前にスケールの調整を用いるとよい。
xnは約-1<=x<=1であることが望ましい。厳密である必要はない。

よって上記の例では、すべてのデータセットにおいて
x1/10000
x2/5　（これは別にしなくてもいい）
を行うと、等高線がきれいな円となり、計算速度が速くなる。


また、平均ノーマライゼーションという手法もある。
これはより整えたい場合に用いる。
範囲の平均で引いて、（最大値ー最小値）または標準偏差で割る。

上記の例で行くと

(x1-1000)/2000
(x2-3.5)/7

とすると、両方の範囲が-0.5から0.5の間に収まる。

## 学習率α
大きすぎると、どんなに回数を重ねてもmin J()が収束しない。
小さすぎると、収束に時間がかかる。

一つの解決手段は、αを0.01,0.03,0.1,0.3,1,3,...と三倍ずつ大きくしていくことだ

これで急に収束しなくなれば、その前の値で反復を重ねれば良い

# 非線形回帰
例えば、家の土地面積から価格を予測するとき、データセットのプロットが明らかに曲線を描いていたとする。

このとき、線形回帰と同様の手順で

h(x) = a0 + a1*x + a2*x^2 +a3*x^3

と定義すればよい。
ただし、ここではフィーチャースケーリングが大変重要となる。

面積の範囲が100以上、10000以下だとすると、
（面積）＾2は10000以上10＾8以下
（面積）＾3は10＾6以上10＾12以下
となる。

つまり、スケーリングを怠れば大惨事だ。

しかし、冷静に考えて住宅価格が三次関数のように急に発散し出したり、
二次関数のように急に暴落することは考えがたい。

このとき便利なのが、ルートである

h() =a0 + a1*x + a2*√ｘ

とすればどうだろう。後半になるにつれてゆるやかになることが表現できる。

# 正規方程式法
特徴量がn個のデータがm個あるデータセットを使ってyを学習させるとき
Xの行列を1列目をすべて1にし、2列目以降にデータセットを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1611054/87a1253e-7a78-05b8-24e3-afc617087541.png)
画像は抗議より引用
よって、Xはm*(n+1)の行列

Yの行列はベクトルで表現する。

すると、求めるべきθは

{tran(X)*X}^-1*tran(X)*Y

として表せるようだ。

```octave
pinv(X' *X)*X'*Y
```
とoctaveでは表記できる。

# 最急降下法と正規方程式法の違い
どちらかの欠点がもう片方では補完されているため、
場合に応じた選択が必要である。
## 最急降下法の欠点
適切なαを選択する必要がある
より多くの繰り返しを必要とする。
## 正規方程式法の欠点
特徴量nが大きくなると時間はn^3倍になる。
よって、特徴量が多い場合は向かない。

n=10^4くらいが基準点になるようだ。

## 行列の逆数が見つからない場合
主に二つの原因が考えられる。
### 相関を互いに持つ特徴量があるとき
例えば住宅価格予測において、特徴量に土地の縦横の長さ、面積が含まれていたとする。
この二つの特徴は相関を持つため、どちらかを省くと逆数が見つかるだろう。
### 特徴量が多すぎる
例えばデータ量が10しかないのに、特徴量が100あるなどは逆数が見つかりにくいらしい。
特徴量を削ってみよう

#octaveの基本操作
```
行列の表記
A = [1 2; 3 4; 5 6]
4*4単位行列
B = eye(4)
Aが3＊2の行列であることを[3, 2]という行列で返す。
size(A)

ファイルの読み込み
load fileName.factor
か
load ('fileName.factor')

行列からの取り出し
A(2，2）
4が取り出される

A(3, :)
[5, 6]が取り出される。

A=[1 2; 3 4; 5 6]
B=[11 12; 13 14; 15 16]
のとき
[A B]=
[1 2 11 12; 3 4 13 14; 5 6 15 16]
となる
[A;B]
だと縦に合体する。
redashで特定の文字列に一致するデータを取得する（LIKE句、％）

## 概要
- 特定の文字列に一致するデータのみを取得したい

## 回答
- 取得したい文字列に対して`%`（ワイルドカード）を入れる
- `LIKE`句を入れる

```SQL
SELECT
    *
FROM
    'テーブル名'
WHERE
    'テーブル名.カラム名' LIKE '%hoge%'
```

- この場合、文字列の前後に`%`を入れているため、部分一致になる
- `'%hoge'`や`'hoge%'`などにすれば前方、後方部分一致になる



## 詳細（例）
### やりたいことA
- 大阪の倉庫を取得したい

#### テーブル例
- 倉庫テーブル(db.storage)

| id | name | address |
| :--: | :--: | :--: |
| 1 | 大阪中央倉庫 | 大阪府大阪市hoge1-2 |
| 2 | 大阪北倉庫 | 大阪府吹田市hoge1-2 |
| 3 | 大阪南創庫 | 大阪府堺市hoge1-2 |
| 4 | 名古屋中央倉庫 | 愛知県名古屋市hoge1-2 |
| 5 | 東京中央倉庫 | 東京都千代田区hoge1-2 |
| 6 | 東京港倉庫 | 東京都港区hoge1-2 |

#### クエリ
```SQL
SELECT
    *
FROM
    db.storage
WHERE
    db.name LIKE '%大阪%'
```

#### 出力結果
| id | name | address |
| :--: | :--: | :--: |
| 1 | 大阪中央倉庫 | 大阪府大阪市hoge1-2 |
| 2 | 大阪北倉庫 | 大阪府吹田市hoge1-2 |
| 3 | 大阪南創庫 | 大阪府堺市hoge1-2 |

### やりたいことB
- 東京在籍のユーザー一覧を出したい
- ※前提として、場所の入力がフリーテキストです

#### テーブル例
- ユーザーテーブル(db.users)

| id | name | location | sex |
| :--: | :--: | :--: | :--: |
| 1 | A | 東京 | 男性 |
| 2 | B | 神奈川 | 男性 |
| 3 | C | Tokyo | 女性 |
| 4 | D | Tokyo Japan | 女性 |
| 5 | E | 東京都 | 男性 |
| 6 | F | 千葉 | 男性 |
| 7 | G | 千葉県 | 女性 |
| 8 | H | 東京都港区 | 男性 |
| 9 | I | saitama | 女性 |
| 10 | J | 神奈川県 | 女性 |

#### クエリ
```SQL
SELECT
    COUNT(db.id) AS count
FROM
    db.users
WHERE
    db.location LIKE '%東京%'
    OR
    db.location LIKE '%Tokyo%'
```

#### 出力結果
| count |
|:--:|
|4|

### やりたいことC
- 東京在籍でかつ、女性のユーザー一覧を出したい
- ※前提として、場所の入力がフリーテキストです

#### テーブル例
- ↑と同様のユーザーテーブル(db.users)を使います

#### クエリ
```SQL
SELECT
    *
FROM
    db.users
WHERE
    (db.location LIKE '%東京%'
    OR
    db.location LIKE '%Tokyo%')
    AND
    db.sex = '女性'
```

#### 出力結果
| id | name | location | sex |
| :--: | :--: | :--: | :--: |
| 3 | C | Tokyo | 女性 |
| 4 | D | Tokyo Japan | 女性 |
学生向けMacBookに入れておくと便利なアプリケーション

# はじめに
個人的なメモも兼ねて共有しようかなぁって感じなので参考程度に見てくださるとありがたいです。
Qiitaなので広告、アフィリエイト収入が目的でないので安心していただけるかと🙇‍♂️
(というかこの手のブログとかサイトは広告目的だらけでまともに参考にできない...)

何か意見とか他にも良いの知ってる！というのがあればコメントでお願いします。

- 使用しているMac
    - MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
- OS
    - macOS Monterey バージョン12.3

# 必須レベル
## Google Chrome
まぁ大体の人に必要だと思います。学内サイトとかmoodleなどの動作要件にも入ってますしね。
個人的には趣味はSafari、大学関係はChromeと使い分けるのが便利だと思ってます。Safariだとキーチェーンで自動でパス入力してくれるからね。

https://www.google.com/intl/ja_jp/chrome/

## Microsoft Office
流石に必要。使わない人はあんまりいない。人によっては大学からライセンスが配られている可能性もあるので自分で買う前に確認しよう。
自分で買う人は買い切り版と年額版があるから注意してください。

https://www.microsoft.com/ja-jp/microsoft-365

## Clipy
コピーしてペーストしてまた違うのコピーしてペーストしたけど最初にコピーしたのまた貼り付けたい！ってなったことない？~~ないか~~
そんな時でも安心なアプリです。正直めちゃくちゃ使ってます。

導入方法・使い方は[こちら](https://qiita.com/econa77/items/1848bf3fdfb7127ca9b8)

https://clipy-app.com

## DeepL
外国語の講義まじめに受けてる奴いる？~~いねえよな！？~~
多分Googleより優秀な最強の翻訳アプリ。論文読むのもこれで簡単。

https://www.deepl.com/ja/app?utm_medium=app-navigation-entry/

## LINE
課題とか資料とか友達に送る時そのまま送れるから便利。
Macの通知オンだと音で教授にバレるので注意。

https://apps.apple.com/jp/app/line/id539883307?mt=12

## Magnet
Windowsみたいなウインドウ操作ができるようになるアプリ。有料だけどそれに越したメリットがある。

https://apps.apple.com/jp/app/magnet-%E3%83%9E%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88/id441258766?mt=12

# 入れておくと便利
## Zoom
そもそも学校側から入れろって言われてそう。

https://zoom.us/download#client_4meeting

## EverNote
メモに便利。Safariで見ているページを丸々保存できるが優勝。

https://evernote.com/intl/jp/download

## AppCleaner
Macにインストールしたアプリケーションはゴミ箱に入れてアンインストールしても関連ファイルが削除されない。
でもこれを使えば関連ファイルまで探し出して削除してくれます。

https://freemacsoft.net/appcleaner/

## The Unarchiver
圧縮ファイルはこれで解凍しよう。

https://apps.apple.com/jp/app/the-unarchiver/id425424353?mt=12

# 要らないけど入れておきたい
本編です。正直ここだけ見ていただければおk(??)

## RunCat
可愛い猫ちゃんがMacの上の方を走ります。かわいい。Macに負荷がかかると速く走ります。かわいい。癒されるだけでなく実用性もあるところ素晴らしい。

https://apps.apple.com/jp/app/runcat/id1429033973?mt=12


# まとめ
以上になります。質問等ございましたらコメント欄までお願いします。
Laravel8 Jetstream Livewireについて

## はじめに
Laravei8で認証機能を担う`Jetstream`をインストールする時に`Livewire`か`Inertia`を選択することになります。
今回はLivewireをメインにまとめてみました！

・LivewireとInertiaの違い
簡単に、二つの違いは使用されている言語なので慣れている方を選択するのが良いと思います。
`Livewire`→`PHP + Bladeで作成されたscaffolding(プロファイル画面など)`
`Inertia`→`vue.jsで作成されたscaffolding(プロファイル画面など)`

## Livewireとは
### 特徴
・JavaScriptのフレームワークであるVue.jsやライブラリのReactなどと同様に、`ページをリロードすることなく入力した内容を更新させることができる。`

・普通はJavaScriptのコードで記述する必要があるが、LivewireではPHPのみのコードで記述可能。

・バックエンドとの通信は`Ajax`で非同期通信。
Ajaxとは、「Asynchronous（エイシンクロナス：非同期） JavaScript ＋ XML」の略で、実装方式の呼び名。

Ajaxについての参考記事：

https://wa3.i-3-i.info/word12672.html

・PHPのみでフロントエンドとバックエンドの処理を記述することができるため非常に効率的にアプリケーションを構築することが可能。

## 参考記事

https://reffect.co.jp/laravel/laravel-livewire#i-5

https://reffect.co.jp/laravel/laravel-inertia-js
OCI ADBのDatabase Actionsを利用して、DBユーザを作成しよう

# 手順
１．Autonomous Databaseとは
２．Autonomous DatabaseのDatabase Actionsとは
３．SQL文を書かずに、DBユーザを作成しよう

## １．Autonomous Databaseとは

https://www.oracle.com/jp/autonomous-database/

https://speakerdeck.com/oracle4engineer/adb-s-technical-detail-jp
## ２．Autonomous DatabaseのDatabase Actionsとは

https://speakerdeck.com/oracle4engineer/autonomous-database-database-actions-ji-neng-gai-yao

## ３．SQL文を書かずに、DBユーザを作成しよう
① Autonomous Databaseにアクセス
「ナビゲーションメニュー」→「Oracle Database」→「Autonomous Database」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c1a82a25-e02a-7ff7-5511-570441095a9b.png)
②「コンバートメント」を選択し、「Autonomous Database」インスタンスをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e8112578-64be-27c5-5ab2-2eb8f4574130.png)
③ Autonomous Databaseインスタンスの詳細画面で、「データベース・アクション」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/83c78341-59c4-51cb-2890-66bdd208bacb.png)
④ 少し待つ・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/8ddcfacd-dd87-fb3e-fcfe-3289b86640b8.png)
⑤ 最初はADMINでDatabase Actionsにログインされる。「管理」の配下の「データベース・ユーザー」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/8fa1ad1d-ada1-e986-68fe-26cdfb4a65c9.png)
⑥ 「＋ユーザーの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/916c14c7-e953-217c-e14c-460ba44f1357.png)
⑦ 「ユーザー」タブ

:::note info
ユーザー名：springuser
パスワード：Welcome12345#
パスワードの確認：Welcome12345#
グラフ：On
Webアクセス：On
Webアクセス拡張機能：承認が必要On
表領域の割当の制限 DATA：UNLIMITED
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e58460a7-6ac5-c0b2-4d20-3b06faefae56.png)
⑧ 「付与されたロール」タブ
DWROLE：管理✓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e64e61f8-dd6a-f362-fce9-955a86cc5345.png)
⑩ 「ユーザー」タブに戻る 
⑪ 「ユーザーの作成」ボタンをクリック
⑫ DBユーザーが作成されたことを確認し、設定した内容が保存されていることを確認
「3点」→「編集」クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/67959d11-544f-25f3-30ee-3beca016b993.png)
⑬ 作成したDBユーザで、Database Actionsにログイン
DBユーザーカードのログインURL右側の「↗」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/69d98e1a-a78b-142e-40d1-5c2f6fcdd287.png)
⑭ DBユーザー名とパスワードを入力し、「サインイン」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/496b2ddb-ff16-4252-7b42-9c3799215b5b.png)
⑮ 作成したDBユーザーでログインできたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/da99db85-58d7-7b27-bcc9-0340adf835ff.png)
以上
mcrconを利用してpythonからminecraftサーバにコマンドを出力する

mcrconについての記事が少なくて困ったので備忘録。

<h1>mcrconの導入</h1>
任意のコンソール(本記事ではgitbashを使う)で次のどちらかを行う。

詳しくは以下を参照して環境に合わせてインストールしてください。
<a href=https://pypi.org/project/mcrcon/>https://pypi.org/project/mcrcon/</a>

```ruby:gitbash
pip install mcrcon
python -m pip install mcrcon
```

<h1>まず初めに準備</h1>
<h5>サーバ側のserver.propertiesを次のように書き換える</h5>

```ruby:server.properties
      :
rcon.port=任意のポート番号　     #約24行目　初期設定:rcon.port=25575 
      :
rcon.password=任意のパスワード   #約34行目　初期設定:rcon.password=minecraft
      :
enable-rcon=true　　　　　　　 　#約40行目　初期設定:enable-rcon=false
      :
```
‣`rcon.port=`ではポート番号の指定ができるが特に特別な理由がない限り`25575`にするのが無難だろう。
※もし考えるのがめんどうであれば`enable-rcon`を`true`に編集すればよいだろう。


<h5>起動するpythonのファイルコードの頭に次のように記述(本記事ではファイル名をcmd.pyとしている)</h5>

```ruby:cmd.py
import mcrcon from MCRcon            #mcrconのインポート
server_address = "サーバのアドレス"　　#マルチプレイするときに入れるアドレス 
server_pass = "任意のパスワード"   　　#server.propertiesと同じパスワード
server_port="任意のポート番号"    　 　#server.propertiesと同じポート番号
```

<h1>プログラムの解説</h1>

```ruby:cmd.py
with MCRcon(server_address, server_pass, server_port) as mcr:
    cm=input("起動したいコマンドを入力してね！")
    log=mcr.command(cm)
    print(log)
```
```ruby:入力(例)
/stop
```

```ruby:出力(例)
stopping server!
```
出力と同時にサーバが止まります。

<h4>解説</h4>

<details><summary><strong>server_addres</strong>＆<strong>server_pass</strong>＆<strong>server_port</strong></summary>
<a href= https://qiita.com/mutchan1k/items/0084af949a9f1dd44e6b#%E3%81%BE%E3%81%9A%E5%88%9D%E3%82%81%E3%81%AB%E6%BA%96%E5%82%99 >まず初めに準備</a>で設定した値が入る。

</details>

<details><summary><strong>with MCRcon(~) as mcr:</strong></summary>
MCRcon(~):で接続したいサーバに接続します。
with ~ as mcr:で~の処理をmcrという変数にします。

</details>

<details><summary><strong>mcr.command()</strong></summary>
ここでminecraftサーバのコンソールに打つようなコマンドを実行できます。

今回の場合は入力したコマンドを実行します。
実行結果を出力してくれるので(log=はなくても実行できます)今回はlogに入れて出力しています。

</details>



<h6>コード全体像</h6>

```ruby:cmd.py
import mcrcon from MCRcon            #mcrconのインポート
server_address = "サーバのアドレス"　　#マルチプレイするときに入れるアドレス 
server_pass = "任意のパスワード"   　　#server.propertiesと同じパスワード
server_port="任意のポート番号"    　 　#server.propertiesと同じポート番号

with MCRcon(server_address, server_pass, server_port) as mcr:
    cm=input("起動したいコマンドを入力してね！")
    log=mcr.command(cm)
    print(log)
```

<h1>最後に</h1>
今回はコマンドを出力する方法しかわかりませんでした。

他にもできることがわかり次第記事を書いていきたいのでコメントくださるとうれしいです。

<h1>参考</h1>
<a href=https://blog.takunology.jp/entry/2019/08/24/070219>https://blog.takunology.jp/entry/2019/08/24/070219</a>
Laravelのマイグレーション【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

## マイグレーションとは
データベースの内容を自動生成するために用意されているのがマイグレーション。
データベースを扱うときにもっとも注意しなければならないのがデータベースの構造。データベースや環境を移行する場合、すべてのデータベースをまったく同じ構造で作らなければ正しく動作しなくなる。現在使っているデータベース構造とまったく同じものを再現する仕組みがあればデータベースの管理は楽になる。そのための機能がマイグレーション。
マイグレーションは、データベースのバージョン管理機能。テーブルを作成したり削除したりする機能をもっている。PHPのスクリプトをつかってテーブルの作成処理などを用意しておける。
マイグレーション機能をつかえば環境が変わった場合もコマンド一発でデータベースのテーブル類を生成することができる。
途中でテーブルの構造を変更した場合も、古いテーブルをすべて削除して最新のテーブルに更新する作業が簡単にできる。

## マイグレーションの手順
- 1.専用のスクリプトファイルの作成
- 2.スクリプトの記述
- 3.マイグレーションの実行

### 1.専用のスクリプトファイルの作成
`php artisan maike:migration ファイル名`
マイグレーションファイルがdatabase/migrationsフォルダの中に作成される。
migrationsフォルダがマイグレーションファイルを保管しておくフォルダになる。
マイグレーションファイルには冒頭にファイルを生成した日付と時間を表す数字が付けられる。

### 2.スクリプトの記述
マイグレーションファイルにはMigrationを継承したクラスが作成されている。
このクラスは以下２つのメソッドが用意される

#### upメソッド
テーブルを生成するための処理を記述する。

#### downメソッド
テーブルを削除するための処理を記述する。

```/database/migrations/2022_04_01_044437_create_people_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{

    public function up()
    {
        //第1引数でテーブル名、第２引数でテーブルを作成するための処理をまとめたクロージャ
        Schema::create('people', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('mail');
            $table->integer('age');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('people');
    }
};
```

### 3.マイグレーションの実行
SQliteの場合、sqliteファイルがある場所にターミナルに移動。
`php artisan migrate`

/database/migrations/フォルダのなかのファイルがそれぞれ実行されてテーブルが用意される。
GitHub でウェブサイトを公開する方法


New をクリック

[![Image from Gyazo](https://i.gyazo.com/bbe74d6d92d066a2688d8301df480321.png)](https://gyazo.com/bbe74d6d92d066a2688d8301df480321)


リポジトリー名を入力し、
「Create repository」をクリック

[![Image from Gyazo](https://i.gyazo.com/647148a157e63a384cc0d767dd119f45.png)](https://gyazo.com/647148a157e63a384cc0d767dd119f45)

「creating a new file」の文字をクリック

[![Image from Gyazo](https://i.gyazo.com/930b8d16f16609f6c59145470bbb32c0.png)](https://gyazo.com/930b8d16f16609f6c59145470bbb32c0)


ファイル名、コードを入力し、
「Commit new file」 をクリックする。
[![Image from Gyazo](https://i.gyazo.com/c8e5e0b681a8131cae38bc485c734f57.png)](https://gyazo.com/c8e5e0b681a8131cae38bc485c734f57)


次に、「Setting」
[![Image from Gyazo](https://i.gyazo.com/f8ee5612778af343b9cb2118506193b8.png)](https://gyazo.com/f8ee5612778af343b9cb2118506193b8)

下方の　GitHub Pages の 「Check it out here!」　をクリック
[![Image from Gyazo](https://i.gyazo.com/b6f46812f103e0f5d4d80d2203634e82.png)](https://gyazo.com/b6f46812f103e0f5d4d80d2203634e82)]

Branch/main にして　Save
[![Image from Gyazo](https://i.gyazo.com/a60ed4087a71993ebdc210732e18e54e.png)](https://gyazo.com/a60ed4087a71993ebdc210732e18e54e)

こんなメッセが出たら、もう公開できてます。
[![Image from Gyazo](https://i.gyazo.com/a89e469bc3f53cf790d2c48bc7a2ed9e.png)](https://gyazo.com/a89e469bc3f53cf790d2c48bc7a2ed9e)


以上です。
Dynamooseのクエリまとめ

## 書こうと思ったきっかけ
今参画してるプロジェクトのデータベースに**DynamoDB**を使っていて、そのORMとして**Dynamoose**を使っています。
ただ、調べながら実装していて思ったのが、**記事が少ないんじゃあ**ということ😅
なので、今回は実務でよく使っているクエリ文を紹介できたらと思います。

## そもそもORMとは
> オブジェクト指向プログラミングにおけるオブジェクトとリレーショナルデータベース(RDB)の間でデータの相互変換を行うこと。そのための機能やソフトウェアのこと。
プログラムからRDBへデータを保存するには、オブジェクトを実体化したインスタンスの持つ値を、データベースの表中の項目に当てはめて書き込む操作（読み込みの場合はこれとは逆の操作）を行なうが、通常はデータベース管理システム（DBMS）へ操作を依頼するSQL文などを生成・発行するコードをプログラム中にその都度記述しなければならない。
ORMはこの処理を専門的に受け持つもので、あらかじめ設定された対応関係の情報に基づき、インスタンスのデータをデータベースの対応するテーブルへ書き出したり、データベースからデータを読み込んでインスタンスに代入したりといった操作を自動的に行なってくれる。

らしい…。よくわからないけど、めんどくさい処理をやってくれるみたいな感じですかね。。
[参考記事](https://e-words.jp/w/O-R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html)

## Query紹介
### query
引数に、テーブルまたはグローバルインデックスのキーを指定します。後述する**eq**で結ばないとエラーになります。(っていうのをパイセンから聞いた)
```
query('key').eq('a').exec()
```
だと、aと等しいkeyを取得するみたいな感じですかね。

### exec
クエリを実行する役割があります。queryの第2引数にコールバックを指定した場合は、execコマンドが自動的に呼び出されますが、指定していない場合は必要になります。

### eq
引数に指定したものと等しいものを取得したい時に使います。**equal**から来ているのかな。

### lt
引数に指定したものより、小さい値を取得したい時に使います。**less than**から来てそうですね。不等号で表すと「<」かな。

### le
引数に指定したもの以下の値を取得したい時に使います。**less equal**から来てそうですね。不等号で表すと「<=」かな。

### ge
引数に指定したもの以上の値を取得したい時に使います。**greater equal**から来てそうですね。不等号で表すと「>=」かな。

### gt
引数に指定したものより、大きい値を取得したい時に使います。**greater than**から来てそうですね。不等号で表すと「>」かな。

### in
複数の値を取りうるものを取得する時に使います。
```
in([1,2])
```
この指定の仕方で、「1または2と等しい」ものを取得します。引数の型は配列になります。

### where
SQL文でもお馴染みの、対象を絞り込むためのやつです。
```
query('key').eq('a').where('number').le(3).exec()
query('key').eq('a').filter('number').le(3).exec()
```
だと、「keyがaと等しい」かつ「numberが3以下」のものを取得するみたいな感じですかね。
**filter**でも同じように指定できます。

### limit
引数に指定した数だけ、テーブルから取得します。
```
limit(3)
```
だと、3つだけテーブルから取得します。

### sort
文字の通り、取得したものを並び替えます。引数に**descending**を指定すると降順に、**ascending**を指定すると昇順に並び替えます。

### using
引数にインデックスキーを指定するのですが、**sort**と一緒に使うことが多い気がします。例えば、日付(date)というキーがあり、日付の新しい順に並び替えたいという時は
```
sort('descending').using('date')
```
みたいな感じです。

## 参考記事
[公式ドキュメント](https://dynamoosejs.com/guide/Query/)
[公式ドキュメントその2](https://v1.dynamoosejs.com/api/query/)

最後までお読みいただきありがとうございました！
リモートリポジトリを既存ディレクトリにcloneする方法→git pull

### 実行環境
- windows10のwindows power shell
- ---
### ①リモートリポジトリを既存ディレクトリにcloneする方法
簡潔に、以下のコードを実行するとできるはずです！！
`git pull`については②で記載しています...
```
# 既存ディレクトリに移動
cd [ディレクトリのパス]

# ローカルリポジトリ初期化
git init

# リモートリポジトリの登録
git remote add origin [リモートリポジトリのアドレス]

# 最新のソースコード[origin]をリモートブランチ[main]からローカルにcloneする
git pull origin main

# ブランチ確認
git branch 　　# ここでmainブランチが表示されれば完了！
```




---

### ②git pullについて

今回は`git fetch`と`git merge`を同時に行うことができる
`git pull`について記載します。



- `git fetch`とは
```
git fetch origin main
```

`git fetch`とは、最新情報をリモートリポジトリからローカルリポジトリに持ってくる操作です。しかし注意すべき点は、この操作によりリモートのmainブランチがorigin/mainブランチに取り込まれるという点です。

---

- `git merge`とは 

```
git merge origin/main
```
`git merge`では、`git fetch`でorigin/mainブランチにコピーしたリポジトリの内容をローカルのブランチに落とし込んでいます。ローカルのブランチ名を`git branch`で確認すると、mainブランチが生成されています。

- `git pull`とは  

```
git pull origin main
```
前述のとおり、`git pull`は`git fetch`と`git merge`を一括した操作になります。
[AWSのECSのエラーを解決したお話] ValidationError: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*

## はじめに
このエラーで調べるとヒットしなかったので書きました

同じエラーで困ってる方の助けになれば...

## 状況
AWSのECSでデプロイしようとした際のお話

docker-compose.ymlを設定し
```docker context create```でcontextを作成して
```docker context use```で設定し
```docker compose up```を実行した際のエラー

## エラー内容
```
ValidationError: 1 validation error detected: Value 'wordpress-
recruit_website' at 'stackName' failed to satisfy constraint: 
Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*
```

## 解決
**ValidationError** ということで
自分のディレクトリ名にしてた```'wordpress-recruit_website'```に問題があったようです

**アンダースコア** をほかの文字に変えると直りました！
Google Cloud Functions: 加算

## プログラム

```js:index.js
/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.sum_up = (req, res) => {
  var str_out = ""
  str_out += "これはテストです。\n"
  str_out += "Good Evening\n"
  str_out += "今晩は\n"
  str_out += "Apr/04/2022 PM 18:02\n"
  const aa = req.body['aa']
  const bb = req.body['bb']
  const sum = parseInt(aa) + parseInt(bb)
  str_out += "aa = " + aa + "\n"
  str_out += "bb = " + bb + "\n"
  str_out += "sum = " + sum + "\n"
  res.send(str_out)
};
```

```text
$ gcloud functions list
NAME                  STATE   TRIGGER       REGION           ENVIRONMENT
test-function-sum_up  ACTIVE  HTTP Trigger  asia-northeast1  2nd gen
```

## curl のテストスクリプト

```bash:curl_post.sh
URL="https://asia-northeast1-project-nov15-2024.cloudfunctions.net/test-function-sum_up"
#
curl $URL \
	-H "Authorization: bearer $(gcloud auth print-identity-token)" \
	-d 'aa=12&bb=45'
echo ""
```

実行結果

```text
$ ./curl_post.sh 
これはテストです。
Good Evening
今晩は
Apr/04/2022 PM 18:02
aa = 12
bb = 45
sum = 57
```

## Httpie のテストスクリプト

--verify=no をつけないとエラーになります。

```bash:httpie_post.sh
URL="https://asia-northeast1-project-nov15-2024.cloudfunctions.net/test-function-sum_up"
#
http POST $URL --verify=no \
	"Authorization: bearer $(gcloud auth print-identity-token)" \
	aa=19 bb=35
```

実行結果

```text
$ ./httpie_post.sh 
HTTP/1.1 200 OK
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
Content-Length: 97
Date: Mon, 25 Nov 2024 05:06:37 GMT
Server: Google Frontend
X-Cloud-Trace-Context: f87268e97676d0c56c0536bce3605dd7;o=1
content-type: text/html; charset=utf-8

これはテストです。
Good Evening
今晩は
Apr/04/2022 PM 18:02
aa = 19
bb = 35
sum = 54
```

使ったバージョン

```text
$ httpie --version
3.2.2
```
【OAuth】Github APIの制限を緩和する ~「Client ID」「Client Secret」の取得方法

# Github API制限について
GithubでAPIを使用する場合、同一IPからのアクセスは一時間に60回までの制限があります。

https://docs.github.com/ja/rest#rate-limiting

何も考えずにAPIを叩きまくると、すぐに制限を超えて以下のJSONが返されます。
```zsh:zsh
{"message": "API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)", "documentation_url": "https://developer.github.com/v3/#rate-limiting"}
```

この制限を緩和するには、Authenticatedなリクエストが必要となります。
緩和後は5000 requests/hourまでAPIでのアクセスが可能になります。

# OAuth設定
この記事では上記の緩和に必要なOAuthの設定を行います。
取得可能な情報は以下の2つです。

- Client ID
- Client Secret

既にGithubのアカウントは取得しているものとして、以下で設定していきます。

## 取得までの流れ
![スクリーンショット 2022-04-04 19.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/5b87b885-385a-37a4-9209-f2c3569e480d.png)

まずはGithubにsign inして、右上のユーザーアイコンから**Settings**を開きます。

![スクリーンショット 2022-04-04 19.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/c0529f81-8519-c8bb-651c-98a9f109e0f8.png)

Setting画面左のNavigationから**Developper settings**を開きます。

![スクリーンショット 2022-04-04 19.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/55f418ed-b569-31e8-931c-e54faf52fd5b.png)

GitHub Apps画面に遷移するので、続いて**OAuth Apps**を選択します。

![スクリーンショット 2022-04-04 19.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/b79a8a36-ba0d-fc55-91b3-1dfab0c6fda4.png)

OAuth Appを新規登録するので、**New OAuth App**をクリックします。

![スクリーンショット 2022-04-04 19.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/98373fe8-7175-bfb2-8251-a36be2f9e507.png)

必要情報を記載します。
Web アプリでの GitHub 認証時には、ここで設定したアプリ名がユーザーに提示されることになります。 怪しいアプリだと思われないように、アプリ名はちゃんとしたものを設定しましょう
（私はGithubActionsでAPIを使用したかったため、HomepageURLをgithubのリポジトリにしていますが、各自適切なものに変更が必要です。）

記載したら**Register application**をクリックします。

![スクリーンショット 2022-04-04 19.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/b46970b9-e077-a340-594d-7b5e4258cb3d.png)

<font color="Blue">**Client ID**が発行されています。</font>

続いてClient Secretも発行したいので、**Generate a new client secret**をクリックします。

![スクリーンショット 2022-04-04 19.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005334/f51e57cd-5369-fdd5-26b1-07f7f2b90dd9.png)


<font color="Blue">無事**Client Secrets**も発行されました。</font>
Regenerateも可能ではありますが、**Secretsの情報自体は画面遷移してしまうと確認できなくなりますので、保存必須です**。

## Github APIを上限緩和させるためのquery
上記の方法でclient関連のkeyを取得したら、APIにqueryを付け足せばアクセス数は上限緩和されます。
例えば自分の各リポジトリを取得するAPIを叩くのであれば以下の通りです。
```zsh:
https://api.github.com/users/"<githubのusername>"/repos?&client_id="<Client ID>"&client_secret="<Client Secrets>"
```

# まとめ
1時間で60件の上限はかなり少ない印象なので、APIを使うなら上記の設定は必須に思える。
追記あればまた更新します！！
icu4cがアップデートされ、rbenvが起動しなくなった時の対処

## エラー内容
ある時、何気なく`rails s`として、railsサーバーを起動した際に以下のようなエラーが発生しました。

```
Library not loaded: /opt/homebrew/opt/icu4c/lib/libicudata.69.dylib
```

## 原因
どうやら`icu4c`のバージョンがbrewをいじっている間に勝手に上がってしまい、エラーになったようです。
実際、rbenvが見ているバージョンが`69`なのに対し、`70`となっていました。

```
$ brew info icu4c
icu4c: stable 70.1 (bottled) [keg-only]
```

実際`/opt/homebrew/opt/icu4c/lib`の中身を見てみると、

```
$ ls /opt/homebrew/opt/icu4c/lib
libicui18n.70.dylib ... ←バージョンが70になっている。
```


## 対処
参考文献の[icu4c がバージョンアップされたせいでphpが動作しなくなったときの解決策](https://qiita.com/tadamatu/items/46d1eb7ea4ed32200b1f)をもとにicu4cをダウングレードしました。
一部、ファイルがインストールされているパスが異なり変えた場所があるので、あとからわかるようにメモを残します。

以下のようにしてコマンドを操作して対処しました。

```
# Formulaに移動
# homebrew/Libraryから以下は一緒だが、そこまでのパスが異なるので、調べる必要があり
$ cd /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula

# バージョンが変わるコミットを探す
$ git log --oneline icu4c.rb
commit *************
Author: ************
Date:   ************

    icu4c 70.1

    * icu4c 70.1
    * icu4c: update 70.1 bottle.

commit ************* ←ここのコミットIDをコピーする
Author: ************
Date:   ************

    icu4c: update 69.1 bottle. ←バージョンが69になっている

commit ************
Author: ************
Date:   ************

    icu4c: update 69.1 bottle.


# コミットを戻す
$ git checkout *********(先程コピーしたコミットID) icu4c.rb

# icu4cをインストールし直す
$ brew reinstall icu4c
```

ここまでやると、以下のようにicu4cのバージョンが69に戻っています。

```
# バージョンの確認
$ brew info icu4c
icu4c: stable 69.1 (bottled) [keg-only] ← 69となっている

# icu4cの中身のバージョンが変わっているか確認
$ ls /opt/homebrew/opt/icu4c/lib
libicui18n.69.dylib ← バージョンが69となっている
```

その後、`rails s`をすると、無事に起動できました。
~~Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' insteadとかrspecのときに大量のwarningを履いているけどとりあえず放置...~~



## 参考文献
- [icu4c がバージョンアップされたせいでphpが動作しなくなったときの解決策](https://qiita.com/tadamatu/items/46d1eb7ea4ed32200b1f) ← これで対処できた
- [OSXでローカルのPHPが実行できなくなった際のメモ](https://www.tohuandkonsome.site/entry/2021/05/21/173612)
【Laravel】timestamps()とtimestamp()の違い

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## timestamps()
```created_at```および```updated_at```TIMESTAMPカラムを作成。

```php
$table->timestamps();
```

## timestamp()
```created_at```および```updated_at```**以外**のカラム名でTIMESTAMPカラムを作成したいとき使える。

```php
$table->timestamp('expired_at');
```

## よくありそうなミス
この2つの違いを知らずに、下記のようにしていてmigrationできなかったので教訓にしたい。

```php
$table->timestamps('expired_at');
```
Amazon ECR VPC エンドポイントに関する考慮事項

[AWS FargateではVPC Endpointを使う](https://qiita.com/ldr/items/7c8bc08baca1945fdb50)で作成したECR VPCエンドポイントを使用する際の考慮する点があります。

作成したECR VPCエンドポイントに対してdev,stg,prodと論理的に分離させたサブネットを定義しよう（できる）と思っていましたが、実際にはそのような使い方はできません。

[ENIをどのNWで作成](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpce-interface.html)したかを表示してるだけであり、定義可能なサブネットがリストされるといった期待は裏切られます。
>インターフェイスエンドポイントを使用するVPC内のサブネットを選択します。このサブネットでエンドポイントネットワークインターフェイスを作成します。エンドポイントネットワークインターフェイスには、サブネットのIPアドレス範囲からプライベートIPアドレスが割り当てられます。

![スクリーンショット 2022-04-04 19.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/dbf04027-672c-7d2c-15fc-b9e604b41f5c.png)
CapslockキーとCtrlキーの入れ替え PowewToysで上手くいかない場合(Windwos7~11)

CapslockキーとCtrlキーを入れ替える時、PowewToysだと上手くいかない。
古いノートPCやサードパーティ製のキーボードだとCtrlが押しっぱなしの状態で保存されてしまう。

ほかのツールがあったのでそれを使ったら一発で問題解決。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033228/cbeda2ce-bb43-c474-1187-4ce75301ef69.png)

窓の杜で<a href=''https://forest.watch.impress.co.jp/library/img/review/10027/html/changekey.png.html>ダウンロード</a>できる『ChangeKey』というフリーソフト。

はっきりいってこっちのほうが使いやすい。ソフトも軽量だし設定が保存できたり便利。
PowewToysは他の設定ができるので一概に否定はできないが、キーバインドの入れ替えだけなら
こちらのほうが便利。
文字列検索アルゴリズムについて

パソコンでWindowsの方は、Ctrl+Fで検索したい文字列を検索することができるとおもいます。
このような文字列検索は、どんなアルゴリズムが使われて、どのように行われているのでしょうか？
今回はそれを見ていこうとおもいます。

## 力まかせのアルゴリズム
一番シンプルな方法です。
テキストを一番左から照合していき、一致しなかったらパターン(検索したい文字列)を右へずらしていって、テキストからはみ出るまで繰り返していくアルゴリズムです。
イメージしやすいように下の画像をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/abd2c95d-36a2-351a-e311-a61a81b8d292.png)
【参照】
https://engineeringnote.hateblo.jp/entry/python/algorithm-and-data-structures/brute_force_algorithm より引用

単純でわかりやすいアルゴリズムですが、これだと計算量が増えてしまうんです。もしこれが、何百という文字列で、最後のほうに一致する文字列があったら、効率悪いですよね。
それにこのアルゴリズムは照合する場所がイチイチ先頭に戻ってしまうので、その点も非効率であると言えます。
最悪計算量は、O(MN)になるんです。
実際にはこれほどの計算量になることは少ないので、O(N)に落ち着くようですけどね。

この力まかせのアルゴリズムを改良したものがKMP法というアルゴリズムです。

## KMP法
結論からいうと、テキストとパターンで重なっている部分を効率よく見つけ出し、 
照合を再開する位置を求め、パターンの移動をなるべく大きくするアルゴリズムです。

実際に例を見た方が早いとおもいますので、以下の画像をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/4d5f75be-eab2-e2a7-1908-30a52ac8549c.png)

上が文字列で、下がパターンです。
ここでよく見てみると、パターンの```AB```と文字列の二番目の```AB```が一致していることが分かります。
画像で表すと以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/dc6af9b1-e60d-404e-a528-e053af825787.png)

つまり、2つ目のABから照合を始めれば、```CABD```が一致しているかどうかを調べればいいので、
力まかせのアルゴリズムより効率がいいですね。
しかし、実際にはどれだけパターンをずらしているか、というずらしテーブルを作成しなければならないので、ときには力まかせのアルゴリズムの方が効率がいい場合があります。

## ボイヤー・ムーア法
このアルゴリズムの特徴は、文字列の末尾から参照するという部分です。
以下の画像のようにしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/f43cb868-11de-e5ed-d56b-ad6cef8a6d46.png)
https://atmarkit.itmedia.co.jp/ait/articles/0902/04/news144_3.html より引用
このように検索ワードの末尾と、検索ワードが一致しなかった場合、検索ワードの先頭から文字数分だけ移動します。
上記の画像でいえば、先頭のaからみて5文字分移動するような感じです。

移動すると今度は以下の画像のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/4561e2a1-45a1-e5ac-8c1a-068f3115c59a.png)
https://atmarkit.itmedia.co.jp/ait/articles/0902/04/news144_3.html より引用

今回も末尾同士は一致してはいませんが、ここで注意が必要です。文字列の末尾の文字が、検索ワードの中に入ってる場合は、それと文字列の末尾を一致させるようにしなくてはなりません。
一致しているのに見逃してしまう可能性があるからです。

このように文字列を見ていくアルゴリズムをボイヤー・ムーア法といいます。
このアルゴリズムが今回紹介したアルゴリズムの中で一番計算量が少ないようです。

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。


【参考記事】

https://www.amazon.co.jp/%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E9%88%B4%E6%9C%A8-%E6%B5%A9%E4%B8%80/dp/4798145289

https://qiita.com/kotaito/items/165bcfb2248f78cd4dae

https://algoful.com/Archive/Algorithm/BMSearch

https://www.infotech-s.co.jp/pdf/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0.pdf
React v18の変更内容まとめ

# 20220401_React v18に関する理解

1. **Automatic Batching**

```jsx
// Before: Reactのイベントがbatchされた時のみ
// それぞれのstateのupdateごとに1回ずつ、合計2回render（描写）する。
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
}, 1000);

// After: setTimeoutの中でのupdateをまとめて行う
// 最終的には1回のみre-renderする。
// これがbatch。
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
}, 1000);
```

2. **Urgent updates, Transition updates**
    - Urgent updates: 画面内における「タイピング」「クリック」「キーボード押下」など、すぐにresponseが欲しいupdate。
    - Transition updates: 画面遷移の際に初めてupdateを行う場合。

例示として、ドロップダウン型のfilterを選択した時、クリックした瞬間にfilter buttonが即時応答してくれることが望ましい。けれど、実際の結果は別々に遷移する。もし結果が描写される前にfilterを変更したら、最新の結果だけを気にできるような状態にするということである。

```jsx
import {startTransition} from 'react';

// Urgent update: 何がtypeされたかを表示
setInputValue(input);

// 遷移として中身のstateのupdateを管理
startTransition(() => {
  // 結果表示
  setSearchQuery(input);
});
```

3. **Suspence**

```jsx
<Suspense fallback={<Spinner />}>
  <Comments />
</Suspense>
```

画面描写がまだ準備できていない時に表示する「ローディング時」のstate。

4. **New Client and Server Rendering APIs**
    
    4.1 React DOM Client
    
    【新規API】
    
    - `createRoot`: `ReactDOM.render` の代替。
    - `hydrateRoot`: `ReactDOM.hydrate` の代替。`ReactDOMServer` によってHTMLコンテンツがrenderされたcontainerを、Clientでも再利用するために使用。
    - 上記2つのAPIとも、`onRecoverableError` という新しいoptionが追加。これは、Reactが何かしらのerrorから回復したことを知りたい際に使用するoption。
    
    4.2 React DOM Server
    
    【新規API】
    
    - `renderToPipeableStream`: Node環境でのストリーミングのため。
    - `renderToReadableStram`: DenoやCloudflareなど、最新のedge実行環境向け。
    - `renderToString`は、後に廃止予定。

5. **New Strict Mode Behaviors**

New Strict Modeでは、componentが最初にmountされ、次のmount時に前のstateに復元した時に、自動的にunmountを行い、各componentを再度mountする。

6. **New Hooks**
- `useId`: clientとserver双方に、ユニークなIDを生成する。ユニークなIDが必要なアクセシビリティAPIに対して、有益となる。
- `useTransition`, `startTransition`: 即時ではないstateのupdateに使用。
- `useDeferredValue`: treeの不要な箇所の再レンダリングを延長することができる。
- `useSyncExternalStore`: storeへの更新を強制的に同期することで、外部のstoreが同時に読み込みができるようにする。
- `useInsertionEffect`: CSS-in-JSが、render時にstyleを挿入する際のパフォーマンスに対応するためのhook。

## Reference
- [React v18.0](https://reactjs.org/blog/2022/03/29/react-v18.html)
Internet Explorer サポート 終了後のRD Web アクセス について


# 概要 #

 RD Web アクセスを使用する際には Internet Explorer にてアクセスをするという利用方法が多いかと思います。


しかしながら下記にありますように 2022 年 6 月 15 日をもって Internet Explorer のサポートが終了するため継続して Internet Explorer を使用するという選択肢は実質的になくなります。

[ Internet Explorer 11 デスクトップ アプリケーションのサポート終了 ? 発表に関連する FAQ のアップデート - Windows Blog for Japan
](https://blogs.windows.com/japan/2022/02/21/internet-explorer-11-desktop-app-retirement-faq/)

Active X のアドオンが有効になっていれば資格情報を入力してもらい開きたいアプリを選択すればいいだけなのでお手がる簡単ですから
 RD Web アクセスだけは Internet Explorer を使用してもらっているなんてことはありがちなことかと思います。

Chrome や Edgeでも RD Web アクセス自体は使えますが都度 RDP ファイルがダウンロードされる動作となるためエンドユーザーには使い勝手がよくないので対処方法について記します。

# 対処方法 #

Microsoft Edge の Internet Explorer モードを使用することで Internet Explorer で使用していた時と同様の操作で使用することが可能です。


## ポリシーで起用する場合 ##

下記を参照いただければ構成できると思います。

[ IE モード ポリシーの構成 | Microsoft Docs
](https://docs.microsoft.com/ja-jp/deployedge/edge-ie-mode-policies)


ざっくり 3 つの手順の実施で構成できると思います。

1. ADMX 追加

    Microsoft Edge のポリシーの追加が必要なので

    [ Windows 用に Microsoft Edge を構成する | Microsoft Docs
    ](https://docs.microsoft.com/ja-jp/deployedge/configure-microsoft-edge)
    
    を参考にして管理用テンプレートを追加します。
    まあこの辺りはMicrosoft 以外のWebサイトをみたほうがわかりやすいかもしれません。

1. エンタープライズ モード サイト リストを作成

    公開文章のリンク先より下記のほうがわかりやすいですし、アプリをいれなくても作成できるので楽だと思います。

    [ Microsoft Edge 組み込みのサイト リスト マネージャーについて | Japan Developer Support Internet Team Blog
](https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/edge-ie-mode-site-list-manager/)

1. ポリシーを構成する
    
    いくつか組み合わせありますが下記の組み合わせでよいかと思います。
    
    (1) [コンピューターの構成] または[ユーザーの構成]> [管理用テンプレート] > [Microsoft Edge] > [Internet Explorer 統合を構成する] 
    を有効に設定します。

    (2) [コンピューターの構成] または[ユーザーの構成] > [管理用テンプレート] > [Microsoft Edge] > [エンタープライズ モード サイト リストを構成する] にて 2 で作成した XML ファイルを指定

    コンピュータの構成かユーザーの構成の選択は運用方針次第です。
    今回の趣旨からするとコンピューターの構成でやってしまったほうがいいかなという気はします。

    ちなみに(2)は同じ階層に [エンタープライズ モード クラウド サイト リストを構成する]というポリシーがありますがこちらで XML ファイルを指定しても反映されませんのでご注意ください。
    (名前でソートかけるとこちらが上位にくるので間違えやすいですとハマった経験からのアドバイスです･･･)
![P1_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1833876/5971372c-6b3f-a621-44ec-0435a7c14c63.png)

    
## 1台ずつ GUI 操作で設定をする場合 ##
実際上こんなことはしないと思いますが動作確認するぐらいになら使えるかと思うので一応記載しときます。


1. Microsoft Edge の設定画面を開きます。

1. [既定のブラウザ]をクリックします。
※ Windows 11 の場合 左上の横線3本をクリックすると項目が表示される場合があります。
また本項目が表示されていない場合はMicrosoft Edge のバージョンが低い状態である可能性があります。

1.  [ Internet Explorer モード でサイトの再読み込みを許可]を[許可]に変更します。

1. [再起動]をクリックします。

1.  Microsoft Edge で Web ポータルを開きます。

1. 画面右上の…をクリックし、[ Internet Explorer モードで再読み込みする]をクリックします。

1. [このページは Internet Explorer モードで開かれています]画面が表示されましたら[完了]をクリックします。

あとの画面遷移は Internet Explorer で開いた場合と一緒です。

## Google Chrome で対処したい場合 ##

IE Tab を使用すれば 1台ずつ GUI 操作で設定をする場合 相当のことはできます。

[ IE Tab - Chrome ウェブストア
](https://chrome.google.com/webstore/detail/ie-tab/hehijbfgiekmjfkfjpbkbammjbdenadd?hl=ja
)

もしくは下記の LBS を設定し特定ページを Microsoft Edge で開かせるという対処になるかと思いますが私自身は未検証です。

[ Windows 向けの統合 LBS を設定する - Chrome Enterprise and Education ヘルプ
](https://support.google.com/chrome/a/answer/9270076?hl=ja&ref_topic=9270153
)