OmniAICreator/Qiita-1.07M huggingface dataset:
Proxmoxでvmのk3sを構築する Cloud-initも含め

# 0. 初めに
k3s構築する前まではProxmoxのLXC(コンテナ)を各サービスごと作成して運用していたが運用していたサービスの数と規模が大きくなるにつれて手動での構築に疲れたので導入することにした。

LXC(コンテナ)上でk3sの構築が可能だが、追加の作業が必要となるので今回はvmで建てることにした。
VMを使うとLXCよりはリソースが多くなってしまうが、OSをUbuntu ServerではなくDebianを使うとストレージとメモリを削減することができる。

VMのセットアップには便利なCloud-initを利用する


# 1. 環境
- ホスト:
  - cpu: intel i3-10105
  - メモリ: 32GB
  - ストレージ: 500GB
  - OS: Proxmox VE 8

# 2. Debian 12 Cloud initのテンプレートvmの作成
## 1. Debian Cloud Imageのダウンロード
最新のDebian 12のQCOW2フォーマットをwgetでダウンロードします。
```sh
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2
```


## 3. ProxmoxでVMを作成
VMIDを9000として作成。
```sh
qm create 9000 --name debian12-cloudinit --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --machine q35
```

## 4. ディスクとメモリの構成
ダウンロードしたQCOW2のイメージをインポート、その後8GBまでサイズを拡大します。
```sh
qm set 9000 --scsi0 local-lvm:0,discard=on,ssd=1,format=qcow2,import-from=/root/debian-12-generic-amd64.qcow2
qm disk resize 9000 scsi0 8G
```

## 5. Boot Orderの設定
インポートしたディスクをbootするために変更。
```sh
qm set 9000 --boot order=scsi0
```

## 6. CPUとメモリリソースの構成
仮想コアを2コア、メモリを2GBにする。

```sh
qm set 9000 --cpu host --cores 2 --memory 2048
```

## 7. BIOSとEFIの構成
BIOSではovmfを利用し、4MBほどのEFIディスクを作成。
```sh
qm set 9000 --bios ovmf --efidisk0 local-lvm:1,format=qcow2,efitype=4m,pre-enrolled-keys=1
```

## 8. Cloud-initの構成
Cloud-initのドライブを作成。
```sh
qm set 9000 --ide2 local-lvm:cloudinit
```

## 10. シリアルコンソールの設定
Hardwareの項目で、新しくシリアルポートを追加して、DisplayをSerial terminalに変更しても良い。

## 9. テンプレートとして保存
VMをテンプレートにする。
```sh
qm template 9000
```

## 10. VMをクローンしてセットアップ
テンプレートを使ってVMを作成する。

今回はk3s-masterとk3s-node1を作成した。

WebUI上にあるテンプレートを右クリックしてクローン、このときにFull Cloneで作成する。
VM IDとNameは適当に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726239/4d02b9a2-d256-9a6d-24fa-f52a681b316b.png)

作成したら、cpu, メモリ, Cloud-Initなどの項目を変更する、Cloud-Initではipを固定し、後に利用するsshの公開鍵も設定しておく。

# 2. k3sのセットアップ
とりあえず、すべてのVMでパッケージの更新とアップグレードを行う。

```sh
apt update; apt upgrade -y
```

マスターと各ノードのipアドレスを解決するために/etc/hostsを変更する。
```sh
nano /etc/hosts
```

追記
`192.168.1.1`等のipは環境に合った値に変更。
```diff: /etc/hosts
+ 192.168.1.1 k3s-master
+ 192.168.1.2 k3s-node1
```

## マスターのセットアップ
k3sのインストールはk8sと比べるととても簡単
```sh
curl -sfL https://get.k3s.io | sh -
```

セットアップが終わったらノードを追加するためのtokenを確認しておく。
```sh
cat /var/lib/rancher/k3s/server/node-token
```
出力された文字列を後に使用するのでメモ。

## ノードのセットアップ
`k3S_TOKEN`を先程のtokenに変更。
```sh
curl -sfL https://get.k3s.io | K3S_URL=https://k3s-master:6443 K3S_TOKEN=tokentokentoken sh -
```

ノードが追加されたかマスターで確認する

```
# sudo k3s kubectl get node
NAME         STATUS   ROLES                  AGE   VERSION
k3s-master   Ready    control-plane,master   1m   v1.30.6+k3s1
k3s-node1    Ready    <none>                 1m   v1.30.6+k3s1
```

ノードが追加されてたら構築終了です。
sshでローカルとリモートリポジトリを連携する

GitHubと自分のPCをsshを使って連携させようとした時になかなか戸惑ったので備忘録。

## リモートリポジトリをローカルでクローンする方法
### 前提
以前所属していた会社で.sshに秘密鍵を作成し、会社のGitHubをローカル環境にクローンしていた
先日、会社を退職したのをきっかけに、「自分のGitHubとローカルの接続をしておくか」と思い立ち、今に至る。
今回は、以前使っていた.sshを思い切って削除することからスタート。
この判断が正しいか正しくないかはよくわからないのでちゃんと調べて実行することをお勧めします。

### .sshを作成
以下のコマンドを使って.sshを作成します。
```
mkdir .ssh
```
その後、cd .sshへ.sshの中に入ります。

:::note warn
.sshは隠しファイルです。そのためlsなどで確認しようとしても見つかりません.
:::

### 秘密鍵を作成
```
ssh-keygen -t rsa -b 4096 -C "ここにメールアドレス"
```
次にパスフレーズを聞かれますので好きなパスフレーズを設定。

catコマンドを使って秘密鍵の中身を確認
```
cat ~/.ssh/id_rsa.pub
```

:::note warn
id_rsaは秘密鍵のデフォルトの保存場所です。
変更したい場合は、鍵作成時に任意のファイルを作成してください。
:::

catコマンドで表示された秘密鍵を全てコピー。

### GitHubに秘密鍵を設定する
まず以下のリンクにアクセス。
https://github.com/settings/ssh

```New SSH key```を押下。
Title（なんでもOK）とKey（先程コピーしたものをそのまま貼り付け）を入力します。

### 接続テスト
```
ssh -T git@github.com
```
を入力して接続を確認。

Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.
と返ってきたら接続完了。

### リポジトリのクローン
最後に以下の手順でリポジトリのクローンをします。
1 GitHub上でクローンしたいリポジトリに移動
2 codeボタンを押下
3 SSHのタブを押下
4 git@github.comから始まるSSHのコピーコードをコピー
5 頭にgit cloneコマンドをくっつけてコマンドを実行する
以下のようになるはず
```
git clone ここにコピーしたものを貼り付け
```

以上で完了。
もうデータ消失の心配なし！Apidogバックアップの全貌

## 初めに　

皆さん、Postmanというソフトを知っていますか、または使ったことがありますか？ 私はPostmanよりもさらに使いやすいソフト「[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)」を見つけたのでお勧めします。その中で特に気に入っている機能が、データの復元です。

![apidog-クライアント-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/63ebac89-a9a7-2f3c-4cec-c6fbef1c0feb.png)

[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)は初心者にも優しいですよ。もしデータをうっかり削除してしまっても、ゴミ箱から復元できるだけでなく、完全に削除した場合でも会社にメールで連絡して復元することができるんです。この機能は本当に親切で、初心者でも操作ミスを心配する必要はありません。

Apidog はデータのバックアップ体制が充実しています。Apidogの使用中に、サーバー上にデータのバックアップを 1 分ごとに保存します。当社では、バックアップデータを安全に保管するためにアマゾン ウェブ サービス (AWS) データセンターと Amazon S3 を利用しています。

データを、OpenAPI 仕様、HTML、マークダウンなどのデータ形式などにエクスポートすることもできます。予期せぬ事態が発生したことによってデータの紛失事故を防ぐため、データを定期的にバックアップを作成し、安全な場所に保管することをお勧めします。

データバックアップに関する詳細は、[データのエクスポート](https://apidog.com/jp/help/api-docs/exporting-api)をご参照ください。

## データを復元する
データを誤って削除した場合、または以前のバージョンに戻す必要がある場合、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya) には、それぞれをゴミ箱と変更履歴から復元してください。

削除したAPI とAPICaseはゴミ箱に移動され、30 日後に完全に削除されます。残り日数はゴミ箱で確認できます。

### ゴミ箱からデータを復元
API管理の画面右下の側にある [ゴミ箱] アイコンをクリックします。

![apidog-ゴミ箱-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/009a0458-784e-55e9-58f2-87c29dbf6f50.png)


復元したいアイテムを選択して、「復元」をクリックします。ここで複数アイテムをチェックして、一括に復元することをサポートします。

![apidog-ゴミ箱-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/a6d25f09-03b6-a7f0-b54e-8d5fd8fca3d4.png)

### 変更履歴
API変更履歴を利用するには、右上にある時計アイコンをクリックしてAPI変更履歴を開きます。

![apidog-変更履歴-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/1b846334-da09-236b-5a90-975ef4eb96a3.png)

特定の履歴をクリックすると、変更前後の違いを確認した上、「**このバージョンに戻す**」をクリックします。

![apidog-変更履歴-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/73987e76-ca19-f8d5-57b9-25cd846c6807.png)

**ご案内**：変更履歴から元のバージョンに戻すと、実質新しいバージョンが作成され、ゴミ箱からデータを復元すると、元のバージョンが復元されます。

データの損失を防ぎ、予期せぬ事態が発生した場合でも重要な情報をすぐ復元してアクセスできるようデータを定期的にバックアップすることをお勧めします。


