OmniAICreator/Qiita-1.07M huggingface dataset:
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIで契約書レビューを自動化する方法とは？

 
🧩 1. はじめに：なぜ契約書レビューの自動化が必要なのか？

法務部門における契約書レビューは、時間と人手がかかる繰り返し業務の代表例です。契約書は複雑な法的文言で構成されており、1つ1つを人手でチェックするには多大なコストがかかります。また、ヒューマンエラーやナレッジの属人化も課題です。

近年、自然言語処理（NLP）と機械学習の進化により、この業務をAIで補助・自動化する道が現実的になりました。本記事では、契約書レビュー業務をAIで自動化するための基本アプローチと、実務に役立つ実装方法をご紹介します。

—

🧠 2. 技術概要：使われる技術とその仕組み

契約書レビューAIには主に以下の技術が活用されます：

* 自然言語処理（NLP）：文書の構造解析、キーワード抽出
* BERTなどの事前学習済みモデル：文脈理解と分類
* ルールベースとの併用：業界・社内特有のルールの反映
* LLM（例：GPT）による要約・異常検出

特に重要なのは「分類タスク（これはどの種類の条項か？）」「リスク検出タスク（これはリスクの高い表現か？）」の2つです。

—

🧪 3. 実装例：Python × Transformersで簡単レビューAIを構築

今回は、Hugging Face TransformersとScikit-learnを使って、契約条項の分類モデルを構築します。例として、「機密保持条項」「損害賠償条項」「契約終了条項」などの分類を行います。

🔧 3.1 データ準備

まずは契約書の条項を収集・前処理し、以下のような形式にします：

csv形式：

| text           | label           |
| -------------- | --------------- |
| "本契約に基づき..."   | confidentiality |
| "当事者のいずれかが..." | termination     |

🔍 3.2 モデルの学習

huggingface/bert-base-japanese を使って分類モデルを作成します。

python（抜粋）:

from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load\_dataset

# データ読み込み

dataset = load\_dataset('csv', data\_files='clauses.csv')

# トークナイザーとモデル

tokenizer = BertTokenizer.from\_pretrained('cl-tohoku/bert-base-japanese')
model = BertForSequenceClassification.from\_pretrained('cl-tohoku/bert-base-japanese', num\_labels=3)

# トークン化関数

def tokenize(example):
return tokenizer(example\['text'], truncation=True, padding='max\_length', max\_length=256)

encoded\_dataset = dataset.map(tokenize)

# Trainerの準備

training\_args = TrainingArguments(output\_dir="./results", num\_train\_epochs=3)
trainer = Trainer(model=model, args=training\_args, train\_dataset=encoded\_dataset\['train'])

# 学習実行

trainer.train()

🔍 3.3 推論・結果出力

text = "受領者は、本契約に基づき開示された情報を..."
inputs = tokenizer(text, return\_tensors="pt", truncation=True, padding=True)
outputs = model(\*\*inputs)
pred = outputs.logits.argmax(dim=1)
print(pred)

→ 出力: "confidentiality"（機密保持条項）

—

💡 4. 現場で役立つTIPS & よくある落とし穴

✅ 現場TIPS：

* 条項の事例をできるだけ多様に集めることが精度向上のカギ
* BERTのfine-tuningより、小規模業務にはRoBERTaやLightモデルも有効
* 社内のルール（例：契約書テンプレ）を後処理で明示ルール化すると実用性UP

❌ よくある失敗：

* ラベルの定義が曖昧で学習データがぶれる
* 1文ではなく複数条文が混在しているため文の切り出しが不適切
* 精度が高くても「説明可能性」がないと法務部に受け入れられない

—

🚀 5. 応用・拡張：大規模契約管理システムへの組込み

本記事のような分類AIは、以下のような業務拡張にも応用できます：

* リスクフラグ付きレビュー支援ツール
* 条項の自動要約と比較（LLM併用）
* 社内ポリシーへの適合性チェック

例えば、FastAPI + Vue.jsでWebアプリ化すれば、法務部がGUI上で契約書をアップロード → AIが分類とコメント出力 という流れも可能です。

—

🧾 6. まとめ：AI契約レビューの可能性と課題

✓ メリット：

* 人的コスト削減・レビュー速度向上
* ナレッジの可視化と属人性の排除
* 一定水準の品質維持が可能

⚠ デメリット：

* 日本語法務文書の複雑性 → 高品質なデータ整備が前提
* AIの説明可能性・責任所在の整理が必要

将来的には、生成AIと組み合わせた「契約生成 → チェック → 修正 → 提出」までのフルオートメーションが視野に入ります。

—

👋 おわりに

「契約レビューをAIに任せるなんてムリでしょ…」と思っていた方も、意外と実用的で現場で使える可能性があると感じていただけたのではないでしょうか？

まずは自社テンプレに特化した小さな分類モデルから、PoC（概念実証）を始めてみましょう！

🔗 GitHubサンプルコード：準備中（ご希望があれば公開可）
猿でもわかるAIビジネス活用シリーズ 🐵📊 AI導入に必要なコストとROIの考え方

 
 

## 「AI導入に必要なコストとROIの考え方」〜現場エンジニアの視点から解説〜
 
## 🧩 1. はじめに：なぜAI導入のROIが語られるべきなのか？

昨今、生成AIや機械学習の進化により、「AIを使えば業務が効率化する」という期待が高まっています。しかし、\*\*「とりあえずAIを導入してみよう」\*\*という姿勢は、結果として高コスト・低効果を生み出し、現場のエンジニアが疲弊するケースも少なくありません。

本記事では、**AI導入にかかるコスト構造とROI（投資対効果）をどう評価すれば良いか**を、実践的な観点から解説します。特に、**現場で実装や運用を担うエンジニアがどう関わるべきか**を軸にお話ししていきます。

---

## 🧠 2. AI導入の全体像とコスト構成

AI導入のライフサイクルは以下のように段階的に進みます：

1. **課題定義とPoC（概念実証）**
2. **データ収集・前処理**
3. **モデル選定と学習**
4. **システム統合とUI開発**
5. **運用・モニタリング・改善**

この中で発生する主なコストは以下の通りです：

| コスト項目      | 内容例                         |
| ---------- | --------------------------- |
| 人件費        | データサイエンティスト、MLOps、DevOpsの工数 |
| データ取得・整備費  | ラベル付け、スクレイピング、ストレージ費用など     |
| 学習環境・インフラ費 | GPUクラスタ、クラウドのトレーニングコスト      |
| ソフトウェア費    | API利用料、AutoMLやSaaSツールなど     |
| 運用保守費      | モデル再学習、エラー監視、サービス可用性対応      |

**ポイント：**
PoCは安く始められるものの、「本番化・長期運用」を見据えた設計でなければROIが悪化します。

---

## 💻 3. 実例：AIチャットボット導入のROI試算とコードスニペット

### 3.1. 背景と仮定

あるECサイトにおいて、カスタマーサポート業務にAIチャットボット（OpenAI APIベース）を導入しようとします。

* サポート担当者の時給：1,800円
* 月間対応件数：10,000件
* 件数あたりの平均対応時間：4分
* チャットボットによる自動対応率：60%
* OpenAI APIコスト：0.002ドル/1Kトークン

---

### 3.2. コスト・効果試算のコード（Python）

```python
# 前提条件
human_cost_per_hour = 1800
time_per_ticket_min = 4
auto_reply_rate = 0.6
monthly_tickets = 10000
openai_api_cost_per_ticket = 0.3  # 仮に0.3円/件とする

# 人件費削減効果
saved_tickets = monthly_tickets * auto_reply_rate
saved_hours = (saved_tickets * time_per_ticket_min) / 60
human_cost_saved = saved_hours * human_cost_per_hour

# APIコスト
api_total_cost = monthly_tickets * auto_reply_rate * openai_api_cost_per_ticket

# ROI計算
roi = (human_cost_saved - api_total_cost) / api_total_cost

print(f"月間削減コスト：{human_cost_saved:.0f}円")
print(f"API費用：{api_total_cost:.0f}円")
print(f"ROI：{roi:.2f}")
```

> ✅ この例では、**API費用を大きく上回る効果**があることが分かります。ただし、これは「モデルの精度」や「ユーザー体験」によって大きく左右されます。

---

## 🛠️ 4. 実務での落とし穴とTips

### ✋ よくある落とし穴：

* **PoCで満足して本番化できない**
  → 実データで運用する難しさを見積もれていないケース多数

* **モデル精度が高くてもUXが悪い**
  → 導入初期で「使いづらい」と見なされ、利用されなくなる

* **コストが不透明なまま契約してしまう**
  → API課金やクラウド課金で思わぬ出費に

### 🧠 Tips：

* 初期段階から**ビジネス部門とROI指標を共有**する
* 精度よりも「**課題解決率（KGI）**」を重視する
* ChatGPTなどの**料金体系をスクリプトでシミュレーション**しておく
* Auto-scalingや監視ツール（Prometheus, Grafana）で**インフラ運用を最適化**

---

## 🚀 5. 発展応用：MLOpsによるコスト最適化

PoC後に本番環境に移すには、MLOpsの観点が欠かせません：

* **パイプライン自動化**：AirflowやKubeflowなど
* **再学習のタイミング管理**：モデル劣化を検知し、再学習コストを最小化
* **ローリングデプロイとA/Bテスト**：失敗リスクを最小に

また、ROIを継続的にモニタリングするには、**KPIダッシュボードの設計**も重要です。

---

