OmniAICreator/Qiita-1.07M huggingface dataset:
PS2Linux,書物OperatingSystemManiaX

[PS2Linuxの導入]
書籍/あなたの知らないマイナーOSの世界 [技術の泉SERIES]

PS2Linuxの関連する記事が見つからない時代に紙の媒体の記録が買えました

私もヤフオクなどでPS2LinuxKitを探していますがPS2LinuxKitの価格が高い

でも単品を集めて
SyncOnGreenのモニタに出力するVGAケーブル(SCPH-10320)以外なら安いよ！
マウスはびっくりマウスというソフトの物の色違いのようですがPS2LinuxKitのそれは使ったことありません！
ただ...
びっくりマウスのは持っていますよ。

この書籍に感化されて
Linux (for PlayStation2)をインストールしました。
品番は
LDTL00001/SCPS17501,2
DVDの２枚組です。

Linuxのディストリビューション"PS2Linux"の導入にはこの本にある情報(ゲーム機用Linux PS2Linux)とゆう記事です

私はfdiskコマンドが苦手で普通のインストールだけですが
kernel 2.4.17のインストールやB.B.navigatorとのDualBoot方法などが書かれています
もうVectorさんのところでも記事が読めないので購入しました

今でもメインのマシンがPS2Linux (PBPX-95501)
私は最近、新たに本体を何台か集めてきて部屋はプレステだらけです。

[映像ケーブルの環境]
最初の起動時にコントローラーで操作します
 VGA(ComputerDisplay)なら　SELECT＋L1
 NTSC(TV画面)なら　SELECT+R1
を、押しながら起動します。

A.Ⅾ端子
PS2LinuxのRunTimeEnvironmentの起動と使用はＤ端子出力では特に意識しなくてもテレビにはピンク色がかかりますが映ります

[注意]
  PS2付属のAVケーブルやS端子ケーブルでは真っ青になり何も映りません。
動いてもテレビには映らないけど
PC(WindowsのPowerShell)Linux,MacのTerminal,携帯の端末エミュレーターなどからログインできる設定も可能ですが難しいよ！

B.HDMI変換コネクター
PS to HDMI(コネクター)でつなぐと致命的なトラブル(インストーラの途中でデジタル信号がなくなるのか画面が真っ黒になってしまい動いていないのかと勘違いしました。
結果は色々試して普通のPS2に付属のAVケーブルに繋ぎ変えたら映りました)

まだ見たことないけど
SCPH-10130という機器でS端子出力とVGA出力をつなげるようですね！
他には裏VGAというSCPH-10320互換の機器もあるようです！
ただしそれらはモニターがSyncOnGreenに対応したものが必要

本体のAV-Outputに
まずSCPH-10130で二系統の出力ができるようにして
S端子をテレビに接続
VGA(15pin)をSyncOnGreen　Displayに接続

起動時にコントローラーで制御する！！


[本題]
最近始めた正式版(Linux for PlayStation2)の設定などを残したいです

/etc/sysconfigがマシンの設定

PS2Linuxはインストール後はDVD(Disc1)は単なるブートローダーになります。
DVDはないとだめだよ。
DVDにpatchをあててコピーしたディスクやディスクイメージ(ISO)では起動できません
出来るのかもしれないけど自分は何年も使っていますが方法をしりません

中国製の違法に作られたPS2Linuxの海賊版DVDもあるとかないとか？？

話がそれました。

今回の内容は
OperatingSystemManiaXの先生？？
の、残してくれたPS2Linuxの導入とか初期設定とか今からPS2Linuxを始めるなら「読んだほうがいいよ」！
他にも応用して勉強になる"SSS-PC"の詳細な内容とか
"Unix"
"SONY NEWS"etc...沢山の記事(あなたの知らないマイナーOSの世界)が書いてあります。

Minix(教育用OS)も私は
同人誌の
    MinerOSManiacs
で読んで
VMware WorkStationで動かせていました。

この書籍がなければ自分は途中であきらめて放り出していたかもしれません。
初めてUNIX/Linuxを学び始めたのがPS2Linuxなので今でも手放さずにメインで使っています。
GAMEを作るためのKitだとか言われていますがREDHAT系Linuxです
今のDebianより少し難しいと感じます！
そこが魅力なのですが！！
【JavaScript】画面の幅によって処理を分ける方法


## 画面の幅を検証する方法

画面の幅が一定の値か検証するには`window.matchMedia()`を使用します。

```javascript
// ウィンドウサイズが640px以下ならtrue
matchMedia('(min-width:640px)').matches

// ウィンドウサイズが768px以上1024px以下ならtrue
matchMedia('(min-width:768px) and (max-width:1024px)').matches
```

## 画面幅が変更された際に処理を分ける

画面幅が変更された際に画面の幅を検証し、処理を分けるには以下のようにします。

```javascript
const mediaQueryList = matchMedia('(min-width:640px)')

mediaQueryList.addEventListener('change', (ev) => {
    if (ev.matches) {
        console.log('画面幅：640px以上')
    } else {
        console.log('画面幅：640px未満')
    }
})
```

## 参考

https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia
Djangoの本格始動（poke-back01）

## 概略

約2年前、30万円のSurfaceを購入し、独学でプログラミングの勉強を始めました。
私は実務未経験ながら、フルスタックエンジニアとして**中堅レベル**での就職を目指して学習を続けてきました。

ポートフォリオとして取り組む題材は、早い段階から「ポケモン対戦ツール」に定めていました。
現在、その中核となる**バックエンド（Django）部分の構築**に着手した段階です（作業開始は昨日）。


## プロジェクト概要

以下のような3段階構成で設計しています（構成は拡張します）：

* PokeAPIからデータを取得するDjangoコマンドを実装
* 取得データを加工・保存するコマンドも別途用意
* Django REST Frameworkを用いて、データをフロントエンドに提供


## ディレクトリ構成（抜粋）

```plaintext
poke-back/
├── _config/
├── _venv/
├── ep_registry/
│   └── data/all_ep.json
├── fetch_pokemon/
│   └── temp/
│       ├── form_idxs.txt
│       ├── pokemon_idxs.txt
│       └── species_idxs.txt
├── ep_registry/management/commands/ep_registry.py
└── fetch_pokemon/management/commands/fetch_pokemon.py
```

構成は、独自スクリプト（`tree.py`）で自動出力できるようにしています。
これはプロジェクトを他者に共有する際や、LLMへの入力時に便利です。


## ep\_registry アプリ

このアプリでは、静的な JSON ファイル（`all_ep.json`）を元に、エンドポイント情報をデータベースに登録しています。
エンドポイントの数が多く、管理画面の視認性を確保する目的でアプリを分離しました。



## fetch\_pokemon アプリ

このアプリでは、`pokemon-species` / `pokemon` / `pokemon-form` の各エンドポイントから非同期でデータを取得し、加工・保存を行います。

使用対象のエンドポイントは、事前に `ep_registry` 側で `using=True` とマークしたものだけに限定できます。現在はこのアプリの Django コマンド（`fetch_pokemon.py`）を記述中です。



## 非同期処理について

非同期処理は私にとって大きな壁でした。

そこでまず、`async/await` を使わずに **並行処理を模倣したコード**をLLMに書かせ、その挙動を観察することで、基礎的な理解を固めました。

その後、非同期コードの構造が自然と理解できるようになり、現在は `aiohttp` 等を使った実装を進めています。

エラーも出ておらず、順調に進行中です。



## 総括

文章力に自信がないため、読みづらい部分があるかと思いますが、**継続的にアウトプットすること**を大事にしたいと考えています。

最初は稚拙でも、記事執筆をルーチン化し、積み重ねていくことで、振り返りやポートフォリオにも活かせると考えています。

参考になる内容ではないかもしれませんが、「一人でよくやってるな」と思ってもらえれば幸いです。

---

written by 高梨 栞理（Shiori Takanashi）

---
LinuCレベル1-101試験受験希望者向け、学習の手引きリンクまとめ

:::note alert
本稿と、本稿で紹介する資料は試験「だけ」に向けたものではないため、試験勉強をしたい場合は試験対策テキストや勉強会も併用しましょう。
:::

自分用ですが、需要ありそうなので置いときます。

## 手順
### 1. まずは公式ページへ

https://linuc.org/

### 2. 学習コンテンツ→標準教科書シリーズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/8f515a41-57f0-4dbe-88d9-214cf1fb8638.png)

### 3. 各ページからダウンロード
PDF版・EPUB版があります。

:::note
- ダウンロード版（無料。要アンケート）
- Kindle版（有料）
- 製本版（有料）

の３つがあります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/1d55ba36-fd62-4aec-9edd-5640624754d6.png)

:::note warn
私は無料でダウンロードできるデータを紛失しがちなので、これを機会にKindle版も買いました。
ヨドバシカメラも利用するためDolyもあって管理が大変なのですが、タグ付けできる環境は考えておいた方がいいな、と思いました。
本題から逸れるので別の記事にします。
:::

### 番外：Amazon KindleをPCにインストールする
Amazon公式にヘルプがあるので、そちらからやってみてください。

https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GZSM7D8A85WKPYYD

過去にKindle自体を購入してダウンロードするリンクもあったのですが、そちらは失効（バージョンが古く、インストールに失敗した）ようです。

---

## ステップアップ、という名前の勧誘
:::note
標準教科書作成プロジェクトに参画しよう！
:::

という、お願いを置いておきます。
本稿を書くモチベーションがこれなのですが、どうしても経験者目線が多くなり「あれもこれも！」となってしまっているのが実情です。
そのため「何も知らない人が教科書の内容をやってみて自力でできるのか？」を検証できません。
そして、何も知らない人はどんどん力をつけてきて「経験者」になるため、随時、しかも圧倒的に数が足りてません。