## データ削除
[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)は、誤操作によってデータ損失事故が起こる可能性があることを理解しています。APIまたはその他のデータを誤って削除した場合は、お手伝いさせていただきます。当社ではデータベースのバックアップを保持しているため、必要に応じて過去 30 日間のデータのスナップショットを復元できます。データ回復に関するサポートが必要な場合は、 [**support@apidog.com**](mailto:support@apidog.com)までご連絡ください。

## 終わりに
今回は以上になります！
**最後まで読んでくださり、ありがとうございました！
この記事を読んで少しでも理解を深めていただければ幸いです！**
【練習用】駆け出し未経験データサイエンティストの初投稿

## 内容
会社で技術共有の機会があり、それでqiitaに手を付けてみた。
やってみたは良いものの、アウトプットできるものが特にない。。。
何か思いつきたり試したいことがあり次第追記。

AI技術を中心にやっていきたい。
cron設定の最後には改行コードが必要だった話

## 問題
新しいbatchをcron設定ファイルの最後に追加したが、crontabの読み込み時にエラーが起きてしまった..!
```bash
$ crontab cron.mainuser
"/tmp/crontab.sometemp":51: premature EOF
errors in crontab file, can't install.
```
## 原因
```bash
$ diff cron.mainuser.original cron.mainuser
48a49,51
>
> # say helloWorld
> 00 7 * * * /bin/bash /bash/batch/helloWorld.sh >> /usr/local/var/log/keiba-P5/batch/cron.log 2>&1
\ No newline at end of file
```
ファイルの最後に改行コードがないから！

#### なぜ改行コードが必要なのか??
- UNIX系システムでは、改行コードがファイルの行を分ける区切りとして設定されている。
- cronファイルの最後の行に改行コードがないと、cronデーモンはまだファイルが続いていると判断するが、今回は次のエントリがないため予期せぬエラー(premature EOF)になった。

## 解決策
hotfix: 最後の行に改行を入れてから再読み込みしたところ、無事読み込みが完了しました!
あとでbranchの更新をしておくのを忘れずにしないと..

## 予防策
- テスト時にbatchを直接叩いて動作確認していたので、cronファイルにエラーがあることに気付くことができませんでした... cronの読み込み含め全部(少なくとも自分が実装した範囲は)手順をテストしておくとより安全ですね。
- 最後に改行コードのみ追加したPRを作ったのですが、bitbucketだとdiff分かりづらい😭 `git diff`した結果をコメントで追加しておいた方が親切になりそうです。
- Visual Studio Codeではファイルの最後に新しい行を自動で追加してくれる設定があるので、こちらを活用するのも良さそうです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/2500e5fd-2c24-d6c6-b223-2a48b2eb0a1f.png)
ChromebookのLinuxでGPartedを使う

ターミナルを開き、次のコマンドでインストールする。
```shell
sudo apt update && sudo apt upgrade -y
sudo apt install gparted -y
```
ランチャーにGPartedのアイコンが作られたので、インストールできたようだがそのアイコンをクリックしても起動できない。
そこで、次のコマンドで起動を試みた。
```shell
sudo gparted
```
次のメッセージが出て起動できなかった。
```text
No protocol specified


(gpartedbin:2926): Gtk-WARNING **: 13:19:14.612: cannot open display: :0
```
解決策は、次のコマンドを実行する。
```shell
xhost +si:localuser:root
```
その後、次のコマンドで起動できた。
```shell
sudo gparted
```
しかし、次のメッセージが順に出るので、その都度`Cancel`する。
Could not stat device /dev/vda - No such file or directory.
Could not stat device /dev/vdb - No such file or directory.

:::note info
USBメモリを挿しているのに、GPartedにUSBメモリが表示されないときは、
1. 次のいずれかの手順で、「Linux アプリに USB デバイスへのアクセスを許可します」を有効にする
   - 設定アプリ→ChromeOSについて→Linux開発環境→USBデバイスを管理する
   - ランチャー→ターミナル→Linux 管理→USBデバイスを管理する
   - ランチャー→ターミナル→デベロッパーの設定→USBデバイスを管理する
1. GPartedのメニューで、「GParted→Refresh Devices」
:::
Physics Lab. 2025

# 挨拶
![PhysicsLabロゴ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924001/b5a6f62d-8a7f-607b-1ea0-487995770f19.jpeg)

こんにちは。Physics Lab. 2025 の統括です。

「Physics Lab.」とは東京大学理学部物理学科 [^1]の学生が主体となって活動している有志団体で、毎年東京大学で行われる五月祭にて企画展示を行っています。

そんな Physics Lab. では例年アドベント・カレンダーを企画しており[^a]、今年も本日からクリスマスまで毎日記事を更新していきます。我々が普段学習している物理学にまつわる様々な内容を中心に、各々の布教したい分野や趣味に関することなど、多様な話題が充実している予定です。楽しみにしていてください。


[^a]:Physics Lab.でアドベント・カレンダーを書くというイベントはここ4年の文化のようです。URLをこちらに載せておきます。2021: https://event.phys.s.u-tokyo.ac.jp/physlab2021/advent-calendar 2022: https://event.phys.s.u-tokyo.ac.jp/physlab2022/advent-calendar/ 2023: https://event.phys.s.u-tokyo.ac.jp/physlab2023/advent-calendar/ 2024: https://event.phys.s.u-tokyo.ac.jp/physlab2024/advent-calendar/

[^1]:以下、理物と表記。





Physics Lab.の活動
-
#### - 普段 -
普段は自主ゼミ活動が活発に行われています。今年は
- 量子班
- 統計物理班
- 宇宙班
- 数理物理班
- 計算物理班
- 生物物理班
- 実験班

の7班が立っており、日々賑わいを見せています。各班の具体的な活動等については、12月3日から各班長 / 副班長が順々に記事を投稿して紹介してくれる予定です[^3]。


[^3]:班紹介に限らず、今後、アドベントカレンダーの更新が遅れることがあるかもしれません。みなさん物理学に真摯に向き合っており記事の執筆に手が回っていないのです。何卒優しくしてあげてください。
[^4]:他学部または他学科の学生が自主ゼミに参加することもあります。

興味を同じくする仲間[^4]と教科書を選んで輪読をしたり、学部の講義で扱う範疇を超えたアドバンストな内容やマニアックな分野に取り組んだりと、多様なレベル感と目的意識の下で様々な自主ゼミの在り方があります。個々人が自由にゼミを募集して人が集まったり集まらなかったりするのびのびとした空気感の中、議論の飛び交う闊達な空間が形成されていると思います。また学科に入りたての2年生にとって、いい交流の機会にもなっているようです。理物は伝統的に自主ゼミが盛んであると言われていますが[^2]、Physics Lab. はこの活発な自主ゼミ文化を支える土台の一つであると言えるでしょう。

[^2]:歴代のPhysics Lab.統括がそう言ってました。


#### - 五月祭 -

今年は ポスター発表・学生講演・演示実験・解説記事の作成 を行う予定です。普段の自主ゼミ活動で学んだことや自分で考えたことなどをポスターにまとめて発表したり、小柴ホールと呼ばれる立派な講堂を貸し切って学生講演を行ったりします。

また今年から実験班が新設され、例年にも増して気合の入った演示実験が行われる予定です。現時点ではまだ計画段階ではありますが、きっと興味深く、ワクワクするものになると思います。

物理学という学問は理論・実験の両輪で発展してきた営みですが、その壮大な学問体系を多角的な視点から切り取り、五月祭を通してその一端を紹介したいと考えています。当日、我々の企画展示にご来場いただき、物理の面白さを少しでも感じて頂けたらこれ以上ない幸いです。

終わりに
-

いかがでしたか？
初日はPhysics Lab. 全体に関する堅苦しい紹介でした。明日は副統括による学科紹介、次いで各班の紹介があり、その後はバリエーション溢れる記事が続々と登場します。ぜひお楽しみください。
Viteで作成したReactプロジェクトをFirebaseでデプロイすると「Firebase Hosting Setup Complete」画面が表示される事象の解消方法

# はじめに

お疲れ様です、りつです。

FirebaseでReactのWebアプリをデプロイしようとしたのですが、うまくいかなかったので記事にまとめます。

# 問題

https://zenn.dev/yumemi_inc/articles/2020-10-06-react-firebase-deploy

上記のサイトを元に`firebase deploy`まで行い、ホスティングURLから画面を確認すると、以下のように「Firebase Hosting Setup Complete」画面が表示されてしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/9f0a018b-b664-6d24-1352-4127a8deffab.png)

# 原因

`firebase init`で初期設定を行う際、以下の質問で回答した内容に誤りがありました。

```terminal
? What do you want to use as your public directory?
```

私は`npm run build`を実行したら`build`ディレクトリが作成されると思い、`build`と回答しました。

しかし、今回作成したプロジェクトはViteで作成しているため、`npm run build`で実際に作成されるディレクトリ名は`dist`でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/b9ff6133-1613-d93a-e01a-e51be1b28d66.png)

本来参照すべきは`dist`ディレクトリなのですが、回答を誤った結果`build`ディレクトリ配下の`index.html`が参照され、「Firebase Hosting Setup Complete」画面が表示されてしまいました。

# 解決方法

以下の手順にて、Webアプリが画面上に表示されるようになりました。

1. `build`ディレクトリの削除
2. `firebase.json`の修正 
3. `firebase deploy`の実行

##  【 補足 】`firebase.json`の修正内容

- 修正前の状態

修正が必要なのは、`hosting`の`public`の設定です（以下の画像の赤線部分）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/16c265da-9a47-e300-3312-36758ff9e52d.png)

