OmniAICreator/Qiita-1.07M huggingface dataset:
Chrome拡張「Google Keep Chrome 拡張機能」を活用してメモ効率を上げる

## はじめに

![google-keep-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/39a53e82-9fe7-46c7-a62b-0ea1660b26e7.png)

エンジニアの日常では、技術記事を読んでいたり、ドキュメントを調査していたりする中で「これはメモしておきたい」と思う瞬間が数多くあります。そんなとき、いちいちメモアプリを開いて書き写すのは意外と面倒なもの。

「Google Keep Chrome 拡張機能」を使えば、右クリック一つで選択したテキストを即座にメモとして保存できます。この記事では、技術者の作業効率を上げるだけでなく、日常生活でも役立つGoogle Keepの拡張機能の活用法を紹介します。

## ⚠️ 注意事項

このGoogle Keep Chrome拡張機能の活用法は、あくまで**個人的な情報収集**を前提としています。会社での業務利用に関しては、必ず各組織のセキュリティルールや方針に従ってください。

- 会社の機密情報を扱う場合は、社内承認済みのツールを使用しましょう
- クラウドサービスへの情報保存には常にリスクが伴います
- 情報セキュリティポリシーに準拠した運用を心がけてください

本記事の内容を業務に適用する際の情報漏洩等については、筆者は責任を負いかねますのでご了承ください。

## 概要

* **拡張機能名**：Google Keep Chrome 拡張機能
* **公式リンク**：[Chromeウェブストア Google Keep 拡張](https://chrome.google.com/webstore/detail/google-keep-chrome-extens/lpcaedmchfhocbbapmcbpinfpgnhiddi)
* **できること**：
   * ページや選択テキストを右クリックで即Keepに保存
   * URLもあわせて記録される
   * タグやメモ追記もその場で可能

## 使い方

1. Chromeに「Google Keep Chrome 拡張機能」をインストール

2. 気になる文章や技術情報を**選択して右クリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/fa6f426f-45fe-4da9-a066-96975054acdc.png)


3. 「Google Keepに保存」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/8156f3f7-464c-46f5-84ed-b250c114df68.png)


4. 必要ならその場でコメントやラベルを追加して、メモを作成

5. 作成したメモ一覧は以下のような画面で確認、検索、編集することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ad25aead-fed6-4381-a05a-6b3e11aa7665.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/361d3fad-a5f4-4df6-80d7-8b1ace4c3885.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f3ca6cc8-aa29-45ca-be48-50493c8c77ed.png)
ラベル、項目からもフィルタできる


## 技術メモ用途でのメリット

技術情報のメモ取りにおいて、この拡張機能は特に威力を発揮します：

* 技術記事・ドキュメントを読んでいて、**ポイントだけ**素早くメモできる
* URLも記録されるので、**あとから出典にアクセスできる**
* 「あとでまとめよう」と思って放置するリスクが減る

例えば、APIドキュメントの重要なパラメータだけを選択してメモしたり、エラーメッセージをそのままコピーしてトラブルシューティングの記録として残したりできます。
最近だとChatGPTなど生成AIでのやり取りで切りたい文章を整理する、遂行するときなど便利です。

```javascript
// こんなコード例を見つけたとき、すぐにKeepにメモできる
fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Custom-Header': 'important-value' // この特殊ヘッダーが必要なことをメモ
  },
  body: JSON.stringify(data)
})
```

## 日常生活での活用例

技術的な用途だけでなく、日常生活でも活躍します：

* 役所や銀行の**手続き注意事項**をメモ
* 買い物リストや**重要なセール情報**の記録
* 旅行前に**ホテルや観光情報**を整理

特に、「このセールは5月1日まで」といった期限付き情報を見かけたときに、すぐにメモできるのは便利です。

## 気づいたこと

この拡張機能を使い始めて気づいたポイントをいくつか共有します：

* 今までChrome右クリックメニューに出ていたのに**気づいていなかった**
* 特に「選択テキストだけ」をメモできるのが、意外と便利
* Keep自体が検索機能も強いので、**メモが埋もれにくい**

初めは「そんなに使うかな？」と思っていましたが、使い始めると「今までどうやってメモしてたんだろう？」と思うほど便利です。

## まとめ

* 技術調査だけでなく、日常にもすぐ役立つ拡張機能
* 「選択して右クリック」というシンプルな操作で、**メモのハードルが劇的に下がる**
* まだ使っていない人は、ぜひ一度試してみてほしい

私自身、この拡張機能を活用し始めてから、散らばっていた情報をより効率的に集約できるようになりました。特にプログラミングの参考コードやトラブルシューティングのヒントなど、「後で必要になるかも」という情報を逃さずキャッチできるようになった点が大きな変化です。

みなさんも、メモ取りの効率化で、より充実した技術ライフや日々の生活を送りましょう！

## 参考情報

https://support.google.com/keep/answer/2888240?co=GENIE.Platform%3DAndroid&hl=ja

## 免責事項
- 本記事の作成にあたり、文章や図解の生成に生成AIを活用しました。最終的な編集と確認は筆者が行っています。
- 2025年4月時点での情報です。Google Keepの仕様、操作性等変更の可能性があります。
InvokeAIをRTX 50XXで利用する

### はじめに
GeForce RTX 50XX系で画像生成をしようとすると標準インストールではうまくいかなかったのでその対応策です。
pytorch系の対応が遅れているだけなので、そのうち解決すると思われますが、
新しいGPU買って生成AIが動かなかったら悲しいので共有しておきます。

### 結論
PytorchをRTX 50XX系のBlackwell対応のcu128以降のものに入れ替えればOK

### 実行環境
OS: Windows 11
GPU: GeForce RTX 5080

## 発生するエラー
RTX 50XXでinvokeAIをインストールして実行すると、現在(2025年04月)以下のようなエラーが出ると思います。

```powershell
RuntimeError: CUDA error: no kernel image is available for execution on the device
```
このエラーは標準で利用しているライブラリではNvidia GPUに対応するCUDAがないため発生します。
要は、使っているライブラリがRTX 50XX系で実行できないということ。

### CUDAって？
`CUDA(Compute Unified Device Architecture)`でクーダと読むらしい。
Nvidiaが開発しているAI向けの並列演算プログラミングモデル。
要はNvidia製GPUを活用するためのライブラリと開発ツール群、APIだったり色々入っているようです。

### スクリプト実行を許可
まずはinvokeAIのDev Consoleを起動するための準備
※直接invokeAIのディレクトリをコンソールで開いても問題ない。

```powershell
Set-ExecutionPolicy RemoteSigned
```
RemoteSigned ポリシーは、ローカルのコンピューターで作成したスクリプトは署名なしで実行できますが、インターネットからダウンロードしたスクリプトは信頼された発行元のデジタル署名が必要になる設定です。

![スクリーンショット 2025-04-27 212958_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115059/6e0e2a6f-e49b-4456-b890-f0e1b32483ac.png)
これでここからStart Dev Consoleを押すことでスクリプト実行が可能になる。

### Blackwell対応pytorchに入れ替える
invokeAIのディレクトリで以下のコマンドを実行。

```powershell
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 --force-reinstall
```
このコマンドで、invokeAIの環境で利用するpytorch系ライブラリを現行のものからBlackwell対応のCUDA 12.8に入れ替えられます。

### 参考
https://github.com/invoke-ai/InvokeAI/issues/7934

### 追記
v5.12.0で正式対応したので、個別対応不要になりました！
https://github.com/invoke-ai/InvokeAI/releases/tag/v5.12.0

やったぜ。
WebStormを用いたReact + Vite + TypeScript アプリケーションのデバッグ方法

WebStormでReactアプリケーションの開発時、ブレークポイントで止まってくれないのでアレコレ対応したときのメモ。

## 前提条件
* Viteのreactテンプレート（With TypeScript）のプロジェクト
* 環境は以下
  * WebStorm: 2025.1 
  * Node.js: 20.15.0
  * React: 19.0.0
  * TypeScript: 5.7.2
  * Vite: 6.3.1

※ Web開発1ヶ月目の素人による記事です

## 実際の手順
まずメインメニュー->「実行」->「構成の編集」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069730/3f2b1013-f0fb-463e-8c4c-368e58452689.png)

左上の「+」ボタン（新規構成の追加）をクリックし、「JavaScript デバッグ」をクリックする。

「名前」は任意。
「URL」はViteが起動時に表示するURL。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069730/6322549e-175f-41c8-b40a-81e6c56e4d70.png)

ここまで設定したら、「OK」を押して戻ります。


そして、`npm run dev` でアプリケーションを実行した後に、先ほど作成したデバッグ構成を実行してください。
（Viteで開発サーバーを起動している状態でないと、デバッガーの接続先が存在しないためエラーが発生します。）

この状態でブレークポイントを貼るとちゃんと処理の実行時にブレークポイントで止まってくれるようになります。

以上。
vSphere(ESXi) 8.0U3 インストール時「No Network Adapters」エラーが出る


# はじめに
`vSphere(ESXi) 8.0U3` が無償で利用できるようになったことから、勉強のために自分のPC上で環境構築をしようとした所、インストール時のエラーで躓いてしまったため、記録として本エントリを執筆します。
この情報が誰かの参考となれば幸いです。

# 使用環境
手持ちの余剰パーツをベースに下記構成で検証用PCを用意しました。
・CPU：Ryzen5 5500
・MB ：ASUS A520M-K
・GPU：GTX1650super
・MEM：8GB
・SSD：500GB


# エラー発生 - 原因調査

インストールのためLiveUSBから起動した直後にエラーが表示されて止まってしまいました。
![Screenshot 2025-04-27 18-15-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056429/a7db1e27-3dd6-47c5-a2e0-7368da6532c4.png)

このエラーメッセージ`「No Network Adapters」`で検索すると、過去のバージョンから代々発生しているエラーのようで、`使用しているイーサネットコントローラーに対応したドライバがisoに無い場合に発生するエラー`とのこと。

