OmniAICreator/Qiita-1.07M huggingface dataset:
文字コードとは何か？

# 文字コードって？

コンピュータ上で、文字の情報を記録する方法には複数ある。

「手書き」と「キーボード入力」といった意味ではなく、キーボードでExcelなりWebサイトなりに文字を入力したときにそれを記録する方法が複数あるのだ。

xlsxファイルのような作るのはExcel・開くのもExcelと決まっているファイルでは、文字コードはある1種類に決められており意識する事はない。

しかし、txtファイルなどでは、ファイル自体にはどの文字コードなのかの情報が含まれていない。例えば、作ったときに「UTF-8」という文字コードを選び、開くときに「Shift_JIS」を選ぶと「文字化け」が起きる。

# 文字コードは2つの部分からなる

コンピュータで文字を扱うには次の２つを決めなければならない。それが文字コード：

- ①取り扱う文字を決め、文字にコードポイントという番号を割り振る（文字集合）
- ②コードポイントの列をコンピュータの基本単位であるバイトで表現する方法を決める（符号化方式）

大体の文字コードの規格では①②がセットになっていて、混同されだが、本当は違うもの。

# Unicode（UTF-8、UTF-32、UTF-16、UTF-8 with BOMなど）

Unicodeは世界のあらゆる文字を扱える世界共通の文字コードを作ろうという一大プロジェクト。

Unicodeが定める文字集合は2019年5月7日現在で13万7929文字を収録しコードポイントを割り振っている。将来、最大111万4112文字まで収録できるよう、番号を確保している。つまり、コードポイントは0 ～ 1114111の範囲の数値になる。

1バイトは0〜255の数値しか表せないので、Unicodeの符号化方式は複数のバイトを組み合わせるものにならざるを得ない。Unicodeでは複数の符号化方式を定めている：

- UTF-8: 従来の文字コード（ASCII）と互換性があるなどイケているので今の主流
- UTF-32: 全ての文字を一律4バイトで表す。プログラム的に扱いやすいが、データ量が従来の文字コードより大きくなってしまうのが欠点
- UTF-16: 全ての文字を一律2バイトで表す。Unicodeの収録文字数が少ない頃に2バイト（256×256=65536文字扱える）で十分だろうと思って作った。十分なわけがなかった
- 他にも符号化方式が定義されている。UTF-32、UTF-16にも変種がある

また、「UTF-8 with BOM」は符号化方式ではないが、世間では便宜上符号化方式の１つとして扱っている。UTF-8で符号化したバイト列の先頭に、通常は無視される特殊な3バイト（BOM）を追加する。プログラムはこの先頭3バイトがあれば、そのデータがUnicode文字集合＆UTF-8で符号化されていると推定できる。この「UTF-8で符号化して先頭3バイトをつけるやつ」を「UTF-8 with BOM」と呼ぶ。しかし、プログラムによっては「全体はUTF-8なのに、先頭に変な3バイトが入ってる」としか認識しないものもあるので困ったものだ。

なお、世間では「このテキストファイルはUnicodeだ」のように言う人がいる。言葉のマナーをどうこういう気はないのだが、実際問題、Unicodeには符号化方式が複数あるので「Unicode」だけだと、UTF-8、UTF-32、UTF-16 etc... を区別できないことがある。しかし、世間で流通しているファイルはUTF-8が圧倒的多数なので、彼の人は「Unicode=UTF-8」の意味で使っていることが多いだろう。

## 絵文字

Unicodeの文字集合には「🌝」「🐕️」などの絵文字も収録されている。アルファベットや漢字は画面上で黒く表示され、絵文字はカラフルに表示されるが、それは表示する側のソフトウェアが気を利かせているだけで、UTF-8などでエンコードするときはほぼ同じように扱われる。

Shift_JISなどの旧来の文字コードには絵文字が収録されておらず、絵文字はUnicodeの売りの一つだった。

# ASCII

ASCIIは英語用の文字コード。文字集合はアルファベットと記号のみ。

しかし、ほとんどの文字コードはASCIIに別の文字（漢字など）を追加する形で作っているので、ASCIIに収録されている文字はどこでも問題なく使えるはず。

ASCIIにヨーロッパ各国の文字（ÅとかÆとか）を加えた文字コードがある。

ASCIIでは全ての文字が1文字＝1バイトで符号化されるので分かりやすい。しかし、そのせいで「欧米人がこの世の全ての文字は1バイトだと思ってプログラムを書き、他の文字コードを扱ったときにバグる」といったことがしばしばあった（今もある？）。

# EUC-JP

EUC-JPは日本語用の文字コード。

文字集合はUnicodeより小さい。

符号化方式は、ASCIIの範囲の文字はASCIIと同様1バイト、漢字などの追加の文字は2バイトで符号化する。

昔のUnixやLinuxでよく使われた。

# Shift_JIS

Shift_JISは日本語用の文字コード。EUC-JP同様、文字集合はUnicodeより小さく、符号化方式も、ASCIIの範囲の文字は1バイト、漢字などの追加の文字は2バイトで符号化する。

WindowsやMicrosoft Excelで使われている。

Shift_JISは２つの意味でプログラマーの頭痛の種。

1つは、1文字＝1バイトだと思い込んで書いたプログラムが、Shift_JISのデータで特に重大バグを起こすこと。

もう1つは、Shift_JISは規格として定まっているのだが、Windows業界ではShift_JISに独自の文字を文字集合に追加したものを「Shift_JIS」と称していること。そのため、Windows方面から渡ってきた「Shift_JISのファイル」を馬鹿正直にShift_JISとして取り扱うと「文字集合に含まれない謎のコードポイントがある」ことになってしまう。「本来のShift_JISではなくWindowsでいうところのShift_JISである」と明示したいときは「Windows-31J」または「cp932」と呼ぶべきである。

# 文字コードとOSの関係

本来、文字コードとOS（Windows、Mac、Android、iOS）は無関係だ。

どのOSであっても、Shift_JISのファイルを読み込むプログラムを作ることができる。他の文字コードのプログラムも作ることができる。

しかし、OSと文字コードに全く対応関係が無いわけではない。

例えばOSはファイルの名前を特定の文字コードで処理しているので、その文字コードの文字集合に含まれない文字はファイル名に使えない。

また、OSに標準で付属するプログラム（『メモ帳』など）が特定の文字コードしか扱えないことがある。そのため、あるOSの標準プログラム（文字コードA固定）で作ったファイルを別のOSの標準プログラム（文字コードB固定）で開こうとすると文字化けする。
Bicepを使ってAzureDevOpsのパイプラインからリソースをデプロイしたメモ

## 概要
[前回](https://qiita.com/hibohiboo/items/58678d4dd1efb05ebe2b)は、Bicepを使ってのリソース構築を行った。
今回は、AzureDevOpsのパイプラインからのデプロイを行う。

## ファイル構成
毎回動く必要はないので、`infrastructure`フォルダ以下のファイルに変更があったときのみ動作するトリガー設定をした。

```
- azure-dev-ops
  - app-deploy-pipelines.yaml
  - iac-pipelines.yaml
- infrastructure
  - bin
    - create.bash
  - biceps
    - resourceGrop.bicep
    - staticWebApp.bicep
```

## パイプライン

```yaml:azure-dev-ops/iac-pipelines.yaml
trigger:
  branches:
    include:
      - main
  paths:
    include:
      - infrastructure/*
      - azure-dev-ops/iac-pipelines.yaml
pool:
  vmImage: ubuntu-latest
steps:
- task: AzureCLI@2
  inputs:
    azureSubscription: 'azure-dev-hobby'
    scriptType: 'bash'
    scriptLocation: 'scriptPath'
    scriptPath : 'infrastructure/bin/create.bash'
```

## azureSubscription の設定
[Create an Azure Resource Manager service connection that uses workload identity federation](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/library/connect-to-azure?view=azure-devops#create-an-azure-resource-manager-service-connection-using-workload-identity-federation)


1. Azure DevOps のプロジェクトに移動
2. 左側のメニューから "Project settings" を選択
3. "Service connections" を選択
4. "New service connection" をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/510202fb-8e65-473e-60b1-d3688d435477.png)

Azure Resource Managerの設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/3a580c67-19ee-1ad3-9df6-95049c82db39.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/8f2d3859-962c-7ca8-9520-ac03f22ea68f.png)

Service connectin nameに`azure-dev-hobby`を設定。
(パイプラインに記載した`azureSubscription: 'azure-dev-hobby'`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9246ebfc-ebba-1fb7-2003-64087c0501ca.png)

これで追加は完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/345410a8-3c10-ba8f-b5db-3c15fa9b9ab0.png)