今回の場合、`build`ではなく`dist`が正しいため、以下のようにソースコードを修正しました。

- 修正後のソースコード
```json:firebase.json
{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

# おわりに

単純な原因でしたが解消できてよかったです。
無事Webアプリを公開することができました！

# 参考

https://zenn.dev/yumemi_inc/articles/2020-10-06-react-firebase-deploy

https://medium.com/@rajdeepmallick999/vite-firebase-how-to-deploy-react-app-5e5090730147

https://stackoverflow.com/questions/40555352/how-to-change-firebase-project-directory
GitHubに草🌱を生やしたい！『TILをGitHub上にpushすることで…記録と記憶の一石二鳥を目指す極意』



皆さんに質問です。
GitHubに草🌱生やしてますか👀👀👀
というのも…

先日のRUNTEQのHRの時に、
『毎日の作業記録をGitHub上に記載する』
⇨
そうすると、GitHubに草を生やすことが出来る！！！！

という話をしていて…

草🌱？？？

と思った同期の方が多く、
改めてGitHubに草🌱を生やす為の
手順と、なぜそれが必要なのかに
ついてもこちらで記載しておこうと思います。

## 目次：

- [GitHubに草🌱を生やすとは…？](#githubに草を生やすとは)
- [なぜGitHubの草が重要なのか？](#なぜgithubの草が重要なのか)

## GitHubに草🌱を生やすとは…？

さてさて、それではまずGitHubに草を生やすとは？
について記載していきたいと思います。

皆さんのGitHubアカウントの
Your Profileを開いてみてください。

その中に、下記のような『contributions』
という緑の四角い色のついたカレンダーのようなものが出てきます。

下記画像参照

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


これが、いわゆる『草🌱』になります！

つまりGitHubに毎日pushしよう！

自分のGitHubに毎日やったこと
コードやTILなどをpushしていきましょう！

そして、その活動の記録。

日常の記録は、就職活動の時に優位に働きますよ👀👀👀

ということになります。

## なぜGitHubの草が重要なのか？

それでは・・・
なぜ重要なのか・・・？

と言いますと・・・

あなたが会社の採用担当者だったとします。

まず…会社に来てくれた方の
面接をするときに何を基準に選考を選びますか？

見た目ですか？
印象でしょうか？
それとも年齢や職歴？性格？

色々とあるかと思いますが…

あなたが、プログラミング未経験者として、
会社を受ける以上必要になるのは、

そう！

『学習期間中に何をやってきたか？』
これが、重要になってくると思います。

その上で、会社の採用担当者が
必ずチェックするであろう場所はどこか？

そう！

それは…

あなたのGitHubのアカウントになります！👀👀👀

その為、GitHubのアカウントの見た目を
ツヨツヨに見せることやGitHub上に
実際に作った自分のコードや学んだことの
まとめを記載しておくこと。

つまり、GitHubに草🌱を生やすということが
重要になってくるのです！✌️🤡🫰💗

お分かり頂けたであろうか…
この重要性を…

しかし…

ここで大きな問題が出てくると思います…

え？
コード…成果物…

何も…
pushできるものがねーーーーー！泣

そんなあなたのお悩みに答える記事がここに…
あるんです✌️🤡🫰💗『クリックしてね』
👇👇👇
[GitHubで草🌱を生やそう！！！](https://www.notion.so/GitHub-7c73643401e448288af6b22968420d6f?pvs=4)

具体的には、TILという以前RUNTEQの学習の講義でも活用した
『Today I Learned 』という。

その日にやったこと。

をまとめて書いて、pushするだけでOKです！

その日にやったことであれば、
xやtimesにまとめて書いている方が
沢山いらっしゃると思うので、
皆さん気兼ねなく始められるかと思います。

是非！一度見てみて！

素敵なGitHub草🌱生やしLifeを一緒に送りましょう
✌️🤡🫰💗

at by しっしー🦁
CLIだけで.NET MAUIBlazor Hybrid アプリを実質5分で作る

# はじめに
.NETの開発はたいていの場合VisualStudioか、VSCodeにC#Developer Kitをインストールして進める方が多いと思いますが、単にHello Worldだけを試したい場合はそれらがなくても問題はありません。それが例えマルチプラットフォーム用のアプリであったとしても、です。
今回は.NETの中でもやや日本語の文献の少ない、.NET MAUIBlazor HybridアプリをIDEなし、CLIだけで作成・ビルドし、起動してみたいと思います。
~~(間も無く.NET9がリリースされるので今更感もありますが)~~

:::note
2024/11/17 .NET9でも検証しました。 
:::

# .NET MAUIBlazor Hybridとは
MAUIBlazor Hybrid は、Blazor Server と Blazor Web Assembly の機能を統合したテクノロジーで、マルチプラットフォーム用のアプリケーションを作ることのできるフレームワークです。
ざっくり要約すると、Webアプリをそのままクライアント上で動作するスタンドアロンのアプリケーションにできちゃう、さらにJavaScriptで書かなければならないフロントのプログラムも全部C#で書くこともできる（もちろんJavaScriptで書いてもOK）といった感じです。

# 前提
dotnetのSDKがインストール済みであること。
XCodeおよびXCodeCommandLineツールがインストール済みであること（Windowsの場合不要）。
また、実行環境は以下を想定しています。
|OS|XcodeCommandLineツール|.NET|ストレージ|
|:--|:--|:--|:--|
|macOS 15.0.1|16.1|8.0.403|SSD|
|macOS 15.0.1|16.1|9.0.100|SSD|

本稿ではMacを使用していますがdotnetコマンドが主なので、Windowsのコマンドプロンプトでも基本的にはほとんど同じ手順で実行可能です。

# 手順

## ワークロードのインストール（所要時間10分）
下記コマンドを実行してMAUIのワークロードをインストールします。
Windowsユーザの方は管理者権限を付与してある状態で、下記コマンドの`sudo`を省略してください。SDKをインストールせずにバイナリを直接配置・パスを通している場合は管理者権限なしでも実行できます。
```shell:zsh
sudo dotnet workload install maui --source https://api.nuget.org/v3/index.json
```
大量のデータをダウンロード・インストールするので、所要時間のほとんどは待ち時間です。のんびりお茶やコーヒーを飲みながら、しばらく待ちましょう。

:::note
タイトルで「実質」と謳っているのは、この時間を除外しているためです。
:::

## アプリの作成（所要時間1分）
任意のディレクトリで下記コマンドを実行してMAUIアプリのベースとなるソースコードを展開します。コマンド内の`MyMauiApp`はお好みのプロジェクト名に適宜変更してください。
```shell:zsh
dotnet new maui-blazor -n "MyMauiApp"
```
コマンドが成功すると、以下のメッセージが表示されます。
`テンプレート ".NET MAUI Blazor アプリ" が正常に作成されました。`

## アプリのビルド（所要時間2分）
カレントディレクトリを`MyMauiApp`に移動して、ビルドコマンドを実行します。

<details><summary>.NET8で実行する場合 </summary>

Windowsユーザの場合はコマンド内`net8.0-maccatalyst`を`net8.0-windows10.0.19041.0`に置き換えて実行してください。

```shell:zsh
cd MyMauiApp
dotnet build -c debug -f net8.0-maccatalyst
```
</details>

<details open><summary>.NET9で実行する場合</summary>

Windowsユーザの場合はコマンド内`net9.0-maccatalyst`を`net9.0-windows10.0.19041.0`に置き換えて実行してください。

```shell:zsh
cd MyMauiApp
dotnet build -c debug -f net9.0-maccatalyst
```

</details>


## アプリの起動（所要時間1分）
ディレクトリ`MyMauiApp/bin/debug/net9.0-maccatalyst/maccatalyst-arm64/`内にMyMauiAppというアプリケーションファイルがあるので、Finder（Windowsユーザならエクスプローラ）経由でダブルクリックorコマンドラインから直接起動します。
下図のように、アプリが起動できたら完了です。
![SS001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/8c0055a4-db4f-7161-4bee-ab13aac048d2.png)

:::note warn
Macでビルド実行時に「Could not find a valid Xcode app bundle at '/Library/Developer/CommandLineTools'. Please verify that 'xcode-select -p' points to your Xcode installation.」というエラーが発生する場合、XCodeのCommandLineツールがきちんと設定できていないことが考えられます。
XCode側でCommandLineツールの再設定を行うとエラーは解消します。
:::

# まとめ
以降のコーディングは主にC#で進めていくことになるだろうと思いますので、VisualStudioかVSCodeを利用すると効率よく実装できますが、HelloWorld的に.NETのテンプレートを試用する場合においては、それらIDEやエディタは必要ありません。
コンソールアプリでもそうですが、やはりプログラムを即動かせる、試せる点はプログラミングにとって大きなモチベーションにつながりますので、ぜひ色々試してみてください。
ESLintでJestの ‘test’ や ‘expect’ が未定義エラーになる問題の解決方法(xx is not defined)

# はじめに
時間がかかったので、メモに残します。

# 問題
Jestを使ったテストコードを書いているときに、ESLintで ‘test’ や ‘expect’ が未定義エラーになった
xx is not defined

vsコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/c5d8d976-6d80-ac43-a091-dd307389a21a.png)


# 解決方法
ESLintがJestのグローバル変数を認識していないため
eslint.config.jsに以下を加える
```
globals: {
  ...globals.browser,
  ...globals.jest
},
```

エラーを解決できたコード
<details>
<summary>eslint.config.js</summary>

 ```javascript
import js from '@eslint/js'
import globals from 'globals'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import jest from 'eslint-plugin-jest'

