OmniAICreator/Qiita-1.07M huggingface dataset:
プロフィール論破バトル【TriAiheart】をリリース

プロフィールを入力すると、AIがあなたの性格を分析。 あなたに“なりきって”議論を展開

「賃貸 vs 持ち家」「きのこ vs たけのこ」など、日常の論争テーマで白熱した議論をシミュレーションできるTriAiheartをリリースしました。

https://triaiheart.com/

## 人生には戦わないといけない時がある

人には誰にも譲れない価値観があり、戦わないといけない時があります。
たとえば「パンツを履くべき vs ノーパンこそ至高」とかね

しかし、面と向かって意見をぶつけたり、バトルするのって疲れますよね。
正解のないバトルから逃げ出したいですよね。
社会人ってつらたん。

でも大丈夫、このサービスなら直接戦わなくていいんです。

自分の好き・嫌いなどの価値観を入れたプロフィールを作って、
自分の分身をAIで生成して、バトルシミュレーションさせればいい！

ということで作ってみました。
![スクリーンショット 2025-04-18 11.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398972/fccf060e-5183-4f5c-8d22-eb47927602db.png)

## TriAiheartの使い方

あなた、ライバル、ハートピッカー（判定者）の3人で繰り広げるの論破バトルです
3人のプロフィールからAIが性格を推定して、各ユーザーになりきって議論を展開

1. サービスにログイン
1. 自分のプロフィールを入力
1. バトルスタート！ライバルとハートピッカーがランダムに選定
1. バトルしたいテーマを入力：例「持ち家は最高 vs 賃貸が至高」
1. AIが論破バトルをシミュレーション！ハートピッカーからの結果発表！

# 開発構成の紹介

## 構成の理由

個人開発は、だいたいバズらずに終わるので、
「極限までコストを抑える構成」か「仕事のスキルアップに寄せる構成」 のどちらかを
選択することになると思います。

今回は **“企業の開発現場でも役に立つ”** ことを目的に、AWS構成を採用しました。

> Firebase構成も過去に使っていましたが、実務経験に繋がりにくいです。コスト観点では、Firebaseのほうがおすすめです。

#### 余談
Firebaseを大企業の現場でつかっているのを見たことがないです。かならずAWS/AZURE/GCPのどれかに収束しています。理由は、開発規模が大きくなってくると「インフラを細かく制御・監視したい」や「認可ロジックをカスタマイズしたい」など、かならず特殊な要件が入って来るためだと思います。
Firebaseはサクッと使えてやすい反面、通信やスケーリングなど裏側の仕組みがBlack box化していてコントロールできないので、大企業の開発現場で採用されているのをみたことがないです。

---

## 🔧 技術構成 (有料)

| 項目           | 使用技術・サービス                       |
|----------------|-----------------------------------------|
| フロントエンド | Next.js                                 |
| BFF   | Node.js  |
| バックエンド   | Node.js|
| インフラ       | AWS（VPC / ALB / ECS Fargate / RDS）     |
| デプロイ       | GitHub Actions + AWS CDK                |
| コスト目安     | 約3,000円/月（AWSリソース）             |

3コンテナ構成で、front/BFF(backend for frontend)/backendでimageを分けています。
最小構成でも月3000円くらいはかかってしまいますね〜
サービスを維持するという意味では、結構つらい額。


## CI/CD構成（無料）

- **GitHub Actions** を使用  
  - `main` ブランチにPRがマージされると自動ビルド
  - `ECR` にDocker ImageをPush
- **AWS CDK** でインフラ自動デプロイ
  - 手動デプロイなしでステート管理＆反映


## 最後に
今回は、仕事でも使える構成にしてみましたが、月3000円はちと高いですね。
維持し続けるのが厳しい金額だと思います。

業務経験という意味では、
大企業の業務アサインだと開発規模の大きさもあり、
backendの一部機能の実装屋さんになるなど限定的ロールになるか
全体の管理屋さんになって実装は行わない、リードロールになるか
みたいな感じになり、全体習得が困難になるので、
インフラ〜フロントまでの全体感を自身の手で実装＋保守運用してみたいという場合には良いかもしれません。


今後やるなら、
VPSとかを使って自宅のPCでやるほうコストと実務知識のバランスがいいかな〜と思いました。
~~~
[ 自宅PC / VPS ]
 └─ docker-compose up
     ├── frontend (Next.js)
     ├── backend for frontend (Node.js)
     ├── backend (Node.js / Express)
     ├── db (MySQL / SQLite)
     └── cloudflared (optional)

       │
       └─ [ Cloudflare Tunnel / NATポート開放 ]
             │
             ▼
        https://yourdomain.com/
~~~
【ChatGPT】Library機能に共有機能が追加されました。


　どうも、カーブミラーです。

　今回は、ChatGPTのLibrary機能に共有機能が追加されました。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　では、さっそく【本題】です。

　と、その前に、
　　**日本語環境では
　　　Library→ライブラリ
　　　　になりましたのでご注意を。**

　では改めまして。

　今回は、
　　Library機能に
　　　共有機能が追加されました。

　OpenAIが
　　ChatGPTのLibrary機能に
　　　新たな機能を追加しました、

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1912921639656071231?t=7vQtsOiKA_seBMksxnDc8g&s=19)

***（ChatGPT翻訳）***
ChatGPTで作成した画像を、直接共有できるようになりました。
***

　共有というと
　　セッションの共有が
　　　ありましたよね｡

　今回は、
　　Libraryからの
　　　画像の共有です。

　もちろん、
　　セッションからの
　　　画像の共有は、
　　　　以前から存在していました。

　　セッションからの画像の共有は
　　　SNSに直接、画像を貼り付けます。

　ですが、
　　Libraryからの画像は、
　　　SNSにリンクを貼ります。

　こんな感じですね。
![Screenshot_20250417-231134~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/e5566f3e-f25d-466a-9816-1f028af8865b.png)

　文字の部分は、
　　自分で書き込みました。
***
　では操作方法を。

　❶Libraryに入ります。
　❷画像を選択する
　　　画像の操作画像に遷移
　❸右上にリンクマークが
　　　あるのでタップ
![Screenshot_20250417-230837~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/1ed9cab7-5389-4c78-8ae6-69a0b280b76e.png)

　　　リンクアドレスをコピーしたり、
　　　　SNSへのポストが行なえます。
***
　アップされたポストを見た人からは
　　リンク先への案内で
　　　ChatGPTの新しいセッションに
　　　　飛ぶ仕組みです。

　そこに画像がコピーされ、
　　入力されたPromptが実行されます。

　ここで出力されるのは、
　　画像を解析しての結果です。

　質問してもいいですし、
　　そこから自分好みに変更も可能です｡
　　　ご自由にどうぞ。

　ただ、
　　**ご自分の画像であった場合、
　　　そして、メモリ機能を
　　　　オンにしていた場合、
　　　　　その画像の情報が
　　　　　　出てきます。**

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Markdown記法 を学んだので、代表的な書き方15個を紹介してみる

# Markdown記法
最近、マークダウン記法について勉強してみました。
実際に使ってみると、思っていた以上にシンプルで便利！
ブログやメモ、ドキュメント作成など、さまざまな場面で役立ちそうです。

せっかくなので、今回は「覚えておくと便利なマークダウンの基本的な書き方」を15個、例と一緒にご紹介してみます。
これからマークダウンを使い始めようと思っている方の参考になれば嬉しいです。

## 1 Code blocks - コードブロック

\```
Hello,world
\```
と```で囲むことによって

```
Hello,world
```
このような表示になります。


## 2 Code spans - コードスパン
\`Hello World`

と文字列を`で囲むことで、、、

`Hello World`このようにインライン表示ができます。

## 3 Headings - 見出し
```
# H1タグ
## H2タグ
### H3タグ
```
このように文字の前に#を書くことで以下のように⇩
# H1タグ
## H2タグ
### H3タグ

このように見出しの表示になります。

## 4 Emphasis / Strong Emphasis - 強調・強勢

\*italic type*

\*\*太字*\*

このようにそれぞれ*と**で囲むことで、、、

*italic type*
**太字**

このようにそれぞれイタリック体と太字になります。


## 5 Strikethrough - 打ち消し線

\~~打ち消し~~
このように~~で要素を囲むことによって
 ~~打ち消し~~
このような文字の上に線が入った表示になります。

## 6Details - 折りたたみ
 
 `<details></details>`で囲むと詳細を中に格納できます。
 <details><summary>折りたたみ</summary>
Hello World
</details>

## 7 Note - 補足説明
`:::note {info or warn or alert}`

`:::`
の中に文字を書くと目を引くような背景が設定されます
infoの場合⇩

:::note 
インフォメーション
:::
warnの場合⇩

:::note warn
警告

:::
alertの場合⇩

:::note alert
強い警告
:::

## 8 Bullet List - 順序なしリスト
文頭に* + -のいずれかを入れてスペースを開けると以下のようにリストが作成できます。

- リスト
- リスト
- リスト


## 9 Ordered List - 番号付きリスト

文頭に数字.（例：1.）を入れてスペースを開けると番号付きリストになります

1. リスト1
1. リスト2
1. リスト3

## 10 Description List - 説明リスト
```
<dl>
  <dt>ぶどう</dt>
  <dd>紫色のフルーツ</dd>
  <dt>キウイ</dt>
  <dd>緑色のフルーツ</dd>