## パイプラインを作成して実行

[前々回と同様](https://qiita.com/hibohiboo/items/5a5bd1fae07fd4a0dd61#%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A)、既存のリポジトリに含まれるファイルをパイプラインに設定する。(`azure-dev-ops/iac-pipelines.yaml`)

このとき、初回実行では許可を求められるので許可する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b15d0cdf-7d89-c488-0dc4-1f4cec0c1314.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/aa90a973-ac4d-6959-45f1-0defe19d9206.png)

これで、デプロイできた。

[デプロイしたアプリ](https://gentle-smoke-0024c9c00.5.azurestaticapps.net/app/)
誰かのPayPalのアカウントを乗っ取れる状態になって半年過ぎた話

## 始まりは登録した覚えのないPayPalからメールが届いたこと
![スクリーンショット 2024-04-03 13.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642056/cf4a8c72-f437-e906-e758-b22448e7d1d3.png)
## 日課のInformation Security Policy チェックを行う
私に誤って届いたメール等は毎回、状況に応じて情報セキュリティのチェックを行います。
今回はPayPalのサイトにてログインを試行しました。
アカウントが乗っ取れる状態かどうかを確認するだけで乗っ取ることはありません。
チェック方法は単純です。ログイン画面を開き、パスワードリセットができるかを試します。
![スクリーンショット 2024-04-03 12.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642056/d92fd977-2bb8-b47a-73fc-5a7ed2839ffb.png)
![スクリーンショット 2024-04-03 12.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642056/b0164d9a-d123-60b0-c939-7f55808f876a.png)
![スクリーンショット 2024-04-03 12.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642056/d46251f0-a3bc-7495-4f41-564a875952f7.png)

リセットコードが私のメールアドレスに届いています。
![スクリーンショット 2024-04-03 12.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642056/6162e0da-a69e-babf-4793-12e3ac063445.png)

これ以上試すと本当に乗っ取れるため確認はここまで。
この先の操作過程ではじかれる可能性がないとはいえませんが、リセットコードをverifyしていないメールアドレスに送ることはやめるべきだと思います。

## Information Security Policy の提言
### Verifyしていないメールアドレスにメールを送信しないようにする
verifyしていないメールアドレスにリセットコードを送信するのは一番避けてほしいことですが、
それ以前に、
冒頭で述べたように、登録した覚えのないPayPalからのお知らせメールがきっかけで、私のメールアドレスが誤って登録されていることに気づきました。
しかし、遡ってみても、アドレスのVerifyメールは届いていません。

したがって、ユーザーにVerifyされていないアドレスにはメールを送信しないことをお勧めします。
Ubuntu 22.04にKubernetes 1.29.3をdockerを使わずに導入しようとして凄く苦労した話

## 前提
以下の条件の組み合わせで使用する場合のトラブルに対するTIPS。

- Kubernetes 1.29.0以降
- containerd
- Ubuntu 22.04　（cgroup driverがsystemdのディストロは同様にハマるはず）

具体的な症状としては、必要なpod（例えばkube-apiserver）が起動しないため、`nc 127.0.0.1 6443 -v`などを実行すると`Connection refused`と表示される。

ちなみに、containerdの代わりにDockerを使ってKubernetesクラスタを構築する場合、cgroup driverの自動識別がされるため、気にしなくていいらしい[\[1\]](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AEkubelet%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8Bcgroup%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A:~:text=%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AEkubelet%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8Bcgroup%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A,-Docker%E3%82%92%E4%BD%BF%E7%94%A8)。

## 結論
containerdの事前設定が必要。
具体的には以下のコマンドを実行する必要がある。

```bash
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
```

その後kubeletを再起動すれば良い。

```
systemctl daemon-reload
systemctl restart kubelet
```

## まとめ
Kubernetesクラスタを構築すために初めて自分でkubeadmでKubernetesクラスタを構築しようとした。
古いドキュメントや参考文献をもとにクラスタの構築をしようとしたが、これが間違えだった。
Kubernetesはバージョンごとに導入・更新の注意点があるのできちんと最新版のドキュメントの注意事項を読みつつ、導入をすべきだった。
AWS エンジニアがよく使うバージョンの管理と命名規則〜CodeCatalystっていいよね


## CodeCatalyst を使ってバージョンの管理とリリース管理しよう

バージョンの番号を作り、　命名規則なんかを考えるようになったら。
開発のDevチームと　リリースする運用Opeチームで話し合うべきは、「次のリリース何入れよっか？」

リリースされてCode N 兄弟と呼ばれた時代からはや10年くらいですよ。
このCodeCataystばかりはちょっと異色ではあるけど、　アプリケーションをリリースしながら、ソースの管理をCICD的に継続リリースできる。　昨年のFurugalアーキテクチャの中に　繰り返し継続できる仕組みをコストとして考えようなんてKeynoteもありました。



#### CodeDeployしてますか！？
### Code Commit してますか！？

どちらも大事なことですが

*アーティファクトやシステムの管理する時のバージョンの付け方*
 
と

*AWSリソースの名前の付け方*って　環境や面数、仕組みとしてはとても面倒ですよね。

そんなみんなに共有したいのが、俺流でとても便利な命名規則です

## バージョンの付け方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/24099b53-a928-4501-7e28-38caa132e710.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/6ce3de09-b930-cdac-0f92-cb16aa8c1770.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/1f909378-6207-ffcf-05d9-a6a8c42b2429.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/47a86962-5a61-c21a-dbef-fbd7c96af136.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/e4609446-d54c-e92c-d7e5-4da8315e8208.png)

## 命名規則の付け方


- 🚚 こちらは　[Cloudforamtionの記事の中に移動させました ](https://qiita.com/plustick/items/8a6c78b6aad7135e53b1#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E5%90%8D%E3%81%AFjoin%E4%BD%BF%E3%81%A3%E3%81%A6%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%9F%E5%90%8D%E7%A7%B0%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%8A%E3%81%8F%E3%82%BF%E3%82%B0%E3%81%AA%E3%82%93%E3%81%8B%E3%82%82%E4%BE%BF%E5%88%A9)


## 　次のアプリケーションリリースする時は「どんな機能を盛り込もうか計画してからコーディングする」

個人でもお仕事でも、　次にアプリケーションをリリースする時には「どんな機能を盛り込もうか計画してからコーディングする」
これが大事。
Gitでブランチ戦略やタグづけをする。
その次にリリースノートを書くなんてやっていたりすると思います。　

ただ、AWS re:invent 2023 Keynote では「非機能要件には　コストを念頭に入れましょう」という熱いメッセージがあるのです。

そこでタイトルにもあるCodeCatalyst！　このページを見てください。　そう、チケットの管理がCatalystには統合されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/9eeb9b2d-690d-5bfb-9cdb-dfe31fcfcdcb.png)

いままで　

 📂CodeCommitでコードを管理し　＞
 ⚙️ CodePiplineを　🔨CodeBuild　と　🚗CodeDeploy　を組みあわせてリリースする。

 せめてあるのは　Commit上のRELEASENOTE.ｍｄ　のみ。　リリースノートを管理するには　個別にチケットや看板を管理するミドルウェアが必要だったのです。　それを解決してくれるのが　このCodeCatalyst

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/78be5b15-e492-7cfd-5886-cf930a0c46af.png)
 
Workshopにもチュートリアルがあるように、　コードとCICD管理に加えての　「リリースを計画できるようになった」
この仕組み使っていかないてはないと思いますよ。

（本日はご紹介までに！　使ってるところ別記事にしよ❤️）

## 参考：　CodeCatalyst は　IaCとDevOps の夢のような仕組み
https://aws.amazon.com/jp/codecatalyst/
https://docs.aws.amazon.com/ja_jp/codecatalyst/latest/userguide/welcome.html
https://codecatalyst.aws/explore
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-CodeCatalyst-Overview_1031_v1.pdf
IAM をならゆんさー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f8ae3893-acda-7da1-cfed-4ce234ffee46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/4a78bfa6-3295-bb39-14db-03a791f45bc7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/c201519f-d5ca-7013-0d0a-48edcc2974ad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/26a75bfd-3b57-85c7-2552-451b85a9165d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/313f2baa-b757-6660-4e08-c33e7979bc68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/d644b38a-1863-237e-9994-5d64d589f647.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f76fd3ea-3c06-d556-3cfc-f1272c66f6a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/2a0e15dd-7671-db70-1f8e-d4ef9fe62955.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/088039b2-2712-d480-1371-bd9cd05e45ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/1e272bc2-d290-bd15-89cf-1f4139b67efe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/e1cb4b14-8a12-c46c-5db4-d690bebc0060.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/dd811c37-4ed0-1e73-030e-d61e1873a1ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f64ba457-3f87-2e56-0878-4e757d871a96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/aca16790-9350-890e-01ff-b06cb4fd216c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/7d187030-19f5-2ee1-c9e6-c0625e956435.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/bc3c326f-badc-19c0-d1e4-4ba07b23a7c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/9b67698f-71bd-1736-c6e6-9264c0199901.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/be0e174a-1287-182e-b4a4-37f1aab9cf45.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/301b3c7c-280a-27e4-54e7-e3d5b4e5dc70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/cdaf01b2-645e-0824-716d-e60a2d859db9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/1b40e581-72e3-9cec-4ae2-b28400b93ec2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/80a42cbb-708f-7d87-d3f7-8bca6154d17d.png)