export default [{
        ignores: ['dist']
    },
    {
        files: ['**/*.{js,jsx}'],
        languageOptions: {
            ecmaVersion: 2020,
            globals: {
                ...globals.browser,
                ...globals.jest
            },
            parserOptions: {
                ecmaVersion: 'latest',
                ecmaFeatures: {
                    jsx: true
                },
                sourceType: 'module',
            },
        },
        settings: {
            react: {
                    version: '18.3.1'
            }
        },
        plugins: {
            react,
            'react-hooks': reactHooks,
            'react-refresh': reactRefresh,
            'jest': jest
        },
        rules: {
            ...js.configs.recommended.rules,
            ...react.configs.recommended.rules,
            ...react.configs['jsx-runtime'].rules,
            ...reactHooks.configs.recommended.rules,
            'react/jsx-no-target-blank': 'off',
            'react-refresh/only-export-components': [
                    'warn',
                    {
                            allowConstantExport: true
                    },
            ],
            'jest/no-disabled-tests': 'warn',
            'jest/no-focused-tests': 'error',
            'jest/no-identical-title': 'error',
            'jest/prefer-to-have-length': 'warn',
            'jest/valid-expect': 'error'
        },
    },
]
 ```
</details>



# おわりに
chatGPTに聞いて闇雲に解決しようとしてもダメでした。
eslint.config.jsの他に、eslintrc.cjsというファイルを作ってしまったりして訳がわからなくなりました。
chatGPTに聞くときは、そのコード1行1行に何の意味があるのかを確認しなければならないです。
AIで生成したSVGをFigmaで編集する方法

## はじめに

AI(ChatGPT, Claudなど)で生成したSVGは、そのままでは使いづらいことが多いです。Figmaを使えば、生成されたSVGを通常のベクターレイヤーとして編集できます。この記事では、SVGファイルをFigmaに取り込んで編集し、最適化して書き出すまでの基本的な流れを解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/556a56b9-3821-90e2-1eb8-7f1f9aafd503.png)


## SVGをFigmaで編集できるようにする

### インポート方法

1. **ドラッグ&ドロップ**
   - SVGファイルをFigmaのキャンバスに直接ドロップ
   - 複数ファイルを一度にドロップ可能

2. **メニューからインポート**
   - File > Import files（⌘/Ctrl + Shift + K）
   - Place image/videoボタンをクリック

3. **コピー&ペースト**
   - SVGファイルの内容をクリップボードにコピー
   - Figmaに直接ペースト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/886d5fa5-8a87-e151-287c-ffe5cf46106f.png)

例えば、カレーの作り方の手順のSVGをインポートしたときの様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/76476e75-fae9-6269-eac9-0a0832ac8b93.png)

グループ解除で要素ごとに編集できるようになる。


### インポート後の状態

重要：**インポートされたSVGは通常のベクターレイヤーとして編集可能になります**

- パスの編集
- カラーの変更
- サイズ調整
- 各要素の選択・移動
- エフェクトの適用

## 基本的な編集操作

### レイヤーの選択

- ダブルクリックで個別のレイヤーを選択
- 左のレイヤーパネルから選択
- 複数選択：Shift + クリック

### よく使う編集機能

- サイズ変更：トランスフォームコントロール
- カラー変更：カラーピッカー
- パスの編集：ベクターツール
- グループ化/解除：⌘/Ctrl + G / ⌘/Ctrl + Shift + G

## SVGの書き出し

### 基本的な書き出し

1. 要素を選択
2. 右パネルのExportセクション
3. Format: SVGを選択
4. Export選択範囲をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/95b3ea75-07ff-b977-3305-1ae5840cd35e.png)


### エクスポート設定のポイント

- Include "id" attribute
  - SVGの識別子を含める
  - 開発時の操作に有用

- Outline stroke
  - ストロークをアウトライン化
  - 表示の一貫性を保つ

### 一括エクスポート

1. 複数要素の選択
2. エクスポート設定
3. Export allで一括書き出し

## まとめ

1. SVGファイルはFigmaに簡単にインポート可能
2. インポートすると通常のベクターレイヤーとして編集可能
3. 必要な編集を加えた後、最適化してSVGとして書き出せる

この基本的な流れを押さえておけば、AIで生成したSVGを編集する効率があがります。一般的な技術記事作成、勉強会の資料作成などで活用できそうです。オンラインで作業できるので、出先の環境でも作業できそうです。

## 参考リンク

- [Figma: Working with SVG](https://help.figma.com/hc/en-us/articles/360040028114-Guide-to-SVGs-in-Figma)
- [Figma: Import files](https://help.figma.com/hc/en-us/articles/360041003114)
- [デザインファイルへの画像と動画の追加](https://help.figma.com/hc/ja/articles/360040028034-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%B8%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%A8%E5%8B%95%E7%94%BB%E3%81%AE%E8%BF%BD%E5%8A%A0)
NFCを使ってみる

# はじめに
今回は、FeliCa Lite-Sのセキュリティ（メッセージ認証）を使用してみました。
カードを認証する内部認証を行ってみました。

FeliCa Lite-S ユーザーズマニュアル
5.4.1 内部認証


# 使用機器
PN5180 NFC RFセンサーモジュール
FeliCa Lite-S RC-S966


# 準備
セキュリティを使用するために鍵を準備します。
今回の動作確認では、下記の鍵を使用しました。

|鍵|値|
|:---|:---|
|CK1|0xAB 0xE6 0xF4 0xE3 0x92 0xEC 0x58 0xB9|
|CK2|0xD5 0x34 0x5D 0x3D 0xA2 0x8C 0x75 0x15|

Writeコマンドを使用して事前に鍵を書き込んでおく必要があります。
※鍵は1度書き込みを行えば電源をオフしても記憶されています。


# 手順
手順1\. ランダムチャレンジ（RC1、RC2）を書き込みます。
手順2\. ID、CKV、MAC_Aを同時に読み出します。
手順3\. MACを計算して、読み出したMAC_Aと比較します。

FeliCa Lite-Sでのメッセージ認証ではセッション鍵を使用します。
セッション鍵は、鍵（CK1、CK2）とランダムチャレンジ（RC1、RC2）から作られます。

動作確認のためランダムチャレンジの値を固定値としました。
※ランダムチャレンジの値は、電源がオフされると消えてしまいます。

|ランダムチャレンジ|値|
|:---|:---|
|RC1|0x40 0x49 0x54 0xF4 0x0B 0xEA 0xA8 0xA8|
|RC2|0x16 0x0E 0xFD 0x98 0xA4 0x89 0x04 0x16|

鍵とランダムチャレンジから生成されるセッション鍵（SK1、SK2）は下記となります。

|セッション鍵|値|
|:---|:---|
|SK1|0x02 0x47 0x1A 0xD7 0x51 0xCD 0x00 0x25|
|SK2|0xD1 0x07 0xAC 0x7C 0xBB 0xB8 0x43 0x45|

セッション鍵の生成方法は、
FeliCa Lite-S ユーザーズマニュアル
5.1.1 読み出し時のMAC生成方法
となります。

:::note info
セッション鍵について
鍵とランダムチャレンジから作成したセッション鍵はパリティが合っていません。パリティの設定は合っていませんがMACは正しく生成されます。DESの計算過程でパリティビットは取り除かれるためだと思われます。
:::

ここまでで、鍵の準備ができました。
鍵の準備ができたので内部認証を行います。

内部認証は、FeliCa Lite-SからIDとCKVとMAC_Aを読み出して、FeliCa Lite-Sから読み出したMACと、自分で算出したMACが一致することで認証となります。

今回の動作確認で使用したFeliCa Lite-SのIDです。
|ID|値|
|:---|:---|
|ID|0x01 0x2E 0x50 0xE7 0xDA 0xC7 0x8B 0x47|

カード鍵バージョン（CKV）は
0x00
としています。

ランダムチャレンジ（RC1）とセッション鍵（SK1、SK2）と受信データから生成したMACは下記になります。

|MAC|値|
|:---|:---|
|MAC|0x68 0x1B 0x71 0xBD 0x41 0xC5 0x03 0x01|

FeliCa Lite-Sから取得したMAC_Aの値と一致すれば内部認証が完了となります。

MACの生成方法は、
FeliCa Lite-S ユーザーズマニュアル
5.2.1 読み出し時のMAC生成方法
となります。

:::note info
MACの生成について
MACを生成するときは、受信データを使用しますが、MAC_Aの受信データは使用しません。
MACを生成する際にブロック番号を使用しますが、こちらについては、MAC_Aのブロック番号も使用します。
:::

今回は、IDとCKVとMAC_Aを読み出したので、MACを生成するのに使用するブロック番号は
0x82 0x00 0x86 0x00 0x91 0x00 0xFF 0xFF
となります。

MACの生成にMAC_Aの受信データは使用しないので、MACの生成にはIDとCKVの受信データを使用します。今回の場合は、

IDの受信データ
0x01 0x2E 0x50 0xE7 0xDA 0xC7 0x8B 0x47
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

CKVの受信データ
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

となります。

![mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/d8c8e57f-e3cf-e8e6-325f-af31589b9fe0.png)

# 編集後記
次回は、MACつき書き込みを行ってみたいと思います。
OpenSearchが"Not yet initialized"などのエラーによって起動しなかった時の汎用的でない対処法

先日OpenSearchの勉強のため、公式のGettingStartedに従ってdocker-composeを使用して起動しようとしたところ、表題のようなエラーが出力され起動しませんでした。一通り試した結果、起動に成功したので記録を残しておきます。
最初に記載しておきますが、**大抵の場合はこの記事のような状況にならないと思います。**

# 環境
* M2 macbook air(sonoma 14.4.1)
* Docker Desktop 4.19.0

# 発生したエラー
OpenSearchを以下のドキュメントに乗っ取って起動しようとしたところ、APIがEmpty Responseを返し、またWebUIは`OpenSearch Dashboards server is not ready yet`というエラーを表示した。
* https://opensearch.org/docs/latest/getting-started/quickstart/

コンテナのログを読むと、nodeコンテナが以下のようなエラーを出力していた。
```
Not yet initialized (you may need to run securityadmin)
```
```
Failure no such index [.opendistro_security] retrieving configuration for [ACTIONGROUPS, ALLOWLIST, AUDIT, CONFIG, INTERNALUSERS, NODESDN, ROLES, ROLESMAPPING, TENANTS, WHITELIST] (index=.opendistro_security)
```
```
FORBIDDEN/10/cluster create-index blocked
```

これらのエラーについて検索するも、自分の状況によくハマる情報が得られなかった。色々issueやコミュニティの投稿がヒットするも、議論が中断していたり自己解決したりしているケースばかりなので、よくあるトラブルで解決策が確立されている類の問題ではないと判断して、自分のローカル環境の問題を疑い始める。
起動に使用したdocker-compose.yamlファイルは公式が提供しているものそのままで、特に設定の変更などはしていない。しかし、公式の手順にあるswap offやカーネルパラメータの変更は、mac上で実施した場合何が起きるかわからないので避けた(メインマシンで他の用途にも使用するので、動作がおかしくなった時の影響が大きかった)。

# 原因
コンテナ起動直後の最初の方のログを改めてよく読んだところ、空きディスクが少ないというエラーが一行だけ出ていた。これをもとに、docker desktopのリソース使用状況を見ると、割り当てディスク64GBに対し空き容量が2.2GBだけだった。
不要なイメージなどの削除を行い、空き容量を12.44GBまで回復させ、またメモリ割当量も8GB->16GBに変更したところ、OpenSearchの起動に成功した。その際のメモリ使用量は14.14GBだったので、ディスク容量の不足に加え、メモリ不足も影響していた可能性がある。

# 結論
OpenSearchはディスク容量およびメモリを大きく消費するので、起動時には十分な割り当てを確保しておく必要がある。しかし公式にはどのくらいの容量をメモリとディスクを確保しておけばいいか記載がないので、割り当てリソース量が少ない環境でエラーが発生した場合は、リソースの使用量にも留意する必要がある。

# 参考資料
* https://opensearch.org/docs/latest/getting-started/quickstart/
* https://dev.classmethod.jp/articles/how-to-build-opensearch212-with-docker/
* https://stackoverflow.com/questions/40736462/aws-elasticsearchservice-index-create-block-exception
Supabase 内の PostgreSQL を Prisma で reset した後に実行する SQL


## はじめに

Supabase 内の PostgreSQL に対して `npx prisma migrate reset` 等でデータベースを作成したのち、
`@supabase/supabase-js` 等でデータアクセスすると `permission denied for schema public` のエラーが返却される場合ことあります。

Prisma でスキーマを管理している場合、`@supabase/supabase-js`でアクセスすることは本来ありませんが、検証のため実行したところエラーとなったので実行できるように修正する方法をまとめた。

## 実行する SQL

Supabase のドキュメントには、 `public` 以外のスキーマを利用する方法が記載されています。

下記ドキュメントには新たに、 `myschema` を作成した場合を例に記載されているので `myschema` を `piblic` に置き換えて実行すれば OK です。

[Using Custom Schemas | Supabase Docs](https://supabase.com/docs/guides/api/using-custom-schemas?queryGroups=language&language=javascript)

```sql
GRANT USAGE ON SCHEMA "public" TO anon, authenticated, service_role;
GRANT ALL ON ALL TABLES IN SCHEMA "public TO anon, authenticated, service_role;
GRANT ALL ON ALL ROUTINES IN SCHEMA "public TO anon, authenticated, service_role;
GRANT ALL ON ALL SEQUENCES IN SCHEMA "public TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA "public" GRANT ALL ON TABLES TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA "public" GRANT ALL ON ROUTINES TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA "public" GRANT ALL ON SEQUENCES TO anon, authenticated, service_role;
```

手っ取り早く実行したいなら以下2SQLだけでも可能です。

```sql
GRANT USAGE ON SCHEMA "public" TO authenticated, anon, service_role;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA "public" TO authenticated, anon, service_role;
```

## Ref

https://stackoverflow.com/questions/67551593/supabase-client-permission-denied-for-schema-public

https://supabase.com/docs/guides/api/using-custom-schemas
【kaggle】翻訳記事まとめ【備忘翻訳】

# はじめに
当記事はkaggleの[Learn](https://www.kaggle.com/learn)のページを備忘として翻訳したもののまとめのページです。
python等のコーディング的な要素をまとめる予定はありません。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

# 目次

## [機械学習イントロ](https://www.kaggle.com/learn/intro-to-machine-learning)
1. [【kaggle】機械学習イントロ - どのようにモデルは動くか【備忘翻訳】](https://qiita.com/leafeon00000/items/9d49816faf54c68edde3)
1. [【kaggle】機械学習イントロ - 基本的データ探索【備忘翻訳】](https://qiita.com/leafeon00000/private/c3138d1b3a895eff2895)
1. [【kaggle】機械学習イントロ - 初めての機械学習モデル【備忘翻訳】](https://qiita.com/leafeon00000/private/bb99d554f573d629d215)
1. [【kaggle】機械学習イントロ - モデルの検証【備忘翻訳】](https://qiita.com/leafeon00000/private/1672eb0d2e453eca883e)
1. [【kaggle】機械学習イントロ - 過少学習と過剰学習【備忘翻訳】](https://qiita.com/leafeon00000/private/bd6ab62c785306ed1357)
1. [【kaggle】機械学習イントロ - ランダムフォレスト【備忘翻訳】](https://qiita.com/leafeon00000/private/424f21de7a0685d08914)

## [中級機械学習](https://www.kaggle.com/learn/intermediate-machine-learning)
1. [【kaggle】中級機械学習 - 欠損値【備忘翻訳】](https://qiita.com/leafeon00000/private/4aba0d19685929546855)
1. [【kaggle】中級機械学習 - カテゴリ変数【備忘翻訳】](https://qiita.com/leafeon00000/private/e23aca220cb83168db4f)
1. [【kaggle】中級機械学習 - パイプライン【備忘翻訳】](https://qiita.com/leafeon00000/private/5c7f854304a19b9b6de3)
1. [【kaggle】中級機械学習 - 交差検証【備忘翻訳】](https://qiita.com/leafeon00000/private/d33102acb7784c6ba1e3)
1. [【kaggle】中級機械学習 - XGBoost【備忘翻訳】](https://qiita.com/leafeon00000/private/334e84e10e0aaccc02ea)
1. [【kaggle】中級機械学習 - データリーク【備忘翻訳】](https://qiita.com/leafeon00000/private/5745f0a4678469cd8dca)

## [データの視覚化](https://www.kaggle.com/learn/data-visualization)
1. [【kaggle】データの視覚化 - Hello, Seaborn【備忘翻訳】](https://qiita.com/leafeon00000/private/6ba7222a787332d6130c)
1. [【kaggle】データの視覚化 - 折れ線グラフ【備忘翻訳】](https://qiita.com/leafeon00000/private/6ff5e946e56cc42803e0)
1. [【kaggle】データの視覚化 - 棒グラフとヒートマップ【備忘翻訳】](https://qiita.com/leafeon00000/private/3a2a9c28a305553f8a67)
1. [【kaggle】データの視覚化 - 散布図【備忘翻訳】](https://qiita.com/leafeon00000/private/29919ba816acb560e574)
1. [【kaggle】データの視覚化 - 分布【備忘翻訳】](https://qiita.com/leafeon00000/private/6b8fc35f21e15beefde7)
1. [【kaggle】データの視覚化 - プロットタイプとカスタムスタイルの設定【備忘翻訳】](https://qiita.com/leafeon00000/items/543b7252f7a0c80fed94)

## [特徴量エンジニアリング](https://www.kaggle.com/learn/feature-engineering)
1. [【kaggle】特徴量エンジニアリング - 特徴量エンジニアリングとは【備忘翻訳】](https://qiita.com/leafeon00000/items/fcdac31f1e1a22d88d15)
1. [【kaggle】特徴量エンジニアリング - 相互情報量【備忘翻訳】](https://qiita.com/leafeon00000/items/e6793703b4f4db8f4ecb)
1. [【kaggle】特徴量エンジニアリング - 特徴量の作成【備忘翻訳】](https://qiita.com/leafeon00000/items/3dad3a7096ce6500694e)
1. [【kaggle】特徴量エンジニアリング - K平均法によるクラスタリング【備忘翻訳】](https://qiita.com/leafeon00000/private/bbdeb3d2adc9a0afaf2f)
1. [【kaggle】特徴量エンジニアリング - 主成分分析【備忘翻訳】](https://qiita.com/leafeon00000/private/8f35535b71e326ead856)
1. [【kaggle】特徴量エンジニアリング - ターゲットエンコーディング【備忘翻訳】](https://qiita.com/leafeon00000/private/352ea1ba7f7cbfee83ad)
rails: 備忘録

## postgresql のデータベースホストに関する 環境変数は DB_HOST ではなく　"PGHOST" である。

<pre>
$ export PGHOST="hogehoge"
</pre>

とすべし。　 .env に至っても同様。
ただし、config/database.yml では ただの "host" である。
そもそも sqlite3 だけで十分だという話になってはいるが・・・
postgresqlでの　DBでスタートする際は、 ほとんど記事がなく、これも
偶然探り当てたもの。意外にハマるのであった。

以上
AWS IAM Access Analyzerメモ

AWS IAM Access Analyzerは、AWS Identity and Access Management（IAM）が提供するセキュリティツールで、AWS環境内のアクセス許可に関するリスクや潜在的な問題を可視化するためのものです。特に、外部や他のAWSアカウントからのアクセスが許可されているリソースを検出し、不適切な公開設定やアクセス許可を管理するのに役立ちます。

### AWS IAM Access Analyzerの主な機能
1. **外部アクセスの検出**: アクセスアナライザーは、S3バケット、IAMロール、KMSキー、Lambda関数、SQSキューなどが外部からアクセス可能になっているかを自動的に分析します。
2. **アクセスパスの分析**: すべてのリソースに対するポリシー（リソースベースポリシー）を調べ、予期しない公開設定や潜在的なセキュリティリスクを特定します。
3. **リアルタイムモニタリング**: リソースのアクセス許可が変更されると、自動的に新しい分析が実行されるため、常に最新のセキュリティ状況を把握できます。
4. **詳細なフィードバックと修正**: アクセスアナライザーは、不適切なアクセスが検出された場合に具体的な修正案を提供し、IAMポリシーやアクセス許可設定を見直す際の参考になります。
5. **分析レポートの生成**: アクセス分析結果をエクスポートして、セキュリティ監査やコンプライアンス対応のために使用できます。

### 利用シーンとメリット
- **セキュリティの強化**: 知らないうちに外部からのアクセスが許可されているリソースを見つけ出し、アクセス制御を適切に調整できます。
- **コンプライアンス対応**: 誰がどのリソースにアクセスできるのかを確認できるため、規制や業界標準に合わせたセキュリティ対策を講じやすくなります。
- **効率的なアクセス管理**: 手動でポリシーをレビューする手間を減らし、自動でリスクや公開設定を発見することで、運用効率を向上させます。

AWS IAM Access Analyzerを使用することで、AWSリソースに対するアクセスを一貫して監視し、セキュアでコンプライアンスに準拠した環境を維持しやすくなります。
[VBA]Outlookで受信したメールから添付ファイルを保存する

## 受信データについている添付ファイルを保存したい
毎日大量に来るメールの添付データを簡単に保存したい。
そんなときにはOutlookでVBAを動かすとめちゃ楽に保存できます。
電子帳簿保存法対応にも便利！！

https://indoor-nekura.work/vba_tenpufile/
[git入門]個人開発者向け

<h1>git操作の基礎</h1>
個人開発をしているとなかなかgitの知識が身に付かないと悩んでいた僕が、チーム開発未経験でもgitを扱えるようになるためにgit操作を解説していきます。  
<br>今回はgit操作の基礎中の基礎であるコミット、プッシュ、プルリク、マージについて説明していきます。

<h2>1.「コミット」と「コミット＆プッシュ」の違いについて</h2>
「コミット」だけの場合と「コミット＆プッシュ」の違いに気づかず使ってました。そのレベルだった当時の自分に教えてあげるつもりで優しく説明していきます。

それを説明する前にgithubのリポジトリについて解説していきます。

リポジトリには大きく分けて二つあり、
・リモートリポジトリ
・ローカルリポジトリ
があります。

リモートリポジトリ：githubなどサーバー上にあるリポジトリのこと。他の人と共有したりできる。
ローカルリポジトリ：個人のPC上にあるリポジトリのこと。

<h3>コミットのみの場合</h3>
ローカルリポジトリに変更内容を反映させる。

<h3>コミット＆プッシュ</h3>
ローカルとリモートどちらにも変更を反映させる。
<br>ただしローカルの変更がコミットされていないとプッシュできない。

<h3>プルリクエスト(以下プルリク)</h3>
プルリクは新機能を追加したい時やバグの修正を行いたい時に行われます。
<br>例えば上司から既存のシステムに新機能を追加するよう指示されたとします。その際、直接本番データに書き込むわけには行かないので一旦新たにブランチを作成します。
そのブランチに変更を書き込んで行くわけですが、書き込んでコミット＆プッシュを行ったあと上司のチェックを受けなければなりません。
<br>そのチェックを要請することを「プルリクエスト」と言います。
プルリクが行われたら他のメンバーが変更を確認し、コメントや変更をリクエストできます。

<h3>マージ</h3>
ブランチを統合すること。
通常
<br>ブランチ作成→変更実装→変更を受け入れ→統合　　　　　　　　
の流れとなります。

<h3>まとめ</h3>
今回はgitの基本的な操作の意味を解説してきました。これらを把握して使えるようになれば個人開発でも十分力を発揮すると思います。
<br>お役に立てたら幸いです。
AWS STS (Security Token Service)メモ

AWS STS (Security Token Service) は、AWS（Amazon Web Services）が提供する一時的な権限付きの認証情報を生成するサービスです。このサービスを使用することで、長期的な認証情報を作成せずに、安全にAWSリソースへの一時的なアクセスを許可できます。

### AWS STSの主な特徴
1. **一時的な認証情報**: STSは、アクセスキーID、シークレットアクセスキー、セッショントークンなどを含む短期間のトークンを提供します。これらは最長12時間で期限切れになります。
2. **ロールベースのアクセス**: STSを使用してIAMロールを引き受けることができ、認証情報を直接共有せずにAWSリソースに安全にアクセスできます。
3. **フェデレーション**: STSはIDフェデレーションをサポートしており、外部IDプロバイダー（例: 企業のディレクトリやソーシャルメディアアカウント）からのユーザーがAWSサービスにアクセスできるようにします。
4. **クロスアカウントアクセス**: STSは複数のAWSアカウント間でのセキュアなアクセス（クロスアカウントロール）も可能にします。

### 主なSTS API
- **AssumeRole**: IAMロールを使用して一時的な認証情報を取得し、AWSリソースにアクセスできます。
- **AssumeRoleWithWebIdentity**: 外部のIDプロバイダーで認証されたユーザー向けに、AssumeRoleと同様の機能を提供します。
- **AssumeRoleWithSAML**: SAMLベースのIDプロバイダーを通じて一時的なアクセスを許可します。
- **GetFederationToken**: AWSアカウント内のフェデレートユーザー向けに一時的な認証情報を生成します。
- **GetSessionToken**: IAMユーザーまたはAWSアカウントのルートユーザー向けに一時的な認証情報を取得します。

AWS STSは、安全かつスケーラブルに一時的なアクセスを提供するための重要なサービスであり、長期的な認証情報を共有することなくAWSリソースへのアクセスを可能にします。
### 処理フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/ddeac5ac-04fd-8255-f310-448441c8efcc.png)
boundaryで分けて見やすくする

>multipart/form-data
multipart/form-data タイプは、入力済みの HTML フォーム の内容をブラウザーからサーバーに送信するときに使用することができます。
>
>これはマルチパート文書形式として複数の部分から成り、`境界（二重ダッシュ -- で始まる文字列）によって区切られます`。 それぞれの部分は固有のエンティティであり、`固有の HTTP ヘッダーとして Content-Disposition やファイルアップロードのフィールドには Content-Type` を持ちます。
* 境界（二重ダッシュ -- で始まる文字列）によって区切られます
* 固有のエンティティとは？

`境界（二重ダッシュ -- で始まる文字列）によって区切られます`。 それぞれの部分は固有のエンティティであり`と書いてあるのでContent-DispositionやContent-Typeを指しているのだろう