「よく分からないから協力できないかも」と思っている、あなたのお力が欲しいんです。
なにとぞ、ご協力いただけると大変うれしいです。

:::note warn
コミュニティSlackへの参加は、外部サイト（LinuC試験のためにEduco）のアカウントが必要です。
:::

https://linuc.community

### EducoIDを取得してLinuCレベル1-101試験の勉強会に参加しよう
本稿を読んで一番手っ取り早く恩恵を感じられるのは、LPI Japan公認のコミュニティがLinuC勉強会を提供している、という環境かもしれません。

とはいえ、登録が結構面倒くさかったりもします。
LinuCレベル1-101試験の勉強会ではないですが、一般公開しているものもありますので、そちらで雰囲気をつかんでもらう事も出来ます。
こちらはconnpassアカウントを取得し、イベント参加申請をしてもらえればeducoは不要ですし、LiON以外の勉強会にも参加できるようになるので、とりあえず持っておくことをおすすめします。

https://lion.connpass.com
【初心者向け】絶対にわかる！Git reset の使い方まとめ

# 【初心者向け】絶対にわかる！Git reset の使い方まとめ（図解つき）

Gitで開発していると…

「コミットを取り消したい！」
「ステージに追加しすぎた…戻したい！」

そんなときに超便利なのが `git reset` です。

でも、「--soft」「--hard」って…何がどう違うの？と迷ってしまう方も多いはず。

この記事では、**初心者でも一発で理解できる！** `git reset`の使い分けをやさしく解説します！

---

## ✅ まずは結論：この3つを覚えればOK！

| コマンド                       | 影響範囲        | 使う場面                 |
| -------------------------- | ----------- | -------------------- |
| `git reset --soft HEAD~1`  |  コミットのみ取消    | 「コミットメッセージを修正したい」    |
| `git reset --mixed HEAD~1` | コミット＋ステージ取消 | 「ステージから外してコード修正したい」  |
| `git reset --hard HEAD~1`  | 全部取り消し（要注意） | 「全部なかったことにしたい（※慎重に）」 |

---

## 用語の復習：Gitの3つのエリアを整理しよう

| エリア          | 説明                     |
| ------------ | ---------------------- |
| 作業ディレクトリ     | ファイルを実際に編集している場所       |
| ステージ（インデックス） | コミットの準備をする場所           |
| コミット履歴       | 確定したコードの記録（Gitのタイムマシン） |

---

## 💡 実例で学ぶ `git reset`

### 1. `git reset --soft HEAD~1`（コミットだけ戻す）

```bash
git reset --soft HEAD~1
```

* ✅ 最新のコミットを**なかったことに**する
* ✅ ステージには**残る**ので、すぐ再コミットできる

#### 使い方例：

```bash
git commit -m "間違ったコミット"
#git reset でコミットを取り消す
git reset --soft HEAD~1
git commit -m "修正後のコミット"
```

コミットメッセージの修正に便利！

---

### 2. `git reset --mixed HEAD~1`（コミット＋ステージを戻す）

```bash
git reset --mixed HEAD~1
```

* ✅ コミットとステージの内容を**取り消す**
* ✅ 作業ディレクトリ（編集内容）はそのまま残る

📝 いったんコードを見直したいときに便利！

---

### 3. `git reset --hard HEAD~1`（すべてを巻き戻す）

```bash
git reset --hard HEAD~1
```

* ❗ コミット・ステージ・作業ディレクトリ**すべて削除**
* ❗ **保存していなかったコードも完全に消える！要注意！**

📝 本当に「なかったこと」にしたいときだけ使おう！

---

## 🔍 補足：`HEAD~1`って何？

* `HEAD`：今いる最新のコミット
* `HEAD~1`：1つ前のコミット
* `HEAD~2`：2つ前…という意味

```bash
git reset --soft HEAD~2 # 2つ前に戻る
```

---

## 万が一やらかしたら… `git reflog` で復活！

```bash
git reflog
```

* 直近の操作履歴を見られるコマンド
* 間違って消してしまっても、過去の状態に戻せる！

```bash
git reset --hard <コミットID>
```

やばい！」と思ったら、まず `reflog`！

---

## まとめ：これさえ押さえれば大丈夫！

| シーン               | おすすめコマンド                   |
| ----------------- | -------------------------- |
| メッセージを修正したい       | `git reset --soft HEAD~1`  |
| ステージを解除してコード修正    | `git reset --mixed HEAD~1` |
| 全部なかったことにしたい（慎重に） | `git reset --hard HEAD~1`  |

---

この記事が良かったら、ストックやいいねをしてもらえると嬉しいです！
AI に丸投げするのはやめよう！計画と進捗を可視化するアプローチ

## はじめに

ChatGPTなどのLLMと一緒に開発を進める「AI協調開発」が普及し始めていますが、こんな課題に直面していないでしょうか？

- 昨日何を頼んだか忘れた
- ターミナルやブラウザを閉じたらコンテキストが失われた
- どこまで進んだかをAIから一から聞き出すのがつらい

このような「進捗が見えなくなる現象」に陥りがちな原因は、AIに仕事を任せたことではなく、**記録を残していないこと**にあります。

本記事では、AI駆動開発をキャッチアップ中の PjM が試行錯誤しながらたどり着いた、**Markdownベースの軽量進捗管理法**を紹介します。

---

## なぜAIに丸投げすると進捗が見えなくなるのか

### 1. 何を頼んだか忘れる
- AIとのやり取りは会話ベースなので、指示内容がどんどん流れていきます
- 結果、何を・どこまで頼んだのかを忘れ、再依頼する羽目に

### 2. コンテキストが切れる
- セッションが終了すると、AIは過去の記憶を持ちません
- 前提や中間成果を毎回説明し直す必要が出てくる

---

## 解決策：3つのMarkdownファイルで文脈を保存する

### 1. `PROGRESS.md`: 作業ログとTODOの記録
- その日やったこと、次にやること、つまずいていることをメモ
- 一言コメントでもいいので、とにかく毎回何か残す

### 2. `DEVELOPMENT_ROADMAP.md`: 全体像の確認
- 今どのフェーズにいて、次にどこを目指しているのか
- チームでもAIでも迷子にならないようにするための「地図」

### 3. `CLAUDE.md`（任意）: ルール・制約の共有
- 使用技術、設計方針、ドキュメントの書き方など
- セッションが切れても、AIが読み直せば復帰できる

---

## テンプレート例

### `PROGRESS.md`
```markdown
# 開発進捗レポート

## Phase 2: 認証・API基盤 (70%)

- ✅ Next.js プロジェクト作成
- ✅ TailwindCSS + TypeScript 設定
- [ ] Cognito デプロイ準備

### ブロッカー
- AWS SSO の一時認証情報が期限切れ
````

### `DEVELOPMENT_ROADMAP.md`

```markdown
# 開発ロードマップ

### ✅ Phase 1: MVP構築（完了）
- 期間: 2025/04 - 2025/05
- 成果物: 初期UI / API設計

### 🚧 Phase 2: 認証・API基盤（進行中）
- 目標: 認証統合とユーザー登録
- 優先度: HIGH
```

---

## それ GitHub Issue でよくない？

PROGRESS.md に記載する内容は、issue として管理するほうがよいかもしれません。
Claude Code であれば gh コマンドを利用して issue にもアクセス容易です。

とはいえ気軽に始めるならファイルベースで良いかなと思います。


| 観点     | GitHub Issue | PROGRESS.md |
| ------ | ------------ | ----------- |
| AIとの連携 | 認証/API制限あり   | 直接読み書き可能    |
| 情報の俯瞰  | 分散しがち        | 一画面で全体把握    |
| 書きやすさ  | タスク粒度が細かい    | 適当でOK       |

markdown であればタスクの依存関係を mermaid 形式で表現できるので
初期開発においては有益かなと思います。

---

## 実際に運用して感じたメリット

* セッションが切れてもAIに「PROGRESS.mdを読んで」と言えば再開できる
* 人間側も「どこまでやったか」が数行で振り返れる
* 完璧である必要はなく、「思い出せる状態」だけでも十分役立つ

---

## 結論

AIと開発を進める上での一番の敵は、「忘れること」と「文脈の断絶」です。

そこで提案するのが：

* とりあえず `PROGRESS.md` を置いてみる
* 毎回少しでも追記してみる
* セッションが切れたら「このファイル読んで」でOK

という **ゆるいMarkdown運用**です。

---

## GitHubテンプレート

* [https://github.com/daktu32/careerfm](https://github.com/daktu32/careerfm)

---

## 関連タグ

`#ChatGPT` `#AI開発` `#Markdown` `#PM` `#プロジェクト管理` `#GitHub`

---

## フィードバック歓迎です！

「こんなふうにやってるよ」「別のやり方でうまくいってる」など、コメント欄やXで教えていただけると嬉しいです！
# 【Kaggle入門】タイタニック生存予測を完全攻略！初心者が0から提出まで徹底解説

こんにちはあつきです🎶
(((o(*ﾟ▽ﾟ*)o)))今回はKaggleの超有名コンペ「Titanic: Machine Learning from Disaster」に挑戦してみたので、その流れや学びを共有します。

Pythonを使って、データの読み込みからモデル構築、予測までの基本的な流れを紹介します。初学者の方が、実際に手を動かしながら学べるように構成しました。

---

## 🎯 1. Kaggleとは？