### まとめ
APIGateway のバーストの仕組みを学び　〜やらかしてから相談れれても手遅れDeath💀〜

APIGatewayを使う時、気にしないといけないこと。

入り口の制限数と、　バースト制御された場合の　処理数の限界値。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/6d6027a8-72fb-4acd-4c22-a7e65d2fdb4d.png)



またタイムアウトすることなどを考慮する。

これを知らないと大変なことになる。
どんな大変なことがあったかってのをこの記事に書いてみよう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f6c5acf4-37c7-24b2-b5c2-11955225e5a5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/1316279d-4d4f-6077-57f1-8a9f8a2b13ec.png)

きっと友人は　ちびまる子ちゃんを見ている日の夕方にも会社にいたのだろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/898f669d-17d9-f40e-348a-dc9c87a6c24c.png)

そして放たれた「一言の絶望感」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/0cb5a276-7aa7-ebd1-314c-d489b2a7f399.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/ccbdeda2-f5aa-6a36-8fa1-fae271411ead.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/2473bafd-849f-65d0-3670-2a1b634e9c0b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f7babb80-7e40-2e86-a5f5-0a3a1ab6f0ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/f1a93f9b-b674-d612-537c-56888c95fb23.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/3de8fe0b-6de6-7dcd-4751-891d56840b17.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/8c4af4cc-0c4f-b603-adf9-aa723819aee6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/975e07fd-643d-9851-f714-fae29f0e5300.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/29434473-79a9-b1aa-e9f1-03d78f9abf64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/b395cfc3-fbb9-62da-8a64-55c780c3fca0.png)
俺流：　AWSの構成図見て欲しい＆　書いた時に聞く問答集：

# プロンプトエンジニア　と　ググり方　に通じること。
LLMにはじまり、Qが昨年公開され　コンソール上でちょこちょこ使うようになり便利だなと思う反面、
上手い質問を投げて欲しい情報を得ることって「ググり方」の調べ方に並んで必要だなと思うこの頃です。

AWSでアーキテクチャをレビューしてと言われる時によく思うことを伝えたいと思った矢先、
プロンプトエンジニア　という、「うまく質問して、欲しい情報を得る」ノウハウを持つエンジニアのことをこう呼びますも大事だなと思いながらおそらく、皆がソースコードや設計ドキュメントをレビューする事前の準備も定義してあげると効率が上がるんじゃないかと思って情報共有させてください。

### 「全部見て」よりも「どこを特に見て欲しいかかいつまんで欲しい」と思ったり「言われないまま見た方がいい」
アプリでもインフラでも言えること含めて　
こういうのを書いておいて事前　チェックみたいなの前例にして欲しいなと思ったものです。

AWSで仕事で入るなら必ずビジネスプラン以上は入っておくことをお勧めするのですが「自分たちの工数考えたら調査します！よりもプランに入って　〜かもしれない　を頑張るよりも　QAを投げることのほう」が効率が良く感じます。
合わせて、　AWSでも　質問ヘルプの回答を欲しい情報として得るためのTipsが掲載されています。

　参考：　https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/

## まずわからないながらに頑張った君たちへ、こんなことチェックしてみよう

### 今回クラウドを使うという要件や戦略は　どんなストーリーで説明を持っていこうとしていますか
　　- → クラウドにするとおしゃれだから。客がなにもいわずにクラウドだからは何か意図を作らないと破綻しやすいため。

### ソースレビュー、ドキュメントレビューと同じ観点で見ていきます。　
　　- → 何を見てほしい。ゴールと要件を満たすための情報がありますか。誤字脱字レベル以外で　指摘すべきポイントはどこを見てほしいでしょうか。

### 本件で本当にやるべきことは何ですか　
- →　RFPや　お客様要件によるリソースの使い分けを検討します。

### 何に重点を置いて設計をしますか　
- →　セキュリティ、価格、パフォーマンス、復旧時間などの非機能は選択方法が様々になるので、目的によって検討観点を変えます。



### ほんとに見てほしいところは何ですか。　
- →　ドキュメントレビューと同じで、全体見る前に　聞きたいポイントをまず確認してご提案する。

### いきなりこの構成図でいいか？　
- →　目的を聞いてからいいか判断します。

### この構成図の中で、やりたいことは何ですか。　
- →　そのうえで　部分的にフォーカスして実装や利用理想すのベストを提案します。

### 全体的にみて　
- →　セキュア、ログ・監視、運用、ロール管理、アプリケーションなどの実装ロジック実現、　非同期・同期、　サーバレス分離　などを　それぞれ見ていきますが、すべてを網羅できなくなるので　目的ごとに聞きながら確認します。

### ベストプラクティスを教えてください　
- →　やりたいことは何ですか。　と　注意してみてほしいところでのその構成はどこに書きましたか　。　（様々なリソースを組み合わせるときに目的のやりたいことと比べて検討します）

### よくわからないからこれにしてみたはありますか　
- →　よくある　LambdaにするかEC2にするかContainerにするか　（EKS,ECS,Fargate, 自前onEC2）、どれにするかで「めんどくさいので」「よくわからないので」　Lambdaにしました　みたいなやつ。

### 今回の案件は　リフトシフトなどではないでしょうか
- →　７Rの柱という考え方があるので、そちらをベースに相談していきます。
　　（いきなり、移行やサーバレス化。リファクタリングをやろうとすると難易度が上がります）

### ＳＬＡやコストや　クラウドにすることで変な価格が下がり升みたいな話にしていませんか
- →　目的と使い方で安くもメリットも感じないになるため。
---
## まとめ：
AWSで、DOP/SAPを最初に取ることになり　あとからPractionar の問題を読むことになったのですが　Pracの問題はとても大事なことがたくさん書いてある。（実は、最初は　入門低レベル試験だと軽視していた：すみません）

AWSがいう「責任共有モデル」にはじまり、さまざまなことを学ぶと「AWS リソースの機能以上に」　システムを設計することって大事だな。視点が変わるなと思ったことがあります。

・リフト・シフトする　
・ウェルアーキ
・取り急ぎ　システム構成図、見積もり妥当性、設計の妥当性　

ここ最近のAWSからのメッセージは、エンジニアおじさんにはとても刺さることが多いんです。皆も一つの参考になればと思います。　

2022年　re:inventでは　Kubernetes 部門のVPからの「たくさんのリソースが出て、技術者が追いつけないのは。焦る必要はなく。必要になった時にエンジニア皆が」

　　　　- 　　「選択肢」を提供する。

2023年 夏には re:inforce でセキュリティ部門VPからのメッセージ　「どの部門にもどのチームにも　IT問わず、セキュリティを舞台を立てること」

  - 「ガーディアンズ」を作ろう。

2023年 re:invent では、CTOが　Keynoteではなしていた、「コスト」を　非機能にいれて設計と運用を検討することがとても大事だ」という話。　

  - 「フリューガルアーキテクト　と　７つのBizDevOps的な思想」

フルスタックを目指す皆で、フルスタックな世の中にしませんか。
Moodle 4.3 を日本語化する【2024年4月最新版】

## はじめに

Moodle 4.3 で日本語を使えるようにします

参考: 以前のバージョンで日本語設定をしている記事

https://qiita.com/akahide77/items/53e3740998935d92bec3

Moodle 4.3 を Docker で起動する手順

https://qiita.com/RyoWakabayashi/private/1b6abcf53cc5b97f9020

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

Moodle に管理者権限でログインします

上部 Site administration タブを開いてください

![スクリーンショット 2024-04-04 0.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6359be21-c104-0a65-c1fd-6c595ac61ba3.png)

下にスクロールしていくと Language というカテゴリーの中に Language packs というリンクがあるのでクリックしてください

![スクリーンショット 2024-04-04 0.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4a4fbc5f-dfea-58df-954d-d348dc1e57b4.png)