## ✅ 6. まとめ：AI導入の成否はROI設計にあり

| 視点      | ポイント                    |
| ------- | ----------------------- |
| 技術面     | 初期のPoCから本番MLOpsまでの設計が必要 |
| ビジネス面   | 定量的なROI指標を共有し続ける文化が必要   |
| エンジニア視点 | API・クラウドコストの試算、運用性の確保   |

**AIは魔法ではなく、投資対象です。**
だからこそ、「技術 + ビジネス視点」でROIを定量化・最適化するアプローチが、成功への近道となります。

 
---

## 📚 参考リンク

* [OpenAI API Pricing](https://openai.com/pricing)
* [Google Cloud Vertex AI](https://cloud.google.com/vertex-ai)
* [MLflow & MLOpsのベストプラクティス](https://mlflow.org/)
【DAX入門】ALL系関数の完全ガイド（ALL / ALLSELECTED / ALLEXCEPT）

# 【DAX入門】ALL系関数の使い分け完全ガイド（ALL / ALLSELECTED / ALLEXCEPT）

Power BIやExcel Power Pivotでデータ分析を行う際、**ALL系関数**はフィルター制御の要となる重要な関数群です。本記事では、実務で頻繁に使われる3つの関数（ALL/ALLSELECTED/ALLEXCEPT）の違いを、具体例とともに徹底解説します。

---

## **ALL関数の基本構文と動作**

ALL(<テーブル名>) // テーブル全体のフィルター解除
ALL(<列名>) // 指定列のフィルター解除



### **主な特徴**
- 指定したテーブル/列の**全てのフィルターを解除**[1][5]
- スライサーやページレベルのフィルターも無視[5][7]
- 全体集計や絶対的な比率計算に最適

**実例：カテゴリ別売上比率**
カテゴリ比率 =
DIVIDE(
SUM(売上[金額]),
CALCULATE(SUM(売上[金額]), ALL(商品[カテゴリ]))
)



---

## **ALLSELECTED関数の特殊な挙動**

ALLSELECTED(<テーブル名>) // ユーザー選択範囲を保持



### **主な特徴**
- ビジュアルやスライサーでの**ユーザー選択を保持**[2][7]
- 外部フィルターの影響を受ける[5][9]
- 相対的な比率計算や部分集計に有用

**実例：選択範囲内での比率**
選択内比率 =
DIVIDE(
SUM(売上[金額]),
CALCULATE(SUM(売上[金額]), ALLSELECTED(商品[カテゴリ]))
)



---

## **ALLEXCEPT関数の効率的な活用**

ALLEXCEPT(<テーブル名>, <保持列>) // 指定列以外のフィルター解除



### **主な特徴**
- 指定した列のフィルターを**明示的に保持**[2][5]
- グループ集計を維持しながら全体値を参照可能
- 多次元分析時に威力を発揮

**実例：月別カテゴリ比率**
月別比率 =
DIVIDE(
SUM(売上[金額]),
CALCULATE(
SUM(売上[金額]),
ALLEXCEPT(売上, 売上[月])
)
)



---

## **3関数の比較表**

| 関数         | フィルター解除範囲               | 外部フィルター影響 | 主な用途               |
|--------------|----------------------------------|--------------------|------------------------|
| **ALL**      | 完全解除                         | 無視               | 絶対的な全体値         |
| **ALLSELECTED** | ユーザー選択範囲を除く         | 影響を受ける       | 相対的な部分集計       |
| **ALLEXCEPT**   | 指定列以外を解除               | 無視               | グループ維持した分析   |

---

## **実践的な使い分けポイント**

### 1. ダッシュボード全体のKPI表示
総売上 = CALCULATE(SUM(売上[金額]), ALL(売上))



### 2. スライサー連動する部分集計
地域別シェア =
DIVIDE(
SUM(売上[金額]),
CALCULATE(SUM(売上[金額]), ALLSELECTED(地域))
)



### 3. 階層構造のある分析
部門別比率 =
CALCULATE(
SUM(売上[金額]),
ALLEXCEPT(売上, 売上[事業部])
)



---

## **よくある落とし穴と回避策**

1. **意図しないフィルター解除**  
   → 列指定で最小限のフィルター解除を心がける[2][5]

2. **ALLSELECTEDの外部フィルター依存**  
   → スライサーの設定状態を常に確認[7][9]

3. **パフォーマンス低下**  
   → テーブル全体より列指定を優先[3][5]

---

## **応用テクニック**

### 複合フィルター制御
複合比率 =
DIVIDE(
SUM(売上[金額]),
CALCULATE(
SUM(売上[金額]),
ALL(商品[カテゴリ]),
ALLSELECTED(地域[都道府県])
)
)



### 動的フィルター連携
動的比率 =
VAR CurrentValue = SUM(売上[金額])
VAR TotalValue = CALCULATE(SUM(売上[金額]), ALLSELECTED())
RETURN DIVIDE(CurrentValue, TotalValue)



---

## **まとめ**

- **ALL**：完全なフィルター解除で「絶対値」取得
- **ALLSELECTED**：ユーザー操作を尊重した「相対値」計算
- **ALLEXCEPT**：特定の次元を維持した「階層型」分析

実際のプロジェクトでは、これらの関数を組み合わせて使用するケースが多くなります。フィルターコンテキストを意識しながら、目的に応じた適切な関数選択を心がけましょう。
.pemを使ってWinSCPにec2-userでログインとファイル取得


WinSCP を起動 → [新しいセッション]

下記を入力
項目	内容
ファイルプロトコル	SFTP（または SCP）
ホスト名	
ポート番号	22
ユーザー名	ec2-user（Amazon Linux）

「詳細設定」→ 左のメニューから SSH > 認証 を選ぶ

「秘密鍵ファイル」欄に .pem ファイルを直接指定(変換をかける)


/home/ec2-user/workにフォルダを作成。ファイルはここにコピーして取得。
フォルダとファイル権限はec2-user usersで。
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIは地方ビジネスでも活用できる？地域企業の導入例


🐵📊 AIは地方ビジネスでも活用できる？実例で学ぶ地域企業のAI導入術

 
# 1. はじめに：地方ビジネスにとってのAIとは？

ChatGPTや画像生成AIなど、AIは一気に身近な存在となりました。しかし、多くのエンジニアや事業者が「AIは大企業の話」「うちはIT予算もないし関係ない」と考えがちです。

しかし、それは誤解です。

実際には、小規模な地域企業でもAIは導入・活用でき、むしろ地方ならではのニーズにフィットした事例も増えています。本記事では、AIを活用して業務効率化や売上向上を実現した地域企業の事例を紹介しつつ、実装方法や注意点、応用可能性まで徹底解説していきます。

—

# 2. 技術概要：地方企業でも導入可能なAI技術とは？

AIと聞くと、難解なディープラーニングや巨大なGPUクラスタを想像しがちですが、実際にはクラウドAIサービスや軽量なモデルを使えば、地方企業でも十分に活用可能です。

ここでは、地方企業向けに実用的な3つの技術を紹介します。

| 技術カテゴリ       | 概要               | 活用例              |
| ------------ | ---------------- | ---------------- |
| 自然言語処理 (NLP) | テキスト分類・要約・チャット応答 | 問い合わせ対応、商品レビュー分析 |
| 画像分類・OCR     | 写真の自動判定、帳票の読み取り  | 在庫管理、紙資料のデジタル化   |
| 予測モデル        | 売上予測、来店者数予測      | 販促計画、仕入れ最適化      |

特に、Google CloudやAWS、AzureなどのマネージドAI APIを使えば、Pythonが少し書ける程度のエンジニアでも導入は可能です。

—

# 3. 実例と実装：地方の青果店でのAI導入ストーリー

## 背景

長野県で家族経営している青果店「やさいのマルオ」では、毎日朝5時から市場で仕入れをし、その日の天気と売れ行きを頼りに商品を並べていました。

しかし近年、仕入れ過剰による廃棄コストが月5万円以上になっており、改善策を模索していました。

## 導入したAIソリューション

* 売上データ＋天気予報をもとに「次の日の販売予測」を行うAIモデル
* Google Cloud AutoML Tables を使用（コード不要）
* 結果は Google Sheets に出力し、印刷して毎朝確認

## データ構造（CSV形式）

| 日付         | 天気 | 気温 | 曜日 | 特売イベント | 来客数 | トマト売上 | きゅうり売上 |
| ---------- | -- | -- | -- | ------ | --- | ----- | ------ |
| 2024/10/01 | 晴れ | 27 | 火  | なし     | 120 | 5300  | 4100   |

## 簡易的なPythonコード例（AIモデルの呼び出し）

Google Cloud AutoMLの予測APIを使ったPythonスクリプト：

```python
from google.cloud import automl_v1beta1

project_id = "your-project-id"
model_id = "your-model-id"
prediction_client = automl_v1beta1.PredictionServiceClient()
model_full_id = prediction_client.model_path(project_id, "us-central1", model_id)

payload = {
    "row": {
        "values": ["晴れ", "27", "火", "なし"]
    }
}

response = prediction_client.predict(name=model_full_id, payload=payload)
for result in response.payload:
    print("Predicted Sales:", result.tables.value)
```

## 効果

* 廃棄ロスが月5万円 → 1万円以下に減少
* 毎日の仕入れ判断が数値ベースに変化
* 経験則に頼る経営からの脱却に成功

—

# 4. 実務上のポイントとハマりやすい罠

## ✅ 成功のポイント

* まず小さく始める（1品目、1店舗単位）
* 手持ちのデータで精度検証 → OKなら本格導入
* 「難しいAI」より「身近な業務改善」を重視

## ⚠️ よくある失敗

| パターン     | 内容           | 解決策                   |
| -------- | ------------ | --------------------- |
| データ不足    | CSV数百行しかない   | 類似データを補強 or ルールベースに切替 |
| 黒箱化      | 精度は高いが理由が不明  | SHAPなどで説明性を担保         |
| 現場に浸透しない | 現場担当がAIを使わない | 紙に印刷して手渡しから始める        |

—

# 5. 応用アイデア：地域課題とAIのマッチング

地方ならではの課題とAIの組み合わせ例を紹介します：

| 地域課題    | 解決のAI技術      | 備考            |
| ------- | ------------ | ------------- |
| 空き家管理   | 画像解析＋異常検知    | ドローン画像からのAI診断 |
| 高齢者の見守り | センサーデータ＋異常通知 | MQTT＋機械学習     |
| 地産品の販促  | SNS画像生成AI    | 地元特産品の画像生成→投稿 |

—

# 6. まとめ：地方×AIの可能性は広がっている

## ✅ メリット

* 人手不足の解消
* 経験則からデータ主導型経営への転換
* 少額投資でスモールスタート可能

## ❌ 注意点

* 精度に過信せず、現場の声を取り入れる
* 導入後の運用・教育が鍵

地方だからこそ、課題も明確で解決のROIも高い場合が多いです。今後、ローコード・ノーコードAIの進化により、さらに導入のハードルは下がっていくでしょう。

—

📌 最後に

「AIは都会の大企業だけのもの」──そんな時代は終わりました。小さな一歩から、AIによる変革を地方から起こしていきませんか？
環境構築のストレスを排除！ゼロから作る自動化CLIツール

<details>
<summary>📚 シリーズ構成：</summary>

- 第1回：導入編  
　　└ 競合は起こさせない！環境構築のストレスを限界まで排除してみた  
- 第2回：設計編  
　　└ Infinity Bash Framework に着想を得た独自モジュール設計と構成  
- 第3回：Laravel編  
　　└ Laravel + Breeze + Docker による一発構築の裏側  
- 第4回：Symfony編（予定）  
　　└ Symfonyにも対応！拡張性を支える基盤アーキテクチャ  
- 第5回：Tips編  
　　└ CLIツール開発で得たノウハウと小技集  
- 第6回：まとめと今後の展望  
　　└ CLIツールを通して見えた「再現性のある開発」

</details>

<details>
<summary>🗂 第1回目の目次</summary>

- はじめに（背景・目的）  
- `devsetup` とは？  
- 「競合は起こさせない」設計思想  
- 実行例（make devsetup）  
- Makefileの工夫（実行バイナリの切替とHomebrew展望）  
- 今後の記事について  
- GitHubリンク  
- おわりに  

</details>



## 🧩 はじめに

開発環境構築って、何度やっても面倒じゃないですか？

特に Docker で複数の Laravel や Symfony プロジェクトを切り替えるような構成だと、

- ポート競合  
- コンテナ名の衝突  
- 初期化漏れ  
- `.env` 書き換え忘れ  

といった“小さなミス”が積み重なって、ストレスと時間の無駄につながってしまう。

「毎回同じ作業を手でやるの、もう限界だな」と思ったのが、  
この CLI ツール **`devsetup`** を作るきっかけでした。



## ⚙️ `devsetup` とは？

自動で環境を作る。競合も起こさせない。  
**開発者の「初手」を徹底的に省力化する CLI ツール**です。

### 🎯 主な特徴

- **Makefile から `make devsetup` で一発起動**（今後は `make run` に変更予定）  
- Docker を用いた環境構築（`php + nginx + MySQL`）  
- Laravel + Breeze + OAuth 認証を含んだ初期構成を自動セットアップ  
- Symfony 環境もオマケで用意（拡張性あり）  
- **Infinity Bash Framework の思想に着想を得た独自モジュール構成**  
  - 各モジュールに `init.sh`, `configure.sh`, `execute.sh`, `cleanup.sh` を明示的に分離  
  - 処理順を明示しつつ、拡張や切替がしやすい構成に設計  



## 🚫「競合は起こさせない」設計思想

`devsetup` が最も意識しているのは、**あらゆる競合の排除**です。

| 種類 | 防止策 |
|------|--------|
| ポート競合 | 自動チェックと警告処理 |
| コンテナ名バッティング | プロジェクト名からユニークに命名 |
| 構成ファイル衝突 | `.env`, `default.conf` をプロジェクト単位で管理 |
| 初期化忘れ | `run_phase` によるライフサイクル制御 |

```bash
# フェーズを順に完走させる流れ
for phase in init configure execute cleanup; do
  source "${DEVSETUP_ROOT}/modules/${mod}/${phase}.sh"
done
```

- `execute` フェーズでは `docker` モジュールを先頭に固定  
```bash
if [[ "$phase" == "execute" ]]; then
  mods=( docker "${ENABLED_MODULES[@]/docker}" )
fi
```

こうして「フェーズ」「モジュール」「順序」の 3 軸で**漏れや順番ミスをゼロ化**しています。



## 🚀 実行例

```bash
git clone https://github.com/tamai-hideyuki/devsetup.git
cd devsetup

make devsetup  # ※ 今後は make run に変更予定
```

選択メニューが表示され、構成に応じて各モジュールが自動的に呼び出されます。  
再現性・冪等性を確保しつつ、短時間で環境構築が完了します。


↓ `make devsetup` 実行直後に表示される対話ログ(例)
![devsetup 実行ログ（make devsetup）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909020/d89be265-5f16-48be-bb89-84932a9b964b.png)




## 🔄 Makefileの工夫（実行バイナリの切替と Homebrew 展望）

```makefile
ifeq ($(wildcard ./bin/devsetup.sh), ./bin/devsetup.sh)
	@echo "Launching devsetup.sh (開発用)"
	@bash ./bin/devsetup.sh
else
	@echo "Launching devsetup (Homebrew用)"
	@./bin/devsetup
endif
```

- ローカル開発中は `bin/devsetup.sh` を直接実行  
- 将来的に **Homebrew Tap**（`tamai-hideyuki/homebrew-dev`）を用意し、  
  `brew install tamai-hideyuki/dev/devsetup` で配布できる設計へ移行予定  

> 現在は Homebrew 対応は未実装ですが、**分岐ロジックだけ先行で実装**している状態です。



## 📌 今後の記事について

> - 設計・構成編（core.sh / logger.sh の役割）  
> - Laravel 編（Breeze + OAuth を CLI で構築）  
> - Symfony 編（軽量アプリで実践）  
> - Tips 集（色付きログ、競合検知など）  



## 🐙 GitHub

🔗 <https://github.com/tamai-hideyuki/devsetup>



## 🙌 おわりに

構築に毎回 30 分かかっていた人が、3 分で済むようになったら、  
きっと次に進む余力が生まれます。

「めんどう」を減らして、「つくる」に集中するための CLI。  
Homebrew 対応も含め、まだまだ進化の途上です。

次回もお楽しみに。CLIで開発をもっと自由にしていきましょう！
🔐 KeePassにオリジナルアイコンを設定して視認性アップする方法

## はじめに

KeePassを使っていると、「このエントリ何だっけ？」となることありませんか？

今回は、**オリジナルのフォルダ用アイコンを作成して、KeePassで設定する方法**をご紹介します。  
例えば「社内用」「SNS用」「バージョン管理用」など、用途ごとにアイコンを設定すれば、ひと目でわかるようになります！

---

## ✅ 対象読者

- KeePassでエントリやグループの見分けをつけたい方  
- 自作のアイコンを使いたい方  
- ロゴではなく、自分好みのシンボルで整理したい方  

---

## 🖼️ カスタムアイコンの準備

まずはアイコン画像を用意します。以下の条件を満たすとスムーズです。

| 条件        | 内容                                 |
|-------------|--------------------------------------|
| 画像サイズ  | **32x32ピクセル**（または16x16でも可） |
| 形式        | **PNG形式（背景透過が理想）**         |
| 内容例      | ビル（社内用）、葉っぱ（SNS用）、矢印（バージョン管理）など |

---

## 🤖 ChatGPTを使ってリサイズ！

会社のアイコンが32x32じゃなかったので、**ChatGPT-4oを使って画像をリサイズ**してみました！  
画像を添付して「32x32にして！」と伝えるだけで、すぐに希望通りの画像を作成してくれます。

また、自分好みの**オリジナルアイコンを作りたい場合も、ChatGPTなどのAIツールを使えば簡単に生成できる**かもしれません！

…とはいえ、僕はセンスがないのか（笑）、いい感じの画像がうまく生成できなかったので、  
基本的にはKeePassの**デフォルトで存在しているアイコンばかり使っています**。

なお、画像生成や編集は**有料プランでないと使えない場合もある**ので、  
その場合はご自身の環境に合わせてリサイズなどを試してみてください。

---

## 🛠️ KeePassでカスタムアイコンを設定する手順

1. **KeePassを起動してデータベースを開く**
2. アイコンを設定したい「エントリ」または「グループ」を**右クリック**
3. メニューから「**グループの編集**」をクリック
4. グループアイコンの画像をクリック
5. 下部にある「**追加（A）...**」を選択
6. PNG画像（例：`icon_32x32.png`）を選択して読み込み
7. 「OK」で適用！

---

## ✍️ アイコンのデザイン例

| 用途            | アイコンイメージ説明                              |
|-----------------|-----------------------------------------------|
| 社内フォルダ     | 会社アイコンを32x32にリサイズして使用  |
| Tools（ツール） | 工具（レンチ）アイコンを採用して明確に分類 🔧       |
| SNS用フォルダ    | 緑の葉っぱモチーフの抽象アイコンを使用 🌿          |
| バージョン管理   | パソコンや分岐を連想させるアイコンを使用 💻         |


---

## 🖼️ ビフォーアフター

- ビフォー
![スクリーンショット 2025-05-16 101021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068097/7e17c630-c102-4650-b1de-745ea6d4e83a.png)

- アフター
![スクリーンショット 2025-05-16 101154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068097/7983d682-565a-448f-9820-26053a931cb9.png)


## ✅ まとめ

- KeePassはカスタムアイコンで視認性が一気にアップ  
- シンプルなPNG画像を使えば、自分仕様にカスタマイズ可能  
- フォルダ整理や目的別エントリの管理が圧倒的にラクになる！

---
ASP.NET(.NET Core/5+) ホスティング方式：6分類

# ASP.NET(.NET Core/5+) ホスティング方式：6分類

ASP.NET(.NET Core/5+)アプリのホスティング方法に関して
整理された情報が見つけられなかったので、
6種類に分類してまとめてみました。


## ① IIS（インプロセス）
- **ANCM (AspNetCoreModule)** を使用し、IIS (w3wp.exe) のプロセス内で ASP.NET Core が動作
- 最も高速で、開発も簡単
- Windows 環境でのみ有効


---

## ② IIS（アウトオブプロセス）
- ANCM が Kestrel を別プロセスで起動し、IIS がリバースプロキシ
- プロセス分離による柔軟性がある
- Windows 環境のみ


---

## ③ IIS + Application Request Routing（ARR）
- IIS + ARR 構成で、バックエンドの Kestrel へリバースプロキシ
- 複数ノード構成やスケーラビリティを持たせたい場合に有効


---

## ④ nginx/Apache + Kestrel
- Linux環境での一般的な構成
- nginx（またはApache）が Kestrel にリバースプロキシ
- Docker やクラウド構成でもよく使われる


---

## ⑤ Kestrel 単体（自己ホスト）
- 自前でポートをバインドしてHTTPサーバとして動作
- 軽量・シンプル
- 本番利用にはプロキシの併用が推奨される



---

## ⑥ クラウドホスティング（PaaS/サーバーレス/コンテナ）
- **Azure App Service**、**AWS Elastic Beanstalk** 等のPaaS
- **Azure Functions** などのサーバーレス
- Kubernetes (AKS, EKS 等) 上のコンテナで稼働する Kestrel
- プラットフォームがスケーリングや運用を自動で管理
- 運用負荷を低減し、迅速に展開可能



---

## 🔎 おすすめシナリオ別選定

| シナリオ                          | 推奨構成                          |
|----------------------------------|-----------------------------------|
| 高速・簡単な開発                 | ① IIS（インプロセス）            |
| プロセス分離や安定性が必要       | ② IIS（アウトオブプロセス）      |
| 複数ノード・負荷分散構成         | ③ IIS + ARR / ④ nginx            |
| LinuxやDocker運用                | ④ nginx + Kestrel                |
| 最小構成やローカル動作確認       | ⑤ Kestrel 単体                   |
| 運用負荷低減・迅速なスケール     | ⑥ クラウドホスティング           |
venvを利用したvscode + python環境構築

# はじめに

過去に何回か説明する機会があったので、
初心者用にローカルでのpython開発環境を構築する手順を書き残しておきたいと思います。
基本的にはpythonの初学者には環境構築の必要がない[Google Colaboratory](https://colab.research.google.com/?hl=ja)をお勧めしたいのですが、どうしてもローカル環境でなければならない場合があるためこの記事を作成しました。

## インストール

### pythonのインストール

すでに良い記事が公開されているのでリンクを記載しておきます。
様子を見て必要があれば記事を書きます。
[macOS版pythonのインストール](https://www.python.jp/install/macos/install_python.html)
[windows版pythonのインストール](https://www.python.jp/install/windows/install.html)

### Visual Studio Codeのインストール

[公式ページ](https://code.visualstudio.com/download)からダウンロードしてください。
利用しているマシンのOSによって選択するダウンローダーが異なるので注意してください。
インストール方法は下記サイトを参考にしてください。
[Windows への Visual Studio Code のインストール方法](https://www602.math.ryukoku.ac.jp/Prog1/vscode-win.html)

[macOS への Visual Studio Code のインストール方法](https://www602.math.ryukoku.ac.jp/Prog1/vscode-mac.html)

## 初期フォルダの作成

vscodeを立ち上げ画像の手順の通りにフォルダを作成し、ターミナルを立ち上げてください。


![vscode1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173019/26d9dbe5-899a-1957-8c39-8c7ab07eb440.png)

![vscode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173019/4185e7e1-a2af-d36c-39d6-006d6a6ef2db.png)

![vscode3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173019/25729bcb-53b8-f373-9902-45e1919fd622.png)

## venv仮想環境の作成

以下のコマンドをターミナルに入力しエンターを押してください。
コピペで問題ありません。
nyanenvとしているところは好きな名前に書き換えられます。

```sh
python -m venv nyanenv
```

```sh
python -3.11 -m venv venv
```

## 作成したvenv仮想環境の利用

仮想環境の利用時は以下のコマンドを使用してください。

```sh
source nyanenv/bin/activate
```

## ライブラリのインストール

通常のpythonと同じです。
例えばnumpyの追加は以下のコマンドです。

```sh
pip install numpy
```
Mac環境で最速・確実にスペックを確認する方法【GUI＋CLI】

## TL;DR

* GUI操作とターミナル操作で必要なスペック情報を最速で取得する方法を解説
* 確認項目は【CPU】【メモリ】【GPU】【ストレージ】【macOSバージョン】の5つ
* GUIは20秒、CLIは5秒で完了
　

## 1. 背景・目的

* **背景**: AIモデルの運用やソフトウェア要件の判断において、MacBookのPCスペック把握がしたかった
　
* **目的**: macOSユーザーが**最短**かつ**漏れなく**スペックを確認できる
　
## 2. 確認すべきスペック項目一覧

1. CPU（型番／コア数・スレッド数）
2. メモリ（搭載容量）
3. GPU（チップセット／VRAM）
4. ストレージ（容量・空き容量）
5. macOSバージョン
　
## 3. GUIでの確認手順

1. 画面左上の **（Appleメニュー）** → **「このMacについて」**
2. **概要タブ** で以下を確認

   * macOSバージョン
   * CPU型番／メモリ
3. **システムレポート…** をクリック

   * **ハードウェア▶︎ハードウェア概要**：コア数・スレッド数
   * **ハードウェア▶︎グラフィックス/ディスプレイ**：GPUチップセット・VRAM
   * **ストレージ▶︎NVMe**：SSD容量・空き容量

> **所要時間**: 約20秒

## 4. CLI（ターミナル）での確認手順

以下をターミナルにコピー＆ペーストするだけで完了。

```bash
# CPU 型番・コア数
system_profiler SPHardwareDataType | awk '/Processor Name|Total Number of Cores/'

# メモリ容量
system_profiler SPHardwareDataType | awk '/Memory:/'

# GPU 型番・VRAM
system_profiler SPDisplaysDataType | awk '/Chipset Model|VRAM/'

# ストレージ容量・空き容量
df -h /

# macOS バージョン
sw_vers -productVersion
```

> **所要時間**: 約5～10秒


## 5. まとめ

* **GUI+CLI** 両方を押さえることで、用途に応じて最速で情報取得が可能になります

---

*この記事が役に立ったら ★ をお願いします！*
HTML・CSSのセレクタ、プロパティ、値。主に忘れていたもの備忘録

## HTML CSSで忘れていたことなど備忘録 ##

id属性とは、ある一定の値を変えたい場合などに使う。
<p id="message">
</p>
この時CSSで装飾をすることもできる。
（style.cssのファイルに記入）
指定する場合は、「#id名」の形でCSSファイルに記述する。
具体的には
＃message {
colore: red;
}
となる。

※idでセレクターを使うと特定のHTMLだけ装飾をすることができる
基本的にはそれのみと考えてもいい

似たものでclass属性もある
こちらはclassなので複数も可能
グループ名のようなもの
同じ class を 複数の要素に使える
似たような見た目や意味を持たせたいときに使う

ただしCssで使うときは「.名前」とする


テキストの一部にCSSを使用する方法としてspan要素がある
使い方としては
``` <h1>
これは<span class="blue">見出し</span>です
</h1> ```


cssで使うときは「.class名」で記述する
複数のPDFを簡単に結合＆パスワード保護もできる便利なオンラインサービス

![20250516at1005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088377/f2eec441-3f6d-458c-887d-6e62e8bbf6ce.png)
業務や資料作成の際、複数のPDFファイルを一つにまとめたい場合、簡単にPD結合してくれるサービス。

https://mjeld.com/pdfmerge/

PDF結合・パスワード設定対応のオンラインサービスです
インストール不要で、ブラウザからすぐに使えます

## 主な機能
    * 複数のPDFファイルを一つに結合
    * 必要に応じてパスワード保護も可能
    * シンプルな操作画面で誰でも簡単に使える

## 使い方
1. PDFファイルを追加
画面上の 「PDFファイル追加」 ボタンをクリックして、ローカルPC内のPDFファイルを選択します。選んだファイルは画面下のリストに表示されます。
2. パスワードを設定（必要な場合）
セキュリティ保護が必要な場合は、「パスワードを設定する」 のトグルスイッチをオンにします。するとパスワード入力ボックスが表示されるので、任意のパスワードを入力してください。
3. PDFを結合してダウンロード
最後に 「PDFマージ（結合）」 ボタンをクリックするだけ。結合されたPDFが表示されるので、そのままダウンロードして完了です！
JCLとは？簡単な構造と実用例をサクッと解説！

# JCLってなに？
JCL（Job Control Language）は、IBMメインフレームでバッチ処理を実行するための制御言語です。

たとえば「どのプログラムをどう実行するか」「どのデータを使うか」などを指示します。

# JCLの基本構成
JCLは主に以下の3つで構成されます：
| ステートメント | 役割            |
| ------- | ------------- |
| JOB     | ジョブ全体の定義      |
| EXEC    | 実行するプログラムの指定  |
| DD      | ファイルやライブラリの指定 |

# JOB文のパラメータ解説
以下はJOB文の一例です：
```
//COPY JOB CLASS=A,MSGCLASS=H,REGION=4M,NOTIFY=&SYSUID
```
各パラメータの意味は以下のとおりです：
| パラメータ           | 意味                                        |
| --------------- | ----------------------------------------- |
| CLASS=A         | ジョブの優先度や実行キューを指定（Aは通常の優先度）                |
| MSGCLASS=H      | ジョブの出力ログの出力先（Hはスプールにログを保存し表示可能）           |
| REGION=4M       | 使用するメモリ量（この例では4MB）                        |
| NOTIFY=\&SYSUID | ジョブ完了時に通知されるユーザーID（\&SYSUIDは実行者のIDに置換される） |


# 例：ライブラリコピーのJCL
```
//COPY   JOB CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID
//STEP01 EXEC PGM=IEBCOPY
//IND01  DD DISP=SHR,DSN=MODEL.LOAD
//OUTD01 DD DISP=SHR,DSN=TEST.LOAD
//SYSIN  DD *
  COPY OUTDD=OUTD01,INDD=((IND01,R))
/*
```
このJCLは、IEBCOPYユーティリティを使って、LOADモジュールを別のライブラリにコピーします。

ポイント：
・EXEC PGM=IEBCOPY：コピー専用のユーティリティを実行
・DD文でコピー元（IND01）とコピー先（OUTD01）を指定
・SYSINで具体的なコピー指示（COPY命令）を記述

# まとめ
・ JCLはメインフレーム上で処理を動かすための「指示書」
・基本の3文（JOB／EXEC／DD）を覚えよう
・IEBCOPYのようなユーティリティを使うと実用的な処理が書ける
IBM i 7.6のRedbook目次

[プログラム資料説明書（memo to users)](https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-memo-users)は主に以前のバージョンからバージョンアップ・リリースアップする際に注意すべき、非互換性や機能変更・拡張が中心と言えます。

ですので、IBM i 7.6での具体的な機能拡張などはインフォセンター（IBM Docsの[IBM i 7.6の概要と新機能](https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-overview-whats-new)ページなどから調べる必要があります。

## Redbook : IBM i 7.6 Features and Functions
IBM i 7.6の新機能については、下記のレッドブックが分かりやすいかもしれません。

https://www.redbooks.ibm.com/abstracts/sg248588.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e3066485-e366-416e-9c80-209596f419eb.png)

## IBM i 7.6 Redbookのサマリー

[別記事](https://qiita.com/gomAnomalocaris/items/5c5c8a77237947bf8cc3)で確認しはじめましたが、まずは目次を眺めてみます。

### Chapter 1. 7.6リリースアップの事前特記事項
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b7e9d5da-82e9-4ecc-b373-06398862e772.png)

IBM i 7.6にリリースアップするために知っておくべき基本情報（IBM i ライセンシングや7.6ソフトウェア・ライセンスキーの入手、SWMA契約などが簡潔に説明されています。また、1.5章ではIBM i7.6で実装された統合MFAをオンにしたユーザープロファイルを使用したIBM i OSのリリースアップ時の保管・復元時の考慮点も記載されています。（移行先ハードウェアの時刻がずれているとMFAが期待通り作動せずエラーになる可能性があるため）

### Chapter 2. IBM i 7.6の新機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b7a3c019-d5e2-42bb-a534-112534b275c6.png)

ここで新機能・拡張などの説明があるようです。ハードウェア、オートメーション（Ansible等）、AI、システム管理、ASP暗号化、の記載

### Chapter 3. セキュリティの拡張
3章は盛りだくさんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/130554e6-8fb5-484c-a1f6-b18a49edfda2.png)

MFA関連（MFA、パスワードレベル変更、システム管理ロール、TLS、SST/DSTのMFA)、その他のセキュリティ機能拡張?

### Chapter 4. ホストサーバー、サーバージョブの拡張
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0486315a-15e8-4b8e-a52e-3d7b9d188545.png)

デバッガーサーバー、Netサーバー、HTTPサーバー、WAS、Liberty、新設されたホストコネクションサーバー

### Chapter 5. データベースの拡張

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d68ce970-5116-42e9-8cea-1f9b53c32216.png)

データベースエンジニアリングDBE、SQL、VSCode拡張、SQE拡張？、Finalテーブルサポート

### Chapter 6. アプリ開発
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f2efae3b-718b-4f21-8710-50bebc6d9466.png)

モデム開発？、VSCode、RDi、コンパイラー、RLU/SDAの削除、RPG拡張、Merlin、ACS

### Chapter 7. HA, DR, バックアップ＆リカバリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/634c8a96-bb2a-4bed-b0db-ca7098e02ccd.png)

BRMS、PowerHA、Db2 Mirror for i、マイグレートwhile Active、PowerVS DR自動化、テープライブラリーS/N変更

### Chapter 8. システム管理の自動化ツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/aecbabc0-401a-46e3-bb57-870ae9421d9b.png)

ARE(Administration Runtime Expert)、Ansible、拡張ジョブスケジューラー

### Chapter 9. Navigator for i 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0fb68604-faa1-4883-b40d-51e574275596.png)

そのままNavigator for i全般ですね。

### Chapter 10. IBM i 7.6のユースケースと利益（価値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9d9f7c1c-3df7-475c-8c8c-8a12cd4e58ee.png)

エグゼクティブサマリー、MFA,,と解説があるようです。

昨今のIBM i 拡張全般が網羅されている印象です。時間見て調べてみたいと思います。
ポップアップ画面をオフにする



+ [これらの「新しい」ポップアップをオフにするにはどうすればいいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TiHLl)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a3668a1-87e2-41b8-8a48-bb2694b71c3f.png)

:::note
この手順を試してください 

1. [設定] の [クイック検索] ボックスに「アプリ内ガイダンス」と入力し、[アプリ内ガイダンス]を選択します。
2. [設定]をクリックします。
3. Salesforce 標準アプリ内ガイダンスをオフにします。
:::
【Claude 3.7sonnet】クイズアプリ開発レポート!

## はじめに
現在、Claude 3.7 sonnet を色々と試してみようということで
Claude 3.7 sonnet を使ってアプリ開発を行っております

今回は第4弾！クイズアプリです！

これまでの記事はこちら

https://qiita.com/shimizu_432/items/0c8a8e91365b79164e33

https://qiita.com/shimizu_432/items/b5bf6de705056b9a19d4

https://qiita.com/shimizu_432/items/2a90c338fc03c763de82

## クイズアプリを作っていく！

今回はデザインの部分まで振ってみようと思います！
オシャレなアプリになるかな

プロンプトはこちら
```ruby:プロンプト
以下のアプリを作って
クイズアプリ
   * 基本機能: クイズの出題、スコアの記録。クイズの共有、ランキング表示、クイズの作成機能。
```
【TOP】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/2f968aaf-0cc9-4c3d-806f-c212d89bd85a.png)

【クイズ挑戦画面】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/7263e1f0-4021-4a37-a2ab-349776822177.png)