また、Intel系のコントローラーを用意する、USB-LAN変換アダプターを使用する、コントローラーに対応したドライバを組み込んだカスタムisoを作成することで回避できるといった情報がありましたが、バージョン8.0以降でも対応可能かは不明です。

# 互換性情報の確認

[Broadcom Compatibility Guide](https://compatibilityguide.broadcom.com/)から互換性を確認出来るため検索したところ、Realtek系のドライバが見当たらないことから、現在使用しているマザボに搭載されているコントローラー「Realtek RTL8111H」には対応していないことが確認出来ました。


https://compatibilityguide.broadcom.com/

:::note info
リンク先の`I/O Devices`タブから確認できます
:::

### ネットワークカードの選定
公式でドライバが提供されているコントローラーを用意すれば回避できると思われるため、各種通販サイトで入手できる製品のコントローラーを一つ一つ確認していきました。

手軽に使用できるUSB変換アダプターで探してみた所、Intel製を使用している物は見つけられませんでした。また、amazonで一番安いIntel製ネットワークカード「Intel 82573」はESXi 7.0 以降では非対応となっているとのことでした。

| メーカー| 型番 | 対応状況 |
|:-:|:-:|:-:|
| Realtek | RTL8111H  | 非対応  |
| ASIX | AX88179  | 非対応  |
| Intel | 82573  | 非対応  |
| Intel | 82574  | 対応  |
| Intel | 82576  | 対応  |
| Intel | I210  | 対応  |
| Intel | I350  | 対応  |
| Intel | I226-V | 非対応 |

:::note warn
上記表は一部抜粋であり網羅していません。
また、実機で検証したものでは無いため情報に誤りがある可能性があります。
:::


某中華系通販サイトを見たところ`Intel I210`を採用している安価なネットワークカードを見つけたので試しに注文しました。（海外サイト利用の際は諸々自己責任で）

その翌日、ダメ元で秋葉原の中古屋巡りをしたところ、対応品の`Intel 82574L`を使用したIntel製ネットワークカードを一つだけ発見したため購入しました。

・見つけたネットワークカード
https://www.intel.co.jp/content/www/jp/ja/products/sku/50395/intel-gigabit-ct-desktop-adapter/specifications.html

### 実動作確認
購入したネットワークカードを使用してインストールを実施した結果がこちら。
中古品ということで正常に動作するか不安でしたが、無事認識されエラーなくインストールが完了することができ、その後の動作に関しても執筆時点で問題は起きていません。
![Screenshot 2025-04-26 18-40-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056429/5056faa2-03ab-4170-86bf-4501a888dcaf.png)


# おわりに
さくっと無償版vSphereを導入して触ってみようと思ったのに、HWとの相性問題にぶつかるとは思ってもみませんでしたが無事解決できて何よりです。
注文したネットワークカード(Intel I210)が到着したら、再度動作検証をしたいと思います。

--- 2025/5/5 追記 ---
Intel I210 も無事認識しました

# 参考

1. [Broadcom Compatibility Guide](https://compatibilityguide.broadcom.com/)
2. [ESXi6.7インストール中に「No Network Adapters」エラーで失敗](https://blog.ideal-ltd.jp/entry/2022/05/06/085211)
3. [ESXiインストールで「No Network Adapters」が出力された時の対処法](https://i-think-it.net/esxi-install-no-network-adapters-error/)
4. [Esxi7をインストール中にNo Network Adaptersが出た時の対処方法](https://otomosa.com/vmware/esxi7-no-network-adapters/)
[UE5]Discordにメッセージを送信するプラグインを作ってみた

・プラグインは[こちら](https://github.com/hatosable/DiscordMessenger)からダウンロードできます
　(現在は5.3、5.4、5.5に対応)

https://github.com/hatosable/DiscordMessenger

# 何ができるのか

![スクリーンショット 2025-04-27 185149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/cbbc25c4-2514-4327-b888-472265276f40.png)

UE5からDiscordへ、任意のメッセージを送ることが可能になるプラグインです。
エディタはもちろん、パッケージ後のデータでも問題なく動作します。
チームで共有可能な簡易ログとして、テストプレイのデータ収集として、多岐に活躍することでしょう。

# 使用準備

### Discordでの準備
まずは **Discord Webhook** を用意します。
Discordのサーバー設定から「連携サービス」に移動してください。

::: note
Webhookとは、受信者側でURLを設定しておき、そのURL宛に送信元がデータを送る仕組みです。
:::

![スクリーンショット 2025-04-27 194045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/b6bb1010-ba3f-4b10-b22f-8b426092f1a6.png)

「Webhookを作成」をクリックするとWebhookが作成されます。
「ウェブフックURLをコピー」をクリックしておいてください(後ほどUE側で使用します)。
![スクリーンショット 2025-04-27 194108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/8771df47-aba6-4bce-8843-0fe908b92d4c.png)


### UE5での準備
次にプラグインを使用するUEプロジェクトのディレクトリを開きます。
「Plugins」フォルダ内にプラグインを置いてください。

:::note warn
もし「Plugins」フォルダがなかった場合は作成してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/121f3ea7-3095-486f-ad58-fc29b78952dd.png)


プロジェクトを起動し、プロジェクト設定に移動します。
「Discord Messenger」の項目が増えているので、先ほどコピーしたURLを貼り付けてください。
これで使用する準備は完了です。
![スクリーンショット 2025-04-27 184513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/5997a6ac-4b07-453e-a08a-434b06c6f8a9.png)

# 使用方法

ブループリントエディタを右クリックし、「SendMessageToDisccord」または「DiscordMessenger」で検索すると画像の関数がヒットします。

![スクリーンショット 2025-04-27 184605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/bc08f052-0f78-4c62-afe5-6d932fd7c7c9.png)

あとは引数になっている構造体を作成し、情報を入力して実行するだけです。
![スクリーンショット 2025-04-27 184706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/5053e2b1-249f-4a1c-95ac-1d2c4b01ea69.png)

### 引数について

引数とそれに対応する変更箇所は以下の通りです。
![スクリーンショット 2025-04-27 185149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761410/26a1168e-56f3-40cd-bfab-2b7bc1cf34ef.png)

# さいごに
このプラグインは現在も開発中です。変更があった場合はこの記事も随時更新を行います。

### 参考記事

https://zenn.dev/mkhana/articles/d58b153db5ea26

https://programmingdev.com/sending-messages-to-discord-via-unreal-engine-a-webhook-guide/
AWS認定試験 MLS-C01 受けてみた！(2025-04-26)

## はじめに
- CLF/SAA/SOA/DVA/AIFを取得済
- 1か月前にMLAを取得済
- 記憶があるうちにMLAの流れでMLS受験を決意
- 初めてのスペシャリティの試験

## 試験結果
- 750点以上が合格なので、多少余裕あり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/fc879eb6-32f3-48ce-ac72-2421a19c895b.png)


## 学習方法
- 基本は、Web問題集のCloudTechを利用　→メインはこれを利用
- 生成AIを活用して理解を深めた
- [試験問題サンプル](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ml/AWS-Certified-Machine-Learning-Specialty_Sample-Questions.pdf) →ちなみに直前に実施した結果、正答率2割:cry:
- [AWS Certified Machine Learning – Specialty 公式練習問題集](https://explore.skillbuilder.aws/learn/courses/12525/aws-certified-machine-learning-specialty-practice-question-set-mls-c01-japanese)　→こちらは正答率5割:sweat:



## 所感
- 1か月前に受験したMLAで出題された用語がちらほら
- MLAで出題された用語のケアは出来ていなかったが覚えていたので、試験を受ける順番としては良かった
- とにかく今回の試験はねばった。どういうことかというと、文章が長いだけあって回答へ結び付けるために、3，4分の時間をかけた問題が10問くらい
- 後から見直すをつけたのは10問ほどだったが、結局はすべての問題を見直した
- 結果、試験時間190分で130分使った
- 機械学習を活用するシチュエーションにおいて、AWSサービスがどのように利用できるかをイメージすることができれば、初見の問題でも対処できる
ハードリンクとシンボリックリンクの違い

# シェルにおけるリンクについて

シェルにおいて、ファイルのリンク付けを行うには、`ln`コマンドを使用する。リンク付けを行うことで、ファイルの共有などを行うことができる。


そのうち、ハードリンクとシンボリックリンクの二つが存在する。

## ハードリンク
一つのファイルに複数の別の名前のファイルを作成することができる。それぞれは共有されたおり、ファイルの中身が編集されても、共有する。しかし、リンク元やリンク先のファイルが削除されても、残ったファイルは利用できる。

ハードリンクの中身
```shell:zsh
$ cat a.txt
hoge
$ ln a.txt b.txt
#a.txtのはハードリンクのb.txtを作成
$ cat b.txt
hoge #a.txtの内容と共有
```
リンク元を削除
```shell:zsh
$ rm a.txt
$ cat b.txt
hoge
```

ファイルの編集
```shell:zsh
$ cat > a.txt
puge
$ cat b.txt
puge #hogeからpugeに変化
```

## シンボリックリンク



シンボリックリンクの作成
```shell:zsh
$ ln -s z.txt y.txt #z.txtのシンボリックリンクY.txtを作成
```
リンク元ファイルの削除
```shell:zsh
$ rm z.txt
$ cat y.txt
cat: y.txt: No such file or directory 
#y.txtのオリジナルであるz.txtが存在しないため、アクセス不可
```

`y.txt`ファイルを起動しても、実際は`z.txt`の中にアクセスしていることとなる。

## 相違点
ハードリンクでは、リンク元を削除しても、リンク付けされたファイルはアクセス可能だ。しかし、シンボリックリンクでは、リンク元のファイルを削除した場合、リンク付けされたファイルもアクセス不可となってします。これは、リンク付けされたファイルにアクセスすることは、リンク元のファイルにアクセスすることと同義であるためだとわかる。

#### ハードリンク
![ハードリンク.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048927/564c1cf2-b74b-4a38-9d62-1b084395d506.png)


#### シンボリックリンク

![シンボリックリンク.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048927/2be3f969-9e35-4922-b988-fa27a868a640.png)


## まとめ
日々、複数のユーザを使用しているため、それぞれのユーザでファイルを共有したいという考えがある。そのためのシェルスクリプト作成にとって、ハードリンクとシンボリックリンクの違いを明確に理解することは重要だと思う。シェルは、イマイチ寡黙なプログラミング言語(スクリプト言語)であるため、小さな挙動の相違を深く理解することは、UNIXへの理解に繋がるだろう。その点を意識して、今後も勉強に取り組んでいきたい。
プリザンターでサウンドプレーヤーを埋め込む方法

## はじめに
今回はプリザンターの添付ファイルに貼り付けられた音楽ファイルをブラウザ画面上でシームレスに再生するためにオーディオプレーヤーを埋め込む方法を紹介します。

## 何を使うか？
HTMLの `<audio>`タグを使うのが鉄板なので、今回はそれを使用します。[Howler.js](https://howlerjs.com/)を使うという方法もあるのですが、今回はそれは使わずにシンプルにいきます。

## 実装してみた
サーバスクリプトで実装します。条件は行表示の前です。

```js
const attachments = JSON.parse(model.AttachmentsA);

attachments.forEach(function(attachment){
    columns.AttachmentsA.RawText += `<audio controls preload="none"><source src="/binaries/${attachment.Guid}/download" type="audio/wav"></audio>`;
});
```

`model`に格納されている添付ファイル項目のJSONをオブジェクトにパースして、それをforeachで回して`columns`の`RawText`に格納しています。
添付ファイルにはオーディオファイルしか格納されていない前提なので、例外処理を加えていませんが気になる方は`attachment.Name`に格納されている添付ファイル名の拡張子をみて判断してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/89ade684-8380-487b-809e-00de49aa2ec1.png)

実行してみると添付ファイル項目はこのように表示されます。サーバ→クライエントの通信量を極力減らしたいためプリソードをさせていないためトータル時間などは表示されていませんが、このあたりは `<audio>`タグのオプションでコントロール可能なので、いろいろとカスタマイズしてみてください。

## まとめ
今回は、添付ファイル項目の音声ファイルをシームレスに再生するためにプレーヤーを埋め込む方法を紹介しました。プリザンターをCRMとして使用する際などIP-PBXの録音データetc.を一括管理する時などに便利な方法なので、是非試してみてください。
GitHub Copilot スラッシュコマンド

# 💻 VS Code におけるコマンド＆ワークスペース操作ガイド

VS Code や AI コーディングアシスタントと連携して、開発効率を向上させるためのコマンド群を紹介します。以下のコマンドを使えば、コードの理解、テスト、修正、新規作成などを素早く実行できます。

以下は、`/help` で表示される一覧です。


## `@workspace`

- **用途**: ワークスペースに関する質問をする

### `/explain`
- **用途**: アクティブなエディターで開いているコードの仕組みを説明してくれます
- **例**: `main.ts`のコードの流れや処理の意味を知りたいとき

![スクリーンショット 2025-04-25 19.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3c5b32db-187b-47d4-8b69-615d9b9b42da.png)

### `/tests`
- **用途**: 選択したコードに対して、単体テストコード（ユニットテスト）を生成
- **例**: `add()`関数を選んで「/tests」と入力すると、Jest などのテストコードを自動生成

![スクリーンショット 2025-04-25 19.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d0acc495-74c8-4d9d-9496-ce5d7a76e6da.png)

### `/fix`
- **用途**: 選択したコードに対して、問題の修正案を提案してくれます
- **例**: バグがある関数を選択して「/fix」で修正ポイントを確認

![スクリーンショット 2025-04-25 19.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2a88223c-d486-4b1b-8acb-44067f0b2eaa.png)

### `/new`
- **用途**: 新しいファイルやプロジェクトのスキャフォールディング（雛形コード）を生成
- **例**: React の新しいページファイルなどを生成

![スクリーンショット 2025-04-25 19.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5a440aad-f7da-4505-be01-af79c3e23e84.png)

### `/newNotebook`
- **用途**: 新しい Jupyter Notebook ファイル（`.ipynb`）を作成
- **活用例**: データ分析や機械学習プロジェクトの開始時に便利

![スクリーンショット 2025-04-25 20.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a7daec17-3e69-49c4-b76b-79c3ea9a432f.png)

### `/setupTests`（試験段階）
- **用途**: プロジェクト全体でテスト環境を構築する（JestやMochaの初期設定など）


## `@vscode`
- **用途**: VS Code の設定・操作に関する質問ができる

### `/search`
- **用途**: ワークスペース内で検索するためのクエリパラメータを生成
- **例**: 特定の関数や変数の使用箇所を絞り込み検索

![スクリーンショット 2025-04-25 20.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d25550c1-5b6e-4277-9afc-744d5eb716fb.png)

### `/startDebugging`

- **用途**: VS Code でデバッグ構成（launch.json）を自動生成して、即デバッグをスタート


## `@terminal`

- **用途**: ターミナルコマンドに関する操作方法を確認できる  

### `/explain`
- **用途**: ターミナルコマンドの意味や実行結果を解説してくれる
- **例**: `main.ts`のコードの流れや処理の意味を知りたいとき


![スクリーンショット 2025-04-25 19.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a5abecf7-c659-42ed-afb7-5d3fb2e5a3c7.png)

## `@github`
- **用途**: GitHub のリポジトリ検索や、コード検索、エンタープライズナレッジの取得に使える
pythonで作る簡単ゲーム5選

# Pythonで作る簡単ゲーム5選

# はじめに

Pythonはシンプルな文法と豊富なライブラリのおかげで、初心者でも手軽にゲーム作りを楽しめるプログラミング言語です。この記事では、Python初心者でも取り組みやすい「簡単ゲーム」を5つ厳選して紹介します。すべて無料で始められ、学びながら楽しめるものばかりです。

---

# 1. 数当てゲーム（Number Guessing Game）

**概要**  
コンピュータがランダムに選んだ数字を、プレイヤーが当てるシンプルなゲームです。ヒントとして「大きい」「小さい」を表示しながら進めます。

**ポイント**
- 標準ライブラリだけで作成可能
- 入力・条件分岐・ループの基礎を学べる

**サンプルコード**
```python
import random

answer = random.randint(1, 100)
while True:
    guess = int(input("1〜100の数字を当ててください: "))
    if guess  answer:
        print("もっと小さいです")
    else:
        print("正解！")
        break
```

---

# 2. じゃんけんゲーム（Rock-Paper-Scissors）

**概要**  
プレイヤーとコンピュータが「グー・チョキ・パー」で対戦する定番ゲームです。

**ポイント**
- 条件分岐や乱数の使い方を練習できる
- ゲームロジックの設計に最適

**サンプルコード**
```python
import random

hands = ['グー', 'チョキ', 'パー']
player = input("グー・チョキ・パー どれを出しますか？: ")
computer = random.choice(hands)
print(f"コンピュータは{computer}を出しました")

if player == computer:
    print("あいこです")
elif (player == 'グー' and computer == 'チョキ') or \
     (player == 'チョキ' and computer == 'パー') or \
     (player == 'パー' and computer == 'グー'):
    print("あなたの勝ち！")
else:
    print("あなたの負け！")
```

---

# 3. スイカ割りゲーム

**概要**  
隠されたスイカの位置を推理しながら当てるゲームです。ヒントとしてスイカまでの距離が表示されます。

**ポイント**
- 変数・ループ・条件分岐・乱数の総合練習
- ゲーム性を工夫しやすい

**サンプルコード（簡易版）**
```python
import random

suika = random.randint(1, 10)
while True:
    guess = int(input("1〜10のどこにスイカがある？: "))
    if guess == suika:
        print("スイカ発見！おめでとう！")
        break
    else:
        print(f"スイカまでの距離: {abs(suika - guess)}")
```

---

# 4. ブロック崩し（Breakout）

**概要**  
ボールを跳ね返してブロックを壊す、昔ながらのアクションゲーム。Pythonのゲームライブラリ「Pygame」を使えば、初心者でも簡単な2Dゲームが作れます[3][6][7][8]。

**ポイント**
- グラフィックやアニメーションの基礎が学べる
- Pygameの導入・使い方を体験できる

**Pygameインストール**
```bash
pip install pygame
```

**Pygameの使い方入門**
- 画面表示、画像の描画、キーボード操作などを学べます
- 公式チュートリアルやYouTube動画も多数

https://www.amgakuin.co.jp/contents/game/column/game-terminology/python-game


---

# 5. テトリス風落ちものゲーム

**概要**  
テトリスのようなブロックを積み上げていく落ちものゲーム。Pygameを使えば、キーボード操作や当たり判定などゲーム開発の基本を体験できます[10]。

**ポイント**
- ゲームループやイベント処理の理解に最適
- 少し難易度は上がるが達成感も大きい

**参考**
YouTubeやブログで「Pygame テトリス」などで検索すると、丁寧な解説が多数見つかります。

---

# まとめ

Pythonは標準ライブラリだけでも十分にゲームを作れますが、**Pygame**のようなライブラリを使うことで、より本格的な2Dゲームにも挑戦できます。  
まずはシンプルなゲームから始めて、徐々に機能を追加したり、グラフィックやサウンドを工夫してみましょう。  
ゲーム作りを通して、Pythonの基礎から応用まで自然に身につけていくことができます。

ぜひこの記事を参考に、あなたもPythonで楽しいゲーム作りにチャレンジしてみてください！
Knowledge base for AWS Bedrockメモ

「Knowledge base for AWS Bedrock」について、わかりやすく説明するね！

---
簡単にいうと、

**Knowledge base for AWS Bedrock** は、  
→ **自分の持ってるデータ（ドキュメントとかFAQとか）を使って、AI（生成AI）に自然な応答をさせるための機能** だよ！

---
もうちょっと詳しくいうと：

- 普通、生成AI（例えば Claude、Titan、Anthropic みたいなモデル）は、学習した知識でしか答えられないよね。
- でも現実のビジネスでは、「社内マニュアル」とか「社内専用のナレッジ」とか、AIがもともと知らない情報をベースに答えてほしい場面が多い。
- そこで、「Knowledge base」を使って、自分の持ってるドキュメントを登録しておくと、
  - AWSが裏でそれを**ベクトル化（Embedding）**して、
  - 質問がきたら、そのベクトル検索で「関連しそうな情報」を引っ張ってきて、
  - それをもとにAIが回答を作ってくれる。

これ、いわゆる「**RAG**（Retrieval-Augmented Generation）」って呼ばれる手法を、簡単にAWS上で実現できる仕組みなんだ。

---

🌟 まとめると  
「Knowledge base for Bedrock = 自分のデータ × AIをかけあわせて、より賢い回答をさせるためのサービス」

---
【備忘録】Linuxコマンドの復習～echoコマンド～

## はじめに
自分が忘れてしまいがちなLinuxコマンドの復習です。
今回はechoコマンドについて整理します。

## echoコマンド

### 1. ターミナルに文字を出力する
```bash
➜  ~ echo 'hello!'
hello!
```
### 2. 変数の中身を出力する


```bash
➜  ~ a="test"
➜  ~ b="test2"
➜  ~ echo "これは" "$a" "です"
これは test です
➜  ~ echo "こっちは" "$b" "です"
こっちは test2 です
```

### 3. ファイルの中に書き込む
```bash
# テキストを書き込む
➜  ~ echo "test" > ~/test.txt
➜  ~ cat ~/test.txt
test

# テキストを追記する
➜  ~ echo "test2" >> ~/test.txt
➜  ~ cat ~/test.txt
test
test2
```
※ファイル（test.txt）がなくても、同時に作成される

### 4. 注意点
```bash
# すでにファイル内にテキストがある場合に'>'を使うと上書きされてしまう
➜  ~ echo "aaa" > ~/test.txt
➜  ~ cat ~/test.txt
aaa
```

## おわりに
普段の学習ではあまり使う機会はありませんが、デプロイ時に使うことが多いと思うのでこれを機に理解しておきたいと思います。
PythonでYouTube動画情報を取得する方法

# はじめに

YouTube動画のタイトルや再生回数、説明文などの情報をPythonで取得したいと思ったことはありませんか？この記事では、代表的な2つの方法――「YouTube Data API v3」を使う方法と、ライブラリ「pytube」を使う方法――をサンプルコード付きでわかりやすく解説します。

---

# 方法1：YouTube Data API v3を使う

### 概要

YouTube Data API v3は、Googleが公式に提供しているAPIです。動画やチャンネルの詳細情報、統計情報など幅広いデータを取得できます。

### 事前準備

1. **Google Cloud Platform（GCP）でプロジェクト作成**
2. **YouTube Data API v3を有効化**
3. **APIキーを取得**

詳しい手順は[Google Cloud Platform](https://console.cloud.google.com/)の公式ドキュメントを参照してください。

### 必要なライブラリのインストール

```bash
pip install google-api-python-client
```

### サンプルコード：動画情報の取得

```python
from googleapiclient.discovery import build

API_KEY = '取得したAPIキーを入力'
VIDEO_ID = '動画IDを入力'  # 例: 'dQw4w9WgXcQ'

youtube = build('youtube', 'v3', developerKey=API_KEY)

response = youtube.videos().list(
    part='snippet,statistics',
    id=VIDEO_ID
).execute()

for item in response.get('items', []):
    snippet = item['snippet']
    statistics = item['statistics']
    print('タイトル:', snippet['title'])
    print('説明:', snippet['description'])
    print('公開日:', snippet['publishedAt'])
    print('再生回数:', statistics.get('viewCount'))
    print('高評価数:', statistics.get('likeCount'))
    print('コメント数:', statistics.get('commentCount'))
```
- `VIDEO_ID`はYouTube動画URLの「v=」以降の部分です（例: `https://www.youtube.com/watch?v=dQw4w9WgXcQ`なら`dQw4w9WgXcQ`）

---

# 方法2：pytubeライブラリを使う

### 概要

pytubeは、YouTube動画の情報取得やダウンロードができるPython用の非公式ライブラリです。APIキーの取得が不要なので手軽に使えます

### インストール

```bash
pip install pytube
```

### サンプルコード：動画情報の取得

```python
from pytube import YouTube

url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
yt = YouTube(url)

print('タイトル:', yt.title)
print('チャンネル名:', yt.author)
print('再生回数:', yt.views)
print('長さ（秒）:', yt.length)
print('公開日:', yt.publish_date)
print('説明:', yt.description)
print('サムネイルURL:', yt.thumbnail_url)
print('キーワード:', yt.keywords)
```
- 取得できる情報はタイトル、チャンネル名、再生回数、動画の長さ、説明文、サムネイルURL、キーワードなどです

---

# その他の方法

- **requestsやBeautifulSoupでWebページをパースする方法**もありますが、YouTubeの仕様変更やJavaScriptによる動的生成により安定性に欠けるため、基本的にはAPIや専用ライブラリの利用をおすすめします

---

# まとめ

- **公式API（YouTube Data API v3）**：幅広い情報を取得可能。APIキーが必要
- **pytubeライブラリ**：APIキー不要で手軽。動画の基本情報取得やダウンロードも可能

用途や取得したい情報に応じて、最適な方法を選んでください。どちらもPythonで簡単にYouTube動画情報を取得できますので、ぜひ活用してみてください！
OCI#10 ociコマンドによるパラメータの名称変更

## 概要
作成後のVCNに対して、ociコマンドを使用して表示名の変更を実施した。
[OCI#9 ociコマンドによるVCN名変更](https://qiita.com/nonZy/items/0eb03a601ca5cf9df7e7)

その際、変更前のVCN名が含まれるパラメータが複数個含まれていたため、
対象パラメータ名の変更をCloud Shellでociコマンドにより変更を行う。

## マニュアル
今回使用するociコマンドについては、下記リファレンスを参考にして実施。
[Oracle Cloud Infrastructure CLI Command Reference](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.54.4/oci_cli_docs/index.html)

## DNSドメイン名は変更不可
:::note warn
注意
DNSドメイン名の変更は不可。
:::
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/ccc2cc88-91de-4f70-8bf4-7a4de9e5ad0c.png)


## 手順
### 事前準備
Cloud Shellを起動する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/4d0517dc-9117-4a25-8e94-5c0920e1e8eb.png)

### デフォルトルート表の名称変更
変更前："Default Route Table for vcn-before-name"
変更後："Default Route Table for vcn-after-name"

コマンド例
```
oci network route-table update --rt-id [text] --display-name [text]
```
実行結果として、下記が出力されます。
```
{
  "data": {
    ...
    "display-name": "Default Route Table for vcn-after-name",
    ...
}
```

### デフォルトセキュリティリストの名称変更
変更前："Default Security List for vcn-before-name"
変更後："Default Security List for vcn-after-name"

コマンド例
```
oci network security-list update --security-list-id [text] --display-name [text]
```
実行結果として、下記が出力されます。
```
{
  "data": {
  ...
    "display-name": "Default Security List for vcn-after-name",
  ...
}
```

### デフォルトDHCPオプション名の名称変更
変更前："Default DHCP Options for vcn-before-name"
変更後："Default DHCP Options for vcn-after-name"
コマンド例
```
oci network dhcp-options update --dhcp-id [text] --display-name [text]
```
実行結果として、下記が出力されます。
```
{
  "data": {
  ...
    "display-name": "Default DHCP Options for vcn-after-name",
  ...
}
```

### DNSリゾルバ名の名称変更
※表示(display)名
変更前："vcn-before-name"
変更後："vcn-after-name"
コマンド例
```
oci dns resolver update --resolver-id [text] --display-name [text]
```
実行結果として、下記が出力されます。
```
{
  "data": {
  ...
    "display-name": "vcn-after-name",
  ...
}
```

### 検索ドメイン名の名称変更
変更前："vcnbeforename.oraclevcn.com"
変更後："vcnaftername.oraclevcn.com"

```
oci network dhcp-options update --dhcp-id [text] --options '[{"type": "DomainNameServer", "serverType": "VcnLocalPlusInternet"}, {"type": "SearchDomain", "search-domain-names": ["<new domain name>.oraclevcn.com"]}]'
```

yを入力して実行。
```
WARNING: Updates to defined-tags and freeform-tags and options will replace any existing values. Are you sure you want to continue? [y/N]: y
```
実行結果として、下記が出力されます。
```
{
  "data": {
  ...
    "options": [
      {
        "search-domain-names": [
          "vcnaftername.oraclevcn.com"
        ],
        "type": "SearchDomain"
  ...
}
```

### プライベートビューの名称変更
※表示(display)名
変更前："vcn-before-name"
変更後："vcn-after-name"

コマンド例
```
oci dns view update --view-id [text] --display-name [text]
```
実行結果として、下記が出力されます。
```
{
  "data": {
  ...
    "display-name": "vcn-after-name",
  ...
}
```

### エラー時
エラー時は下記の様にError.....と表示されるので分かりやすいと思います。
```
Error: Invalid value for '--domain-name-type': invalid choice: vcn-after-name. (choose from SUBNET_DOMAIN, VCN_DOMAIN, CUSTOM_DOMAIN)
```

作成後の変更は若干手間がかかるので、注意が必要。
WSLにarchlinuxをインストールする

# インストール
```powershell:powershell
wsl --install archlinux
```
# ロケールの設定
```bash:bash
# en_US.UTF-8のコメントを外す
nvim /etc/locale.conf

locale-gen
localectl set-locale LANG=en_US.UTF-8
```

# 色々入れる
```bash:bash
pacman -Syyu --needed base-devel git neovim
```

# ユーザーを追加
```bash:bash
useradd -m -G wheel USERNAME
passwd USERNAME

# wheelを有効化
EDITOR=nvim visudo

# デフォルトのユーザーを設定
printf "[user]\ndefault=USERNAME" >> /etc/wsl.conf
```
ここでいったんログアウト。
```bash:bash
logout
```
追加したユーザーでログインされることを確認。
```powershell:powershell
wsl --shutdown
wsl -d archlinux
```



# AURヘルパーを入れる
:::note warn
rootではmakepkgできない。
:::
```bash:bash
git clone https://aur.archlinux.org/paru-bin.git ~/paru-bin
cd ~/paru-bin
makepkg -si

#後片付け
cd
rm -rf ~/paru-bin
```
LPIC300のための勉強備忘録

・TDBファイル
主にSambaサーバーにおいて、さまざまな管理情報を保存するためのデータベースファイル（Trivial Database）TDBファイルの内容をダンプするコマンドは以下である。
tdbdump
tdbtool

・LDBファイル
複数のユーザーが同じデータベースを同時に編集できないようにするために Microsoft Access で使用されるロック情報ファイル
tdbbackupでバックアップ可能

・レジストリ
Windowsのオペレーティングシステムやアプリケーションの設定情報を記録している階層型のデータベース（registry＝登記簿）
設定ファイルを極力使用せずに、レジストリを使用して設定を行うSambaのメリットは以下がある
Sambaサーバにログインせずにリモートで設定を行える
Sambaのデーモンの起動にかかる時間が短くなる。これはデーモンは必要なタイミングまでレジストリの設定データを読み込まないためである。
設定反映についてSambaのデーモンのリロードが不要になる

・VFSモジュール
Sambaなどのファイルサーバーがクライアントからのファイル操作リクエストに対する挙動をカスタマイズできるモジュール

・SMB
Server Message Blockの略で、主にWindows環境でファイルやプリンターの共有などを行うための通信プロトコル。クライアントサーバー型で、ネットワーク上のリソースを共有するために使われる。﻿
設定により、ファイル名とディレクトリ名に任意の文字コードを使用できる
便宜的ロックがサポートされている

・NetBIOS
Microsoftのネットワーク環境を構築する際に利用される基本的な通信プロトコル
Windowsの「マイネットワーク」に、サーバーを表示させるにはNetBIOSに対応させる必要がある

・Sambaサーバーにおいて共有は通常の共有のほか、homes共有（ホームディレクトリ）とprinters共有（プリンタ）がある。
Sambaサーバーに共有名を指定してアクセスした際に、Sambaは指定した共有名と合致する設定を探索するが、その順番は以下である。
1.通常の共有（指定した共有名がセクション名と同じ）
2.homes共有（ユーザー名と同じ）
3.printers共有
・Sambaサーバへの接続時に接続元マシン名をログファイルへ書き込む場合は、パラメータ"log file"を使用して、値に変数"%m"を使用する。
・Sambaの設定ファイル(smb.conf)において、VFSモジュールを使用してWindows (NTFS)のアクセス許可(ACL)を行う設定は以下である。
vfs objects = acl_xattr

・Sambaが設定をsmb.confからではなくレジストリから読み込むようにするにはsmb.confファイルの[global]セクションに"config backend = registry"と記述する
Sambaの設定ファイル(smb.conf)において、「現ユーザーが所属するドメインかワークグループ名」を表す変数は"%D"である。
・ダイレクトホスティングSMB
使用することで、NetBIOSを使用せずにCIFSファイル共有サーバに接続可能になる。
ダイレクトホスティングSMBはTCP/445番ポートを使用する。

・Winbind
UNIX系OS (Linuxなど) がWindows (Active Directory) のユーザーやグループ情報を取得し、それらをUNIXシステムの認証や権限管理に使用できるようにする仕組み
Winbindの設定ファイルはSambaと同じくsmb.confである

・Samba（バージョン4.0）
以降、Active Directoryドメインコントローラとして実行できる。
LDAP（ldb）にアクセスできるSambaのツールには以下がある。
ldbsearch : コマンドラインの ldb 検索ユーティリティー
ldbedit : 自分の好きなエディターで ldb データベースの全部または一部を編集する
ldbadd : LDIF 形式の入力を使って ldb データベースにレコードを追加する
ldbdel : ldb データベースからレコードを削除する（ldbdeleteではない）
ldbmodify : LDIF 形式の入力を使って ldb データベースのレコードを修正する

・smbstatusコマンド
共有に接続しているクライアントのユーザ名、グループ名、接続元IPアドレスとポートに加え、接続を受け付けたSambaのプロセスIDを表示する

・LDIFファイル
LDAPサーバにディレクトリ情報(エントリ)を登録したり、エントリの内容を変更したりする。LDAPエントリを簡単なテキストフォーマットで表現するために利用される。
changetype modify の次に指定できるものは以下
add : dn行で指定したエントリに属性を追加する。
delete : dn行で指定したエントリから属性を削除する。
replace : dn行で指定したエントリの属性を、指定した値で置き換える。（removeは無い）
・tdbrestore
tdbdumpで作成したダンプファイルをTDB形式に復元するツール。
ex) tdbrestore > test.tdb < test.tdb.bak

・secrets.tdbに格納されるデータ
machine/domain SID
LDAPと共に使われる秘密パスワード
machine 秘密トークン

・objectClass
LDIFファイルにおいて、エントリと関連付けるオブジェクトクラスを指定する（オブジェクトの宣言を開始する）ために使用する属性
3分で理解する正規表現入門

# はじめに

正規表現（Regular Expression、略して「regex」や「regexp」）は、文字列のパターンマッチングや置換、抽出などに使われる強力なツールです。プログラミングやデータ処理、テキスト検索など、さまざまな場面で活躍します。この記事では、正規表現の基本を3分で理解できるように、最小限の知識とよく使うパターンをまとめました。

---

# 正規表現とは？

正規表現は「特定のパターンに一致する文字列を検索・抽出・置換するための表現方法」です。例えば「メールアドレスだけを抽出したい」「数字だけを置換したい」といった用途で使われます。

---

# 正規表現の基本構文

| パターン | 意味                    | 例           |
|----------|-------------------------|--------------|
| `.`      | 任意の1文字             | `a.c` → `abc`, `a1c` |
| `*`      | 直前の文字が0回以上      | `a*` → `""`, `a`, `aa` |
| `+`      | 直前の文字が1回以上      | `a+` → `a`, `aa` |
| `?`      | 直前の文字が0回または1回 | `a?` → `""`, `a` |
| `[]`     | いずれか1文字           | `[abc]` → `a`, `b`, `c` |
| ``    | 否定（以外の1文字）      | `[^0-9]` → 数字以外 |
| `^`      | 行頭                    | `^abc` → `abc`で始まる |
| `$`      | 行末                    | `abc$` → `abc`で終わる |
| `{n,m}`  | n回以上m回以下の繰り返し | `a{2,4}` → `aa`, `aaa`, `aaaa` |
| `|`      | または                  | `abc|xyz` → `abc`または`xyz` |

---

# よく使う正規表現パターン

- **数字だけ**: `\d+`  
  例: `123`, `2024`
- **英字だけ**: `[a-zA-Z]+`  
  例: `hello`, `WORLD`
- **メールアドレス**: `[\w\.-]+@[\w\.-]+\.\w+`
- **郵便番号（例: 123-4567）**: `\d{3}-\d{4}`
- **電話番号（例: 090-1234-5678）**: `\d{2,4}-\d{2,4}-\d{4}`

---

# Pythonでの正規表現例

```python
import re

text = "メール: test@example.com, 電話: 090-1234-5678"
email = re.findall(r"[\w\.-]+@[\w\.-]+\.\w+", text)
phone = re.findall(r"\d{2,4}-\d{2,4}-\d{4}", text)

print("メール:", email)  # ['test@example.com']
print("電話番号:", phone)  # ['090-1234-5678']
```

---

# まとめ

- 正規表現は「パターンで文字列を検索・抽出・置換」できる便利なツール
- 基本構文（`.` `*` `+` `?` `[]` など）を覚えるだけで多くの処理が可能
- よく使うパターンはコピペで活用しよう
- PythonやJavaScriptなど多くの言語でサポートされている

まずは簡単なパターンから、実際に使ってみて慣れていきましょう！
Docker テーブル作成

# MysqlにDockerでTableを作成
かなり時間を割いたので、備忘録として記載

まず、Docker DesctopでMysqlデータベースは作成済み
問題は、そのデーターベースにテーブルを作成する工程でつまづいた

まずは、現在のymlファイルの定義
```
services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      TZ: ${TZ}
    ports:
        - ${DB_PORT}:3306
    volumes:
        - db-store:/var/lib/mysql
        - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
        - ./docker/initdb:/docker-entrypoint-initdb.d
volumes:
  db-store:
  ```

  - ./docker/initdb:/docker-entrypoint-initdb.d

このファイルのディレクトリが理解できず、無駄に時間を食ってしまった。

C:\Users\<ユーザー名>\mysql
ここにymlファイルがあるので、それを上記に編集

その後
　- ./docker/initdb:/docker-entrypoint-initdb.d- に以下、SQL文を配置

```
CREATE TABLE test.employee (	
	id int,
	name varchar(10)
);
```
で、dockerを起動してテーブルが作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050450/607b3d21-958f-4897-8650-6b7b738a2e66.png)

問題なし！

来週は、テーブルの設計、データベースへのアクセス＆取得したデータの表示までを目標に
【Linux設定】入力されたコマンドをログとして取得し、ファイル保存（rsyslog)

# ゴール
Linuxサーバー（EC2内）に接続して入力されたコマンドを監査用のログとして残す

# 前提
　・EC2起動済み（Linux）
　・SSH接続可能

# Linux設定
## bashrc設定
:::note
bashrcとは？
bashを起動したときに読み込まれる設定ファイル
（正確には、bash_profileから読み込まれるファイル）
:::

まず、Linuxでコマンドをログとして記録する設定ファイルのAuditを設定します。

```bash
vim /etc/bashrc
```

ファイルの最後に下記を追加します。
```bash
export PROMPT_COMMAND='RETRN_VAL=$?; logger -p local1.notice -t bash_audit "[$USER][$(pwd)] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")"'
```

上記はコマンドが実行されるたび（PROMPT_COMMAND)に実行コマンド＆ユーザー名＆実行ディレクトリの情報をrsyslogに送る設定となります。

:::note
logger -p local1.notice　とは？

loggerはsyslogでログを送る用のコマンド
local1 ~ local7まではユーザーが定義する用のログカテゴリとなっています。
今回はlocal1を、bashのコマンド履歴用のログカテゴリとして使用します。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/6a99aaaa-28cc-43a2-a580-5471c74617d7.png)
↑追記して保存（:wq)