右側の選択肢から "Japanese / 日本語 (ja)" を選択し、 "Install selected language pack(s)" をクリックします

![スクリーンショット 2024-04-04 0.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/97fc5c15-ce81-61db-20c9-44536369a6de.png)

日本語パッケージがインストールされました

:::note info
警告は出ていますが問題ありません
:::

![スクリーンショット 2024-04-04 0.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d09cbe3d-af62-eefc-c007-1c9262758c43.png)

## デフォルト言語の変更

先ほどの画面上部にある "Language" リンクをクリックします
（もしくは Site administration タブで開いた一覧から Language カテゴリーの Language settings のリンクを開きます）

Default language で "日本語(ja)" を選択します

![スクリーンショット 2024-04-04 0.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4dec85a3-db58-5bdb-e8cb-a6c3b49d227c.png)

画面最下部の "Save changes" をクリックします

![スクリーンショット 2024-04-04 0.46.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/79d608eb-89ac-3934-3dd1-55c0450458f6.png)

## 表示言語の切り替え

右上のユーザーアイコン（画像上では "AU" の文字）をクリックし、ドロップダウンを表示します

"Language" をクリックしてください

![スクリーンショット 2024-04-04 0.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c95e33ce-a8f3-9e2b-c914-626d87c16b60.png)

言語一覧から "日本語(ja)" をクリックします

![スクリーンショット 2024-04-04 0.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2a6357a3-6a3c-71c9-c2bc-b429fe536996.png)

日本語化されました

![スクリーンショット 2024-04-04 0.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6478a21d-e977-214c-a3ab-52944c5e119f.png)

## まとめ

Moodle 4.3 を日本語化できました

警告は出たものの、問題なく使えそうです
reCAPTCHAの送信ボタンにdisabledが設定できない

## はじめに

GoogleのreCAPTCHA(v3)の送信ボタンにdisabled属性を設定しても反映されない症状がありました。ドキュメントを調べても回答を見つけられなかったので、動作検証した結果でお話します。

## 症状

reCAPTCHAのドキュメントに記載されているbuttonタグにdisalbed属性を追加しても、ボタンは押せる状態になっていました。
ブラウザのディベロッパーツールでbuttonタグを確認すると、設定したはずのdisabled属性が消えていました。

``` html
<button class="g-recaptcha" 
        data-sitekey="reCAPTCHA_site_key" 
        data-callback='onSubmit' 
        data-action='submit' disabled>Submit</button>
```

## 検証

buttonタグの「class="g-recaptcha"」を削除すると、disabled属性は消されずに反映されました。

## 原因

Googleから提供されているJavascriptが「class="g-recaptcha"」のボタンに対して、何か変更を加えている可能性が高いです。
さらに挙動を見ていると、ボタンを押した一瞬だけdisabled属性が自動で設定されるようです。（ボタン連打の対策だと思います）

## 解決策

今回、buttonタグにdisabled属性を設定する仕様を諦めました。
必要な項目を入力するまで、送信ボタンを押せないようにしたかったのですが、ボタンを押した時に未入力の項目があれば、alert()でダイアログを表示する仕様に変更しました。

## おわりに

今回は未検証ですが、ドキュメントにあるgrecaptcha.execute()を使う実装にすると、送信ボタンにdisabled属性を設定できる可能性があります。
また、時間のあるときに検証してみます。

``` html
<!-- 未検証：参考まで -->
<button type="submit" onclick="onClick();" disabled>Submit</button>
<script type="text/javascript">
      function onClick(e) {
        e.preventDefault();
        grecaptcha.ready(function() {
          grecaptcha.execute('reCAPTCHA_site_key', {action: 'submit'}).then(function(token) {
              // Add your logic to submit to your backend server here.
          });
        });
      }
</script>
```
BambuLab X1Cで廃料排出口が詰まる・ベッド上にゴミが落ちる