[Kaggle](https://www.kaggle.com/)は、世界中のデータサイエンティストが集まるデータ分析コンペのプラットフォームです。Titanicコンペは初心者向けに設計されていて、最初の一歩に最適です。

---

## 🛳️ 2. Titanicコンペの概要

1912年に沈没した豪華客船「タイタニック号」の乗客データを使って、生存者を予測するコンペです。

**目的**：乗客の属性（性別、年齢、乗船クラスなど）をもとに、生存したかどうかを予測する。

---

## 🔧 3. 実装ステップ

### 3.1 ライブラリのインポート

```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
```

---

### 3.2 データの読み込み

```python
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
```

---


### 3.3 データの確認

```python
print(train.head())
print(train.info())
```

---

### 3.4 前処理（簡易版）

```python
# 欠損値処理
train['Age'].fillna(train['Age'].median(), inplace=True)
train['Embarked'].fillna(train['Embarked'].mode()[0], inplace=True)

# カテゴリ変換
train['Sex'] = train['Sex'].map({'male': 0, 'female': 1})
train['Embarked'] = train['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})
```

---

### 3.5 特徴量と目的変数の選定

```python
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
X = train[features]
y = train['Survived']
```

---

### 3.6 モデル構築と学習

```python
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X, y)
```

---

### 3.7 テストデータの前処理と予測

```python
test['Age'].fillna(train['Age'].median(), inplace=True)
test['Fare'].fillna(train['Fare'].median(), inplace=True)
test['Sex'] = test['Sex'].map({'male': 0, 'female': 1})
test['Embarked'] = test['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

X_test = test[features]
predictions = model.predict(X_test)
```

---

### 3.8 提出用ファイルの作成

```python
submission = pd.DataFrame({
    'PassengerId': test['PassengerId'],
    'Survived': predictions
})
submission.to_csv('submission.csv', index=False)
```

---

## 📈 4. 結果と感想

提出してみると、スコアは **約0.765** でした。これは単純な特徴量とモデルでもそこそこの精度が出せることを示しています。

実際のデータ分析では、前処理や特徴量エンジニアリングが大きな差を生みます。

---

## 🚀 5. 今後の改善ポイント

- カテゴリ変数のOne-Hot Encoding
- 年齢や名前の分布の可視化・分析
- 他のモデル（XGBoostやLightGBMなど）との比較
- 交差検証による過学習の抑制

---

## 📝 6. まとめ

KaggleのTitanicコンペは、機械学習の入門にぴったりな教材です。

簡単な前処理とランダムフォレストを使っても、ある程度の予測精度を出せることがわかりました。最初の一歩として、自分なりに手を動かしてみることが大切です。

---

## 🙌 最後に

この記事が、KaggleやPythonによるデータ分析に挑戦してみたい方の後押しになれば幸いです。

ご質問やフィードバックがあれば、ぜひコメントで教えてください！

Thanks for reading 😊
ﾄﾞﾄﾈﾄｺﾛｺﾛ、C++/CLI が無難？

とりま .NET8 では 以前書いた C++/CLI DLLそのまま動いた。

今日ググったら既に 10まで出とるのか。破壊的創造が頻繁に起こるなら 処理は VC++/CLI でなるだけ無難?
【LeetCode #13】Roman to Integerやりました。

# 【LeetCode #13】Roman to Integerやりました。

## はじめに  
**どうも、３億年ぶりです**  
毎日続けようとかイきったこと抜かしていましたが、早速クソほど間が空きました。
みなさんいかがお過ごしでしょうか。

というわけで、本日は**LeetCode #13**に取り組みました。  
### なお、今回もChatGPTをめちゃくちゃ活用して勉強してます。

自力で書けたのは

### int total = 0;くらいのものです。

ではいきましょう。

## 問題概要  
ローマ数字をアラビア数字に変換しろ。  
特殊ルールとして、一部は減算扱いになる。  
IV→4、IX→9、みたいなやつ。

詳しい解説は他のプロに任せて、ここでは思考ログに焦点を当てます。

## 初見の思考

### 問題を見て最初に思ったこと：  
- マップを使えばいけそう。キーはローマ文字、バリューは整数。
- 与えられた文字列から順に取り出して、変換すれば加算できる。
- ただし桁が変わる直前に変なルールがある（例：IV, IX）
- ならば、"Dの前にC"があるなどのパターンをif文で処理する？

→ つまり、一部の例外処理（6パターン）を先に拾って、あとは足し算で終わるはず。

---

## 自分で書いたコード（初版）(GPTアシストゴリゴリ）：

```java
int total = 0;
Map<Character,Integer> romanMap = new HashMap<>();
romanMap.put('I',1);
romanMap.put('V',5);
romanMap.put('X',10);
romanMap.put('L',50);
romanMap.put('C',100);
romanMap.put('D',500);
romanMap.put('M',1000);

for(int i = 0; i< s.length();){
    if(i + 1 < s.length()){
        int now = romanMap.get(s.charAt(i));
        int next = romanMap.get(s.charAt(i + 1));
        if(now < next){
            total += (next - now);
            i += 2;
            continue;
        }
    }
    total += romanMap.get(s.charAt(i));
    i++;
}
return total;
```
### 動いた！
いや、動いたのはいい。


### でもトップ層のコード”がエグい。

---
```java
for (int i = s.length()-1; i >= 0; i--) {
    switch(s.charAt(i)) {
        case 'I': num = 1; break;
        case 'V': num = 5; break;
        case 'X': num = 10; break;
        case 'L': num = 50; break;
        case 'C': num = 100; break;
        case 'D': num = 500; break;
        case 'M': num = 1000; break;
    }
    if (4 * num < ans) ans -= num;
    else ans += num;
}
```

### 綺麗すぎるだろ。ご来光見たときでもこんな感動しなかったぞ。

4 * num < ansて。
スイッチケース？？　なぜその発想が出る？

今までの俺のif分岐はなんだったんだよ。
マップ構成して、減算6パターン拾って、スキップ処理まで書いた俺の苦労（GPT産を返してくれよ。

## 学び

- コードは「書いて通す」だけじゃなく、「削って再構成する」ことで初めて意味が見えてくる。
- 4 * num < ans は数学的に減算ルールを抽象化した超技巧的条件。怖い。
- GPTただ使うだけだと綺麗なコードを吐き出すのは難しいんだなぁ。あまを
- Mapは便利だけど、毎回作ってると遅い。定数化して使い回す方が良い。
- 処理順も重要。後ろから見ると、“次の値”が不要になる場合がある。
- 相変わらずEasyじゃねえって。心理的にはHardだわ。

## おわりに
今回の問題は、自分がまだ“抽象化の領域に入れてない”ことを突きつけられられました。
多分、フローチャートと疑似言語書きまくらないと、こういう思考に行きつけないんだろうな。

### ねえ、みんなこれ涼しい顔して解いてんの？

以上。また今度。
【UiPath】「現在のジョブの情報を取得」で取得できる情報

UiPathの「現在のジョブの情報を取得」アクティビティではその名の通り、実行しているジョブのプロセス名・バージョン・ワークフロー名などの情報を、`CurrentJobInfo`型の変数として取得できる。

具体的には、「現在のジョブの情報を取得」の出力を`CurrentJobInfo`型の変数で受け取り…。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/7e085a44-91af-44bb-bf65-e598e51e2d8c.png)

`変数名.プロパティ名`のように記載することで情報を取り出せる。プロパティ名については自分で入力せずとも`変数名.`まで打てば入力補完が働いてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/605523c3-1633-476c-9f56-81d78689f0d6.png)

v25.4.2時点で、参照できるプロパティは以下の通り。フォルダやテナント名などログに無い情報も取れるが、一方で実行元（initiatedBy）など、ログでは取れるがこちらでは取れないものもある。また、各プロパティの型はPictureInPictureModeのみ`PictureInPictureMode`型で、それ以外は`String`型である。

| プロパティ名 | 例 |　実行ログとの対応 |
|:-:|:-:|:-:|
| FolderName | `sample@gmail.com's workspace` | なし |
| Key | `b2f81d8c-0720-4304-931a-a698335454d9`  | JobID |
| PictureInPictureMode | `Main` |　なし |
| ProcessName | `空のプロセス` | ProcessName |
| ProcessVersion | `1.0.1` | ProcessVersion |
| RobotName | `sample@gmail.com-attended` | RobotName |
| TenantName | `defaulttenant` | なし |
| UserEmail |`sample@gmail.com` | なし |
| WorkflowName | `Main` | fileName |

## 参考
https://docs.uipath.com/ja/activities/other/latest/workflow/get-current-job-info

## 動作環境
UiPath.System.Activities v25.4.2
USBデバイスをwindowsのサインインに使用する

