OmniAICreator/Qiita-1.07M huggingface dataset:
IAM Identity Center + Entra ID（P1なし）構成でグループを使う方法

AWS IAM Identity Center（以下IdC）をEntra IDと組み合わせてSCIM連携を行いたいが、P1ライセンスがないために、グループやグループメンバーシップ（どのユーザーがどのグループに所属しているかの情報）の同期ができないケースがある。
そんな時、暫定措置となる方法について整理しておく。

## 背景
Entra ID（旧Azure AD）は無料で使用できるが、機能制約があり、解除するには[P1やP2といったライセンスの購入](https://www.microsoft.com/ja-jp/security/business/microsoft-entra-pricing)が必要になる。

|やりたいこと|無償版|有償版（P1以上）|
|:---|:---|:---|
|IdCのIdPとして設定し、認証に使用する|○|○|
|SCIM連携によってユーザーや属性をIdCに同期する|○|○|
|SCIM連携によってグループやグループメンバーシップをIdCに同期する|×|○|

※他の機能は省略

検証環境でIAM Identity CenterやQuickSight、DataZoneなどと連携している分には問題ないのだが、本番運用を見据えた設計を行おうとすると、この機能制約が地味に効いてくる。規模が大きな環境では、ユーザー単位の認可設定を運用に載せることは現実的でないからだ。

人事異動や組織改編に伴う変更を、QuickSightをはじめとするアプリケーション側で個別に行うこともつらみがある。組織ごとに個別事情は当然あるとはいえ、Entra IDを管理する部門で（できれば人事データと自動連携させて）一元的に行い、個々の利用部門はその結果を享受する形が、やはり合理的である。

そうするとP1以上のライセンスを必要数分用意しなければならなくなるわけだが、有償ライセンスなので、大人の事情ですぐにはどうこうできない場合が多い。
せめて認証はEntra IDで一元化しつつ、P1ライセンスが準備できるまでの経過措置として、グループおよびグループメンバーシップをIdC側で管理できないか？というのが、ここでのモチベーションである。

## 解決策

AWS CLIを使って、IdC側でグループの作成・管理とグループメンバーシップの管理を行うことができる。SCIMで同期されたEntra IDユーザーをこれらのグループに参加させることも可能。
QuickSightやDataZoneはあくまで「IdC」と連携しているので、IdCにグループがあれば、ひとまずグループメンバーシップ問題には対処できる（一元管理を志向する場合、将来的にEntra IDグループへの移行は必要になる）。

なお、マネジメントコンソールではこれは実現できない。
マネジメントコンソール上は、IdPがEntra IDなど外部IdPの場合は「そちらで管理すべき」という基本姿勢を保っており、追加・修正系の操作ができないためだ。
もっとも、メンバーシップ管理が必要なユーザー数を考慮すれば、マネジメントコンソールでのマニュアル操作はそもそも現実的でないので、大勢に影響はないとも言える。

## CLI

前置きが長くなったが、CLIは以下（IDは全てダミーです）。

```shell:グループ作成
aws identitystore create-group \
--identity-store-id d-1234567abc \
--display-name <グループ名> \
--profile <該当アカウントのSSOプロファイル> 
```

```shell:グループへの追加
aws identitystore create-group-membership \
--member-id UserId=1234ab56-7890-123a-1b23-45678901c2d3 \
--group-id a1b2cd34-56e7-8901-2345-6ab7c890123d \
--identity-store-id d-1234567abc \
--profile <該当アカウントのSSOプロファイル>
```

`member-id`は、IdCで保持しているID（Entra IDのIDではない点に注意）。マネジメントコンソールからも確認できるが、CLIで一覧表示したい場合は以下。

```shell:メンバーIDの列挙
aws identitystore list-users \
--identity-store-id d-1234567abc \
--profile <該当アカウントのSSOプロファイル> \
--output json
```

## まとめ

Entra IDのP1ライセンスを入手するまでの経過措置として書いたが、P1の入手目処が立たない場合は恒久対策ともなり得る。その場合は、以下に注意して運用を組み立てる必要がある。

- グループおよびメンバーシップをIdCで管理することの組織内合意
- 誰が/どのように人事情報を反映するか
- 属性を元にした自動管理の余地（例：DynamoDBで属性と対応グループを管理し、SCIMイベントをトリガーにLambdaでメンバーシップを操作する）
イメージ図で学ぶ生成AIパスポート

# はじめに

10月に生成AIパスポート試験を受ける事にしました。
https://guga.or.jp/outline/



以下の本で勉強しています。
https://amzn.asia/d/2xf1Fc9

# 勉強していて気になること

①略称をフルで覚えたい

GAN, RNNなど、略称が数多く登場しますが、フルネームを覚えておくと、何のことかイメージしやすいです。
本ページ内で、折りたたみで表現しているので、何の略称か考えてから、開いてみてください。
用語の詳細な説明は、テキストを参照しましょう。

②図が欲しい

Amazonのレビューにも書かれてますが、文と表ばかりで図が少なく、勉強していてイメージがしづらいです。
そこで、私のイメージを図にしたものを、ここに載せておきます。

この試験を勉強している他の方の参考になれば幸いです。

# キーワード集

<details><summary>ANI</summary>
Artificial Narrow Intelligence

特化型の人工知能

↓レース専用の車
🏎️

</details>

<details><summary>AGI</summary>
Artificial General Intelligence

汎用型の人工知能

↓汎用的な自動車
🚙

</details>

<details><summary>CNN</summary>
Convolutional Neural Network

畳み込みニューラルネットワーク

画像生成AIで使用される。

折り紙の端から、どんどん折りたたんで、小さくなるイメージ。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/9f8d9bb8-f8dd-3219-fe6a-c4d8ae0fd28c.png" />
</details>

<details><summary>VAE</summary>
Variational Auto Encoder

変分自己符号化器

画像生成AI、動画生成AIで使用される。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/204d61ca-2776-7796-6fda-5e2ed688fd15.png" />

</details>

<details><summary>GAN</summary>
Generative Adversarial Networks

敵対的生成ネットワーク

画像生成AI、動画生成AIで使用される。

↓この絵文字
🤼

生成器と識別器の戦い。

</details>

<details><summary>RNN</summary>
Recursive Neural Network

回帰型ニューラルネットワーク

動画生成AI、音楽生成AIで使用される。

↓この絵文字
:repeat:

アウトプットしたデータを、次の処理のインプットに回すイメージ。

</details>

<details><summary>LSTM</summary>
Long Short-Term Memory

長・短期記憶

↓この絵文字
:arrow_right::leftwards_arrow_with_hook:

より長期間に対応。

</details>

<details><summary>Transformerモデル</summary>

文書内の重要な箇所に赤のマーカーが引かれているイメージ。そこに注目して情報を処理する。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/95f0323c-fe07-905c-465d-60afa6cc3cf0.png" />

</details>

<details><summary>RLHF</summary>
Reinforcement Learning from Human Feedback

人間のフィードバックで改善する

↓この絵文字
🗣️🤖💡

</details>

</details>

<details><summary>NLP</summary>
Natural Language Processing

自然言語処理

テキスト生成AIで使用される。

コンピュータに人間の言葉を覚えさせる。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/403b9321-3974-bad8-8793-98da0112c2c1.png" />

上の図は、DALL E-3という画像生成AIに描かせてみました。
https://openai.com/index/dall-e-3/

</details>

<details><summary>MLM</summary>
Masked Language Model

BERTで採用された、マスクした単語の前後から、その単語が何かを予測する。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/8d77e4a1-bdf8-0441-9925-ed16cb0f0c4a.png" />

</details>

<details><summary>NSP</summary>
Next Sentence Prediction

ある文が、別の文の直後に来るかを予測すること。

ドラッグ&ドロップで並び替えているイメージ。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680908/bb3edd7f-a2aa-4f5f-1a6c-aac8a0e42866.png" />

以下のサイトを参照
https://sortablejs.github.io/Sortable/
</details>
RubyでprivateメソッドをRspec等で呼び出す方法

# 結論 sendメソッドを使おう！

```
class User
  def greet(name)
    "Hello, #{name}!"
  end

  private

  def secret_method
    "This is a secret!"
  end
end

user = User.new
puts user.send(:greet, "Alice")  # => "Hello, Alice!"
puts user.send(:secret_method)   # => "This is a secret!"
```
[Authentication] Challenge and Response Authentication

# 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/0dcbeada-b217-9d77-a2ba-7b45b029d978.png)


# 参考リンク
- [令和4春38](https://www.ap-siken.com/kakomon/26_haru/q38.html)
WEBエンジニアを目指して転職活動を開始する

## 自己紹介
初めまして。ゴローと申します。
「初めまして」といいながらも大学院生時代にQiita初投稿をしており、
とあるきっかけを機に再度投稿をしてみようと考え戻ってきた
**あれからもう4年が経ってしまった**
今回は、自分と同じ失敗をしないように就活生の方などのための情報発信になればと考えて投稿します。

### Qiita再投稿のきっかけ
タイトルを見て察しているかと思いますが、WEBエンジニアを目指して転職活動をすることになったのがきっかけです。
では、なぜ転職を考えるようになったのかを話したい

### 転職を考えるようになった理由
ずばり、今の会社ではエンジニアとしての将来性に自信を持てなかったから。
前提として、メーカーの社内SEとして勤務しているんですが、どんなところに将来性を見出せなかったかというと
- 開発スキルよりも会社の知見の方が重視される
- 会社の知見がベテラン社員数名に属人化されていて若手への教育体制が不十分（主観）
- 開発言語がマイナー→IBM i環境でRPGを使っている
    - 正直読みにくい　ググっても情報が不足していることが多い
    - とはいえ希少言語の実務経験が積めるという点は良いと思っている
- 上流から下流工程まで一貫してできると言われて入ったのに最近上流のみになった
    - 自分が納得できるまで開発は続けていたかった
- 技術が不要な仕事を任されることが多くなった（稟議や役員向けプレゼンなど）

など諸々の理由から日に日にエンジニアとしての自分の成長を感じなくなっていったのが原因

### これから
とりあえず、dodaとレバテックに登録して話を聞いてもらった
メーカーの社内SEは安定しているが、技術力という点ではどうしても弱くなりやすいとコメントがあった
自分の希望としては、大学院生の時に迷ってやめたWEBエンジニアとして、フリーランスでも案件を獲得できるほどのスキルを身につけられる企業に転職をしたいと考えている。目標は3年
で、転職活動をしつつWEBエンジニアを目指すものとしての自己研鑽を頑張っていきたい

具体的には、サムライエンジニアがやった方がいいって言ってた以下をやろうと思う

1. クラウドサーバー
1. 仮想環境
1. データベース
1. フロントエンドフレームワーク
1. バックエンドフレームワーク
1. バージョン管理ツール

国立大情報系出身だけど、正直データベース以外ほぼ自信ない。

これからは自己研鑽の記録を残していけたらなと思って、決意の投稿をします。


就活中のみんな伝えておきたい。エンジニアとして活躍するなら、安定を求めて地元のメーカーにはいくな。
【Linux】コマンドで短縮URLを生成する方法

## 短縮URLを生成する

以下のコマンドを実行するとis.gdを使用して短縮URLを生成できます。

```terminal
curl "https://is.gd/create.php?format=simple&url=http://example.com"
```

https://www.is.gd/apishorteningreference.php

## プレビューページありの短縮URLを生成する

以下のコマンドを実行するとv.gdを使用してプレビューページありの短縮URLを生成できます。

```terminal
curl "https://v.gd/create.php?format=simple&url=http://example.com"
```

短縮URLをクリックするとリダイレクト前に以下のようなプレビューページが表示されます。

![スクリーンショット 2024-09-07 23.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9d3fd2f7-b2da-6acb-0a99-d1c1270c75dd.png)

https://v.gd/apishorteningreference.php
ラズベリーパイ4B + MH-Z19CでのCO2濃度測定で2024時点にはまったこと

# はじめに

ラズベリーパイ4B + MH-Z19Cを使用したCO2の濃度測定をしました。
この構成自体は、他の記事で試されている方もいるので、
ピン配置やサンプルプログラムは多くの先行記事があると思います。

構築の仕方はそちらを参照してもらえればと思うのですが、
mh-z19 をpip installするときにはまってしまったのでその対処の仕方をここでは書こうと思います。

# 環境

ラズベリーパイOS 64bit版の [2023-05-03ver](https://downloads.raspberrypi.com/raspios_arm64/images/raspios_arm64-2023-05-03/)を使用しております。

```shell
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
```

また、デフォルトでのpythonのバージョンは、3.9です。

# mh-19cのインストール

先駆者の記事をもとに、以下のようなインストールを実行するとインストールに失敗する。

```shell
pip install mh-z19
```
この時に、lgpioをローカルでビルドしようとしてエラーになります。

# 理由

ラズベリーパイOSがBookwormをサポートし始めたというところもあり、Bookwormはデフォルトでインストールされているlgpioを内部で使用しています。
(ラズパイ5はRPI.GPIOがどうやら使えないとのこと)
https://github.com/gpiozero/gpiozero/issues/1120#issuecomment-1951405471

そのため、mh-z19ライブラリも、それに合わせて変更をしていってるようです。

現に、pypiのhistoryを見てみると、2024年5月と8月に新しいバージョンがリリースされています。
https://pypi.org/project/mh-z19/#history

このチケットを見るとgithubのissueで3.1.5からbookwormに対応すべく、lgpioを依存関係として含めているように変更してるようです。
https://github.com/UedaTakeyuki/mh-z19/issues/53#issuecomment-2095335182

# 解決方法

遅くなりましたが、mh_z19のバージョンを落としてインストールしてやったらいいです。

```shell
pip install mh-z19==3.1.3
```

ちなみに私は最初どこまで落としたらいいのかわからなかったので 0.6.3までバージョンを落としてしまいましたが。。。
Rubyの配列とか、ハッシュとか、、、

## 始めに・・・
先日後輩のコードレビューをしていた際に「ハッシュがさぁ！ハッシュがさぁ！」と先輩ぶっていたが単純に配列だったという悲しいことを晒したので懺悔の意味も込めて、、、


## 配列とは、、、
配列とは複数のデータを纏めて格納できるオブジェクト
```ruby
#空の配列
[]
#サンプル
['配列1','配列2','配列3']
#クラスはArray
[].class #=> Array

#サンプル
irb(main):003> a = ['配列1','配列2','配列3']
=> ["配列1", "配列2", "配列3"]
irb(main):004> a[0]
=> "配列1"
```

主にRailsだとeachで使う気がする
```Ruby
numbers = [1,2,3,4,5]
irb(main):009> sum = 0
=> 0
irb(main):010* numbers.each do |n|
irb(main):011*   sum += n
irb(main):012> end
=> [1, 2, 3, 4, 5]
irb(main):013> sum
=> 15
```
あとmapとか？（最近はpluckとの使い分けを気にしてる）
```Ruby
irb(main):014> new_numbers = []
=> []
irb(main):015> numbers.each { |n| new_numbers << n * 10}
=> [1, 2, 3, 4, 5]
irb(main):016> new_numbers
=> [10, 20, 30, 40, 50]
```
※余談だがidのみの使用とか要素がわかってるものに関してはpluckの方が良い。
```Ruby
# 全て取得できるので小回りは効く。book.titleとか呼べる。但し全部ロードするからデータ量が多くなるときつくなる
books = Book.all
book_ids = books.map { |book| book.id }

# idだけ使うとかの場合はpluckのほうがコスパいい
book_ids = Book.pluck(:id)
```

## ハッシュ
ハッシュはキーの組み合わせでデータを管理するオブジェクト。連想配列と呼ばれたりする
```Ruby
irb(main):018> {}.class
=> Hash

# 文字列の場合
irb(main):019> currencies = {'japan'=>'yen','us'=>'dollar','india'=>'rupee'}
=> {"japan"=>"yen", "us"=>"dollar", "india"=>"rupee"}
irb(main):021> currencies['india']
=> "rupee"

# シンボルの場合
irb(main):001> currencies = {:japan=>'yen',:us=>'dollar',:india=>'rupee'}
=> {:japan=>"yen", :us=>"dollar", :india=>"rupee"}
irb(main):002> currencies[:japan]
=> "yen"

# 「=>」は省略できるよ
irb(main):001> currencies = {japan: 'yen',us: 'dollar',india: 'rupee'}
=> {:japan=>"yen", :us=>"dollar", :india=>"rupee"}
irb(main):002> currencies[:us]
=> "dollar"
```

ちなみに構造は `[キー1]=> 値1, [キー]=>値2`みたいな感じ。
キーは別に文字列じゃなくていい。むしろシンボル（:hoge）の方が良い。
理由は文字列（string)は変更が効くから、場合によってキーが変わる。
```Ruby
# 文字列の場合
irb(main):022> string = 'apple'
=> "apple"
irb(main):023> string.upcase!
=> "APPLE"

# シンボルの場合
irb(main):024> symbole = :apple
=> :apple
irb(main):025> symbole.upcase!
(irb):25:in `<main>': undefined method `upcase!' for an instance of Symbol (NoMethodError)
```

コツコツ復習やっておこう（戒め）
PowerAppsアプリでPDF化したファイルをSharePointリストに保存する方法

PowerAppsアプリでPDF化したファイルをSharePointリストに保存する方法
以下のコードをボタンなどのOnSelectプロパティに記入

//↓sharepointサイトアドレス:https://●●●●●●●●.sharepoint.com/sites/●●●●●●
UpdateContext({_siteurl:"sharepointサイトアドレス"});

//↓保存するリストを表示したときのアドレスの▲▲▲▲▲▲部分。https://●●●●●●●●.sharepoint.com/sites/●●●●●●/Lists/▲▲▲▲▲▲/AllItems.aspx
UpdateContext({_listname:"PDFファイルを保存するリストの名前"});

UpdateContext({_openurl:Blank()});//ファイルのURL用変数を一度空にする

UpdateContext({_datetime:Text(Now(),"yymmddhhmmss")});//現在日時を文字列にする

UpdateContext({_pdfname:$"PDF化ファイル{_datetime}.pdf"});//PDFの名前を設定（日時を入れる）

UpdateContext({_pdfvalue:PDF(Gallery1)});//PDF関数を使ってGallery1をPDF化

UpdateContext(
    {
        _pdfsaveid:Last(
            Collect(
                PDFリスト,
                {
                    タイトル:_pdfname,
                    添付ファイル:Table(
                        {
                            DisplayName: _pdfname,//ファイル名
                            Id:GUID(),//IDを取得。無いとエラーになります。
                            Value: _pdfvalue//中身
                        }
                    )
                }
            )
        ).ID
    }
);

//保存したファイルのURLを作成 https://●●●●●●●●.sharepoint.com/sites/●●●●●●/Lists/▲▲▲▲▲▲/Attachments/●●/PDFファイル●●●●●●●●.pdf
UpdateContext({_openurl:$"{_siteurl}/Lists/{_listname}/Attachments/{_pdfsaveid}/{_pdfname}"});

//保存したファイルを開く
If(
    !IsBlank(_openurl),Launch(_openurl & "?web=1")
)
React Hook Formでデフォルト値を設定する方法

# はじめに
React Hook Formを使用して、登録されているレコードの値があればモーダルのフォームに値を埋めた状態で、表示したかったのですが、結構実装に時間がかかったのでやり方を残しておきたいと思います。

# 実現したいこと
存在するレコードであれば、編集ボタンを押したら、モーダルが開き、保存されている値を表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/eca9794b-74a6-0ff4-d734-5d6485c00d56.png)


# 詰まったところ
クリックしたら、そのレコード情報を表示したかったが、前にクリックしたレコードの情報が残り続けて、更新されなかった。

# 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/3a02ff5a-8f69-1291-94f8-cebd2a4e8636.png)
赤丸の編集ボタンをクリックします。
その際に、recordの情報（青で囲った部分）を渡します。
propsでrecord(編集をクリックした際に、渡されたレコード情報)を受け取ります。
valueでtitleを設定し、編集ボタンがクリックされた際に渡されたrecordの情報をuseEffectで更新します。

この際に、注意してほしいのが、useEffectでresetとsetTitleを設定して、値を更新することです。
更新しないと前の値のキャッシュが残っていて、値が正常に更新されません。
```tsx
reset({
  title: record.title,
  time: record.time,
});
```

- 以下は全体のコード
```tsx
const { record } = props;
const [title, setTitle] = useState<string>("");

useEffect(() => {
  if (record) {
    reset({
      title: record.title,
    });
    setTitle(record.title);
  }
}, [reset, record]);

return(
  <FormControl isInvalid={!!errors.title}>
    <FormLabel>タイトル</FormLabel>
    <Input 
      value={title}
      {...register("title", {
        required: "内容の入力は必須です",
        onChange: (event) => {
          setTitle(event.target.value) 
        }
      })} />
  </FormControl>
)
```

# 終わりに
結構悩んだところなので、忘れずに押さえておきたいです。

# 参考
https://react-hook-form.com/docs/useform/reset
VertiTab - サイドパネルの縦型タブ v2.7.0

皆さんこんにちは、VertiTabがv2.7.0に更新されました

Chromeブラウザに最適なサイドバータブ管理拡張機能へようこそ

インストールアドレスはここにあります:

[https://chrome.google.com/webstore/detail/chejfhdknideagdnddjpgamkchefjhoi](https://chrome.google.com/webstore/detail/chejfhdknideagdnddjpgamkchefjhoi)

### 追加
- **ブックマーク管理**を追加: フル機能のブックマーク管理機能を追加
- **タブナビゲーションバー**を追加: 外観オプション、表示: タブ、ブックマーク、履歴、最近閉じたタブ、リーディングリスト、クイックアクセスをサイドパネルに表示
- **タブをグループに追加**メニューを追加: 新しいグループまたは既存のグループにタブを追加
- 検索キーワードのハイライトを追加
- プレミアムエディションの予約を追加
### 変更
- Cookie、ReadingList、およびブックマークの権限をオプションの権限に調整し、使用にはユーザーの承認が必要
### 非推奨
- **オプションページ - 履歴 - サイドパネルに表示**: このオプションは*タブナビゲーションバー*に置き換えられ、まもなく非推奨になります

### 修正
- サイドバーを最初にクリックしたときにグループ展開ボタンが表示されない問題を修正
- ブラウザを再起動して拡張機能アイコンをクリックすると、ポップアップまたはサイドバーの再選択が必要になる問題を修正
- ピン留めされたタブアイコンとクイックアクセスアイコンのサイズが一致しない問題を修正
Azure WebAppsのBYOC証明書がスロットに反映されないとき

AzureのWebAppsでバックグラウンドサービスを起動し、
EventGridへMQTTサブスクライブ接続するというなんともマニアックな要件です。

EventGridのMQTT接続はクライアント証明書認証が必要なので、
WebAppsのBYOC(Bring Your Own Certificat)のストアに入れる必要があります。

この証明書がデプロイスロットに反映されない、ということで
検証してみたところ、どうやら再作成する際に証明書ストアも更新される模様。

ちなみに確認方法：
`certutil -user -store my`
これで証明書の情報が出てくればOK。

ちょっとどこ調べても情報が出てこなかったので、誰かのお役に立てば。
こんな構成にするやつはなかなかいないとは思いますが。
大規模言語モデルのアテンションヘッド徹底解説: 理論と実験結果から見える未来

# Attention Heads of Large Language Models: A Survey

今回は、最新の研究成果である「Attention Heads of Large Language Models: A Survey」という論文をご紹介します。本論文は、LLM（大規模言語モデル）の内部メカニズムを深く理解することを目的とし、特に「アテンションヘッド」の機能に焦点を当てた研究のレビューを行っています。LLMの推論過程におけるアテンションヘッドの役割を詳細に分析し、既存の研究を体系的に整理しています。

### 論文情報
- **タイトル**: Attention Heads of Large Language Models: A Survey
- **リンク**: [https://arxiv.org/abs/2409.03752](https://arxiv.org/abs/2409.03752)
- **発表日**: 2024年9月5日
- **著者**: Zifan Zheng, Yezhaohui Wang, Yuxin Huang, Shichao Song, Bo Tang, Feiyu Xiong, Zhiyu Li
- **DOI**: [10.48550/arXiv.2409.03752](https://doi.org/10.48550/arXiv.2409.03752)

## 背景と目的

### LLMの現状と課題

LLMは自然言語処理の多くの分野で革新をもたらしました。BERTやGPT、さらにLLaMAなどのモデルは、多くのタスクで人間のパフォーマンスを上回る結果を示しています。しかし、これらのモデルの内部メカニズムは依然として不透明です。これにより、モデルの性能向上や問題解決のプロセスにおいて、実際にどのように推論が行われているのかが不明瞭なままであり、これがLLMの「ブラックボックス性」と呼ばれています。

特に、LLMの「アテンションメカニズム」が重要な役割を果たしていることは広く知られており、文脈理解や推論において中心的な機能を担っていますが、アテンションヘッドが具体的にどのように機能しているかについては、未解明な部分が多いです。アテンションヘッドの特性を解明することは、モデルの予測をより信頼性のあるものにするために不可欠です。

この論文は、特に「アテンションヘッド」の機能とその役割に焦点を当て、LLMの推論過程を解明することを目的としています。さらに、既存の研究成果を整理し、新たな4段階のフレームワーク（知識呼び出し、文脈特定、潜在推論、表現準備）を提案しています。

### アテンションヘッドに関する研究の意義

アテンションヘッドは、モデルがどのトークンに「注意を払う」かを決定する要素です。各ヘッドは、異なるトークン間の関係性を学習し、その関係に基づいて適切な情報を抽出することができます。しかし、ヘッドごとの役割が異なるため、特定のヘッドがどのような情報を処理し、どのようにモデルの出力に影響を与えているのかは、これまでの研究では十分に解明されていません。

特に、LLMの推論過程において、アテンションヘッドがどのように協調して機能し、文脈の理解や推論の精度向上に寄与しているのかを理解することは、今後のモデル設計や性能向上において極めて重要です。

## 研究の焦点

### アテンションヘッドの4段階フレームワーク

この論文では、LLMのアテンションヘッドが人間の思考プロセスに似た形で機能していると仮定し、以下の4段階のフレームワークを提案しています。

1. **知識の呼び出し（Knowledge Recalling, KR）**  
   モデルが過去に学習した知識を適切に呼び出し、それを現在の文脈に結びつける段階です。ここでは「記憶ヘッド」や「定数ヘッド」が活躍し、学習データからの知識を適切に文脈に適用します。特に、BERTやGPTといったモデルにおいては、パラメトリックな知識の適用が鍵となっています。

2. **文脈の特定（In-Context Identification, ICI）**  
   アテンションヘッドは、文脈内で重要な要素を特定し、文法的・意味的な関係性を明らかにします。ここでは「位置ヘッド」や「文法ヘッド」が、文脈の構造や意味を把握するために使用されます。これにより、モデルは文脈全体の理解を深め、推論のための重要な情報を抽出します。

3. **潜在推論（Latent Reasoning, LR）**  
   収集された情報を基に、モデルが推論を行う段階です。タスク固有の情報や、問題解決のためのパターンを学習し、適切な出力を生成します。「インダクションヘッド」などがこの段階で機能し、文脈内のパターンを特定し、次に来るべきトークンや選択肢を予測します。

4. **表現準備（Expression Preparation, EP）**  
   最後に、推論結果を言語として表現するために準備する段階です。ここでは「信号増幅ヘッド」や「整合性ヘッド」などが活躍し、推論結果を正確に出力として整えます。特に、解答の信頼性や一貫性を高めるために重要な役割を果たします。

### 実験アプローチ

アテンションヘッドの役割を解明するために、本研究では「モデリング不要アプローチ」と「モデリング必要アプローチ」の2つの方法を採用しています。

#### モデリング不要アプローチ
このアプローチでは、既存のLLMに対して直接的な変更を加えることで、アテンションヘッドの影響を評価します。具体的には、**ゼロアブレーション**（特定のヘッドを無効化する）や**平均アブレーション**（ヘッドの出力を平均値に置き換える）を用いて、ヘッドごとの役割を特定します。これにより、各ヘッドが推論に与える影響を定量化できます。

#### モデリング必要アプローチ
一方、モデリング必要アプローチでは、新たなモデルを構築してアテンションヘッドの機能を分析します。ここでは、**プロービング**や**簡易モデル訓練**が用いられ、特定のアテンションヘッドがどのように情報を処理しているのかを詳細に検証します。このアプローチは、より複雑なタスクや長文に対するヘッドの機能を理解するために重要です。

## 実験結果の詳細

実験の結果、アテンションヘッドはタスクごとに異なる役割を持っていることが確認されました。例えば、**「名前移動ヘッド」**は文脈内の名前情報を適切に処理し、**「信号増幅ヘッド」**は出力の信頼性を高めるために重要な役割を果たします。

### 賛否両論
**賛成意見**  
本論文は、LLMのアテンションヘッドに関する包括的なレビューを提供し、これまでの研究を整理している点で高く評価されます。また、アテンションヘッドの役割を4段階に分類する新たなフレームワークを提案しており、これが今後の研究において有益であると考えられます。さらに、実験においても具体的なメソッドが示されており、その信頼性が担保されています。

**反対意見**  
一方で、本研究はまだタスクの種類が限られており、LLM全体におけるアテンションヘッドのメカニズムを完全に解明するには至っていません。また、アテンションヘッド同士の協調メ
ABC370をPythonで（A～D）

トヨタ自動車プログラミングコンテスト2024#9（AtCoder Beginner Contest 370）の解答等のまとめ

https://atcoder.jp/contests/abc370

# A問題
https://atcoder.jp/contests/abc370/tasks/abc370_a

lとrが同じときはInvalid。それ以外はYesNoを条件に合わせて返す。
```python:A
l, r =map(int, input().split())

print("Invalid" if l == r else "YNeos"[r::2])
```
# B問題
https://atcoder.jp/contests/abc370/tasks/abc370_b

問題文通りに実行する
```python:B
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]

now = 1
for i in range(1, n + 1):
    # print(now, i, ":", min(now, i), max(now, i))
    now = a[max(now, i) - 1][min(now, i) - 1]

print(now)
```
# C問題
https://atcoder.jp/contests/abc370/tasks/abc370_c

辞書順で早くなるものを先頭から順に変更して
そのあとに後ろから遅くなるものを変更していく
```python:C
s = list(input())
t = list(input())

lst = []
for s_i, t_i in zip(s, t):
    if s_i < t_i:
        lst.append(-1)
    elif s_i == t_i:
        lst.append(0)
    else:
        lst.append(1)

x = []
for i in range(len(lst)):
    if lst[i] == 1:
        s[i] = t[i]
        x.append("".join(s))

for i in range(len(lst) - 1, -1, -1):
    if lst[i] == -1:
        s[i] = t[i]
        x.append("".join(s))

print(len(x))
for x_i in x:
    print(x_i)
```
# D問題
https://atcoder.jp/contests/abc370/tasks/abc370_d

横方向と縦方向を個別に持つ
探索と削除を高速で行うためにSortedListを使う
```python:D
from sortedcontainers import SortedList


def delete(x, y):
    if x >= 0 and y >= 0:
        wid[x].discard(y)
        hei[y].discard(x)


h, w, q = map(int, input().split())

wid = [SortedList([i for i in range(w)]) for _ in range(h)] # 横方向
hei = [SortedList([i for i in range(h)]) for _ in range(w)] # 縦方向

for _ in range(q):
    r, c = map(lambda x:int(x) - 1, input().split())
    w_i = wid[r].bisect_left(c)
    h_i = hei[c].bisect_left(r)
    if len(wid[r]) > w_i and wid[r][w_i] == c:
        delete(r, c)
    else:
        w_1 = w_2 = h_1 = h_2 = -1
        if w_i > 0:
            w_1 = wid[r][w_i - 1]
        if len(wid[r]) > w_i:
            w_2 = wid[r][w_i]
        if h_i > 0:
            h_1 = hei[c][h_i - 1]
        if len(hei[c]) > h_i:
            h_2 = hei[c][h_i]

        delete(r, w_1)
        delete(r, w_2)
        delete(h_1, c)
        delete(h_2, c)

print(sum(len(w_i) for w_i in wid))
```
【AWS】アカウントエイリアスの作り方

rootユーザでログインして、IAMダッシュボードから作成画面にいける

XXXX@YYYYYY
という表示はXXXXはIAMユーザID
YYYYはエイリアス名（アカウントID）

https://qiita.com/uskayyyyy/items/9ff6a75f73bd634f55cf
ABC370振り返り


[前回の振り返り](https://qiita.com/comet725/items/b1bb4b71cb77a5ce839e)

今日はABC開催日だったので参加結果を振り返る

https://atcoder.jp/contests/abc370

今週も無事A,B,Cの3完(0ペナ)

# A

l,rが同じなら`Invalid`
それ以外は指示に従う

## ソースコード

```python:main.py
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    l, r = rLI()
    if l == r:
        print("Invalid")
    elif l:
        print("Yes")
    else:
        print("No")
        
    
    
if __name__ == '__main__':
    main()

```

# B

N点のグラフとして見立てるイメージで実装
流石にこのレベルのグラフは解ける

## ソースコード

```python:main.py
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    A = {i+1:{j:a for j,a in enumerate(rLI(),start=1)} for i in range(N)}
    ans = 1
    for i in range(1,N+1):
        if ans >= i:
            ans = A[ans][i]
        else:
            ans = A[i][ans]
    print(ans)
if __name__ == '__main__':
    main()
```

# C

1文字ずつ置き換えたものを用意して
辞書順に一番若いものを配列に加える

## ソースコード

```python:main.py
import sys
import heapq
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    S = rS()
    t = rS()
    X = []
    N = len(S)
    s = S
    for _ in range(N):
        if s == t: break
        y = "z"*N
        e = []
        for j in range(N):
            if s[j] == t[j]:continue
            s_list = list(s)
            s_list[j] = t[j]
            w = ''.join(s_list)
            e.append(w)
            if w == t:
                q = t
                break
            if w not in X:
                y=min(y,w)
        else:
            q = y
        s = q
        X.append(q)
        del y
    
    print(len(X))
    for x in X:
        print(x)
    
if __name__ == '__main__':
    main()

```

# D

座標系の問題つらい、時間かけたけど無理だった

# E

E問題の動的計画法はまだ難しい…

# F

これもダブリングなんだね

# G

面白そうだったけど正解者数極端に少ないのでパス

# まとめ

D問題が座標系で撃沈していたが
E問題の動的計画法をチャレンジすべきだったか
判断は難しいところ
MOD Reboot フェーズII

MOD Dwarf や MOD Desktop を開発している MOD Audio の Gianfranco さんから、今後の MOD Audio についてのあり方、MOD Dwarf や MOD Desktop の将来像についての投稿がありましたので、翻訳してみました。

https://forum.mod.audio/t/mod-reboot-phase-two/11785

***

親愛なるコミュニティのみなさん。

今回は重要なニュースをお届けします。

### こちらが概略です。

わたしたちはソフトウェアアセット（資産）を同産業仲間に売却し、わたしたちの従業員はパートタイムでその協力関係についてはたらいています。このことはより小さなパートタイムのチームを作らなければならないという負担はありましたが、あらたな収入をもたらし、プレッシャーを軽減しました。

さらにこれらの協力関係は、以前は活用できなかった価値あるリソース（資源）や機会をもたらし、わたしたちの地位を確固なものとし、先へ進む力をもたらしました。

結果として、次のようなアクションがとられます。

* 残りのクラウドファンドされたDwarfユニットは追加の経費なしに出荷されます

* わたしたちはオープンソースにコミットしています。わたしたちのファームウェア、基盤、メカニカル・デザインを含めてハードウェア・デバイス（Dwarf、Duo X、Duo)のソースコードを公開します

* わたしたちはより多くのコミュニティへの参加とオーナーシップを育むため、インフラの改善、開発に投資します

### それではこれより詳細な説明です。  

#### 新たなパートナーシップとファンディング

2023年中旬から、わたしたちは音楽機器産業の他の企業と協力関係を模索し、わたしたちの技術をより活かせないか討論してきました。１０年以上におよぶペダル型Linux組み込み機器の開発により、わたしたちはこの分野における迅速な対応を可能にする強力なツールキットを開発してきました。

この業界がデジタルを可能とするデバイスに移行するにつれ、わたしたちは新たなビジネス機会を利用しようとしています。これらのコラボレーションは新たな収入源となり、わたしたちが新たな自信をもって、より継続可能なペースではたらいていけるようになります。

しかしながら、この全身にはトレードオフ（交換条件）があります。わたしたちのスタッフの時間の一部がこれら外部のプロジェクトに割かれるのです。しかし、そのことで今まで持ち続けてきた、今すぐ結果を出すというプレッシャーからは開放されます。

#### クラウドファンドされたユニット

わたしたちの主要な優先順位は、KickstarterやIndiegogoのキャンペーンの残りのMOD Dwarfを届けることです。

2022年10月のわたしたちのリブートで集められた資金は、当時無料配送には足りませんでした。ほかの方策を検討しながらも、わたしたちができた最善策は150ユーロのクーポンを導入することでした。わたしたちはこの選択肢で支えてくれた403人の支援者に深く感謝します。あなたがたの忍耐力はわたしたちの存続に不可欠でした。

あらたな資金のおかげて、のこりのユニットを送料無料で届けることができます。準備はすでに開始され、年末にはすべてのユニットを発送できると考えています。支援者にはまもなく出荷情報が通知されます。心から遅延をお詫び申し上げます。この努力がわたしたちの約束したものを反映していると望んでいます。

#### より高いオープンソースへのコミットメント

MODの長くつづくチャレンジの一つは、MODをオープンソースのライセンスに留めることでした。数年来、わたしたちは完全にオープンソースであることから遅れをとっており、オープンソース・コミュニティからはオープンではないとされ、ビジネスを念頭においた利害関係者からはオープンすぎるといわれる難しいポジションに陥っていました。

2022年のMOD Audioリブートでは、この問題に再度取り組みました。わたしはMODが完全にオープンソースを享受することを報告することに興奮を覚えています。わたしたちはDuo、Duo X、Dwarfのすべてのデバイス（ファームウェア、デザイン、基盤を含む）についてのソースコードを公開する予定です。OSイメージ生成のための内部開発ツールのすべては公開できませんが、ユーザが変更を加えたカスタムイメージが利用できるように必要な変更を加える予定です。

リモート・ウェブ・インターフェースであるmod-uiはすでにオープンソースですが、コミュニティーが完全にプラットフォームにアクセスできるようにオンライン・ペダルボード・フィードのソースコードもリリース予定です。

#### MODプラットフォームをよりユーザー、ソフトウェア中心に

コミュニティへの参加とこの会社の財政基盤を強固にするため、わたしたたちはこのプラットフォームをよりユーザー中心にしていきます。これはデバイスベースの企業アイデンティティからユーザーベースへのアイデンティティの移行であり、リソースをデスクトップ・アプリへ集約します。

これらの変更の目的は、あらたなユーザーの掘り起こしと、ソフトウェア・コラボレーションの一元化、わたしたちのプラグイン・マーケットプレースへの集客です。さらに、より多くのコミュニティ参加を促すために、わたしたちは開発者にコミュニティ内での有償開発を依頼する計画もあります。

この移行がデバイスの廃止を意味することではないということは心に留めておいてください。それとはまったく反対に、デバイスはMODの協力な柱であり、このことはわたしたちの新たなパートナーシップの将来に向けても確実なものです。しかし、わたしたちがより継続可能になるには、より強固なソフトウェアだけの枝葉が必要となります。


#### ネクスト・ステップ

* ユーザーが再パッケージできる特別なMOD OS 1.13.Xアップデートのリリース

* 最新の変更、改良を反映したMOD OS 1.14のリリース。詳細はナイトリー・ビルドの形式で提供されます。これがわれわれの現行の内部アーキテクチャを使った最後のバージョンであり、これ以降mod-uiとmod-desktopのための新たな技術を追うことが可能になります

* DAWのオーディオ・プラグインとして動作する機能を含むMOD Desktop 0.13が大幅なアップデートで公開されます

これらのリリース後、わたしたちは必要な組織変更をおこなうために、新たな機能の開発を一旦停止します。この停止期間中、ユーザーは継続して開発中のOSのパッケージング、再配布ができます。わたしたちとしてはコミュニティ・ベースのOSイメージが出回るのを期待しているというわけです。

上記に記載したことのすべては、すべて同時に起こることではもちろんありません。わたしたち側の一方的なクラウドファンドの配送は別にして、提案された変更にはユーザーの対話や支援、開発が含まれます。

会社の再編成に長く時間がかかりましたが、わたしはこれからは、わたしたちが着実に前進することができるだろうと言えます。

これから数週間中、新たなことがたくさん来ます。その間、わたしにみなさんの未来についての考えや望みを聞かせてください。わたしたちがそれに沿って形付けられるように。

Gianfranco, aka The MOD Father
ABC369参加記録　by Python

# リアルタイムに解けた問題

## [A - 369](https://atcoder.jp/contests/abc369/tasks/abc369_a)

### 問題文
整数 
$A,B$が与えられます。

以下の条件を満たす整数$x$が何通りあるか求めてください。

- 条件：3つの整数$A,B,x$をうまく並べることで、等差数列を作ることができる。

なお、3つの整数$p,q,r$をこの順に並べた列が等差数列であるとは、$q−p$が$r−q$と一致することをいいます。


### 制約
- $1 \leq A, B \leq 100$
- 入力は全て整数

### アルゴリズム
AとBが等しいときは1通り、AとBの差の絶対値が偶数であれば、AとBの間に$x$を入れることができるので3通り、これら以外のときは2通りの$x$がある。

### ソースコード
``` python
A, B = map(int, input().split())

if A == B :
  print(1)
elif abs(A-B) % 2 == 0:
  print(3)
else:
  print(2)
```

## [B - Piano 3](https://atcoder.jp/contests/abc369/tasks/abc369_b)

### 問題文
高橋君は、横一列に並んだ100個の鍵盤からなるピアノを持っています。このピアノの左から$i$個目の鍵盤のことを鍵盤$i$と呼びます。

高橋君は今からN回にわたってこのピアノの鍵盤を一つずつ押すことでとある曲を演奏します。$i$回目に押す鍵盤は鍵盤$A_{i}$であり、それを押す手は$S_{i}$=<font color='Red'>L</font>のとき左手、$S_{i}$=<font color='Red'>R</font>のとき右手です。

演奏を始める前、高橋君は両手をそれぞれ好きな鍵盤の上に置くことができ、この時点での疲労度は0です。演奏中、片方の手を鍵盤$x$の上から鍵盤$y$の上へと動かすと疲労度が$∣y−x∣$増加します（逆に、手の移動以外で疲労度が増加することはありません）。なお、ある手である鍵盤を押すためには、その手がその鍵盤の上に置かれている必要があります。

演奏が終了した時点での疲労度は最小でいくつになるか求めてください。

### 制約
- $1 \leq N \leq 100$
- $1 \leq A_{i} \leq 100$
- $N$,$A_{i}$は整数
- $S_{i}$は<font color='Red'>L</font>または<font color='Red'>R</font>

### アルゴリズム
疲労度が最小となるのは、左右の手の初期位置が、それぞれ演奏で始めて使われる鍵盤の位置であるとき。まず、左右の手の初期位置を求めてから、疲労度をループで計算していく。

### ソースコード
``` python
N = int(input())

AS = [list(input().split()) for _ in range(N)]

left_pos = -1
right_pos = -1

tired_num = 0

for left in AS:
  if left_pos != -1:
    break

  if left[1] == 'L':
    left_pos = int(left[0])

for right in AS:
  if right_pos != -1:
    break

  if right[1] == 'R':
    right_pos = int(right[0])

for a in AS:
  if a[1] == 'L':
    tired_num += abs(int(a[0]) - left_pos)
    left_pos = int(a[0])
  else:
    tired_num += abs(int(a[0]) - right_pos)
    right_pos = int(a[0])

print(tired_num)
```
ABC368参加記録　by Python

# リアルタイムに解けた問題

## [A - Cut](https://atcoder.jp/contests/abc368/tasks/abc368_a)

### 問題文
N枚からなるカードの山があり、上からi枚目のカードには整数$A_{i}$が書かれています。

山の下からK枚のカードを取り出し、順序を保ったまま山の一番上に乗せました。

この操作後の山の上から順に、カードに書かれた整数を出力してください。


### 制約
- $1 \leq K < N \leq 100$
- $1 \leq A_{i} \leq 100$
- 入力は全て整数

### アルゴリズム
pythonのlistでスライスを使う。

### ソースコード
``` python
N, K = map(int, input().split())

A = list(map(int, input().split()))

for a in A[-K:]:
  print(a, end=" ")

for a in A[:-K]:
  print(a, end=' ')

print()
```
MacBookAir に Kali Purple をインストール

# 主要ポイント
　（略）

## 前提
　iso
　　https://www.kali.org/get-kali/#kali-installer-images
　　https://cdimage.kali.org/kali-2024.1/kali-linux-2024.1-installer-purple-amd64.iso
　PC
　　macbook air (11inch)

## checksumを確認する
```
$ openssl sha256 [.iso filename]
```
↑出力の情報がWebサイト記載のチェックサム情報と一致することを確認する

## インストール用USBを作成する
```
$ sudo dd if=file.iso of=/dev/sdX conv=fsync bs=4M
```

## USBから起動してインストール
　（略）

## 必要に応じて、Wifi関連を調整
```
# apt-get install -y firmware-b43-installer
# apt-get install -y linux-headers-X.X.X-amd64
# shutdown -r now
# lsmod | grep wl
```

# サイトポリシー
当ページをご利用いただくにあたっては、以下の事項に全て同意いただけた場合に限り、ご利用いただけます。
なお、当ページの利用規定を予告なしに変更する場合がありますので、ご了承ください。

### 本ページの目的と利用者責任について
当ページは関連情報の整理を主目的としています。
当ページに掲載された内容のご活用は、ご活用者の責任において行われるものとします。
当ページで提供する情報の内容について、掲載した情報の内容が正確であるか？有用であるか？更新時期が適切かどうか？などを一切保証をするものではありません。
また、掲載された情報をご利用いただいた結果、万一、ご利用者が何らかのトラブル、被害、損失、損害等が発生したとしても、一切責任を負うものではありません。
なお、当ページに掲載されている情報等につきましては、予告なく変更、又は削除されることがありますので、あらかじめご了承ください。
Databricksジョブの実行イベントの確認

こちらを翻訳していて新たな機能に気づきました。

https://qiita.com/taka_yayoi/items/9eda1db71a7b2b2708bb#%E5%AE%9F%E8%A1%8C%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88-%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E9%80%B2%E6%8D%97%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E9%87%8D%E8%A6%81%E3%81%AA%E6%83%85%E5%A0%B1%E3%82%92%E7%A2%BA%E8%AA%8D

ジョブの実行結果にアクセスすると、右下に**実行イベントを表示**というボタンが表示されています。

![Screenshot 2024-09-07 at 22.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c0c56465-5be5-8f60-5448-371868d974a2.png)

こちらからジョブに関連するイベントを確認することができます。知りませんでした。
![Screenshot 2024-09-07 at 22.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bf90451b-792e-a23c-eaf6-5cbd1a4cab45.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
ICMPを擬人化して解釈してみた

お疲れ様です！
今回はICMPについてです。
プロトコルは約束事や規約だとよく言われますが、私的にもう少し簡単にわかりやすく解釈できないかな〜？と常々思っています。
なので今回はざっくりICMPとはこんな人だろうなという私の独断と偏見で擬人化してみました。
 ICMPを利用するコマンドはICMPという人の一側面、◯◯モードとしてご紹介します。

前回の記事の続きなのでこちらを読んでいただけると嬉しいです。

https://qiita.com/prelude_op3-2/items/09a2748c86fcb6e69976

# 基本情報
ICMP （Internet Control Message Protocol：インターネット制御メッセージプロトコル）は、ネットワーク間における処理の誤りや、通信に関する情報の通知などに使われるプロトコルです。 ICMPはIP（Internet Protocol）の一部で、安全と正確性を保証するサポート役です。
IPはIPアドレスの情報を元に送り届ける仕組みなので送受信が成功したかまでは検出できません。
送信元ホストに対してパケットが届かなかった場合や、経路が存在しない場合など、ネットワークのどこに問題が発生しているのかを教えるためにICMPは開発されました。IPがルーティングを行い、 ICMPがネットワークの状態を管理し、TCPとUDPがそれぞれ異なる方法でデータ送信します。


# 性格
**親切で積極的**: ルータやスイッチからの通信にいつも応じており、困っているデバイスにはすぐに助けに行く、全デバイスの味方。

**注意深い**: ネットワークの状態を常に監視しており、異常やエラーが発生した際にすぐに報告する。

**助け合いの精神**: 自分の役割は他のデバイスを助けることであり、そのために汎用性のあるメッセージを送ることに喜びを感じる。

# コミュニケーションスタイル
ICMPの話せる言葉一覧です。ICMPメッセージタイプと言い、ネットワークの状態を確認したり、エラーを通知するための手段です。また各メッセージタイプには特定のエラーコードや情報が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782993/f8d08e28-c645-5f38-cadb-6865a7f92ed5.png)

# 挨拶モード（ping）
挨拶モードではpingコマンドを使います。
タイプ８のエコー要求で「元気？」と聞いて安否を確認します。シンプルだけど重要なコミュニケーションです。
生きていればタイプ０で応答が返ってきます。
何らかの理由で相手が応答できない場合はタイプ３でエラーメッセージを返します。
タイプ3にはエラーの具体的理由に応じて異なるコードがあり、返ってきたコードを見ることで、宛先に届かなかった原因がわかります。

タイプ３のコード一覧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782993/da114fb8-0e13-1c44-60cf-da8ec0a9ed31.png)

そもそも声をかけた相手が人違いだった場合はタイプ５、TTL（Time to Live）が超過してしまった場合はタイプ11で返ってきます。

# 旅人モード（trecert）
旅人モードではtrecert(Windows)、traceroute(macOS、Linux)コマンドを使います。
目的地に辿り着くまでのデバイスを訪ね、到達するまでのデバイス情報、宛先までの最短通信経路の教えてくれます。trecertはpingを飛ばした時にも表示されるTTL（Time to Live）の仕組みを利用して地図を作ってくれます。

:moyai:TTLとはネットワークパケットのライフタイムを表す値です。
制限をかけなければ無限にネットワークを彷徨うことになるので、パケットが生存できるホップ数を制限しています。

例えると、TTLとは旅を続けるための印のようなもので、各ルーターが門だとすると、TTLとはどれだけ門を通過出来るかという回数です。門を通る度に印の数字を引いて、０になったときにタイプ11のTime Exceeded Messageを送信し、辿り着いた場所を把握して元の場所に戻ります。印の数字を増やして再挑戦し、繰り返すことで目的地に辿り着きます。
デフォルトのTTLはそれなりに多いので、自宅のPCではタイプ11の返事はないのですが、ネットワークの設定やルーティングの問題によりパケットがループしていたり、大規模なネットワークだと表示されやすいです。

試しにtraceroute www.google.co.jp

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782993/f19ab78e-cfb7-8e69-738f-e43defd96ec4.png)
最初の行であるはGoogleのIPアドレス216.58.220.99の経路を調査しますとあります。最大ホップ数64追跡可能で各パケットサイズは40バイトです。
その下の各行はホップを示しています。
例えば1900gst2 (192.168.2.1) 10.654 ms 3.065 ms 3.077msの場合。
1はホップ番号。
wrc-1900gst2 (192.168.2.1)はそのホップのホスト名とIPアドレスです。 
10.654 ms, 3.065 ms, 3.077 msは、送信された３つのパケットの応答時間です。
これらの時間はパケットがルーターに到達するまでの時間で、1回目の応答時間が1番長いことを示しています。
3~8行目のホップはルータの設定で見れなくなっています。
このようにつれない対応されることもあります。
９行目はゴールです:triangular_flag_on_post:


# 探偵モード（pathping）
pingとTracerouteを組み合わせたものです。
Tracerouteはルートの可視化ですが、pathpingは各ホップごとに遅延とパケットロスの情報を表示されるのでどのデバイスで問題が発生しているのか デバイスを詳細に調査し、パケットの損失や遅延を追跡します。問題を特定し、全体のネットワークの健康状態を報告するため、データに基づいた詳細な報告書を作ってくれます。
pathpingはWindowsで提供されているネットワーク診断ツールなのです。
macOSとLinuxはtracerouteコマンドにオプション指定したり、mtr（My Traceroute）を利用すると近いことが出来ます。

# さいごに
ICMPはネットワーク上の多くの重要な役割を果たしており、ネットワークの正常な運用を支える存在です。彼（または彼女）がいないと、通信の障害を特定したり修正したりするの が難しくなります。
現場で仕事を教えてくれる方が、デバイスやプロトコルを人の様に扱って愛でているので、感化されて書きました。
皆さん仲良くしてあげてください。
ここまで読んでくださりありがとうございました！

参考文献：技術評論社　ネットワーク超入門　基礎知識からTCP／IPまで
【React】100本ノック #04 Timer

## はじめに
フロントエンドスキル向上のため書籍やudemyでインプットを行っていますが、アウトプットも並行して進めるべく[@Sicut_study](https://qiita.com/Sicut_study "Sicut_study")さんのReact100本ノックを始めることにしました。

https://qiita.com/Sicut_study/items/1e4d8ec06f1af42a47e5

## ルール
- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
## 今回作るもの
タイマーアプリ

## 条件
[@Sicut_study](https://qiita.com/Sicut_study "Sicut_study")さんとは少し違う条件で実装しています。

1\. ユーザーは分と秒を入力してタイマーを設定できる。
2\. スタートボタンを押すとカウントダウンが開始。
3\. 一時停止ボタンを押すとカウントダウンが停止。
4\. リセットボタンでタイマーが設定時間に戻る。

## 成果物
https://incredible-platypus-c54609.netlify.app/

https://github.com/okido-yukinari/04-timer.git

### 使用技術

- React
- TypeScript
- MUI

### PC
![04_timer_pc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453680/a78eb118-7b9a-e144-0a1b-e5cdb8d1819a.png)

### SP
![04_timer_sp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453680/41ebb6f4-4694-359a-5937-0f6fdfc659c0.png)

## 感想
今回タイマーアプリを実装するにあたりuseEffectを使用しましたが、その偉大さを痛感しました。。。
あと要素の非活性にする際 `disabled` を使用していたのですが、これがアクセシビリティ的によろしくないということを初めて知りました。

https://qiita.com/kobayashimakoto/items/e8e19cc019c863990237

作っていく中で色んな発見があるのでホントに面白いです！
ABC367参加記録　by Python

# リアルタイムに解けた問題

## [A - Shout Everyday](https://atcoder.jp/contests/abc367/tasks/abc367_a)

### 問題文

AtCoder王国の住民はA時になるとたこ焼きへの愛を叫ぶことになっています。
AtCoder王国に住む高橋君は毎日B時に就寝しC時に起床します。高橋君は、起きているときはたこ焼きへの愛を叫ぶことができ、寝ているときは叫ぶことができません。高橋君が毎日たこ焼きへの愛を叫ぶことができているか判定してください。ただし、一日は24時間であり、高橋君が寝ている時間は24時間未満であるとします。

### 制約
- $0 \leq A,B,C < 24$
- $A,B,C$は異なる
- 入力は全て整数

### アルゴリズム
まずは、BとCどちらが大きいか比べる。その後、AがBとCの間に位置するかで処理を分岐する。

### ソースコード
```python
A, B, C = map(int, input().split())


if B > C:
  if C < A < B:
    print('Yes')
  else:
    print('No')
else:
  if B < A < C:
    print('No')
  else:
    print('Yes')

```

## [B - Cut .0](https://atcoder.jp/contests/abc367/tasks/abc367_b)

### 問題文

実数Xが小数点以下第3位まで与えられます。
実数Xを以下の条件を満たすように出力してください。

- 小数点以下の部分について、末尾に<font color='Red'>0</font>をつけない
- 末尾に過剰な小数点を付けない


### 制約
- $0 \leq X \leq 100$
- Xは小数点第3位まで与えられる

### アルゴリズム
条件を満たす数値になるまで、ループを回し、末尾の文字によって、末尾を削除するか、ループを終えるのかの処理を分岐させる。

### ソースコード
``` python
X = list(input())

while True:
  if X[-1] == '0':
    X.pop(-1)
  elif X[-1] == '.':
    X.pop(-1)
    break
  elif X[-1] != '0':
    break

for x in X:
  print(x, end='')

print()
```
Go言語：Go1.22 で機能強化された net/http.ServeMux について、ちょっとしたこと

いささか、旧聞に属しますが、今年の初めに出た Go1.22 で HTTP サーバーのルーティングに使われる net/http.ServeMux の機能が強化されて、HTTPメソッドの指定ができるようになり、かつ URL パターン文字列にワイルドカードが使えるようになりました。例として、次のような書き方ができるようになりました。

```
mux := http.NewServeMux()
mux.HandleFunc("GET /test/{id}", Test)
...
```

このように書くと、``` handler ``` 側で ``` Request.PathValue ``` メソッドを使うことにより ``` {id} ``` の値を取得できるようになりました。

```
func Test(w http.ResponseWriter, r *http.Request) {

	id := r.PathValue("id")
	fmt.Printf("id = %s\n", id) // {id} の値が表示される
...
```

使えそうな機能強化ですが、ふと、疑問が頭に浮かびまして、

```
mux.HandleFunc("GET /test/{id}.dat", Test)
```

と、ワイルドカードの後に拡張子を付けて書いてみたらどうなるのだろう、と。
で、実際に書いてテストしてみました。Go のバージョンは ``` 1.22.0 ``` です。
結果は ``` panic ``` でした。

```
panic: parsing "GET /test/{id}.dat": at offset 10: bad wildcard segment (must end with '}')
```

「最後が ``` } ``` で終わらないとダメだ」と言ってます。
じゃあ、拡張子の部分もワイルドカードにして

```
mux.HandleFunc("GET /test/{id}{suffix}", Test)
```

としてみたらどうか？
これもパニック。

```
panic: parsing "GET /test/{id}{suffix}": at offset 10: bad wildcard name "id}{suffix"
```

「ワイルドカードの名前として ``` id}{suffix ``` はダメだ」と言ってます。
よくわからないので、おとなしく [Go 1.22 のリリースノートの該当部分](https://tip.golang.org/doc/go1.22#enhanced_routing_patterns) を読んでみました。

>Wildcards in patterns, like /items/{id}, match segments of the URL path.

訳すと「/items/{id} などのパターン内のワイルドカードは、URL パスのセグメントと一致します」だそう。一つのセグメント全体を一つのワイルドカードにしなければいけない、ということのようです。
じゃあ、２つのセグメントにそれぞれワイルドカードを割り当てたら？

```
mux.HandleFunc("GET /test/{group}/{id}", Test)
```

これはいけました。
``` group ``` も ``` id ``` も ``` Request.PathValue ``` で値を取得できました。
ふ〜む・・・、これでいいのかな？
VMwareToolsがインストールできない


Windows7をクリーンインストールで仮想環境を構築したところVMwareToolsがインストール出来なかったので、解決方法を共有します。

## 実行環境と構築OS
* MacBook Pro 13インチ, 2020 (Intel版)
* macOS Sonoma 14.6.1
* VMware Fusino プロフェッショナル 13.6.0
* Windows 7 Professional 64ビット版（SP1適用済み）

<img width="400" alt="スクリーンショット 2024-09-07 17.35.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/684ab166-936b-9172-7358-17470ea05db2.png">

## 不具合内容
`簡易インストール`で、Windows7をクリーンインストールしたところ、メニューの`仮想マシン` > `VMware Tools のインストール` が無効なためインストール実行が出来ない。
<img width="400" alt="スクリーンショット 2024-09-07 10.53.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/481048e4-933a-259b-d13d-4254424ba51e.png">

## 試してみたこと
* Windows Updateも警告が無くなるまで更新
* CD/DVDを自動検出に変更
しかし、状況は改善しませんでした。

## 改善方法
`簡易インストール`では無く、`カスタム仮想マシンを作成`にて構築すると改善します。
<img width="400" alt="スクリーンショット 2024-09-07 0.32.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/cae43438-b98f-394d-b32a-ac4af3b11808.png">

作業工程が若干増えますが、こちらからの手順で`VMware Tools のインストール`が実行出来るようになりました。
<img width="400" alt="スクリーンショット 2024-09-07 18.08.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/286379f5-8508-2780-0b75-445f276abb87.png">

## VMware Tools インストールでのエラー
インストールを実行出来るようになりましたが、今度は下記エラーにより、インストールすることが出来ません！

:::note alert
ドライバー ソフトウェアの発行元を検証できません
:::

<img width="400" alt="スクリーンショット 2024-09-07 18.27.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/4639e8e4-73e1-cd85-57e2-948872c42fe6.png">

これは、`SHA-2 コード署名`がサポートされていないと、エラーが発生するようです。

https://docs.vmware.com/jp/VMware-Tools/11.1/rn/VMware-Tools-1110-Release-Notes.html#knownissues


## 更新プログラムの手動インストール
Windows Updateを実行すると、こちらもエラーにより更新する事ができません。

:::note alert
エラー：
コード 80072EFE　Windows Update で不明なエラーが発生しました。
:::

<img width="400" alt="スクリーンショット 2024-09-07 20.03.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209706/2881ec03-c7a2-0965-8a9d-7323b168f86b.png">

下記のカタログからダウンロードして、番号順にKBをインストールする事で、Windows Updateが利用出来るようになります。

1\. [KB4474419](https://catalog.update.microsoft.com/search.aspx?q=KB4474419 "MicrosoftUpdate カタログ")
2\. [KB4490628](https://catalog.update.microsoft.com/search.aspx?q=KB4490628 "MicrosoftUpdate カタログ")
3\. [KB4516655](https://catalog.update.microsoft.com/search.aspx?q=KB4516655 "MicrosoftUpdate カタログ")
4\. [KB4489878](https://catalog.update.microsoft.com/search.aspx?q=KB4489878 "MicrosoftUpdate カタログ")

WindowsUpdateの更新が失敗する事もありますが、その場合は何度かリトライすると成功します。
また、100以上のアップデートがあるので、更新時間も数時間を要します。
一通り、更新が済みましたら、`VMware Tools`を実行すると、エラー無くインストールする事ができます。
文字列をTrue or Falseに変換する

#### 環境

Ruby2.6
Rails4.0

#### Booleanの判断の仕方

RubyにはBooleanClassというは存在していません。その代わり、FalseClass、TrueClassというのが存在します。なぜ、そのような設計をしたのだろうか。他言語から移行した人からしてみれば訝しく思うのも無理はない。

Boolean型つまり、FalseClassかTrueClassかの判断は、このようなやり方で判断することになります。

```sample.rb
if params.is_a?(FalseClass) or params.is_a?(TrueClass)
    puts "いわゆるBoolean型です"
else
    puts "いわゆるBoolean型ではありません"
end
```

#### テスト結果

```test.rb
params = true       # いわゆるBoolean型です
params = True       # エラーになります
params = TRUE       # エラーにはならないがwarningになる（広義の意味でエラー）
params = false      # いわゆるBoolean型です
params = False      # エラーになります
params = FALSE      # エラーにはならないがwarningになる（広義の意味でエラー）
params = ""         # いわゆるBoolean型ではありません
params = nil        # いわゆるBoolean型ではありません
params = 0          # いわゆるBoolean型ではありません
params = []         # いわゆるBoolean型ではありません
params = "aa"       # いわゆるBoolean型ではありません
params = 12         # いわゆるBoolean型ではありません

```

他言語から移行してきた人は目を疑うかも分かりませんが、True、Falseは有効になりません。true、falseと書きましょう。

#### Railsで文字列をtrue or falseに変換する

Railsで開発をしていて、Viewでチェックボックスにチェックをした場合はtrue、外した場合はfalseをGETで送信させることがありました。GETで送信されるデータは当然文字列です。TrueClassの属性を持たせたまま送信することはできません。

trueで送信したところで、実際には"true"という文字列で送信されます。Railsのコントローラーの中でparamsで拾った後、内部的に"true" or "false"ではなく、true or falseで判断させたい場合は、TrueClass、FalseClassに変換する必要があります。

その場合のやり方がこちらです。

```sample.rb
params = {checkflg: "true"}
boolean = params[:checkflg] == "true"

if boolean.is_a?(TrueClass)
    puts "trueです"
elsif boolean.is_a?(FalseClass)
    puts "falseです"
elsif
    puts "いわゆるBoolean型ではありません"
end
```

"true"であれば、trueを返し、"true"以外であれば、falseを返します。
【プログラミング初心者】0から始めるReact学習 #2 ~Web開発の基本編~

# 1-1.最低限のインプット
## 9月4日
**【最新ver対応済】モダンJavaScriptの基礎から始める挫折しないためのReact入門**の
1~22まで完了。
StackBlitzが推奨とのことだったので、CodeSandboxではなくこちらで勉強開始。

講義22でconstを使ってnameを定義後、${name}を使うと、下記画像のように取り消し線が表示されて焦りました。

![kougi22_torikesisen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877233/536713aa-2b1e-a8ff-bbc2-ff53e797229f.png)

が、consoleにはきちんと望む結果が表示され、、

調べてみると[こちら](https://qiita.com/c_nnnnnn/items/e34795ebe84e8f0dc48d)の記事に
>windowオブジェクトにすでにある変数nameをグローバルスコープで新たに定義しているので怒られているらしい。
>回避方法としてはnameのスコープを限定するかnameをもっと固有の名称に変更するか、TypeScriptで記述する、など。

とあり、解決しました。
焦っても黒い画面を見て止まるのではなく、一度consoleに表示させてみることが大切だと学んだ一日でした。。（笑）
デバッグしやすい書き方が掴めてきた気がする

最近『セイト先生が教えるプログラミング入門』でJavaScriptの勉強に取り組んでいます。その中でデバッグしやすい書き方が少しだけ掴めてきた気がします。
# デバッグ1
まず、第5章第13節「非同期処理を可能にするPromiseオブジェクト」の「Promiseとは」（pp.275-277）でPromiseオブジェクトを使った関数の例（foo）が紹介されていたのですが、1-10 & 12-16行目の { } 内が少し長かったためか、
```
foo.then((resolve) => {...
});
```
（p.275. コード12-16行目. { }内は省略）

のところで、fooの後ろに書くべき () が抜けていたことに気付かず、全体をハイライトしてctrl + shift + LでCursorのAIに聞いてみてもどこがおかしいのか自分にはよく分かりませんでした。そのためしばらく苦戦していたのですが、最終的に下記のような形で細かく関数を定義することを思いつきました。その上で再びAIにどこに問題があるのか尋ねたところ、上述の問題点を見つけることが出来ました。
```js
// 教科書p.275. 4-8行目
const function0 = (condition, resolve, reject) => {
    if (condition) {
        resolve("成功");
    } else {
        reject("エラー");
    };
};

//教科書p.275. 2-9行目
const function1 = (resolve, reject) => {
    const condition = true; //教科書p.275. 3行目
    function0(condition, resolve, reject);
};

// 教科書1-10行目
const foo = () => {
    return new Promise(function1);
};

// fooと同様に定義 cf.教科書p.276
const bar = () => {
    return new Promise(function1);
};
const baz = () => {
    return new Promise(function1);
}; 

//教科書p.275. 12-14行目
const function2 = (resolve) => {console.log(resolve);};

//教科書14-16行目
const function3 = (reject) => {console.log(reject);};

// 教科書p.276
//foo().then(function2).catch(function3).finally(() => {
//    console.log("リクエスト処理が完了しました。");
//});

const asyncFunction = async () => {
    await foo().then(function2).catch(function3);
    await bar().then(function2).catch(function3);
    await baz().then(function2).catch(function3);
};
asyncFunction();
```
# デバッグ2
次に躓いたのは、第6章第3節「カウンター・プログラム2」でした。このときは、間違っていたのは本ではなく私の方で、
```js
    for (let index = 0; index < document.getElementsByClassName("js-button").length; index++) {
        document.getElementsByClassName("js-button")[index].addEventListener("click", (e) => clickHandler(e))
    }
```
（p.301. コード14-16行目）
のaddEventListenerの引数を私は clickHandler(e) と書いていました。このときも以前、関数を設定したのと同じように、変数を設定することで自分にとって読みやすいようにすることにしました（下記）。
```js
const $button = document.getElementsByClassName("js-button");
for (let index = 0; index < $button.length; index++) {
    $button[index].addEventListener("click", (e) => clickHandler(e);
    );
}
```
# 結論
初心者の自分が分からないだけで、変数や関数が多くなると何かデメリットがあるのかもしれないが、今勉強しているかぎりでは、括弧の中身は短い方が読みやすくていいと思いました。
いつでも簡単？WindowsでBSOD入門

# はじめに
皆さんはBSODになったことはありますか？
BSODって何だって方言葉を調べてみてください。
きっと、言葉は知らないだけでその身に覚えがあるはずなので...

直近ではCrowdStrikeのBSOD騒ぎが記憶に新しいかと思います。

https://cloud.watch.impress.co.jp/docs/column/infostand/1611934.html

https://www.crowdstrike.jp/statement-on-falcon-content-update-for-windows-hosts/


そんなBSODですが、任意起こせることはご存じでしょうか？
今回はWindowsでBSODを引き起こして、突然の死を身近なものにして心身の負担軽減に役立てられればと思います。
なお、実機でも行うことができるらしいですが、さすがにそんな勇気はないので、
仮想環境を使って、案外自分で撮るのが難しいきれいなBSODの画面を素材の提供もできればと思っています。

# 環境
冒頭でも述べたように今回は以下の様に仮想環境を使います。
(Hyper-Vでの仮想環境の構築はここでは説明しませんあしからず)
- 仮想化ソフト: Hyper-V
- 利用するイメージ: Windows11

仮想環境で行う利点としては、
躊躇なくできることと、BSODのきれいな素材が手に入れられることです。
また、Hyper-Vなら、VMのデバッグコマンド(Debug-VM)が使えるのも今回の決め手となりました。

https://learn.microsoft.com/en-us/powershell/module/hyper-v/debug-vm?view=windowsserver2022-ps&viewFallbackFrom=win10-ps

なお、勇気がある人は[実機でもできる](https://jpwinsup.github.io/blog/2021/02/15/Performance/Hang_BSOD/ForcingSystemCrash/#%E7%89%A9%E7%90%86%E7%92%B0%E5%A2%83%EF%BC%88%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E6%93%8D%E4%BD%9C%EF%BC%89)みたいなので試してみるのも乙ですね。

# 実践
基本的には以下の記事のHyper-Vでの方法に従って行うだけです。
[ブルースクリーンの強制実行 | Microsoft Japan Windows Technology Support Blog](https://jpwinsup.github.io/blog/2021/02/15/Performance/Hang_BSOD/ForcingSystemCrash/)

今回はWindows11なので、
"Hyper-V ホストが Windows 10 または Windows Server 2012 R2 以降の場合"
を参考にHyper-V上でWindowsが起動している状態で、
以下のコマンドをホストマシンのPoweshell(管理者権限)で叩くのみです。Let's BSOD!!

```powershell
Debug-VM -name "ダンプを取得する仮想マシン名" -InjectNonMaskableInterrupt -Confirm:$false -Force
# 仮想マシン名にスペースを含む場合はダブル コーテーションで括ってください。
```

# 結果
はい、以下の様に素晴らしいBSODの素材がたくさん手に入りました。
BSOD自体もコマンド叩けばすぐ発生するので、何回でも叩けばBSOD慣れもすぐです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/203df3c5-debb-b750-5086-ee59fc6b7b47.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/9011986e-c50c-1353-61f7-533e2b1a62ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/cd19ead1-207b-4e8f-d512-c8da4f7c4566.png)

なお、何回かやっていると他に何種類かのメッセージのブルースクリーンが出た気がするのですが、
一瞬の出来事で素材として保存することができませんでした。残念。

# おわりに
今回BSODを自らの手で発生させていきました。
実機で起きるとびっくりしちゃいますが、仮想環境で起こす分なら心理的負担なくできますね!
また、今回手に入れた素材ですが、スクリーンセーバなどに設定しておくことで、常に自分の心を鍛えることができるのもいい点ですね()

# 参考
- [Windows 11 をダウンロードする](https://www.microsoft.com/ja-jp/software-download/windows11)
- [ブルースクリーンの強制実行 | Microsoft Japan Windows Technology Support Blog](https://jpwinsup.github.io/blog/2021/02/15/Performance/Hang_BSOD/ForcingSystemCrash/)