* 固有の HTTP ヘッダーとして Content-Disposition 
* ファイルアップロードのフィールドには Content-Type

>```
>Content-Type: multipart/form-data; boundary=aBoundaryString
>（マルチパート文書全体に関連付けられる、他のヘッダー）
>
>
>--aBoundaryString
>Content-Disposition: form-data; name="myFile"; filename="img.jpg"
>Content-Type: image/jpeg
>
>(データ)
>--aBoundaryString
>Content-Disposition: form-data; name="myField"
>
>(データ)
>--aBoundaryString
>(サブパート)
>--aBoundaryString--
>```
https://developer.mozilla.org/ja/docs/Web/HTTP/MIME_types#:~:text=multipart/form%2Ddata%20%E3%82%BF%E3%82%A4%E3%83%97,aBoundaryString%0A(%E3%82%B5%E3%83%96%E3%83%91%E3%83%BC%E3%83%88)%0A%2D%2DaBoundaryString%2D%2D
# 感想
boundaryは和訳で境界となるので複数のデータを分けるための目印になる
Fortigate 機器を SNMP で監視する際に利用できる OID

## はじめに

Fortigate 機器を SNMP で監視する際の方法と、利用できる OID の備忘録です。

## 探し方

Fortigate 機器に限りませんが、ベンダから MIB ファイルを取得、その MIB ファイルを文字列検索していい感じの OID を探します。