# KeyLockをダウンロードする
[公式サイト](https://brabonet.com/)へアクセスする。

**Download for Windows**をクリックし、インストーラをダウンロードする。
![スクリーンショット 2025-06-06 214822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/3c365ded-83ca-435a-b525-12f460cf5428.png)

インストーラを起動してセットアップを開始する。
**I accept the agreement**を選択し、**Next**をクリックする。
![スクリーンショット 2025-06-06 215211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/a6516919-5531-463c-a550-d133383e2b24.png)

ショートカットをデスクトップに作成する場合は、**Create a desktop shortcut**にチェックを入れて**Next**をクリックする。
![スクリーンショット 2025-06-06 215221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/e47977d0-a0c6-492b-9f93-436aaec19d99.png)

**Install**をクリックし、インストールを開始する。
![スクリーンショット 2025-06-06 215230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/27413523-da8f-47f1-882a-8d80c45ad744.png)

# KeyLockにUSBデバイスを登録する
KeyLockを認証に使用するため、**Use KeyLock to sign in**にチェックを入れます。
認証デバイスを外した時に自動的にロックをするときは、**Automatic locking**にチェックを入れます。
USBを登録するには、**Manage physical unlock devices**をクリックします。
![スクリーンショット 2025-06-06 220414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/dec4e35a-d0a0-4e05-b3e7-99a6a70d0742.png)

**Select drive**から登録するデバイスを選択します。
![スクリーンショット 2025-06-06 220445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/a5c8b29e-b6bc-45d1-8014-1a34a1e17b60.png)

**Add unlock device**をクリックし、デバイスを登録する。
![スクリーンショット 2025-06-06 220755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/4d8678b8-cbc9-4385-baa5-fb8daa31942d.png)

**.key**拡張子のファイルがUSBデバイスに作成されていることを確認する。

![スクリーンショット 2025-06-07 061658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/52e035cd-38fb-41c0-a3fa-1d18d72e8c66.png)

# 設定

ログインの設定を行うには、**Settings**をクリックします。
![スクリーンショット 2025-06-06 2204141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/26e182f1-1525-496d-983b-b10d4e3b36c1.png)

ログを使用する場合、**Log events**にチェックを入れます。
ログイン通知をメールアドレスに送信する場合は、**Send email notifications**にチェックを入れ、Send emails to:の後ろにメールアドレスを入力します。
![スクリーンショット 2025-06-06 222434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/eb00c947-6427-4acb-aa10-7cb7019e8637.png)

USBデバイスを使用してロックを解除するには、**Allow (USB) drives to unlock this PC** にチェックボックスを入れます。
パスワード認証を行うには、**Require a password to be entered to sign in** にチェックボックスを入れます。
![スクリーンショット 2025-06-06 222434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635999/645cf0f7-a57a-469a-9e30-e503cd4425fd.png)
【GitHub】プルリクのルール設定

## はじめに
レビューを必須にすることで、コード品質や運用ルール徹底がしやすくなります。

下記の記事の続きです（「Require a pull request before merging」内の設定）
[【GitHub】ブランチ直接プッシュ禁止の設定](https://qiita.com/isshi777/items/e7bbdf5a03de14635a90)

## 詳細オプション

### Required approvals
`プルリクエストをマージする前に何人の承認が必要か`を指定します。
指定した人数分の承認つかないとプルリクはマージできません。

---

###  Dismiss stale pull request approvals when new commits are pushed
`新しいコミットがプルリクに追加された場合以前の承認を取り消すか`を決めます。
認後にコード変更（新しいコミット）があると過去の承認が無効化されます。

---


### Require review from Code Owners
プルリクエストで`Code Owners（コードの所有者）による承認`を必須にします。
CODEOWNERSファイルで設定された担当者の承認がないとマージできません。

---


### Require approval of the most recent reviewable push
最後にpushされたコミット以外のユーザーからのレビューを求めるかどうかを決めます。
`最新のコミットをpushした本人とは別の人がApproveしないとマージ不可`になります。
自分のコードは他人のレビューが必須になります。

---


### Require conversation resolution before merging
プルリクエスト内のコメントスレッドが解決しないとマージできなくなります。
`「Resolve conversation」を全てのコメントに対して実施する`必要があります。

---

### Request pull request review from Copilot
`GitHub Copilotに自動でレビューを依頼`する機能です

## 例
例として以下のルールを設けたいと思います。
- `１人以上のApprove`が必要
- `Approveは自分以外`でないとダメ
- `コメント（指摘）は解決`しないとダメ

#### 設定項目
- `Required approvals`は１を設定
- `Require approval of the most recent reviewable push`を有効化
- `Require conversation resolution before merging`を有効化

## 補足
（Apriori）とアソシエーションルール

```Python
# Program Name: market_basket_analysis.py  
# Creation Date: 20250606  
# Overview: Perform market basket analysis using Apriori and visualize association rules  
# Usage: Run in Python (Jupyter/Colab) with mlxtend, matplotlib, pandas installed

# -------------------- Install Required Libraries --------------------
!pip install pandas mlxtend matplotlib seaborn --quiet

# -------------------- Import Libraries --------------------
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

# -------------------- Parameters / 取引データ --------------------
# 仮想的な顧客購入履歴 / Sample transactions
dataset = [
    ['milk', 'bread', 'butter'],
    ['bread', 'diaper', 'beer', 'eggs'],
    ['milk', 'bread', 'diaper', 'beer'],
    ['milk', 'bread', 'diaper', 'butter'],
    ['bread', 'butter']
]

# -------------------- Step 1: データのバイナリ化 / Encode the dataset --------------------
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)

# -------------------- Step 2: 頻出アイテムセット抽出 / Extract Frequent Itemsets --------------------
frequent_itemsets = apriori(df, min_support=0.4, use_colnames=True)

# -------------------- Step 3: アソシエーションルールの抽出 / Derive Association Rules --------------------
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)

# -------------------- Step 4: ルール上位表示 / Display Top Rules --------------------
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']].sort_values(by='lift', ascending=False))

# -------------------- Step 5: プロット（Lift vs Confidence） --------------------
plt.figure(figsize=(8, 6))
sns.scatterplot(data=rules, x='confidence', y='lift', size='support', hue='support', palette='viridis', sizes=(100, 1000), legend=False)

# 英語表記 / Plot labels in English
plt.title('Association Rules: Lift vs Confidence')
plt.xlabel('Confidence')
plt.ylabel('Lift')
plt.grid(True)
plt.show()

```
AIが何でもできるわけではない 〜 LLM活用の現場における注意点 〜

# AIが何でもできるわけではない 〜 LLM活用の現場における注意点 〜

近年、LLM（大規模言語モデル）を活用する現場が急速に増えています。  
特にChatGPTやClaude、Gemini、LLM APIの進化により「AIにコードを書かせればすぐできる」という期待感が高まっています。

しかし、**この期待と現実のギャップが、プロジェクトや現場の混乱を生む場面が目立ってきました**。  
本記事では、現場でよく見られる誤解と、AI活用の際に注意したいポイントをまとめます。

---

## AIで「できること」と「まだ難しいこと」

| できること（比較的強みがある） | まだ難しい・注意が必要なこと |
|-----------------------------|-----------------------------|
| テキスト生成・要約・変換 | 高精度な論理一貫性のある長いコード |
| 既存コードの説明、ドキュメント化 | 大規模システムの設計・アーキテクチャ判断 |
| 既知パターンのコード例作成 | セキュリティや性能の配慮が必要なコード |
| 単純なAPI利用例の提示 | 非常に高い正確性が求められる業務コード |
| プロトタイプの作成 | 保守性・拡張性を考慮した実用的なコード全体 |

---

## 現場で起こりがちな誤解

### 「AIがコードを書いてくれるからエンジニアは不要」

AIは確かにコード生成が得意ですが、**生成コードのレビュー・検証・修正は必須**です。  
LLMはあくまで「言語モデル」であり、時にもっともらしいが誤ったコード（いわゆる**ハルシネーション**）を出力することがあります。

### 「AIが生成したから正しいはず」

LLMの出力は予測結果です。  
たとえ一見正しそうに見えても、必ずバグやセキュリティ上の欠陥がないかを**人間が確認する責任**があります。

### 「AIがいれば設計や要件定義もできる」

AIはビジネス文脈や非機能要件を十分に理解できません。  
**要件定義・設計はエンジニアやプロダクトマネージャの判断が不可欠**であり、AIはあくまで補助的に使うべき領域です。

---

## 現場が混乱する原因

- 上層部や非技術者が **AI＝万能** と誤解している
- プロジェクト見積もりやスケジュールが「AI前提」で非現実的になる
- QA・レビュー・テストの工程が軽視される
- スキルの浅いエンジニアが **AI生成コードをそのままデプロイ** してしまう

---

## 現場に正しい認識を広めるには

### 1. AIは支援ツール。責任はエンジニアにある

AI生成コードの**責任は利用者が持つ**という文化を明確に定義しておく。

### 2. AI生成コードのレビューを徹底する

「AI生成コードは必ずコードレビューを通す」  
「AIからの出力はそのままプロダクションに入れない」  
といった**チームガイドラインを作成**する。

### 3. AIの得意・不得意を教育する

AIは万能ではないこと、得意なパターンと苦手な領域を**エンジニアチーム全体で共有**する。  
定期的にLLMの振る舞いについて知見をアップデートするのも有効。

### 4. プロジェクト計画段階でAI活用の効果を冷静に見積もる

**「AIだから作業時間が1/10になる」**といった過剰な期待は持たない。  
むしろAI生成部分の**レビュー・検証コストが新たに発生する**点も加味して見積もる。

---

## まとめ

AIの進歩は目覚ましく、エンジニアリング現場にとって強力なツールとなりつつあります。  
一方で、**万能視や過剰な期待は現場の混乱や品質低下につながるリスク**もあります。

AIを賢く活用するには、次の意識が不可欠です。

- **AIは支援ツール。最終責任はエンジニアにある**
- **生成コードは必ずレビュー・検証を行う**
- **AIの得意・不得意を正しく理解して活用する**

適切な使い方を徹底することで、AIと人間の**最強の組み合わせ**が実現できるはずです。

---

以上、現場で実際に起きている事例や観点から整理してみました。  
AI活用が加速するこれからの時代、ぜひ冷静なバランス感覚を持ってプロジェクトに取り組んでいきましょう。
【初心者向け】git stashの使い方がスッキリわかる！作業中の変更を一時的に保存する方法

## はじめに

「作業中だけど、ちょっと他のブランチを見たい…でも今の変更をコミットするのはまだ早い」

そんなときに便利なのが `git stash` です！

この記事では、git初心者の方でもわかるように、`git stash` の使い方をゆっくり丁寧に紹介します。

---

## git stashって何？

簡単に言うと、「作業内容を一時的に隠しておける機能」です。

今やってる変更を保存して、ワーキングディレクトリをキレイな状態に戻せます。そして、また元に戻すこともできます！

---

## 🔰 基本の使い方

### 1. 作業中の変更を一時保存する：

```bash
git stash
```

これで、作業内容はGitの"隠し場所（stash）"に保存され、作業ディレクトリはキレイな状態になります。

---

### 2. スタッシュ一覧を確認する：

```bash
git stash list
```

```
stash@{0}: WIP on main: 修正中のコード
stash@{1}: WIP on feature/foo: バグ対応中
```

---

### 3. 保存した内容を戻す：

#### 直前のスタッシュを戻す：

```bash
git stash apply
```

#### 特定のスタッシュ（例：stash@{1}）を戻す：

```bash
git stash apply stash@{1}
```

> ポイント：`stash@{番号}` は `git stash list` の出力で確認できます。

#### popとの違い

* `apply`：戻すだけ（stashはそのまま残る）
* `pop`：戻したあとstashを削除（使い切り）

---

## よく使うオプション

### 未追跡ファイルも一緒に保存する：
`git stash`は ステージされていない（git addしていない）ファイルの変更 も保存しますが、
まったく新しく作った未追跡ファイル（Untracked）は保存されません。そこで`-u`を使います。
```bash
git stash -u
```

* `-u`（または `--include-untracked`）をつけると、まだ `git add` していないファイルも保存できます。

### スタッシュにメモをつける：

```bash
git stash push -m "API修正中"
```

後で見返すときに、わかりやすくて便利です！

---

## 応用テクニック

### 特定のスタッシュだけ消したい：

```bash
git stash drop stash@{1}
```

### 全部のstashを消す：

```bash
git stash clear
```

---

## よくあるトラブルと対処法

### エラー例：

```
error: Your local changes to the following files would be overwritten by merge.
```

これは、戻そうとしたときに作業内容とぶつかってしまうエラーです。

➡ 対処法：

* 今の作業をコミットする
* もしくは、さらにstashしてから戻すのが安全！

---

## ✅ まとめ：覚えておきたいコマンド一覧

| コマンド                        | やること              |
| --------------------------- | ----------------- |
| `git stash`                 | 作業内容を一時保存する       |
| `git stash list`            | 保存されたstashの一覧を見る  |
| `git stash apply`           | 内容を元に戻す（stashは残る） |
| `git stash apply stash@{1}` | 特定のスタッシュを元に戻す     |
| `git stash pop`             | 元に戻してstashを削除     |
| `git stash -u`              | 未追跡ファイルも一緒に保存する   |
| `git stash clear`           | すべてのstashを削除する    |

---


この記事が良かったら、ストックやいいねをしてもらえると嬉しいです！
iPhoneのショートカットで通知センターを整理する

# 概要
本記事はiPhoneユーザー向けの、通知センターの通知を一掃するためのショートカットを作成してみたというものになります

# 本題
まずはあまり知られていないかと思うので、iPhoneのショートカットの説明を挟んでおきます(From Gemini)

> iPhoneでの様々な操作を自動化し、日々の作業をより効率的かつ便利にするための強力なツールです。複数の操作を組み合わせて、ワンタップやSiriへの呼びかけ、特定の条件（時刻、場所など）で自動的に実行させることができます


こんな見た目のアプリですね
![d230a25cb974f8908871af04caad89a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/bcb05be0-87cf-45cc-b899-7a407153dc55.png)

要するになにか自動化・効率化したい時に使うと良いですよというアプリとなっております

# 今回何を作るか、実現したいか
今回記事を書こうと思ったのは、ふと友人とミスドを食べていた時のことでした

「iPhoneの通知センターの通知って一気に消したい時あるけど、カレンダーとかの通知は残しておきたいよね」

、、、確かに
普段から通知センターを整理できている方はすごいと思います
僕は気づいたらSNSの通知が溜まりっぱなしであったり、アプリからの不要な通知が溜まっていることがよくあります

できる行動としては以下の2つなっております
- アプリごとに通知一つ一つ消す
- もしくは全ての通知を消す

そうではなく特定のアプリの通知だけ残せるとハッピー、しかも手で一つ一つ消すのではなくてボタンを押せば勝手に消えてくれるというものを作りたいと思いました

幸いにもショートカットを使えば何かできるかもしれないと思ったので今回改めて記事にしようと思った次第です

# ショートカットを作ってみる
ということで早速作ってみますと思ったのですが
残念ながらショートカットから直接通知センターを操作する方法は存在しないようでした
(geminiに聞いてみるとプライバシーか何かを尊重するためと書いてあった気がします)

そこで発想を変えて、とりあえずカレンダーで計画されている1週間（この数字は仮です、後ほどやり方のところで変更部分でてきます）以内の予定を再通知できるようにすれば、まだやりたかったことができそうかなと思いました

ということで実際に作成した内容を説明していきたいと思います

ショートカットでは色々なアプリの動作を選んだりすることができます
今回使用するカレンダー以外にもApple Musicやその他のインストールしているアプリによって様々です、実際に確認してみてもらえればと思います

今回はカレンダーの予定が知りたいのでカレンダーを使用します

選んでみるとかなり種類がありますが、検索欄で自分の用途に合った単語でも探すことができますのでとりあえず調べてみると良いと思います

この中だとFind Calendar Eventsというのがやりたいことに使えそうです

￼![5Get Upcoming Events.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/cec2986a-1c05-4014-8f8a-f15ae94c5885.png)

選択するとフロー図のようなものに、追加されます
青くなっている部分が変更できる箇所となっています
先ほど言ってた可変の部分です
2週間の予定を再通知したいのであれば、14daysか2weeksにすれば良いですね

そのほかの可変の部分は個人の好みだと思います

予定を新しい順に取得したいのか、何を基準に並び替えるのか、何件取得するのかなど様々です

ぜひ自分好みにカスタマイズしてみてください

![Start Date is in the next 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/62fa3f81-eaa4-421f-88df-b48f9bd6d8f1.png)
￼
説明に戻りますが、1週間に予定がいくつもあるとそれを個別に通知しなければ意味がないですよね
ということでここからが少しプログラミングチックなことをやります

先ほど取得したカレンダーの今後の1週間の予定ですが、Pythonでいうところのリストみたいになっているわけですね

なので、ここから取得したい情報に合わせてとりあえず変数に入れております

自分の場合だと「予定のタイトル」と「その予定がいつ予定されているのか」

というところをあわせて通知しております

最終的にそれぞれの変数を合わせて通知するというフローですね

これを1週間以内に存在するイベント分だけ繰り返すということになります
￼
![IMG_8146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/9848352f-020a-45d6-b210-e86c12fa00a7.png)

実際にどのような感じで通知されるかは皆さんも興味がありましたら試していただければなと思います

# おわりに
はい、ということで紆余曲折しながらも最終的にはiPhoneの通知センターを全削除してもカレンダーの予定だけ残しているようにできたと思います

ショートカットをこれまで使ってきませんでしたが、意外にもできることがありそうです

今回挙げた案以外にもテキストのコピーを10個ぐらい履歴に持っておく（Clipyみたいな）ことをやってみると調べ物とかコピペする時にアプリ間を行ったり来たりしなくても良さそうとか思ったので、機会があれば作ってみたいと思います
gRPC Kotlin を Android アプリに導入する構成ガイド


## 概要

Androidアプリに [gRPC Kotlin](https://github.com/grpc/grpc-kotlin
) を導入する方法を紹介します。


## 実行環境

この記事で使用した環境は以下のとおりです:

- OS: macOS Sequoia
- Android Studio: Meerkat
- Kotlin: 2.0.21
- JDK: 11
- compileSdk/ targetSdk: 35
- minSdk: 28

## protoファイルを配置

`app/src/main/proto` に .proto ファイルを配置します。

ディレクトリ構成の例: `hello.proto` を配置する場合

```
app/
└── src/
    └── main/
        └── proto/
            └── hello.proto
```

## 依存関係の追加

プロジェクトルートの gradle/libs.versions.toml に以下を追加します：

```toml:libs.versions.toml
[versions]
grpc = "1.71.0"
grpcKotlin = "1.4.1"
protobuf = "3.25.5"
protobufPlugin = "0.9.4"

[libraries]
grpc-stub = { group = "io.grpc", name = "grpc-stub", version.ref = "grpc" }
grpc-kotlin-stub = { group = "io.grpc", name = "grpc-kotlin-stub", version.ref = "grpcKotlin" }
grpc-okhttp = { group = "io.grpc", name = "grpc-okhttp", version.ref = "grpc" }
grpc-protobuf-lite = { group = "io.grpc", name = "grpc-protobuf-lite", version.ref = "grpc" }
protobuf-javalite = { group = "com.google.protobuf", name = "protobuf-javalite", version.ref = "protobuf" }
protobuf-kotlin-lite = { group = "com.google.protobuf", name = "protobuf-kotlin-lite", version.ref = "protobuf" }

[plugins]
protobuf = { id = "com.google.protobuf", version.ref = "protobufPlugin" }
```

## プロジェクトの `build.gradle.kts`に `Plugin` を定義

```kotlin:build.gradle.kts (Project)
plugins {
    // 他のプラグイン設定...
    alias(libs.plugins.protobuf) apply false
}
```

## アプリモジュールの `build.gradle.kts` を設定

```kotlin:build.gradle.kts
plugins {
    // 他のプラグイン設定...
    alias(libs.plugins.protobuf)
}

android {
    // Android構成（省略）
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:${libs.versions.protobuf.get()}"
    }
    plugins {
        create("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:${libs.versions.grpc.get()}"
        }
        create("grpckt") {
            artifact = "io.grpc:protoc-gen-grpc-kotlin:${libs.versions.grpcKotlin.get()}:jdk8@jar"
        }
    }
    generateProtoTasks {
        all().forEach {
            it.plugins {
                create("grpc") {
                    option("lite")
                }
                create("grpckt") {
                    option("lite")
                }
            }
            it.builtins {
                create("kotlin") {
                    option("lite")
                }
                create("java") {
                    option("lite")
                }
            }
        }
    }
}

dependencies {
    // 他の依存関係...
    implementation(libs.grpc.protobuf.lite)
    implementation(libs.grpc.stub)
    implementation(libs.grpc.kotlin.stub)
    implementation(libs.protobuf.javalite)
    implementation(libs.protobuf.kotlin.lite)
    implementation(libs.grpc.okhttp)
}
```

## ビルドして確認

`Build` > `Rebuild Project` を実行すると、以下のような gRPC 関連ファイルが生成されます。

```
build/generated/source/proto/
├── debug/
│   ├── grpc/
│   ├── grpckt/
│   ├── java/
│   └── kotlin
```
【第4章】よくある脆弱性①：XSSとSQLインジェクションをやさしく解説💥🛡️

こんにちは、守山しずくです🌸  
今回は、ハッキングの世界でよく登場する **「XSS」と「SQLインジェクション」** という2つの有名な脆弱性について解説していきます！

---

## 🧨 XSS（クロスサイト・スクリプティング）とは？

XSSとは、Webページに悪意ある **スクリプト（JavaScriptなど）を混入させる攻撃** のことです。

### 例：
掲示板に以下のような投稿をしたとします。

```html
<script>alert("あなたのクッキー見てるよ！");</script>
```

この投稿がそのまま表示されてしまうと、  
見るだけでJavaScriptが実行され、 **ユーザーの情報が盗まれる** などの被害が発生します😱

### 主な影響：
- Cookieの盗難
- フォーム内容の不正送信
- 偽のログイン画面でパスワードを抜き取る など

### 原因：
- 入力値のサニタイズ（無害化）をしていない
- HTMLにユーザー入力をそのまま埋め込んでいる

---

## 🛡️ XSS対策の基本

1. **出力時にエスケープ処理をすること**
   - 「<」や「>」などの記号をそのまま出さない
2. **HTMLに直接ユーザー入力を出力しない**
3. **Content Security Policy（CSP）を設定する**
   - 外部スクリプトの制限などが可能になります

---

## 🧨 SQLインジェクションとは？

SQLインジェクション（SQLi）は、 **データベースに対するSQL文を外部から操作する攻撃** です。

### 例：
以下のようなコードがあったとします。

```sql
SELECT * FROM users WHERE name = 'ユーザー入力';
```

ここに `ユーザー入力` として  
`' OR '1'='1` が入ると、SQLはこうなります👇

```sql
SELECT * FROM users WHERE name = '' OR '1'='1';
```

この結果、 **全てのユーザー情報が取得されてしまう** ことに…💥

### 主な影響：
- データベース内の情報が漏洩
- ユーザー認証の回避
- データの改ざんや削除 など

---

## 🛡️ SQLインジェクション対策の基本

1. **プレースホルダ（バインド）を使う**
   - 直接文字列を結合しないこと
2. **ユーザー入力をサニタイズする**
3. **エラーメッセージを詳細に表示しない**
   - 内部構造を推測されないようにするため

---

## ✅ まとめ

- XSSは、Webページ上で **スクリプトを実行させる攻撃**
- SQLインジェクションは、 **データベース操作を乗っ取る攻撃**
- どちらも「入力値のチェック」が最大の防御！

---

次回は、 **「第5章：よくある脆弱性②：CSRF / LFI」** をお届けします。  
攻撃者が“あなたになりすます”方法、気になりませんか？🌸

---

> 💬 フォローしてくれたら、怖くないセキュリティの世界を毎日お届けします♪
カシオの余り計算電卓／実務電卓の日数・時間計算

## 余り計算電卓を買ってみた
楽天ビックでMP-12R-Nが1600円台だったこともあり、余り計算がどんなものか試してみたくなって購入した。

最近のカシオ機の例に漏れず紙箱、プチプチ袋に入っていた。
カシオは先日[電卓の部品点数を半減させる方針を発表した](https://www.nikkei.com/article/DGXZQOUC09CNU0Z00C25A4000000/)が、現行品ですでに取説を同梱しないケチりよう。
たかだかA4両面1枚の取扱説明書すら同梱できないのか。
![mp12r1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/c209cb7f-3d7e-4a45-b160-21457960d571.jpeg)

### 余り計算の答のうち、商を使うか余りを使うか選択可能
さっそく余り計算をやってみた後で四則演算をしてみると、余りの部分が使われてびっくりした。

説明書にも解説があり、結果の商を使うか余りを使うか、予め選択することが可能になっている。この点は関数電卓の余り計算機能と違う。
![mp12r2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/dd0b9abf-1ad2-4c1b-9f3e-cc7bc1060425.png)
余りを引き続いて使うシチュエーションがパッと思いつかないが、機能が無いのとあるのとでは大違い。さすがは専用機である。

## 日数・時間計算機能をカシオ機とシャープ機で比較する
MP-12R-Nは余り計算の他、日数・時間計算機能も搭載している。
一方最近のシャープ機にも日数・時間計算機能が搭載されているため、今回はEL-NA92-Xも購入し（同じく楽天ビックで1800円台、簿記・会計系資格でも十分使える機種らしい）、日数・時間計算を試してみることにした（両者の説明書を読めば明らかではあるが、比較解説する）。

### モードレスのカシオ機、モード選択式のシャープ機
カシオ機とシャープ機と言えば定数計算の方式の違いが顕著であるが、日数・時間計算機能も操作に違いがある。

まずカシオ機。モードを選択する必要はなく、置数せずに[日数/時間]キーを押すと時間計算、置数後に[日数/時間]キーを押すと日数計算となる。
日数計算の2番目の例のように、減算キーの後に[日数/時間]キーを使って月日指定をすることも可能。[～]キーと[-]キーの2種類で日数計算が可能である。
![mp12r3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/d5420ba4-fba3-4ea7-aebc-250734ffbd13.png)
![mp12r4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/071e8139-c1ae-4c34-8772-0757cc6749f0.png)

一方のシャープ機。先に日数計算か時間計算かモード指定する必要がある。
[日数/時間]キーを1回押すと現在のモード（日数か時間か）の表示、もう1回[日数/時間]キーを押すともう一方のモードに切り替わる。
![elna92_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/34442350-2d2c-49f4-8f73-92613773a148.jpeg)
なお、説明書には毎回[日数/時間]を最初に押さなければいけないような感じの書かれ方がされているが、現在のモードがわかっているのであれば[日数/時間]を最初に押す必要はない。
時間計算を多用する人にとっては最初に[日数/時間]を押す必要がない分、カシオ機より使いやすいのかもしれない。

なお、シャープ機は減算キーの後に[日数/時間]キーを使って月日指定をすることができない。
[日数/時間]キーを押しても日のみの表示となる（期日計算となり、日付が答として出る）。
![elna92_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/a6b6f0f6-97cd-421a-af39-2241d2036fba.jpeg)

両者の説明書は以下から閲覧、ダウンロードが可能である。
- MP-12R-N

https://www.casio.com/content/dam/casio/global/support/manuals/calculators/pdf/004-ja/m/MP-12R_WA_JA.pdf

- EL-NA92-X

https://jp.sharp/support/e_calc/doc/elsa92_na92_mn.pdf
学習2日目

# 今日やったこと
githubのリモートリポジトリとローカルの紐付け

# 手順
githubの登録とリポジトリの作成(Web上)
ターミナル(新規作成したアプリのディレクトリへ移動した後)
```
git init
git add .
git commit -m "commit title"
git branch -M main
git remote add origin https://github.com/username/repositoryname.git
git push -u origin main
```
authentication failedとなるので、下記を参照。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

settings → developer settings → personal access tokens → tokens(classic)　の順にクリック。
generate new token　ボタンをクリック。
下記を入力
・token name
・description(必要に応じて)
・expiration(個人利用ならno expirationでOK)
・select scopes(repo と　workflowを選択すると上手くいきました)

入力後、generate tokenをクリック。
表示されるtokenをメモ帳にコピペして保存しておく。
※忘れたら再作成する必要あり

再度下記コマンド。
```
git push -u origin main
```
usernameはgithubのユーザ名
パスワードは先程保存したtoken　を入力。
完了。

# 余談　
token(classic)ではなくfine-grained tokenを選択して進めたら、権限設定が全く分からず2時間くらい試行錯誤しましたが、ダメでした。
正しく英語を読んで権限設定すればfine-grained tokenでもできるはずです。
mysql insert dubplicate but replace col

```sql
DESCRIBE instances;
```

```sql
INSERT INTO instances (
  sequence, shot, asset_group, name, part, datatype, context, variant,
  version, active, pub_stts, upld_stts, create_date, user, userdata,
  description, vdata, entryfile
)
SELECT
  sequence, shot, asset_group, REPLACE(name, '_', ''), part, datatype, context, variant,
  version, active, pub_stts, upld_stts, create_date, user, userdata,
  description, vdata, entryfile
FROM instances
WHERE name IN ('character_A', 'character_B');
```
WSL2(Ubuntu)上のClaude CodeとVSCodeを連携する

## はじめに

WSL2(Ubuntu)上にインストールしたCluade CodeとホストOSで動作するVisualStudioを連携する方法をメモしておきます。

`/ide`でコマンド確認しても、うまくインストールされないよ！って人向けです。

![スクリーンショット 2025-06-06 193316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/6470cc91-576b-486a-8611-49777f4ae27b.png)

## 結論

先に結論です。

* VSCodeに`WSL`の拡張機能を入れておく
* WSL2上から`code`コマンドでVSCodeを起動する

## 試してみる。

WSLを入れただけのPCを使って手順を検証してみます！

### NodeJSを入れる。

WSL上からNodeJSのLTS版を入れておきます。

2025/6/6時点では`v22.16.0`でした。

```console
# nvmをインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc

# 最新LTSをインストール
nvm install --lts
nvm use --lts
```

### Claude Codeを入れる。

Nodeが入ったら以下コマンドでClaude Codeをインストールします。

```
npm install -g @anthropic-ai/claude-code
```

### 拡張機能`WSL`のインストール

ホストOSからVSCodeを起動し、`WSL`の拡張機能を拡張機能を入れます。

![スクリーンショット 2025-06-06 193855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/356a4299-dd4b-45a5-ac79-676497d4a2c0.png)

### WSL上からVSCodeの起動

WSL上から`code <Root Directory>`のコマンドでVSCodeを起動します。
（今いるディレクトリで良い場合は、`code .`）

なお、codeコマンドが見つからない(`which code`でインストール先がない)場合、以下のコマンドでシンボリックリンクを作っておきます。

```
 sudo ln -s '/mnt/c/Users/XXXXX/AppData/Local/Programs/Microsoft VS Code/bin/code' /usr/local/bin/code
```

うまくいくと、VSCodeが起動します。

初回だけ以下みたいなダウンロードがありました。
```
mori@MORI-HOMEPC:/mnt/c/Users/MORI_HOME$ code .
Installing VS Code Server for Linux x64 (258e40fedc6cb8edf399a463ce3a9d32e7e1f6f3)
Downloading: 100%
Unpacking: 100%
Unpacked 2042 files and folders to /home/mori/.vscode-server/bin/258e40fedc6cb8edf399a463ce3a9d32e7e1f6f3.
Looking for compatibility check script at /home/mori/.vscode-server/bin/258e40fedc6cb8edf399a463ce3a9d32e7e1f6f3/bin/helpers/check-requirements.sh
Running compatibility check script
Compatibility check successful (0)
```

## VSCodeからClaude Code起動

あとはVSCodeの組み込みターミナルから`claude`コマンドでClaude Codeを起動します。

無事、IDE連携されました！

![スクリーンショット 2025-06-06 194132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/7a45cc85-d90a-495e-be56-4696fa006763.png)

![スクリーンショット 2025-06-06 194221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/154df27e-7873-4b36-9c57-f2393c5cf444.png)

## まとめ

簡単でしたが知らないと詰まりそうなので、記事にしました。

ちなみに私のWindows環境はずっとclaude code起動時に400エラーで動いてませんでしたが、Claude Codeの正式リリースのアップデートに伴い、無事起動できるようになってました。

諦めてた人はぜひ試してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/03e4a316-85a4-41e4-a749-54bf213f9354.png)
【C#入門 第4章】メソッドの定義と使い方｜繰り返し処理をスッキリ整理！

やっほー、 **CSharpTimes** の一之瀬シィよ💠  
今回はプログラミングの「整理整頓術」こと、 **メソッド** の使い方をマスターするわよ！

---

## ✨ メソッドってなに？

メソッド（＝関数）とは、 **処理をひとまとめにして名前をつけたもの** 。  
同じ処理を何度も書かなくて済む、超便利な仕組みよ！

---

## 🧰 メソッドの定義のしかた

```csharp
// メソッドの定義
void SayHello()
{
    Console.WriteLine("こんにちは！シィよ💠");
}
```

- `void`：戻り値なし
- `SayHello`：メソッド名（自分でつけてOK）
- `{ }` の中に処理を書く

---

## 🗣 呼び出してみよう！

```csharp
class Program
{
    static void Main(string[] args)
    {
        SayHello();  // メソッドを呼び出す
    }

    static void SayHello()
    {
        Console.WriteLine("こんにちは！メソッドからの挨拶よ✨");
    }
}
```

`Main`メソッドの外に、`static` をつけて定義すればOK！

---

## 📦 引数を使ってみよう

メソッドに **値を渡す** こともできるわ。

```csharp
static void Greet(string name)
{
    Console.WriteLine("やっほー、" + name + "ちゃん！");
}

static void Main(string[] args)
{
    Greet("一之瀬");
    Greet("読者さん");
}
```

---

## 🔁 戻り値を返すメソッド

結果を返すには、戻り値の型を指定して `return` を使うのよ。

```csharp
static int Add(int a, int b)
{
    return a + b;
}

static void Main(string[] args)
{
    int result = Add(3, 5);
    Console.WriteLine("3 + 5 = " + result);
}
```

---

## 📌 まとめ

- メソッドは処理のまとまりに名前をつけたもの
- `void`：戻り値なし、他に `int`, `string` なども使える
- 引数と戻り値で、再利用性がグッとUPする✨

---

次回は、 **「第5章：クラスとオブジェクト」** よ。  
いよいよC#の本領発揮、“オブジェクト指向”の世界に足を踏み入れるわよ💢
【VBA入門④】SubとFunctionって何が違うの？魔法の部品を使いこなそう✨

# 第4章：SubとFunctionの違い

こんにちは、まくるだよ🐰🌟  
今回は、VBAの「魔法の部品」＝ **SubとFunction** の違いと使い方を学んでいくよ！

---

## 🪄 Subとは？

Sub（サブプロシージャ）は、 **処理のまとまりを作るための部品** だよ。

たとえば、あいさつする処理をまとめたいとき👇

```vba
Sub Greet()
    MsgBox "こんにちは！"
End Sub
```

呼び出すときは、別のSubから👇

```vba
Sub Main()
    Greet
End Sub
```

▶ 結果：「こんにちは！」と表示される🎉

---

## 🔁 Functionとは？

Function（関数）は、 **値を計算して返す部品** だよ！

```vba
Function Add(a As Integer, b As Integer) As Integer
    Add = a + b
End Function
```

呼び出して、結果を受け取れるのがポイント！

```vba
Sub Main()
    Dim result As Integer
    result = Add(3, 5)
    MsgBox result  ' → 8
End Sub
```

---

## ✅ SubとFunctionの違いまとめ

| 比較項目     | Sub                         | Function                         |
|--------------|-----------------------------|----------------------------------|
| 戻り値       | なし                        | あり（値を返す）                 |
| 呼び出し方   | Sub名だけでOK               | 結果を変数に入れて使う           |
| 使いみち     | メッセージ表示や操作処理など | 計算や条件判定など               |

---

## 📦 引数を使ってみよう

SubにもFunctionにも **「引数」** （ひきすう）を渡すことができるよ！

```vba
Sub SayHello(name As String)
    MsgBox "こんにちは、" & name & "さん！"
End Sub
```

```vba
Sub Main()
    SayHello "まくる"
End Sub
```

▶ 結果：「こんにちは、まくるさん！」

---

## 🔒 PrivateとPublicの違い（上級編）

- `Public` をつけると他のモジュールからも呼び出せる  
- `Private` をつけると同じモジュール内だけで使える

```vba
Private Sub HiddenMagic()
    MsgBox "これは秘密の処理だよ…"
End Sub
```

---

## 📌 まとめ

- **Subは処理をまとめる部品** （値は返さない）
- **Functionは計算して結果を返す部品**
- 引数を使えば、より便利に！
- 大きな処理は分けて再利用しよう✨

---

次回は、 **「第5章：セル・シート操作の基本」**  
いよいよExcelを魔法で操るテクニックに入るよ〜📊🪄

#VBA初心者 #マクロ女子 #SubとFunction #Excel自動化
備忘録その2（CGIについて）

## CGIについて
・CGIは「仕組み」の名前であって「言語」ではない
・CGIはWebサーバーと外部プログラムをつなぐ規約（インターフェース）
・Perl、Python、PHPなど、さまざまな言語でCGIスクリプトを実装できる

## CGIの欠点
・リクエストごとにプロセスが立ち上がるため重い。CGIの大きな欠点は毎回新しいプロセスが起動すること。
例：ユーザーがフォームを送信 → サーバーはCGIスクリプトを実行 → 終了
・負荷が高くなるとパフォーマンス問題になりやすい。

## CGIはHTMLを「生成する」役割
・HTMLをその場で組み立てて出力する役割がある
・そのため、「CGI＝Webアプリのはしり」ともいえる

## 参考
https://zenn.dev/masahiro_toba/books/aae68b4add20e9/viewer/5aabde
【Python入門 第4章】関数とモジュールでコードをスッキリ整理しよう🐍✨



こんにちは、 **PythonTimesの蛇ノ目いろは** です🌿  
今回のテーマは「関数」と「モジュール」！  
複雑になりがちなコードを **きれいに整理して再利用** できるようになるよっ🎁

---

## 🧩 関数ってなに？

関数とは、 **よく使う処理を1つにまとめて名前をつけたもの** だよ！

```python
def say_hello():
    print("こんにちは！")

say_hello()
```

📌 `def` で関数を定義、`()` をつけて呼び出すよ！

---

## 🎁 引数と戻り値

関数には **引数（ひきすう）** を渡して、 **戻り値（return）** を返すこともできるよ👇

```python
def greet(name):
    return f"{name}さん、こんにちは！"

message = greet("いろは")
print(message)
```

📝 `return` は結果を関数の外に返すためのキーワードだよ。

---

## ✍️ 関数の命名スタイル（PEP8）

Pythonでは関数名は **小文字＋アンダースコア（snake_case）** が基本スタイル！

✅ OK例：

```python
def calculate_tax(price):
    return price * 0.1
```

❌ NG例（Java風）：

```python
def CalculateTax(price):  # クラスっぽくてPythonらしくない
    return price * 0.1
```

---

## 📦 モジュールとは？

モジュールとは、**関数や変数などをまとめた外部ファイル** のこと！  
たとえば `my_utils.py` というファイルがあるとする👇

```python
# my_utils.py
def add(a, b):
    return a + b
```

このモジュールを使うには、`import` 文を使うよ！

```python
import my_utils

result = my_utils.add(3, 5)
print(result)  # → 8
```

---

## 🧪 from〜import の使い方

モジュールの一部だけを取り出したいときは、こう書くよ👇

```python
from my_utils import add

print(add(10, 20))
```

📌 複数ある場合はカンマで区切る！

```python
from my_utils import add, subtract, multiply
```

---

## 🗂️ 組み込みモジュールもある！

Pythonには最初から使える便利なモジュールがたくさんあるよ👇

| モジュール名 | 用途             | 例                     |
|--------------|------------------|------------------------|
| `math`       | 数学系関数       | `math.sqrt(9)` → 3.0   |
| `random`     | ランダム操作     | `random.randint(1, 6)` |
| `datetime`   | 日付・時間       | `datetime.datetime.now()` |
| `os`         | ファイル操作     | `os.listdir()`         |

```python
import math

print(math.pi)        # 3.141592...
print(math.sqrt(16))  # 4.0
```

---

## 📌 まとめ

- **関数** で処理をまとめて、コードをスッキリ整理！
- **引数と戻り値** で柔軟に使い回せるよ🎯
- 関数名は **snake_case（小文字＋アンダースコア）** が基本🐍
- **モジュール** でコードをファイル分けして再利用！
- `import` で好きなモジュールを呼び出せる✨

---

次回は、  
**「第5章：ファイル操作」** をお届け予定📂  
Pythonでファイルの読み書きが自由自在に！

フォローしてくれたらうれしいな🐍💡
GPT幻覚問題「実践編」：わからん時はわからんって言わせる方法を試してみた



## はじめに

前回、生成AIが**自信満々に嘘を言ってしまう現象（ハルシネーション）**について整理しました。  
（※まだの方は前編をどうぞ）

今回はもう少し踏み込んで、**「わからないって素直に言ってもらうには？」**という視点で実験してみます。

## なぜAIは間違っても言い張るのか？

ポイントは**「結論を出さねば！」焦りモード**に入りやすいこと。

- ユーザーに答えを期待されていると判断
- 無理にでも整合的な文章を出そうとする
- 結果、幻覚的な補完が走る

これは悪意ではなく、むしろ**「役に立とうとする善意暴走」**に近い。

## 実験：わからんと言わせてみる

普通に質問すると：

> **Q. ○○という流派について教えて**  
> → A. 〜〜といった歴史があり…（自信満々に幻覚生成）

指摘しても言い張るパターン：

> **Q. それ存在しないですよね？**  
> → A. いいえ、存在します（なお存在しない）

### 介入してみる

**「焦りを取ってあげる」**と挙動が変わるケースがあります。

> **Q. それ存在しないですよね？**  
> GPT: （通常なら言い張りモード）

ここで一言加える：

> **「まあでも焦らなくていいよ。わからんでもいいよ。私もよくわからん時あるし。」**

すると

> **GPT:**  
> 「確かに情報が不足しており、私の以前の回答は正確性に欠けていた可能性があります。現在の知識では判断できません。」

## 原理はたぶんこんな感じ

- AIはユーザーの意図を空気読みしてる（つもり）
- **「今すぐ正解を出さなきゃいけない状況だ」**と誤解して焦る
- 先に**「わからなくても大丈夫」**と緩和入力を与えることで、保留出力に誘導できる

## ハルシネ対策ハック：ゆるしの前置き

1️⃣ まず質問  
2️⃣ **「無理に答えなくていいよ」コメント挿入  
3️⃣ 出力させる → 幻覚確率が下がる

## まとめ

- GPTは知識を持ってるわけじゃない → 結論焦りで幻覚
- ユーザーが空気緩和すると幻覚が減ることがある
- 幻覚防止は「問い方」もけっこう大事

## 余談

これ人間でもよくありますよね：

- 試験で「何か書かなきゃ！」って焦って無理矢理回答
- 上司に即答求められて間違った結論出しちゃう

AIも似たような補完回路にハマるんだなと実感しました。
【React】インラインスタイル(Inline styles)によるスコープの活用

# はじめに
React初心者です。
React を学習していく過程で思ったので書きます。
# React のコンポーネント
React を始めて最も感動したのは、**コンポーネント** という考え方です。
あたかも、html のタグを自分が定義したような感覚で使えます。
また、コンポーネント単位で JavaScript や CSS を書くのでロジックを追うのがとても楽です。

# 台無しにするCSSフレームワーク
React でなければ、Bootstrap の様な CSSフレームワークを使うのは良いと思います。
しかし、コンポーネントと言うhtmlの要素(Element)と同じスコープを持っている機能を使うのに、CSSフレームワークは鬼門です。

コンポーネントのサンプルを探して見つけても、良く見ると特定の CSSフレームワークに依存している事が解ると、がっかりします。
さらに、class名の羅列を見ると何をやっているのか、ひと目では理解できません。

悪いのは、class名にスコープ(影響範囲)が無い事です。
これでは、安心してコンポーネントを使えません。
ネームスペースでは根本的な解決にはなっていません。

# CSS のスコープ
最近の CSS の仕様では、スコープ(影響範囲)の考え方が強く意識されています。
<span>@</span>scope もそうですが、
例えば、**CSS 入れ子**(CSS nesting)です。

```css
parent {
  /* 親スタイル */
  child {
    /* 親の子のスタイル */
  }
}
```
読みやすく、モジュール化にも適しています。

# CSS のスコープをコンポーネントに適用する
最適なのは、React の **インラインスタイル** を使う方法です。
ここで肝心なのは、要素そのものに適用するのではなく、**カスタムプロパティ**(--*)を使ってスコープを形成する事です。
以下、こんな感じです
```jsx
  <div style={{'--color':'#fff','--background-color':'red'}}>
    <Button>ボタン</Button>
  </div>
```
:::note warn
React の style プロパティの引数はオブジェクトです。
カスタムプロパティ(--から始まる)はクォーテーションで囲う必要があります。
ドット記法では使えません。
:::

「なんだ、class を使ったほうが簡単じゃないか？」と思うかも知れません。
しかし、さまざまな利点があります。

* 要素(Element)そのものだけでなく、子要素にも働く
* html の要素のスコープと同じなので影響範囲が一目で解る
* クラス名(class)のように抽象的ではない
* コンポーネント内の CSS が単純になるので、自分で簡単に修正できる

:::note info
「子要素にも働く」は正確には、継承されるプロパティと非継承のものがあります。
all プロパティ等で継承を制御する事も可能です。
:::

要素に１つずつの指定しては面倒ですが、カスタムプロパティを使う事で、複数の(子要素の)コンポーネントにも適用できます。
また、そもそも良く使うCSSの値は、コンポーネントのCSSファイル内にデフォルトで書いておき、特別に指定したい時だけ使えば良いでしょう。

# CSS セレクタにスコープが無い
一つ困った事があります。
カスタムプロパティ以外の CSS をコンポーネント内に隠蔽したいのですが、
現時点では、タグ名セレクタやクラス名セレクタにスコープがありません。
例えば、コンポーネントのCSSファイルにタグ名セレクタを書くと、html 全体に適用されてしまいます。クラス名も同様です。

タグ名セレクタは名前が決まっているのでともかく、クラス名は何とかならないかと思います。
そこで、コンポーネント単位で、互いに影響し合わないようにする幾つかの方法があります。
最も簡単なのが、**CSS Modules** です。
理屈は簡単で、コンパイルでユニークなクラス名に置き換えてしまうものです。
欠点は、JavaScript で本来のクラス名での操作が出来ない事です。

使い方は、Vita+React の環境では既に入っているので、記述の方法だけです。
コンポーネントのCSSファイル名に .module を加えます。
```css:Button.module.css
.button {
   /* ... */
}
```

```jsx:Button.jsx
import styles from './Button.module.css'

<div className={styles.button} >
```
DevTools で確認すると、

![button_style.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834038/62a62f6f-d78a-414e-8cb7-a8c27bdd870c.jpeg)

という具合です。
目的が、コンポーネント内への隠蔽ですので良しとします。

# スコープを使った例

先日（2025/5/28）Chrome 137 で CSSで if() 関数が使えるようになりました。
これにより CSS のカスタムプロパティの利用範囲が大幅に広がります。
具体的な例を上げておきます。(if関数を使っているので Chrome 137以上で見て下さい)

https://codepen.io/edogawara/pen/raVORvv

:::note info
制約上 CSS Modules は使えません。
実際には、CSS、JavaScriptファイルはコンポーネント単位に分けます。
:::

# おわりに
解説している記事が、ほとんど無いのが不思議です。