## rsyslog設定

rsyslogに関する設定は　「bash_audit.conf」

```
vim /etc/rsyslog.d/bash_audit.conf
```

```rsyslog.d/bash_audit.conf
local1.*    /var/log/bash_audit.log
```
↑を追記して保存

```
which rsyslog
sudo yum install -y rsyslog
sudo systemctl restart rsyslog
sudo systemctl status rsyslog
```
whichコマンドでrsyslogサービスの存在を確認（ない場合はインストール）
rsyslogサービスを再起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/f01a2abf-d4ab-4e06-a4db-da917d5210f3.png)
↑「active」になっていれば成功


## 確認
ログファイルを確認して、確認してみる

```bash
cat /var/log/bash_audit.log
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/9a99c6ed-36ae-445e-8509-bd775542c1a4.png)
↑出力されている


## ログを日付ごとに分けたい
これだとすべての日付のログが同じファイルに混在しており、保守性が低い
ログの日付ごとにファイルを分けるようにrsyslog設定を変える

```bash
vim /etc/rsyslog.d/bash_audit.conf
```
↓を記載
```/etc/rsyslog.d/bash_audit.conf
template(name="DailyLogFile" type="string" string="/var/log/bash_audit/%$YEAR%-%$MONTH%-%$DAY%.log")