まだ試行錯誤中ですが大体決着がついているので [結論](#結論)に飛んでください

## 背景
タイトルの通りであるが、ベッド上にフィラメント切り替え時のゴミが落ちて、エラーで止まる
1回では済まない。細かい色の切り替え時に何度も発生する。
エラー内容はこれ
<code>HMS_0C00_0300_0003_0008: Possible spaghetti defects.
廃料排出口が詰まっています、ご確認ください。</code>

https://wiki.bambulab.com/en/x1/troubleshooting/hmscode/0C00_0300_0003_0006


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/905e4b32-ef5e-6561-2228-d094e6cd852e.jpeg" width=300">

様子を見ていると排出口にゴミが張り付いている‥‥
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/83833c3c-c403-6acd-149a-a66df907eb9c.jpeg" width="300">

## いろいろググってみる
同じトラブルで困っている人は多いようだ

[Chute clogging](https://forum.bambulab.com/t/chute-clogging/58375/7)
[My X1C been pooping the bed](https://www.reddit.com/r/BambuLab/comments/154v4j2/my_x1c_been_pooping_the_bed/?rdt=36366)
[Poop occasionally in the print area?](https://forum.bambulab.com/t/poop-occasionally-in-the-print-area/9093)

## 試したこと
1．ノズルワイパーの交換（特に削れてもいなかった）

https://wiki.bambulab.com/en/x1/maintenance/replace-nozzle-wiper

2．フィラメントカッターの交換（確かに欠けてはいたが、変えても効果なし）

https://wiki.bambulab.com/en/x1/maintenance/replace-cutter

3．BambuLabのドアフラップを拡張（いろいろググってみた結果。）
これで大分改善した。

https://makerworld.com/en/models/23908#profileId-26143

4．シリコンスプレーを吹く
まだ大きいのがベッド上に乗ったりしていたので、排出口にフィラメントが張り付かないようシリコンスプレーを吹きました。

## これでもまだ駄目だった場合に試す予定のこと
フィラメントワイパーをダブルに拡張する

https://makerworld.com/en/models/63495#profileId-66448

フラップを蹴り上げるアームにブーツを履かせる（こっちが有力）

https://makerworld.com/en/models/74561#profileId-83169


## 結論
まだ試行錯誤中ですが、ドアフラップ拡張＋シリコンスプレーでほとんどこのトラブルが起きなくなりました。

## 所感
ファームウェアアップデートによってこのトラブルが起きるようになった…と言っている人もいたのが気になる。

また、以前と廃料を比べてみた。
左が以前のもので右が最近のもの…廃料の感じが全然違う。排出口にしばらくとどまってそうな見た目をしている…ファームウェアアップデートなのかそれとも何か他の原因なのか…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/15bdfbf2-3213-68a4-5b56-d6cb89be0f82.jpeg" width="300">
【Rails】バリアントの生成方法【ActiveStorage】

以下のようにすると画像のバリアントを生成できます。

```rb:app/models/user.rb
class User < ApplicationRecord
  has_one_attached :avatar do |attachable|
    attachable.variant :large, resize_to_limit: [128, 128]
    attachable.variant :medium, resize_to_limit: [64, 64]
    attachable.variant :small, resize_to_limit: [32, 32]
  end
end
```

バリアントのURLを取得するには以下のようにします。

```rb
Rails.application.routes.url_helpers.rails_representation_url(avatar.variant(:large).processed, host: "localhost", port: "3000")
```
【Python】.NET 向けの軽量DB 「LiteDB」の Python 版を調べてみた

## はじめに

C#で書かれた.NET 向けの軽量DB「LiteDB」ですが、Python版が無いかググったところ見つかったので試してみました。

どちらも同じ「LiteDB」を名乗っているため、てっきり互換性があるのかと思いきや、まったく別物でした。

とはいうものの、コンセプトは同じなので、「[Python版LiteDB公式サイト](https://litedb.readthedocs.io/en/latest/api/api_reference.html)」 を参考に、簡単なサンプルプログラムを作ってみました。

## インストール方法
pip で簡単にインストール可能です。
```
pip install litedb
```

## サンプルプログラムのソースコード
.NET版 LietDB に比べて、実装されているメソッドが少ないですが、こちらの方がより簡単に使えそうです。
```python
from litedb import DiskDatabase
from datetime import date, timedelta

# 保存対象のクラス
class Employees:
    def __init__(self, day: date, name: str, age: int):
        self.day = day
        self.name = name
        self.age = age

# EmployeesのメンバーをPrintする関数
def print_employees(empls):
    for empl in empls:
        print(f"{empl.day} {empl.name} {empl.age}")

# データベースのオープン（無ければ自動作成）
db = DiskDatabase("d:/data.db")

# データの挿入
db.insert(Employees("2024-04-23","海江田四郎",33))
db.insert(Employees("2024-04-23","芹沢大助",28))
db.insert(Employees("2024-04-23","古畑任一郎",38))
db.insert(Employees("2024-04-24","古畑任次郎",33))
db.insert(Employees("2024-04-25","古畑任三郎",28))
db.commit()

print("---DBから全件取得-----------------------")
elements = db.select(Employees)
print_employees(list(elements))

print("---条件を指定して取り出す-----------------")
empls = list(elements.retrieve(age=33,name="古畑任次郎"))
print_employees(list(empls))

print("---条件を指定して削除--------------------")
elements.delete(age=33)
db.commit() #DBに保存
print_employees(list(elements))

print("---全件削除-----------------------------")
for empl in list(elements):
    elements.delete(age = empl.age)
db.commit() #DBに保存
print_employees(list(elements))
```

## 補足説明
ファイルに保存する DiskDatabase と、インメモリで利用する MemoryDatabase の2種類が用意されています。

DiskDatabase(ファイル名) で単一ファイルが生成されるのかと思ったら、次の階層を持つフォルダが生成されました。
```
D:\DATA.DB
└─0x1c74f7e7af
    │  shard0
    │
    ├─index
    │      blacklist
    │      map
    │
    └─info
            config
            size
            table_type
            unused_indexes
```

## まとめ
ネットでググると、.NET 版「LiteDB」のDBをPython版「LiteDB」で読もうとして失敗するというQAが見つかりましたが、両者は全く異なるものなのでご注意ください。

互換性はありません。

.NET 版の LiteDB の詳しい解説は「[【詳しく解説】LiteDBで手軽にデータ保存。NoSQLはアプリと相性抜群！](https://resanaplaza.com/2024/04/03/%e3%80%90%e8%a9%b3%e3%81%97%e3%81%8f%e8%a7%a3%e8%aa%ac%e3%80%91litedb%e3%81%a7%e6%89%8b%e8%bb%bd%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e4%bf%9d%e5%ad%98%e3%80%82nosql%e3%81%af%e3%82%a2%e3%83%97%e3%83%aa/)」に詳しい記事があるので、こちらが参考になります。
チームにGitHub Copilot Businessを導入した

# はじめに
GitHub Copilot Proをセキュリティの厳しい（めんどくさい）企業で導入するまでにやったこと
私のポジション：自社ソリューションのエンジニアリーダー
やったこと：自チーム内へのGitHub Copilotの導入
やっていないこと：自社全体への展開


# GitHub Copilotとは
プログラミング支援のAIツールとしてはスタンダードなのでもはや説明は不要かと

https://docs.github.com/ja/copilot/using-github-copilot/getting-started-with-github-copilot

# 導入するに至った背景
## 世の中の流れ
2023年前半、IT企業が全社導入しだす

https://tech.smarthr.jp/entry/2023/04/05/171411

2023年後半、非IT企業への導入も進む

https://www.itmedia.co.jp/news/articles/2307/26/news116.html

## 自社の状況
会社としてのGitHub Copilotへの案内があるだろうと待っていたが、特に案内もないまま2024年に
セミナーなどで社外の人と話すと、GitHub Copilotは使っているのは当たり前レベルで話が進むことも多く
「会社として許可しない→社員自腹の野良Copilotが増える」だけだと感じた
それなら、チームとして許可して把握している範囲で利用してもらうほうが健全だろうということで

# GitHub Copilotの契約プラン
ビジネス用のGitHub Copilot for Businessを契約することに

https://aadojo.alterbooth.com/entry/2024/01/10/100000

GitHub Copilot for BusinessはOrganizationに対して紐づき、Organization 全体にわたるポリシー管理が可能
個人アカウントをOrganizationに紐づけてCopilotを割り当てる形

GitHub Copilot for Business利用のために、以下のGitHubアカウントが必要
- GitHub Organizationアカウント
- GitHub 個人アカウント（管理者）
- GitHub 個人アカウント×人数分


# 導入する上での対応
GitHubCopilotをチームで利用するために対応したこと

## 利用範囲・運用ルールの作成

https://www.jdla.org/document/

>生成AIの利用ガイドライン
>5　データ入力に際して注意すべき事項
（6）　自組織の機密情報
　自【社】内の機密情報（ノウハウ等）を生成AIに入力する行為は何らかの法令に違反するということはありませんが、生成AIの処理内容や規約の内容によっては当該機密情報が法律上保護されなくなったり特許出願ができなくなったりしてしまうリスクがありますので、入力しないでください。

「日本ディープラーニング協会」が出している生成AIの利用ガイドラインの上記記述への対応として、GitHub Copilotの利用範囲と運用ルールを設定

### 利用範囲
チームで「法律上の保護が必要であったり特許出願に関わるノウハウ（ビジネスロジック）」を定義
上記に該当するコードは生成AIであるGitHub Copilotの利用範囲外とした。

### 運用ルール
利用範囲を守るための運用ルールを設定
例：
・GitHub Copilotの利用をVSCodeの拡張機能のみで利用する
・VSCodeのデフォルトのGitHub Copilotの自動予測をOFFに設定
・GitHub Copilotを許可するworkspaceだけ


## GitHub Organazationの作成
### Organization アカウントの作成

https://docs.github.com/ja/get-started/start-your-journey/creating-an-account-on-github


### Organizationの作成
https://docs.github.com/ja/organizations/collaborating-with-groups-in-organizations/creating-a-new-organization-from-scratch

### 補足
GitHub Organazationを作成するためのアカウントはメーリングリストで作成
※Organazationを作ったGitHubアカウントにはCopilotを割り当てられなかった。管理者もCopilotを利用したかったため、別途個人アカウント(管理者)として作成

### Organizationのポリシー管理

パブリック コードに一致する提案
-ブロックを選択


## Copilotの割り当て
### 個人ごとにGitHubアカウントを作成

https://docs.github.com/ja/get-started/start-your-journey/creating-an-account-on-github

- 会社メールアドレスで作成
- アカウント名のprefixを決めておくと検索しやすくて便利

### Organizationへの招待

https://docs.github.com/ja/organizations/managing-membership-in-your-organization/inviting-users-to-join-your-organization

### Organization の特定のユーザーに対して、GitHub Copilot へのアクセスを許可

## 利用開始（各自）
### VSCode

https://docs.github.com/ja/copilot/using-github-copilot/getting-started-with-github-copilot#visual-studio-code-%E3%81%A7-github-copilot-%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B
VSCodeでEslintの設定でコード整形する方法

# はじめに

初めまして。エンジニアのkeita_Maxです。

ESLintとPrittierを使ってコード整形とか静的解析とかをしていたのですが、ESLintに書いてある設定をPrittierを使用しないでVSCodeで自動整形したいと思って調べたました。


# 結論

以下のようにsettings.jsonに以下を追加するとできました。

```json:settings.json
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": "explicit"
    }
```

ファイルを保存したときに、自動で記載した設定どおりに自動整形されます。

importの順番やダブルクォーテーションを使用しない、などの設定ができてCtrl+Sを押すだけできれいになります。


# 解説

```
"editor.formatOnSave": true,
```
↑ファイルを保存したときに自動で整形する設定です。

```
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
```
↑デフォルトのフォーマッターを設定しています。今回はESLintを設定しています。

```
"editor.codeActionsOnSave"
```

↑ファイル保存時にコードのアクションを設定する項目のようです。

>コードアクション (拡張機能がコードへの指摘をユーザーに示すための機構) を保存時に実行する設定です。
(引用：https://qiita.com/mysticatea/items/3f306470e8262e50bb70#:~:text=%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,editor.codeActionsOnSave,%E5%80%8B%E3%81%9A%E3%81%A4%E9%81%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)

```
"source.fixAll.eslint": "explicit"
```

↑保存されたときにアクションを実行するように設定しています。
※昔はtrueを設定していたらしいのですが"explicit"に変更になったようです。

# さいごに

簡単に設定できるのと、Prittierの設定も書かなくてよくなるのが個人的に楽かなと思いました。

やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。


# 参考

https://qiita.com/yasu2450_tech/items/14da1d01a1bb1b6e4cd4

https://qiita.com/mysticatea/items/3f306470e8262e50bb70#:~:text=%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,editor.codeActionsOnSave,%E5%80%8B%E3%81%9A%E3%81%A4%E9%81%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

https://zenn.dev/braveryk7/articles/source-fixall-eslint-value
シェルスクリプトでファイル内の特定パターン間の文字列検索

ファイル内の特定のパターンに基づいて特定の文字列を検索するタスクは、システム管理や開発作業中によく遭遇するシナリオです。今回は、`const static hoge_`というパターンで始まる行を見つけ、これらの行間に存在する指定された文字列を検索するシェルスクリプトを作成する方法を紹介します。

このスクリプトは特に、ファイルの特定の範囲をユーザーが対話的に選択し、その範囲内で文字列を検索する機能を提供します。また、スクリプトの最後にはファイルの終わりまでを含むように設計されています。

#### スクリプトの概要

1. **パターンマッチング**：まず、`grep`を使用して`const static hoge_`で始まる行を検出します。
2. **ユーザー入力**：ユーザーがどの範囲を検索したいかを選べるようにします。
3. **文字列検索**：選択された範囲内で`grep`を使用して特定の文字列を検索します。

#### スクリプトの詳細

```bash
#!/bin/bash

# 検索するファイルのパス
file_path="your_file.txt"
# 特定の間に検索する文字列
search_string="target_string"

# 検索するパターン
pattern="const static hoge_"

# パターンに一致する行の番号を取得し、ファイルの最終行番号も追加
line_numbers=($(grep -n "$pattern" "$file_path" | cut -d':' -f1))
line_numbers+=($(wc -l < "$file_path"))

# パターンが見つからなかった場合の処理
if [ ${#line_numbers[@]} -le 1 ]; then
  echo "No lines found with the pattern: $pattern"
  exit 1
fi

# ユーザーに範囲の選択を促す
echo "Select the range to search the string '$search_string':"
for (( i=0; i<${#line_numbers[@]}-1; i++ )); do
  echo "$((i+1))) Between line ${line_numbers[$i]} and line ${line_numbers[$((i+1))]}"
done

# ユーザー入力を受け取る
read -p "Enter your choice (1-${#line_numbers[@]}-1): " choice

# 選択した範囲での検索処理
if [ $choice -gt 0 ] && [ $choice -le $((${#line_numbers[@]}-1)) ]; then
  start=${line_numbers[$((choice-1))]}
  end=${line_numbers[$choice]}
  range="${start},${end}p"
  if sed -n "$range" $file_path | grep -q "$search_string"; then
    echo "Found '$search_string' in the selected range."
  else
    echo "'$search_string' not found in the selected range."
  fi
else
  echo "Invalid choice. Exiting."
  exit 1
fi
```

#### まとめ

このスクリプトは、ファイル内で`const static hoge_`で始まる行間を対象に特定の文字列を検索する際に役立ちます。ユーザーが範囲を対話的に選べる点と、スクリプトが簡潔である点が特徴です。データの解析やログのチェックなど、多岐にわたる用途に利用可能です。
Webサーバー、APサーバー、DBサーバー、監視サーバーそれぞれの役割

※qiita初投稿です。。。

## これらは全てミドルウェア？
- Webサーバー、APサーバー、DBサーバー、管理サーバーはいわゆるミドルウェアというもの。
- では、ミドルウェアとは？
    - middleと名前のつく通り、アプリケーションとOSの中間的な処理を行うソフトウェアのこと。つまり、「ある機能に特化してOSとアプリケーションを補助するソフトウェア」との言い換えることができる。
- ミドルウェアが必要な理由。OSだけではダメ？
    - OSはサーバーを動かす上で必須だが、基本機能しか持っていないため、業務で求められる機能は備えていない。
    - 特定の機能を持つミドルウェアをインストールすることによって、OSにない部分の機能を補完できる。
- ミドルウェアの種類
    - Web
        - Apache HTTP Server
    - AP
        - Tomcat
    - DB
        - MySQL, Oracle, PostgresSQL
    - バックアップ
    - ジョブ管理
    - 監視
    - 高可用性クラスタ

## **クライアント・サーバシステムとWeb3層構造**

- いつも使っているシステムの構成は、「クライアント・サーバーシステム」
- クライアントとサーバーで役割が違うのが特徴
    - クライアント：データ入力
    - サーバー：入力された値を処理、加工、出力
- Web3層構造が、Web、AP、DBに特化した機能を持つサーバー群

## Webサーバー、APサーバー、DBサーバー、監視サーバー

### Webサーバー

- 役割
    
    クライアントからのリクエストに対して、
    
    - 静的コンテンツを見せること
        - HTMLの内容をそのまま表示
    - APサーバに動的コンテンツを要求し、返ってきた結果を見せること
        - DBに格納されている値を分析し、表示
        - 特定の入力やボタンが押された場合、表示
    -  http://www.bfts.co.jp/aaa.html というリクエストが来たら、aaa.htmlの内容を表示する感じ。ここで、何かの処理が必要だった場合、APサーバーに問い合わせる。
    

### APサーバー

- 役割
    - Javaなどで作成されたアプリケーションを実行して動的コンテンツを作成する。
        - 「1+1」の結果は？
    - 必要であれば、DBサーバーにリクエストを飛ばし、帰ってきたデータを加工して「動的コンテンツ」に埋め込む。
        - 先月の来客者の年代別人数は？

### DBサーバー

- 役割
    - APサーバのリクエストに従って「SQL」を実行し、データを取得、更新、削除する。

### 監視サーバー

- 役割
    - サーバーやネットワーク等、周辺環境の状況を定期的にチェックして、正常に動作しているかをスクリプトや監視ツールを使ってチェックをする。
    - 障害原因の早期特定や、予防につながる
    - 常に安定稼働を求められるシステムにおいて必要な存在

参考：[サーバー監視とは？目的やツールの選び方、自動化について解説 | オージス総研](https://www.ogis-ri.co.jp/column/cloud_arch/c106417.html)

## 最後に、、**Web3層構造がなぜ採用されるのか**

- セキュリティが高いため
    - DBサーバーには、多くの顧客情報が格納されている。
    - DBサーバーにたどり着くまでに、Webサーバー、APサーバーを経由するため、より堅牢な設計。
- 管理がしやすい
    - アプリケーションで障害が起きているならAPサーバーを修正といった感じで修正が容易。
    - 負荷が増え拡張が必要な場合も、どのサーバーを拡張すればいいのかを検討し、実行すればOK。
- デメリットも、、
    - 各ミドルウェアを各サーバーにインストールする＝ミドルウェアと同じ数のサーバーを購入、運用する必要がある。
    - いくら3階層に分けたとはいえ、バグがあるとシステムを守ることはできない。
    

参考サイト：[ミドルウェア(Web、AP、DB)について知ろう](https://thinkit.co.jp/article/11837)
Swiftのエラーハンドリング: try, try?, try!の使い分け

## はじめに

Swiftでは、エラー処理を行う際に`try`, `try?`, `try!`という3つのキーワードが出てきます。
Swiftの勉強ハジメマシタな私には、これらの挙動の違いがややこしく感じました。

これらの違いを具体的なコード例を交えてまとめることで、自身の理解を深めつつ、
この記事を読んでくださった人の一助になれば幸いです🙇‍♂️

## 結論

- `try`はエラーが投げられる可能性のあるコードで使用し、`do-catch`ブロックでエラーをキャッチする
- `try?`はエラーが投げられた場合にnilを返し、そうでなければ結果をオプショナルで返す
- `try!`はエラーが投げられることを無視し、エラーが発生した場合はランタイムエラーでクラッシュします

## `try?`と`try!`の違いについて

`try?`と`try!`は、エラーハンドリングを簡略化するために使える記述。
似てるようでこの二つは安全性に大きな違いがあります。

(しっかりクラッシュさせました😭)

### `try?`の場合

```swift
func fetchData() throws -> Data {
    // ネットワークからデータを取得するコード
    return Data()
}

let data: Data? = try? fetchData()
```

この例では、`fetchData`からエラーが投げられた場合、`data`は`nil`になります。エラーが起こらない場合は、正常なデータが`data`に入ります。

### `try!`の場合

```swift
let data: Data = try! fetchData()
```

この場合は、`fetchData`からエラーが投げられない前提で `data` に `fetchData`の返り値を代入しようとします。

万が一エラーが起こった場合、アプリケーションはクラッシュします(突然の死到来)。

## `try?`と`try!`をdo-catch文に書き下すと

### `try?`の場合

```swift
let data: Data?
do {
    data = try fetchData()
} catch {
    data = nil
}
```

### `try!`の場合

```swift
let data: Data
do {
    data = try fetchData()
} catch {
    fatalError("エラーが発生しました")
}
```

こんなイメージで、`try!`はエラー発生時にプログラムを強制終了させます。

## 最後に

`try`, `try?`, `try!`を上手に使い分けるとエラーハンドリングをより柔軟に制御できそう。

特に、`try?`はエラーの可能性を無視しつつ、結果を安全に扱いたい場合に使える子という印象です(感じ方には個人差がある…カモ🦆)
WinUI3を諦めた話

# はじめに
今回の試みをするにあたって、自分がよくやる開発の説明を<br>
- Windows開発(Win32/MFC/.NET)
- スマホ開発(Obj-C/swift/Java/kotlin)
- 3Dレンダリング
- 3次元復元・画像処理
<br>
これらを単体・複合でやる事が多いんです<br>
最近の人ならUnity/UE使えよと言う人も多いでしょうが、ライセンスの問題等があるのでそこはご容赦を<br>
<br>
で、普段3DはC++&OpenGL&imguiで書く事が多いんですが、そろそろWindowsも2D GUIはC#リッチインターフェース欲しいよな、と思う年頃<br>

- WPFはC++と連携してる例を見ない・3Dレンダリングとしてはトリッキー
- UWPはストアアプリは普段作らんのでノータッチ

### WinUI3があるじゃないか!!(2024/04現在)

# てわけでWinUI3構築 Ver1.0
### 1. C#/WinRTのアプリプロジェクトを作成
デスクトップアプリのテンプレート選択<br>
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/7f1c5a55-87df-070a-5d5f-36cd3624d7fe.png)

.csprojのPeopertyGroupに以下を追加
```
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
```

### 2. C++/WinRTのランタイムコンポーネントを作成
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/a28f2eeb-b051-2b59-9fb3-28d06fd707a9.png)

[プロジェクト]右クリック -> [追加] -> [新しい項目] -> [WinUI] -> [カスタムコントロール]
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/cb3f7322-5ddc-7542-2818-ece41e3b6e62.png)

ここで一度ビルド（特にエラーは出ないはず）
あるとしたら指定した.NETのバージョンがインストールされてないとか

### 3. C#/WinRTで2のプロジェクションコンポーネントを作成
ここで、どうやってC#/WinRTのアプリにC++/WinRTのコンポーネントをリンクするんだ？と<br>
MS様のページ見るとNuget化するためにプロジェクションプロジェクトを通せ、とな<br>
https://learn.microsoft.com/ja-jp/windows/apps/develop/platform/csharp-winrt/net-projection-from-cppwinrt-component

てなわけで、書かれてる通りにプロジェクト作成

### 4. 結果
リポジトリ更新しちゃったんで面倒なんで結論だけ<br>
エラーもワーニングも出ず、%USER%\.nuget\以下にdllも出力される
MainWindow.xamlでインポートもできる、コントロールのクラスも認識できてる、にも関わらず何も表示されず<br>


# WinUI3構築 Ver1.1
https://github.com/0xopenfields/WinRTAppExample1
### 1. さらば、nuget
色々調べた結果、C++/WinRTをダイレクトにインポートできるっぽい
C#/WinRTの.csprojに以下を追加
```
<PropertyGroup>
  <CsWinRTWindowsMetadata>sdk</CsWinRTWindowsMetadata>
  <CsWinRTGenerateProjection>true</CsWinRTGenerateProjection>
  <CsWinRTIncludes>
    CppWinRTComponent;
    Windows.Foundation;
  </CsWinRTIncludes>![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/b693c913-93a4-f477-cbdc-3b231ab4d9ca.png)

  <CsWinRTExcludes>
    Windows.Foundation.Diagnostics;
    Windows.Foundation.PropertyType;
  </CsWinRTExcludes>
  <CsWinRTEnableLogging>true</CsWinRTEnableLogging>
</PropertyGroup>

<ItemGroup>
    <ProjectReference Include="..\CppWinRTComponent\CppWinRTComponent.vcxproj" />
</ItemGroup>
```
一応、狙い通り表示された
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/39d168b3-3408-af20-475a-ca57a05ab16e.png)

### 2. SwapChainPanel導入
これが本来の筋なんだけど、情報少なすぎて時間かかりそうだから一旦ペンディング

# WinUI3構築 Ver2.0
https://github.com/0xopenfields/WinRTAppExample2
### 1. Win32使えないか？
C++/WinRTでHWNDやWin32使えるんだから、Win32でCreateWindowすれば慣れ親しんだ書き方できるんじゃない？
-> やってみた
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/669b47b0-1c59-e9a4-d906-c80ba5a60568.png)

### 2. できたんだけど...
MainWindowの子ウィンドウとして表示すると、おそらくXAMLに上書きされて何も表示されない
あと、ウィンドウプロシージャもC++側で持ちたいので、親なし別スレッドで表示

そうすると、当然の事ながらMainWindowを動かしても追従しない
MainWindowのドラッグ・リサイズイベントをフックしてコントロールを変形...
いや、本末転倒だ...

### 3. 結論
XAMLではまだWPFのようなHwndHostはできないっぽい
HwndHostも.NET Framework 4.5までの機能なので.NET8の時代にあんまり使いたくないな...

# やっぱWin32最強
てことで現時点では古典的なWin32に軍配が上がる結果に
まぁ、Unity/UEも未だにWin32だし、フレームレート上げようと思うとプロシージャを自分で操作できる方が強いよね
という結論に至りました
【Linux】 Linuxでよく使うコマンドまとめてみた！！

# Linuxコマンド一覧
最近、Linuxを現場でよく使うので備忘録としてまとめます。

余談ですが、Linuxのペンギン可愛いですよね（笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/39da559a-763a-6a7b-9f44-d68439bb4ea4.png)

①`ls`：カレントディレクトリ内のファイルとディレクトリを確認する。
-l：詳細な情報を表示
```bash
ls -l
```
②`cd`：ディレクトリを変更する
```bash
cd /doc/etc
```
③`pwd`：自分の今いる場所（カレントディレクトリ）を表示する。
```bash
pwd
```
④`mkdir`：新しいディレクトリを作成する
-m：権限を指定できる。
```bash
mkdir -m 777 new_directory
```
⑤`touch`：新規のファイルを作成
```bash
touch new_file
```
⑥`rm`：ファイル、ディレクトリ削除
```bash
rm new_file
rm /doc/etc
```
⑦`cp`：ファイル、ディレクトリをコピーする
-r：コピー元にディレクトリを指定した場合、サブディレクトリもコピー
-p：元のファイルのオーナー、グループ、パーミション、タイムスタンプを保持
```bash
cp -rp /doc/etc /doc/etc_bk
```
⑧`cat`：ファイルの内容を表示する
```bash
cat new_file
```
⑨`sudo su -`rootユーザに変更、`su - newuser` ユーザ切り替え
```bash
sudo su  -
su - newuser
```
⑩`mv`：ファイル、ディレクトリを移動させる
```bash
mv /etc/old /etc/new
```

⑪`vi`：ファイルを編集、作成する
　`i`コマンド：挿入、編集が出来る
　`:wq`：上書きをして保存する
  `q`：閉じる
```
vi new_file
```
バリデーションにおけるRailsログの理解とカスタムログの活用

## はじめに
Railsアプリケーションを開発している際に、デバッグやエラーの特定は日常的な作業です。Railsのログはデータベースのトランザクションやリクエスト処理の詳細を提供しますが、バリデーションエラーのようなアプリケーションレベルのイベントは標準のログには詳細が記録されないことがあります。この記事では、Railsのログがどのように機能しているかを解説し、カスタムログを活用してデバッグ情報を充実させる方法を紹介します。

## Railsのログが出る場合と出ない場合

### Railsのログが出る場合：

#### 1. **リクエストログ**：
これはHTTPリクエストを処理するたびに生成されます。リクエストメソッド、パス、完了ステータス、所要時間などが含まれます。

#### 2. **データベースクエリログ**：
ActiveRecordを通じてデータベースに発行される各クエリの詳細が記録されます。これにはSQL文とクエリの実行時間が含まれます。たとえば、以下のバリデーションにおけるエラーログなどがそれにあたります。

```ruby
  def unique_future_reservation_per_customer_and_company
    return if date.blank? || customer_id.blank? || company_id.blank? || date < Date.today
    future_reservations = Reservation.where(customer_id: customer_id, company_id: company_id).where('date >= ?', Date.today)
    future_reservations = future_reservations.where(deleted_at: nil)
    future_reservations = future_reservations.where.not(id: id) unless new_record?
    if future_reservations.exists?
      errors.add(:base, "予約は1つしか作成できません")
    end
  end
```

```bash
  ↳ app/models/reservation.rb:36:in `unique_future_reservation_per_customer_and_company'
  TRANSACTION (0.8ms)  ROLLBACK
  ↳ app/controllers/reservations_controller.rb:104:in `toggle_approval'
```

#### 3. **エラーログ**：
システムのエラーや例外が発生した場合に生成されます。これにはエラーメッセージとスタックトレースが含まれることが多いです。

### Railsのログが出ない場合：

#### 4. **モデルバリデーションエラー**：
モデルのバリデーションはデータベースレベルの処理ではなく、オブジェクトがデータベースに保存される前のメモリ内で処理されます。そのため、標準のログにはこれらの詳細は記録されません。たとえば、以下のバリデーションではログが出力されません。

```ruby
  def date_cannot_be_in_the_past
    if date.present? && date < Date.today
      errors.add(:date, "は今日以降の日付を選択してください")
    end
  end
```

以下はログです。エラーが生じてロールバックしているが、エラーに関する情報が記載されていません。
```bash
 Customer Load (1.1ms)  SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:104:in `toggle_approval'
  TRANSACTION (0.6ms)  ROLLBACK
  ↳ app/controllers/reservations_controller.rb:104:in `toggle_approval'
Redirected to http://localhost:3000/reservations
Completed 302 Found in 27ms (ActiveRecord: 7.4ms | Allocations: 9009)
```


## 対策: カスタムログの実装

アプリケーションレベルの処理においてログを出力するにはカスタムログを設定する必要があります。アプリケーションの特定の処理でカスタムログを記録することで、デバッグが容易になり、運用時の問題解析が迅速に行えるようになります。例として、モデルバリデーションのカスタムログを追加する方法を示します：

```ruby
class Reservation < ApplicationRecord
  validate :date_cannot_be_in_the_past

  def date_cannot_be_in_the_past
    if date.present? && date < Date.today
      Rails.logger.info "Validation Failed - Date cannot be in the past: #{date}"
      errors.add(:date, "は今日以降の日付を選択してください")
    end
  end
end
```

このコードは、`Reservation` モデルにカスタムバリデーションを追加し、バリデーションが失敗するたびにログに記録します。こうすることで、開発中はもちろん、本番環境での問題発生時にも、ログから迅速に情報を得ることができます。

## ログレベルの管理

Railsでは、環境ごとにログレベルを設定することができます。例えば、開発環境では`debug`レベルで詳細な情報を出力し、本番環境では`info`レベルに設定して情報量を制限することが一般的です。

```ruby
# config/environments/production.rb
config.log_level = :info
```

## まとめ

Railsのログは強力なデバッグと監視のツールですが、すべての情報が自動的に記録されるわけではありません。カスタムログを適切に実装することで、アプリケーションの挙動をより詳細に把握し、開発と運用の効率を大幅に向上させることができます。
Azure ストレージアカウントのファイル共有にローカルのエクスプローラーからアクセスする

Azureのストレージアカウントを使ってみました。
今回はローカルPCからVPNにつないでファイル共有にアクセスしてみます。

## 概要
* VPNでローカルPCとAzure仮想ネットワークをつなぐ 
* ストレージアカウントを作成、ファイル共有を作成、プライベートエンドポイントを作成
* ローカルPCのエクスプローラーからアクセス

私なりの理解では、プライベートエンドポイントとは、例えばストレージアカウントやWeb AppsなどのAzureに埋め込まれた機能のNICみたいなものを、自分の環境（仮想ネットワーク）に置くことができる機能です。
これがなければ、インターネットを経由してAzureにアクセスすることになります。それはセキュリティの観点から好ましくありません。パブリックアクセスなしで利用できるようにした方が何かとよさそうです。

## 作業
### 前準備
リソースグループの作成からVPN接続までは省略。
VPNゲートウェイだけは時間がかかるのでさっさとデプロイしましょう。
### ストレージアカウントの作成
ストレージアカウントの作成時にいくつか注意点があります。
1. ストレージアカウント名は世界中で被らない名前にする（日付でも入れれば被らない）
1. **パブリックアクセスを無効にするか選択する（今回のテーマ）**
1. 冗長性（大事な話ですが今回は触れません,LRSで作成）

2に関して、作成時の画面はこのようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/ee02bcd7-1528-b4d2-d7ce-57e5bc624395.png)
今回は完全にプライベートなアクセスに制限したいので一番下の選択肢にしています（左の赤枠）。
プライベートエンドポイントを利用してアクセスするにはDNSゾーンを作らないといけません（右の赤枠）。このタイミングで作成しました。

ストレージアカウントの作成が終ったらファイル共有を作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/ed042d95-50bb-e5d9-f649-30c1c9caee4b.png)
検証なのでバックアップなしで作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/3ea9e74b-5b13-57b6-e3f3-0b447ca8defa.png)
作成したファイル共有を見てみると、URLが割り当てられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/563abc2b-c6b7-8e8a-cfa8-3d020581525c.png)
他にも、IDベースのアクセス管理などができます。この辺りは別記事で深掘りしたいと思っています。