【結果画面】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/8f6a3e3f-994b-4fd7-9b6e-856f1a5881f8.png)

【ランキング】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/ce6f6fc9-73a6-40be-ac83-393d41fd9c5d.png)

【クイズ作成】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/661fcbe2-74fa-431a-b719-34c6773a80bd.png)


シンプルなデザインのクイズアプリを作ってくれました！
資格勉強に使うとかなら十分なクオリティーですね
共有ボタンは動きませんが、他は動きます！

そういえば、名前入力するところが無いので点数を取ってもランキングに入りませんね、、、

機能は最低限満足したので、今回はデザインの少し負荷のあるものにしたいと思います

```ruby:プロンプト
クイズをしたくなるようなデザインにして。アイコンも追加して
```
本当はこんなに抽象的なプロンプトは良くないんでしょうけど、、、
お願いします！
ChatGPTは画像も作ってくれるというし、Claudeは作れなかった気がするけど
無茶振りしてみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/eb6373e6-3898-42ef-a647-550d39d7f190.png)

エラーが発生しまくり、最初のアプリに戻ってしまいました、、

デザインと、アイコンという2つお願いしてしまったのが良くない気がしてきました！

次はアイコンのみにしたいと思います

```ruby:プロンプト
アイコンを追加して
```

結果、エラーが発生し、生成されませんでした、、、
線と〇とかを組み合わせて作ってくれるかなと思いましたが、厳しいようです、、、

