OmniAICreator/Qiita-1.07M huggingface dataset:
鬼門Nvidia Driver Driver 520.61.05 （20.04/22.04）

# Developer Forumで噂のトンデモバージョン

:::note info
補足
- 社内のテクニカルドキュメント（プロシージャ）
- 情報共有しない社内のAIチームのアンチテーゼ
- 適正に情報が共有されるように掲載（リマインド）
:::


## 2022年にCUDA11.8にするとかといって発生したとんだとバッチリをくらいました。
**なぜがか520.61.05 は消えません** というのも・・・
- Pytorchの古いバージョンを上げる際にCUDAのアップが必要だった
- CUDA Tool Kitで11.8を選ぶと520.61.05にされてしまう（Ubuntu 20.04）

https://forums.developer.nvidia.com/t/multi-gpu-and-multi-display-with-520-driver-one-display-frequently-on-off/234994

# 症状
- 画面真っ暗
- 再起動もできない

## HDMIが使えなくなるという致命的な問題が出ます。
- モバイルモニター使いにはビビりが入るネタですね。


# 対応
‐ 参考にした手法


https://lookbackmargin.blog/2020/03/15/nvidia-ubuntu-gui-unshowed/

1. UEFIのメーカロゴ画面でESCを押し、GRUBメニューを出します。
![Grub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/0492d459-ffc3-de71-1229-381cc2a589ae.png)

2. なお、ゲーミングキーボードなど反応が早いものは1回の押下で連写に似た状態になり、GRUBプロンプトが開きますので、通常のキーボードを強く推奨します。
2. Advanced option for Ubuntu を選択します。
2. 複数のカーネルがあれば、そのカーネルと（Recovery mode）がありますので、あやまってあのドライバをインストールしたカーネルの（Recovery mode）をせんたくします。
2. いくつかメニューはでますが、解決はできません。できるのはROOTだけです。

## ROOTを使える状態にする
- 画面が評されるドライバの”run”ファイルを起動するカーネルでダウンロードしておきます。
- カーネルを1つしか登録してないとちょっと厳しい道のりではあります。（Noveauにするのがちかみちかもしれません）

たとえば、このような方法などでリカバリモードでNvidia ドライバの破損ファイル群をなくしてから処理するといいでしょう。

https://www.web-dev-qa-db-ja.com/ja/nvidia/ubuntu-1804%E3%81%A7nvidia%E3%81%8B%E3%82%89nouveau%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95/998303945/

```Ubuntu:ターミナル画面

# Recovery mode のrootで

cd /home/ユーザー名/(runファイルを保存したディレクトリ）

./(run) ファイル実行

```

# 画面は映るようにはなる。

:::note info
インフォメーション
この方法ではひとまず動かすということになるので、注意が必要ですね。
- 22.04なら535で使えるので、なかなか問題ないですが、Pytorch2系を使うなら注意がひつようですね。
:::
git diff でファイル名の変更を表示する

## **はじめに**

Gitは、ソフトウェア開発において広く使用されているバージョン管理システムです。開発者はしばしば、ブランチ間の変更点を確認する必要があります。特に、どのファイルが変更されたかを知ることは、コードレビューやマージ前の確認作業において非常に重要です。この記事では、**`git diff`** コマンドを使用して、変更されたファイルの名前だけを表示する方法について説明します。

## git diff で変更したファイルを比較する

**`git diff`** は、Gitにおいて非常に強力なツールです。このコマンドは、ブランチ間やコミット間での変更内容を詳細に表示します。しかし、時には変更されたファイルの名前だけを知りたい場合もあります。これは、特に多くのファイルが変更されている場合に役立ちます。

変更されたファイルの名前だけを表示するには、**`git diff`** コマンドに **`--name-only`** オプションを追加します。例えば、現在のブランチと **`origin/develop`** ブランチとの間で変更されたファイルの名前を表示するには、以下のコマンドを使用します：

```bash
git diff --name-only origin/develop
```

このコマンドは、**`origin/develop`** と現在のブランチの間で変更されたファイルの名前のみをリストアップします。これにより、どのファイルが変更されたかを一目で確認できます。

## **おわりに**

**`git diff --name-only`** コマンドは、変更されたファイルの名前だけを簡単に確認するための便利な方法です。大規模なプロジェクトや多くの変更が含まれるブランチで作業する際に特に役立ちます。このコマンドを使うことで、変更の概要を迅速に把握し、効率的なコードレビューやマージプロセスを実現することができます。
この物理ファイルはどの論理ファイルが紐づいているのか？の調べ方

## はじめに

皆さんは、物理ファイルと論理ファイルはどのような規則で運用されていますか？

細かい規則は各組織ごとに異なっていても、大抵の場合は一見してどの物理ファイルから作られた論理ファイルか判別できるようにしているかと思います。

しかし、もし異なるライブラリーに同じ名前の物理ファイルが存在していたら、実際はどちらを参照しているのか判別がつかない場面もあるように思います。

この記事では、ある物理ファイルに対して、どのような論理ファイルが紐づいているのか調べる方法についてご紹介します。


## 調べ方

`DSPDBR`（データベース関係表示）コマンドを使用します。

`DSPDBR FILE(ライブラリー/物理ファイル名)`

上記コマンドを実行すると、（画像１）のような結果が表示されます。

「指定されたファイルに従属するファイル」に記述されているファイルが、紐づいてる論理ファイルです。

（画像１）
![searchPfLf_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/34b9a81a-7369-67e2-942e-9e1f4d3b006e.jpeg)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。

## 関連した投稿

