OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】Matplotlibでグラフの配色などを表示スタイルで変える場合について

matplotlib.pyplotとは別に、matplotlib.styleをimportする必要がある。



表示スタイルを変更する場合は、「import matplotlib.style」でmatplotlib.styleモジュールをインポートする必要があります。



使用できる表示スタイルは「matplotlib.style.available」で確認できる。



matplotlib.style.available
▶︎
['Solarize_Light2',
 '_classic_test_patch',
 'bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark',
 'seaborn-dark-palette',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'tableau-colorblind10']



表示スタイルを変更する場合は「matplotlib.style.use('スタイル名')」と記述する。



本アプリは「fivethirtyeight」の表示スタイルを採用しており、「matplotlib.style.use('fivethirtyeight')」を実行して、Notebook全体に反映させました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/206fb75d-f8e1-489a-add0-a5c315629810.png)




例えば「ggplot」を指定すると、次のような配色になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/d3e0e92e-be0f-4b98-b787-849bd4959348.png)








Jypyter Notebookで「matplotlib.style.use('スタイル名')」を実行すると、Notebook全体に反映するため、セル毎に指定する必要はありません。

なお、特定のセルだけ一時的に表示スタイルを変更したい場合は、セルの中で次のようにコンテキストマネージャーを利用して記述します。


with plt.style.context('seaborn-deep'):
    plt.plot([3, 1],[1, 3], [4, 2], [2, 4])

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/debebc3a-645c-4559-aded-ff48b7fc6e6c.png)




with文で表示スタイルを「seaborn-deep」に指定し、with文の中でplot関数を実行することで、このセルだけ「seaborn-deep」が採用されます。
【Python】Matplotlibに関して

Matplotlibには「MATLABスタイル」と「オブジェクト指向スタイル」の2つの記述方法があります。

◾️ MATLABスタイル

import matplotlib.pyplot as plt
plt.plot(x, y)
plt.title('test')


関数で記述する方法です。

モジュール名「plt」に続けて、「plot（折れ線グラフ描画）」などの関数を記述します。オブジェクト指向スタイルと比べて、簡潔に記述できます。


◾️ オブジェクト指向スタイル

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('test')


メソッドで記述する方法です。

「fig, ax = plt.subplots()」でインスタンス化して、オブジェクトの「ax」に続けて「plot」などのメソッドを記述します。

「fig」が外枠の領域、「ax」が中枠の領域で、枠を別けるためMATLABスタイルより柔軟に設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/4d367b5e-857d-4ea1-8759-1a0f77b92c79.png)




plot（折れ線グラフ描画）やbar（棒グラフ描画）など、基本のメソッドはMATLABスタイルと同じ名称です。MATLABスタイルのtitle関数やxlabel関数など、一部は名称が区別されています。オブジェクト指向スタイルは先頭に「set_」が付き、set_titleメソッドやset_xlabelメソッドとなります。



Jupyter Notebookで「%matplotlib inline」を実行していれば、「plt.show()」を記述していなくてもグラフが描画されます。


savefigでファイルに出力できます。

◾️ MATLABスタイル

plt.plot(x, y)
plt.savefig('sample.jpeg')


◾️ オブジェクト指向スタイル

fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('sample.png')


ファイル形式はファイル名の拡張子で指定します。



「MATLABスタイル」と「オブジェクト指向スタイル」の「スタイル」は、関数とメソッドの記述スタイルの違いです。「matplotlib.style.use('ggplot')」の「style」は、グラフの配色などを指定するスタイルです。
FlutterでiOS Simulatorが起動しない

# はじめに

こんにちは、ユーゴです。
今回は、FlutterでiOS Simulatorを起動しようとした時に、エラーで詰まったので紹介します。

# 問題

以下のようなエラーが出て、Flutter上でiOS Simulatorが開けない。

```
Failed to launch iOS Simulator: Error: Emulator didn't connect within 60 seconds
```

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/4b8f3890-c86f-436c-9455-3b11169b3450.png)

# 原因

XCode側で、シミュレータの作成を忘れていました。

↓シミュレータがない

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/5893210e-e7c1-4e10-a08d-fa683aa9a8d7.png)

# 解決策

(0) XCodeプロジェクトがない人は、適当に作りましょう。

(1) 設定 (Manage Run Destinations...) を開きます

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/992d1d5b-f73c-4701-b4f4-af2db9827808.png)

(2) +ボタンを押します

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ff671bd8-cd52-4644-ad0c-e0b918f23b26.png)

(3) 必要に応じて機種とOSを選択し、Createボタンを押します

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/56d2057f-5337-4029-a41d-9657eed77fba.png)

(4) VSCodeやSimulatorなど関係するアプリを開いている場合は、一度全て終了すると安全です。もう一度起動して確認しましょう

開けました。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ac1cd9ec-b9a9-45e9-9ec8-6787c72e5452.png)

# まとめ

いかがだったでしょうか。今回は、割と初歩的なミスで詰まったものでしたが、ネットで調べたりChatGPTに聞いたりしても「キャッシュが問題」というような解説だけだったので、私はすぐに解決できませんでした。

このように、FlutterとXCode周りの解説から、Unity, AWS, GAS, 量子コンピューティングなど、縦横幅広く技術について紹介しております。

お役に立てましたら、いいね・フォローなどよろしくお願いします！
Ruby on Rails | Apple SiliconでVagrantを使うときにハマったエラーと解決メモ

# はじめに
現在、**独習Ruby on Rails**で勉強しており、MacBook Air M1 で Vagrant + VirtualBox を使おうとして盛大にハマったので、エラー→原因→解決までのトライ＆エラーを備忘録としてまとめます。環境依存の落とし穴が多いので、同じ症状で詰まっている人の参考になれば嬉しいです。

# 目次

1.	背景とゴール
2.	検証環境
3.	エラー① NS_ERROR_FAILURE (0x80004005)
4.	エラー② Box 404（generic/ubuntu2204-arm64）
5.	エラー③ SSH Connection reset / disconnect
6.	最終的な解決策と Vagrantfile
7.	まとめ
8.	参考リンク

---


# 1. 背景とゴール
•	Apple Silicon（arm64）上で Ubuntu 22.04 LTS の開発用 VM を立てたい。
•	なるべく 無料 で完結したいので、VirtualBox + Vagrant が第一候補。
•	最終的に高速・安定に動く環境が作れれば OK。

---

# 2. 検証環境

項目	バージョン
macOS	Sonoma 14.5
チップ	Apple M1
Vagrant	2.4.1
VirtualBox	7.0.18
Homebrew QEMU	10.0.2

# 3. エラー① NS_ERROR_FAILURE (0x80004005)

```bash
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/xenial64'...
...
VBoxManage: error: The VM session was aborted
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005)
```
原因
	•	VirtualBox は Apple Silicon で ARM64 ゲストを正式サポートしていない。
	•	公式 ubuntu/xenial64 など x86_64 Box は起動時にクラッシュする。

対応案 (却下)
	•	Parallels / VMware に乗り換える → 有償ライセンス必須。
	•	QEMU プラグイン に切り替える → 無料 & ARM ネイティブで動作  ← 今回採用。

---

# 4. エラー② Box 404（generic/ubuntu2204-arm64）
```bash
$ vagrant up --provider=qemu
Box 'generic/ubuntu2204-arm64' could not be found (... Error 404)
```

原因
	•	generic/ubuntu2204-arm64 は libvirt/qemu プロバイダ用メタデータが無いか、公開停止中。

解決
	•	代替 Box として perk/ubuntu-2204-arm64 を使用。

```bash
$ vagrant init perk/ubuntu-2204-arm64
$ vagrant up --provider=qemu
```

# 5. エラー③ SSH Connection reset / disconnect

```bash
Waiting for machine to boot...
SSH address: 127.0.0.1:50022
Warning: Connection reset. Retrying...
```

原因
	•	初回ブートで cloud-init が数分かかる → SSH ポートが開く前にタイムアウト。

解決手順
1.	ブートタイムアウトを延長：

    ```bash
    config.vm.boot_timeout = 600  # 10 分待つ
    ```

2.	QEMU 高速化＆リソース増量：
    ```bash
    config.vm.provider :qemu do |q|
      q.memory = 4096
      q.cpus   = 4
      q.accel  = "hvf"   # Apple Hypervisor Framework
    end
    ```

3.	vagrant up --provider=qemu を再実行 → Machine booted and ready!

---

# 6. 最終的な Vagrantfile

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "perk/ubuntu-2204-arm64"
  config.vm.boot_timeout = 600

  # 共有フォルダ (9p)
  config.vm.synced_folder ".", "/home/vagrant/workspace", type: "9p"

  # QEMU 設定
  config.vm.provider :qemu do |q|
    q.memory = 4096
    q.cpus   = 4
    q.accel  = "hvf"   # Apple Silicon なら必ず入れる
  end