最後にデザインだけでもオシャレなのにしてほしい！

```ruby:プロンプト
クイズをしたくなるようなデザインにして
```
、、、

こちらもエラーが出続けました

デザイン変更は苦手そうですね

クイズアプリはシンプルな形で終了することになりました


## 今回の気づき
・アイコンを入れることは厳しい
・ユーザ設計など少し踏み込んだデザインは苦手
・自分のためのアプリならClaudeだけで十分なものを作れそう
[Next × GraphQL] Fragment colocation を使用してコードの保守性を上げよう

# 概要

`Next.js` と `GraphQL` を組み合わせた開発において、コードの保守性と再利用性を高める重要な手法として「**Fragment colocation**」があります。

この記事では、`Fragment colocation` とは何か、そしてどのようにして実装するかについて解説します。

## Fragment colocationとは

`Fragment colocation` とは、`GraphQL` の `Fragment` をコンポーネントと同じファイル内に定義し、そのコンポーネントが必要とするデータの形を明確に示す手法です。

`Fragment` は再利用可能なクエリの一部分を定義するもので、これをコンポーネントと同じ場所に配置することで、コンポーネントとデータの結びつきを強くします。

## Fragment colocationの利点

1. **データ依存関係の明確化**：コンポーネントが必要とするデータが明確になる
2. **コード変更の局所化**：コンポーネントの変更時にデータ要件も同時に更新できる
3. **オーバーフェッチの防止**：コンポーネントが必要とするデータのみを取得できる
4. **型安全性の確保**：型定義が自動生成され、型エラーを事前に検出できる