作るリソースはこんなもんです。
## 使ってみる
現時点でリソースグループはこうなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/0553542f-3f98-6733-b11b-81652783ba7b.png)
プライベートエンドポイント、プライベートDNSゾーンができています。
プライベートエンドポイントを接続するネットワークインターフェイスにはプライベートIPアドレスが割り当てられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/88f3d2d3-3787-c7d4-e30c-750bd570deb8.png)
それでは、VPN接続したPCからこのIPアドレスにアクセスしてみます。
エクスプローラーを開きます。アドレスバーに"\\10.0.0.4"と入れてエンター![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/9aa07ca9-f159-9f4d-84cf-68c279e7957d.png)
おや？

代わりに"\\testfiles0423.file.core.windows.net\test-fileshare"と入れてみたところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/480623eb-6cdc-763d-4a87-613e80947560.png)
認証画面が出てきました。はて、何入れようか？そんなもの設定したかいな
Azure portalのユーザー名とパスワードではだめでした。
まぁプライベートIPアドレスはだめで、FQDNだとアクセスまで出来ることを確認しました。
アカウントのサブリソースをblobにしてしまったのが失敗の原因かと思ってプライベートエンドポイントを追加で作成してみましたが、同じ感じです。
ローカルのパワーシェル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/aaacc670-701e-5426-0429-ee7760dc74be.png)
名前解決ができてない。まあ確かにプライベートDNSゾーン作っただけで特に設定してないですし。
でもそしたらなんで接続までいけたんや？
もう一度上の認証画面まで行って、ユーザー名をファイル共有名、パスを、「ストレージアカウントキーの"pass:"以下の文字列」にしてみましょう。下の画像の、「スクリプトの表示」で見られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/df7a9f4d-29b5-2344-921f-fc6e58979fdb.png)