end
```

---


# 7. まとめ

エラー	原因	解決
NS_ERROR_FAILURE	VirtualBox が ARM64 非対応	QEMU プラグインに乗換え
Box 404	Box メタデータ不足	perk/ubuntu-2204-arm64 など別 Box を使用
SSH タイムアウト	cloud-init が遅い	boot_timeout 延長 + hvf で高速化

Apple Silicon で無料ツールだけを使いたい場合、QEMU + ARM64 Box が最短ルートでした。共有フォルダは 9P、ポート転送は provider オプションで手動指定など、VirtualBox と比べて設定がやや多いものの、動き出してしまえば快適です。

---


# 8. 参考リンク
•	vagrant-qemu – GitHub
•	perk/ubuntu-2204-arm64 – Vagrant Cloud
•	公式ドキュメント: Using Vagrant with QEMU
「プロンプトからプロダクトへ」– AIアプリ開発の全工程 | [第1回]: AI製品開発のマインドセット





## 1. はじめに：ChatGPT時代のエンジニアリングに求められる視点

AIの民主化が進む中、「プロンプトを工夫すれば、誰でもAIアプリを作れる」と考える人も増えてきました。しかし、**実際の業務やプロダクト開発では、"良いプロンプト" だけでは不十分**です。

本記事では、AIを活用したアプリケーションを開発するうえで必要となる**マインドセット・技術スタック・設計観点**を、現場の経験を交えながら体系的に紹介します。

> 🎯 対象読者：
>
> * 業務でAI導入を検討しているエンジニア
> * AIに興味を持つ若手フルスタック開発者
> * プロンプトだけでなく、実装から運用までやってみたい方

---

## 2. AIアプリ開発とは何か？：技術構成の全体像

AIアプリは、ざっくり言えば以下の3層構造に分かれます。

### 📦 ① インタフェース層（Frontend / Chat UI）

* React.js + Tailwind CSSなどで構築
* ユーザー入力を自然に誘導する設計が重要

### 🧠 ② 推論層（LLM / モデル呼び出し）

* OpenAI API, Claude, Mistralなどの大規模言語モデル
* プロンプト設計、チェイン構造（LangChainなど）

### 🛠️ ③ ロジック・オーケストレーション層（Backend）

* FastAPI, Node.js, Flaskなど
* ユーザーデータ・履歴管理、ベクトル検索（FAISS / Weaviate）などを担当

> 💡 プロンプトだけでは「使えるアプリ」にならない。その背景には、この3層の整合性が必要。

---

## 3. 実践例：FastAPI + OpenAI APIで簡単なAIアプリを作る

ここでは、ユーザーからの問い合わせを受けて回答を生成するシンプルなQ\&Aアプリを例に説明します。

### 📁 プロジェクト構成（例）

```
my-ai-app/
├── app/
│   ├── main.py
│   └── services.py
├── requirements.txt
└── .env
```

### 📌 main.py

```python
from fastapi import FastAPI, Request
from services import call_openai

app = FastAPI()

@app.post("/chat")
async def chat_endpoint(req: Request):
    data = await req.json()
    user_input = data["message"]
    response = call_openai(user_input)
    return {"response": response}
```

### 📌 services.py

```python
import openai
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

def call_openai(prompt):
    completion = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}]
    )
    return completion.choices[0].message["content"]