その他詳細は以下の記事などをご参考ください🙋‍♂️

https://zenn.dev/gemcook/articles/2c8796761f2d02

## 実装例

それでは `Next.js` で実装していきます。

### コンポーネントとFragment定義

まず、PostContent（記事表示）コンポーネントとそれに必要なFragmentを定義します。

```tsx:src/components/ui/PostContent/index.tsx
import React from 'react'
import { PostFragment } from '@/app/graphql'
import styles from './PostContent.module.css'
import BackButton from '@/components/ui/BackButton'
import MainTitle from '@/components/ui/MainTitle'
import FormattedDate from '@/components/ui/DateFormatter'
import Image from 'next/image'
import { gql } from '@apollo/client'

type PostContentProps = {
  post: PostFragment
}

export const POST_FRAGMENT = gql`
  fragment post on Post {
    title
    content
    thumbnailUrl
    createdAt
  }
`

export default function PostContent({ post }: PostContentProps) {
  return (
    <article className={styles.container}>
      <div className={styles.header}>
        <BackButton>
          ← 戻る
        </BackButton>
        <MainTitle>{post.title}</MainTitle>
        <FormattedDate date={post.createdAt} />
      </div>

      {post.thumbnailUrl && (
        <div className={styles.thumbnailContainer}>
          <Image
            src={post.thumbnailUrl}
            alt={post.title}
            fill
            className={styles.thumbnail}
            priority
            unoptimized={true}
          />
        </div>
      )}

      <div className={styles.content}>
        {post.content}
      </div>
    </article>
  )
}
```