if $syslogfacility-text == 'local1' then {
    action(type="omfile" dynaFile="DailyLogFile")
    stop
}
```

:::note
actionはrsyslogの何かを実行するブロック
type="omfile"はログを指定したテンプレートで出力するのを指定する
%$YEAR%-%$MONTH%-%$DAY%.log ⇒ yyyyMMdd形式（%~%はLinuxの環境変数）
:::

また、/var/log/bash_auditディレクトリ作成＆パーミッション設定を行う
```bash
sudo mkdir -p /var/log/bash_audit
sudo chown root:adm /var/log/bash_audit
sudo chmod 770 /var/log/bash_audit
```
ログ用フォルダ作成＆rootユーザーを所有者にして書き込み権限を付与

rsyslogを再起動＆ログファイル確認

```bash
sudo systemctl restart rsyslog
cd /var/log/bash_audit
ls
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/833d097a-9baa-4629-b53b-26638c51de89.png)
↑できてる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/6afc6053-5574-4102-8bb0-9c72955a26bc.png)
↑中身も出力されている
Unity で台パン猫放置ゲーム Bongo Cat を作る

# はじめに
* Unity で人気の台パン猫放置ゲーム Bongo Cat のクローンを作ります。
* この記事では主に必要となる、「キーボード入力イベントを常に受け取る」という技術と「デスクトップでウィンドウを透過させる」という技術の二点についてお話します。