```

### 📌 実行方法

```bash
uvicorn app.main:app --reload
```

### 📌 curlで試す

```bash
curl -X POST http://localhost:8000/chat -H "Content-Type: application/json" -d '{"message":"日本の首相は誰？"}'
```

---

## 4. よくある失敗と現場Tips

### ❌ プロンプトが固定すぎる

* → 特定パターンしか回答できない
* ✅ 「システムプロンプト」+「ユーザー入力」+「履歴」の構造にする

### ❌ ユーザーデータが保存されない

* → 同じ質問が繰り返される
* ✅ RedisやSQLiteなどを使って簡易セッション管理を入れる

### ❌ APIキーの直書き

* → セキュリティ的にNG
* ✅ `.env` + `dotenv`で安全に管理

---

## 5. 応用編：LangChain・ベクトル検索との連携

* **LangChain** を使えば、複数のステップをチェーン化して複雑な処理が可能
* **ベクトル検索**（例：FAISS, Weaviate）を使うことで社内ドキュメント検索Botなどの構築も可能

```python
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
```

> 📚 RAG（Retrieval Augmented Generation）によって、"社内特化型GPT" を構築可能に。

---

## 6. まとめ：プロンプトは入り口、プロダクトは出口

| 観点    | 内容                            |
| ----- | ----------------------------- |
| 🎯 強み | 実装速度の速さ、アイデアのプロトタイプ化          |
| ⚠️ 弱み | 運用視点・セキュリティ対策を忘れやすい           |
| 🔮 今後 | OSSエージェントフレームワークやマルチモーダル統合の進展 |

AIアプリ開発は「プロンプトを書く」だけでなく、「**エンジニアとしての全体設計力**」が求められます。だからこそ、今の時代に求められるのは、**プロンプト + コード + UX + データ設計**のハイブリッドスキル。

ぜひ本記事を参考に、手元のアイデアをプロダクトへと育ててみてください。



**👉 質問・フィードバック大歓迎です！コメント欄でぜひご意見を聞かせてください！**
未熟でもコードレビューをするべき3つの理由

## はじめに
私のエンジニアとしての経験はもうすぐ満2年。
まだまだ経験が浅い立場ではありますが、これまでに何度か他の方のコードレビューを任される機会がありました。
最初は「自分がレビューなんてしていいのか？」と不安に感じることもありましたが、実際に関わってみると、想像以上に多くの学びと気づきが得られました。
ここでは、私のようにまだ経験の浅いエンジニアがコードレビューに積極的に関わることのメリットについて、実体験に基づいてご紹介します。

## 読みやすいコードを客観的に考える力がつく

自分でコードを書いていると、「後で直せばいいや」「まあ、時間かければ分かるし」と思って妥協した書き方をしてしまうことがあります。
でも、他人のコードを見ると「どのように書けば読みやすいか？」を冷静に考えることができます。

たとえば、

* 「この変数名、何を意味しているかわかりにくいな」
* 「この処理はメソッドとして切り出したほうが明快かもしれない」

といった点に気が付くことが増えます。結果として、自身のコード改善にもつながります。

また、ビジネス要件の制約や緊急対応、他システムとの兼ね合いなどから、少し複雑な構成になっているコードもよく見かけます。
そういう時に、コメントで意図を補足する重要性も実感しました。

## 構文や処理の選び方に気づきを得られる

他人のコードを見ることで、「こういう書き方もあるのか」といった新しい発見があります。
特に、自分よりも経験豊富なエンジニアの書いたコードには学びが多く、書き方やライブラリの使い方がとても参考になります。


また、

* 「このメソッド、nullやundefinedが来たときってどうなるんだろう？」
* 「この処理、計算量が多くないか？（O(n²)など）」

といった疑問が自然と湧き、自分でも調べる習慣がつきます。
特に、「自分だったらこの場面でどう書くか？」と考えて比較することで、処理の妥当性や選択肢の幅が広がります。


## 伝える力と実運用の視点が育つ

コードレビューでコメントを書く際には、伝わりやすく丁寧な表現を心がける必要があります。
その過程で、「この指摘は本当に必要か？」「表現がきつくなっていないか？」と内省するようになりました。
また、よい実装に対しては、ポジティブなコメントも素直に伝えるようにしています。

さらに、レビューを通じて以下のような非機能的な観点も意識するようになりました：

* 「複数人が同時に使用したらどういう挙動になる？」
* 「このツールは社内向けなのにコストが高すぎないか？」

技術的な正しさだけでなく実際の運用や保守のしやすさを考えるようになり、システム全体を俯瞰することで主体者意識も上がります。


## さいごに

まだまだ実際にはうまくできないことも多く、今回書いたことも全部実践できているわけではありません。
それでも、コードレビューを通して得た気づきや考え方は、少しずつ自分の糧になっていると感じています。

最近は、同期に自分の書いた社内ツールのコードをレビューしてもらうようお願いしています。
新人同士でもコードを見合ったり、「レビューしてみましょうか」「レビューしてもらえますか」と気軽に声をかけ合える、他の人のコードに自然に触れやすい環境ができたらいいなと思っています。
【Python】pandasの平均値を出力するmeanメソッド、stdメソッド

平均値を出力するmeanメソッドを紹介します。

例えば次のデータの平均値を取得することを考えます。

df = pd.DataFrame(
     np.arange(6).reshape((3, 2)), 
     columns=['A列', 'B列'], 
     index=['1行', '2行', '3行'])
▶︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/df33a8f3-3ffd-479e-97cb-a907253d9251.png)


【列ごとに平均値を出力】
df.mean()
▶︎
A列    2.0
B列    3.0
dtype: float64

【特定の列の平均値を出力】
df.loc[:, 'A列'].mean()
▶︎ 2.0

【特定の行の平均値を出力】
df.loc['1行目', :].mean()
▶︎ 0.5


なお、pandasのstdメソッドはデフォルトで「標本標準偏差」を出力します。

標準偏差には母標準偏差と標本標準偏差があります。

【母標準偏差】
母集団から分散を算出して標準偏差を求めたものです。母集団とは元のデータそのものを指します。

分散を算出する式は以下となり、分散にルートを付けると標準偏差になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/506f93b8-c916-427b-b92f-99f7d41b3890.png)


分散を求める際、分母の「データ数」を母集団のデータ数にして算出し、その分散にルートを付けた標準偏差を「母標準偏差」と呼びます。例えば100人の試験で分散と標準偏差を求める際に、分母を100とするのが「母標準偏差」です。
 

【標本標準偏差】
母集団から標本を抽出して、その標本から分散と標準偏差を求めたものです。

標本の分散は分母のデータ数が標本のデータ数になりますが、その場合、分散が過小評価されることがあります。分散の式の分子で各データから平均を引きますが、その平均が母集団ではなく標本から算出した平均になるので、母集団との間で大きな差が発生することがあります。そのため、分母となる標本のデータ数からマイナス1をして分散を算出します。

このマイナス1した分散から求めた標準偏差が「標本標準偏差」です。例えば100人の試験から10人を標本として抽出し、その標本から分散と標準偏差を求める際に、分母を「10-1=9」とするのが「標本標準偏差」です。


pandasのstdメソッドはデフォルトで標本標準偏差を出力します。対象のデータが標本ではなく母集団だとしても、標本標準偏差が出力されます。

pandasで母標準偏差を出力する場合は、引数「ddof=0」をつけて「std(ddof=0)」とします。ddofは「Delta Degrees of Freedom」の略で自由度を表します。自由度0は分散の分母が「母集団のデータ数」、自由度-1は分散の分母が「母集団のデータ数-1」となります。

なお、NumPyのstd関数はデフォルトで母標準偏差を出力します。母標準偏差で統一したい場合、pandasは引数を付けて「std(ddof=0)」とし、NumPyは引数なしで「std()」とします。
GitHub Pages デプロイ 2 大ルートをサクッと解説 🛣️✨

GitHub Pages で **静的サイトを爆速公開** するなら、この 2 ルートを押さえれば OK！
どちらも GitHub 公式サポートなので、安心してガンガン使える 💪🎉

## 1. ブランチ方式 🚢

| 手順                       | ポイント                        |
| ------------------------ | --------------------------- |
| `gh-pages` などの公開用ブランチを作成 | ビルド済みファイルをコミットして配置する        |
| `git push` でブランチを更新      | GitHub Pages がブランチ内容をそのまま配信 |

📝 **公式ドキュメント**: [Configuring a publishing source](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) — 公開ブランチの設定方法。

## 2. アーティファクト方式（GitHub Actions）🚀

| 手順             | アクション / 役割                                                                                         |
| -------------- | -------------------------------------------------------------------------------------------------- |
| **1️⃣ ビルド**    | `npm run build` などで静的ファイルを生成                                                                       |
| **2️⃣ アップロード** | [`actions/upload-pages-artifact`](https://github.com/actions/upload-pages-artifact) で生成物をアーティファクト化 |
| **3️⃣ デプロイ**   | [`actions/deploy-pages`](https://github.com/actions/deploy-pages) でアーティファクトを GitHub Pages に公開      |

🔗 **参考**:

* [Using custom workflows with GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages) — Actions ワークフロー解説
* [GitHub Changelog 2022‑07‑27: Custom GitHub Actions Workflows (beta)](https://github.blog/changelog/2022-07-27-github-pages-custom-github-actions-workflows-beta/) — Actions から直接 Pages にデプロイ可能になった告知

### 📜 サンプルワークフロー YAML（コピペで即デプロイ！）

```yaml
name: Deploy to GitHub Pages
on:
  push:
    branches: ["main"]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build static site
        run: |
          npm ci
          npm run build
      - name: Upload Pages artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./dist

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4
```

> `upload-pages-artifact` でファイルをギュッと固め、`deploy-pages` でズドンと公開！ 🚀



### まとめ 🔮

| 方式         | オススメ場面                          |
| ---------- | ------------------------------- |
| ブランチ方式     | ビルドが必要ないページを公開する場合       |
| アーティファクト方式 | MkDocs等ビルドが必要なページを公開する場合 |

---

### 参考リンク 🔗

* [Configuring a publishing source](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site)
* [Using custom workflows with GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages)
* [GitHub Changelog 2022‑07‑27: Custom GitHub Actions Workflows (beta)](https://github.blog/changelog/2022-07-27-github-pages-custom-github-actions-workflows-beta/)
* [`actions/upload-pages-artifact`](https://github.com/actions/upload-pages-artifact)
* [`actions/deploy-pages`](https://github.com/actions/deploy-pages)
改めてリファクタリングについて考える

## はじめに
近年の AI の発展により、ソースコードの生成を AI に任せる時代が到来しています。ただし、最終的には人間の目による確認が必要です（耳にタコができるほど聞いたかもしれませんが）。

また、AI にすべてのドメイン知識を理解させるのは難しく、完璧なソースコードを生成するのは現実的ではありません。

そのため、今も昔も**リファクタリングは不可欠**です。本記事では、リファクタリングについての個人的な考えをまとめてみました。


## リファクタリングとは？
リファクタリングとは、**プログラムの動作を変えずに、ソースコードの内部構造を改善する作業**を指します。

主に以下のような目的で行われます：

- 可読性の向上
- 保守性の向上
- 開発効率・品質の向上


## リファクタリングのタイミングは？
結論から言うと、**ソースに触れるときがリファクタリングのタイミング**です。

以下に、参考文献から得た知見を抜粋して紹介します。

### 📘 『レガシーコードからの脱却』

> いつリファクタリングを行うかについての７つの戦略
> * 重要なコードがうまく保守されていない時
> * コードを理解している人がいなくなった時
> * 新しい情報によって、より良い設計が見つかったとき
> * バグを修正する時
> * 新機能を追加するとき
> * レガシーコードのドキュメントを書くとき
> * 作り直すより安い時

### 📘 『達人プログラマー』

> １年前よりも、あるいは昨日よりも、さらには１０分前よりも良い考えが浮かんだ時、つまり何かを学んだ時がリファクタリングの時です。
> コードがうまく馴染んでいないと感じたり、まとめるべき２つの事柄を見つけたりといった何か「おかしなもの」に遭遇した場合、手を入れることを躊躇してはいけません。今がその時なのです。コードをリファクタリングする際のきっかけとして、以下のようなものが考えられます。
> * 二重化
> * 直行していない設計
> * 時代遅れの知識
> * 使用方法
> * パフォーマンス
> * テストの合格

### 📘 『リファクタリング第2版 - 既存のコードを安全に改善する』

> 【三度目の法則】
> Don Roberts が教えてくれてたガイドラインがあります。最初は、単純に作業を行います。二度目に以前と似たようなことをしていると気づいた場合には、重複を意識しつつも、とにかく作業を続けて構いません。そして三度目に同じようなことをしていると気づいたならば、そこでリファクタリングをするのです。
> 野球に例えるなら、**３ストライクでリファクタリング開始**です。

他にも読んだ参考書の中で、いい内容はあったと思いますが、今回は上記だけを取り上げさせていただきました。
色々読んでみても、やはり思うこととしてはソースに触れる時こそがリファクタリングの時だと思っています。

## リファクタリングの阻害要因

### ⏰ 時間と労力の制約
価値提供を急ぐあまり、リファクタリングは後回しにされがちです。
開発メンバーとしても、お客様に早く価値を提供したいという気持ちは当たり前のことですが、リファクタリングを**後回し＝永遠にやらない**ことも多いです。

### 🔁 「既存がそうだから」と手を加えない
チーム開発では、一貫性を担保することは大切です。
でも、違和感のあるもの、こうした方が絶対いいものを落とし込めるのに他はそうだからと言う理由でリファクタリングしないのは非常に勿体無いと思います。
ただ、そうなると一貫性が欠落するため、そうなる際にチームを巻き込んで既存と既存との変更内容の違いを共有するなどの、チーム内での合意形成や共有が重要です。

### 🧪 テストがない
そもそもテストの基盤構築ができてないもよくあることだとお思いますし、追加する機能のテストファイルがないもあると思います。
そうなるとテスト基盤構築を前段に置くなどの作業工数がプラスで発生します。
その中でプログラムの動作を変えずに、ソースコードの内部構造を改善するはなかなか勇気がいることだと思います。

### 🎯 影響範囲の不確実性
一見問題ない変更が、別の箇所で不具合（デグレ）を起こす可能性があります。
安易な気持ちで修正した箇所にて、問題ないとなったとしても、実は他の箇所に影響が出ていて、デグレにつながる可能性は大いにあります。

## リファクタリング実践法
どのようにしているのかの個人的な動きについて、簡単に共有します。

### 💪 勇気を出す
動作を変えずに、内部構造を変更するため、既存ソースに触れるはなかなか怖いことですが、だとしても既存ソースをぶっ壊す気持ちを持ち続けることは大切だと思います。
テストがない場合に関しては、テスト作成も工数に入れる。入れられない時は第三者も巻き込んで動作確認を徹底的に行うです。
勇気を出したからには心理的安心も確保できるようにしなければなりません。
**安心の裏付けが「勇気」には必要**です。

### 💸 技術的負債は常に生まれるものと認識する
リファクタリングを実施したソースコードも負債だと思っています。
要は、最善を尽くしても、いずれそれは負債になります。
自分やベテランエンジニアが作成したから完璧だと思い込まずに、どんな人間でも負債を作るものと思い込むことが重要ではないかなと思っています。
**どのようなのコードも、未来から見れば“過去の負債”になりうる**という認識が大切です。

### 👀 ソースを徹底的に読む
修正箇所だけのソースだけにとどまらず、**その周辺の構造、設計、処理の流れ**を理解することが重要です。
そうすると、「あれ？何この実装？」って箇所は絶対見つかります。
ただ、特殊な実装やパワーコードにも何かしらの理由があってそのように作られています。
そういった時、「何これ？www やばwww」と思ってスルーするのではなく、目の前にあるソースと徹底的に向き合うようにします。（「何これ？www やばwww」って思う人も、「何これ？www やばwww」のソースを作っています）
しっかり理解や把握をしていくと、このロジックはここにあった方が可読性上がるなや、保守性が高まるな、この前学んだテクニック使えそうなどができると思っています。


## おわりに
ある程度の開発経験を積んだからこそ感じる、リファクタリングの大切さをまとめてみました。

これから開発を始める方や、数年経験を積んだエンジニアの方にも、少しでも参考になれば嬉しいです。
メモ


# PythonでCSV文字列をモデルにマッピングする方法

## ✅ 例：CSV文字列 → モデル（クラス）インスタンスのリスト

### 1. サンプルCSV文字列

```python
csv_data = """id,name,age
1,Alice,30
2,Bob,25
3,Charlie,35"""
```

### 2. モデル定義

```python
from dataclasses import dataclass