- `POST_FRAGMENT`という名前で `Fragment` を定義し、エクスポートしています
- `Fragment` には記事表示に必要な最小限のフィールドを含める
    - `title`, `content`, `thumbnailUrl`, `createdAt`
- コンポーネントの `props` の型として `PostFragment` を使用
    - `Codegen` によって、自動生成された型

### クエリでのFragmentの使用

次に、このFragmentを実際のクエリで使用します：

```typescript:src/graphql/queries/getPost.ts
import { gql } from '@apollo/client';
import { POST_FRAGMENT } from '@/components/ui/PostContent/index';

export const GET_POST = gql`
  query GetPost($id: ID!) {
    ${POST_FRAGMENT}
    published {
      post(id: $id) {
        ...postFragment
      }
    }
  }
`;
```

- コンポーネントからエクスポートされた`POST_FRAGMENT`をインポートしています
- クエリ内で `Fragment` を参照するために`${POST_FRAGMENT}`で `Fragment` の定義を含める
- `...postFragment`で `Fragment` を展開しています

## まとめ

便利ですね。
特に、型安全の保証、実装変更時の保守性の向上はかなり恩恵があるので、積極的に活用していきたいです。
MATSim入門：大規模交通シミュレーションを可能にするオープンソースの交通モデリングツール

# MATSim入門：大規模交通シミュレーションを可能にするオープンソースの交通モデリングツール

## 1. はじめに

皆さんは「交通シミュレーション」と聞いて、どんなものを想像しますか？

- 渋滞の様子を再現するアニメーション？
- 駅やバス停の混雑状況を予測するシステム？
- それとも未来のスマートシティに向けた交通の最適化？

実は、これらすべてを支える技術のひとつに、**MATSim（Multi-Agent Transport Simulation Toolkit）** というオープンソースのツールがあります。

筆者も独学で学び始めて間もないですが、本記事では「MATSimとは何か」を簡単にご紹介します。

MATsim公式サイト：[https://matsim.org/](https://matsim.org/)

---

## 2. MATSimとは？

**MATSim（マットシム）** は、個人（エージェント）の1日の交通行動を仮想都市で再現し、都市全体の交通状況をシミュレートできるオープンソースのソフトウェアです。

- 開発：ETH Zurich（スイス連邦工科大学）・ TU Berlin（ベルリン工科大学）
- ライセンス：MIT（商用利用可）
- 使用言語：Java
- シミュレーション単位：市区町村～都市圏規模
- 主な対象：自動車、鉄道、バス、自転車、徒歩 など

交差点での交通流動シミュレートというようなミクロなシミュレートというよりは、市区町村レベルのマクロな交通施策の影響や、モビリティの変化による都市全体の挙動を評価するのに適したツールです。
商用ソフトに比べて導入コストが低く、自由に拡張できるのも大きな魅力です。

---

## 3. MATSimの仕組み

MATSimは、エージェント（人や車両）の1日をシミュレーションし、行動・行動の評価を繰り返すことで、現実に近い都市交通の再現を可能にします。

基本的な仕組みは、以下のようなステップで構成されます。

1. **Scenario Data（シナリオデータ）**  
   - ネットワーク(道路や路線)、初期の行動スケジュール、公共交通のダイヤ、施設などを入力として定義します。

2. **Execution（実行）**  
   - 各エージェントが1日の行動スケジュールに従って移動します。
   - 交通状況（混雑など）は他のエージェントの行動にも依存します。

3. **Scoring（スコアリング）**  
   - 各エージェントが、自分の計画に対する満足度（スコア）を評価します。
   - スコアは、移動時間、待ち時間、到着時刻などから計算されます。

4. **Replanning（再計画）**  
   - スコアが低いエージェントは、移動手段や出発時刻などを変更してより良い行動計画を生成します。

5. **Analysis（分析）**  
   - 一定の繰り返し（iteration）を経て、交通状態が収束した後に結果を分析します。

このようにMATSimは、**エージェントごとの移動とその評価を繰り返すことで、都市全体の交通行動の再現や施策による交通行動に変化をシミュレート**できるようになっています。


---

## 4. 基本構成ファイル

MATSimを実行するには、主に以下のXMLファイルを用意します。

| ファイル名         | 内容                                |
|------------------|-----------------------------------|
| `network.xml`    | 道路ネットワーク（ノードとリンク）         |
| `population.xml` | エージェントの行動スケジュール              |
| `config.xml`     | シミュレーション全体の設定ファイル          |
| `facilities.xml` | （任意）施設情報（職場や店舗など）           |

Javaで動作しますが、Pythonを活用しながらxmlを作成することで効率的にデータを準備・可視化することができます。

---

## 5. 活用事例

MATSimは欧米を中心にで実運用・実証実験に用いられています。以下に代表的な事例を紹介します。

### スイス連邦鉄道（SBB）

スイス全体を対象とした「SIMBA MOBi」というMATSimモデルを運用し、旅客需要の予測や鉄道ダイヤの検討、CO2排出量の算出などに活用。独自のルーティングエンジン「SwissRailRaptor」や鉄道シミュレーション拡張「railsim」も提供。

### MOIA（フォルクスワーゲングループ）

ドイツ・ハンブルクで展開されたライドプーリングサービスの設計・評価にMATSimのDRT拡張を使用。Mobility Impact Analyzer（MIA）を開発し、シミュレーション結果の可視化を実現。

### ARUP（英国コンサルティング）

イギリス東部での脱炭素化政策評価や、ニュージーランドでの災害対応・料金制度評価など、国家規模でのエージェントベースモデルを活用。

### ベルリン交通局（BVG）

空港移転による交通影響や、自動運転の導入効果の研究など、実際の政策検討にMATSimを適用。大学との連携による共同研究も展開。

詳細な事例や導入情報は公式サイトに掲載されています：[https://matsim.org/examples/](https://matsim.org/examples/)

---

## 6. おわりに

MATSimは、都市交通の複雑な仕組みを仮想的に再現し、データに基づいた施策評価を可能にする強力なツールです。

- 「自転車通勤を増やしたら渋滞はどう変わる？」
- 「歩行者天国にしたら周囲の道路でどんな影響が出る？」

こうした問いに対して、現実の都市空間を模した環境で“実験”できるのがMATSimの魅力です。

今後、実際にmatsimを動かす方法をなどについても発信していきます。
CSSをHTML内に書く

# CSSをHTML内に書く

前回はcdnを使って外部に存在するcssを使ったが、その中身を知るために、具体的にCSSをHTMLに書いてみる。

## 1. 最初のバージョン

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>CSS埋め込みサンプル</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: #f2f2f2;
      margin: 40px;
    }

    h1 {
      color: #336699;
      text-align: center;
    }

    p {
      color: #333;
      font-size: 16px;
    }

    .highlight {
      background-color: yellow;
      font-weight: bold;
    }

    #footer {
      text-align: center;
      color: gray;
      font-size: 12px;
      margin-top: 50px;
    }
  </style>