# キーボード入力イベントを常に受け取る
* Bongo Cat ではゲームのウィンドウがアクティブになっていなくても、常にキーボード入力イベントを受け取りカウントしています。
* これは [SharpHook](https://github.com/TolikPylypchuk/SharpHook) というライブラリを使って実現できます。

## インストール
* まずは SharpHook のインストールのために、依存関係を管理する [NuGetForUnity](https://github.com/GlitchEnzo/NuGetForUnity) をインストールします。
* NuGetForUnity は [Releases](https://github.com/GlitchEnzo/NuGetForUnity/releases) にある `.unitypackage` ファイルをダウンロードし、実行してインストールします。
* NuGetForUnity がインストール出来たら、Unity のメニューに「NuGet」が追加されるので、`NuGet > Manage NuGet Packages`を選択します。
* NuGetForUnity のウィンドウが開くので、検索窓に `SharpHook` と入力して検索し、表示される `SharpHook` と `SharpHook.Reactive` をインストールします。

## 実装
* 以下のスクリプトを作成し、シーン中の任意のオブジェクトにアタッチします。
```cs
using UnityEngine;
using SharpHook;
using SharpHook.Native;

public class GlobalKeyListener : MonoBehaviour
{
    private IGlobalHook hook;

    void Start()
    {
        // グローバルキーフックの作成
        hook = new SimpleGlobalHook();

        // キー押下イベントに関数を登録
        hook.KeyPressed += OnKeyPressed;

        // フックの開始
        hook.RunAsync();
    }

    private void OnKeyPressed(object sender, KeyboardHookEventArgs e)
    {
        Debug.Log($"キーが押されました: {e.Data.KeyCode}");

        // 特定のキー（ここではiキー）の検出
        if (e.Data.KeyCode == KeyCode.VcI)
        {
            Debug.Log("iキーが押されました！");
            OnIPressed();
        }
    }

    private void OnIPressed()
    {
        // iキーが押されたときに実行する処理
        Debug.Log("iキーの処理を実行します。");
    }

    private void OnDestroy()
    {
        // アプリ終了時にフックを解除
        if (hook != null)
        {
            hook.Dispose();
            hook = null;
        }
    }
}
```

## 動作確認
* シーンを再生すると UnityEditor が非アクティブな状態でもキーボード入力イベントを受け取って、ログが表示されることが確認できます。

## 注意
* `OnKeyPressed` はメインスレッドではなくサブのスレッドで動作します。
* Unity ではメインスレッド以外で Unity のオブジェクトを操作すると処理が停止するなど正常に動作しません。
* 今回はログを出すだけなので問題ないですが、もっと複雑な処理をしたい場合は、`OnKeyPressed` の中では Action の Queuing だけして、メインスレッドの Update でそれを消化する、などの実装が必要になります。

# デスクトップでウィンドウを透過させる
* Bongo Cat ではウィンドウのフレームや背景を透過させることで、猫がタスクバー上に乗っているような表現をしています。
* これは [UniWindowController](https://github.com/kirurobo/UniWindowController) というライブラリを使って実現できます。

## インストール
* [Releases](https://github.com/kirurobo/UniWindowController/releases) にある `.unitypackage` ファイルをダウンロードし、実行してインストールします。

## 実装
* Assets/Kirurobo/UniWindowController/Runtime/Prefabs にある UniWindowController.prefab をシーンに追加します
* UniWindowController をインスペクターで確認します
  * Is Transparent にチェックをして背景を透過にしてフレームもなくします
  * Player Settings を適切に直します（緑のボタンでまとめて設定が変更されます）
* 左クリックからのドラッグでウィンドウを移動させられるようにするためにプレハブを追加します
  * Assets/Kirurobo/UniWindowController/Runtime/Prefabs にある DragMoveCanvas.prefab をシーンに追加します
  * これを動かすためにヒエラルキービューで `+ > UI > EventSystem` で EventSystem を追加します
* ウィンドウが透過すると何も見えなくなるので、ヒエラルキービューで `+ > 3D Object > Cube` としてキューブをシーンにおいておきます

## 動作確認
* メニューの `File > Build and Run` で実行して動作を確認します。
* デスクトップ上にウィンドウのフレームも背景もないキューブが浮いていたら成功です。
初めてローカルのソースコードをGitHubにアップロードする手順

# 初めてGitHubにアップロードする手順
たまにやると忘れてしまうので備忘録的に残しておく。


## 目次
- [前提](#前提)
- [手順](#手順)
  - [1. GitHubでリポジトリを新規作成する](#1-githubでリポジトリを新規作成する)
  - [2. ローカルで操作する](#2-ローカルで操作する)
- [まとめ](#まとめ)

## 前提
- **ローカル**にソースコードは存在している
- **GitHub上にはまだリポジトリがない**

---

## 手順

### 1. GitHubでリポジトリを新規作成する
1. GitHubにログイン
2. 画面右上の「New Repository」ボタンを押す
3. 以下を入力
   - **Repository name**：リポジトリ名を入力（例：`my-project`）
   - **Visibility**：`Public`か`Private`を選択
   - （※READMEは作成しない）
4. 「**Create repository**」をクリック

---

### 2. ローカルで操作する

ターミナルでソースコードのあるディレクトリへ移動して、以下を実行します。

```bash
# Gitリポジトリを初期化
git init

# ファイルを全てステージング
git add .

# コミット
git commit -m "first commit"

# リモートリポジトリを登録
git remote add origin https://github.com/ユーザー名/リポジトリ名.git

# mainブランチにプッシュ
git push -u origin main
```

注意：GitHub上のリポジトリは空のまま作成しておきましょう（READMEなどを作らない）。
もしリモートに何かファイルがあると、pushのときにエラーが発生するため。

### 3. まとめ
以下の5つの手順を実行することで
ローカルのソースコードをGitHubにアップロードできる。
```
git init → git add . → git commit → git remote add origin → git push
```
【Udemyの落とし穴】「見」るだけで満足していませんか？

# はじめに
煽りタイトルのようになってしまいましたが、3か月前の私に向けて書きました。

Udemyはセールの時期に1000円前後で購入でき、興味のある技術や言語などを習得できる素晴らしい動画学習サービスです。

しかし、**使い方を誤ると「動画を見た」満足感だけが得られ、「時間」を奪う非常に危険なもの**とも考えています。

現在、所属しているコミュニティでの教えを踏まえ、勉強方法を思いっきり変えてみました。
勉強方法を変えたことで、初めてUdemyで学びつつ、自分の技術を身に着けることができたと感じています。
ここで得られた私の考えを述べたいと思います。

# 以前の私のUdemy利用方法
あ、この技術や言語モダンだし、学習したらきっと価値になる、1500円で買える！買おう！
↓
購入
↓
いざ、視聴開始！動画をみながら真似して自分でも写経してみる
↓
面白い！こんなことできるんだ～と感想を抱く（ただ感じるだけで、何かに書き出すことなどはしない）
↓
チェックがついていく、ここまで見られた私すごいと謎の満足感を得る
↓
どんどん進める
↓
動画視聴完了
↓
ここからは何もせず、次の気になる動画を買ってみる

（自分で書いていて恥ずかしいですが、同じ経験をしている人は私以外にもいるはず...）

# 結果
* 何も身についてない
* この動画ってなんの動画だっけ？あ、こういう技術を学べる動画だったなで終わり
* 動画の内容を使って応用ができない、何かを作ることもできない

**→結局なにもできない状態**

# 何がいけなかったのか
## 興味のあるコンテンツに手当たり次第、手を出していた
→WEB3、fintech、フロントエンド、バックエンド、クラウドなど少しでも興味があるものを購入しては視聴していました。
**技術を限定して学ぶ**、**スモールステップで進める**ことをしていませんでした。

## 見て終わり
動画を視聴した後に、**何も振り返らず、次の動画だけ進むことだけ**を考えていました。
全て視聴した後、`見た事実とチェックマークがうまったことによる満足感だけを得ることができます`
→結果、**何も習得できていない**という状態です。

満足感は得られるので、**勉強した感覚、私は勉強をしているという気にはなれます**
ここが一番怖いところだと感じています。

# アウトプットの重要性を認識
**「これなら自分はできる」という状態までアウトプットしなかった結果、なにもできない状態が生まれていました。**
動画の内容を元に、`自分で実装してみる、超簡単な機能を作ってみる`ことをすれば、完璧じゃなくても`自分ができる感覚、成功体験を掴むこと`ができたはずです。

色々模索しているときに、アウトプットが大事という情報を知ります。
確かに、私はインプットだけしていた、アウトプットをしていなかったと気づきました。

しかし、この時点では`ぶっちゃけUdemyなんて見ることしかできない、具体的にアウトプットってどうやるの？無理では？`とも思っていました。

# 実際に試したアウトプット方法
## 動画を見た後に、何を見たのか・何を学んだのか白紙にできるだけ書き出す
こちらの書籍を参考に、アクティブリコールというものを実践しました。

https://www.amazon.co.jp/%E7%A7%91%E5%AD%A6%E7%9A%84%E6%A0%B9%E6%8B%A0%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E6%9C%80%E9%AB%98%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95-%E5%AE%89%E5%B7%9D-%E5%BA%B7%E4%BB%8B/dp/4046067233/ref=sr_1_1?sr=8-1

1セクション視聴後、`今私は何を見た？ 動画の内容はどんなものだった？どんなことを学んだ？`を考えながら、
思い出せるだけノートに書き起こしました。

 例えば、TypeScriptの概論について動画を視聴後、全部で5つの特徴言っていたな、なんだっけ…頑張って思い出せ、書いてみよう…
→どうしても思い出せなかった箇所があったら見返す

次の日に、昨日見た動画について上記をもう一度行いました。

## ハンズオンの場合は、コードを書いて再現してみることを行う
ハンズオンの場合は、動画を見た後、何も見ない状態でコードを書いて再現してみることを実践しました。

そうすることで、`まず何をしていたっけ、ここにフォルダ作ってファイル作ってたな`、`次は○○メソッドを作っていたな`、など、実装を進める際にはどのような手順で進めればいいか考え方を身に着けることができました。

# 実践して感じた変化
## 問題解決するための「選択肢」「引き出し」を増やす感覚を得た
### 暗記ではない、結局は忘れてしまう
実践を進めていて、これは`暗記では？`と感じていました。`ただ見てた時と何か変わっただろうか？`とも思いました。

**やり方を変えても忘れますが、忘れ方が変わりました。**


以前は動画の各セクションのタイトルを見たときに、このセクションでは何を行っていたか？、タイトルの意味がわからない、思い出せないという状態でした。

現在は動画の各セクションタイトルを見たときに、ここでこんなことをやっていたなあ、○○○の方法は確かこんな感じで実現できるんだよなあとぼんやりと学習内容が思い出せるようになりました。

結局、忘れてはしまうのですが、`課題・問題にぶつかったときはここを見返せば、解決できる`、`課題解決のための選択肢を増やせたこと`が明らかに変わったと感じています。

**知識の引き出し、選択肢を増やせたことが自分の中での大きな変化**となりました。


# おわりに
## 学ぶ意欲がある人こそ、勉強方法について再度考えてみてほしい
毎日何かしら勉強をしている方は、沢山いらっしゃると思います。
勉強の方向性を間違えると、私のように時間を費やしているにも関わらず、結果にならない悲しい末路を迎えると感じています。

アウトプット学習を行ってみて、劇的に変わったわけではないですが、少しずつ自分で課題解決できる機会が増えたり、プロダクトを作ることができたりするようになってきました。

同じように悩んでいる方の一助になれば幸いです。
VRChatでスマホを使ってフルトラになる方法

## slimeVRのインストール
[slime  VR](<https://github.com/SlimeVR/SlimeVR-Installer/releases/latest/download/slimevr_web_installer.exe>)
SteamVRを起動、steamVRの設定画面に行き、スタートアップ→アドホンの管理にslimeVRが入ってればOK
## スマートフォンのアプリのインストール
[owoTrack](<https://play.google.com/store/apps/details?id=org.ovrgyrotrackersync&hl=en>):Android
[owoTrack](<https://apps.apple.com/jp/app/owotrack/id1563711037>):IOS
## slimeVRのセッティング
下の画像のように自動でトラッカーを決めるのを外して、自分が動かす部位にチェック
おすすめは、kneeにチェックを外す(理由：精度の問題)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788219/e0927e21-e105-43c9-8b63-1c3a80cde367.png)
## slimeVRのセッティング2
VRChatでフルトラができるように、下記の画像にあるVRChat OSCトラッカーを有効
トラッカーのチェックに関しては、自分が動かしたい部位にチェック
おすすめは、膝にチェックを外す(理由：精度の問題)
![image２２２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788219/178b1731-dbe8-4e34-840a-53cafac8e519.png)
## owoTrackOverlayインストール
[リンク](<https://mega.nz/file/rQ5inKyZ#jdKOLWbBzjMd02jONfn5n7L-hSHPFBiMN3y9sRbKozc>)からダウンロードしたファイルを解凍し、Cドライブ直下に置く。（2バイト文字がなければどこでもよい）
[batファイル](<https://note.com/api/v2/attachments/download/433ab4aa1d34c87a183fc8ac64bf281f>)をダウンロードして、管理者権限で実行する。
## PCのIPアドレス
スマートフォンをトラッカーにするのには、PCとUDP通信するのでPCのローカルiPアドレスを調べる　
1.windowsキーを押してcmdと入力
2.コマンドプロンプト上でipconfigと打ち込みEnter
3. IPv4 アドレス.  .   .  .192.168~と出てるとこがPCのiPアドレス
IPは覚えとく
※人によってそのIP変わるので、スマホフルトラするときは毎回調べてね
## SlimeVRとスマートフォンの接続
androidまたはiPhoneでowo trackを開く
下のConnectをタッチ、そしたら先ほど確認したPCのiPアドレスを上の192.168~入力
入力ができたらConnectをタッチしslimeVRと接続
これでスマホ側はPCと接続できる
※トラッカーの位置の設定は各自で行ってください
## VRChatでの設定
VRChatの設定のトラッキングとIKの欄のOSC経由で頭部と手首のとトラッキングデータの送信を許可 をオンにする
![16d668a59cf565c99144f53d2e5eb545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788219/068d7945-570a-45d5-9f01-25b97f96ccb0.png)
【新技術の取り込みに挑戦】学習記録アプリをリニューアルしました

# はじめに
以前作成した学習記録アプリを、リニューアルすることに挑戦しました。
初めてJavaScriptからTypeScriptに変更したり、ChakraUIやreact-hook-formの導入を行ったりした過程で、学んだこと・気づいたことをまとめてみました。

# :blue_book: リニューアルした学習記録アプリ

https://new-study-record.web.app/

![つくった (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/996f50f2-5939-4251-90bb-71c97b29a985.gif)

リニューアル前との違いは以下になります。
* ChakraUIを使って、デザインを導入
* react-hook-formを使って、フォームにバリデーションを導入
* TypeScriptを使用して、型安全なアプリケーションに変更

# 今回使用した技術スタック
* VIte + React + TypeScript　←new!!
* ChakraUI　←new!!!
* supabase
* react-hook-form　←new!!!
* jest + react-testing-library

# :writing_hand: 作成する過程で学んだこと、気づき
## :book: 公式ドキュメントを読むことの大切さを改めて実感
### クイックスタートと実装例はよくできている

CI/CDに入門した際、**公式ドキュメントを読むことは大切だ**ということを実感していました。

今回、登録フォームのバリデーションを作る際に、`react-hook-form`を導入し、改めて公式ドキュメントを参照することの大切さを学びました。

その時の奮闘は↓にまとめています。

https://qiita.com/asa129/items/d5f63656750ac9ff6e7a

### ドキュメントを元に、自分のプロダクトに取り込めるようになった
以下の手順を繰り返し行ったことで、**自分のプロダクトに取り込むという感覚**が掴めたと感じています。

1. 公式ドキュメントのQuickStartを読む
2. ドキュメントに記載の例を読む
3. ドキュメントの内容を理解する、わからないワードが出たら調べる
4. 試してみる
5. 自分のプロダクトに取り込んでみる
6. エラーがでたらCopilotに聞く、公式ドキュメント内の情報を調べる

公式ドキュメントは開発者のために手順を明記してくれていること実感しました。

最初は、`英語で書かれている、見慣れないコードやワードが多くて難しそう`と感じましたが、`まずはクイックスタートだけでも行ってみると、意外と難しくないかも`という感覚を得られたことにも気づきました。


# :runner: 急がば回れ、時間をかけて理解することの大切さを実感
わからないことをそのままにしないことを意識して開発を進めました。

そこで感じたのは、`時間をかけて(＝自分が納得いくまで、説明ができる状態まで)理解したこと`に対しては、
**スムーズに思い出せる、手が動かせるようになる**ことです。

TypeScriptに入門した際、講義動画で何気なく`Partial`という用語が出てきました。
その時に`ドキュメントを読んで使い方を理解`→`実際にソースを書いてみる`→`自分のプロダクトに取り込む`までを行い、学んだことを記事にしました。

その時の記事は↓になります。

https://qiita.com/asa129/items/3bf0bb7b8574739ad528

その結果、Partialは`ここで使おう`、`使いどころはここだな`とわかるようになりました。

JestのMockについて学んだ際は、どのように使うのか、Mockとは何かを`自分なりに理解`、`まとめて言語化した`ことにより理解が進んだと感じています。

https://qiita.com/asa129/items/6e26469d8b6becb61a5f


テストコードを作る際に、`疑問点はAIや有識者に聞く`→`どのように解決するかを理解`→`自分で再現できるまで落とし込む`ことを実践しました。
具体的には、Qiitaに記事を書く、何も見ない状態で再現してみる、Copilotの自動補完を使わず書いてみるなどを行ってみました。

その結果、テストの方針を考えた後、実現したいことをすらすら書けるようになりました。

また、テストが通らなかった場合は、ここが原因で、ここを改善すれば解消するかもという検討がつくようになりました。
エラーの解消までの時間が格段に短くなったと感じています。

**一度しっかり理解すれば、その後は短い時間で解決できる**ことが自分の中で大きな学びとなりました。

現状はこれ以上理解できない、わからないことは一旦そのままにしておくことも肝心だと思いますが、自分の中で説明できるまで概念を理解することも大切だということを実感しました。

# おわりに
ドキュメントを見つつ、CSSフレームワークの導入や、フォームバリデーションの導入ができるようになりました。
3か月前の私が見たら卒倒しそうです。
0→1で自分の作りたいものを作れることを目指して、今後も学習を進めていきます。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
flashforge Inventor2の精度について

# 結論
1.M10のナットとボルトを制作できたが、少しがたつく（(遊びをナット側にもボルト側にも0.2mm入れたためだと考えられる。)。
2.ボルトにナットが入っていくとき、最初に少し突っかかりを感じる。

3.歯車は突っかかりがなく回転できる

(※著者は工業の専門知識を有しているわけではないので、大体こんなもんだなーという感じでお願いします。）


### ボルトとナットについて詳しく　



<img width="300px" alt="ボルトナット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907367/e540e21e-d127-4a7b-a2f9-dd2ec0313932.png">

これがFusion360で作成したボルトとナットです。ボルトはM10、ネジのギザギザ部分については、Fusion360の標準のアドオンについているものから、0.2mmプレスで谷を深くしたものです。
ナットも同様でM10を標準のアドオンで、谷を深くしてあります。

プリント後すぐは、ナットが入っていくときに入れづらさがあります。これは、3Dプリンターがフィラメントを重ねて形成していく性質上、仕方がないことですが歯の入りは雑になってしまい少し力を入れてネジの歯に食い込ませるようにします。ですが、何回も行き戻りを繰り返しているとなめらかになっていきます。ボルトの道中ですが、全く問題ありません。滑らかに何の突っかかりもなく回っていきます。個人的にこの3Dプリンターでネジを印刷することはかなり難しいだろうと思っていましたが、全然大丈夫でした。しかし、ネジの大きさでM10以外を試していないので検証の余地があります。


### 歯車について詳しく
歯車もFusionのアドオンを使用して作成しました。細かい設定をせずともちゃんと噛み合ってくれる歯車をすぐに生成できるのは素晴らしいと思います。

こちらが歯車の写真になります。

<img width="300px" alt="歯車" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907367/0a597c8d-d06e-4490-9070-9463515fac02.png">

プリント後に噛み合っているか確認できるように台座も一緒に作りました。
印刷した結果ですが、問題なく回転しました。

しかし高速回転も対応できるかどうかは、モーターなどと組み合わせないといけないためまだ検証できていません。この先歯車を用いた展示物を作ることになった際に細かく触れたいと思います。
誕生日攻撃: n 種類の値を出力するハッシュ関数の衝突までの試行回数の期待値は約 sqrt(π/2) sqrt(n)

# 背景

「性質のよいハッシュ関数が $n$ 個の値を出力しえる場合、同じハッシュ値を取る $2$ つの値の組を発見する（衝突する）までの出力試行回数の期待値を求めよ」という問題を考えます。

IT用語辞典 e-Words には、以下のように記載されていますが、$1.25$ ってどこから来たねんという疑問があります。

https://e-words.jp/w/誕生日攻撃.html
```text
あるハッシュ関数がH個の値を出力し得る場合、
平均で約1.25√Hの試行回数で同じハッシュ値を取る
2つの値の組を発見できることが知られている。
```

# 証明（ラマヌジャン降臨）

良いハッシュ関数が $n$ 種類の値を出力するとします。衝突が発生するまでの試行回数を表す確率変数 $X$ を考え、その期待値 $E[X]$ は、

```math
\begin{align*}
E[X] &= \sum_{j=0}^{\infty} j \cdot P(X=j) \\
&= \sum_{k=0}^{\infty} P(X > k) \\
&= \sum_{k=0}^{n} \left( \frac{n}{n} \times \frac{n-1}{n} \times \frac{n-2}{n} \times \cdots \times \frac{n-k+1}{n} \right) \\
&= \sum_{k=0}^{n} \frac{n!}{ (n-k)! n^k } \\
&= 1 + \sum_{k=1}^{n} \frac{n!}{ (n-k)! n^k } \\
&= 1+Q(n) \\
&\sim 1 + \left( \sqrt{\frac{\pi n}{2}} - \frac{1}{3} + \frac{1}{12} \sqrt{\frac{\pi}{2n}} - \frac{4}{135 n} + \dots \right) \\
&= \sqrt{\frac{\pi n}{2}} + \frac{2}{3} + \frac{1}{12} \sqrt{\frac{\pi}{2n}} - \frac{4}{135 n} + \dots
\end{align*}
```

ここで $Q(n)$ はラマヌジャンのQ関数です。$n$ が大きい場合、期待値 $E[X]$ は $\displaystyle \sqrt{\frac{\pi n}{2}} \approx 1.253 \sqrt{n}$ に近い値をとります。

# 補遺
### ラマヌジャンのQ関数
$$Q(n) = \sum_{k=1}^{n} \frac{n!}{ (n-k)! n^k }$$$n$ が大きいとき、次の漸近展開を持つことが知られています。$$Q(n) \sim \sqrt{\frac{\pi n}{2}} - \frac{1}{3} + \frac{1}{12} \sqrt{\frac{\pi}{2n}} - \frac{4}{135 n} + \dots$$

上記の漸近展開は、[On Ramanujan's Q-function](https://www.researchgate.net/publication/278628001_On_Ramanujan's_Q-function) に高等な証明が乗っています。


### 本問題の証明について

- この証明方法は、[Wikipedia](https://en.wikipedia.org/wiki/Birthday_problem#cite_note-knuth73-24) によると、Knuth, D. E. (1973). The Art of Computer Programming. Vol. 3, Sorting and Searching. に記載されていると言及されています。Vol. 3 を僕は持っておらず、第何版の何ページにどれくらいの厳密さで証明が乗っているのか、持っている人がいたら教えてほしいです。

- [Stack Exchange]((https://math.stackexchange.com/a/4854914)) に高度な初等的な証明が載っています。

### 類似問題

「何人集まれば、同じ誕生日のペアがいる確率が $p$ を超えるか？」という問題の答えは、誕生日の種類数 $n$ が大きいとき約 $\sqrt{2 \ln (1/(1-p))} \sqrt{n}$ 人と近似されます。例えば $p=0.5$ の場合は約 $1.1774 \sqrt{n}$ となります。日本語での説明は[こちら](https://tex2e.github.io/blog/crypto/birthday-attack)。
SwiftUIでSafariを表示させる

# はじめに
今回はSwiftUIを使ってSafariを表示するための画面を実装していきます
### コード
実装は下記になります
呼び出す側は`SsafariView(URL)`のようにすればどの画面でも表示することができます
```swift
import SwiftUI
import SafariServices

struct SafariView: UIViewControllerRepresentable {
    let url: URL

    func makeUIViewController(context: Context) -> SFSafariViewController {
        let safariVC = SFSafariViewController(url: url)
        safariVC.preferredControlTintColor = .blue
        safariVC.dismissButtonStyle = .close
        return safariVC
    }

    func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) { }
}
```
### さいごに
JetpackComposeではComponentがでましたが、Swiftは自前なので今回は記事を書いてみました
IOSは公式からくるんですかね