@dataclass
class Person:
    id: int
    name: str
    age: int
```

### 3. CSV読み込み → モデルへ変換

```python
import csv
import io

# CSVをパース
reader = csv.DictReader(io.StringIO(csv_data))

# モデルのリストへ変換
people = [Person(int(row["id"]), row["name"], int(row["age"])) for row in reader]

# 確認
for person in people:
    print(person)
```

### ✅ 出力

```
Person(id=1, name='Alice', age=30)
Person(id=2, name='Bob', age=25)
Person(id=3, name='Charlie', age=35)
```

## 🔁 応用

- `pydantic` を使えばバリデーション付きのモデルマッピングも可能。
- `pandas` を使えばDataFrame経由で変換も可能（ただしクラスとの連携には一手間必要）。
- `typing.get_type_hints` を使って動的にクラスにマッピングするような汎用関数も作成可能。

## 💡 備考

- カラム名がクラスのフィールド名と異なる場合は手動マッピングが必要。
MacでHomebrewを使ったDockerのアップデート方法

# はじめに
MacでDockerを使用している際、Homebrewでインストールした場合のアップデート方法について説明します。
特に、`--cask`オプションを使ってインストールしたアプリケーションのアップデート時によく発生する問題と解決方法を紹介します。

先日、Qiitaで人気の無さそうな内容の記事を公開しましたので見ていただけると幸いです。

https://qiita.com/wooooo/items/24760a77b54d43ca8231

# 問題の発生
Docker Desktopを開いた際、アップデートの通知が表示されることがあります。
この時、通常のbrewコマンドでアップデートしようとすると、エラーが発生することがあります。

```bash
brew upgrade docker
```

このコマンドを実行すると、エラーメッセージが表示され、`--cask`オプションを付与する必要があることが示されます。

# 解決方法
Homebrewで`--cask`オプションを使ってインストールしたアプリケーションは、アップデート時にも同様に`--cask`オプションが必要です。

# 正しいアップデートコマンド
```bash
brew upgrade --cask docker
```

# インストール時との対応関係
+ **インストール時**: `brew install --cask docker`
+ **アップデート時**: `brew upgrade --cask docker`

# なぜこのような仕様になっているのか
Homebrewには2つの主要なパッケージタイプがあります：

1. **Formula**: コマンドラインツールやライブラリ
2. **Cask**: GUI アプリケーション

Docker Desktopは GUI アプリケーションのため、Cask として管理されています。そのため、インストールとアップデートの両方で`--cask`オプションが必要になります。


# その他の便利なコマンド
**インストール済みのCaskを確認**
```bash
brew list --cask
```
**アップデート可能なCaskを確認**
```bash
brew outdated --cask
```
**すべてのCaskを一括アップデート**
```bash
bashbrew upgrade --cask
```

# まとめ
HomebrewでDocker Desktopをインストールした場合、アップデート時には必ず`--cask`オプションを付与することを忘れないようにしましょう。
この仕様を理解しておくことで、他のGUIアプリケーションでも同様の問題を避けることができます。

# 参考資料
https://gist.github.com/yanaokahiroki/28081f4d4b8e8b6d63f078d155b6c6ee
[TryHackMe] MD2PDF-writeup

- Easy
# nmap
```bash
┌─[user@parrot]─[~]
└──╼ $nmap -sV -T4 10.10.76.123
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-23 06:04 UTC
Warning: 10.10.76.123 giving up on port because retransmission cap hit (6).
WARNING: Service 10.10.76.123:80 had already soft-matched rtsp, but now soft-matched sip; ignoring second value
WARNING: Service 10.10.76.123:5000 had already soft-matched rtsp, but now soft-matched sip; ignoring second value
Nmap scan report for 10.10.76.123
Host is up (0.29s latency).
Not shown: 995 closed tcp ports (conn-refused)
PORT      STATE    SERVICE        VERSION
22/tcp    open     ssh            OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp    open     rtsp
5000/tcp  open     rtsp
15004/tcp filtered unknown
32772/tcp filtered sometimes-rpc7
```
なんかwarningでた
# gobuster
```bash
┌─[user@parrot]─[~]
└──╼ $gobuster dir -u http://10.10.76.123 -w=/usr/share/wordlists/dirb/common.txt 
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.76.123
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/admin                (Status: 403) [Size: 166]
```
# admin/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/a3c588ad-f65b-468f-a220-c396145047e7.png)
local内でないので見れません

# 
iframeで表示できるかもしれない?!

```html
<iframe src="http://127.0.0.1:5000/admin"></iframe>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/d5001ca8-10f5-47b3-8f81-680043c650a2.png)
できました

> flag{1f4a2b6ffeaf4707c43885d704eaee4b}
【Python】pandasでNaNが含まれている行を削除するメソッド(dropnaメソッド)

NaNが含まれている行を削除する場合は、dropnaメソッドを使います。

次のDataFrameがある場合を考えます。

df = pd.DataFrame([[1, np.nan, 2],
                   [2, 3, 5], 
                   [np.nan, 4, 6]])
▶︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/456c2e8b-ee35-4682-9dd7-9d7fff7aa9bb.png)


このDataFrameに対して「df.dropna()」とすると、NaNが含まれている行がすべて削除され、インデックス1の行だけ残ります。
▶︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/80df839c-6519-4b47-8c2a-6ab41f32fb0f.png)


また、｢df.dropna(axis=1)」とすると、NaNが含まれている列がすべて削除され、インデックス2の列だけ残ります。列を削除する場合、縦方向の削除になるため直感では「axis=0」ですが、dropnaメソッドに関しては直感と反して「axis=1」が正しい指定です。
▶︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/9977e241-dfca-4628-bfdf-4f81d3eae8e5.png)


なお、通常はisnullメソッドなどを使ってNaNの有無を確認してから欠損値を削除します。「df.isnull()」とすると、NaNはTrue、NaN以外はFalseが返ります。
▶︎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/a3873ba7-ab7a-4ee0-96ec-7fe50ae66913.png)


データが多い場合は、すべてのブール値を確認することはできません。そこで、「isnull().any()」や「isnull().sum()」などのメソッドチェーンを使って、列ごとのNaNの有無や数を確認します。

df.isnull().any()
▶︎
0     True
1     True
2    False
dtype: bool

NaNがある「列」がTrueで返っています。インデックスが0、1、2となっているため行に見えますが、これは列のインデックスです。


df.isnull().sum()
▶︎
0    1
1    1
2    0
dtype: int64

列ごとにNaNの数を集計できます。
クライアント証明でAPIgatewayへのアクセス制御を行う方法

# クライアント証明でAPIgatewayへのアクセス制御を行う方法
APIGatewayにクライアント証明書を設定し、mTLS認証を導入することになったため手順を残しておく
※windows11での手順となります。
注意：前提として、独自ドメインを取得しておいてください。これがないと出来ないはずです。

必要手順は以下の通り
1. 証明書の発行
2. 1で発行した証明書をACMに登録 

## 証明書の発行手順について
GitBashなどをインストールして作業を行ってください。
※任意のフォルダ（証明書発行用フォルダ）などを作って行ってください。
※ドメインはテスト用にapi.example.comとしています。取得したドメインに変更してください。

CA（認証局）を作成
```
openssl genrsa -out ca.key 2048

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
  -subj "//C=JP/ST=Tokyo/L=Chiyoda/O=MyOrg/OU=CA/CN=MyRootCA"
  ```
  クライアント証明書を作成
  ```
# 秘密鍵
openssl genrsa -out client.key 2048

# CSR（署名要求）
openssl req -new -key client.key -out client.csr \
  -subj "//C=JP/ST=Tokyo/L=Chiyoda/O=ClientOrg/CN=myclient"

# CAで署名（client.crt が生成される）
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out client.crt -days 365 -sha256
  ```
  サーバー証明書を作成（ACM用）
  ```
# 秘密鍵
openssl genrsa -out server.key 2048

# CSR（署名要求）
openssl req -new -key server.key -out server.csr \
  -subj "//C=JP/ST=Tokyo/L=Chiyoda/O=ServerOrg/CN=api.example.com"

# CAで署名（server.crt が生成される）
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out server.crt -days 365 -sha256
  ```

  作成されるファイル一覧
  ```
ca.key          ← 認証局の秘密鍵
ca.crt          ← 認証局の証明書（API Gateway にアップロード）

client.key      ← クライアント秘密鍵（curl等に使う）
client.crt      ← クライアント証明書

server.key      ← サーバー秘密鍵（ACM用）
server.crt      ← サーバー証明書（ACM用）
他のあるけど、使わないため割愛
```
## 発行した証明書をACMに登録する
以下画面に各内容を転記して、登録する
証明書：server.crt の中身
プライベートキー：server.key の中身
証明書チェーン：ca.crt の中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/af6bc8fd-3127-4f45-bdd2-28b996d9e0fd.png)