</head>
<body>
  <h1>ようこそ！</h1>
  <p>これはHTML内にCSSを埋め込んだサンプルページです。</p>
  <p class="highlight">この行はハイライトされています。</p>
  <div id="footer">サンプル</div>
</body>
</html>
```

## 2. CSSの部分を入れ替える

\<style\>\</style\>の部分を入れ替えてみよう。

```html
  <style>
    body {
      background-color: #121212;
      color: #e0e0e0;
      font-family: 'Segoe UI', 'Helvetica Neue', sans-serif;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      height: 100vh;
      margin: 0;
      padding: 20px;
    }

    h1 {
      color: #00acc1;
      font-size: 2.5em;
      margin-bottom: 0.5em;
    }

    p {
      font-size: 1.2em;
      line-height: 1.6;
      max-width: 600px;
      text-align: center;
    }

    .highlight {
      color: #ffeb3b;
      background-color: #333;
      padding: 0.3em 0.6em;
      border-radius: 5px;
      box-shadow: 0 0 5px #ffeb3b88;
    }

    #footer {
      margin-top: 2em;
      font-size: 0.9em;
      color: #888;
    }
  </style>
```

### 他のスタイル例

```html
  <style>
    body {
      background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
      font-family: 'Comic Sans MS', 'Arial Rounded MT Bold', sans-serif;
      color: #444;
      margin: 0;
      padding: 40px;
    }

    h1 {
      color: #ff4081;
      font-size: 3em;
      text-align: center;
      text-shadow: 2px 2px #fff;
      margin-bottom: 0.3em;
    }

    p {
      font-size: 1.2em;
      line-height: 1.6;
      text-align: center;
      max-width: 600px;
      margin: 0 auto 1.5em;
    }

    .highlight {
      display: inline-block;
      background-color: #ffff8d;
      padding: 0.4em 0.8em;
      border-radius: 12px;
      color: #d500f9;
      font-weight: bold;
      box-shadow: 2px 2px 6px rgba(0,0,0,0.2);
      transition: transform 0.3s ease;
    }

    .highlight:hover {
      transform: scale(1.1);
    }

    #footer {
      text-align: center;
      color: #666;
      font-size: 0.9em;
      margin-top: 60px;
    }
  </style>
```
Cusor+geminiでソフトウェアの仕様を精緻に出させる方法おためし

## 目的

既存機能を改修するときに、基本設計レベルでざっくりとその機能について知りたい。
その説明を片手にコードを追えば、仕様把握が爆速になるような予感。

## 環境

*   **Cursor**
*   **Gemini 2.5 Pro**

## 準備

**(超重要) 自分でコードなり画面なりを眺めて、知りたいドメインに関係するキーワードを洗い出す！**

例えば、ECサイトだったら下記のようなものを想定

*   注文金額
*   商品
*   リードタイム

Bizサイドとの会話でも出てくるような粒度の単語をピックアップしておく。

## AIへのインプット

1.  ドメインキーワードを列挙する
2.  「このドメインに関して説明して」とお願いする
3.  参考になるエントリーポイントを教える
    *   APIエンドポイントのファイル (`@HogeService` みたいな感じで)
    *   Serviceクラスの処理が始まってる箇所 など
4.  「まとめたものをmdファイルに出力して」と頼む

実際のプロンプトはこんな感じ。

```
@HogeService で配達可能日のロジックを出していると思います。

登場する概念は下記と認識しています(間違っているかも)

## 登場する概念

配達可能日のリストを出したいという意図

- 配達不可日
- 締め時間 xx時までの注文をxx日に最短配達

この概念がそれぞれどのモデルと紐ついているかわかりますか？
また、指定の概念が見つからなければ見つけられないと言って

調査結果はmdファイルで出力してください。
```

## ブラッシュアップ

AIが一発で完璧な答えを出してくれるとは限らない。
下記のようにブラッシュアップしていく。

*   「この部分、もっと詳しく教えて」「この解釈で合ってる？」みたいに、ガンガン質問する。
*   AIの回答をもとに、mdファイルをどんどん更新させる

## やってみた感想

*   こっちが指定したドメインの単語ベースで会話してくれるので、スムーズ
*   多少コードがカオスってても、いい感じに仕様をまとめてくれる印象
firebase emulators：ビルド・起動コマンド

## コマンド
```
npm run build
```
```
firebase emulators:start
```

## ローカル環境URL
```
 hosting[]: Local server: http://127.0.0.1:5002
```

## 各種URL
| Emulator  | Host:Port      | View in Emulator UI             |
|-|-|-|
| Firestore | 127.0.0.1:8080 | http://127.0.0.1:4000/firestore |
|Hosting   | 127.0.0.1:5002 | n/a                             |
| Storage   | 127.0.0.1:9199 | http://127.0.0.1:4000/storage   |
個人的備忘録：毎日見るターミナルをちょっと楽しく。Macのプロンプトをカスタマイズする方法

## はじめに

この記事では、Macのターミナルでカスタムプロンプト（リンゴマーク、カレントディレクトリ、Gitブランチ表示）を使いたいときに必要な `.zshrc` の設定についてまとめています。

**こんなイメージ**

![スクリーンショット 2025-05-16 7.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d9317eb5-9e83-4bb2-95d8-193421bd5f14.png)

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、プロンプトをわかりやすくカスタマイズしたいと思い、設定内容を忘れないように記事にまとめました。

## 内容

### Macに移植する必要な `.zshrc` 設定一式

```zsh
# プロンプト設定（リンゴマーク、カレントディレクトリ、Gitブランチ表示）
autoload -Uz vcs_info
precmd() { vcs_info }

PROMPT='%B%F{$((31 + RANDOM % 7))}%f %F{magenta}%~%f ${vcs_info_msg_0_} %b '
```

### 各行の意味（参考）

| 行                       | 内容                                    |
| ----------------------- | ------------------------------------- |
| `autoload -Uz vcs_info` | Git情報などを取得するzshのビルトイン機能を有効化           |
| `precmd() { vcs_info }` | 各コマンド実行前にGit情報を更新する                   |
| `PROMPT=...`            | 実際のプロンプト見た目（リンゴ・色・カレントディレクトリ・Gitブランチ） |

### 使い方

1. コピー先Macで `.zshrc` を編集：

```bash
nano ~/.zshrc
```

2. 上記4行を一番下などに貼り付け
3. 保存（`Ctrl + O` → `Enter` → `Ctrl + X`）
4. 設定を反映：

```bash
source ~/.zshrc
```

これだけで、カラフルなリンゴ付きプロンプト＋Gitブランチ表示が再現されます。

## まとめ

複数のMac間で環境をそろえたいときに、最低限この4行を `.zshrc` に追加するだけでプロンプトの見た目を統一できます。

シンプルながらも視認性が高く、Gitブランチの把握もしやすいプロンプトなので、ぜひ活用してみてください...！
個人的備忘録：Git初心者がつまずきやすい「ステージング」の取り扱いメモを整理してみた

## はじめに

この記事は、フロントエンドの機能追加（スクールのハッカソン）として「アンガーママ画像＋音声演出」を実装した際の、個人的な備忘録程度の記録です。

また、複数のファイルを個別にステージ・コミットする方法や、ステージングの取り消し方など、日常の開発で役立つGitの操作についても、自分なりに整理して記録しています。

## 実装内容の概要

* `/public/images/mom-ang-removebg.png`: 怒っているママ画像
* `/public/sounds/angry-voice.mp3`: 叫び声のような演出音声
* `page.tsx`: 5回に1回表示・再生されるようにロジック追加

## ブランチ作成とステージング

まずは新機能のためにブランチを切ります：

```bash
git checkout -b feature/mom-audio
```

変更が完了したので、まとめてステージングして確認します。

```bash
git add .
git status
```

```
Changes to be committed:
        new file:   public/images/home1.png
        new file:   public/images/mom-ang-removebg.png
        new file:   public/sounds/angry-voice.mp3
        modified:   src/app/beautiful-woman-mode/page.tsx
```

## ステージングの取り消し

すべてのファイルをステージしてしまったので、いったん取り消します：

```bash
git reset
```

```
Unstaged changes after reset:
M       src/app/beautiful-woman-mode/page.tsx
```

ここで、編集済みの状態には戻りますが、ステージングは外れます。

## 個別にコミットして管理を明確に

まず、演出ロジックを加えた `page.tsx` だけをコミット：

```bash
git add src/app/beautiful-woman-mode/page.tsx
git commit -m "アンガーママ及び音声演出"
```

```
[feature/mom-audio ca2d7fc] アンガーママ及び音声演出
 1 file changed, 31 insertions(+), 4 deletions(-)