</dl>
```
こんな感じでHTMLの<dl>タグをそのまま使うことによって、、、


<dl>
  <dt>ぶどう</dt>
  <dd>紫色のフルーツ</dd>
  <dt>キウイ</dt>
  <dd>緑色のフルーツ</dd>
</dl>

こんな感じで説明リストを表現できます。


## 11Checkbox - チェックボックス
```
- [ ] タスク1
- [ ] タスク2
```
このような書き方をすることで、、、
- [ ] タスク1
- [ ] タスク2


このようにチェックボックスが表示されます
## 12Blockquotes - 引用
```
> 文頭に>を置くことで引用になります。
> 複数行にまたがる場合、改行のたびにこの記号を置く必要があります。
> **引用の上下にはリストと同じく空行がないと正しく表示されません**
> 引用の中に別のMarkdownを使用することも可能です。
> > 引用のネストもできます。
```
> 文頭に>を置くことで引用になります。
> 複数行にまたがる場合、改行のたびにこの記号を置く必要があります。
> **引用の上下にはリストと同じく空行がないと正しく表示されません**
> 引用の中に別のMarkdownを使用することも可能です。
> 
> > これはネストされた引用です。

## 13Horizontal rules - 水平線
以下の文字は全て水平線が表示されるものになります。
```
* * *
***
*****
- - -
---------------------------------------
```

## 14 Links - リンク
```
[shugo1125のQiita](https://qiita.com/shugo1125 "Qiita Home")
```
このように記述することによって、、、
[shugo1125のQiita](https://qiita.com/shugo1125 "Qiita Home")

上記のように文字列に指定したリンク(https://qiita.com/shugo1125 "Qiita Home")が設定されます。
## 15 Images - 画像埋め込み
```
![Qiita](https://qiita-image-store.s3.amazonaws.com/0/45617/015bd058-7ea0-e6a5-b9cb-36a4fb38e59c.png "Qiita")
```

このように記入することで、、、

![Qiita](https://qiita-image-store.s3.amazonaws.com/0/45617/015bd058-7ea0-e6a5-b9cb-36a4fb38e59c.png "Qiita")
このように画像として表示されます！
kube‑scheduler‑simulatorで、Kubernetesのスケジューラを「目で見る」時代が来た

## はじめに ― なぜシミュレータが必要なのか？

Kubernetes の **kube‑scheduler** は Pod をどのノードへ配置するかを決めるコントロールプレーンの要（かなめ）です。ところがスケジューラ内部は複数のプラグインが連携するブラックボックスになりがちで、

- **PodAffinity / TopologySpread などの制約が本当に効いているか分からない**  
- **カスタムプラグインを入れ替えても挙動をテストしづらい**  
- **本番クラスターと同規模の負荷を安全に再現できない**

といった悩みが絶えません。そこで登場したのが **[kube‑scheduler‑simulator]()** です。GSoC 2021 で生まれ、現在は SIG Scheduling が中心となって開発が続いています。

![](https://kubernetes.io/images/blog/2025-04-07-kube-scheduler-simulator/simulator.png)

---

## kube‑scheduler‑simulator とは？

- **スケジューラの「決定理由」を Pod のアノテーションで可視化**  
- **Web UI でフィルタ／スコア各プラグインの結果を一覧表示**  
- **Docker だけでローカル起動。Kubernetes クラスター不要**  
- **KWOK を用いたフェイククラスター上で動作し、大量リソースを高速に生成可能**  
- **実クラスターのリソースを一括・継続的にインポートし、本番同等の環境を安全に再現**  

これらの機能により「ミスを本番で知る」悪夢を防ぎつつ、スケジューラ開発者だけでなく一般ユーザーも気軽に検証できます。

---

## アーキテクチャと動作フロー

1. **Simulator サーバー**  
   - HTTP API と Web UI を提供  
2. **Debuggable Scheduler**  
   - 通常の kube‑scheduler を拡張し、各プラグイン結果を記録  
3. **KWOK（Kubernetes WithOut Kubelet）**  
   - etcd／kube‑apiserver／controller‑manager を軽量起動し、フェイクリソースを即時反映  
4. **ユーザー操作**  
   1. `kubectl` / Web UI で Pod を作成  
   2. スケジューラが Filter → Score → Bind を実行  
   3. 各段階の結果が Pod アノテーションに追加  
   4. Web UI が結果を表・グラフで可視化  

この一連の流れは公式 *how‑it‑works* ドキュメントでも詳しく説明されています。  

---

## かんたんセットアップ

```bash
git clone https://github.com/kubernetes-sigs/kube-scheduler-simulator.git
cd kube-scheduler-simulator
make docker_up        # 依存イメージを取得して全コンポーネントを起動
```

ブラウザで <http://localhost:3000> を開けば準備完了！ YAML エディタで Node / Pod / Deployment などを作成し、右ペインでスケジューリング結果を確認できます。  

---

## ハンズオン：TopologySpread の検証例

1. **Node を 3 台作成**（ラベル `zone=A/B/C`）  
2. **ReplicaSet で 6 Pod を作成**。`topologySpreadConstraints` で `maxSkew: 1` を指定  
3. Web UI の *Result* タブを見ると、`PodTopologySpread` プラグインが **passed** と判定し、各ゾーンに 2‑2‑2 で分散されたことがスコア表に表示されます。  
4. スコア列をクリックすると、各プラグインが付与した点数が色分けで見えるので、Spread の重み付けや他プラグインとのバランスをすぐに把握できます。  

---

## 実クラスターを“まるごと”シミュレートする

β機能の **[Import Cluster Resources](https://github.com/kubernetes-sigs/kube-scheduler-simulator/blob/master/simulator/docs/import-cluster-resources.md?utm_source=chatgpt.com)** を使うと、本番クラスターの API サーバーから

- ① 初回のみ一括インポート  
- ② Cron 的に継続同期  

のどちらかを選択できます。シミュレータ側ではスケジューラだけを置き換え、既存 workload へ影響を与えずに将来の設定変更やバージョンアップを検証できます。

---

## 主なユースケース

| 役割 | 具体的な使い道 |
|------|---------------|
| クラスター利用者 | Affinity / Spread / Taints が期待通りか確認 |
| クラスター管理者 | 新しい `kube-scheduler` Config や FeatureGate の影響評価 |
| プラグイン開発者 | カスタムプラグイン／Extender のデバッグと CI 統合 |
| SRE / 教育担当 | スケジューラ内部アルゴリズムの教材、障害再現 |

---

## Tips と現在の制限

- **Controller が最小限**  
  - ReplicaSet など一部コントローラは存在しないため、Pod 以外の高位リソースは自動展開されません。必要に応じて手動で Pod を生成してください。  
- **通信先がローカルのみ**  
  - デフォルト compose は `localhost` 前提。リモートで動かす場合は `.env` や `compose.yml` のポートを調整します。  
- **アノテーション仕様が変わる場合あり**  
  - 2024 年 11 月の v0.4.0 で名前空間が `scheduler-simulator/*` → `kube-scheduler-simulator.sigs.k8s.io/*` に変更されました。解析ツールを書く際は注意しましょう。

---

## まとめ

kube‑scheduler‑simulator は

1. **スケジューラの不透明さを解消**  
2. **テスト容易性と本番同等の再現性を提供**  
3. **初心者からプラグイン開発者まで幅広く役立つ**  

という三拍子そろったツールです。`make docker_up` で数分あれば試せますので、ぜひ一度 **“目に見えるスケジューリング”** を体験してみてください。
Oracle Cloud　メモ6

「Embedded Expertise（エンベデッド・エキスパティーズ）」
Oracleが提供するクラウドやエンタープライズ向けサービスにおいて、ベストプラクティスに基づいた専門知識や自動化された推奨事項を、サービスに“埋め込んだ（Embedded）形”で提供する仕組みです。
「Embedded Expertise」自体はOracleの用語ですが、同じような考え方や機能はAWSやAzureにも存在します。それぞれ


Oracle Cloud Guardには、ディテクタ・レシピ
「ディテクタ・レシピ（Detector Recipe）」は、Cloud Guard における 検出ルールのセット です。
簡単に言えば、「どんな行動や状態をリスクとして検出するかをまとめたレシピ（レシピ＝設定集）」です。

2種類のディテクタ
Cloud Guard では、用途に応じて以下の2種類のディテクタが用意されています。


ディテクタ種別	説明	例
アクティビティ・ディテクタ（Activity Detector）	OCI上のユーザーやサービスのアクションを監視	不審なAPIコール、深夜のログイン
構成ディテクタ（Configuration Detector）	リソースの設定や構成の問題を監視	パブリックアクセス可能なバケット、暗号化されていないボリューム


ディテクタ・レシピの構成
ディテクタ・レシピは、以下のような要素で構成されます：
項目	説明
レシピ名	どのような目的のレシピか（例：セキュリティベースライン、カスタムポリシー）
ディテクタ・ルールの一覧	各ルールが何を検出するかの設定（有効/無効、重大度、検出条件など）
カスタマイズ	OCIの使用状況に応じて、ルールの有効/無効や重大度を調整可能
タイプ	Oracle提供の「管理レシピ（Managed）」と、コピーして自分で調整できる「ユーザー定義レシピ（User-defined）」がある



構成ディテクタ・ルールの中身
たとえば、以下のようなルールが含まれています：
ルール名	内容	初期設定
Bucket is publicly accessible	オブジェクトストレージバケットが公開設定になっていないか	有効（高）
Compute instance boot volume is not encrypted	コンピュートインスタンスの起動ボリュームが暗号化されていない	有効（中）
IAM policy allows broad access	IAMポリシーが過剰な権限を許可している	有効（高）


タイプ	説明	主な対象
アクティビティ・ディテクタ	OCIで発生するイベント（操作・API呼び出しなど）を監視	CloudTrailのような監査ログ、ユーザー行動など
構成ディテクタ	リソースの設定・構成ミスを監視	バケットの公開設定、暗号化の有無、IAM設定など



Oracle Cloud Guardの脅威ディテクタ・レシピ
「脅威ディテクタ」という専用カテゴリは公式には定義されていませんが、「アクティビティ・ディテクタ（Activity Detector）」が脅威の検出を主に担っており、それが脅威ディテクタ・レシピとして機能しています。

主な目的
悪意ある操作や異常行動の検出
内部脅威（Insider Threat）の識別
不正アクセスや不審なリージョン・IPからの利用
重大権限を持つユーザーの不適切利用

まとめ：Cloud Guardの「脅威ディテクタ・レシピ」
項目	内容
対象	異常なアクティビティ（脅威行動）
ルール例	不審ログイン、ポリシー改ざん、Root操作など
主な機能	検出 + 通知 + 自動対応（Responderとの連携）
カスタマイズ	有効化、重大度、スコープ、ユーザー定義レシピ
利用価値	内部・外部のセキュリティ脅威に早期対応可能


インスタンス・セキュリティ・レシピ
OCIのComputeインスタンスに対するセキュリティリスクを検出するための構成ディテクタ・レシピです。

これにより、以下のようなリスクやミス設定を自動で検出できます：
暗号化されていないブートボリューム
公開ネットワークに接続されたインスタンス
過剰な権限を持つIAM設定
インスタンス構成の不一致やセキュリティグループの問題

カスタマイズ可能な項目
設定項目	説明
有効/無効の切り替え	不要なルールは無効にできる
重大度（High/Medium/Low）	自社の基準に合わせて重要度を変更可能
通知設定	脅威検出時にアラート通知を設定可能（例：メール、Slack、Oracle Events）
Responderとの連携	自動でNSG追加、公開設定の解除などのアクションを設定可能


まとめ：インスタンス・セキュリティ・レシピ
項目	内容
対象	OCIのComputeインスタンスおよび関連リソース（NSG、Block Volumeなど）
タイプ	構成ディテクタ・レシピ
主な機能	セキュリティ設定ミスの検出（暗号化、公開設定、NSGなど）
カスタマイズ	ルールの有効/無効、重大度変更、Responder連携など
利用シーン	クラウドガバナンス、セキュリティ自動化、ゼロトラスト実現など




CSPM（Cloud Security Posture Management）
クラウド環境におけるセキュリティの「姿勢（ポスチャー）」＝構成や設定の健全性を評価・維持するための仕組みです。

OCIにおいては、以下のようなサービスや機能群を通じてCSPMが実現されています：

🔧 OCIでCSPMを担う主なコンポーネント

機能 / サービス	内容
Cloud Guard	セキュリティリスクを検出し、対応まで自動化する中心的存在（CSPMの核）
Security Zones	セキュリティポリシーを強制し、安全なリソース作成を保証
IAM & Policies	最小権限の原則に基づいたアクセス制御を実現
Audit Logs	あらゆる操作を記録し、後から追跡可能に
Configuration Detection	OCIリソースのセキュリティ設定を継続的に評価（例：公開バケット検出など）
【Rails】 load_defaults ってなんぞや 【初心者にも分かりやすく】

## はじめに
アプリの設定ファイルを見ていて `config/application.rb` に以下のような記述が出てきました。

```application.rb
config.load_defaults X.Y
```

この `load_defaults` が何をしているのか分からなかったため、調べてまとめてみました。

この記事では、`load_defaults` の正体や、Railsのバージョン指定との違いについて、初心者の方にもわかりやすく解説していきます！


## load_defaults とは
>config.load_defaultsはターゲットバージョンとそれ以前のすべてのバージョンのデフォルトの設定値を読み込みます。
ref: [3.1 Railsバージョンごとのデフォルト値](https://railsguides.jp/configuring.html)

誤解を恐れずに、ざっくりいうと `load_defaults` は **「Rails がバージョンアップで変わった設定を、自分で選んで使えるようにするためのスイッチ」** です。


## load_defaults の指定バージョンと gem での指定バージョンの違い
以前自分が混乱していたのは、この二つのバージョンば **なぜ一致しないのか** 
という点で、混乱していました。

```rb:Gemfile
gem 'rails', 'x.y.z'
```

```application.rb
config.load_defaults X.Y

```

しかしこの二つは、全く別の意味を持っています。


|指定方法	|意味|
|---|---|
gem 'rails'	|Rails本体のバージョン。つまり、使える機能（クラスやメソッド）のバージョン
config.load_defaults|	デフォルト設定のバージョン。つまり、Railsが用意している設定値の基準となるバージョン

### なぜ分かれている？

Ruby on Rails では いきなり設定まで全部変えるとアプリが壊れるリスクがあるため、
**設定の切り替えは開発者が明示的に行う設計** になっています。

例えば、Rails 8 を使っていても、 `load_defaults 7.2` であれば、 **Rails 7.2までの設定でアプリが動く**ということになります。


### 注意点・補足
`load_defaults` に将来のバージョンを指定すること（例：Rails 7 で `load_defaults 8.0`）はできません。
これは、 `load_defaults` は あらかじめ定義された設定しか読み込めないからです。

詳しくどうなってるかみたい方は以下で実際にコードを見てください。
また、`new_framework_defaults_x_y.rb` を使用することで段階的なアップデートが可能です。

https://github.com/rails/rails/blob/main/railties/lib/rails/application/configuration.rb


## おわりに
Rails のバージョンアップはコードだけでなく設定にも注意が必要です。  
`load_defaults` や `new_framework_defaults_x_y.rb` を理解しておくと、より安全・スムーズにアップデートできます。

将来的に `config.load_defaults` を変更する前に、新しい設定項目を個別に確認・適用して、テストが通ることを確認する運用がオススメです。

## 参考文献
https://api.rubyonrails.org/v8.0/classes/Rails/Application/Configuration.html#method-i-load_defaults

https://railsguides.jp/configuring.html

https://qiita.com/jnchito/items/cce3b2795e1c66735310
SageMathで数独を解こう

# はじめに
皆様は数独を知っていますか．よく新聞とか雑誌に問題がのっていますね．私は，数独は好きなのですが，どうも苦手で解けないこともしばしばあります．しかしながら，$\texttt{SageMath}$という言語を使えば一瞬で解けてしまうそうです．それでは，$\texttt{SageMath}$を使って数独を解いてみましょう．

# SageMathのインストール
まずは，$\texttt{SageMath}$が入ってなければ仕方ありません．そこで，まずインストールの方法を紹介します．
オンラインでインストールすることなく$\texttt{SageMath}$を動かすことができる[Sage Cell Server](https://sagecell.sagemath.org/)というサイトもありますので，もうインストールしているよという方や，インストールなんてしたくないという方は，[Sage Cell Server](https://sagecell.sagemath.org/)を使うと便利です．

```bash: SageMathのインストール
$ sudo apt install sagemath
```

# 数独を解いてみる

wikipediaの[数独](https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC)のページの例題で解いてみましょう．

```python: sudoku.sage
# 空白は0にして行列の形式で数独を表現する
A = matrix(ZZ, [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0 ,0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
])

# Sudoku関数で数独形式に変換
A = Sudoku(A)

# next(A.solve())で数独を解くことができる
A = next(A.solve())

print(A)
```

これを実行すると以下のようになります．

```bash
$ time sage sudoku.sage
+-----+-----+-----+
|5 3 4|6 7 8|9 1 2|
|6 7 2|1 9 5|3 4 8|
|1 9 8|3 4 2|5 6 7|
+-----+-----+-----+
|8 5 9|7 6 1|4 2 3|
|4 2 6|8 5 3|7 9 1|
|7 1 3|9 2 4|8 5 6|
+-----+-----+-----+
|9 6 1|5 3 7|2 8 4|
|2 8 7|4 1 9|6 3 5|
|3 4 5|2 8 6|1 7 9|
+-----+-----+-----+

real    0m0.912s
user    0m0.731s
sys     0m0.083s
```

何と，一秒未満で数独を解くことができました．

# 標準入力から問題を入力しやすくする

```python: sudoku2.sage
def main():
    A = matrix(ZZ, 9, 9)

    # 標準入力から数独を取得
    for i in xsrange(9):
        string = input()
        for j in xsrange(len(string)):
            if string[j] == '0' or string[j] == ' ':
                A[i, j] = 0
            else:
                A[i, j] = ZZ(string[j])

    # Sudoku関数で数独形式に変換
    A = Sudoku(A)

    # 数独を解いて行列形式に変換
    print(next(A.solve()))

if __name__ == '__main__':
    main()
```

先ほどと同じ例を解かせてみましょう．

```bash: 標準入力
53  7    
6  195   
 98    6 
8   6   3
4  8 3  1
7   2   6
 6    28 
   419  5
    8  79
```

```bash: 出力結果
+-----+-----+-----+
|5 3 4|6 7 8|9 1 2|
|6 7 2|1 9 5|3 4 8|
|1 9 8|3 4 2|5 6 7|
+-----+-----+-----+
|8 5 9|7 6 1|4 2 3|
|4 2 6|8 5 3|7 9 1|
|7 1 3|9 2 4|8 5 6|
+-----+-----+-----+
|9 6 1|5 3 7|2 8 4|
|2 8 7|4 1 9|6 3 5|
|3 4 5|2 8 6|1 7 9|
+-----+-----+-----+

```

また，AtCoderのコードテストで実行させたのですが，実行時間は736msと，2秒は下回っていました．なので，もし数独の問題がでたらめちゃくちゃ楽ができそうです（出力の形式は適宜整える必要がありますが）．
![{4090577F-1CF0-4AF7-933B-6DC897AB4A28}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734379/554bcb06-4e7a-4a3f-8351-eb3143082384.png)
命令

## 一:linux
#### 1.文件与目录操作
pwd:查看当前路径
ls：列出当前目录下的所有文件（包括目录）
ls -l:列出文件的详细属性
ls -a:显示隐藏文件
ls -la:显示所有文件及其属性
cd 目录名.后缀：进入指定目录
cd .. ：返回上一级目录
touch 文件名：创建空文件
mkdir 文件夹名：创建目录
rm 文件名：删除文件
rm -r 文件夹名：删除目录及其内容
cp 原文件 目标文件：复制文件
mv 原路径 目标路径：移动或重命名文件或目录
chmod +x 文件：给文件添加执行权限（常用于shell脚本）
#### 2.文件查看与编辑
cat 文件名：查看文件内容（可用tab补全）
head 文件名：查看文件前几行（默认前10行）
head lines=2 文件名：查看前两行内容
tail 文件名：查看文件最后几行（默认后10行）
less 文件名：分页查看文件可滚动
vim 文件名：使用Vim编辑文件，i进入编辑，Esc退出编辑，:wq保存退出
echo 内容：打印内容
#### 3.系统与查找
ps -ef：查看当前所有进程
top：实时查看系统资源使用情况
grep "关键字" 文件：搜索文件中包含关键字的行
find 路径 -name 文件名：查找指定路径下的文件
df -h：查看磁盘空间使用情况
du -sh 目录名：查看目录大小
## 二:git
#### 1.初始化与克隆
①新建本地仓库 git init
②克隆远程仓库 git clone 仓库地址
#### 2. 添加提交
①添加所有修改文件到暂存区 git add .
②提交暂存区内容 git commit -m "提交的信息"
#### 3.推送与拉取
①推送到远程仓库 git push
②拉取并合并远程代码 git pull
#### 4.分支
①查看本地分支 git branch
②创建分支 git branch 分支名
③切换分支 git checkout 分支名
④创建并切换分支 git checkout -b 分支名
⑤合并指定分支到当前分支 git merge 分支名
⑥删除分支 git branch -d 分支名
#### 5.其他命令
①将文件从暂存区移除 git reset HEAD 文件名
②将当前分支变基到目标分支 git rebase 分支名
③给当前提交打标签（发布版本用） git tag 版本号
数学学びなおし

分析手法を多く学んで、そのCodeを回して出力結果を理解することを優先した方が目先の業務や短期的に目に見えた成果を味わうという意味では良いことだと思います。

やはりその背景や成り立ち、そして自分でアレンジを加えられるようになるには数学の知識が必要だと思いました。自分は数学が好きだし興味があるのですが、中学生の時に数学の偏差値を伸ばせずに文系に進みました。

もう一度数学を学びなおすために、まずは中学数学の学びなおしに取り組み始めました。

大阪府のホームページにワークブック「中学数学」を見つけました。

https://www.pref.osaka.lg.jp/o180080/shochugakko/shidou/workbookchusuu.html

進学校に進みたいとか大学に入りなおしたいというわけではないので、基礎の基礎を振り返るには取り組みやすい分量です。

同じ境遇の方、あるいはこの境遇を抜け出してデータサイエンティストになられた方、是非コメントやアドバイスをお願いします。

次のレベルに到達することを目指します。
・数式の意味を理解する
・論文を理解できる
・自分でモデルを修正もしくは新規に作成できる
React × Firebase で体調記録アプリを自作してみた話（Health Log App）

導入文：

業務とは関係ないのですが、
自分の体調変化を記録・分析したくて、小さなログアプリをReactで開発しました。
備忘録も兼ねて構成・工夫点・苦戦ポイントをまとめます。

⸻

技術スタック：
	•	フロント：React + TypeScript（CRA）
	•	バックエンド：Firebase Firestore
	•	デプロイ：Vercel
	•	UI：React Calendar、CSS-in-JS（style要素にまとめ）

⸻

実装のポイント：
	•	FirestoreへのCRUD（保存・削除・更新）を自作関数でまとめて管理
	•	localStorageも併用し、即時性と永続性をバランスよく
	•	カレンダーで日付ごとにフィルター
	•	Markdown形式に変換してワンクリックコピー
	•	prefers-color-scheme でダークモード対応

⸻

![screenshot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865266/2eec70de-56c1-44c0-8152-227186e74425.png)
![screenshot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865266/4c13e626-9e1f-4800-8012-94f19a3be675.png)


⸻

まとめ：

「体調記録」ってすぐ忘れる。でも記録があると病院でも説明しやすいし、自分の振り返りにも便利。
React × Firebaseでここまで作れるという参考にもなれば嬉しいです。

⸻
Python + OpenCV + PyQt5 で簡単GUI画像処理ツールを作ってみた（VisionAgentGUI）


こんにちは、hyeon-marinaです。  
OpenCV を使った画像処理を勉強する中で、「毎回コードを書いて確認するのが大変」と思った経験、ありませんか？

そこで今回は、OpenCVの処理をボタン操作で体験できる**デスクトップ用GUIツール「VisionAgentGUI」**をPythonで作成しました。

---

## 🎯 このツールでできること（一部）

| 機能 | 内容 |
|------|------|
| オリム（GrabCut） | マウスで塗る → 前景抽出 |
| 標識認識 | SIFTで標識画像を検出（子供・高齢者など） |
| パノラマ合成 | 動画からフレーム収集 → スティッチング |
| 特殊効果 | カートゥーン、スケッチ、油絵風などの画像変換 |

---

## 🛠 使用技術

- Python 3.8+
- PyQt5
- OpenCV (`opencv-python`, `opencv-contrib-python`)
- NumPy
- winsound（警告音用・Windows環境限定）

---

## 🧩 コード例：特殊効果の選択処理

```python
def apply_selected_effect(self):
    if not hasattr(self, 'img') or self.img is None:
        return
    i = self.effect_combo.currentIndex()
    if i == 0:
        self.emboss_function()
    elif i == 1:
        self.cartoon_function()
    elif i == 2 or i == 3:
        self.sketch_function()
    elif i == 4:
        self.oil_function()
```

- OpenCVの`stylization`（カートゥーン）、`pencilSketch`、`xphoto.oilPainting`などをボタン操作で実行可能。
- PyQt5の`QComboBox`を使って切り替えています。

---

## 📝 製作の背景・目的

- コンピュータビジョンの授業で学んだ内容を実装として定着させたかった
- コマンドライン操作に頼らず、**直感的に効果を試せる環境**を作りたかった
- 新卒ポートフォリオとしても提出できる形を目指した

---

## 📦 Link

GitHubにて公開中（READMEは日本語対応）👇  
👉 https://github.com/hyeon-marina/Computer-Vision-Class-2025/tree/main/VisionAgentGUI

Zennにて公開中 👇  
👉 https://zenn.dev/hyeon_marina247/articles/d6378ba57ad9f3

---

## 🙋‍♀️ 作者について

韓国の大学で人工知能とソフトウェア工学を専攻しています（2027年卒予定）。  
日本のAI系企業への新卒就職を目指して、技術記事や開発記録をZenn・Qiitaに投稿中です。

---

## ✅ 最後に

- Windows環境で動作確認済み
- スクリーンショット・GIFなどはGitHubで順次追加予定
- PyQt × OpenCVでGUIを作ってみたい方、ぜひ参考になれば嬉しいです！

ご質問・フィードバックもお待ちしています🙌
CloudFrontではサブドメインを1つのディストリビューションにまとめられない？その理由と回避策

# CloudFrontではサブドメインを1つのディストリビューションにまとめられない？その理由と回避策

AWS CloudFrontを使って複数のサブドメイン（例: `api.example.com`, `static.example.com`, `cdn.example.com`）をCDN配信しようとしたときに、こんなことを思ったことはありませんか？

> 「全部1つのCloudFrontディストリビューションにまとめたい！」

しかし、実際には**CloudFrontでは複数のオリジンに対して同じサブドメイン構造をまとめるのが難しい**場面があります。本記事ではその理由と、回避策について解説します。

---

## 💡 問題の概要

CloudFrontの設定で、1つのディストリビューションに複数の**オリジン**（例えばS3やALB）を登録し、**ビヘイビア**（パスベース）で振り分けることは可能です。

```text
example.com/api/*     → オリジンA（APIサーバ）
example.com/static/*  → オリジンB（S3静的サイト）
```

一方、次のように**異なるサブドメインごとに振り分ける**ことはCloudFront単体では直接できません。

```text
api.example.com     → オリジンA（APIサーバ）
static.example.com  → オリジンB（S3静的サイト）
```

CloudFrontの1つのディストリビューションに割り当てられる **Alternate Domain Names (CNAMEs)** には、複数のサブドメインを指定できますが、**ルーティングをドメイン名ベースで制御する仕組みが存在しません**。

---

## ❌ なぜできないのか？

CloudFrontの**ビヘイビアの条件分岐は「パス単位」**であり、**ホスト名（サブドメイン）単位では分岐できない**という制限があるためです。

つまり、CloudFrontのルーティングの流れは以下の通り：

1. DNS（例：Route 53）で `api.example.com` も `static.example.com` も **同じCloudFrontディストリビューション** に向ける
2. CloudFrontは来たリクエストの **パス部分** を見てオリジンに振り分ける
3. `Hostヘッダ（サブドメイン）` による分岐は **できない**

---

## ✅ 回避策

### 1. **Lambda@Edge** で Hostヘッダを見て動的にオリジンを切り替える

CloudFront + Lambda@Edge を使うことで、**Hostヘッダ（=サブドメイン）ごとに処理を分岐**することが可能です。

```javascript
exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  const host = headers.host[0].value;

  if (host === 'api.example.com') {
    request.origin = {
      custom: {
        domainName: 'api.internal.example.com',
        port: 443,
        protocol: 'https',
        path: '',
        sslProtocols: ['TLSv1.2'],
        readTimeout: 5,
        keepaliveTimeout: 5,
        customHeaders: {},
      },
    };
  } else if (host === 'static.example.com') {
    request.origin = {
      s3: {
        domainName: 'static-bucket.s3.amazonaws.com',
        region: 'us-east-1',
        authMethod: 'none',
        path: '',
        customHeaders: {},
      },
    };
  }

  return request;
};
```

ただし、Lambda@Edge には以下のような注意点があります：

- デプロイがやや面倒（リージョン：`us-east-1`）
- デバッグがしづらい
- レイテンシが増える可能性あり
- コストが追加される

---

### 2. **CloudFrontディストリビューションをサブドメインごとに分ける**

最もシンプルで安定する方法は、**CloudFrontディストリビューションを分けること**です。

| サブドメイン           | CloudFrontディストリビューション     | オリジン |
|----------------------|------------------------------|---------|
| `api.example.com`    | `d1111111abcdef8.cloudfront.net` | API用 |
| `static.example.com` | `d2222222bcdef9.cloudfront.net` | S3用  |

この方法は設定が明快で、CloudFrontの機能に制限されずに構成できます。

---

## 🔚 まとめ

| 項目 | 内容 |
|------|------|
| ✅ CloudFrontでのパス単位ルーティング | 可能 |
| ❌ サブドメインごとのルーティング | 不可（ビヘイビアでは） |
| 🔁 Lambda@Edgeで回避 | 可能だが複雑 |
| 🎯 ディストリビューション分割 | 安定・おすすめ |

---

## 📝 おわりに

「CloudFrontで複数のサブドメインを1つにまとめたい！」というアイデアは理にかなっていますが、現時点ではそのまま実現するには制限があります。

CloudFrontは**パスルーティングは得意**ですが、**ホスト名ベースのルーティングは苦手**という点を覚えておくと、構成を設計するときに役立つはずです。
デザインパターンの学び：関心の分離と依存性の注入

## はじめに

オブジェクト指向設計で出てくる「関心の分離」「依存性の注入」「生成パターン」の関係性を整理します。

この3つの考え方は密接に関連していて、特に**クラス設計やインスタンス生成**の場面で重要な役割を果たします。

この記事では、それらのつながりと背景、そしてなぜそれが必要になるのかを、整理してみました。

---

## 関心の分離とは？

「関心の分離」とは、**1つのクラスは1つの責任に集中すべき**という原則。

たとえば、以下のような状況。

- クラスAの中で、クラスBやクラスCなどの依存オブジェクトを自分でnewしている
- 外からみると、クラスAの依存先がわかりにくい
- 将来、依存オブジェクトの構成や設定が変わると、Aの実装まで変更が必要になる

こうした「作る」と「使う」が混在している状態は、柔軟性が低く、修正やテストに弱い構造。

---

## 依存性の注入（DI）とは？

そこで登場するのが**依存性の注入（DI）**。

> クラスが必要なオブジェクト（依存）を、自分で作らずに外から渡してもらう設計方法。特に「状態としてクラス内で保持して何度も使うような依存」に対して使われる。
> 

### 例：

```php
class UserController {
    private UserService $service;

    public function __construct(UserService $service) {
        $this->service = $service;
    }

    public function store(Request $request) {
        // UserService を使ってユーザーを登録する
        $this->service->createUser($request);
    }
}
```

UserController は UserService を「使う」けれど「作る」責任は持たない。

### メリット

- 使うクラスが「作り方」から解放される（関心の分離）
- テスト時に依存をモックなどに差し替えられる
- 依存オブジェクトの作り方が変わっても、使う側を修正しなくてよい

### デメリット

- 呼び出し元が依存をすべて組み立てる必要があり、複雑になることがある。

---

## 生成パターンとは？

依存性の注入を使うことで、クラス同士の結びつきはゆるくできるが、

代わりに「その依存オブジェクトをどう作るか？」という新しい問題が生まれる。

たとえば、UserService を使いたいときに、UserRepository や Logger を先に用意する必要があり、さらに UserRepository の内部でも DB接続などの依存がある場合、その「作る処理」自体が複雑になってしまいます。

その問題を解決するために使われるのが、**生成パターン（Factory や Builder など）** 。

### 目的

- 複雑な生成処理を別クラスに切り出して管理する
- 作り方が変わっても、使う側のコードはそのまま

### 例：

```php
class UserServiceFactory {
    public static function create(): UserService {
        $config = new Config(...);
        $db = new DatabaseConnection($config);
        $repo = new UserRepository($db);
        $logger = new Logger();
        return new UserService($repo, $logger);
    }
}
```
Ubuntu 24.04でSeleniumのOptionから--single-processを除くと動いた

# 概要

- Ubuntuを24.04にアップグレードしたところ、今まで動いていたSeleniumを使ったPythonスクリプトが動かなくなったので、試行錯誤の結果、SeleniumのOptionの`--single-process`を除くと動いた、という話です

## 環境

```shell
$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 24.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"

$ google-chrome --version
Google Chrome 135.0.7049.95

$ chromedriver --version
ChromeDriver 135.0.7049.95 (de2eb485a1951079e63bdb57ce25544d2dc79c15-refs/branch-heads/7049@{#1836})
```

```shell
$ python -V
Python 3.11.2

$ pip list
pip                      25.0.1
selenium                 4.31.0
```

## 動いたコード

```python
from selenium import webdriver
from selenium.webdriver import ChromeOptions

options = ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
#options.add_argument("--single-process") # これをつけると、Ubuntu24.02で動かない
options.add_argument("--disable-dev-shm-usage")

url = "http://abehiroshi.la.coocan.jp/"
driver = webdriver.Chrome(options=options)
driver.get(url)

print(driver.title)
driver.quit()

# 実行すると、"阿部寛のホームページ"が返ってくる
```

## 参考資料

- Seleniumユーザーを散々悩ませてきた、「ChromeブラウザのバージョンとChromeDriverのバージョンが合わない問題」について。Selenium4.10以上は、<https://yuki.world/python-selenium-chromedriver-auto-update/>で述べられているように、SeleniumにSelenium ManagerというChromeDriver自動更新機能が追加されたので、この問題に頭を悩ませなくて良くなった。
[スニペット] 正規表現

条件
[ ]（空の角括弧）は除外
[1a2wh3]のように、角括弧の中に何らかの英数字が含まれているパターンの行を抽出
```
grep -E '\[[^]]+[[:alnum:]][^]]*\]' ファイル名
```
 解説：
-E：拡張正規表現（ERE）を使うためのオプション（egrepでも同じ）
\[：リテラルの左角括弧（[）を意味
[^]]+：右角括弧以外の文字を1文字以上 → ] で閉じる前に何かが入っている
[[:alnum:]]：英数字（A-Z, a-z, 0-9）1文字を含む
[^]]*：残りの部分で ] 以外の文字が0文字以上続く
\]：リテラルの右角括弧（]）
eスポーツ同好会新入部員セットアップ

こんにちは。eスポーツ同好会部長の岩元です。
この記事では、eスポーツ同好会の新入部員向けに使うツールのセットアップ方法について説明します。

## 部で使うツール
- [ ] google chrome
- [ ] discord
- [ ] teams
- [ ] google drive
- [ ] qiita

## 各種インストール方法
### google chrome
こちらからインストール

https://www.google.com/intl/ja_jp/chrome/

私用と学校用アカウントでログインしてください
私用アカウントがなければ作成
google driveとの連携が簡単なのでchrome推奨

### discord
こちらからインストール

https://discord.com/

ブラウザ版でもデスクトップでも可
通知音が鳴るためデスクトップ版推奨
私用アカウントでログインしてください

### teams
こちらからインストール

https://www.microsoft.com/ja-jp/microsoft-teams/log-in

顧問の先生とのやり取りに使用
学校生活で使えなかったら積むので必ずインストールしよう
ブラウザ版でも可

### google drive

書類を作るときや資料などは必ずここに集約しよう
ローカルに保存しないため、間違えて消した場合も復元が容易であるし、複数人で同じファイルを編集できる
Wardファイルで作る人がいるが、ドライブへアップロードする時にファイル形式が違い、フォントの書き方が崩れるのでgoogle drive上で編集しよう
google colabを使えばpythonで業務自動化のシステムを組める

#### 使い方
1. google driveにログイン
1. eスポーツ同好会の共有ドライブに移動
1. 20〇〇年度に移動
1. サイドバーの新規から目的別に新しいフォルダを作成
1. 新規からgoogle documentを選択
1. 内容を書き込んだら共有をクリック
1. アクセス権は制限付きでリンクをコピー
1. discordの資料共有に作った資料の概要と一緒に投稿

### Qiita
後輩にレクチャーするためのドキュメントはここに書いていきます

## このツールでの課題
- google documentでメモを書くのが難しい
- google driveでマークダウン書く方法無いかな
【Notion】複数タブが表示されない

## 問題
MacでNotionデスクトップアプリを使用していると，複数タブ機能にバグが発生しました．
正確には，複数タブを開くことはできますが上部にタブが表示されず，選択できない状態になっていました．
(macなら`cmd + opt + ← or →`で移動できt)
また，ヘルプページでキャッシュの削除対応をしても修正できませんでした...

https://www.notion.com/ja/help/reset-notion?g-exp=help_center_redesign_v2--on%2Cmarketing_localization_force_redirect_gate--on%2Cnotion_mail_ga--on&nxtPslug=reset-notion#notion%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88


## 環境
- Mac：M2 14.5
- Notion：4.8.0
- 言語：日本語

## 原因

https://status.notion.so/incidents/b8fbdvdc24tc

上記リンクで報告されている通り，英語以外の設定で発生している問題でした．


## 解決策
最新バージョンである`4.8.7`にアップデートすることで修正できました！
たった3行でCSVをグラフ化！Python最速可視化Tips

# PythonでCSVファイルを一瞬で可視化する最短コード【3行で完結】

「CSVファイルを読み込んで、パッとグラフで見たいだけなんだけど…」  
そんなときに便利な**たった3行**のPythonスクリプトを紹介します。

## 🔧 事前準備

以下のライブラリが必要なので、まだの人はインストールしてください。

```bash
pip install pandas matplotlib
```

## 🚀 最短可視化コード（3行）

```python
import pandas as pd
import matplotlib.pyplot as plt

pd.read_csv("data.csv").plot(); plt.show()
```

これだけで `data.csv` の中身を自動的に可視化してくれます！

## 📊 実行例

`data.csv` がこんな感じだとします：

```csv
date,value
2024-01-01,100
2024-01-02,120
2024-01-03,90
2024-01-04,130
```

実行すると、こんな折れ線グラフが表示されます

![sample graph](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/000000/sample.png)

## 🧠 補足

- デフォルトで数値列が自動で折れ線グラフになります。
- グラフの種類を変えたいときは `.plot(kind="bar")` や `.plot(kind="hist")` などに変更可能です。

## ✅ おすすめの使い方

- 毎日のデータ収集のチェック
- センサーやログデータのざっくり確認
- Jupyter Notebookでの超軽量可視化

---

# まとめ

CSVファイルを一瞬で可視化したいならこれでOK！  
細かい調整は後からで大丈夫。まずは**「見える化」**してから考えよう！

```python
pd.read_csv("data.csv").plot(); plt.show()
```

以上です 🙌
【初心者向け】Pythonで簡単なChatbotを作る

# はじめに
今回は今更ながら初心者の方(私も含む)でも作れる**最もシンプルなChatbot**を作成した備忘録になります。

---

### Chatbotの基本とは？

Chatbotについて簡単におさらいします。

> **「入力（ユーザーの発言）」に対して、**  
> **「決まったルール or ロジック」で返答するプログラム」**

となります。

それでは、最初のステップでは「決まったキーワードに反応するルールベース」のbotを作ります。

---

### 最も簡単なChatbotを作ろう

まずは、決まったパターンに反応するbotです。

```python
def simple_chat():
    print("BOT: こんにちは！何か話しかけてください（終了するには 'bye' と入力）")
    
    while True:
        user_input = input("あなた: ")

        if user_input.lower() == "bye":
            print("BOT: バイバイ！またね。")
            break
        elif "こんにちは" in user_input:
            print("BOT: こんにちは！元気ですか？")
        elif "名前" in user_input:
            print("BOT: 私はPythonで作られたBOTです。")
        elif "天気" in user_input:
            print("BOT: 今日の天気はどうでしょうね？")
        else:
            print("BOT: うーん、よくわかりません…")

simple_chat()
```
### コードのポイント解説
```python
input()
```
ユーザーから入力を受け取ります。
```python
user_input = input("あなた: ")
.lower()
```
大文字・小文字の違いを無視して「bye」と判定できるようにします。
```python
if user_input.lower() == "bye":in
```
文字列の部分一致を使って簡単なキーワード検出をしています。
```python
elif "こんにちは" in user_input:
```
### botをちょっと進化させてみよう
辞書（dict）を使って、発言と返答をセットで管理するようにすれば、見通しの良いコードになります。
```python
def keyword_chat():
    responses = {
        "こんにちは": "こんにちは！元気ですか？",
        "名前": "私はPythonで作られたBOTです。",
        "天気": "今日の天気はどうでしょうね？",
    }

    print("BOT: 話しかけてください（終了するには 'bye'）")

    while True:
        user_input = input("あなた: ")

        if user_input.lower() == "bye":
            print("BOT: バイバイ！またね。")
            break

        response_found = False
        for keyword, reply in responses.items():
            if keyword in user_input:
                print(f"BOT: {reply}")
                response_found = True
                break

        if not response_found:
            print("BOT: ごめんなさい、よくわかりません。")
keyword_chat()
```
この方法なら、条件が多くなっても管理しやすいです！
### さらに進化させるには？

以下のようなステップで本格的なBOTに近づけていけます：
	•	自然言語処理（NLP）ライブラリの活用（例：nltk, spaCy, transformers）
	•	ChatGPT APIとの連携
	•	GUIやWebアプリへの組み込み（Tkinter, Flaskなど）

# まとめ

Chatbotは、最初はシンプルでもOK。
大切なのは、「ユーザーの発言を受け取って、反応する」という基本の流れを理解することです。

私も、もっと精進して本格的なbotを作成したいと思うので、自然言語処理や機械学習にもチャレンジしてみようと思います。
【HTML/CSS備忘録】画像とテキストを横並びにするカードレイアウトの基本構造と実装パターン

# はじめに

本記事は、**HTMLとCSSによるカード型レイアウトの基本構造と実装方法を備忘録としてまとめたもの**です。  
研修で実装した「画像＋テキスト」の2カラムレイアウトを、**実務で再利用できるように整理**しています。

---

# 目的：画像とテキストを左右に並べるカードUIを作成

以下のような構成で、2枚のカードを横に並べ、画面が狭くなると折り返すレイアウトを構築。

- 親要素に対して `flex` を使用し、横並びを実現
- 子要素は左右50%ずつで分割
- レスポンシブ対応のため `flex-wrap: wrap` を使用

---

# 実装構成

## HTML構造（抜粋）

```html
<div class="lessonall-child">
  <div class="lesson">
    <img class="image-icon" src="画像URL">
    <div class="rightcol">
      HTML&CSS
      <div class="lesson">
        <img class="image-icon" src="画像URL">
        <p>HTML&CSS</p>
      </div>
    </div>
  </div>
</div>
```

```css
.lessonall {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}

.lesson {
    width: 100%;
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}

.lessonall-child {
    width: 50%;
}

.image-icon {
    width: 50%;
}

.lesson .rightcol {
    width: 50%;
}
```

![IMG_7786.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/1b6785af-952b-4155-8a71-eae4e7f88100.jpeg)

# ①実装ポイント（要素ごとの整理）
- **1.lessonall**
- flexコンテナ
- 子要素（カード）を横に並べる
- flex-wrap: wrap; により画面サイズに応じて折り返し可能

- **2.lessonall-child**
- カード1枚分の枠
- width: 50% により2枚で1行になる

- **3.lesson**
- カードの中身（画像とテキスト）を並べるためのflexボックス
- 中の .image-icon と .rightcol を左右に並べる

- **4.image-icon**
- カード内の画像
- 横幅は50%で、左側に表示

- **5.rightcol**
- テキストを含む領域
- .image-icon の隣、右側に表示される部分
- 同じく width: 50% で左右均等

# ②実務での応用想定
![IMG_7787.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/92268159-5559-4191-a8e9-82020bbdee45.jpeg)

# ③よくある注意点
- 親要素・子要素のwidth指定が合わないと、横並びが崩れる
- flexにwrapを入れ忘れると、狭い画面でレイアウトが崩れる
- image-iconや.rightcolの幅を個別に調整すると、見た目のバランスが崩れやすい

# ④まとめ
- HTML + CSSでの「画像 + テキストカード型レイアウト」の基本形
- display: flex、width: 50%、flex-wrap: wrapの3点セットで構成
- 実務でも、情報一覧や紹介UIなど、応用できる場面が多いため、再利用しやすい構造として記録
Macでtkinterが使いたい！！

# MacのPython環境でtkinterを使えるようにする

### はじめに
Pythonの勉強をしようと簡単なゲームを開発していたのですが、
GUI作成ライブラリtkinterを使おうとしたところ
```
brew install python-tk
```
でinstallしても使えないという事態が発生。
調べてみたところ
- Macに最初から入っているPython（システムPython）にはTkinterが入っていることが多い。
- でも、自分でpyenvとかHomebrewでPythonをインストールした場合、Tkinterが含まれてないことがある。
- なぜかというと、Tk（Tkinterの土台）が別に必要で、インストール時にそれをリンクしないといけないから。

つまり、**MacでもTkinterは動くけど、環境によっては自分でインストール作業が必要**ってこと！
ってことでこのパソコンでもtkinterが使えるようにしていきましょう。

### 方法
- やり方1: Homebrewで必要なものをインストールする
- やり方2: PythonをTcl/Tkをリンクしてビルドし直す

##### やり方1の場合
```
brew install tcl-tk
```
##### やり方2の場合
もしpyenvでPythonを使っているなら、次のようにインストールし直すとTkinterが入ります
```
env PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/opt/homebrew/opt/tcl-tk/include' --with-tcltk-libs='-L/opt/homebrew/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" pyenv install 3.13.3
```
:::note warn
注意
`3.13.3`はあなたが使ってるバージョンに合わせてね
:::
##### 確認
Pythonを起動して、次のコマンドでエラーが出なければOK
```
import tkinter
tkinter._test()
```
ウィンドウがポンっとひらけば成功！

### tkinterとは(今更)
**tkinterは、Pythonで「画面付きのアプリ」を作るためのツール（ライブラリ）**
たとえば…
- 「スタート」ボタンを押したら始まるゲーム
- ユーザーが文字を入力できるフォーム
- 画像やグラフを表示するアプリ
こういう「ウィンドウ」「ボタン」「入力欄」などがあるアプリを作るための部品をたくさん提供してくれるのがtkinter。
##### tkinterのいいところ
- Pythonだけで簡単に画面付きのアプリが作れる
- インストール不要（標準でついてることが多い） 
- 軽くて動作も速い
##### tkinterはこんな人におすすめ！
- はじめてPythonで画面付きアプリを作ってみたい人
- 簡単なツール（電卓、フォーム、ミニゲーム）を作ってみたい人
- Webじゃなくてデスクトップアプリを作りたい人
### 最後に
今回はちゃんとすぐにエラーの原因を見つけられて無事にゲームを作ることができました。
また後日ゲーム開発のメモを載せようと思います。
ご覧いただきありがとうございました。
Windows の Copy/Paste を Mac と同じ、⌘ + C / V にする

# 確認環境
プロセッサ	Apple Silicon   3.20 GHz  (6 プロセッサ)
実装 RAM	32.0 GB (24.0 GB 使用可能)
システムの種類	64 ビット オペレーティング システム、ARM ベース プロセッサ

エディション	Windows 11 Enterprise
バージョン	24H2
OS ビルド	26100.3907

# 背景
Mac OS 主体で使用していると、コピー＆ペーストは ⌘ + C / V のため、Windows でもこれを使いたくなります。特に、Parallels Desktop で Coherence モード (https://kb.parallels.com/jp/4670/) で使用していると、Mac が表示する Window と Windows が表示する Window はどちらも区別なく、シームレスに使えます。
そんな時、コピー＆ペーストのキー操作が違うことは、ストレスになるため、Windows 側を Mac に合わせます。

# 手順
1. Windows に Microsoft Power Toys (https://apps.microsoft.com/detail/XP89DCGQ3K6VLD?hl=ja&gl=JP&ocid=pdpshare) をインストールします。
1. Keyboard Manager のモジュールが有効になっていなければ、有効にします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971725/835ff510-3c25-4f65-9cc1-80b0a0e3d8c2.png)
1. ショートカットの再マップを開き、必要なマッピングをしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971725/90c736e1-093a-4881-bed6-ba44a70b92dd.png)
なお、再マップを行ったショートカットは、再マップの表示で確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971725/ef89c34f-b403-4f7e-bdc1-7114c7b2f5bf.png)
1. 設定画面を閉じます。

以上で、設定を閉じても Power Toys はバックグラウンドで動作するので、これで Mac と同じショートカットでコピー＆ペースト等が可能となります。
Pythonの基本構文

### Pythonの基本的な構文まとめ
Javaばかり触っていたらPythonの構文を忘れてしまったので、個人用のメモ

#### 1. 変数の代入
```python
x = 10
name = "Alice"
is_active = True
```

#### 2. 条件分岐（if文）
```python
x = 5

if x > 0:
    print("正の数")
elif x == 0:
    print("ゼロ")
else:
    print("負の数")
```
:のあとにインデント（半角スペース4つ）が必要。

elif は else if の略。

#### 3. 繰り返し（for文）
```python
# リストの中身をループ
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# 数値の繰り返し
for i in range(5):  # 0〜4まで
    print(i)
```

#### 4. 関数の定義（def）
```python
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")
```

#### 5. リスト（配列）
```python
numbers = [1, 2, 3, 4]
numbers.append(5)
print(numbers[0])  # インデックスでアクセス（0から始まる）
```

#### 6. 辞書（連想配列）
```python
person = {"name": "Alice", "age": 30}
print(person["name"])

# 値の追加・更新
person["age"] = 31
```

#### 7. while文（条件付きループ）
```python
count = 0
while count < 3:
    print(count)
    count += 1
```

#### 8. コメント
```python
# これは1行コメント

"""
これは
複数行の
コメント
"""
```

#### 9. モジュールのインポート
```python
import math
print(math.sqrt(16))  # 平方根：4.0
```

#### 10. ファイルの読み書き
```python
# 書き込み
with open("test.txt", "w") as f:
    f.write("Hello, world!")

# 読み込み
with open("test.txt", "r") as f:
    content = f.read()
    print(content)
```
(調査中)TortoiseGit でマージを行った場合、コンフリクトがない場合でも自動でコミットされるかどうかは、設定による 

TortoiseGit でマージを行った場合、コンフリクトがない場合でも自動でコミットされるかどうかは、設定による ので注意が必要です。
デフォルトの動作
TortoiseGit のデフォルト設定では、コンフリクトがない場合、自動でコミットされる 仕様になっています。
つまり、マージ後に手動で git commit せずとも、マージコミットが作成される。
コミットをスキップする方法
1. マージ時に「No Fast Forward」にチェックを入れる
TortoiseGit のマージダイアログで、
 「No Fast Forward」 のチェックを外しておくと、自動コミットを回避できる。
2. 「Commit merge immediately」を無効化
設定変更でデフォルト動作を変更可能TortoiseGit → Settings → Merge
「Commit merge immediately if no conflicts（コンフリクトなしなら即コミット）」のチェックを外す
これで、コンフリクトなしのマージ時でも コミットせずにステージング状態 で止めることができる
マージ後に「やっぱり戻したい」場合
もし誤って自動コミットされても、直後ならリセットで戻せる：
git reset --merge ORIG_HEAD
または、
git reset --hard HEAD~1  # 直前のコミットを取り消す
※ --hard を使うと変更が消えるので注意！
まとめ
デフォルト設定では、コンフリクトがなければ自動コミットされる
設定で「Commit merge immediately」をオフにすれば、コミットをスキップ可能
手動で「No Fast Forward」オプションを使えば、マージ後に確認できる
誤ってコミットしたら git reset で戻せる
TortoiseGit でマージする際は、「Commit merge immediately」の設定を確認 しておくとよいですね。
【合格体験記】AWS-SAP資格試験

## 保有資格
・Java-Silver
・LPIC Level2
・AWS-SAA,SOA,DVA,SCS

## 使用した書籍やサイト
・Web問題集：CloudTech（永久会員）

https://kws-cloud-tech.com/

・書籍：AWS認定ソリューションアーキテクト－プロフェッショナル 第2版～試験特性から導き出した演習問題と詳細解説～

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%EF%BC%8D%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E8%A9%A6%E9%A8%93%E7%89%B9%E6%80%A7%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC%EF%BD%9E-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865943978/?_encoding=UTF8&pd_rd_w=hKFFb&content-id=amzn1.sym.bb272e13-1a68-41b0-a370-44a252d487ac&pf_rd_p=bb272e13-1a68-41b0-a370-44a252d487ac&pf_rd_r=356-0302245-2289874&pd_rd_wg=gA9g8&pd_rd_r=77cc85cf-6fdd-4d7a-bddf-64a9f2544886&ref_=aufs_ap_sc_dsk

・AWS BlackBelt動画視聴（特にSAM、DMS、Direct Connect、Organizations）

https://www.youtube.com/@JPAmazonWebServices/playlists

・AWS SkillBuilder無料試験問題（20問）
　AWS Certified Solutions Architect – Professional Official Practice Question Set (SAP-C02 - 日本語)

## 受験までの期間
・約１か月半（１日：約３時間の勉強ペース）

## 試験までの流れ
１．CloudTechのAWS資格演習対策講座のSAPを10問単位で、1~100まで解いてみる。

２．100問解いたら、ブックマーク機能を使用し、間違えた問題を再度解く。

３．１と２の作業を全問題一周するまでやってみる。

４．根本の理解が出来ていないサービスについて、AWS BlackBelt動画視聴

５．書籍 にて、演習問題を解いてみる。

６．CloudTechの演習問題２周目
　（この付近で、10問の回答率が6割超えるようになってくる。）
　CloudTechの演習問題３周目
　（この付近で、10問の回答率が8割超えるようになってくる。）

７．peasonVUEで受験予約

８．AWS SkillBuilder無料試験問題（20問）を解く。

９．cloudtechのランダム問題（75問）を時間計測と回答率の把握のために3回やってみる。

１０．試験

## 本番スコア
801/1000 (合格ライン750点) でした。
一回目の受験で合格することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/ce06d7d0-09d9-4494-9dde-37d3296acb91.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/895a0576-819c-4f55-b362-ad16f0fac9c7.png)

## 受験してみての感想
AWS認定資格の中で最難関と呼ばれているだけの内容だったなぁと感じました。
どの辺が？といいますと、

・試験時間の長さが3時間！（自分は3回トイレに行きました（笑））

・長文の問題が多い！（問われている部分を探すのが大変でした。）

・試験範囲となっているAWSサービスが広い！（問題集の中で複数回出てきたサービスを重点的に理解していき、全部を網羅はしていません（笑））

ただ、私はAWS業務未経験で取得できたので、教材選びや継続して学習していくことが出来れば、合格できるということを強くお伝えしたいです！

私は、AWS資格試験でいつもお世話になっているCloudTechのWeb教材をオススメしているので、これから受験される方の参考にして頂けると幸いです。

https://kws-cloud-tech.com/
高電圧ライターいろいろ

中学生の頃にROMライターを作ろうとしてできなかったので、いろいろ復習しています。

![hivolt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b9c6dcb0-59f5-4172-a6f9-be9ce9b29181.jpeg)

左がEPROMライターです。DC-DCのMC34063で作った21Vが出てます。

下がATTiny85などのリセッターです。12Vが使われています。MAX662を使っています。

右がGALライターです。20Vと12Vを使っています。MAX662を使っています。

真ん中上がHC908のライターです、通常の3.3V FT23モジュールからMC34063で8.2Vを作っています。このFTはいろいろなマイコンのISPになっています。

可変電圧の設定はテスターで図って手動で調整してますが、ポテンショメータのAD5290のようなもので自動的に設定する事もできます。
cscの作法 その580

# 概要
cscの作法、調べてみた。
OpenRCF v2.8、見つけたので、windows11で、MSbuildしてみた。
練習問題やってみた。

# 練習問題
objの文字列から、プリミティブを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8daebed5-c575-4530-b976-7291f116eb08.png)


# サンプルコード

```
	class Obj {
		private float radius = 0.5f;
		private float[][] Vertex = new float[12][];
		private static class BaseVertex {
			public static float[][] Vertex = new float[12][];
			static BaseVertex() {
				string code = @"
v -1 -1 0
v  1 -1 0
v  1  1 0
v -1  1 0
v  0  0 1

f 5 1 2
f 5 2 3
f 5 3 4
f 5 4 1
";
				code = code.Replace("  ", " ");
				string[] lines = code.Split(new string[] {
					"\n"
				}, StringSplitOptions.None);
				int n = 0;
				int t = 0;
				float[,] v = new float[5, 3];
				float[,] f = new float[12, 3];
				for (int i = 0; i < lines.Length; i++)
				{
					string[] spline = lines[i].Split(new string[] {
						" "
					}, StringSplitOptions.None);
					switch (spline[0])
					{
					case "v":
						v[n, 0] = float.Parse(spline[1]);
						v[n, 1] = float.Parse(spline[2]);
						v[n, 2] = float.Parse(spline[3]);
						n++;
					break;
					case "f":
						f[t, 0] = v[int.Parse(spline[1]) - 1, 0];
						f[t, 1] = v[int.Parse(spline[1]) - 1, 1];
						f[t, 2] = v[int.Parse(spline[1]) - 1, 2];
						f[t + 1, 0] = v[int.Parse(spline[2]) - 1, 0];
						f[t + 1, 1] = v[int.Parse(spline[2]) - 1, 1];
						f[t + 1, 2] = v[int.Parse(spline[2]) - 1, 2];
						f[t + 2, 0] = v[int.Parse(spline[3]) - 1, 0];
						f[t + 2, 1] = v[int.Parse(spline[3]) - 1, 1];
						f[t + 2, 2] = v[int.Parse(spline[3]) - 1, 2];
						t = t + 3;
					break;
					default:
					break;
					}
				}
				for (int i = 0; i < 12; i++)
				{
					Vertex[i] = new float[3] { f[i, 2],  f[i, 1], f[i, 0] };
				}
			}
		}
		public Vector Position = new Vector(3);
		public RotationMatrix Rotate = new RotationMatrix();
		public Color Color = new Color();
		public float Size = 0.5f;
		public float Radius {
			get {
				return radius;
			}
			set {
				radius = value;
			}
		}
		public Obj(float size = 0.5f) {
			Size = size;
		}
		public void Draw() {
			VertexUpdate();
			Color.EnableBodyColor();
			DrawVertex(PrimitiveType.Polygon);
		}
		private void DrawVertex(PrimitiveType primitiveType) {
			GL.Begin(primitiveType);
			GL.Normal3(Rotate[0, 2], Rotate[1, 2], Rotate[2, 2]);
			for (int i = 0; i < Vertex.GetLength(0); i++)
			{
				GL.Vertex3(Vertex[i]);
			}
			GL.End();
		}
		private void VertexUpdate() {
			float[] vector = new float[3];
			for (int i = 0; i < Vertex.GetLength(0); i++)
			{
				vector[0] = Size * BaseVertex.Vertex[i][0];
				vector[1] = Size * BaseVertex.Vertex[i][1];
				vector[2] = Size * BaseVertex.Vertex[i][2];
				Vertex[i] = Position.Plus(Rotate * vector);
			}
		}
	}

```

以上。
【MCP×GA4】数値取得依頼に対して　生成AIにGoogle Analytics Data APIとBigQueryを自動で使い分けて対応してもらう

# 背景
以下記事にてGA4データをClaude desktopにて自然言語で取得した。

https://qiita.com/sn-fukui/items/bad6d9cf24a0d06e39ef

続いて、BigQueryにエクスポートしたデータについても同様にClaude desktopにて扱うことを試みる

現場では、GA4探索レポート、Google Analytics Data APIでは分析出来ないものに対してBigQueryを使うという運用がされていることが多いだろう。理由はコスト面だ。
自然言語で問い合わせたことに対して、生成AIがGoogle Analytics Data APIとBigQueryのどちらを使うべきかを判断して結果を返してくれることが理想である。

# 結果
自然言語にて問い合わせを行うと、**Google Analytics Data APIとBigQueryを自動で使い分けて**値を算出してくれた。
しかし、明示的にGoogle Analytics Data APIとBigQueryを使い分けるよう指定する必要があった。

# 使用例
## プロンプト
```
全ての期間にて、
セッション内で離脱する一つ前に行ったイベントのイベント数ランキングを作成して
 Google analytics APIで算出できるならAPIにて行う。もし算出できない場合のみbigqueryを使うようにして  
プロパティは以下です  
XXXXXXXX
bigqueryテーブルは以下です project_id.analytics{property_id}.events*
```
## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/4136a1ef-97d3-4faa-9634-aefe222f8153.png)

# 設定手順
以下URL通りに行えばよい

https://mcp.so/server/mcp-server-google-analytics/eno-graph?tab=content


https://github.com/ergut/mcp-bigquery-server

全体像としては、以下。指示通りに行えば問題ない
- GCPにてAPIやサービスアカウントセットアップ
- Claude desktopの基礎設定
- ローカルにて環境構築
    - 環境変数の設定やビルドなど
    - claude desktopのconfigファイルの記述

## (補足)サービスアカウントへのロール付与
GCP consoleにて

IAM➡プリンシパルとしてサービスアカウントを追加➡ロールを付与
※サービスアカウントというタブにてロールを付与するのかと思ったが違ったため共有する

## 感想とメモ
- クエリの処理量を確認してから実行するようにしたい
    - プロンプトにて明示的に指示してみたがデータ量を表示してはくれなかった
- スキーマを読み取ってくれるのもありがたい
    - テーブル名などを指定しなくてもスキーマを確認した上でクエリを書いてくれる
    - カラムごとの説明を設定しておくと精度が上がりそう
- テーブルスキーマを理解するためのクエリを回すなどを行うので人がBigQueryにて作業を行うときよりもコストはかかりそう
- Claude desktopは有料版だとプロジェクトというものが使えるらしい。これを使うとGA4プロパティIDごとにプロジェクトを分けることが出来る。
    - GA4プロパティやBIgQueryテーブルを明示的にしてせずとも分析を行えそう
issueの書き方と活用術 〜Django環境構築を例に〜

## はじめに

チーム開発や業務で「issueって何を書けばいいの？」と悩んだことはありませんか？
この記事では、**Djangoの環境構築を例に、実務で役立つissueの書き方とその意味**を丁寧に解説します。

## issueとは？

> 一言でいうと「ドキュメント化された作業依頼」。

誰が・いつ・どの環境でやっても同じ成果が出せるように、情報を構造化して記録することが目的です。


## Django環境構築：issueテンプレ例とその意味

### ✅ issue 発行時のチェック事項

作業に入る前に整えておくべき前提条件。発行者が書く部分です。

```markdown
- [ ] リポジトリにアクセスできること（clone可能）
- [ ] Python 3.10 以上が使えること
- [ ] 仮想環境（venv）が作成・有効化できること
- [ ] .env ファイルが共有されていること（必要な場合）
- [ ] mainブランチにpushできる権限・設定があること
```

---

### ✅ 概要・背景

「何をやるのか」「なぜやるのか」をざっくり伝える部分。

```markdown
## 概要
- Djangoプロジェクトの初期構築とrunserverによる起動確認を行う

## 背景
- 環境構築の標準化と再現性を高めるため
```

---

### ✅ 完了条件

何ができれば「完了」と言えるかの基準。

```markdown
- [ ] Djangoのrunserverで開発サーバーが起動する
- [ ] /admin にアクセスし、ログインできる
- [ ] mainブランチにソースコードがpushされている
```

---

### ✅ 仕様（＝Howのルール）

どんな技術・構成で作業を進めるか。ルールや制約。

```markdown
- Python 3.10 / Django 4.2（LTS）
- DBはSQLiteを使用
- 認証はDjango標準のスーパーユーザーで行う
```

---

### ✅ 影響範囲

この作業が影響を及ぼす範囲を明示。

```markdown
- プロジェクト全体の開発基盤
- 今後の機能開発の土台
- settings.py, urls.py などの初期設定ファイル
```

---

### ✅ テスト方法・観点

完了条件をどうやって確認するか。確認手順と視点。

```markdown
- [ ] http://127.0.0.1:8000/ にアクセスしてロケットマークが表示される
- [ ] `python manage.py createsuperuser` で作成したユーザーで /admin にログインできる
- [ ] GitLab/GitHub の main にcommitが反映されている
```

---

### ✅ 実装手順

予定している作業の手順。

```markdown
1. リポジトリをclone
2. 仮想環境を作成し、有効化
3. Djangoをインストール
4. プロジェクト作成と設定
5. マイグレーション実行
6. スーパーユーザー作成
7. runserverで起動確認
8. Gitにcommit → mainへpush
```

---

### ✅ 実装手順とのずれ

「手順通りにいかなかったこと」があれば記録する。再発防止や引き継ぎのため。

```markdown
- requirements.txt に不足パッケージがあり、Djangoを個別インストールした
- PostgreSQLへの切り替えが必要だったため、settings.py を調整した
```

---

### ✅ エビデンス

「ちゃんとできましたよ」の証拠。

```markdown
- runserver実行画面のスクショ
- /admin ログイン後のスクショ
- GitHub上のcommit URL
```


## おわりに

issueは単なる「作業メモ」ではなく、**チームの共通言語・再現可能な設計図**です。
特に環境構築のような再現性が重要な作業では、きちんと書かれたissueが未来の自分や仲間を助けてくれます。

ぜひ、自分のプロジェクトでもテンプレ化して使ってみてください！

## Webエンジニアを募集中
私の所属する日本システム技研では、Webエンジニアを募集しています。
興味のある方は、ぜひ求人情報をご覧ください。

https://job.mynavi.jp/26/pc/search/corp201129/outline.html