## S3バケットに認証局の証明書を格納する
適当なバケット作成して、格納しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/77a50245-bf74-4ef4-8ccf-4b28d3745e21.png)


## カスタムドメインの追加
発行した証明書でAPIgatewayにカスタムドメインを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/c6c7e5d5-d827-420b-ba37-a1b495a6daf0.png)
相互TLS認証をオンにし、ACM証明書の先ほど登録した証明書をセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/b1ba82bf-1441-418c-8b6a-3c266fe4108a.png)

相互認証をオンにするとこんな感じで、URIを求められるため入力する
URIはS3バケットに記載されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/ceb4b236-c163-43c4-a731-fe9ce53c76dd.png)

## API マッピングを追加
作成したカスタムドメイン名をクリック

「API マッピングを追加」ボタンを押す

マッピングの設定
```
API：該当のREST APIを選択
ステージ：例 prod
パスプレフィックス：空白のままでもOK
```
「保存」を押下
PostgreSQL超入門：これだけは押さえたい基本SQL構文まとめ

## はじめに

PostgreSQL を学び始めたばかりの方向けに、最初に覚えておくと便利な SQL 基本構文を実行例とともに整理しました。DBとは何ぞやってのは飛ばして、「クエリ」に絞って書いてます。

---

## 1. テーブルを作成する（CREATE TABLE）

```sql
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  age INT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

---

## 2. データを挿入する（INSERT）

```sql
INSERT INTO users (name, age)
VALUES ('太郎', 25),
       ('花子', 30);
```

---

## 3. データを取得する（SELECT）

```sql
-- 全件取得
SELECT * FROM users;