今回はリソース監視をしたかったので cpu, memory 等で検索。

このツリー以下の OID が有用そうでした。

https://oidref.com/1.3.6.1.4.1.12356.101.4.1

fgSysCpuUsage, fgSysMemUsage 辺りを使えばよさそうです。

https://oidref.com/1.3.6.1.4.1.12356.101.4.1.3.0#google_vignette

値は、範囲 0 ~ 100 の GAUGE の値として定義されています。

```
Gauge32 (0..100)
```

対象の値はスカラ値なので、最後に `.0` を付与するようにしてください。

これは、この OID ノードがテーブルでなく、スカラ値であることを示すものです。これを付与しないと値が正常に取得できない場合があります。

## 監視設定

監視ソフトウェアに設定を行い、監視を実施します。

X-MON であれば、cpu や memory の OID (GAUGE の値) は「SNMP監視>SNMP絶対値監視(1軸)」にて監視することができます。

TRAFFIC は、 「Linux/Unit系リソース監視>TRAFFIC監視」を利用できます。インターフェースに対応した OID Index の特定が必要です。

## 余談

今だと、 ChatGPT に「Fortigate を監視するにおいて有用な oid を教えてください」と質問するだけで監視項目のピックアップできそうな気がします。というかできました。
コンテナ内で作成したファイル移動時のエラー対処法