```

残ったファイル（画像・音声などのアセット）は、別の意味付けで後からコミットできます。

## ポイントまとめ

| 操作         | コマンド                                          |
| ---------- | --------------------------------------------- |
| ブランチ作成     | `git checkout -b feature/mom-audio`           |
| ステージング     | `git add ファイル名` または `git add .`               |
| ステージング取り消し | `git reset` または `git restore --staged <file>` |
| 個別コミット     | `git add file && git commit -m "..."`         |
| 状態確認       | `git status`、`git diff`                       |

## まとめ

機能開発中に画像・音声・コードが一度に変わる場面では、変更の意図ごとにコミットを分けることが重要だと思っています！Gitの柔軟なステージング操作を身につけておくと、後から自分で振り返るときにも便利です。
【エラー解消】bundle.js:80496 Uncaught (in promise) FirebaseError: No matching allow statements

## エラー内容
bundle.js:76890 WebSocket connection to 'ws://localhost:3000/ws' failed: 
WebSocketClient @ bundle.js:76890このエラーを分析

  Chrome is moving towards a new experience that allows users to choose to browse without third-party cookies.

ERROR
No matching allow statements
FirebaseError: No matching allow statements

## 原因
FirebaseError: No matching allow statements
上記より、Firestore セキュリティルールが原因でデータの読み書きが拒否されている。

## 解消策
該当ファイルの書き換え
```firesotre.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null;
    }
  }
}
```
【公ド読】GitHub Copilot を使ってテストを記述する

【公式ドキュメントを読もうシリーズ】GitHub Copilot を使ってテストを記述する

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/using-github-copilot/guides-on-using-github-copilot/writing-tests-with-github-copilot](https://docs.github.com/ja/copilot/using-github-copilot/guides-on-using-github-copilot/writing-tests-with-github-copilot)

## 説明

### 単体テスト

#### プロンプト

具体的なテストする手順が書かれている。非常に良さそう。
使用されているプロンプトがこちらです。

> プロンプト: BankAccount() 関数に対する包括的な単体テスト スイートを Python で開発します。__ エッジ ケース、例外処理、データ検証など、さまざまなシナリオに対応する複数のテスト メソッドを記述します。

上記をプロンプトを行うことで、

- 様々なユースケースでのテストができる
- エッジケース(境界条件のテスト)への対応
- 例外処理
- 入力データが正しいかどうかの確認(-100円の入金はできないなど)

ができる。

#### スラッシュコマンド

`tests`をCopilot Chatで使うことで、新しいテストケースを作成してくれる。

以下の引用で書かれているが、テストケースを作成していないファイルの隣のタブにほかのテストケースのファイルを開いておくことで、一貫性のあるテストが記述される可能性が高くなるのだそうです。
チーム開発などでも役に立ちそうで良いですね。

> まだ単体テストの対象になっていないコード ファイルのテストを記述するように Copilot に求める場合は、エディターの隣接するタブで既存の 1 つ以上のテスト ファイルを開くことで、Copilot に有益なコンテキストを提供できます。 使用するテスト フレームワークを Copilot が確認できるため、既存のテストと一貫性のあるテストが記述される可能性が高くなります。

### 統合テスト

統合テストとしては、下記のプロンプトのような形式が良いようです。

>  "`BankAccount` クラスの `deposit` 関数の統合テストを記述します。モックを使用して `NotificationSystem` をシミュレートし、それが預金後に正しく呼び出されることを検証します"

このプロンプトを実行することで、

- 単体テストではなく、`deposit` 関数と`NotificationSystem`にフォーカスした統合テストであることを明示している。
- モックと呼ばれる仮のオブジェクトを生成してテストをしてくれると思われる。違ったらすみません。
- 正常に動くかの検証。
- 対象のメソッドが具体的に示されている。

全然別件だが、`from unittest.mock import Mock`こんな形でモックを作ることができるんですね。ためになる。

>  "無効な預金額を使用するテスト ケースを追加して、関数が正しい例外を発生させ、`NotificationService` が呼び出されないことを確認します"

こういうプロンプトを入れて、例外処理の対応もすればなおよし。

## 所感

テストに関する知識があれば、相当役に立つと思っている。
開発時にはどんどん使っていきたいです。
CopilotとGeminiでリコーダーを使う魔法少女を描いてみた。

# 概要

CopilotとGeminiでリコーダーを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のリコーダーを使う魔法少女を描いてください。
```

![光のリコーダーを使う魔法少女（Copilot）_20250516.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/25a00733-3922-4729-95f2-d5aeebcd428e.png)




```
闇のリコーダーを使う魔法少女を描いてください。
```

![闇のリコーダーを使う魔法少女_20250516.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/95e91b59-7fc1-4929-8c11-4018999a58cd.png)




```
聖なるリコーダーを使う魔法少女を描いてください。
```

![聖なるリコーダーを使う魔法少女_20250516.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/daa544be-d091-40fd-a6f6-d384d9b36103.png)


# まとめ

聖の子は可愛い。
何かの役に立てばと。
コンテナ内のClineのブラウザが動かない！

## 環境
- devcontainerを使用
- Docker image：python:3.9
- cline：3.15.5

## 症状
clineに何らかのwebサイトへのアクセスを依頼して，clineがbrowser_actionを実行しようとしたところ，エラーが出てブラウザを実行できない．
（具体的なエラーメッセージは忘れましたが，依存パッケージの不足とそれらを解決した後のrootではできないよ！というエラーでした．）

## 対処法
devcontainerを使っており，かつパッケージマネージャーがaptである場合の説明です．

エラーの原因になっている依存パッケージをインストールします．

devcontainer.json

```devcontainer.json
    "features": {
        "ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
            "packages": [
                "sudo",
                "libnss3",
                "libdbus-1-3",
                "libatk1.0-0",
                "libatk-bridge2.0-0",
                "libcups2",
                "libxkbcommon0",
                "libxcomposite1",
                "libxdamage1",
                "libxfixes3",
                "libxrandr2",
                "libgbm1",
                "libasound2"
            ]
        }
    }
```

devcontainerをnon-root userで実行するようにします．

devcontainer.json
```devcontainer.json
    "remoteUser": "vscode"
```

Dockerfile
```dockerfile
ARG username=vscode
ARG useruid=1000
ARG usergid=${useruid}

RUN groupadd --gid ${usergid} ${username} && \
    useradd -s /bin/bash --uid ${useruid} --gid ${usergid} -m ${username} && \
    mkdir /etc/sudoers.d && \
    echo ${username} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${username} && \
    chmod 0440 /etc/sudoers.d/${username} && \
    chown -R ${username}:${username} /home/${username}

USER ${username}
```

## 参考
[VSCode Devcontainer 放浪記](https://zenn.dev/streamwest1629/articles/vscode_wanderer-in-devcontainer#%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%3A-root-%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%EF%BC%88%E3%81%99%E3%82%8B%E3%81%AA%EF%BC%89)
[Steps to run browser in .devcontainer · Issue #2095 · cline/cline](https://github.com/cline/cline/issues/2095)
ブラウザゲームは60fpsを想定しないほうがいい【requestAnimationFrame】


## 理由

**iOSの低電力モードでブラウザが30fpsになることがあるから。**
これを知らないとiOSで何故か処理が遅いみたいな現象が発生する。

```js

requestAnimationFrame(anime); // これが30fpsになる

setInterval(anime, 1000 / 60); // これでも30fpsになる

```

## 対策1. 強制的に30fpsにする

最初から全環境で30fpsで動けば問題ない。

```js:こんな感じ
const FPS = 30;
let prevTime = -1;
const anime = (time) => {
    const fps = 1000 / (time - prevTime);
    if (prevTime === -1 || fps < FPS + 10) {
        prevTime = time;
        update(); // フレーム単位の処理を行う
    }
	requestAnimationFrame(anime);
};
anime(performance.now());
```

## 対策2. 各フレームの間隔の時間で処理を行う

```js:こんな感じ
let prevTime = performance.now();
const anime = (time) => {
    const deltaTime = time - prevTime;
    prevTime = time;
    update(deltaTime); // deltaTimeを使って処理を行う
	requestAnimationFrame(anime);
};
anime(performance.now());
```

UnityだとdeltaTimeって概念があるっぽいね。
使ったことないからよく知らないけど。

## 参考

https://motion.dev/blog/when-browsers-throttle-requestanimationframe
debian12.8でキーボードがうまくいかない

fcitxとMozc入れて日本語は使えるようになったがなぜかfcitxで設定した入力メソッド切り替えをショートカットキーで切り替えられず不便になったので強引に解決した。
まずアプリケーションで出てくるfcitxを右クリックでアンインストール
つぎにデフォルトの設定で日本語Mozcを追加して英語も追加、デフォルトの日本語は削除。
再起動してショートカットキーで切り替えができることを確認。

以上
競プロ日記#25/05/15

# アルゴ式
[N 進数 → 10 進数](https://algo-method.com/tasks/3112Bt6Z)
- 最初pow()を使う形で実装したのだが大きな値になるとpow()がdouble型を返す影響で値が1ずれてしまった。

```


int main() {
    long long N;
    string S;
    cin >> N >> S;
    long long sum = 0;
    long long base = 1;  // N^i を逐次計算
    for (long long i = S.length() - 1; i >= 0; --i) {
        long long digit = S[i] - '0';
        sum += digit * base;
        base *= N;
    }
    cout << sum << endl;
}

```

[10 進数 → N 進数](https://algo-method.com/tasks/3113c4bS)
- reverse()で反転させる。そのために文字列を作っていく
```
int main() {
    long long N,S;
    string reversed;
    cin >> N >> S;
    if (S == 0){
        cout << 0 << endl;
    }
    while(S > 0){
        reversed += to_string(S % N);
        S = S / N;
    }
    reverse(reversed.begin(),reversed.end());
    cout << reversed << endl;
}
```