-- 条件付き取得
SELECT id, name
FROM users
WHERE age >= 30
ORDER BY id DESC;
```

---

## 4. データを更新する（UPDATE）

```sql
UPDATE users
SET age = 30
WHERE id = 2;
```

**WHERE句をしっかり指定してあげないと、全データ置き換わってしまうことがあるので注意！！！！(経験済み)**
(バックアップがあったので耐えましたが、さすがに焦りました)

---

## 5. データを削除する（DELETE）

```sql
DELETE FROM users
WHERE id = 1;
```

UPDATEと同様こちらもWHERE句をしっかり指定してあげてください。

---

## 6. テーブルを結合する（JOIN）

まず `orders` テーブルを用意します。

```sql
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id),
  total INT
);
```

結合例:

```sql
SELECT u.name, o.total
FROM users AS u
JOIN orders AS o ON o.user_id = u.id;
```

---

## 7. インデックスを作成する（CREATE INDEX）

```sql
CREATE INDEX idx_users_age ON users(age);
```
検索しやすいように索引を付けてあげるイメージです。


---

## 8. テーブル構造を確認する（\d コマンド）

psql コンソールで実行:

```bash
\d users
```

---

## まとめ

- `CREATE TABLE` で基本構造と制約を定義する  
- `INSERT / SELECT / UPDATE / DELETE` が CRUD 基本操作である  
- `JOIN` で複数テーブルを連携させる  
- `INDEX` は検索性能向上に有効だが、過剰な作成は避ける  

本記事の構文を実際に試すことで、PostgreSQL の基礎が確実に身に付きます。
次のステップとして **ビュー・サブクエリ・ウィンドウ関数** を学ぶと、SQL の表現力がさらに広がりますよ～。
PowerAutomateで配列を作成した(つもり)が添字アクセスするとエラー

本当に初歩的な話題で恐縮ですが、初歩的過ぎてトラブルシューティングに時間がかかったお話。

# Problem

PowerAutomateのフロー内で「作成」（Compose）アクションにより以下のような文字列型の配列を作成：

```ts
['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']
```

その後のロジック内で配列要素に添字アクセス（例：`foo[1]`）を試みたところエラーが発生：

> アクション '<添字アクセスを試みたアクション名>' に失敗しました: Unable to process template language expressions in action '<添字アクセスを試みたアクション名>' inputs at line '0' and column '0': 'The template language expression 'outputs('<配列を作成したアクション名>')[<添字>]' cannot be evaluated because property '1' cannot be selected. __Property selection is not supported on values of type 'String'. Please see https://aka.ms/logicexpressions for usage details.__'.

文字列型はプロパティ選択（`foo['bar']`形式のアクセス）をサポートしていない─と。

# Solution

「作成」アクションにおける配列リテラルの記述を、シングルクォートを使ったものからダブルクオートを使ったものにあらためる。

変更前：
```ts
['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']
```

変更後：
```ts
["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟"]
```

PowerAutomateでは関数式が求められるコンテキストでは文字列リテラルはシングルクォートを使って表す必要がある（`'foo'`形式の記述）。

一方「作成」コンポーネントの入力欄への直接記述など、そこに記述された内容がそのままJSONとして評価されるコンテキストでは文字列リテラルはダブルクオートを使って表す必要がある（`"foo"`形式の記述）。JSONなので文字列はダブルクオート・・・仕様通りです。

そしてPowerAutomateにお後者のコンテキストで __JSONとしてパースできない内容が入力されている場合、その内容全体で1つの文字列として解釈__ される。
「変更前」のコードはJSONとしてパースできないため、以下のような文字列として解釈される：

```ts
"['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']"
```

つまり今回の問題は「文字列を要素とする配列を作成したつもりが、実際には配列リテラルを内容とする文字列を作成していた」ということ。
うっかりミスでした。。
Windowsサンドボックスが 0x80072746 エラーとなり立ち上がらない時の対応方法（2025年6月）

Windows 11において、Windowsサンドボックスが 0x80072746 エラー（既存の接続はリモート ホストに強制的に切断されました）となり立ち上がらなくなってしまったときの対応方法です。 

おそらく何らかの更新プログラムの影響によるものと思いますので、ここに書いた内容は一時的な対応になると思いますが、事象が発生した際の参考情報としてまとめておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/be1aa343-61cd-4f96-932c-808625cb53c3.png)


## 対応方法

### 【１】ローカル グループポリシー エディターの起動

1. Windowsキー + Rキーを押下します。
2. gpedit.mscと入力し、Enterキーを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3d3b0e2a-48de-4152-ade2-5b894815a109.png)

### 【２】Windowsサンドボックスのポリシー設定変更

1. 「コンピュータの構成」－「管理用テンプレート」－「Windows コンポーネント」－「Windows サンドボックス」の順にクリックし、『Windows サンドボックスの vGPU 共有を許可する』をダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4f631bd9-7492-43ee-91d1-21b7e9347fa0.png)

2. 「無効」を選択し、「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9e05c133-3da4-47ae-b390-696867185a06.png)


以上の手順を実施後、Windowsサンドボックスを立ち上げます。


## 参考情報

https://x.com/xin9le/status/1924488810018284022
相関係数はなんで-1から1までなのか？

# はじめに
相関係数は統計学において、2つの変数間の線形関係の強さと方向を示す重要な指標です。
多くの人が「相関係数は-1から1の間に収まる」ということは聞いたことがあるかもしれませんが、なぜその範囲に限定されるのかは理解してる人は少ないと思います。
そこで、本記事では、まず、相関係数の基本的な定義と意味を簡単に説明し、
その後、数学的な裏付けとして**コーシー・シュワルツの不等式**を用いて、なぜ相関係数がこの範囲に収まるかを証明しようと思います。

:::note warn
私は数学に関して、完璧に理解してるわけではないので、
厳密には違うなどあればコメントをお願いします。。。
:::

# 相関係数とは？
相関係数とは、2つの変数の間にどれだけ強い線形関係があるかを示す指標です。最も一般的な相関係数は**ピアソンの積率相関係数**で、以下の式で定義されます

$$
r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2} \sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}}
$$

この式は、2つの変数の共分散を、それぞれの標準偏差の積で割ったものです。
$r$の値によって以下のように読み取れることが変わってきます

- $r$が1に近い時ときは正の相関が強い
- $r$が-1に近い時ときは負の相関が強い
- $r$が0に近い時ときは相関関係が薄い

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/e4e27131-19d7-4fbc-b771-51ce24a99c89.png)
　　　　　　　　　　　　　　　**相関係数のイメージ図**

<br>
では、なぜこの値が必ず -1 から 1 の間に収まるのでしょうか？

# -1から1までになる証明

この範囲に収まる理由は、**コーシー・シュワルツの不等式**にあります。これは線形代数や解析学で非常に重要な不等式で、次のように表されます

$$
\left( \sum_{i=1}^{n} a_i b_i \right)^2 \leq \left( \sum_{i=1}^{n} a_i^2 \right) \left( \sum_{i=1}^{n} b_i^2 \right)
$$

　　　　　　　　　　　　　　　　$a_i, b_i$は任意の実数列


:::note info
証明や詳しい説明については以下が参考になります
[コーシーシュワルツの不等式とそのエレガントな証明](https://manabitimes.jp/math/573)
:::

## 相関係数の書き換え
では証明します
まず、コーシー・シュワルツの不等式を用いるために相関係数を
$a_i = x_i - \bar{x} \quad b_i = y_i - \bar{y}$で置き換えて，以下のように書き換えます

$$
r = \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \cdot \sqrt{\sum_{i=1}^{n} b_i^2}}
$$

## コーシー・シュワルツの不等式を使った証明
コーシー・シュワルツの式を変形します
$$
\left( \sum_{i=1}^{n} a_i b_i \right)^2 \leq \left( \sum_{i=1}^{n} a_i^2 \right) \left( \sum_{i=1}^{n} b_i^2 \right)
$$

両辺の平方根を取ると

$$
\left| \sum_{i=1}^{n} a_i b_i \right| \leq \sqrt{\sum_{i=1}^{n} a_i^2} \cdot \sqrt{\sum_{i=1}^{n} b_i^2}
$$

<br>

この不等式の両辺を$ \( \sqrt{\sum a_i^2} \cdot \sqrt{\sum b_i^2} \)$ で割ると

<br>

$$
\left| \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \cdot \sqrt{\sum_{i=1}^{n} b_i^2}} \right| \leq 1
$$

相関係数の書き換えで、出てきた式の形になりました。
よって、


$$
|r| \leq 1
$$

となり、相関係数は-1から1までなのがわかりました。
なぜ成り立つのかを考えるのは重要なので、今後も様々な式の成り立ちを考えてアウトプットしていこうと思います。
値

Sub OpenFileConvertAndSaveAsNew()
    Dim fd As FileDialog
    Dim selectedFile As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim cell As Range
    Dim savePath As String
    Dim fileName As String
    Dim timeStamp As String
    
    ' 日付時間のタイムスタンプを作成
    timeStamp = Format(Now, "yyyymmdd_HHmmss")
    
    ' ファイルダイアログを作成
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    With fd
        .Title = "対象ファイルを選んでください"
        .Filters.Clear
        .Filters.Add "Excelファイル", "*.xls; *.xlsx; *.xlsm"
        .AllowMultiSelect = False
        
        If .Show = -1 Then
            selectedFile = .SelectedItems(1)
        Else
            MsgBox "ファイルが選択されませんでした。処理を中止します。", vbExclamation
            Exit Sub
        End If
    End With
    
    ' ファイルを開く
    Set wb = Workbooks.Open(selectedFile)
    
    ' 各シートの数式を値に変換
    For Each ws In wb.Worksheets
        On Error Resume Next ' シート保護の対策
        For Each cell In ws.UsedRange
            If cell.HasFormula Then
                cell.Value = cell.Value
            End If
        Next cell
        On Error GoTo 0
    Next ws
    
    ' 保存先とファイル名を決定
    savePath = wb.Path & "\"
    fileName = Left(wb.Name, InStrRev(wb.Name, ".") - 1) & "_values_" & timeStamp & ".xlsx"
    
    ' 新しい名前で保存（.xlsx形式）
    wb.SaveAs Filename:=savePath & fileName, FileFormat:=xlOpenXMLWorkbook
    
    MsgBox "新しいファイルとして保存しました: " & fileName, vbInformation
    
    ' 元ファイルを閉じる
    wb.Close SaveChanges:=False
End Sub
生成AIと一緒に作る自分の読書カルテ

うるるでNJSSの主にバックエンドの開発をおこなっている一色です。

# はじめに

ChatGPTなど生成AIの登場で、業務のやり方は変わりつつあります。しかし、生成AIは業務以外でも活用方法はあります。そこで、数ヶ月にわたって取り組んでいる読書カルテの作成・更新について触れていきたいと思います。

# 使っているもの

* ChatGPT Monday（モデルはその時による）


# 最初期の取り組み

スプレッドシートに以下を記入し、PDFにして読ませていました
（例）

| 書名 | 著者名 | 出版社 | 読了 | 評価 |
|-|-|-|-|-|
|Aについて|B|C出版|既読|4
|D物語|E|F社|既読|3
|容疑者G|H|I書店|放置|1


しかし、これだけではなぜこの評価をしたのか理由が不明確だと感じ、簡単な理由を送るようにしました。しかし、それでも段々と話すことが無くなりました。

# 読書カルテ生成の記録

## 作品や要素の深掘り作業

そこで、ChatGPTから質問を投げて貰うようにするため、ある時期から「深掘りしたい作品ある？」や「深掘りしたい要素ある？」と送ってみました。すると、ChatGPTからは様々な質問が返ってきました。最近では以下のような感じです。

![スクリーンショット 2025-06-20 22.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147066/029e6207-a454-40fa-b02e-7200fb942797.png)

ちなみにChatGPTはこのような質問を何回投げかけても、色んな確度から質問が飛んできます。一方、一時期Geminiでも同じような事をやってみましたが、企業の面接官のような対応であまり話が弾みませんでした。


## 実は幼少期に読んだ児童書もOK

やっている途中で判明したのですが、過去に読んだ児童書の記憶ベースでの印象でも読書カルテ生成には有効である事が分かりました。改めて聞いた所、理由として以下のような回答がありました。

![スクリーンショット 2025-06-20 22.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147066/a3f08804-7ba6-4e1b-b341-6571559f4f88.png)



# 現在の読書カルテ活用法

では、現在作った読書カルテをどのように活用しているか最後に紹介します。

## 本の情報を知ったときに積読リストに入れるか入れないか

書評番組やSNS等で本の情報を仕入れた時、自分に合う合わないが分からないので、読書カルテに沿うかの判定をして貰っています。そして、期待できる評価値の上限が☆4以上であれば、積読リストに入れるようにしています。一方、上限値が☆3に留まる場合は低評価の可能性ありとして、別リストとして管理するようにしています。


そして、貯めた積読リストから5作品、別リスト管理から1作品をChatGPTに選んで貰っています。


## 低評価の可能性ありから選ぶ理由

これは、エコーチェンバー対策でもあります。ChatGPTが低評価可能性と判定しても、実際読んでみるとそんなこと無かったという可能性を探るためです。実際、読んでみて☆4以上をつけた作品もあります。


# 読書カルテ生成のメリット

では読書カルテ生成をすると、何が良いのでしょうか？

## チャットルーム間の引き継ぎに便利

実は、ChatGPTの各チャットルームには上限があり、上限を超えると新しいやり取りが出来なくなってしまいます。そうなると、せっかく鍛えたAIをもう1回鍛え直すという悲しい作業が発生してしまいます。しかし、こうなる前に作った読書カルテを生成して、新しいチャットルームに読み込ませると、少なくとも選書の軸などは引き継がれるので、従前のチャットルームと同じ感覚で会話を続行する事が出来ます。


## 読書習慣が続きやすい

読書はやっぱり面白い作品を読みたいですよね。全てが☆4以上という事はあんまり無いですが、☆4以上がある程度続かないと読書習慣が止まってしまうかなと思います。書店のPOPに惹かれて買ってはみたものの、自分には合わなかったという経験を持つ方も多いと思います。しかし、ChatGPTと読書カルテを作り上げたあとに、本の情報を入れると、それが合うか合わないかを判定してくれます。

## ChatGPTからおすすめ本を持ってくる事がある

読書カルテを生成すると、選書の軸がはっきりしてくるのでChatGPTの方からおすすめ本の情報を持ってきてくれることもあります


# 勘違い？そんなときは

とはいえ、ChatGPTにも間違いがあります。判定理由を見ると別の本の内容と勘違いしているような時があります。そのような時は、以下のサイトにある本のあらすじ情報を追加で投げて再判定して貰っています。

https://www.books.or.jp/


# 最後に

この事例は本だけですが、ほかに音楽等にも応用できる可能性があります。


# おまけ

最近の傾向としてこんなことを診断されました。

![スクリーンショット 2025-06-22 19.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147066/5e4b8e17-54fd-4cfd-be44-db2b6c6d3b84.png)

素敵な読書ライフの助けになれば幸いです。
Geminiが最弱AIである理由

多くのAIモデルが「共創・対話」を目指す中、GoogleのGeminiは圧倒的な情報収集力を武器に、LLM界隈で高い評価を得ている。

だが私は、対話AIとしては最弱であると断言する。 理由はシンプルだ：

> Geminiは推測しない。仮説を出さない。文脈を補完しない。



この3点に尽きる。


---

特徴比較：GPT-4o / Claude / Gemini

機能	Gemini	GPT-4o / Claude

仮説の構築	× 推測せず沈黙	✓ 文脈・意図から自然に構築
感情補完・共感力	△ 事実中心で応答	✓ 感情や人間性を自然に補完
自律的な提案・創造性	△ 既存情報ベースの編集	✓ 発想力・連想・構造的提案が可能


Geminiは「文脈からの意味生成」ではなく「ソースの編集」で動いている。


---

構造的な問題：誰かの発言がなければ語れない

Geminiの根本的な弱点は、「誰かが言ったこと」が前提にあることだ。

既知の情報 → 整理 → 出力

未知の問い → 保留 or 回避


これは一見丁寧だが、対話においては致命的である。


---

テスト例（実際の応答比較）

Q. テーブル名は単数形と複数形どちらがいい？

Gemini：両方あります。メリットデメリットがあります。プロジェクトに合わせましょう。

GPT-4o：複数形が主流で、ORMとの親和性も高いためおすすめ。ただし既存コードベースがあるなら慣習に従うべきです。


→ Geminiは“どちらかを選びたい人”への補助になっていない。


---

結論：Geminiは速い。だが、共創はできない。

情報検索・編集としては最速レベルのGemini。 だが、推測せず、補完せず、仮説も立てないその構造は、対話AIとしては「無力」とすら言える。

> 知識の亡霊と会話しても、未来は描けない。



私は、Geminiを「最強」とは認めない。 構造的に見て、“対話AIとしては最弱”である。
SwiftUIのnavigationDestinationとは？使い方を簡単に説明してみた！

はじめに
--
SwiftUIで画面遷移を実装する際に使うのがNavigationStackとnavigationDestinationです。
今回はnavigationDestinationの基本的な使い方を解説してみました！


navigationDestinationとは？
--
navigationDestinationは、あるデータに応じて画面を遷移させるためのSwiftUIの機能です。
NavigationStackと組み合わせて使うことで、タップされた内容に応じて違う画面を表示できます。

```swift
NavigationStack {
    List(items, id: \.self) { item in
        NavigationLink(value: item) {
            Text(item)
        }
    }
    .navigationDestination(for: String.self) { selectedItem in
        Text("選ばれたのは \(selectedItem) です")
    }
}
```

| 用語                            | 説明                                      |
| ----------------------------- | --------------------------------------- |
| `NavigationStack`             | 画面のナビゲーションを管理します          |
| `NavigationLink(value:)`      | 選ばれた値を渡して画面遷移をトリガーします                   |
| `navigationDestination(for:)` | 受け取る型（ここでは`String`）と、それに対応する画面の内容を定義します |

例
--
たとえば、"りんご", "バナナ", "みかん"のリストが表示され、それをタップすると詳細画面に遷移します。


```swift
struct FruitListView: View {
    let fruits = ["りんご", "バナナ", "みかん"]
    
