OmniAICreator/Qiita-1.07M huggingface dataset:
C#でメソッドを呼び出す時に引数を省略可能にしたい


# 1. はじめに
* C#のメソッドで引数を省略しているコードを見かけたので、記載方法を知りたい

# 2. 開発環境
* C#
* .Net 6
* Visual Studio 2022
* Windows 11

# 3. 単一引数の場合
* 引数の後に ```=``` でデフォルト値を指定する
* 値型、参照型のどちらでも使用できる
```C#
public static void MethodOne(int number = 1)
{
    Console.WriteLine(number);
}

public static void Main() 
{
    // 引数を指定する場合
    MethodOne(100);
    // Expected output:
    // 100

    // 引数を省略した場合
    MethodOne();
    // Expected output:
    // 1
}
```

# 4. 複数引数の場合
* 基本的に単一引数と同じ記述になる
```C#
public static void MethodTwo(int number = 1, string name = "DefaultName")
{
    Console.WriteLine($"Number:{number}, Name:{name}");
}

public static void Main() 
{
    // 引数をすべて指定する場合
    MethodTwo(100, "MyName");
    // Expected output:
    // Number:100, Name:MyName

    // 引数すべてを省略した場合
    MethodTwo();
    // Expected output:
    // Number:1, Name:DefaultName

    // 第2引数のみ省略した場合
    MethodTwo(100);
    // Expected output:
    // Number:100, Name:DefaultName
}
```

# 5. default演算子の使用
* C#型の既定値をデフォルト値として定義できる
* 参照型はnullがデフォルトとなる

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/default-values

```C#
public static void MethodDefault(int number = default)
{
    Console.WriteLine(number);
}

public static void Main() 
{
    // 引数を指定する場合
    MethodDefault(100);
    // Expected output:
    // 100

    // 引数を省略した場合
    MethodDefault();
    // Expected output:
    // 0
}
```

# 6. 参考文献

https://yaspage.com/cs-method-optional/
OWASP ZAPのテストをCI/CDに組み込む

## 今回やりたいこと
CI/CD時に、OWASP ZAPという脆弱性診断ツールを利用し、もし警告数などが一定以上の数だったらビルドを失敗させる制御を組み込みたい

## そのためにやること
1. dockerを利用しOWASP ZAPの処理を行うshファイルを作成・追加
2. CI/CD時に参照される特定のymlファイルに、追加されたshファイルを走らせるように追記

僕の現職では、バックエンド側では、CI/CDにAWSのCodePipeline, CodeBuildを利用しています。

その中に、Docker版のOWASP ZAPという脆弱性診断ツールの導入を検討したいと思っています。

CodeBuildでは、`buildspec.yml`といったymlファイルを参照し、問題なければ`AWS ECR`のようなdockerリポジトリにイメージをpushをするようです。

その`buildspec.yml`の中にOWASP ZAPの検証処理を、記述されたshファイルを呼び出す形で組み込みむ想定です。

## 実際に追加するコード
※ファイルの配置場所はいずれもプロジェクトのルートディレクトリを想定しています

```sh:run_owasp_zap_test.sh
#!/bin/bash

# OWASP ZAPで検証したいエンドポイント
ENDPOINT=https://sample.com

# チェック対象のステータスの許容範囲の最大値
MAX_STATUS_ITEM_NUM=13

# 実際の運用時には`WARN-NEW`ではなく`FAIL-NEW`を想定
STATUS="WARN-NEW"

docker pull owasp/zap2docker-stable

echo "Running OWASP ZAP test..."
echo "チェック対象のステータス: $STATUS"
echo "チェック対象のステータス: $STATUS に該当する項目数が $MAX_STATUS_ITEM_NUM 以下の場合はテスト成功とします。"

# 下の`output=`の方だと詳細が出力されない
docker run -t owasp/zap2docker-stable zap-baseline.py -t $ENDPOINT

# `output`にOWASP ZAPのテスト結果を代入
output=$(docker run -t owasp/zap2docker-stable zap-baseline.py -t $ENDPOINT)

# $STATUSの文字列数
STATUS_ITEM_NUM=$(echo "$output" | grep -c $STATUS)

# `STATUS_ITEM_NUM`と`MAX_STATUS_ITEM_NUM`それぞれの数を比較
if [ $STATUS_ITEM_NUM -gt $MAX_STATUS_ITEM_NUM ]; then
    echo "test failed: $STATUS の結果が一定数を超えました: $STATUS_ITEM_NUM 項目"
    echo "処理を終了します"
    exit 1
else
    echo "test passed: $STATUS の結果が許容範囲内でした: $STATUS_ITEM_NUM 項目"
fi

echo "OWASP ZAPのスキャンが正常に完了しました。"
exit 0
```

```yml:buildspec.yml
version: 0.2

# 不要な箇所は省略しています
phases:
    pre_build:
        commands:
            - ~
    build:
        commands:
            - ~
    post_build:
        commands:
            - ~

            # Run OWASP ZAP test
            - ./run_owasp_zap_test.sh
```

ymlファイル上の特定の`phase`の`commands`の箇所でファイルのパスを指定するだけで、そのshスクリプトが動いてくれるようです。