[この論理ファイルはどの物理ファイルに紐づいているのか？の調べ方](https://qiita.com/tamaday/items/fd454bdbb6a8b46dab22)
generative-ai-use-cases-jp で Kendra を Enterprise Edition に変更してデプロイ

# はじめに

GitHub で公開されている [generative-ai-use-cases-jp](https://github.com/aws-samples/generative-ai-use-cases-jp) についての記事です。デフォルトでは、Kendra が Developer Edition でデプロイされます。使い方によっては Document の数が多くなったりするので、Enterprise Edition に変更したい事があります。

今回は、Edition の変更を行うショート記事です。



# 変更点

`/packages/cdk/lib/construct/rag.ts`のファイルを開き、47 行目付近にある Edition の指定を、`ENTERPRISE_EDITION` に変更します

```
    const index = new kendra.CfnIndex(this, 'KendraIndex', {
      name: 'generative-ai-use-cases-index',
      edition: 'ENTERPRISE_EDITION',
      roleArn: indexRole.roleArn,
```



この後、次のコマンドを実行しデプロイを行うことで、個別に構成が可能です。

```
npm ci
npm run cdk:deploy
```
1人アドカレの準備まとめ（生成AIについて25記事書きます！）

# はじめに
今年は1人アドカレにチャレンジします！（アドカレのトピックは生成AIにしました）
この記事では、1人アドカレ（とても大変）に向けての準備をQ&A形式でまとめようと思います。同じようにアドカレ（1人アドカレに限らず）に挑戦しようとしている方の参考になれば嬉しいです。一緒に頑張りましょう！

# 1人アドカレの準備のQ＆A形式でのまとめ

## Q1: なぜ1人アドカレに挑戦しようと思ったの？
Qiitanぬいぐるみが欲しいのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/b97a19a2-23fc-0f42-3911-a7f27fab5efb.png)


## Q2: なぜ生成AI？
今年はあまりにも生成AI分野の発展が目覚ましかったです。（おそらくほとんどの人類が）インプット過多になっていて、アウトプットを増やしたいと考えました。トピックを1つに絞ったのは、制約からアイデアが生まれると思ったからです。

## Q3: 生成AIについて現時点ではどのくらい知っている？
比較的早くから生成AIには触れていて、日々キャッチアップはしていますが、技術進展のスピードが私が勉強するスピードを遥かに超えてきています笑
あと、NishikaのChatGPTコンペで２位になったことがあります！

https://twitter.com/AInebosuke/status/1656611895930130432

## Q4: 具体的には生成AIのどんな記事を書く予定？
ハンズオン的な記事を書いて、読んだ人も触ってみたくなる記事にしたいと思います。具体的には、GPTs、LangChain、RAG、OpenAIのAPIの使い方など幅広く扱う予定です。

## Q5: 25記事の勝算はある？
去年の12月（アドカレシーズン）からQiitaでの記事執筆を本格的に始め、今年の12月でちょうど1年になります。合計20記事（実はこの記事が20記事目です！）を書きました。この1年で培った記事執筆力をフル活用し、1人アドカレ完走を成し遂げたいと思います。また、アイデア出しや記事の草案は12月に入る前から準備し、バッファを持たせようと思います（プロジェクトマネジメントは大切）。

## Q6: 1人アドカレを始めるにあたって、参考になったものはある？
下記の記事が参考になりました。子育てをしながら時間を確保されていて、工夫点がとても参考になりました。「やることを宣言する」という章に感化されて、私も1人アドカレ宣言をすることにしました。

https://qiita.com/kakakaori830/items/ef764cf2168927ca67d0

## Q7: カレンダーの名前は？
『生成AIのハードルを下げたい！』にしました。以前書いてプチバズりした記事『Kaggleのハードルを下げたい！』にちなんでいます😂

https://qiita.com/Isaka-code/items/3935cdb2a0bda331e07c

## Q8: 最後に一言！
生成AIの発展を超えるスピードで成長します！
カレンダーの購読や、QiitaとTwitterをフォローしてくださると励みになります。

https://qiita.com/advent-calendar/2023/nebosuke-ai

https://twitter.com/AInebosuke


# 💡お知らせ（2023.12.01追記）
記念すべき第1回目の記事を公開しました！

**『生成AIを活用した勉強方法を体系的にまとめてみました』**

https://qiita.com/Isaka-code/items/6c81f89b48e9e74cb1c9

# 💡お知らせ（2023.12.15追記）
生成AIについての一人アドカレを完走しました！！！🙌
見守ってくださった皆さま、本当にありがとうございました！

**『【祝・アドカレ完走！】生成AIについての記事を1人で25件投稿してみた！』**

https://qiita.com/Isaka-code/items/d5eff037f2c7d3cdbbf6
Azure CLI導入 - Azure - Memo

(自分用メモ)
Azure関連コマンドラインインタフェース(CLI)の準備

az: リソース管理コマンド
func: Function管理用コマンド
azd: 開発用コマンド

- [総目次](https://qiita.com/shokkaa/private/7a1633dbf58ddc81f894)
- [目次: Azure Development](https://qiita.com/search?sort=&q=tag%3AAzure+tag%3Adevelopment+user%3Ashokkaa)


# 環境
- Ubuntu 20.04
- [Node.js/npm](https://qiita.com/shokkaa/items/6f83b3a107006ccc598b)
 
# az: リソース管理コマンド

参考: https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli

```sh:ubuntuにインストールする例
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo -E bash
```
```sh:使用例: Azure Portalにログイン
az login

# リモート環境等ブラウザが使えない場合
az login --use-device-code 

# 加えてテナント(ディレクトリ)も指定する場合
# 事前にAzure Portal上で アカウント➜ディレクトリの切り替え➜ディレクトリID採取
az login --use-device-code --tenant xxxxxxx-112e-xxxxx-900b-xxxxxxxxxxx
```
昨今多要素認証要

# func: Function管理用コマンド
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Cisolated-process%2Cnode-v4%2Cpython-v2%2Chttp-trigger%2Ccontainer-apps&pivots=programming-language-csharp#install-the-azure-functions-core-tools

```sh:使用例: Node.js用プロジェクト生成と関数func1を生成
func init . --worker-runtime node --language typescript
func new --template "Http Trigger" --name func1
```

# [azd: Azure Developer CLI(開発用コマンド)](https://learn.microsoft.com/ja-jp/azure/developer/azure-developer-cli/overview?tabs=linux)

```shell:導入
curl -fsSL https://aka.ms/install-azd.sh | sudo bash
```

```shell:お試しプロジェクト(--template todo-nodejs-mongo)のデプロイ
azd init --template todo-nodejs-mongo  # ローカルにテンプレプロジェクトを初期化
? Enter a new environment name: az241208-dev #アプリIDを入力

azd auth login --tenant-id xxxxxx-xxxxxxxx-xxxxxxxxxxxxx  # PortalでテナントIDを確認しておく
azd up # プロジェクトアップロード(対話的操作が必要)
? Subscription: Visual Studio Enterprise (xxxxx) など
? Location: West US など
```
```:結果
  (✓) Done: Deploying service web
  - Endpoint: https://app-web-wzy5txxxxxxxx.azurewebsites.net/
# SUCCESS: Your up workflow to provision and deploy to Azure completed in 13 minutes 58 seconds.
```
表示されたwebサービスのEndpointでWebアプリが実行されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285723/a0047dd2-5b44-7d83-571e-ebf5a77d61ce.png)
クラウドに降りかかる厄災を統制で無効無効無効無効化ァーーーッ！

# とうせい？どーせい？？？

みなさんは統制の設計・実装を行ったことはありますか？

- 発見的統制　GuardDutyで出来らあっ！
- 予防的統制　Control Towerで出来らあっ！
- 是正的統制　でき・・ない・・・？

是正的統制って簡単にできなくない？？

[ここで僕も関わった国勢調査（宣伝かよ）の9ページ目から抜粋](https://jaguer.jp/2023%E5%B9%B4%E5%BA%A6-ccoe%E5%9B%BD%E5%8B%A2%E8%AA%BF%E6%9F%BB/)

```
　・是正的統制
　　ルールに反しているリソースを正しいリソースに修正することです。暗号化されていない現行データベースのディスクを暗号化したものにマイグレーションする作業などを示す統制です。
```

これが出来ない理由として、最初に統制をつくってからクラウドを使い始めるイケてる会社さんはいいとして、そうじゃない、**統制が後付けの会社ではもう作られたリソースに適用してくのってすげぇ難しく無いか？**

てかこの文章元々書いたの僕だけどｗｗ
やろうとしたらサービス停止の大規模メンテナンス必須じゃないか。。

# じゃあどうやって設計してくんだって話

話変わって、ジョジョリオンってやや酷評されてますよね。一部から読んでるジョジョer(そんな言葉は無い！)としては悲しい、が歴代でも最強クラスのラスボスでエグい能力が大好物なワンダー・オブ・Uの敗北理由がうーむむ。
ただ、この厄災という概念はなんか統制と繋がっている気がするのよ。そう、是正的統制に。
つまり、本稼働しているものに統制を効かせるのは難しい。しかし、リソースが発動した直後なら是正のパワーを効かせられるはず。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334211/796c849c-7e65-d597-edca-ce874b23854b.png" width=40%>

なんかアメコミっぽいぞ、Japanese Stable Diffusion XLさん。。。

### それがクラウドを厄災から守るワンダー・オブ・U！！

# つまりこうです

**発見→是正のステップを踏むのです!!**
リソースが作られたときに、このリソースがどう違反しているか、ちくちく繰り返し自動でリマインダを打ちましょう。そうするともう自動化していいよ、と相手が参ってくれるはずなので、そうなれば自動化の発動ですよ。

### そうなれば一度発動した遠隔型のスタンドと同じに延々とガードレールを叩き込み続けられるはずです！

# そのPoC的な実験ステップでこんなことやってます！

- パスワードとか機微情報をSlackに掲載してるのをボットで監視
- 見つけたら消し込んで注意喚起する。ここまでは手動の出番。
- ボットにパスワードやらの機微情報を辞書に突っ込む
- 次回からは辞書で単語狙い撃ち！該当ポストを狙撃して自動削除＆自動でツッコミメッセージを投下

AI時代に固定文字列かよ！ではありますが辞書データがどんどん賢くなってってSlack起点のセキュリティ漏洩となる厄災をガッチリガードできます。
~~くーこんなに便利ならOSSで書いて自己資産化しておけば良かったｗ~~

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334211/d577cb37-7706-3dd3-ede6-526a07649d78.png" width=40%>

なんか呪いの画像っぽいぞ、Japanese Stable Diffusion XLさん。。。

# むすび

というわけでジョジョ読んでて良かったね！って話でした！！（なんぞ）
【書籍紹介】コンピュータはなぜ動くのか

## タイトル
『コンピュータはなぜ動くのか』
 -- 著：矢沢久雄
 
## 概要
ハードウェアの説明から始まり、ソフトウェアの内部での動きやネットワークについてなど、
**コンピュータに関連する幅広い知識の基礎**が丁寧に説明されています。

- コードはコンピュータにとってどのように解釈されているのか
- オブジェクト指向プログラミングの概念とは
- ネットワークの基礎中の基礎
- 暗号化技術の基礎的な考え方  　        ...など

日頃は意識せず使っているPCについての基本的な知識を得ることができ、
駆け出しエンジニアの私にとってはコンピュータの奥深さと自身の知識不足を痛感させられる内容になっています。

## こんな人にオススメ
- エンジニアとして働き始めたもののコンピュータの知識に自信がない
- プログラミング以外の知識になると分からないことが多い
- 文系未経験からエンジニアを目指すため、プログラミングを勉強中
- 基本情報技術者試験の学習につまずいた

などなど、コンピュータの基礎知識をざっくりと得ておきたい人におすすめです。

## 個人的に参考になった範囲
### 1） 第2章 コンピュータを作ってみよう
この章では、コンピュータの根本的な動作原理を理解するために回線図と色鉛筆を使って疑似的なコンピュータを作成します。
コンピュータの内部構造 や 入力データの伝達方法 など、分かった気がしていた知識をしっかり理解し落とし込むことができました。

本書にも書かれていますが、
**コンピュータ黎明期からの往年の技術者にとって当たり前の知識**は
複雑化した技術の中で**見えづらく**なっており、コンピュータの本質を理解せずともある程度は動かせるようになっている、と感じました。
そんな中でハードウェア部分から理解し直す経験は非常に重要であると思います。

### 2) 第3章 一度は体験してほしいアセンブラ
この章は、「1と2を加算する」というプログラムを実行したときにコンピュータ内部がどのような動作が行われるかを説明した章になっています。

そのツールとして、マシン語(CPUが解釈できる、0と1のみの2進数で示す言語)の数値が意味する命令に英語の略語を割り当てた**アセンブラ**を用いて、「1+2」の実行内容を紐解いていきます。
実際にCPUとメモリの間でデータが受け渡される様子なども解説されており、概念としてしか理解できていなかったCPUの汎用レジスタやメモリのアドレスなど、実際に動かしながら学ぶことができます。

ハンズオン形式で理解していくことによってイメージもし易くなり、業務で使用するJavaやC言語（高水準言語）についてのプログラム内部での動作も以前より解像度が高くなった気がします。

### 3) 第9章 ネットワークコマンドでネットワークの仕組みを確認する
この章では、Windowsで標準装備されているネットワークコマンドを用いて、MACアドレスとIPアドレスの違いやDNSサーバの役割など、ネットワーク分野の基礎中の基礎が説明されています。

私はこれまで（歴1年半ほどですが）ネットワーク分野に対して漠然とした苦手意識を持っていたため、理解を避けてしまっていました（全くと言っていいほど分かりませんでした）。
しかし、ネットワークコマンドを実際に動かしつつ図解でも説明されているため、非常に自然に理解することができました。
私と同じように「ネットワークが怖い」「MACアドレスってなに？」レベルの方は是非読んでほしいと思います。


## 最後に
今回は『コンピュータはなぜ動くのか』という本の紹介をしました。

IT関連の知識量が無限に広がり続けている昨今、しっかりと**コンピュータの本質**を理解した上で業務に取り組むことが重要だと実感しました。

また、あくまでこの本は各分野の浅い部分を素人にもわかるように説明してくれた本だと思うので、ネットワークやコンピュータ内部のことなど、仕事に関連しそうなことはさらに詳しく学習していかないといけないと感じています。

### URL
https://bookplus.nikkei.com/atcl/catalog/22/09/15/00390/
[Rails] routes.rbのresource, resourcesの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbで、名前が似ているresourceメソッド,resourcesメソッドが使用されていたので、その意味、違いについてまとめる。

# resources
７つのアクション（index、show、new、create、edit、update、destroy）のルーティングを一括生成してくれるメソッド
例)
routes.rbに
```routes.rb
Rails.application.routes.draw do
  resources :users
end
```
と書くと,
```
$ rails routes
users     GET    /users(.:format)             users#index
	      POST   /users(.:format)             users#create
new_user  GET    /users/new(.:format)         users#new
edit_user GET    /users/:id/edit(.:format)    users#edit
user      GET    /users/:id(.:format)         users#show
		  PATCH  /users/:id(.:format)         users#update
		  PUT    /users/:id(.:format)         users#update
		  DELETE /users/:id(.:format)         users#destroy
```
のルーティングが生成
# resource
6つのアクション（show、new、create、edit、update、destroy）のルーティングを一括生成してくれるメソッド
例)
routes.rbに
```routes.rb
Rails.application.routes.draw do
  resource :user
end

```
と書くと
```
$ rails routes
new_user  GET    /user/new(.:format)           users#new
edit_user GET    /user/edit(.:format)          users#edit
user      GET    /user(.:format)               users#show
		  PATCH  /user(.:format)               users#update
		  PUT    /user(.:format)               users#update
		  DELETE /user(.:format)               users#destroy
		  POST   /user(.:format)               users#create
```


# resourcesとresourceの違い
- resourcesにはindexアクションのルーティングがあり、resourceにはない
- resourcesには7つのアクションのルーティングがid付きで生成されるが、resourceはidなしで生成される。
つまり、resourceメソッドは複数あるリソースをひとつに絞れない。

# resourcesとresourceの使い分け
- resourcesはusers, postsなど複数存在するリソースに使用。
- resourceはuserのprofileなどログインユーザーから見て一つしか存在しないリソースに使用。

# ちなみにRails APIモードだと...
routes.rbにresources :usersと書くと...
```
$ rails routes
users GET    /users(.:format)        users#index
      POST   /users(.:format)        users#create
 user GET    /users/:id(.:format)    users#show
      PATCH  /users/:id(.:format)    users#update
      PUT    /users/:id(.:format)    users#update
      DELETE /users/:id(.:format)    users#destroy
```
のルーティングが生成。

routes.rbにresource :userと書くと...
```
$ rails routes
user GET    /user(.:format)    users#show
	 PATCH  /user(.:format)    users#update
	 PUT    /user(.:format)    users#update
	 DELETE /user(.:format)    users#destroy
	 POST   /user(.:format)    users#create
```

新規登録画面表示のnewアクション、編集画面表示のeditアクションがなくなった。
# 参考にさせていただいた記事
- [  【Rails】resourcesメソッドとresourceメソッドの違いについて簡単に解説！](https://techtechmedia.com/resources-resource-difference/)
- [Railsのresourcesとresourceついて](https://qiita.com/Atsushi_/items/bb22ce67d14ba1abafc5)
Swiftにおけるクラス名の取得

Swiftプログラミングにおいて、クラス名を取得する方法は多岐にわたりますが、最もシンプルで効果的な方法の一つがString(describing:)を使用することです。この方法は、コードのデバッグやログ出力時に特に便利です。

### クラス名の取得方法
Swiftにおけるクラス名の取得は、以下のように簡単に行うことができます。

```swift
String(describing: クラス名.self)
```
ここで、クラス名.selfは対象となるクラスのメタタイプを指し、String(describing:)を通じてそのクラス名が文字列として取得されます。

### 実装例
以下に、クラス名を取得する具体的な実装例を示します。

```swift
class A {}
struct B {}
enum C {}
actor D {}

struct ContentView: View {
    var body: some View {
        VStack {
            Button("ボタン") {
                print(String(describing: A.self))
                print(String(describing: B.self))
                print(String(describing: C.self))
                print(String(describing: D.self))
            }
        }
    }
}
```
この例では、クラスA、B、C、Dが取得されています。

### 出力結果
上記の実装を実行すると、コンソールに以下のようにクラス名が出力されます。

```
A
B
C
D
```
Raycast + Xcodeで爆速開発したい！

# はじめに
最近Alfredから[Raycast](https://www.raycast.com)に移行しました！[むらお](https://twitter.com/ymurao2)です！
Raycastのスニペットが便利すぎたので紹介します！

## Raycastのスニペット登録方法！
Raycastを立ち上げて、`create snippet`と入力後↓のように入力し`Cmd + Enter`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/7cbb3b70-6593-3244-5c87-360efc5d4994.png"width=400>

## 自動入力！
Raycastのスニペットはキーワードを入力すると、スニペットが自動されます。
便利！すごい！
例) `.fml`と入力すると、`.frame(maxWidth: .infinity, alignment: .leading)`が自動で入力されます！
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/ee641573-374f-015a-90f3-31f9a19011b8.gif)

## Xcodeのハイライトのやつ！
カーソルが当たってくれる！Xcodeすごい！
↓をスニペットに組み込む！
``` /*@START_MENU_TOKEN@*/ハイライトさせたい文字/*@END_MENU_TOKEN@*/```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/bcdcddeb-610f-b01a-2bd5-00ae8ad4131e.png"width=400>

## 自動入力後にカーソルを移動させる！
`.fs`と入力したあと、カーソルが指定位置に移動しています
すごい！
↓をスニペットに組み込む！
`{cursor}`
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/28e72480-0f5b-fc06-3317-89eb13c3e015.gif)

## こんなの登録してます！
開発でよく使うと思われるものたち
| 期待値 | 入力キーワード | スニペット |
| ----------- | ----------- | ----------- |
| .frame(maxWidth: .infinity, alignment: .trailing)       | .fml       | .frame(maxWidth: .infinity, alignment: .trailing)       |
| .foregroundStyle(Color.orange)       | .fs       | .foregroundStyle(Color.{cursor})       |
| var ViewName: some View {} | vview | var /*@START_MENU_TOKEN@*/ViewName/*@END_MENU_TOKEN@*/: some View {} |
| func ViewName() -> soem View{} | fview | func /*@START_MENU_TOKEN@*/ViewName/*@END_MENU_TOKEN@*/() -> soem View{} |
| .clipShape(RoundedRectangle(cornerRadius: 25.0))       | .clirou       | `.clipShape(RoundedRectangle(cornerRadius: /*@START_MENU_TOKEN@*/25.0/*@END_MENU_TOKEN@*/))` |


## おわりに
おすすめスニペットなどあればこっそり教えてください〜！

:::note
この記事がお役に立てば、ぜひいいね👍お願いします！
:::
Microsoft Entra ID 関連のドキュメント

いつも散らばってしまうので自分用のメモです。
とりあえず思い立ったものとをばらばらと記載します。分類はある程度情報が増えてきてからまた今度・・・

Azure Active Directory の新しい名前
https://learn.microsoft.com/ja-jp/entra/fundamentals/new-name

Find Azure AD PowerShell and MSOnline cmdlets in Microsoft Graph PowerShell
https://learn.microsoft.com/en-us/powershell/microsoftgraph/azuread-msoline-cmdlet-map?view=graph-powershell-1.0

Microsoft Entra 認証と承認のエラー コード
https://learn.microsoft.com/ja-jp/entra/identity-platform/reference-error-codes

エラー コード:Azure Active Directory B2C
https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/error-codes

Microsoft ID プラットフォームのコード サンプル
https://learn.microsoft.com/ja-jp/entra/identity-platform/sample-v2-code?tabs=apptype
Microsoft Edge の組み込みマウスジェスチャ機能を有効にする

## 2024 年 10 月追記

いつの間にか Edge の標準機能となっていたようで、2024 年 10 月時点では、[設定] > [外観] > [マウス ジェスチャを有効にする]で有効化できます。

![enableMouseGesture_JA](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/ba51f87e-816d-9e1d-5cdb-5261fd9a2f60.png)

英語版の場合は、`Settings` > `Appearance` > `Enable Mouse Gesture` で有効化できます。

![eableMouseGesture_EN](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/6c3711c3-7662-0744-522c-5bc4b4b20ce6.png)

## この記事の目的

Microsoft Edge では、バージョン 114 から拡張機能の追加無しでマウスジェスチャーが使えます。
マウスジェスチャー機能を有効化する方法を調べてみると、バージョン 117 からとても簡単に設定できるようになっていたため、その方法を紹介します。

## 設定方法

### 1. Edge のバージョンを確認する

アドレスバーに `edge://settings/help` と入力するか、「設定 > Microsoft Edge について」で Edge のバージョンを確認します。
バージョン 114 以上であれば、組み込みのマウスジェスチャー機能が使えます。

### 2. 試験段階の機能(Experimental Features)を表示させる

アドレスバーに `edge://flags` と入力すれば、試験段階の機能一覧が表示されます。

![edge://flags](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/46f8420e-476a-a320-0f0c-6f53c5e84ca5.png)

`edge://flags#edge-mouse-gesture` と入力すれば、マウスジェスチャーの設定部分が表示されます。

![edge://flags#edge-mouse-gesture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/84e0b6e2-a8a3-cb27-41ee-c0255a823f5d.png)

### 3. 機能を有効化する

`Default` となっている部分を `Enabled` に変更します。
これでマウスジェスチャー機能が有効化されます。

![mouse-gesture-enabled](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/a035fcee-65cc-6b2f-237e-228eda51c09e.png)

### 4. 詳細設定

細かく設定したい場合は、アドレスバーに `edge://settings/mouseGesture` と入力するか、「設定 > 外観 > ブラウザーのカスタマイズ > マウス ジェスチャの構成」で確認/設定できます。

![edge://settings/mouseGesture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/cc990e5a-41e7-868c-36b6-30cfd478f637.png)

## 追加の情報

本記事は以下のペーの内容を参考にしています。

https://winaero.com/microsoft-edge-gets-support-for-16-mouse-gestures/

Edge 以外の Chromium 系ブラウザでは、[コードが公開](https://github.com/RyutaKojima/simpleGestures)されていて、買収によって突然 malware 化する可能性が最も低いと思われる `simpleGestures` という拡張機能を使用しています。

https://chromewebstore.google.com/detail/simplegestures/flfminafiamnggnldfpilnfnmbgmiegn

https://github.com/RyutaKojima/simpleGestures
PHP 定数について

# 対象読者
[こちらの記事と同様](https://qiita.com/bpg_ts/items/1a25f6bd3d4656fb0bda#%E5%AF%BE%E8%B1%A1%E8%AA%AD%E8%80%85 "対象読者")

# 定数とは
### 定数
「データを入れるための箱」、「名前を付けることができる」という点は、変数と役割は一緒。**変数との大きな違いは、「再代入が不可能」であること**。

### 定数を使う場合、使わない場合の比較
一度定数を定義すると、プログラム中で使い回せる。また、メンテナンス性が向上するのも便利な点だ。以下に、定数を使わない場合と使う場合のコードの比較を示す。実行結果は同じ。
##### 定数を使わない場合
```php:定数を使わない場合
<?php
    print (100 * 1.1).'<br>';
    print (200 * 1.1).'<br>';
    print (300 * 1.1).'<br>';

    /* 実行結果
        110
        220
        330
    */
?>
```
* 1.1（消費税 10%）が、パッと見何の数値を表すのかがわからない（**定数名が付いていない**）
* もし消費税が変わった場合、1.1（消費税 10%）の所をすべて修正する必要がある（上の例では 3 箇所）

##### 定数を使う場合
```php:定数を使う場合
<?php
    const SALES_TAX = 1.1;    // 消費税率が変わっても修正はこの行のみ
    print (100 * SALES_TAX).'<br>';
    print (200 * SALES_TAX).'<br>';
    print (300 * SALES_TAX).'<br>';

    /* 実行結果
        110
        220
        330
    */
?>
```
* 定数 `SALES_TAX`（消費税 10%）を定義することで、数値の意味がわかりやすい
* 消費税が変わっても修正は 1 箇所で済む（**メンテナンスがラク**）

### 定数の宣言
##### 方法 1 　const
```php:const で定数を定義
<?php
    const 定数名 = 値;
?>
```

##### 方法 2 　define 関数
```php:define 関数で定数を定義
<?php
    define('定数名', 値);
?>
```

### 定数の命名規則
* (`$`) は付けない
* 予約語は避ける
* 通例、大文字で命名する
* 定数として定義できる型は限定される

:::note info
複数の単語を使って定数名を付ける場合は、アンダースコア (`_`) で区切る。
:::

:::note warn
定数として定義できる型は、 **スカラー（`bool`、`int`、`float`、`string`）** と **スカラーを含んだ配列** に限る。
:::

### 自動的に定義される定数、マジック定数
PHP には、「**自動的に定義される定数**」、使われる場所によって値が変化する「**マジック定数**」がある。これらは、**`const` などで宣言することなく使用可**。その主な定数を表に示す。
| 定数 | 説明 |
|:-:|:--|
| `__LINE__` | 実行中の行番号 |
| `__FILE__` | 実行中のファイル名 |
| `__DIR__` | 実行中のファイルが存在するディレクトリ名 |
| `PHP_VERSION` | PHP バージョン |
| `PHP_MAXPATHLEN` | ファイル名の長さ (パスを含む) の最大値 |
| `PHP_INT_MAX` | 整数型の最大値 |

参考までに **佐藤 の開発環境（ローカル）での実行結果**
```php:article3.php
<?php
    print '__LINE__：'.__LINE__.'<br>';
    print '__FILE__：'.__FILE__.'<br>';
    print '__DIR__：'.__DIR__.'<br>';
    print 'PHP_VERSION：'.PHP_VERSION.'<br>';
    print 'PHP_MAXPATHLEN：'.PHP_MAXPATHLEN.'<br>';
    print 'PHP_INT_MAX：'.PHP_INT_MAX.'<br>';

    /* 実行結果
        __LINE__：2
        __FILE__：C:\パス\article3.php
        __DIR__：C:\パス
        PHP_VERSION：8.X.X
        PHP_MAXPATHLEN：2048
        PHP_INT_MAX：9223372036854775807（64 ビットの場合）
    */
?>
```

### 参考サイト
「自動的に定義される定数」、「マジック定数」は、先に紹介した以外にも多数存在する。詳細は、以下のサイトを参照。
* [自動的に定義される定数](https://www.php.net/manual/ja/reserved.constants.php "自動的に定義される定数")
* [マジック定数](https://www.php.net/manual/ja/language.constants.magic.php "マジック定数")
コードレビューしてみよう！①

[さとう](https://www.notion.so/f5514364f03a412f8af6c09b352c9d64?pvs=21)です！

今日、SNSでこんなものを見かけました。

https://x.com/yumemiinc/status/1721332498465276003?s=20

このコードをレビューしてみようと思います！

# 元のコード

```tsx
const alertPrice = (price: number) => {
	const tax = 0.1;
	const priceWithTax = price + price * tax;
	const message = `税込金額は${priceWithTax}円です。`;
	alert(message);
}
```

税込金額を計算して画面に表示する、ということをやっていますね！

では、いくつか指摘してみましょう！

# 基本データ型ではなくValueObjectを使う

まず僕が気になったのは、number型を使っているところです。

```tsx
const alertPrice = (price: number) => {
```

TypeScriptのnumber型は大きい値を受け取ることができますが、最大値を受け取ってしまった場合、計算する部分でエラーが発生しそうです。

```tsx
// number型で定義されている最大値(9007199254740991)を超えてしまう可能性がある。
const priceWithTax = price + price * tax;
```

このようなことがあるため、基本データ型をそのまま使うのではなく、[ValueObject](https://ja.wikipedia.org/wiki/Value_object)を受け取るようにしましょう。

```tsx
// ValueObjectを受け取る
const alertPrice = (price: Price) => {
```

この[ValueObject](https://ja.wikipedia.org/wiki/Value_object)のコンストラクターで最大値を設定するようにしましょう！

# 関数の中から値を抽出する

次に気になったのは、taxを宣言している部分です。

```tsx
	const tax = 0.1;
```

関数の中でtaxを宣言するのではなく、関数でtaxを受け取るようにした方が、一つの関数で複数のtaxに対応することができます。

```tsx
// taxを受け取るようにする
const alertPrice = (price: Price,tax: Tax) => {
```

ここでももちろん[ValueObject](https://ja.wikipedia.org/wiki/Value_object)を使うようにしましょう。

これができると、税率を計算している部分を[ValueObject](https://ja.wikipedia.org/wiki/Value_object)に切り出すことができそうです。

```tsx
// 計算ロジックをTaxに委譲する
const priceWithTax = tax.calculat(price);
```

# ロジックと見た目は分離する

もう一度元のコードを見てみましょう。

```tsx
const alertPrice = (price: number) => {
	const tax = 0.1;
	const priceWithTax = price + price * tax;
	const message = `税込金額は${priceWithTax}円です。`;
	alert(message);
}
```

この関数では、「税率計算」と「画面への表示」の2つの責務を負ってしまっています。

この場合、業務ロジックである「税率計算」は分離した方が良いです。

こちらを参考

[ドメイン駆動設計](https://ja.wikipedia.org/wiki/ドメイン駆動設計)

見た目を分離した場合、このようなコードが考えられます。(今までの指摘を取り込んでいます)

```tsx
function createPriceWithTax(price: Price,tax: Tax): PriceWithTax {
	const priceWithTax = tax.calculat(price);
	return new PriceWithTax(priceWithTax);
}
```

このようにすることで、業務ロジックだけを抽出することができました。

(元のコードと比べると、完全に別物になってますね！)

`createPriceWithTax`は`PriceWithTax`のファクトリーメソッドみたいになってますね！

createPriceWithTaxでPriceとTaxを受け取ることにより、依存関係を明示することもできています。

```mermaid
graph RL

Price
Tax
PriceWithTax

Tax --> Price
PriceWithTax --> Tax
PriceWithTax --> Price
```

今の依存関係はこんな感じになっています。TaxがPriceに依存している部分は微妙な感じがしますが、コードを少しいじれば改善できそうですね。

# おわりに

全ての行に指摘が入るという悲しい結果になってしまいました…。

ただ、ここらへんはすごいミスりやすいところなので、注意していきたいですね！

※今回出てきたサンプルコードは空で書いたので、コンパイルが通らない可能性があります。その場合、雰囲気だけ感じとってもらえると！ｗ

また、おかしな部分があったら↓から連絡ください！

[さとう (@satou_aaaaa_111) / X](https://twitter.com/satou_aaaaa_111)

[記事一覧](https://www.notion.so/0e521860936042528997c9a33f6e1a20?pvs=21)
(高速)STM32G031でソフトウェアSPIの速度を測って遊ぶ2


STM32G031でソフトウェアSPIの速度を測って遊ぶ2


やく1.5Mバイト秒(まちがっているかも



![o_cop798.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9b18cc1d-799f-0d10-d866-64f97fe00812.jpeg)




```c++



//Soft_SPI_test3_031

#define DW    digitalWrite

#define TFT_MOSI PA12
#define TFT_SCK  PA1

//                                            m          C
//                                         5432109876543210
#define REG_MOSI_ON           GPIOA->ODR=0b0001000000000000;
//                                             m         C
//                                         5432109876543210
#define REG_CLK_ON__MOSI_1    GPIOA->ODR=0b0001000000000010;
//                                            m          C
//                                         5432109876543210
#define REG_MOSI_OFF          GPIOA->ODR=0b0000000000000000;
//                                            m          C
//                                         5432109876543210
#define REG_CLK_ON__MOSI_0    GPIOA->ODR=0b0000000000000010;
//                                            m          C
//                                         5432109876543210
#define REG_CLK_OFF           GPIOA->ODR=0b0000000000000000;


void SPI_WRITE8(int s)
{
  //1
  if (s & 0x80) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //2
  if (s & 0x40) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //3
  if (s & 0x20) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //4
  if (s & 0x10) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //5
  if (s & 0x08) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //6
  if (s & 0x04) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //7
  if (s & 0x02) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if
  //8
  if (s & 0x01) {
    REG_MOSI_ON;
    REG_CLK_ON__MOSI_1;
    REG_CLK_OFF;
  } else {
    REG_MOSI_OFF;
    REG_CLK_ON__MOSI_0;
    REG_CLK_OFF;
  }//end if

}//SPI_WRITE8


void setup() {

  pinMode(TFT_MOSI, OUTPUT);
  pinMode(TFT_SCK , OUTPUT);

loop1:

  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);

  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);
  SPI_WRITE8(0xF0);

  goto loop1;

}

void loop() {

  SPI_WRITE8(0x00);
  SPI_WRITE8(0x00);
  delay(2000);
  SPI_WRITE8(0x00);
  SPI_WRITE8(0x55);
  delay(2000);
  SPI_WRITE8(0x00);
  SPI_WRITE8(0xaa);
  delay(2000);
  SPI_WRITE8(0x00);
  SPI_WRITE8(0xff);
  delay(2000);

}



```
C# 12 新機能メモ

# C# 12 新機能メモ

.NET 8 (C# 12) が現地時間 2023/11/14 に正式リリースされました。
C# 12 の新機能について、気になったものを備忘録として簡単に纏めます。

## プライマリコンストラクタ

通常のクラスおよび構造体に対して、プライマリコンストラクタが追加されました。
これにより、コンストラクタを以下の様に記述できるようになりました。

```cs
// 通常のコンストラクタ（C# 11 以前の書き方）
internal class Person1 {
    public string Name { get; }
    public int Age { get; }

    public Person1(string name, int age) {
        this.Name = name;
        this.Age = age;
    }
}

// プライマリコンストラクタ（C# 12 以降の書き方）
internal class Person2(string name, int age) {
    public string Name { get; } = name;
    public int Age { get; } = age;
}
```

上記 2 つは機能的に同等のコードであり、.NET 8 ではプライマリコンストラクタを優先して使用するような規則 (IDE0290) が既定で有効になっています。

ただし、先に実装されていた `record` 型のプライマリコンストラクタとは異なり、プロパティの自動生成は行わないようです。

```cs
// record 型はプロパティ Name, Age が自動的に生成される。
internal record Person3(string Name, int Age);

// 通常のクラス・構造体ではプロパティは自動的に生成されない（明示的な宣言が必要）。
internal class Person4(string name, int age);
```

少し残念な気もしましたが、値オブジェクト以外では不要な場面もあり、値オブジェクトなら `record` 型を使用すればよい、ということなのでしょう。

## コレクション式

配列やリストなどのコレクションを作成するための新しい構文、コレクション式が追加されました。
これにより、各コレクションを以下の様に __共通した構文で__ 簡潔に記述できるようになりました。

```cs
using System.Collections.Immutable;

// 通常のコレクション作成（C# 11 以前の書き方）
int[] a1 = new[] { 1, 2, 3 };
List<int> b1 = new() { 1, 2, 3 };
ReadOnlySpan<int> c1 = new[] { 1, 2, 3 };
ImmutableArray<int> d1 = ImmutableArray.Create(1, 2, 3);

// コレクション式による作成 (C# 12 以降の書き方)
int[] a2 = [1, 2, 3];
List<int> b2 = [1, 2, 3];
ReadOnlySpan<int> c2 = [1, 2, 3];
ImmutableArray<int> d2 = [1, 2, 3];
```

コレクション式は単純に作成してキャストしているのではなく、ターゲットの型に応じて最適な方法で作成しているようです。
（そのため、現状では明示的な型が必須になっていますが…）
.NET 8 ではコレクション式を優先して使用するような規則 (IDE0300, IDE0303, ...) が既定で有効になっています。

また、コレクション式で使用可能なスプレッド演算子 `..` も併せて追加されました。
これを使用することで、以下の様に（JavaScript 等と同じように）コレクションを展開して新しいコレクションを作成できるようになりました。

```cs
IEnumerable<int> a = [1, 2];
List<int> b = [4, 5];

int[] c = [0, ..a, 3, ..b];
// [0, 1, 2, 3, 4, 5]
```

（自動フォーマットにおける、スプレッド演算子の後ろの空白を制御する設定はあるのか？）

## 任意の型の別名設定

`using` ディレクティブを使用することで、任意の型に別名を設定できるようになりました。
これにより、タプル型、配列型、ポインタ型、またはその他の安全でない型に対してエイリアスを作成できます。

```cs
using Foo = (int X, int Y);

Foo p1 = (1, 2);
Foo p2 = (3, 4);
```

## 既定のラムダパラメータ

ラムダ式に対して、オプション引数や `params` 引数が使用できるようになりました。

```cs
var foo = (int x = 1, params int[] y) =>
    Console.WriteLine($"X = {x}, Y = [{string.Join(", ", y)}]");
foo.Invoke();         // X = 1, Y = []
foo.Invoke(2, 3, 4);  // X = 2, Y = [3, 4]
```

ただし、この既定値や `params` の情報は型としてあるものの、これらの拘束力は弱いようです。
つまり、以下の様にこれらが異なるラムダ式の代入が可能です。
警告は発生しますし、あまり気にすることはないかもですが…。

```cs
// 既定値が異なるラムダ式の代入が可能（警告 (CS9099) は発生する）
Foo foo = (int x = 10) => { };
delegate void Foo(int x = 1);
```

## 参考文献

* [C# 12 の新機能 - C# ガイド - C# | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-12)
* [C# 12.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/cheatsheet/ap_ver12/)
Laravel学習メモ：ファサード

## 参考
https://readouble.com/laravel/10.x/ja/facades.html

- ファサードは、アプリケーションの[サービスコンテナ](https://readouble.com/laravel/10.x/ja/container.html)で使用可能なクラスに対して「静的な」インターフェイスを提供
- サービスコンテナ内の基礎となるクラスへの静的プロキシとして機能する
- 従来の静的メソッドに加えてテスト容易性と柔軟性を維持しつつ簡潔で表現力豊か
- Laravelのファサードはすべて、`Illuminate\Support\Facades`名前空間で定義
    
    ```php
    use Illuminate\Support\Facades\Cache;
    use Illuminate\Support\Facades\Route;
    
    Route::get('/cache', function () {
        return Cache::get('key');
    });
    ```
    
- ヘルパ関数
    - ファサードを補完するためにグローバルなヘルパ機能が提供される
    - `view`, `response`, `url`, `config`などが一般的
- ファサードを利用する注意点
    - ファサードの危険性
        - スコープクリープ
            - 1つのクラスで多くのファサードを利用するのは簡単だが
            - クラスが大きくなりすぎる
    - クラスのサイズに注意して責任範囲が狭くなるようにすること
Laravel学習メモ：サービスプロバイダ

## サービスプロバイダ

[https://readouble.com/laravel/10.x/ja/providers.html](https://readouble.com/laravel/10.x/ja/providers.html)

- サービスプロバイダとは
    - Laravelアプリケーション起動処理の初め。
    - サービスコンテナによる結合やイベントリスナ・フィルター・ルートを登録すること
- サービスプロバイダの記述
    - すべてのサービスプロバイダは`Illuminate\Support\ServiceProvider`クラスを拡張する
    - `register`と`boot`メソッドをもつ
        - `register`メソッドの中では**サービスコンテナへの登録だけ**を行う
    - コマンドでひな形を作成可能 `php artisan make:provider RiakServiceProvider`
- プロバイダの登録
    - サービスプロバイダは`config/app.php`で登録される
    - サービスプロバイダの名前をリストしているproviders配列に追加する
- 遅延プロバイダ
    - サービスコンテナへコンテナ結合を登録する**だけ**であるなら、その結合が実際に必要になるまで登録を遅らせる方が良い
        - 、`\Illuminate\Contracts\Support\DeferrableProvider`インターフェイスを実装し、`provides`メソッドを定義する
        
        ```php
        <?php
        
        namespace App\Providers;
        
        use App\Services\Riak\Connection;
        use Illuminate\Contracts\Foundation\Application;
        use Illuminate\Contracts\Support\DeferrableProvider;
        use Illuminate\Support\ServiceProvider;
        
        class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
        {
            /**
             * 全アプリケーションサービスの登録
             */
            public function register(): void
            {
                $this->app->singleton(Connection::class, function (Application $app) {
                    return new Connection($app['config']['riak']);
                });
            }
        
            /**
             * このプロバイダにより提供されるサービスの取得
             *
             * @return array<int, string>
             */
            public function provides(): array
            {
                return [Connection::class];
            }
        }
        ```
Laravel学習メモ：サービスコンテナ

[サービスコンテナ 10.x Laravel](https://readouble.com/laravel/10.x/ja/container.html)

- Laravelサービスコンテナはクラスの依存関係の管理と注入を実行するための機能
- コンストラクタまたは場合によってはセッターメソッドを介してクラスに「注入」される。
- クラスに依存関係がない場合か他の具象クラスのみに依存している場合は依存解決の方法をコンテナに指示する必要はない。
    
    ```php
    <?php
    
    class Service
    {
        // ...
    }
    
    Route::get('/', function (Service $service) {
        die($service::class);
    });
    ```
    
- コンテナを使うタイミング
    - ルート定義で依存関係に注入可能（バックグラウンドで管理されている状況）
    - 手作業でコンテナ操作をするのは…
        - クラスコンストラクタ
            - コンテナにそのインターフェイスを解決する方法を指示する
            - パッケージのサービスをコンテナに結合する必要あり
- 結合の基本
    - サービスプロバイダ内では常に`$this→app`プロパティを使用してコンテナにアクセスできる。
        - `bind`メソッドを使用して結合を登録できる。
        - 登録するクラスまたはインターフェイス名をクラスのイインスタンスを返すクロージャとともに渡す
        
        ```php
        use App\Services\Transistor;
        use App\Services\PodcastParser;
        use Illuminate\Contracts\Foundation\Application;
        
        $this->app->bind(Transistor::class, function (Application $app) {
            return new Transistor($app->make(PodcastParser::class));
        });
        ```
        
        - リゾルバの引数としてコンテナ自体を受け取ることに注意する。
    - 通常はサービスプロバイダ内のコンテナの中で操作するが、外部でコンテナとやり取りがしたい
        - `App`ファサードを使用して操作する。
        
        ```php
        use App\Services\Transistor;
        use Illuminate\Contracts\Foundation\Application;
        use Illuminate\Support\Facades\App;
        
        App::bind(Transistor::class, function (Application $app) {
            // ...
        });
        ```
        
        - bindIfメソッドを利用すれば指定するタイプに対する結合がまだ登録されていない場合にのみ登録できる。
    - Note:
        - クラスがどのインターフェイスにも依存しない場合、クラスをコンテナに結合する必要はありません。
- シングルトンの結合
    - `singleton`メソッドはクラスまたはインターフェイスを１回のみコンテナに結合する
- コンテキストによる結合
    - 同じインターフェイスを利用する２つのクラスがある場合、各クラスに異なる実装を依存注入したい場合がある。
    
    ```php
    use App\Http\Controllers\PhotoController;
    use App\Http\Controllers\UploadController;
    use App\Http\Controllers\VideoController;
    use Illuminate\Contracts\Filesystem\Filesystem;
    use Illuminate\Support\Facades\Storage;
    
    $this->app->when(PhotoController::class)
              ->needs(Filesystem::class)
              ->give(function () {
                  return Storage::disk('local');
              });
    
    $this->app->when([VideoController::class, UploadController::class])
              ->needs(Filesystem::class)
              ->give(function () {
                  return Storage::disk('s3');
              });
    ```
    
- 依存解決
    - `make`メソッド
        - コンテナからクラスインスタンスを解決する。
        
        ```php
        use App\Services\Transistor;
        
        $transistor = $this->app->make(Transistor::class);
        ```
        
        - クラスの依存関係の一部がコンテナを介して解決できない場合はmakeWithメソッドに渡すことで依存注入できる
        - サービスプロバイダの外部で、`$app`変数にアクセスできないコードの場所では、`App`[ファサード](https://readouble.com/laravel/10.x/ja/facades.html)、`app`[ヘルパ](https://readouble.com/laravel/10.x/ja/helpers.html#method-app)を使用してコンテナからクラスインスタンスを依存解決します。
        
        ```php
        use App\Services\Transistor;
        use Illuminate\Support\Facades\App;
        
        $transistor = App::make(Transistor::class);
        $transistor = app(Transistor::class);
        ```
Laravel学習メモ：リクエストのライフサイクル

## ライフサイクル概論


- リクエストのエントリポイントは`public/index.php`
    - Nginx等から送信される
    - このファイルはComposerで生成したオートローダ定義をロードしLaravelアプリケーションインスタンスをbootstrap/index.phpから取得
    - 最初のアクションはアプリケーション/サービスコンテナのインスタンス生成
- リクエストタイプに応じて…
    - HTTPカーネルかコンソールカーネルへ送信
    - **HTTPカーネルに注目**
        - リクエストが実行される前に実行されるbootstrappersの配列を定義する。
        - エラー処理の構成、ログの構成、などの内部設定を処理する
        - ミドルウェアを定義する
        - 最終的にはResponseを返すブラックボックスとして表現されている
- サービスプロバイダ
    - カーネルの初期起動処理アクションの1つ
    - `config/app.php`の`providers`配列で構成されている
        - Laravelがこのプロバイダのリストを繰り返し処理しインスタンス化する
        - registerメソッドを呼び出し
        - プロバイダを登録し、
        - 各プロバイダでbootメソッドを呼び出す
    - Laravelが提供する基本的なすべての主機能はサービスプロバイダによって初期起動および設定される。
- `RouteServiceProvider`
    - `Request`がルータに渡されてディスパッチされる
    - ルータはルートまたはコントローラへリクエストをディスパッチし
    - ルート固有のミドルウェアを実行
- ルートかコントローラメソッドがレスポンスを返すと…
    - レスポンスはルートのミドルウェアを介して外側へ戻る
    - アプリケーションに送信レスポンスを変更または検査する機会を与える
        - `http`カーネルの`handle`メソッドがレスポンスオブジェクトを返し
        - `index.php`ファイルが`send`メソッドを呼ぶ
            - レスポンスコンテンツをユーザのブラウザに返す。
- `AppServiceProvider`
    - アプリケーション独自の初期起動処理およびサービスコンテナ結合を追加する最適な場所
    - 大規模アプリケーションなら特定のサービスに対し、より細かく初期処理を備えたものを作成するべき。

## 参考
https://www.notion.so/9ca1674c2bfe4629b27ffac451f677d6?pvs=21
pt-query-digestの見方

実務でMySQLのパフォーマンス改善に取り組むことになり、pt-query-digestについて勉強したため内容をまとめておきます。

# pt-query-digestとは？
MySQLのスロークエリログをいい感じに集計して、負荷が大きかった順に上から並べてくれるツールです。MySQLの付属コマンドであるmysqldumpslowでもスロークエリログの分析は可能ですが、それよりも詳細な分析ができます。
インストール方法は他の記事をご参照ください。

# 出力方法
`pt-query-digest`の後にファイル名を続けるだけです。
```
$ pt-query-digest 'スロークエリログのファイル名'
```

なお以下のように集計期間を指定することも可能です。
```
pt-query-digest --since="2023-01-01" --until="2023-01-31" 'スロークエリログのファイル名'
```

# 出力結果の見方
出力結果はざっくりランキングパートと詳細な解析結果パートの2つに分かれます。

## ランキングパート
負荷の大きかったクエリのランキングが表示されます。
```
# Profile
# Rank Query ID           Response time Calls R/Call V/M   Item
# ==== ================== ============= ===== ====== ===== ===============
#    1 0xABCDEFGHIJK12345  0.2825 73.1%   113 0.0025  0.00 SELECT * FROM tests
#    2 0xABCDEFGHIJK12346  0.1679 13.2%    73 0.0023  0.00 SELECT * FROM answers
#    3 0xABCDEFGHIJK12347  0.2041  8.3%    55 0.0021  0.00 SELECT * FROM comments
# (以降省略)
```

各項目の意味は以下の通りです。
| 項目 | 内容|
| ---- | ---- |
| Rank | 順位 |
| Query ID | クエリのハッシュ値 |
| Response time | 実行時間の合計及び全体に占める割合 |
| Calls | 実行回数 |
| R/Call | 1回あたりの実行時間 |
| V/M | 標準偏差 |
| Item | 対象のSQL |

## 詳細な解析結果パート
各クエリの詳細な分析結果が表示されます。
```
# Query 1: 0 QPS, 0x concurrency, ID 0xABCDEFGHIJK12345 at byte 213153 _____
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.00
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         28     113
# Exec time     73   282ms     1ms     3ms     2ms     2ms   300us     2ms
# Lock time     32     7ms    37us   589us    64us    76us    57us    54us
# Rows sent      0       0       0       0       0       0       0       0
# Rows examine   0       0       0       0       0       0       0       0
# Query size    45  18.46k      81     87    84.12   83.16       0    85.43
# (以降省略)
```

主な項目だけ紹介します。

| 項目 | 内容|
| ---- | ---- |
| Count | 集計期間中のクエリ実行回数 |
| Exec time | クエリの実行時間 |
| Lock time | クエリの実行開始までにかかった時間(他スレッドのロックによる待ち時間) |
| Rows sent | クライアントヘ返却した行数 |
| Rows examine | クエリ実行時に走査した行数 |
| Query size | クエリ(文字列)の長さ |


# 確認ポイントの例
基本的には上位のクエリから原因を究明していきます。
 - `Rows examine` に対して`Rows sent`が小さすぎる。
 →インデックスが適切に活用されていない可能性あり。例えば`Rows sent`が5件なのに`Rows examine`が10万件のような場合はインデックスが適切に張られておらず全件検索になってしまっている可能性があります。逆に`Rows examine`と`Rows sent`が大差ないにも関わらず上位に位置しているクエリはインデックス以外の箇所でチューニングが必要な可能性が高いです。
 - クエリ実行回数が異常に多い。
 →N+1問題の可能性あり。

 MySQLのEXPLAINコマンドでSQLの実行計画を調べてみるのも原因の究明に繋がるはずです。
[Xpra] SSH 先の Linux サーバーで GUI をバックグラウンド実行する

## はじめに

リモートの Linux サーバーで GUI を起動して，ログアウトした後も実行させ続け，好きなときにウィンドウを表示させたい．

xrdp を使う方法だとなかなかうまくいかなかったので，[Xpra](https://xpra.org/index.html) を利用してサーバー上の仮想ディスプレイにあるウィンドウをローカルに転送する方法を用いた．

## 環境

- リモート: Ubuntu 20.04.6 LTS
- ローカル: Ubuntu 22.04.2 LTS (WSL2)

## 準備

以下のサイトが参考になった．

https://zenn.dev/ysuito/articles/8293dc85a66dfa

```bash:remote bash
$ sudo apt install -y xpra python-cryptography
```

```bash:local bash
$ sudo apt install -y xpra
$ sudo pip install cryptography
```

リモートの Xwrapper.config 内の `allowed_users` を `console` から `anybody` に変更．

```/etc/X11/Xwrapper.config
allowed_users=anybody
```

## 起動

#### リモート

このサイトの方法で，リモートで GUI アプリケーションを起動する．

https://wiki.archlinux.jp/index.php/Xpra

```bash:remote bash
$ xpra start :1111

# 1111 番ディスプレイで screen を起動
$ DISPLAY=:1111 screen
```

開いた screen 内で，firefox などの GUI アプリケーションを起動する．

```bash:screen
$ firefox
```

ここではまだウィンドウは表示されない．起動したら，`Ctrl-A + D` で screen を離れる．
これで，logout しても GUI が 1111 番ディスプレイで起動している状態になった．

#### ローカル

次に，ローカル側で Xpra を起動する．

```bash:local bash
$ xpra --ssh=ssh attach ssh:REMOTE:1111
```

`REMOTE` は，`.ssh/config` に登録されている接続先．今回は踏み台サーバーでポート転送を利用して接続していたが，問題なく接続できた．`.ssh/config` の内容はこんな感じ．

```~/.ssh/config
Host FUMIDAI
  HostName [ADDRESS]
  User [USERNAME]
  LocalForward [PORT] localhost:[PORT]

Host REMOTE
  HostName localhost
  User [USERNAME]
  Port [PORT]
  ProxyCommand ssh -W %h:%p FUMIDAI
```

うまくいけば，これでウィンドウが表示される．終了するには，ターミナルで `Ctrl-C` する．

##### エラー

`TypeError: Couldn't find foreign struct converter for 'cairo.Context'` のエラーが表示される場合は，先に `python3-gi-cairo` を入れる．

```bash:local bash
$ sudo apt install python3-gi-cairo
```

他にもエラーや警告がわんさか表示されていたが，今回は問題なく接続できた．

ちなみに，リモートサーバー上で Xpra を起動して，表示されたウィンドウを X11Forwarding を用いて転送する方法では，一瞬だけウィンドウが表示されるがすぐに消え，うまく接続できなかった．
原因はよくわかっていない．

## おわりに

Xpra という方法に辿り着くまでに数日かかり，原因不明のエラーの嵐だったが，とりあえずなんとか実現できたのでよかった．
SAV系コマンドのパラメーター_PRECHK

## はじめに

SAV系コマンドを使用する際、皆さんはどのようなパラメーターを指定していますか？

この記事では、SAV系コマンドのパラメーターの一つである「PRECHK」（オブジェクト事前検査）による、挙動の違いをご紹介します。


## PRECHK（オブジェクト事前検査）とは

[IBM Documentation](https://www.ibm.com/docs/ja)によると、「PRECHK」を「*YES」とした場合、次のような挙動になります。

> 次のいずれかが真の場合に，ライブラリーの保管操作を終了するかどうかを指定します。
>
> 1. オブジェクトが存在していない。
> 2. ライブラリーまたはオブジェクトに損傷があることが前に判明している。
> 3. ライブラリーまたはオブジェクトが他のジョブによってロックされている。
> 4. 保管操作の要求元に，そのライブラリーの権限がないか，あるいはオブジェクトの保管権限がない。


## PRECHK（\*YES／\*NO）」の実例

それでは、実際に「PRECHK」を「\*YES」にした場合と「\*NO」にした場合の違いを確認してみましょう。

### 前提

`SAVOBJ`の保管対象に、存在するオブジェクト（例:QTEMP/QCLLESRC）と、存在しないオブジェクト（例:QTEMP/QRPGLESRC）を指定して実行します。

![savParameterPrechk_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/cc5a715c-1033-0e63-34ac-235318f89628.png)

### *YES

「ライブラリー ××× からオブジェクトが保管されませんでした。」というメッセージが表示されます。
もちろん`DSPSAVF`でSAVFを確認しても「（保管ファイルにレコードがありません）」と表示され、存在するオブジェクトも保管されません。

![savParameterPrechk_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/599e3656-74e6-fbd0-09bf-6bad3a74322b.png)

### *NO

「○個のオブジェクトが ××× から保管されました。 ○ が保管されていません。」というメッセージが表示されます。
`DSPSAVF`でSAVFを確認すると、存在するオブジェクトのみが保管されます。

![savParameterPrechk_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/0badd943-0ffc-87b9-123a-87c16ad22546.png)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。
【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 (paizaランク C 相当)

今回はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_boss

ただし、AとBが９桁になるようにする

今までと同じように書いて
つぎに
(A, B)　＝　１＋9+2+9+1=22文字（間は,と半スペで２文字）
| 　＝３文字
あわせて25文字
それをW-1分繰り返し、最後は（A, B)だけなので22文字だから
count = 25 * (W -1) + 22
これを＝でかければOK

```py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3]) 

for j in range(1,H+1):
    for i in range(1,W+1):
        if i != W:
            print(f"({A:>9}, {B:>9})",end=" | ")
        else:
            print(f"({A:>9}, {B:>9})")
    if j < H:
        count = 25 * (W -1) + 22
        print(f"{'='*count}")
```
これで合格しました。
途中、)の１文字分を計算に入れ忘れるなどあったけど
無事合格。

これにて最後の問題も突破！
さあ次の問題にいってみよう
ABC329の解説記事 (PyPy3 ABCD)

# はじめに
問題は[こちら](https://atcoder.jp/contests/abc329/tasks)
初心者（灰色〜茶色）向けです。
# A - Spread
https://atcoder.jp/contests/abc329/tasks/abc329_a
## 考え方
文字列を1文字ずつのリストとして受け取り、半角スペース区切りで表示すればよいです。
リストを「*」をつけて引数として渡すと、各要素が個別変数として渡されます。
このとき、各要素間の区切り文字はデフォルトで半角スペースです。

https://note.nkmk.me/python-print-basic/

## 解答例
```Python3:私の解答
print(*list(input()))
```
# B - Next
https://atcoder.jp/contests/abc329/tasks/abc329_b
## 考え方
重複を除き2番目に大きい自然数を表示する問題です。
重複を除く　→　Setを利用すればよさそう
と考えられるとシンプルに解けます。
1. 入力をSetとして受け取る
1. Setをリスト化し、昇順ソート
1. 二番目に大きい値を表示する

というイメージです。
## 解答例
```Python3:私の解答
n = int(input())
print(sorted(list(set(map(int, input().split()))))[-2])
```
# C - Count xxx
https://atcoder.jp/contests/abc329/tasks/abc329_c
## 考え方
各英小文字が最大何文字連続しているかを保持し、合計すればよいです。
これは、文字の位置の取り方によらず、得られる部分文字列が同じであれば重複して計算しない、と指定があるからです。
実際、位置や取り方によらず同じ文字列であれば1つとして数えるので、ある文字Xの1種類の部分文字列は、
「X」、「XX」、「XXX」、、、ですから、最大の部分文字列の文字数を数えれば良いです。

また、公式解説などにもありますが、下記のように（値名、連続回数）の繰り返しの文字列に変換する圧縮方法をランレングス圧縮と言います。
「ssskkyskkkky」　→　「s3k2y1s1k4y1」
同じ値が連続して続く場合には効率の良い圧縮です。
私の解答は各英小文字の最大の文字列のみ記録しておき、合計するという方針をとっています。

## 解答例
```Python3:私の解答
from collections import defaultdict
n = int(input())
s = input()
cnts = defaultdict(int)
now,cnt = s[0],0
for i in range(n) :
    if s[i] != now :
        cnts[now] = max(cnt, cnts[now])
        now,cnt = s[i],1
    else :
        cnt += 1
    if i == n-1 :
        cnts[now] = max(cnt, cnts[now])
print(sum(map(lambda x:cnts[x],cnts)))
```
# D - Election Quick Report
https://atcoder.jp/contests/abc329/tasks/abc329_d
## 考え方
各投票者の名前と投票数のtupleを優先度付きキューで管理し、最小値を毎度表示します。
各投票者の投票数の保持にはdictを用いました。

また、キューへの格納方法は(投票数×-1, 候補者の番号)としています。
それは、tupleは、第一成分の昇順、同一であれば、第二成分の昇順、、、、といった要領でソートされるからです。

加えて、同一の投票者の過去時点のデータを削除せずに最新のデータを追加しています。
これは、過去の時点のデータが選ばれることはないためです。
同一の投票者の過去時点のデータと最新データであれば、最新データが必ず先の番号にソートされる形になるためです。
計算量は$O(MlogM)$です。
## 解答例
```Python3:私の解答
import heapq
from collections import defaultdict
n,m = map(int, input().split())
a_n = list(map(int, input().split()))
d = defaultdict(int)
ans = []
heapq.heapify(ans)
for i in range(m) :
    d[a_n[i]] += 1
    heapq.heappush(ans,(-d[a_n[i]],a_n[i]))
    score,a = heapq.heappop(ans)
    print(a)
    heapq.heappush(ans,(score,a))
```

# 参考文献
https://e-words.jp/w/%E3%83%A9%E3%83%B3%E3%83%AC%E3%83%B3%E3%82%B0%E3%82%B9%E5%9C%A7%E7%B8%AE.html#google_vignette

https://note.nkmk.me/python-print-basic/

https://www.python.jp/train/tuple/index.html#%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AE%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90:~:text=%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90-,%C2%B6,-%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AF%E3%80%81%E6%95%B0%E5%80%A4

https://qiita.com/ell/items/fe52a9eb9499b7060ed6

# 感想
今回もDが解けてよかったのですが、1ペナでした。（最初はSetで管理すれば間に合うと思ったのですが間に合いませんでした、、、）
Dまで解けたのに、レートが下がってしまい、まだまだ精進だなと思いました。

年内入緑目指して頑張ります。