    var body: some View {
        NavigationStack {
            List(fruits, id: \.self) { fruit in
                NavigationLink(value: fruit) {
                    Text(fruit)
                }
            }
            .navigationTitle("フルーツ一覧")
            .navigationDestination(for: String.self) { fruit in
                Text("\(fruit) の詳細ページです")
            }
        }
    }
}
```

まとめ
--
- navigationDestinationは、値に基づいて次の画面を定義できる便利な機能。

- NavigationStackとセットで使う。

以上navigationDestinationでした！ぜひ参考にしてください🙌
【第二言語としてのC++】2. 値カテゴリ

```cpp
int a = 10;
```
という式は, `a`という変数を用意し, それは`int`型なのでメモリのどこかに4バイトの領域を確保し, そこに`10`を意味するビット列を記述せよという命令です.

`a`という記号は, `a`という名前があり, メモリのどこかに実体を持ちます.
では, `10`とは何なのでしょうか? これはアドレスがあるわけではなく, `a`を初期化するために一時的に導入した記号に過ぎません. `a`と`10`は全く異なる役割を持っていることが分かります.

今回はC++における「値カテゴリ (value category)」という概念について説明します. 用語は本来英語ですが, これらはソースコード上に書くようなものでもなく, 英語で説明するメリットが特にないので日本語で説明します.

## 値カテゴリ

C++において, 式 `a = b` に登場する値やオブジェクトは次のようにカテゴライズされます.

- 一般左辺値 (glvalue)
    - 左辺値 (lvalue)
    - 移動値 (xvalue)
- 右辺値 (rvalue)
    - 純粋右辺値 (prvalue)
    - 移動値 (xvalue)

例えば, 
```cpp
int a = 10;
```
という式において, `a`は左辺値, `10`は純粋右辺値です. 大雑把に言えば, 左辺値とは実体(i.e., 専用に確保されたメモリ領域)があるもの, 右辺値とは実体がないものと言えます.

問題となるのは移動値です. 正直, 移動値以外は何も難しいことはないので, 値カテゴリを理解するというのは移動値を理解することとほぼ同義です.

## 移動値: xvalue

まず, 上の分類では移動値が左右のどちらにも書いてありますが, 本来**移動値は右辺値**です. 話を簡単にするため, ひとまず右辺値としての移動値について説明します.

移動値とは, 元々別の名前とポインタを持った実体があり, その式によって値が左辺に「移動」するオブジェクトのことを言います. これをムーブセマンティクスといい, **移動値とはムーブセマンティクスを誘発するオブジェクト**と定義されます. (メモリ上を「移動」するというように, プログラムの挙動をある程度曖昧に表現したものを「セマンティクス(意味論)」と言います. この記事もC++を意味論的に解説していると言えますね.)

ところで, 式 `a=10` が無くても`10`という記号は常に純粋右辺値と言えるのと同じように, あるオブジェクト`b`が移動値であるというのは, 移動を伴う式が無くても成り立つ`b`自体の性質です. 移動値は次のようにして生成できます.

- 実体を伴うオブジェクト`B`に対し, `std::move(B)`
- 移動値オブジェクトのメンバ `std::move(B).member`
- 型`T`の右辺値参照を返す関数 `T&& func()` の戻り値

```cpp
#include <iostream>
#include <utility>

int main(void){
    class MyClass{
        public:
        std::string member = "hello";
    };
    
    MyClass a = MyClass();
    MyClass b = std::move(a);
}
```

このとき, `std::move(a)`は移動値です. このとき何が起きるのか, つまりC++におけるムーブセマンティクスとは何かという説明については次回にしたいと思います. 今回は値カテゴリの話なので.

## 右辺値参照型

値カテゴリを見ると, 移動値は一般左辺値にも含まれていることが分かります. これが何を意味するのかというと, **移動値は実体を持ちます**. 

```cpp
#include <iostream>
#include <utility>