フム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/750b9288-f559-ba0c-df85-52116fe8470d.png)
「アクセスが拒否されました」なので、一歩進んだ感じです。しかし、この後がわからない。
同じ仮想ネットワークに置いたVMのパワーシェルでも名前解決できませんでした。
また検証しよう
## 疑問点
名前解決ができないのに、なぜ接続はできているのか？


おわり！
PowerAutomate: Pagination を使えば、もう Paging で @odata.nextlink の処理なんて要らない

# 背景

@odata.nextlink を持つ OData 処理が面倒だと思ってたら、
いつの間にか超簡単になっていたので共有まで

# 概要

単純に、Settings -> Networking -> Pagination を :on: するだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/dac0116e-aeb1-0f25-6069-10d478773372.png)

# 実際の効果の例

List group members で見てみると一目瞭然。Threshold 次第で一気にとれるので、超簡単になります！！

1. nextlink 無し
1. Threshold まで Top に依存せず取得してくれる :laughing: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/547185de-134b-9137-8808-db0e8f1ca445.png)

# 今現在使える Connectors on 2024/4/25

ん－調べるの面倒過ぎるので・・、情報お待ちしてます :sweat: 

## sharepoint

- [Get items](https://learn.microsoft.com/en-us/connectors/sharepointonline/#get-items)
- [Get-files-(properties-only)](https://learn.microsoft.com/en-us/connectors/sharepointonline/#get-files-(properties-only)))

## Office 365 Groups では以下二つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/83ad190a-52d7-3edd-5b85-c093d447a187.png)

## Teams では未対応

:cry: 

## 

# documents

全体の話

https://learn.microsoft.com/ja-jp/graph/paging?tabs=http

https://youtu.be/DB_NoC9a1JI

Office 365 Groups
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f429fd75-707b-c594-ac0e-79f76118e069.png)

https://learn.microsoft.com/ja-jp/connectors/office365groups/#%E3%83%9A%E3%83%BC%E3%82%B8%E5%8C%BA%E5%88%87%E3%82%8A

元となる Logic Apps

https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-exceed-default-page-size-with-pagination

# あとがき

Power Query でも、List.Generate() で処理するの面倒なので、同様の方法が欲しいです :p