ホストがUbuntuで、コンテナ内でバウンドマウント先に生成されたファイルを書き換え、移動しようとした際に`Error: EACCES: permission denied, ...`のようなエラーが出た際の対処法。

ホスト：Ubuntu
作業ディレクトリ：`workspace/hogehoge`

workspaceディレクトリに移動したあと、`sudo chown -R $USER:$USER hogehoge`を実行する。

現在のディレクトリ全体に適応する場合は、`sudo chown -R $USER:$USER .`とする。
【kaggle】機械学習イントロ - どのようにモデルは動くか【備忘翻訳】

# はじめに
当記事はkaggleのLearnの[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning)の[How Models Work](https://www.kaggle.com/code/dansbecker/how-models-work)を翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

まとめ:[【kaggle】翻訳記事まとめ【備忘翻訳】](https://qiita.com/leafeon00000/items/71e57af5b2d9b0b7c846)
次:[【kaggle】機械学習イントロ - 基本的なデータ探索【備忘翻訳】](https://qiita.com/leafeon00000/private/c3138d1b3a895eff2895)

----

# どのようにモデルは動くのか

## 導入
機械学習とその使い方について説明します。以前に統計モデリングや機械学習を扱ったことがある場合は基本的なことに感じるかもしれません。すぐに強力なモデルの構築に進みますので、心配しないでください。

このコースでは次のようなシナリオに沿ってモデルを構築していきます：

あなたのいとこは不動産投機で何百万ドルも儲けました。彼はあなたがデータサイエンスに興味を持っていることから、あなたとビジネスパートナーになることを提案してきました。彼は資産を提供します。あなたは様々な家の価値を予測するモデルを提供します。

あなたはいとこに、どうやってこれまで不動産価値を予測してきたのかを尋ねると、単に直感だと答えます。しかし、さらに質問していくと、彼は過去に見た家の価格パターンを特定し、そのパターンを使って検討中の新しい家の価格を予測していることが分かった。

機械学習も同じように機能します。まずは決定木と呼ばれるモデルから始めましょう。決定木よりも正確な予測を出す高度なモデルもありますが、決定木は理解しやすくデータサイエンスにおける最も優れたモデルの基本的な一つとなっています。

簡単にするため、できるだけ単純な決定木から始めます。
![7tsb5b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/7073c667-1f27-84fe-5ba1-cfd942b2b802.png)

家は２つのカテゴリにのみ分類されます。検討中の住宅の予測価格は同じカテゴリの過去の平均価格です。

データを使用して、家を2つのグループに分ける方法を決定し、それによって各グループの予測価格を決定します。データからパターンをキャプチャするこのステップは、モデルの**フィッティング**または、**トレーニング**といいます。モデルのフィッティングに利用したデータを**トレーニングデータ**といいます。

モデルの最適化方法の詳細（データの分割方法など）は非常に複雑なので後ほど説明します。モデルのフィッティングが完了したら、新しいデータに適用して追加の家の価格予測ができます。

---

## 決定木の改善
次の2つの決定木のうち、不動産トレーニングデータを最適化させた結果、どちらがより現実に即しているでしょうか？
![prAjgku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/b75cc5c3-dbc0-06a3-bcc5-356ec4662b3d.png)

左の決定木は寝室の数が多い家は少ない家よりも高価で売れる傾向があるという現実をとらえているため、理にかなっています。この決定木の最大の欠点はバスルームの数、敷地面積、場所などの住宅価格に影響を与えるほとんどの要因をとらえていないことです。

より多くの「節点」を持つ決定木を使用することで、より多くの要因を補足することができます。より多くの節点を持つ決定木は「**深い**」ツリーと呼ばれます。各家の敷地の合計サイズも考慮した決定木は次のようになります。
![R3ywQsR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/c70e666e-75b2-c546-646d-86fbf4056129.png)
決定木をたどり、その家の特徴に対応する経路を選択することで、家の価格を予想します。家の価格を示すツリーは一番下に当たります。予測を行う一番のポイントは **葉（端点）** と呼ばれます。

葉の分割と値はデータによって決定されます。

次回は実際にデータを確認しながら見ていきます。
三項演算子の書き方

三項演算子は if-then-else の式バージョンである。

if-then-else なら入れ子の場合、
``` javascript
if (条件A) {
    (条件Aが真の場合)
}
else {
    if (条件B) {
        (条件Bが真の場合)
    }
    else {
        (その他の場合)
    }
}
```
などと書かずに
``` javascript
if (条件A) {
    (条件Aが真の場合)
}
else if (条件B) {
    (条件Bが真の場合)
}
else {
    (その他の場合)
}
```
と書く。

ならば三項演算子でも
``` javascript
rv = (条件A) ? (条件Aが真の場合)
   : (条件B) ? (条件Bが真の場合)
   : (その他の場合); 
```
と書けばいい話である。

これが判っていないから「三項演算子禁止論」なんてものが出てくるのだ。(優先順位のバグでこう書けない壊れた言語PHPや、これを崩してしまう頭の悪いフォーマッタのせいでもあるだろうが)
【Android】ComposeでON_PAUSEで発火するイベントを設定する

## はじめに
ActivityやFragmentでは、onPauseやonResume等の関数をオーバーライドしてあげれば、Androidのライフサイクルで発火するイベントを設定できます。
Composeで作った画面でもAndroidのライフサイクルを監視してイベント発火するに「LifecycleEventObserver」を使って設定可能なようです。
今回はComposeでAndroidのライフサイクルであるON_PAUSEを監視し、イベントを設定する方法をまとめていきたいと思います。

## ComposeでON_PAUSEで発火するイベントを設定する
サンプルコードは以下になります。
``` sample.kt
@Composable
fun MyComposable() {
    // Composeが所属するライフサイクルオーナ-を取得
    val lifecycleOwner = LocalLifecycleOwner.current

    // DisposableEffectを使用して副作用を設定
    DisposableEffect(lifecycleOwner) { 
        // EventObserverを設定し、ライフサイクルのイベントを監視・イベントを設定
        val observer = LifecycleEventObserver { _, event ->
            if (event == Lifecycle.Event.ON_PAUSE ) {
                // ここにON_PAUSEで発火するイベントを設定
            }
        }

        // 作成した監視・イベントの設定をライフサイクルオーナーに紐付ける
        lifecycleOwner.lifecycle.addObserver(observer)

        // ライフサイクルオーナーが変化した時、または、Composeが破棄される時に、紐付けたイベントを解除する
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}
```

ポイントは、DisposableEffectのキーとしてlifecycleOwnerを指定している点になります。
キーにlifecycleOwnerを指定することで、ライフサイクルの再生成（Acitivityの再生成）があれば再度中身の処理を実行するようになります。
今回は中身の処理で監視・イベントの定義、ライフサイクルへの紐付けを行っているため、ライフサイクルが再生成されたら、新しいライフサイクルへ監視・イベントを紐付けるように動かすようになっています。

また、onDisposeとしてライフサイクルオーナーからイベントを削除するクリーンアップ処理を書いているので、
不要なイベントを解放してメモリリークに繋がらないようにしています。
CFデプロイ時に発生するWarningの原因

## はじめに
皆さま、お疲れ様です。
SAP BTP環境へのデプロイ時に、毎回同じ警告（WARRING）が発生する問題が確認されました。
デプロイは非常に重要なプロセスですので、この不安を解消するため、調査結果をまとめました。

## 発生している問題
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/61c03ddc-fb2a-0952-6992-8c0abbab44b9.png" >

## 当時の環境
1. CF CLI v7

## 結論
CF CLIは最新バージョンへの移行が推奨されており、v7の利用中にこのエラーが発生するのは、互換性やサポート期限に関する影響が考えられます。
私の場合、v8へアップグレードすることでこの問題が解消されました。

◆CLIバージョン
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/0fabbf3c-e090-50e8-f145-569a0243fda3.png" width=95%>
※ 調査時は8月頃でしたが、記事投稿時にはv7のサポートが終了している可能性があります。

## 注意点
v7からv8への移行に際しては、いくつかのコマンドが変更されているため、アップグレード後に以下のコマンドで確認することをお勧めします。
```
cf --help
```

## 最後に
この記事では、CF CLIのv7からv8へのアップグレードにより、この問題が解消されることが確認できました。
移行に伴うコマンド変更への対応として、アップグレード後はcf --helpコマンドを使用して確認することが推奨されます。
適切なバージョンのCLIを使用することで、システムの安定性とセキュリティが向上し、運用の不安を減らすことができます。

この記事が、皆さまのデプロイ作業やSAP BTP環境の保守において、少しでもお役に立てば幸いです。

## 参考サイト
1. [CF CLI v8 インストールと特徴](https://github.com/cloudfoundry/cli/wiki/Versioning-and-Support-Policy)
v8の新機能やインストール方法、API互換性に関する詳細が記載されています。
2. [CF CLI v7とv8のサポートとポリシー](https://github.com/cloudfoundry/cli/wiki/V8-CLI-Installation-Guide)
v7からv8への移行推奨やサポート期限の方針について解説しています。
3. [CF CLI v8の主な改善点](https://docs.developer.swisscom.com/cf-cli/v8.html)
v8へのアップグレードで導入された非同期処理、セキュリティ強化（MFA）、パフォーマンス向上などについての説明が記載されています。
【Git】最新commit内容から修正をした内容のリセットについて

### 本記事の内容
最新commit内容から修正をした内容をリセットして
修正をする前の状態に戻りたいときのコマンドについて

### どのようなケースで使うか
図のような状況とします。
 - push対象のbranch(main)から新規ブランチ(new_branch)を作成
 - そのnew_branchの中で1の内容を修正や新規ファイルを追加をして2の内容にする
 - 修正や新規ファイルを追加するにつれ、エラーなどにより1の内容に戻したくなった
![スクリーンショット 2024-11-04 12.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/cd2b2b9c-f2bf-fbec-c7f1-7debe11d62ab.png)

### 追跡中ファイルの更新内容をリセットする & 追跡されていないファイルの変更内容をリセットする
下記の手順で1の状態に戻れます。

#### 追跡中のファイルの更新内容のリセット
追跡中のファイルの更新内容をリセットします
```
git checkout -- .
```

ファイル単位の指定もできます
例えば`config/routes.rb`のみ更新内容をリセットしたい場合
```
(例) git checkout -- config/routes.rb
```

#### 追跡されていないファイルの変更内容をリセットする
新規追加したファイルはステージングしていない場合はuntrackedとして扱われているので`git clean`で変更内容を削除します
```
git clean -df
```

※ mainブランチに戻ればいいのではないか？と思ったのですが
untracked（追跡されていない）のファイルの内容がmainブランチに移った時にも反映されたまま のため、1の状態に戻りきりませんでした
Kotlin coroutine Intellij Idea dependencies

build.gradle.ktsファイルのplugins、dependencies内に設定するバージョン数は、下記サイトで最新のバージョン数を確認し設定する
https://github.com/Kotlin/kotlinx.coroutines?tab=readme-ov-file#gradle

※dependencies内に設定するバージョン数は、kotlinのバージョン数と同じにすれば良いわけではなく、下記サイトで設定できるバージョン数を確認し設定する
https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core

build.gradle.ktsファイルを変更した後、画面右上の[Gradleの変更を読み込む]アイコンをクリックして更新する
ショートカットキーは、Ctrl + Shift + O

``` build.gradle.kts 一部抜粋
plugins {
    kotlin("jvm") version "2.0.0"
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}
```

以下設定例
Intellij Ideaバージョン 2022.3.3を使用
``` build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "2.0.0"
    application
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClass.set("MainKt")
}
```

``` Main.kt
import kotlinx.coroutines.*

suspend fun main() = coroutineScope {
    launch {
        delay(1000)
        println("Kotlin Coroutines World!")
    }
    println("Hello")
}
```
javascript: URLとは？

>警告: `ウェブ上でjavascript: URL を使用することは推奨されていません`。これは、eval()を使用することによる影響と同様に、`任意のコードが実行される可能性があるため`です。また、通常のリンク動作とは異なるため、`アクセシビリティが縮小する可能性`があります。
* ウェブ上でjavascript: URL を使用することは推奨されていません
* アクセシビリティが縮小する可能性
* evalと同様の影響らしい。
* evalとは？

>JavaScript URL、つまり javascript: スキームを接頭辞とする URL は、ブラウザーがナビゲートしようとした際に `JavaScriptを実行する擬似的なナビゲーション対象として使用`されます。 `URL が文字列として評価された場合、HTML` として扱われ、ブラウザーによってレンダリングされます。
* ブラウザーがナビゲートしようとした際に `JavaScriptを実行する擬似的なナビゲーション対象として使用`とは？

### 構文
>JavaScript URL は `javascript:スキームで始め、JavaScript コードが続きます`。 コードはスクリプトとして解釈されます。
>```js
>javascript:<script>
>```

### 解説
>javascript: URL は、`URLがナビゲーション対象とする場所であればどこでも使用することができます`。これには以下を含めることができますが、これに制限されるものではありません。
* URLがナビゲーション対象とする場所であればどこでも使用することができます

>* ＜a> または <area> 要素の href 属性。
>* ＜form> 要素の action 属性。
>* ＜iframe>要素の src 属性。
>* JavaScript の window.location プロパティ。
>* ブラウザーのアドレスバー自体。

* 上記の箇所で使用できる

### javascript URLの代替案

https://developer.mozilla.org/ja/docs/Web/URI/Schemes/javascript#:~:text=%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E4%BE%8B,document.body.textContent%20%3D%20%22Hello%2C%20world!%22%3B,-%E4%BB%95%E6%A7%98%E6%9B%B8

### evalとは？
https://qiita.com/masatom86650860/items/c6c9a411125f6f05573c

# 感想
ウィンドウのアドレスバーに入力、アクセスするとjavascript:の部分がなくなっている。
エスケープされて使えなくなっている。

理解するにはレベルが高くて断念
ssh キー生成コマンド（個人メモ）

# What

単なる個人メモ。

たまに使うけど、覚えているわけではなくていつも公式ガイドを探しに行っているのも面倒になったので、ここにメモしておく。
passphrase はあった方が良いが、テキトーに遊ぶ分にはなくてもOKという気持ち。

```zsh
ssh-keygen -t ed25519 -f ~/.ssh/[なんかテキトーな任意の名前]
```


# Appendix

ごく稀に公開鍵、秘密鍵の知識がない人もいるので注意したい（実際に出会ったことがあるので怖い）
evalは使わない

>eval() を使わないでください!
直接的な eval() はいくつもの問題を引き起こします。
>
>eval() は`呼び出し元の権限で渡されたコードを実行`します。悪意のある第三者に影響を受ける可能性のある文字列で eval() を実行すると、そのウェブページや拡張機能の権限において、`ユーザーのマシン上で悪意のあるコードを実行してしまう可能性`があります。さらに重要なことに、`サードパーティのコードが eval() が（直接的な eval であれば）呼び出されたスコープを見ることができる`ため、攻撃者がローカル変数を読み取ったり変更したりすることができてしまいます。
* 悪意のあるコードを自分のパソコンの権限で実行してしまい悪さをする
* サードパーティとは？

https://www.ntt-west.co.jp/business/glossary/words-00167.html#:~:text=%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC%E3%81%AB%E3%81%AF%E3%80%8C%E5%BD%93%E4%BA%8B%E8%80%85%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E7%AC%AC%E4%B8%89%E8%80%85%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%8C%E3%81%82%E3%82%8A%E3%80%81%E4%BC%81%E6%A5%AD%E3%82%84%E5%9B%A3%E4%BD%93%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E3%81%84%E8%A8%80%E8%91%89%E3%81%A7%E3%81%99%E3%80%82%0AIT%E6%A5%AD%E7%95%8C%E3%81%A7%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E3%81%8F%E3%80%81%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%8C%E9%96%8B%E7%99%BA%E3%81%97%E3%81%9F%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BBOS%E3%82%84%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%80%81%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E8%A3%BD%E5%93%81%E3%82%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AA%E3%81%A9%E3%82%92%E8%B2%A9%E5%A3%B2%E3%81%99%E3%82%8B%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%92%E3%80%81%E4%B8%80%E8%88%AC%E3%81%AB%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82%0A%0A%E3%81%A4%E3%81%BE%E3%82%8A%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC%E3%81%A8%E3%81%AF%E3%80%81%E4%BB%96%E7%A4%BE%E3%81%AE%E8%A3%BD%E5%93%81%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E8%A3%BD%E5%93%81%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E8%B2%A9%E5%A3%B2%E3%81%99%E3%82%8B%E4%BC%81%E6%A5%AD%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC%E3%81%AE%E3%80%8C%E7%AC%AC%E4%B8%89%E8%80%85%E3%80%8D%E3%81%AB%E3%81%AF%E3%80%81%E6%B6%88%E8%B2%BB%E8%80%85%E3%81%A8%E7%B3%BB%E5%88%97%E4%BC%81%E6%A5%AD%E3%81%AF%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

* サードパーティのコードとは？
>現代の JavaScript では多くの構造が JS エンジンによって最適化されているため、eval() は他の方法よりも低速です。
現代の JavaScript インタープリターは JavaScript を`機械語に変換します。これは、変数の名前の概念がすべて消滅することを意味`します。したがって、eval() を使用すると、ブラウザーは長い高価な変数名検索を実行して、変数が機械語のどこに存在しているかを把握し、その値を設定します。さらに、eval() が変数の型の変更など、その変数に新しい変数をもたらす可能性もあり、生成されたすべての機械語を再評価して補正させられる可能性があります。
スコープが eval() によって推移的に依存されている場合、`ミニファイヤーはミニ化をあきらめます`。そうしないと eval() は実行時に正しい変数を読み込むことができないからです。
eval() や関連のメソッドを使用することで、最適化したり、完全に避けることができる用途はたくさんあります。

* スコープとは？

https://developer.mozilla.org/ja/docs/Glossary/Scope

* インタープリターとは

https://qiita.com/masatom86650860/items/10d5aa870ce6c4a57c8d

# 感想
任意のスクリプトを実行できるから危ないらしいがどういう風に書き変えるのか？
調べても難しかった。
evalは使わないようにしたい

https://www.r3it.com/blog/devils-eval