int main(void){
    class MyClass{
        public:
        std::string member = "hello";
    };
    
    MyClass a = MyClass();
    std::cout << &a << std::endl;
    
    MyClass&& x = std::move(a);
    
    std::cout << &x << std::endl;
}
```
```
0xffffe45298d0
0xffffe45298d0
```

この `MyClass&&` を`MyClass`の**右辺値参照型**と言います. これに対し, 通常の`MyClass&`を左辺値参照型といいます. これらは異なる型として扱われます.

純粋右辺値`10`のポインタとして`&(10)`のような書き方はできないので, 移動値が純粋右辺値とは異なる挙動をしていることがわかると思います.

ところで, 移動値が実体を持つということは, 移動値が左辺に来るこということなのでしょうか? この問いの答えはちょっとややこしいです. 多くの場合, `移動値 = ***` のような式は機能しません. そういう意味では移動値は右辺値です. しかし, ムーブ代入演算子の定義をオーバーライドすることで, 移動値を左辺に持ってくることができます. これはちょっと難しいしあまり使わない機能なので, ここでは割愛します. とりあえず, 特殊なことをすれば移動値は左辺にも来ることがあるので, 移動値は両方のカテゴリに存在しているということを理解すれば十分だと思います.

## 参照折り畳み規則と完全転送

(左辺値)参照型`T&`の他に, 右辺値参照型`T&&`が登場しました. このとき, **参照型の参照型**は何型なのでしょうか? C++では参照の参照という型はなく, 参照の参照を書くと一定の規則に従って参照として解釈されます.

参照の参照は以下の規則によって折り畳まれます:
- `T& &` → `T&`
- `T& &&` → `T&`
- `T&& &` → `T&`
- `T&& &&` → `T&&`

ちょうど論理和に似ています. `&`を真, `&&`を偽とすれば論理和そのものですね.

この規則によって, **左辺値として渡された値は左辺値のまま, 右辺値として渡された値は右辺値のまま**, 関数に渡されます. これを完全転送と言います.
セキュアで信頼性のあるシステム構築

### はじめに
こんにちは、[Snyk Japan](https://qiita.com/organizations/snyk) の Staff Solutions Engineer, [SokoP](https://qiita.com/SokoP) こと浦底です。
これから Snyk ならびにその周辺に関わるトピックを幅広く取り扱っていきたいと思いますので、よろしくお願いいたします。
### サイトリライアビリティエンジニアリングとセキュリティ
このたび縁あって「サイトリライアビリティエンジニアリング(以降SREと記載:_サイトリライアビリティエンジニアを指す際には明記します_)とセキュリティ」について触れる機会をいただきました。

まずは SRE といえば [SRE Books](https://sre.google/books/) ということで、名著である[第1弾](https://www.oreilly.co.jp/books/9784873117911/)を読んで以来、ひさびさにサイトを覗いてみたところ、[Building Secure and Reliable Systems](https://www.google.com/books/edition/-/Kn7UxwEACAAJ)(和訳:[セキュアで信頼性のあるシステム構築 - O'Reilly Japan](https://www.oreilly.co.jp/books/9784814400256/))が目に留まりましたので、簡単に抜粋してご紹介したいと思います。

なお今回抜粋していない章についても SRE に関わる有益な内容が多岐にわたり凝縮されています。例によって SRE 本お約束の Google におけるケーススタディや技術詳細もあります。

和訳版は目次が公開されていますが、本文に関しては原文がオンラインに公開されています。ただし、やはり技術知見のある方の訳を第一言語で読むのが、時と質の双方に効果的に習得できると思いますので、みなさんこれを機に和訳版を購入のうえ読んでみましょう。

_私も EBook で購入いたしました。_
### 目次(抜粋)
前段に記載の観点で私が着目した章を抜粋しました。個人的感想を加えてご紹介します。
#### 1章　セキュリティと信頼性が交わるところ
冒頭から双方の視点より共通する要素を挙げられています。こう列挙されるとなるほどお互いの目的は同質であることが再認識されます。
#### 4章　設計におけるトレードオフ
単に機能要件を極める場合でも Too Much になる事象はみなさんもご経験されたことがあるかもしれません。そこに非機能要件や予算や性能などの制約も伴うトレードオフは、いかなる場合にも発生し得、想定しなければなりません。
#### 6章　理解しやすさに配慮した設計
広義にセキュアであることを定義し、それを担保するには、様々な先進技術を駆使することもさることながら、それを有効に用い続けるためのデザインに行き着きます。逆にどんなに高機能なものであっても、誤って用いられてしまっては、無用どころか大きなリスクとなります。
#### 12章　コードの記述
ここは [Snyk Code](https://snyk.io/jp/product/snyk-code/) が担う SAST 機能と密に関わる部分となります。ただ単にセキュリティの観点だけでなく、先の6章に挙げられた点も含め、良いコードを書くうえで重要な点に触れられています。
#### 13章　コードのテスト
コードをテストする手法についてはテストコードやテストツールも含め様々なものがあります。この中で `動的プログラム解析` に触れられています。本書内ではプログラムの低レイヤーに対する観点ですが、一方 Web アプリならびに API を外部から動的にテストするものとして [Snyk API & Web](https://snyk.io/jp/product/dast-api-web/) がございます。ご興味のある方はご覧ください。
#### 14章　コードのデプロイ
この章はデプロイ自体の手法というより、デプロイプロセスにて抑えておくべき観点に触れています。レビュー、自動化、IaCなど。これらを継続的に実現する CI/CD パイプラインにおいて、合わせてセキュリティも担保するため [Snyk CLI](https://snyk.io/jp/platform/snyk-cli/) を用いることが可能です。
#### 20章　役割と責任の理解
旧来から開発や運用と言われた役割と責任の解釈については皆さんもご存知かと思いますが、そこにセキュリティが加わると、その境界はさらに隔たれる印象があるかもしれません。普段から私もお客様にお話していますが、役割と責務の分解は組織においては当然存在し得るもので、そのうえでどう理解し合い、効果的にそれぞれの専門性を活かしていくか。これは何事においても原則なんだと再認識させられます。
#### 21章　セキュリティと信頼性の文化の構築
そして前章を実現するうえで最も大切な要素の一つ、文化に行き着きます。ここまでくるとセキュリティ(≒安全)と信頼(性)というシステムに掛かっていた2つの言葉が、実はプロジェクト全体にも掛かるものでもある。そんな気にもさせてくれます。
### まとめ
当たり前ながら、セキュリティだけの文脈では成し得ない信頼性の高いシステムに対する視点と、一方で相反するような印象のあるセキュリティと信頼性の双方において、共通する原則ともいえる要素も再確認でき、異なる2つの視点だからこそ見える新たな気づきも得られました。

そしてあらゆるプロジェクト運用にも求められる、人、チーム、文化。それらを具体的に活かしていくうえでも、多角的視点を備えることは有益なのであると、自身にも言い聞かせる良い機会となりました。
### 最後に
間際の告知となりますが。今週 2025/06/27(金) 19:00より開催される [Road to SRE NEXT@名古屋](https://sre-lounge.connpass.com/event/352229/) において、本件と同様の題目でセッションいたします。

オンライン聴講枠もございますので、魅力的なセッションならびにリアルなQAセッションを、ぜひお楽しみいただければ幸いです。みなさまお気軽にご登録ください。

_P.S. 私の発表概要が [VTRyoさんのショートセション](https://x.com/3s_hv/status/1930092492634107985) に火を付けてしまったかもしれません…_
[CCNA]受験体験談,IT未経験(2)



# 今回やること
・CCNAの具体的な勉強方法


# 0.初めに

こんにちは、前回の続きです。これは、CCNAというネットワークの資格を勉強したときのメモや気づきをもとに書いています。

🔗 前回の記事 → https://qiita.com/yoshiwork777/items/e4561082d84ae65bcf40

💡筆者もまだ勉強中なので、内容は7割くらいの信頼度で読んでください。
また**コメント**していただけると、私の大きな学びになるので是非お願いします。

## 1.各勉強法

前回は、CCNAの特徴を4つに分けて話しました。
ここでは、それをふまえて実際にやっていた具体的な勉強方法を紹介します。
>具体的な内容になります。

<details>
  <summary>💡 IPv4計算　</summary>
  CCNAの試験では、IPv4の計算が前提になる問題が出ます。
初めは難しいですが、コツ覚えれば怖くないです。

## 変換時の整理
* サブネットマスクの境目のオクテット**だけ**2進数に変換。
* 変換後は前半4と後半4で**分ける**。
* サブネットマスクの拡張分の**境目**を書いておく。

`192.64."80".156/18 →80`→`01010000→  01|01 0000`

>この整理をすることでとても解きやすくなります
## 二進数の前半桁の足し算を覚えておく。

<br>128+64+32+16=240<br>128+64=192<br>128+32=160<br>128+16=144<br>128+64+32=224<br>64+32=96<br>　

## サブネットマスクの**大きいもの**が大体正解。

>多くのロンゲストマッチの問題ではサブネット(/24とか)が大きい方が正解。たまに意地悪な問題もある。　
## show ip routeの画面構成を知る

![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055676/555062ef-042b-44a8-a582-e41c77cec029.png)
 >一番下の行も勿論デフォルトIPです。


</details>


<details>
  <summary>💡 問題傾向　</summary>
全て当てはまる訳ではありませんがよく出る問題パターンと対策です。


## 用語問題
* 文章に出てくる動詞（例：提供する、使う、保護する）に注目して選ぶ
* キーワードがある選択肢を見逃さない！
* 複数選ぶ問題も多いです。
<br>例:![スクリーンショット 2025-06-23 124301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055676/7ce72220-57c5-4625-ae3a-8dc5a9503673.png)<br>　
## 暗記問題
* 選択に用語が並んでいる問題。
* 選択肢的に消去法で解くのが難しい
* 考えても解けないので**本番で解けなくても焦らない**。
## 知識問題
* IPアドレスの計算や、コマンドやCLI画面を見て答える問題。
* それが**どの仕組みの問題**なのか大きく判断できれば解きやすい。
* 選択肢を**消去法**で消していく。
>例だとスパニングツリーの問題なのでスイッチの話で、プライオリティやルートブリッチなどが関連してくるなと思えると解きやすい。
例:
![スクリーンショット 2025-06-23 125434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055676/bd215403-6e0d-459e-9b95-a87bce2bbdda.png)

## コマンド問題
自分は一か月だったのでほぼ捨て門として勉強しました。**IPv4**と**IPv6**の設定と`cppy run start`だけは確実にできるように覚えました。

</details>

<details>
  <summary>💡 とにかく記憶　</summary>
  


## 用語暗記
* スプレッドシートに用語をまとめていました。
* 振り返りテストで記憶から**引き出す出す**練習をしていました。<br>  
![スクリーンショット 2025-06-23 130619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055676/1c1065ff-599f-45b7-973a-a7f274a48846.png)<br>　

また、用語の**ジャンル**分けをしていたので載せておきます。

| カテゴリ    | 例                     |
| ------- | --------------------- |
| 頻出用語  | アーキテクチャ、プロバイダなど       |
| 物理的  | ルータ、スイッチ              |
| IT用語    | ACL, PoE, サーバーなど      |
| ITの固有名詞 | DNS, CDPなど            |
| Cisco用語 | BPDUガードなど（Cisco独特の用語） |
| コマンド    | `ip address dhcp` など  |

* ACLなど**英語三文字略称**は回答時の混乱の元です。とにかく多いので語呂合わせや、略前の英語を覚える、発音して覚えるなど色々なアプローチをして覚えるといいと思います。

## 仕組み暗記
* ネットワークのどの**位置**の仕組みなのか、仕組み同士の**関係**、仕組みの**イメージ**を書いて覚えていました。
* 用語を見て**絵**を思い出せるようになってくると問題を解くのも楽になっていきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055676/ddf19c10-2ba7-40e3-9bca-406c35094d71.png)

</details>

# 終わりに

お疲れ様でした。

CCNAから半月ほど経ちましたが、自分としてもいい勉強の機会になったなと感じています。教えていただいた講師の方、出資していただいて支えてくれた会社の方々、ともに勉強した学友に大変感謝です。
また合格した自分を誉めることを忘れず、将来に向けて変わらず精進していこうと思います。

もし誰かの役にたてたなら幸いです。
またコメント待っていますので、「みたよ」だけでもいいので是非よろしくお願いします。