## 参考
[Docker版OWASP ZAPを使用してWebアプリの簡易的な脆弱性診断をしてみた](https://dev.classmethod.jp/articles/easy-vulnerability-diagnosis-of-web-app-with-owasp-zap-on-docker/)
EmacsでもPaste Imageしたい（クリップボードから画像を保存＆Markdown or Orgに貼り付けしたい）

VSCodeの拡張機能の中にPaste Imageがある。
`Ctrl + Alt + v`を入力するだけでクリップボードの画像を保存し、Markdown形式の記述を挿入してくれる。
Web会議が増えたのでスクショ+議事メモなMarkdownを書くのに非常に重宝している。

- [Paste Image](https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image)

正直、VSCodeで十分なところではあるが、非常に便利なのでEmacsのOrg-modeでも使いたくなった。

## MacOSの場合

[この記事](https://qiita.com/Ladicle/items/e7fcacac931a27578aa4)では、pngpasteを呼び出すことでクリップボードの画像を保存＆文書への挿入を行っている。

## Windowsの場合

Windowsには前述のpngpasteはない。pngpasteはないがPowershellはある。

[この記事](https://tsuredurediary.com/archives/windows-clip-board-image-save.html)にクリップボードの画像をデスクトップに保存するPowershellスクリプトの記載があるのでこれをEmacsから呼び出せばよい。
とりあえず、保存場所はカレントディレクトリとし、ファイル名だけ引数にとればいっかと書き換えたスクリプトが以下。

```powershell
Param ($FileName)

Add-Type -AssemblyName System.Windows.Forms

If ([Windows.Forms.Clipboard]::ContainsImage() -eq $True) {
  $Image = [Windows.Forms.Clipboard]::GetImage()
  $FilePath = "."
  $ImagePath = Join-Path $FilePath $FileName
  $Image.Save($ImagePath, [System.Drawing.Imaging.ImageFormat]::Png)
}
```

これをemacsから実行すれば良いので、.elへの記述は以下。ほぼMacOSの記事のパクリ。
スクリプトの置き場は`$Env:HOME/.emacs.d/windows/paste_image.ps1`としている。
// `$Env:HOME`の中に半角スペースが入っていたのが今回一番のはまりポイント

```elisp
;; paste image for Org mode
(with-eval-after-load "Org"
  (defun org-insert-clipboard-image ()
    "Generate png file from a clipboard image and insert a link to current buffer."
    (interactive)
    (let* ((filename (concat "./" (format-time-string "%Y-%m-%d-%H-%M-%S") ".png")))
      (message "Create File %s..." filename)
      (call-process "powershell" nil nil nil "powershell -ExecutionPolicy RemoteSigned -File \"$Env:HOME/.emacs.d/windows/paste_image.ps1\" -FileName " filename)
      (if (file-exists-p filename)
          (insert (concat "[[file:" filename "]]")))
      (org-display-inline-images)))
  (define-key org-mode-map (kbd "C-M-y") 'org-insert-clipboard-image))
```

markdown-modeでも使いたい場合は以下。

```elisp
;; paste image for markdown mode
(with-eval-after-load "markdown-mode"
  (defun markdown-insert-clipboard-image ()
    "Generate png file from a clipboard image and insert a link to current buffer."
    (interactive)
    (let* ((filename (concat "./" (format-time-string "%Y-%m-%d-%H-%M-%S") ".png")))
      (message "Create File %s..." filename)
      (call-process "powershell" nil nil nil "powershell -ExecutionPolicy RemoteSigned -File \"$Env:HOME/.emacs.d/windows/paste_image.ps1\" -FileName " filename)
      (if (file-exists-p filename)
          (insert (concat "![](" filename ")")))
      ))
  (define-key markdown-mode-map (kbd "C-M-y") 'markdown-insert-clipboard-image))
```

もっとエレガントは方法あるぜとご存じな人は教えてください。

## Reference

- [【VSCode】Markdownに画像をペーストする](https://qiita.com/P-man_Brown/items/31a0f1cc8d108b2d88f6)
- [クリップボードの画像を出力するpngpasteコマンドとEmacsの連携 (macOS)](https://qiita.com/Ladicle/items/e7fcacac931a27578aa4)
- [クリップボード上の画像を簡単に保存する方法](https://tsuredurediary.com/archives/windows-clip-board-image-save.html)
C#で文字列の前にある$(ドルマーク)の意味を知りたい

# 1. はじめに
* C#で変数の文字列をセットする時に、たまに```$(ドルマーク)```が先頭にある理由を知りたい

# 2. 開発環境
* C#
* .Net 6
* Visual Studio 2022
* Windows 11

# 3. $(ドルマーク)がある理由
* C#6.0から追加されたString interpolation（文字列補間）を使用するため
* 以下、Microsoft社のHPのサンプルソースコードがわかりやすい

```C#
double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");

double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);

// Expected output:
// Area of the right triangle with legs of 3 and 4 is 6
// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5
```

# 4. 参考文献

https://ict119.com/int_to_string/

https://learn.microsoft.com/ja-jp/dotnet/csharp/tutorials/string-interpolation
せんせー、埋め込み技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、埋め込み技術ってなに？

# 埋め込み技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

埋め込み技術は、まるでおもちゃやアクセサリーを体につける魔法のような技術なんです。

普通のおもちゃやアクセサリーは、手に持ったり首にかけたりするけれど、
埋め込み技術を使うと、それを体に入れることができるんです。

例えば、
特別なお医者さんがちょっとした魔法で、お人形やお花を体に入れてくれるんです。
すると、体の中に素敵なお友達がいっぱいできるんです。

埋め込み技術は、とっても小さなものを体に入れる魔法のような技術なんです。
でも大切なことは、お医者さんがちゃんと体を守って入れてくれることなんです。

これからも埋め込み技術を使って、体の中に素敵なお友達を入れることができるといいですね。
でも、体を大切に思って、いつも元気に過ごすことも大切です。
みんなで一緒に素敵な魔法を楽しみましょう。

# まとめ

埋め込み技術は、まるでおもちゃやアクセサリーを体につける魔法のような技術
せんせー、没入技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、没入技術ってなに？

# 没入技術とは

没入技術は、まるで絵本の世界に入り込むような魔法みたいな技術なんです。

普通の絵本を読むときは、絵やお話しを見ながら楽しみますよね。
でも没入技術を使うと、特別なメガネをかけたり、特別なゲームをすることで、絵本の中に入り込むことができます。

メガネをかけたら、まるで絵本の世界に飛び込んだような感じがするんです。
絵本の中でお友達と一緒に冒険したり、きれいなお花を摘んだりすることができるんです。

絵本の中で遊ぶ時は、普通の絵本以上に楽しさがいっぱいなんです。
自分が主人公になったり、お話しの中で大きな冒険をすることができます。

没入技術は、絵本の中にまるで入り込むような特別な体験ができる魔法のような技術なんです。
これからもたくさんの楽しい経験ができるといいですね。
でも、絵本を読むことも大切にして、想像力をたくさん育てましょう。
みんなで一緒に素敵な絵本の世界を楽しみましょう。

# まとめ

没入技術は、まるで絵本の世界に入り込むような魔法みたいな技術
せんせー、 代替エネルギーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、代替エネルギーってなに？

# 代替エネルギーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

代替エネルギーは、たくさんのお日さまや風や水の力を使って、電気や熱を作る魔法みたいなエネルギーなんです。

普通のエネルギーは、石炭や石油などを使って作るけれど、代替エネルギーは自然の力を使って作ります。

例えば、お日さまの力を使って太陽光発電をすると、たくさんの電気を作ることができます。
お日さまがたくさん輝いている時は元気いっぱいのエネルギーが作れます。

それに、風の力を使って風力発電をすると、風車が回ってたくさんの電気を作ることができます。
風が強い時にはたくさんのエネルギーが作れます。

代替エネルギーは、大切な地球を守るためにも使われんです。
きれいな空気や水を守るためにも、たくさんの人たちが一緒に協力して使っています。

これからも代替エネルギーを使って、地球を元気に守っていきましょう。
みんなが協力して、素敵な未来を作っていきましょう。

# まとめ

代替エネルギーは、たくさんのお日さまや風や水の力を使って、電気や熱を作る魔法みたいなエネルギーです
wheneverを使った指定日時にメール送信をする方法

## はじめに
Railsアプリでデータベースにメールを送りたい日を保存、保存された日にメールを送る方法について初心者なりにまとめました

### 動作環境
Ruby 3.0.1
Rails 6.1.6
whenever 1.0.0
## 実装の流れ
作る順番は以下の通りです。

1. ActionMailerで実際にメールを送る機能を作って実際に送れるか試す（[こちら](URL "https://railsguides.jp/action_mailer_basics.html")を参考に)
2. wheneverを導入（[こちら](URL "hhttps://github.com/javan/whenever")を参考に)
3. １で作ったメール送信機能を実行するメソッドを作る
4. wheneverで3を実行するように書き換える

本記事では３・４の工程についてまとめています

---

下のスクリーンショットが最終的な実装です
1番上の行でメソッドを実行する時間を指定(毎日3.30)
2行目の「runner “中身”」の「中身」が定期的に実行される機能となっています
![スクリーンショット 2023-08-17 23.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3379147/8a059c89-c146-47fe-fd4e-615e54f694e3.png)
この図だとStockpileクラスの.notice_on_checkメソッドが実行されます
つまりnotice_on_checkの定義はStockpileモデルにしています
(Stockpileテーブルにdatetime型を保持してあるのでStockpileモデルに定義しました）

## cronで実行するメソッドの定義
![スクリーンショット 2023-08-17 21.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3379147/e98ab7ac-3513-c186-6d12-59b2def452f4.png)
上のスクリーンショットはcronで実行するnotice_on_checkのメソッド定義です
場所はapp/models/stockpile.rb。つまりモデルの.rbとなっています。

IF文でメールを送る条件が正ならStockMailerが実行されるよう定義しています（上の図の３行目が条件、4行目がメールを送る動作）
### each文について

Stockpileに入っている時間のレコード全部を調べたいのでeachメソッドで取り出して実行しています。

### 条件について詳しく
#### 条件文に使っている時間について
時刻を戻り値として得るのに
```ruby
Time.now
```
を利用しています。
![スクリーンショット 2023-08-17 20.27.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3379147/a1598d88-9c40-77c8-21b0-029e0d18fdfc.png)
(railscで確かめると日付と時間が出力)

しかし日付だけで比べたいので

```ruby
Time.now.to_date
```
を利用します。
![スクリーンショット 2023-08-17 23.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3379147/6cf83d17-41f0-6673-77a1-4f20976a8920.png)
こちらだと日付だけで比較演算子で比べることができて時間を考慮せずに比べられるためです。

Railsのデータベース内にデータ型:datetimeで保存してあるレコードはRubyのタイムクラスの戻り値が返ってくるので上記のコードと比較演算子で比較できます。


```ruby
If Stockpile.notice_on.to_date < Time.now.to_date 
    hogehoge
else
    bugbug
end
```
この例のように「stockpiles」テーブルの「notice_on」というカラムにdatetime型でデータが保存されているとき、「notice_on」はdatetime型なので「Time.now」の戻り値である現在時刻と比べることができます。
保存している日にちと現時刻を比べて
- 現時刻の方が遅ければ「hogehoge」
- 現時刻の方が早ければ「bugbug」
を実行するといった使い方ができます。
ChatGPTはVBAコードを書いてくれるし、こんなことも…

## 業務改善の一歩、ChatGPTの力を借りて
日々の忙しい業務に追われるスーパーマーケットのバイヤーとして、効率的な業務改善の模索が欠かせません。
そんな中、私は革新的な手法を取り入れ、意外な助っ人を得ました。
それは、`ChatGPT`を活用してExcelの`VBAコード`を代筆してもらうことでした。
今回は、その驚くべき体験をお伝えしたいと思います。


## 面倒な売変計上の新展開
業務改善の具体的な成果として、私が取り組んだのは「売変計上額の自動算出」でした。
これは、伝票上の売価金額と実際の販売売価に差異がある場合に生じる作業で、正確な計上が重要ですが、膨大な作業量ゆえに全ての店舗での実施が難しくなっていました。
しかし、`ChatGPT`を導入することで、この面倒な計算作業をマクロで瞬時に行うことができるようになりました。

<details>
<summary> 【補足：売変計上額の算出方法について】</summary>

 **前提** ：売変額の計上は店舗毎、部門（商品のおおまかな分類）毎に実施する必要があります。
　　　これは利益等の営業成績に対して責任をもっているのでは店舗単位（店長等）であり、
　　　部門単位（バイヤー、担当者等）だからです。
　　　売変額の計上は’最低でも週1回’がルール。　利益を正しくタイムリーに認識するためです。

 **方法** ：今回の算出額　＝’仕入れ売価と実販売売価との差’として定義。
　　　シール値引きなどは’値引額’とし別とする。
　　　仕入れ売価＝仕入れ売単価×仕入れ数量　で計算する。
　　　実販売売価＝実販売単価×販売数量　で計算する。
　　　販売に到っていない在庫については＝仕入れ売価単価×在庫数　として評価。
　　　ある定められた期間　の　単品毎に計算する。　そしては単品を積み上げて部門の数字とする。
　　　ある定められた期間　は常に連続して計算する。
　　　期間後の在庫金額は期首在庫売価として次の期間に繰り越され計算される。

　　　{期首在庫売価＋仕入れ売価}－{実販売売価－値引額＋（（仕入数量－販売数量）×仕入れ平均売価）}
　　　　　　期中総在庫売価　　　－　　売上 － 計上済値引 ＋　　　期末在庫（翌期の期首在庫）
　　　＝今回の算出額

 **現状** ：自社の既存のシステムで’仕入れ売価’’売上’の期間実績を出すことは可能。
　　　そしてこれらは’店舗毎’’部門（商品）’毎に出すことができます。
　　　　問題はこれらのデータから売変計上額を算出する仕組みがないこと。

 **課題** :今回の自動算出額を’正’として実際に算出数字を計上するには会社全体の説得と確認が必要

</details>

こんな感じ⇩

https://twitter.com/i/status/1692165115150471656

## ChatGPTの魔法、業務効率向上
私が敬遠していた`VBAコード`の作成に、`ChatGPT`の存在は革命的な変化をもたらしました。
以前はコード作成が煩雑で難しそうに感じていましたが、`ChatGPT`を駆使すれば、簡単な手順でマクロを生成することができると気付きました。

## 実施手順
・`ChatGPT`に「VBAコードを教えて」と頼む
・一回の指示では間違ったときにどこが良くないのかわかりにくいので複数回に分けて、追加で指示していく

⓵`ChatGPT`にExcelでマクロ化したいことを伝えてコードを書いてもらう
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/57e6af21-4ee0-4435-1b59-85436b165880.png)

⓶`ChatGPT`が書いたコードをExcelの`Visual Basic Editor`にコピペする
![画像１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/00ebd699-3c37-e96f-980d-9b7ddad09a0a.png)

⓷マクロを実行しちゃんと動くか確認
![画像4１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/5885a6d1-aaee-3c5c-c89c-c4b82a324beb.png)

⓸動かないときはデバックを確認し、その内容を`ChatGPT`に伝えて修正してもらう
![画像5ｓ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/7f950cf5-0f14-fabe-3c79-9c6a605bf089.png)
![画像7ｓ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/06dcc65a-cc45-45ac-0cae-1932b5f8c1ac.png)


⓹ちゃんと動いたら、さらに指示を足していく　
↻⓵に戻って指示を追加していき、行いたい全ての手順をVBAコードに書いてもらう！

⓺VBAコードでの計算が正しく行われているかチェック。
　自らの手計算と比較し相違ないことを確認する。

これを続ければ完成までイケます！
ありがとうChatGPT！！


そして
## 実はここまでの記事は・・・
そう`ChatGPT`にほとんど書いてもらいました。
▶【補足】　と　 **実施手順** 　のところだけは私が書きましたが、それ以外はChatGPTに書いてもらった内容をコピペしています。
違和感を感じる部分もあったと思いますが、意味はほとんど通じます。
すごい・・・
本当は`ChatGPT`の記事はまだ続きがあるのですが、最後までいくと種明かししづらいので途中で切っております。

因みに今回の記事のプロンプトはこんな感じです⇩
![画像8ｓ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467543/35465e6e-79cc-7bde-7913-241b9f901d31.png)

今回`ChatGPT`の力を借り、生まれて初めてマクロを使いました。
その感動を記事にしたかったのですが、お盆の繁忙期もあり記事作成の時間がとれませんでした。
そこで「記事作成もChatGPTにお願いしよう」と思い立ち、このような形をとっております。

`ChatGPT`に書いてもらった記事をコピペしただけだったら、本記事のようにちょっと読みにくいし伝わりにくい部分が目立ちます。
しかし`ChatGPT`が書いた記事に自分で修正を加えていけば、プロット作成の手間が減るしクオリティを下げずに記事をかけるのではないかと可能性を感じました。

かなり実験的な記事でしたがお付き合いいただきありがとうございます🙇
cisco wireless(WLC,AP)　ライセンス関連情報

- IOS-XE 17.3系あたりからsmart licensing using policy(以下SLUP)という方式になった。
直前のバージョンで使われていたsmart licenseと名前が似ているが、仕様が違うので注意。
もちろん、それ以前のRTUライセンスや、IOS時代のOSに組み込みのライセンス形態とは全くの別物。

- DNAライセンスを使用せずnetworkライセンスのみ使用の場合、初回レポート操作をすれば以降は変更なければライセンス関連の操作は不要
- 故障などでの機器交換時は、Ciscoのサイト上で故障機のライセンス開放操作と、代替機の初回レポート操作を実施すればよい。従来のような代替機へのライセンスファイル投入は不要。

- Wireless
旧来のWLCに対してAP収容台数のライセンスを適用する形から、APに対してnetwork,DNAライセンスが紐づく形になった。
N+!構成の場合、前は100台のAPを使う場合はWLCのactに100台、stbに100台分のライセンスを買うか、stbはHA専用モデルにして制限を受け入れる代わりに費用を節約する必要があった。
SLUPの場合、WLCの台数は関係なく、使いたいAPの台数分のライセンスがあればよくなった。

- APが紐づくWLCが変わっても特にライセンスを気にする必要はなし。Ciscoのクラウドに接続さえしておけば勝手にライセンス利用状況をレポートしてくれる。

:::note info
Q. How does CSSM licensing work with controllers in N+1 HA?
A. N+1 HA refers to a setup where one WLC has all APs joined to it while the other is on standby. If the main controller goes down or becomes unreachable, all APs join the standby one.

In this case, simply connect both controllers to the smart licensing servers. If failover happens, the licenses show up on your smart account as "consumed" by the standby controller.

It requires up to eight (8) hours for this change to be reflected.

Q.  What is the impact of hardware RMA on the Cisco Catalyst 9800 Series controller’s licensing?
 A. There is no impact on licenses due to hardware RMA. Customers can reconnect their access points to the new wireless controller post-RMA without any licensing impact.
:::

- 参考資料

https://www.cisco.com/c/ja_jp/products/software/smart-accounts/smart-accounts-documents.html#~stickynav=3

https://www.cisco.com/c/dam/global/ja_jp/products/smart-software-licensing/literature/customer-slp-overview.pdf

https://www.cisco.com/c/m/ja_jp/products/software/dna-subscription-switching/en-sw-sub-matrix-switching.html

https://www.cisco.com/c/m/en_us/products/software/dna-subscription-wireless/en-sw-sub-matrix-wireless.html

https://www.cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/215635-licensing-on-9800-wireless-lan-controlle.html
せんせー、ハイブリッドエネルギーストレージシステムってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ハイブリッドエネルギーストレージシステムってなに？

# ハイブリッドエネルギーストレージシステムとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ハイブリッドエネルギーストレージシステムって何？

これは、太陽の光や風の力などで作った電気を、２つ以上の違う方法でたくさん貯めておける特別な電池のセットです。まるで、大きな宝箱が２つ以上あるようなものです。

## なぜ２つ以上の宝箱があるの？

それぞれの宝箱（電池）は、違う特別な力があるからなんです。
一つはすごく速く電気を出すことが得意で、もう一つはじっくりと長時間電気を出すのが得意なんです。

## どうやって使うの？

太陽がたくさん出ている時や、風が強く吹いている時に、この特別な電池のセットに電気をたくさん貯めておくんです。そして、夜や風が弱い時でも、その貯めた電気を使って、電気をつけたり、おもちゃを動かしたりすることができます。

## それはどうしてすごいの？

このシステムがあると、太陽や風から作った電気を一番うまく使えるから、地球にやさしいエネルギーをたくさん使うことができるんです。そして、いつでも電気が足りるから、安心して生活できます。

## それはどうして大切なの？

たくさんの電気を使うけれど、地球に優しい方法で電気を作って、
みんなが楽しく、安全に生活できるようにするために、とっても大切な方法なんです。

# まとめ

このように、ハイブリッドエネルギーストレージシステムは、
太陽や風の力で作った電気を、色んな特別な宝箱（電池）にうまく貯めておいて、
地球にやさしい生活をするためのすごい方法なんです。
せんせー、フェロイック材料ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、フェロイック材料ってなに？

# フェロイック材料とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## フェロイック材料って何？

フェロイック材料は、特別な石のようなもので、この石は不思議な力を持っています。
電気の力を覚えてくれる魔法の石と想像してみてください。

## どんな不思議な力？

この魔法の石（フェロイック材料）に電気の力を与えると、
その力を覚えてくれて、ずっとそのままの力を保ってくれます。
だから、スイッチを押すと、その状態を覚えていてくれるんです。

## どうやって使うの？

大人たちは、この魔法の石を使って、コンピューターや電話の中で情報を保存するのに使ったりします。
例えば、絵を描いたり、ゲームをした記録を、この魔法の石が覚えておいてくれるんです。

## それはどうしてすごいの？

この魔法の石は、電気がなくても情報を覚えていてくれるから、
コンピューターや電話のバッテリーを大切に使うことができるんです。
だから、エネルギーを節約できます。

## それはどうして大切なの？

フェロイック材料を使うと、私たちの大切な思い出や情報を安全に保ちながら、
地球のエネルギーも大切に使うことができるから、とっても大切な魔法の石なんです。

# まとめ

このように、フェロイック材料は、電気の力を覚えてくれる特別な石で、
それを使ってコンピューターや電話の情報を保存したり、エネルギーを節約したりできるとってもすごいものなんです。
せんせー、アルゴリズム農業ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アルゴリズム農業ってなに？

# アルゴリズム農業とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## アルゴリズム農業って何？

アルゴリズム農業は、コンピューターを使って野菜や果物をもっとおいしく、もっとたくさん育てる特別な方法です。
コンピューターが農場のお手伝いさんのような役割をするんです。

## アルゴリズムって何？

アルゴリズムは、コンピューターに「これをやって、次にこれをやってね」と指示を出す一連のルールのこと。
まるで、レシピのように、コンピューターに作業の手順を教えてあげるんです。

## どうやってお手伝いするの？

コンピューターは、天気の情報や、土の状態をチェックして、今水をあげるべきか、
どのくらいの肥料が必要かなどを考えてくれるます。
そして、それを人たちに教えてくれます。
まるで、スマートな庭師さんのようですね。

## それで何が良くなるの？

この方法を使うと、野菜や果物がもっと元気に育ち、たくさんのおいしい食べ物を作ることができます。
そして、水や肥料を無駄にしないで済むから、地球にも優しいんです。

## それはどうして大切なの？

アルゴリズム農業を使うと、たくさんの人たちにおいしい食べ物を提供できるし、自然とも仲良くやっていけます。
だから、未来の農場をとても助ける、すごく大切な方法なんです。

# まとめ

このように、アルゴリズム農業は、コンピューターを使って農場をもっと良くして、たくさんのおいしい食べ物を作り、地球にも優しい農業をするためのスマートな方法なんです。
vue3における ref関数と reactive関数の違いは？

Vue 3 では、`ref` 関数と `reactive` 関数は、どちらも状態管理のために使用されるが、異なる使い方と特性を持っています。

1. `ref` 関数: `ref` 関数は、単一の値をラップして、リアクティブなデータを作成します。返されるオブジェクトは、`.value` プロパティを介して値にアクセスします。基本的に、プリミティブなデータ（数値、文字列、真偽値など）をリアクティブにしたい場合に使用します。
   1. ```javascript
      import { ref } from 'vue';

      const count = ref(0);

      console.log(count.value); // アクセスする際に .value を使う

      ```
2. `reactive` 関数: `reactive` 関数は、オブジェクトをリアクティブなデータとしてラップします。このオブジェクト内のプロパティへのアクセスと変更は、自動的にトラッキングされ、コンポーネントの再描画がトリガされます。`reactive` を使用すると、ネストされたオブジェクトのプロパティもリアクティブになります。
   1. ```javascript
      import { reactive } from 'vue';

      const state = reactive({
        count: 0,
        message: 'Hello'
      });

      console.log(state.count); // 直接アクセス
      ```

‌

‌

`reactive` はオブジェクト全体をリアクティブにするので、プロパティにアクセスする際に .value のようなものは不要です。

簡潔に言うと、基本的な値（数値、文字列など）をリアクティブにする場合は ref を、オブジェクト全体をリアクティブにする場合は reactive を使用します。また、ref を使用した場合、プリミティブな値が返されるので、直接比較や算術演算などが可能です。一方、reactive を使用した場合、オブジェクト全体が返されるため、プロパティへのアクセス時には .プロパティ名 のように記述しますが、オブジェクトのネストやコンプレックスなデータ構造を扱う場合に便利です。
Orange Pi 5 を買って ArchLinuxをインストールしてみました　その４

「その３」の続きです
```
# 時刻の設定
rm /etc/localtime ; ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
timedatectl set-ntp true

# Pacman repo 追加
sudo pacman-key --recv-keys BA27F219383BB875
sudo pacman-key --lsign BA27F219383BB875

# add the following session in your /etc/pacman.conf
[7Ji]
Server = https://github.com/7Ji/archrepo/releases/download/$arch

# kernel update
sudo pacman -Syu 7Ji/linux-aarch64-orangepi5{,-headers}

# overlays ファイル名修正
# /boot/extlinux/extlinux.conf の FDTOVERLAYS 修正
FDTOVERLAYS /dtbs/linux-aarch64-orangepi5/rockchip/overlay/rk3588-ssd-sata0.dtbo

reboot
```

これで最新の状態になったので、次はGUIの環境設定です
私は lxqt が好みなのですが、お好みでセットアップしてください

```
sudo pacman -S --need xorg
sudo pacman -S --need lxqt xdg-utils ttf-freefont sddm
sudo pacman -S --need oxygen-icons breeze-icons noto-fonts-cjk
sudo pacman -S --need firefox-i18n-ja thunderbird-i18n-ja vlc leafpad archlinux-wallpaper
sudo systemctl enable sddm

#GPU / 3D Acceleration の設定をします
sudo pacman -Syu mesa-panfork-git
sudo pacman -S wget
wget https://github.com/JeffyCN/mirrors/raw/libmali/firmware/g610/mali_csffw.bin -O /tmp/mali_csffw.bin
sudo cp /tmp/mali_csffw.bin /usr/lib/firmware/

#Hardware-based video encoding/decoding の設定をします
sudo pacman -Syu ffmpeg-mpp

locale の設定をします
/etc/locale.gen をお好みのエディターで編集します
ja_JP.UTF-8の行の先頭の#を削除します
sudo locale-gen
/etc/locale.conf をお好みのエディターで編集します
LANG=ja_JP.UTF-8
```
再起動してGUI環境で起動できたらOKです
rshell (Remote Shell for MicroPython) が 動かない (不具合回避方法)


特に Windows で rshell を `pip install rshell` で インストールしても rshell を実行しようにもエラーをだして動かない場面に直面することがあります。



## エラーの例


~~~
C:\MyProject\aaa> rshell
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Scripts\rshell.exe\__main__.py", line 4, in <module>
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\rshell\command_line.py", line 1, in <module>
    import rshell.main
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\rshell\main.py", line 80, in <module>
    import readline
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\readline.py", line 34, in <module>
    rl = Readline()
         ^^^^^^^^^^
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyreadline\rlmain.py", line 422, in __init__
    BaseReadline.__init__(self)
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyreadline\rlmain.py", line 62, in __init__
    mode.init_editing_mode(None)
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyreadline\modes\emacs.py", line 633, in init_editing_mode
    self._bind_key('space',       self.self_insert)
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyreadline\modes\basemode.py", line 162, in _bind_key
    if not callable(func):
           ^^^^^^^^^^^^^^
  File "C:\Users\Hoge\AppData\Local\Programs\Python\Python311\Lib\site-packages\pyreadline\py3k_compat.py", line 8, in callable
    return isinstance(x, collections.Callable)
                         ^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'collections' has no attribute 'Callable'

~~~


## 原因

`${PYTHONPATH}\Lib\site-packages\pyreadline\py3k_compat.py` このファイルに不具合があるからです。


## 対策方法

`py3k_compat.py` を以下の通りソースコードを修正すれば回避できます。

~~~diff
--- py3k_compat.py.orig 2023-08-17 22:45:26.488592900 +0900
+++ py3k_compat.py      2023-08-17 21:32:57.439240300 +0900
@@ -5,7 +5,7 @@ if sys.version_info[0] >= 3:
     import collections
     PY3 = True
     def callable(x):
-        return isinstance(x, collections.Callable)
+        return isinstance(x, collections.abc.Callable)

     def execfile(fname, glob, loc=None):
         loc = loc if (loc is not None) else glob
~~~
VSCodeでPrettierとMarkdownlintを併用し、マークダウンが変な整形するのを防ぐ

こんにちは。Kaneyasuです。

先日、VSCodeでマークダウンを書いていたら、このように勝手にスペースが入ってしまいました。

```text
AS部の兼安です。
```

↓

```text
AS 部の兼安です。
```

これがファイル全体に適用されると、結構な違和感を感じます。

これの原因はVSCodeにインストールしているPrettierによる意図しない整形でした。Prettierはコードを整形するためのツールで、これが悪さをしていた次第です。したがって、Prettierの無効化すればこの現象は起きなくなるのですが、整形を完全にOFFにするのは避けたいので、丁度良い設定を探してみました。

# 本記事の対象者

- マークダウンをVSCodeで書いている方

# Prettierとは？

Prettierはコードを整形するためのツールです。VSCodeの拡張機能としてインストールすることができます。

https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

ESLintよりも強力な整形機能を持っており、フォーマッターとしてとても便利です。多くのファイル形式をサポートしており、マークダウンもサポートしています。ですが、2023年8月時点では、細かな設定ができず、ファイル形式ごとのON/OFFまでしかできないので少々困ります。

冒頭の現象は、半角文字と全角文字の間に一律でスペースを入れているようですが、これを制御する方法は見当たりませんでした。

# Markdownlintとは？

Markdownlintは、マークダウン形式のファイルをLintするためのツールです。こちらもVSCodeの拡張機能としてインストールすることができます。

https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint

こちらは、細かく整形ルールが定義されており、ルール単位でON/OFFができます。また、ルールのカスタマイズも可能です。

```json
{
    "MD013": false
}
```

ルールの内容はこちらで確認できます。

https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md

以上のように、マークダウンに関しては、Markdownlintの方が使いやすいと思います。

# PrettierとMarkdownlintを併用する

本記事で紹介したかった方法は、PrettierとMarkdownlintを併用し、マークダウンは細かく設定したMarkdownlintを使用し、それ以外のファイル形式はPrettierを使用するというものです。`settings.json`に以下のように設定することで、実現できます。

```json
{
  // "editor.defaultFormatter": "esbenp.prettier-vscode",
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.defaultFormatter": "DavidAnson.vscode-markdownlint",
  },
  "markdownlint.config": {
    "default": true, // すべてのルールを有効にする
    "MD018": false // 複数の空白を許可しないルールを無効にする
  }
}
```

言語ごとに、フォーマッターを指定し、マークダウンはMarkdownlintを使用するように設定しています。

```json
"[markdown]": {
    "editor.defaultFormatter": "DavidAnson.vscode-markdownlint",
}
```

次に、Markdownlintの設定を行います。`markdownlint.config`に設定を記述します。`default`を`true`にすることで、すべてのルールを有効にします。そして、いらないルールだけを無効化しています。もちろん、必要なルールだけを有効化することもできます。

```json
"markdownlint.config": {
    "default": true, // すべてのルールを有効にする
    "MD018": false // 複数の空白を許可しないルールを無効にする
}
```

この例では、言語を指定せずに`editor.defaultFormatter`を設定していないので、設定していない言語はフォーマッターが効きません。以下のようにすれば、全体的にデフォルトフォーマッターはPrettierとし、マークダウンだけはMarkdownlintをフォーマッターとすることができます。

```json
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "[markdown]": {
    "editor.defaultFormatter": "DavidAnson.vscode-markdownlint",
  },
  "markdownlint.config": {
    "default": true, // すべてのルールを有効にする
    "MD018": false // 複数の空白を許可しないルールを無効にする
  }
}
```

しかし、全体的なデフォルトフォーマッターを指定してまうと、冒頭のような意図せぬ整形が走るので、言語ごとにフォーマッターを指定するのが良いと思います。
【Python】辞書型について（辞書型ネスト）

# 【Python】辞書型について

全然わからないので、調べて書いてみた。

## ①キーを指定して「値」を取得する方法

```py
         #  {キー: 値, キー: 値,...}
fruit = {"apple": "red", "grape": "purple", "pine": "yellow"}

key = fruit["grape"]

print(key)
```

```py:実行結果
purple
```
## ②存在しないキーを指定するとエラーが出る
```py:存在しないキーを指定
fruit = {"apple": "red", "grape": "purple", "pine": "yellow"}

# 存在しないキーを指定
key = fruit["orange"]

print(key)
```

```py:実行結果
.
.

   key = fruit["orange"]
          ~~~~~^^^^^^^^^^
KeyError: 'orange'
```

存在しないキーを指定するとエラー文がでます！

## ③エラー文を出さない方法。getメソッドを使う。
```py:エラー文を指定する
fruit = {"apple": "red", "grape": "purple", "pine": "yellow"}

key = fruit.get("orange", " ")

print(key)
```
```:実行結果
None
```

key = fruit.`get("orange", " ")`後ろに何も書かなければNoneが返ってきます。
（エラー文も出ずに何も表示されないということは、Noneが変えてってきているという風に考えていいと思います。
実際、私も何も表示されなかったのですが、Noneが返ってくることになっているはずなので分かりやすく、無理やり書きました。（笑））

## ④エラー文自分の好きなように指定できます

```py:エラー文を指定する
fruit = {"apple": "red", "grape": "purple", "pine": "yellow"}

key = fruit.get("orange", "エラーだよ")

print(key)
```

「エラーだよ」と記述してみました。
すると…

```py:実行結果
エラーだよ
```

自分が指定したエラー文が出てきました！


### getメソッドとは？

get()とは、`辞書の「キー」から「値」を取得するメソッド`になります。
存在しないキーにget()を使うと、`None`が返ってくるようになっています。

```py:getの書き方
辞書.get(キー, デフォルト値)
```
①キー・・・辞書で取得したい値に対する「キー」を指定する
②デフォルト値・・・存在しないキーを取得する場合の「値」を指定する

## 辞書型ネスト

ネストとは・・・入れ子のことです！

入れ子とは、今回だと辞書型(dic)の中にさらに辞書型(dic)を入れることです。


```py
fruits = {
    "fruits1": {
        "name": "apple",
        "area": "aomori",
        "quantity": 10
    },
    "fruits2": {
        "name": "orange",
        "area": "ehime",
        "quantity": 5
    }
}
```

キーと値はどれなのかについては、めちゃくちゃ分かりずらいかもしれないですが、分けて書いてみました。
辞書の中に辞書がさらに入っている感じになってます。
`fruits = {　(キー)`から見ると、`fruits1とfruits2がすべて値`になります。
```py
fruits = {                    # キー
    "fruits1": {                  # 値
        "name": "apple",          
        "area": "aomori",
        "quantity": 10
    },
    "fruits2": {
        "name": "orange",
        "area": "ehime",
        "quantity": 5
    }                             # ここまで値
}                             # キーのとじカッコ
```
`fruites1(キー)`から見ると、`"name": "apple", "area": "aomori",  "quantity": 10     が値`になります。
   
```py
"fruits1": {                  # キー
        "name": "apple",          # fruites1の値
        "area": "aomori",         # fruites1の値
        "quantity": 10            # fruites1の値
    },                        # キーのとじカッコ
    "fruits2": {              # キー
        "name": "orange",         # fruites2の値
        "area": "ehime",          # fruites2の値
        "quantity": 5             # fruites2の値
    }                         # キーのとじカッコ
```
最後は、最初の時に学ぶ形の`キー：値`になります。
```py
         # キー : 値
        "name": "apple",            
        "area": "aomori",
        "quantity": 10
```
dotnet mvc + bootstrap + sass の準備

Visual Studio を使わず vscodeなりで dotnet mvc の開発をする場合、sass を使えるするようにするまで結構時間がかかったのでメモ

## dotnet mvc

プロジェクトの新規作成。特に問題はない。

```sh
dotnet new mvc
```

## npm init

```sh
npm init -y
```

## bootstrap

VisualStudioだと多分 libman とかで追加して `wwwroot/lib/bootstrap とかにインストールされるけど、どうせあっちこっち npm でインストールするので npm からインストールする。

```sh
 npm install bootstrap
```

## sass

いまだに node-sass を使う例が多いけど徐々に使われなくなっている感じ。なので dart sass を使う。

```
npm install -d sass@1.32.13
```

## npm scripts

`npm run hoge` で各種タスクを起動できるようにする。
開発中と publish/deploy で動作を分けたいので sass と sas-watch の2つにしている。

```json
  "scripts": {
    "sass": "sass wwwroot/sass:wwwroot/css",
    "sass-watch": "sass wwwroot/sass:wwwroot/css --watch",
    "watch": "dotnet watch run",
    "dev": "concurrently \"npm run sass-watch\" \"npm run watch\""
  },
```

## site.scss

```scss:wwwroot/sass/site.scss
@use '../../node_modules/bootstrap/scss/bootstrap.scss' as b with(
    $border-radius: 5rem
);

body{
    color: b.$blue-700;
}
```

この記述は

* border-radius のデフォルトを変更する
* body color を bootstrap で定義された色に変更する

場合のサンプル。
`@import` の代わりに `@use` を使うようになった関係で変数のカスタマイズは `with()` に設定することになるのと、namespace が採用されているようなのでその対応を追加している。

## build & watch

```sh
npm run dev
```

## その他

Visual Studio がめっちゃ便利にできていることが分かった。
sass の処理を vscode の拡張でどうにかしようとする記事が結構見つかったけど、build/publish を自動タスクにしたい場合にどうするの？って考えるとイマイチ。

あと sass(dart sass) の現時点(2023/8)だと bootstrap の中で使っている sass 関数が deprecated になるようでちょっと前のバージョンを使うようにした。
せんせー、プロテオミクスってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プロテオミクスってなに？

# プロテオミクスとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## プロテオミクスって何？

体の中には「たんぱくしつ」というものがいっぱいあって、これが私たちの体を作っている重要な部分なんです。
プロテオミクスは、これらのたんぱくしつがどんなものがあって、
どう働いているのかを見つけるための、大人たちの特別な探偵活動なんです。

## たんぱくしつって何？

たんぱくしつは、私たちの体を作る材料で、いろんな仕事をしてくれるます。
例えば、お腹がすいたら「ごはんを食べよう！」と体に教えてくれたり、
風邪をひいた時に元気を取り戻す手助けをしてくれたりします。

## どうやって探偵活動するの？

大人たちは、特別な道具とコンピューターを使って、体の中にあるたんぱくしつを見つけ出します。
それから、どんな仕事をしているのかも調べる。まるで、宝探しのような活動ですね。

## プロテオミクスで何がわかるの？

プロテオミクスの探偵活動で、新しいたんぱくしつを見つけたり、
どうやって体を元気に保っているのか、どうやって病気を治す手がかりがあるのかを見つけることができるんです。

## それはどうして大切なの？

プロテオミクスでたくさんの情報を集めると、新しい薬を作ったり、
人々が病気にならないようにする方法を見つけたりできます。だから、とても大切な仕事なんです。

# まとめ

このように、プロテオミクスは、私たちの体の中で働いているたんぱくしつを探し出して、
その情報を使って人々の健康を守るための、とってもすごい探偵活動なんです。
Elastic CloudでHotに溜まっているデータを別のティアに移動するやり方

# はじめに
Elasticソリューションアーキテクトの関屋です。
Elastic Cloudでは、データを格納するノードを選択できます。基本（必須）のHot Tier以外に、よりコストの安いWarm/Cold/FrozenのTierを選択的に設けることができます。

しかし、Warm/Cold/Frozenはそれらのノードを立ち上げただけではデータはデフォルトではそちらに移動してくれません。
Index Lifecycle Management (ILM）を使ってライフサイクルを設定する必要があります。

ILMですが、インデックスの作られ方によって、状況は少し異なります。
1. Filebeat, Metricbeat, Elastic Agentなどを使ってデータを集めている場合は、自動的にILMポリシーが作成されていて、それがインデックスに割り当てられていると思います。
1. ElasticsearchのAPIなど、その他の方法を使っている場合、ILMポリシーは割り当てらていないです。ILMポリシーを作成し、割り当てる必要があります。

本記事はこの1. のケースの場合の設定手順について説明します。

前提： 事前に使用したいTierをElastic Cloudの管理画面で作成してください。あるいはオートスケールを有効にしておくと、Tierが必要となったときに自動的に作成されます。

# 手順
今回は扱うログのインデックスはこちらの2つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/a16f57a2-7369-8f78-17af-a8b82d02c486.png)
logs-elastic_agent.filebeat-defaultの[データストリーム](https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams.html)の中に、末尾が0000001と0000002のインデックスがあります。000001が最初に作られたインデックスです。0000001にデータが溜まり、ロールオーバー条件を満たすとロールオーバー行われ、0000002が作成されます。そして0000002が今度は新たに書き込みされる対象のインデックスとなります。
このようなケースでは、0000001のロールオーバーされたインデックスがWarm/Cold/Frozen のTierに移動できます。

0000001のインデックスのリンクをクリックすると、ILMの状態が確認できます。Current phaseが`hot`と確認できます。また、ロールオーバー済みの移動可能なインデックスはCurrent actionが`complete`となっているので、それも確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/1e801f99-a161-a9cd-9ea0-1fb68b0add83.png)

`logs`のLifecycle Policyのリンクをクリックすると、ILMポリシーの設定画面にいきます。デフォルトではずっとHotに保存され続ける設定となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/364d0d69-a770-1e36-f3aa-cd278cff627e.png)

ここで変更を行い、今回は試しにWarmを有効化しました。またMove data into phase when:は`0` daysにしました。つまり、ロールオーバーされたインデックスは0日後（すぐに）Warmに移動するという意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/31e81c19-2462-ca1e-91a9-56a7d160c929.png)

ILMポリシーの変更を保存し、さきほどの末尾0000001のインデックスが、すぐにCurrent phaseが`warm`になりました。移動が完了するまでに少し時間が必要ですが、Current actionが`complete`になっていれば、移動が完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/5d018c99-c80b-05ae-3d00-d0822e429f95.png)

ちなみに、末尾が0000002のインデックスですが、こちらはRolloverされていない、Write可能なインデックスですので、やはりhotのままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/53166964-686b-7723-30d5-839041b6e8bc.png)


# 最後に
インデックスがどのTierにあるかは、このようにインデックス管理画面でフィルタリングして確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/94c1581d-c7aa-2181-f13d-ce7c4b61b2d1.png)
【備忘録】Windowsでキーボード入力が「ｎｙうｒｙおｋうｄえｋいｎあい」になったときの対処法

# はじめに
入力中に「**ｎｙうｒｙおｋうｄえｋいｎあい**」となり、再起動せずに解決する方法がなかなか見つからなかったので、自分用のメモを兼ねて対処法を残しておきます。


# 参考
この投稿で助かりました。ありがとうございます。
- [Microsoft コミュニティ「ｎｙうｒｙおｋうｄえｋいｎあい」](https://answers.microsoft.com/ja-jp/windows/forum/all/%EF%BD%8E%EF%BD%99%E3%81%86%EF%BD%92%EF%BD%99/300a1fb1-feb3-41f8-a9b9-315eee76888b) (2023/08/17閲覧)

# 対処法
1. 【windows】右クリック or【Ctrl + Shift + ESC】 or【Ctrl + Alt + Delete】でタスクマネージャーを開く。
1.  プロセスタブから *Microsoft Text Input Application* を探し、右クリックして【タスクの終了(E)】を左クリック。
1.  上記の操作後 *Microsoft Text Input Application* はすぐに再起動されるが正常に入力できるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1294427/d990621d-7eec-5b32-e2e7-540ec1c95e41.png)


# 最終手段

再起動。

----
対処法を忘れたら見に来ます。
RubyistのためのPython配列操作対応表

慣れているだけかもしれないが、Rubyは配列の操作の可読性が高く覚えやすかったが、

Pythonは触るたびに調べ直すことが多かったので、備忘録を残しておく

Ruby、Python共に、同じ操作でも色々な方法があるため一例になります

## 基本的な操作

```ruby
arr = []
arr << 1
# arr => [1]

arr += [2, 3]
# arr => [1, 2, 3]
```

```python
arr = []
arr.append(1)
# arr => [1]

arr.extend([2, 3])
# arr => [1, 2, 3]
```

## 複雑な操作

```python
class Parent:
    def __init__(self, children):
        self.children = children
        
class Child:
    def __init__(self, name):
        self.name = name

parents = [
    Parent([Child("a"), Child("b")]),
    Parent([Child("c")])
]

[child.name for parent in parents for child in parent.children]
# => ["a", "b", "c"]
```

## map

```ruby
class Obj
  attr_accessor :a

  def initialize(a)
    @a = a
  end
end

arr = [Obj.new("a"), Obj.new("b"]
arr.map(&:a)
# => ["a", "b"]
```

```python
class Obj:
    def __init__(self, a):
        self.a = a

arr = [Obj("a"), Obj("b")]

# リスト内包記述
[obj.a for obj in arr]
# => ["a", "b"]

# ラムダ式
list(map(lambda x: x.a, arr))
# => ["a", "b"]
```
データベースの基礎

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/906c553d-78c8-8d6d-72a9-e2a69357d2b6.png)
３層スキーマアーキテクチャ
　データの独立性を保つための構造が３層スキーマアーキテクチャです。スキーマとは、データの「構造」と言う意味です。表形式でデータを管理する場合であれば、表の項目を決めるものがスキーマです。例えば、社員表を　社員番号、氏名、所属部署、役職、基本給という項目で作る場合、社員番号、氏名、所属部署、役職、基本給が社員表のスキーマです。

１：概念スキーマ
　データベースに登録されているデータすべてを表すデータ構造です。

２：外部スキーマ
　アプリケーションから見えるデータ構造です。アプリケーションは、登録されているすべてのデータを必要とするわけではありません。アプリケーションに必要なデータのみを提供するために、概念スキーマの一部を抜粋したり、加工したりして作ります。

３：内部スキーマ
　概念スキーマとして社員表を定義したとしてもディスクを装置の中にそのまま表構造で格納されるわけではありません。プログラムで扱いやすいように木構造などに変換して格納します。このように、実際に記憶装置上に描くのいうする時のデータ構造のことを意味します。
EC-CUBE4系のPR作成をやってみた（初心者向け）

こんにちは。
EC-CUBE4系にPRを送る流れについてまとめてみました。

## はじめに
EC-CUBEに出会ってまだ３ヶ月の初心者です！
”EC-CUBEにPRを投げてみたい！”と思ったのですが、
”どうしたらいいのか。。😭”、”投げても大丈夫かな。。？”と悩んでいる自分のためのメモとなります！笑

本文は、以下の記事を参考に作成しております。
■ プルリクエストの作り方 (EC-CUBE 4 開発者向けドキュメントサイト)
https://doc4.ec-cube.net/contribution-guide/pull-request

## 1.ec-cubeリポジトリをFork
ec-cubeのリポジトリへ移動し、ページの右上にある「Fork」をクリックします。
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469200/19989f6d-feed-c96a-458d-f97f90abb9fc.png" alt="EC-CUBEGithubImg">
■ （GitHub）
https://github.com/EC-CUBE/ec-cube

すると、ec-cubeのリポジトリが自分のGitHub環境内にコピーされているのが確認できます。
Forkしたec-cubeのリポジトリをローカルにクローンします。
```terminal:Terminal
$ git clone git@github.com:{UserName}/ec-cube.git
```

これで、自分の環境で作業できるようになります。

## 2.ec-cube本体のリポジトリと同期をとる
ec-cube本体のリポジトリとForkしたリポジトリの同期をとるためには、
まずec-cube本体のリポジトリの情報をローカル環境に追加する必要があります。

※ec-cube本体の修正をForkしてきた自分のリポジトリにも反映するために必要な作業となります！

まずは、以下のコマンドで、追加されているリモートリポジトリについて確認します。
```terminal:Terminal
$ git remote -v
# 出力
origin	git@github.com:{UserName}/ec-cube.git (fetch)
origin	git@github.com:{UserName}/ec-cube.git (push)
```
ForkしたリポジトリをCloneしているならば、私と同じ結果になるかなと思います。

次に、ec-cube本体のリポジトリをローカル環境に追加します。
```terminal:Terminal
$ git remote add upstream git@github.com:EC-CUBE/ec-cube.git
```

もう一度情報を確認！無事に追加されてたのであれば、以下のような結果を確認できます。
```terminal:Terminal
$ git remote -v
# 出力
origin	git@github.com:{UserName}/ec-cube.git (fetch)
origin	git@github.com:{UserName}/ec-cube.git (push)
upstream	git@github.com:EC-CUBE/ec-cube.git (fetch)
upstream	git@github.com:EC-CUBE/ec-cube.git (push)
```

## 3.ec-cube本体リポジトリの内容を反映する
ec-cube本体側で内容の変更がされたかも知れないですね。。😭
PRを作成する前は、常に同期することをお勧めします。❤️
```terminal:Terminal
$ git pull upstream 4.2
```

ブランチを作成し、開発をします。
```terminal:Terminal
$ git checkout -b {BranchName} upstream/4.2
```

その後、自分のGitHubリポジトリにPushします。
```terminal:Terminal
$ git push origin {BranchName}
```

これで、PRを作成すれば、完了です！

## 最後に
PRを作成しながらですが、"コードに対する内容を説明するのが難しい、、、"って思いました。😫
作成されているPRをみてみるのも、一つの勉強かもですね！
【PHP】フォームのGETとPOST ちょっとしたformを作成してみた

GETとPOSTについてこんなツイートをしましたが、もう少し詳しく説明するために記事を作成しました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PHPはじめたばかりの方は、GETとPOSTの違いがあまりわからないという方多そう。<br><br>簡単に言うと<br>URLに表示されるかされないか<br>の違い<br><br>GET＝URLに表示<br>POST＝URLに表示されない</p>— Tomoya (@div_tomo) <a href="https://twitter.com/div_tomo/status/1692139351734730922?ref_src=twsrc^tfw">August 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# 手順

## ファイルの作成

まずは [ **formフォルダ ]** を作成してその中に [ **input.phpファイル ]** を作成してください。

```php
form
  |--> input.php
```

## HTMLを書く

ファイルが作成できたら [ **input.php ]** にHTMLを書いていきます。

> **input.php**
> 

```php
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

    <form method="GET" action="input.php">

        氏名
        <input type="text" name="name">

        <br>

        言語
        <input type="checkbox" name="language[]" value="PHP">PHP
        <input type="checkbox" name="language[]" value="Java">Java
        <input type="checkbox" name="language[]" value="Python">Python

        <input type="submit" value="送信">

    </form>

</body>
</html>
```

### ＜form＞の解説

フォームを作成する時は、`<form></form>`タグで囲ってあげる必要があります。

`method=””`には`GET`か`POST`の2種類どちらかが入ります。

`action=””`の中身は処理をした後の遷移画面のファイルを書いてあげます。

**例えば**

`action=”input.php”`だとしたら送信ボタンを押下した後[ input.phpファイル ] に遷移します。

`action=”../index.php”`だとしたら送信ボタンを押下した後 [ index.phpファイル ] に遷移します。

### 氏名＜input＞の解説

`type=”text”`typeの中にtextを入れてあげると文字が入力できます。

`name=”name”` inputには名前を付ける事ができて今回は氏名なのでnameにしています。使い方は後程

### 言語＜input＞の解説

`type="checkbox"` としてあげて複数並べてあげるとチェックボックスを作成できます。

`name="language[]"` []をつけてあげることで複数のチェックボックスを作成できます。

`value=""` の中に渡したい値を入れてあげます。

### ＜input 送信＞の解説

`type=”submit”` としてあげると送信ボタンを作る事ができます。

`value=”送信”` valueの中に書いた文字がボタンの中に表示される文字です。

## ブラウザの確認

一旦HTMLの確認をしたいのでブラウザを開いて表示を確認してみてください。

以下のように表示されていればOKです。


![20230817_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494399/44184a2c-e0f9-97a6-3220-e3f0166f02dc.png)


実際に上の氏名と言語を埋めて送信してみてください。

何も動作はしないのですが、URLをよく見ると

`[？name=test&language%5B%5D=Java&language%5B%5D=Python]`

のように表示されていると思います。

これはformに入力した値がURLに出てくるのが**GET**の特徴です。

URLにでてこないのが**POST**の特徴です。

ちなみに[?]の後に書かれている値をクエリーなどと呼ぶこともあります。

## methodの中身がどうなっているか

method="GET" の中身がどうなっているかを確認していく処理を記述していきます。

> **input.php**
> 

```php
<?php

if(!empty($_GET)){
    echo '<pre>';
        var_dump($_GET);
    echo '</pre>';
}

?>

<!DOCTYPE html>
・・・以下略
```

`<!DOCTYPE html>` の上にphpを書いていきます。

### var_dump($_GET);

GET通信を見るには `$__GET` としてあげれば見ることができます。

ちなみに `$__` で書かれているものはスーパーグローバル変数と言います。phpの場合は９種類あります。スーパーグローバル変数は連想配列になっているので覚えておきましょう。

`echo '<pre>'` は `var_dump()` のままだと見ずらいのでpreで縦に並べています。

### if(!empty($_GET)){

if文を定義しないとエラーがでるのでif文を付けてあげています。

`!empty` は空では無かったらという意味

## ブラウザの確認

ブラウザの確認をしましょう。以下のように表示されていれば問題ないです！

![20230817_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494399/77185a92-2f51-371e-4447-1b65fd44faad.png)
IPアドレスとは

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

コンピュータネットワークの基盤を支える要素の一つが、IPアドレス（Internet Protocol）です。IPアドレスは、インターネットやローカルネットワーク内での通信において欠かせない要素となっています。

# IPアドレスの基本概念
IPアドレスは、`ネットワーク上のデバイスを一意に特定するための番号`です。これは、人々が住所を使って物理的な場所を見つけるのと同じ原理で、データパケットが正確に送信されるように保証します。IPアドレスは、コンピュータやスマートフォンなどのデバイスがネットワーク内で通信するために使用され、__それぞれのデバイスがネットワーク上で独自の識別子を持つ__ ことを可能にします。

# IPv4とIPv6
IPアドレスは、IPv4とIPv6という2つの主要なプロトコルで使用されます。
- IPv4：
IPv4は4つの8ビットセグメントで構成される32ビットのアドレスです。通常「xxx.xxx.xxx.xxx」の形式で表現され、全世界で約42億のアドレスが存在します。しかし、IoTデバイスの増加によりこの数は __急速に枯渇__ しており、新しいアドレスの割り当てが難しくなっています。
- IPv6：
IPv6は128ビットのアドレスを持つ新しいプロトコルで、16進数で表現されます。これにより、340 undecillionものアドレスが生成され、ほぼ無限のIPアドレスを割り振ることができます。IPv6はアドレス枯渇の問題に対処するための解決策であり、将来のネットワーク成長に対応するために必須となる基盤です。

# IPアドレスの機能と役割
- デバイス識別：
IPアドレスは、__送信元デバイスと受信先デバイスを識別__ します。これにより、データパケットが正確な宛先に到達し、返信データが適切に戻ってくることが保証されます。
- ルーティング(データが送信元から目的地に到達するために、ネットワーク内の適切な経路を選択するプロセス)：
データはネットワーク内でルーティングされ、中継点を通じて目的地に送信されます。IPアドレスは、データの適切な経路を決定するための情報を提供します。
- ネットワーク階層：
IPアドレスはネットワーク階層での通信を可能にし、データのセグメンテーションと整理を支援します。これにより、大規模なネットワークを構築し、管理することができます。

# 終わりに
IPアドレスは、インターネットとネットワーク通信の基盤を構築する重要な概念です。IPv4からIPv6への移行が進行中であり、これによってアドレス枯渇問題が解決され、未来のネットワーク通信の成長に備えられます。IPアドレスは、デジタル世界において、情報の送信と受信を円滑かつ確実にするための鍵となっています。

最後までお付き合いくださりありがとうございました。
[Github Actions] PR作成時のReviewersの自動指定

## はじめに
こんにちは!
アプリ開発が好きで、Swiftの勉強をしている大学生です。
温かい目で見ていただけると幸いです。

## やりたいこと
インターンで出会った際の友人とチーム開発をしているのですが、レビューをしてくれる方は固定されているので、自動化してみたいと思います。

## 実装
```yaml
name: Auto Assign Reviewer
on:
  pull_request:
    types:
      - opened
      - reopened


jobs:
  assign_reviewer:
    runs-on: ubuntu-latest
    steps:
      - name: Assign Reviewer
        uses: actions/github-script@v4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const reviewers = ["レビュワー1"]; 
            const { data: pullRequest } = await github.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number
            });
           
            await github.pulls.requestReviewers({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number,
              reviewers: reviewers,
            });
```
`レビュワー1`と書いてあるところはGithubのアカウント名に変えるとその人を指定してくれます。

### Tip
レビューワーが複数人いらっしゃる場合には下記をコピーしたら使えると思います。


```yaml
name: Auto Assign Reviewer
on:
  pull_request:
    types:
      - opened

jobs:
  assign_reviewer:
    runs-on: ubuntu-latest
    steps:
      - name: Assign Reviewer
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const reviewers = ["レビュワー１", "レビューワー2"] 
            const { number, user } = context.payload.pull_request
            const { data: pullRequest } = await github.rest.pulls.get({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: context.issue.number
            })
    
            await github.rest.pulls.requestReviewers({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: context.issue.number,
                reviewers: reviewers.filter(function( target ) {
                    return target != user.login
                })
            })
        
```


## 終わりに
誰かの役に立つことができていれば幸いです。
アウトプットを頑張ろうと思っているので温かい目で見ていただけると嬉しいです。
structuredCloneはそろそろ使えるのでは

# structuredCloneとは

> グローバルの structuredClone() メソッドは、指定された値のディープコピーを、構造化複製アルゴリズムを用いて生成します。

https://developer.mozilla.org/ja/docs/Web/API/structuredClone

## シャローコピー、ディープコピー
Javascriptにはシャローコピーとディープコピーが存在します。
Array,Objectはスプレッド構文を使うとコピーできているように見えますが、シャローコピーとなってしまい、変数の変更時に予期せぬ挙動になることがあります。
そのため今までJS開発者はディープコピーを行うために各種ライブラリを使ってきたわけですが、そろそろネイティブを使い始めてもいいんじゃないのかと思い記事にしてみました。

> オブジェクトのシャローコピーとは、コピーがコピー元のオブジェクトとプロパティにおいて同じ参照を共有する（同じ基礎値を指す）コピーのことを指します。

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

> オブジェクトの ディープコピー とは、コピー先のオブジェクトのプロパティがコピー元のオブジェクトのプロパティと同一の参照（同じ値を指す）を共有しないコピーのことです

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

## で何が問題があるのかというと
MDNで記載されているブラウザの互換性の部分次第ということになると思ってます。

https://developer.mozilla.org/ja/docs/Web/API/structuredClone#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

いちおうすべてチェックが入っていますが、その内容を確認すると、一番問題になりそうなのは、safari 15.4かと考えています。(OSと紐づいてるためUPDATEしてない人多そうという勝手なイメージ)
safari 15.4ということはiOS15.4なわけで、リリースは2022/03です。1年半も経過しiOS17も出そうな時期であるためそろそろいいんじゃないかと・・・

~~でも旧OS使っている人は数パーセントでもいるのはいそうなので、安全を取ろうとするとやっぱり無理なのかなとも思いつつ~~