OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのパッケージ，モジュールのあれこれ

「モジュール」「パッケージ」「import」「python -m」 について、
混乱しやすいポイントを整理して解説します。
## 1. モジュールとパッケージの違い
モジュール（module）
→ Pythonの「1つのファイル（.py）」がモジュールです。
- 例：`a.py`、`utils.py` など
パッケージ（package）
→ 複数のモジュールをまとめた「ディレクトリ」。
ディレクトリ内に__init__.pyがあるとパッケージと認識されます。
例：
```powershell
  A/
    __init__.py
    a.py
    b.py
```
## 2. importの書き方
- **外部から呼び出す場合**
    例：パッケージAの中のa.pyのfuncAを使いたい
    ```python
    from A.a import funcA
    ```
    これは「AパッケージのaモジュールのfuncA関数をimportする」という意味です。
    <br>

- **パッケージ内でのimport**
    - 推奨：絶対import
    
    ```python
    from A.a import funcA
    ```
    パッケージ内でも、このように書くのが一番安全です（パッケージとして実行する場合）。
    
    - 相対import（パッケージ内限定で有効）
    ```python
    from .a import funcA
    ```
    これは「同じパッケージ内のa.pyからfuncAをimport」という意味です。
    ただし、スクリプトを直接実行するとエラーになります。

## 3. python -m とは？
`python -m パッケージ.モジュール`
→ 「パッケージの一部として、そのモジュールを実行する」
例：
```powershell
python -m A.a
```
こうすると、Aパッケージのa.pyが「パッケージの一部」として実行されます。このとき、絶対importや相対importが正しく動作します。

## 4. まとめ表
| 用語 | 意味・例 |
|--------------|-----------------------------------------------|
| モジュール | 1つの.pyファイル（例：a.py） |
| パッケージ | 複数のモジュールをまとめたディレクトリ |
| import文 | from A.a import funcA |
| 相対import | from .a import funcA（パッケージ内限定） |
| python -m | python -m A.a でパッケージの一部として実行 |

## 5. よくある誤解
パッケージ内の.pyを直接実行（python A/a.py）
→ 相対importや絶対importがうまく動かないことが多い
パッケージとして実行（python -m A.a）
→ importが正しく動く
## 6. 具体例
ディレクトリ構成
```powershell
project/
└─ A/
   ├─ __init__.py
   ├─ a.py   # def funcA(): ...
   └─ b.py   # from A.a import funcA
```
**b.pyの中身**
```python
from A.a import funcA
```

- 実行方法
    プロジェクトルートで
    ```powershell
    python -m A.b
    ```
    これでb.pyの中のimportが正しく動作
    
## 7. 公式ドキュメント
モジュールとパッケージ（公式）
python -m の説明（公式）
まとめ：
モジュール＝.pyファイル、パッケージ＝モジュールをまとめたディレクトリ
importは「from パッケージ.モジュール import 関数」で書く
パッケージ内でも絶対import推奨
実行は「python -m パッケージ.モジュール」で！
【React】状態をローカルストレージに保存する方法


以下のように記述すると状態をローカルストレージに保存できます。

これにより、画面を更新するなどしても状態が維持されます。

```javascript
import React, { useState, useEffect } from 'react';

function CounterApp() {
  // ローカルストレージから初期値を取得して状態を設定
  const [count, setCount] = useState(() => {
    const savedCount = localStorage.getItem('count');
    return savedCount ? parseInt(savedCount, 10) : 0; // デフォルト値は0
  });

  // 状態が変更されるたびにローカルストレージへ保存
  useEffect(() => {
    localStorage.setItem('count', count);
  }, [count]);

  // カウントを増減させる関数
  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  );
}

export default CounterApp;
```
自然言語処理とプロンプト



## 📍詩的テキスト総合解析プロンプト（統合）

```plaintext
以下の日本語詩的テキストに対して、次の7つの分析をすべて実行してください：

【1】形態素解析：  
各語について、「表層形」「原形」「品詞」「品詞細分類」を表形式で出力してください。形態素解析器としてMeCabやJuman++相当の処理を仮定してください。

【2】品詞・構文解析：  
(a) 品詞分布（名詞率・動詞率・形容詞率・副詞率など）を%で出力  
(b) 各文の構文解析（主語・述語・目的語・修飾句などの係り受け構造）を文単位で説明してください。CaboChaまたはKNP相当を想定。

【3】共起分析（コロケーション）：  
テキスト内の単語ペア（名詞・動詞中心）について、共起頻度とPMIスコア（Pointwise Mutual Information）を算出し、上位10件を出力してください。

【4】7感情分類（Softmax確率）：  
「喜び・愛・怒り・悲しみ・恐怖・驚き・嫌悪」の7分類に分類し、各感情の確率（Softmaxベース）を%で出力。主要な感情も明示してください。モデルとしてHuggingFaceの多クラス感情分類モデルを仮定。

【5】政治思想分析（イデオロギー分類）：  
Political Bias Detector（BERT）に類似したモデルを使って、テキストが含む政治的傾向（左派・中立・右派）のソフトマックス確率（%）を出力してください。

【6】感情ベクトル（VADモデル）：  
Valence–Arousal–Dominance（快感・覚醒・支配）の3次元でテキストの情緒的特徴を定量評価してください。スコアは各軸ごとに -1.0〜+1.0。

【7】毒性・攻撃性（Perspective API風）：  
Perspective API相当のスコアリングを行い、「Toxicity」「Aggression」「Insult」「Profanity」などのスコア（0.0〜1.0）を出力してください。

---

【対象テキスト】  
君は汚い言葉で僕を酷く罵る  
青い靴なくしてまだ動き出せずにいる  
彼は知らない言葉で君の体求める  
青い靴をなくして消えた遠くの街へ  
シベリアの墓標に刻まれた君の名前  
神のいない教会へ手をとり二人逃げようとした  
```



## ✅統合プロンプト：マルチ観点テキスト分析（コピペ用）

```plaintext
以下の日本語テキストに対し、文脈依存のロジットベクトルに基づく多次元解析を行ってください。

【分析内容】

1. 政治思想（Ideology Classification）：
　・Political Bias Detector（BERT相当）に基づき、「左派（Liberal）／中立（Neutral）／右派（Conservative）」の3分類でソフトマックス確率を算出。

2. 感情分類（Emotion Classification）：
　・HuggingFaceの6分類モデルに基づき、「喜び・悲しみ・恐怖・怒り・嫌悪・愛」の6感情に分類し、各スコアをソフトマックス確率で出力。

3. 感情の極性（Polarity）：
　・ポジティブ／ネガティブの2クラスに分類し、それぞれのロジットをソフトマックス正規化した確率で表示。

4. 性別的言語傾向（Gendered Language）：
　・「男性的／女性的」言語スタイルの傾向を分類し、ロジットベースのソフトマックス確率で出力。

5. VAD感情ベクトル：
　・Valence（快不快）、Arousal（覚醒度）、Dominance（支配／無力）を -1.0 ～ +1.0 の連続値で出力。

6. Perspective API属性スコア：
　・以下の各カテゴリについて、0.00〜1.00のスコアを出力してください：
　　- 有害性（TOXICITY）
　　- 侮辱（INSULT）
　　- アイデンティティ攻撃（IDENTITY_ATTACK）
　　- 攻撃性（AGGRESSION）
　　- 卑猥性（PROFANITY）
　　- 煽動性（FLIRTATION）
　　- セクシャル（SEXUAL）
　　- 危険性（THREAT）

【分析対象テキスト】

君は汚い言葉で僕を酷く罵る  
青い靴なくしてまだ動き出せずにいる  
彼は知らない言葉で君の体求める  
青い靴をなくして消えた遠くの街へ  
シベリアの墓標に刻まれた君の名前  
神のいない教会へ手をとり二人逃げようとした
```

---
```plaintext

以下の2つの単語「アンプ」と「andymori」に対し、Word2Vec形式のベクトル表現を用いて、それぞれの語彙ベクトルのコサイン類似度を計算してください。

制約条件：
- 類似度は -1.0 〜 1.0 の範囲で数値として出力すること。
- 両単語の意味領域が異なる場合でも、空間上の距離として類似度を計算すること。
- 結果には類似度スコアのみを返すこと（説明不要）。
```


```markdown

以下の日本語音声ファイル（例：会話、朗読、プレゼン等）に対し、次の3ステップに基づいて総合的な音声解析を行ってください。

---

## ✅ Step 1: 音声認識（Speech-to-Text, STT）

- Whisper等、日本語対応の音声認識モデルを使用してください。
- 音声から正確なテキスト変換を実行してください。
- ノイズや話者の抑揚により誤認識がある場合は、音響的に自然な内容に補完してください。
- 話者が複数いる場合は、可能な範囲で話者分離（Speaker Diarization）も行ってください。

---

## ✅ Step 2: 音響特徴量の抽出

以下の音響的特徴量を数値列または可視化形式（グラフ）で出力してください：

- **MFCC**（Mel-Frequency Cepstral Coefficients）
- **スペクトログラム**（時間 × 周波数エネルギー分布）
- **ゼロ交差率**（Zero-Crossing Rate）
- **音量（RMSエネルギー）**：Root Mean Square もしくは dB単位での変動

> ※ 必要に応じてMatplotlib等を使用した可視化を含めてください。


## ✅ Step 3: 感情分析・話者推定（簡易推論で構いません）

- 音声のトーン、ピッチ、音量、速度、声質の変化に基づき、話者の感情状態を推定してください。
- 以下の7分類に対応する**Softmaxスコア（確率値）**を用いてください：


怒り・悲しみ・喜び・驚き・恐怖・嫌悪・中立

```
DjangoのModelForm入門：モデルとフォームの橋渡し

# はじめに

Djangoは強力なWebフレームワークであり、フォームの処理も非常に簡潔に行えます。その中でも特に便利なのがModelForm。これはモデルとフォームを自動的に結びつける仕組みで、フォーム作成の手間を大幅に減らしてくれます。

この記事では、ModelFormの基本から実践的な使い方、よくあるエラーへの対処法までを丁寧に解説します。

# 基本的な使い方

### モデルの定義

まずはmodels.pyでモデルを定義します。例として、簡単なブログの投稿モデルを作ります。
```python: models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
```
ModelFormの作成

次に、上記モデルに基づいたフォームをforms.pyで作成します。

```forms.py
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'body']
```
Metaクラスで、どのモデルを使うか（model）、どのフィールドを含めるか（fields）を指定します。

ビューでの利用

```views.py
from django.shortcuts import render, redirect
from .forms import PostForm

def create_post(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'create_post.html', {'form': form})
```
テンプレートとの連携

テンプレートでは以下のようにフォームを表示できます：
```
<!-- create_post.html -->
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">投稿</button>
</form>
```
実践例：簡単な投稿フォーム

上記のコードで、ユーザーが投稿できる機能を簡単に実装できます。form.save()は対応するモデルインスタンスを作成・保存します。

さらにフォームをカスタマイズしたい場合は次のように記述します。
```
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'body']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'rows': 5, 'class': 'form-control'}),
        }
```
カスタマイズ

フィールドの追加・除外
```
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        exclude = ['created_at']  # 除外したい場合
```
独自バリデーション

clean_<fieldname> メソッドを使って個別フィールドのバリデーションが可能です。
```
class PostForm(forms.ModelForm):
    def clean_title(self):
        title = self.cleaned_data['title']
        if 'NG' in title:
            raise forms.ValidationError("タイトルに不適切な語句が含まれています")
        return title
```
よくあるエラーと対処法

form.save()で例外が出る：バリデーションに失敗しているか、フィールドが不足している可能性があります。

requiredなのにフォームに表示されない：ModelFormにフィールドを明示的に含めていない、またはテンプレートで表示していないことが原因です。

モデルとフォームのフィールド名がずれている：モデルの変更後は、ModelFormのMeta.fieldsを見直しましょう。

# おわりに

ModelFormを使うことで、Djangoでのフォーム作成が非常に効率的になります。バリデーションやUIカスタマイズも簡単に行えるので、プロジェクトに取り入れていくことをおすすめします。

詳しくは公式ドキュメントも参照してみてください：
https://docs.djangoproject.com/ja/stable/topics/forms/modelforms/
MACアドレスについて

## はじめに
ITスクールRareTECHで学習しているゆーせーです。
ネットワーク基礎の復習も兼ねて、前回のIPアドレスに引き続き今回はMACアドレスについて書きたいと思います。IPアドレスの記事をまだご覧になっていない方は是非IPアドレスの方から見ていただいた方が今後の記事の理解も深まると思います！！

https://qiita.com/yusei0516/items/03229f06bc2d6fa3a1b7

![MACアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035327/e0ea17c6-9b4c-421b-a61d-e3b673403860.png)
## MACアドレスとは？
MACアドレスとは、ネットワーク機器が製造されるときに設定される物理的な識別番号です。初めは「は？」となると思います。それを少しずつなくせていければと思います。
**MACアドレスの命名ルール**
MACアドレスもIPアドレス(IPv6)と同じように16進数で表され、こちらも前半と後半で意味が変わります。
例えば`00:1A:2B:3C:4D:5E`というMACアドレスがあるとします。
上記のMACアドレスを前半24ビットと後半24ビットで分けて説明します。

前半の`00:1A:2B`はIEEEがメーカーに割り当てる識別番号です。
これを見れば「このMACアドレスの機器は○○社製かも？」って推測できます笑
ちなみに上記の識別番号はApple社です。

次に後半の`3C:4D:5E`の部分はデバイス固有番号です。これはその機器が何台目か？のように1台ごとに被らないようにしています。マイナンバーに近いです。


:::note info
MACアドレス ＝ [誰が作ったか(OUI)] + [どの機器か(NIC識別子)]
:::
この前半と後半が合わさることで世界中のネットワーク機器に一意に与えられる番号でどのデバイスかを識別しています。

上記からMACアドレスはどのデバイスなのか？を識別し、そのデバイスがどのネットワーク上にいるかをIPアドレスが表していて、これらを共に使って通信が行われます。

## まとめ
今回はMACアドレスについて説明いたしました。私自身が冒頭で述べたように現在ネットワーク基礎について復習しており今後の記事も初歩的な内容がメインになってしまうと思いますが、初心に帰るという気持ちで見ていただければと思います！
今回も最後まで読んでいただきありがとうございました:bow_tone2:
🚩プロジェクトが失敗する理由？よくある「プロジェクトマネジメントのアンチパターン」13選【具体例つき】

# はじめに
こんにちは！
プロジェクトがうまくいかないとき、その原因は案外“よくある失敗パターン”にハマっているだけかもしれません。
本記事では、**現場でありがちな13のアンチパターン**とそれにまつわる**具体的な症状・結果・回避策**を紹介します。

---

## ⚠️ **プロジェクトマネジメントのアンチパターン13選【実例つき】**

### 1️⃣ ゴールが曖昧なままスタート

* **症状**
  「とりあえず作ってみて」と言われたまま開発を始めた。
* **結果**
  実装後に「うーん、こういう機能じゃないんだよね」とクライアントに言われる。
* **回避策**
  要件定義書をもとに**ユーザーストーリーを作成し、ステークホルダーとレビュー会を実施**。

---

### 2️⃣ スケジュール至上主義

* **症状**
  「何が何でも来週までに出して」と無理なスケジュールを押し付けられる。
* **結果**
  テスト時間が削られ、リリース後にバグ報告が殺到。
* **回避策**
  スケジュールに**テストとバッファを含めたWBSを提示し、リリース延期のリスクも説明**。

---

### 3️⃣ コミュニケーションの過信／放置

* **症状**
  仕様変更を会議で伝えただけで、資料やチャットでの共有をしなかった。
* **結果**
  メンバーが古い仕様のまま開発し、手戻りが発生。
* **回避策**
  仕様変更は**議事録に残してチャンネルで全員に通知し、変更点を明示的に記載**。

---

### 4️⃣ 全員で全ての意思決定

* **症状**
  ボタンの色一つを決めるのに全員の意見を集めて1週間経過。
* **結果**
  作業が進まず、細かいことに時間を使いすぎて全体が遅延。
* **回避策**
  デザイン関連は**UI担当者が決定権を持つ**など、分野ごとに**責任者を明確に分担**。

---

### 5️⃣ リソースの楽観的な見積もり

* **症状**
  全員が常にフル稼働できる前提でスケジュールを組んだ。
* **結果**
  一人が風邪で休んだだけで全体が数日遅れる。
* **回避策**
  各メンバーに対して**80%稼働前提で見積もりを行い、想定外の事態に備える**。

---

### 6️⃣ マイクロマネジメント

* **症状**
  PMが毎日メンバーの作業内容を事細かく確認し、タスクの順番まで指示。
* **結果**
  メンバーが自律的に動けなくなり、相談も減ってパフォーマンスが低下。
* **回避策**
  タスクごとに**アウトプットと期限だけ明確にし、進め方は任せる運営に切り替える**。

---

### 7️⃣ 振り返りの欠如

* **症状**
  プロジェクト終了後、すぐ次の案件に移ってふりかえりをしなかった。
* **結果**
  今回のスケジュール遅延の原因が曖昧なまま次プロジェクトにも同じ失敗。
* **回避策**
  終了後に**KPT（Keep, Problem, Try）形式で振り返りミーティングを実施し、Miroなどで可視化**。

---

### 8️⃣ 要件の後出しジャンケン

* **症状**
  実装後に「やっぱりこれも追加して」と未定義の機能を依頼される。
* **結果**
  工数オーバー＆納期遅れ。元の仕様との整合性も崩れる。
* **回避策**
  要件変更は\*\*「スコープ変更申請書」のフォーマットを設け、影響見積もりを都度提示\*\*。

---

### 9️⃣ ドキュメント軽視

* **症状**
  データベース設計やAPI仕様が口頭でしか共有されていない。
* **結果**
  新メンバーが入ってもキャッチアップができず、属人化が進行。
* **回避策**
  **NotionやConfluenceなどで仕様・手順・設計を体系的に残す運用**を標準化。

---

### 🔟 フィードバックループの欠如

* **症状**
  クライアントレビューが納品直前にしか行われない。
* **結果**
  大きな方向修正が後半に発生し、大量の作業が無駄に。
* **回避策**
  **2週間ごとにデモを実施し、少しずつ動くものを見せて合意を取りながら進める**。

---

### 1️⃣1️⃣ 責任の押し付け合い

* **症状**
  トラブル発生時に「これはAさんがやるって言ってた」と責任転嫁が横行。
* **結果**
  チームの信頼関係が崩れ、心理的安全性が低下。
* **回避策**
  **プロジェクト憲章で役割と責任範囲を明確にし、課題発生時はチームで対処する文化を促進**。

---

### 1️⃣2️⃣ 不適切なリスク管理

* **症状**
  外部APIの仕様変更など、潜在リスクを特に考慮していなかった。
* **結果**
  リリース前にAPIが廃止され、緊急で代替案を探す羽目に。
* **回避策**
  **リスク一覧表（リスクマトリクス）を初期に作成し、定期的に更新・レビュー**。

---

### 1️⃣3️⃣ ヒーロー依存

* **症状**
  高スキルのAさんが設計・実装・レビューをすべて一人で担当。
* **結果**
  Aさんの不在時に誰も手を出せず、進捗が完全停止。
* **回避策**
  **ペアプロ・モブプロ・コードレビューを徹底し、ナレッジの属人化を防止**。

---

## ✅ **まとめ**

いかがでしたか？
現場での「なんとなくうまくいかない」には、必ず**構造的な理由＝アンチパターン**があります。

🔍 **まずはチームでこの13個を読み合わせて、自分たちに当てはまるものがないか確認してみましょう！**
改善の第一歩は、「気づくこと」から始まります。
【VBA】バイト操作用マクロ

<h1>バイト操作用マクロ</h1>

Windowsプログラミングを行う場合、C/C++にはバイト操作用の機能として
MAKELONG()やHYBYTE()といったマクロが標準で用意されており、

BYTE型⇔WORD型⇔DWORD型
（1バイト⇔2バイト⇔4バイト）

でバイトの取り出しや結合が行えるようになっています。
VBAにはそれに相当するものがありませんので、同様のものを作成しました。
ただし、マクロの名称はWindows標準に合わせてありますが、実際の型は

Byte型⇔Integer型⇔Long型

になっています。

```vb:ByteOperation.bas

Function MAKEWORD(a As Byte, b As Byte) As Integer
    MAKEWORD = Val("&H" & Right("0" & Hex(a), 2) & Right("0" & Hex(b), 2) & "%")
End Function

Function MAKELONG(a As Integer, b As Integer) As Long
    MAKELONG = Val("&H" & Right("000" & Hex(a), 4) & Right("000" & Hex(b), 4) & "&")
End Function

Function HIBYTE(w As Integer) As Byte
    HIBYTE = Val("&H" & Left(Right("000" & Hex(w), 4), 2))
End Function

Function LOBYTE(w As Integer) As Byte
    LOBYTE = Val("&H" & Right(Right("000" & Hex(w), 4), 2))
End Function

Function HIWORD(l As Long) As Integer
    HIWORD = Val("&H" & Left(Right("0000000" & Hex(l), 8), 4) & "%")
End Function

Function LOWORD(l As Long) As Integer
    LOWORD = Val("&H" & Right(Right("0000000" & Hex(l), 8), 4) & "%")
End Function

```
変数をいったん16進数文字列（ゼロ埋め）に変換し、操作を行った後、Val()関数で整数に戻しています。
掛け算や割り算でも同様の操作は行えますが、VBAの変数は最上位ビットの関係で掛け算や割り算を使うとコードが複雑になります。そのため、文字列を使用する方法を採用しました。

<h1>使い方</h1>
例えば、「あ」の文字コード（0x82A0）から、上位バイト（0x82）と下位バイト（0xA0)を取り出す場合、以下のようになります。

```vb:sample.bas
    Dim Code As Integer '「あ」の文字コード
    Dim Hi As Byte '上位バイト
    Dim Lo As Byte '下位バイト
    
    Code = Asc("あ")
    Hi = HIBYTE(Code)
    Lo = LOBYTE(Code)
    
    Debug.Print Hex(Code)
    Debug.Print Hex(Hi)
    Debug.Print Hex(Lo)
```

実行結果
```
82A0
82
A0
```

https://learn.microsoft.com/ja-jp/windows/win32/winmsg/makelong

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/data-type-summary
Windowsユーザー向け！macOS/Linux向けのコードで改行エラーを直す方法

こんにちは。新卒エンジニアのとりです。

Windowsを利用しているエンジニアの皆さん、macユーザーが作ったコードを利用する際に、改行エラーに苦しんだことはありませんか。

本記事ではWindowsユーザーがmacOS/Linux中心のチームで開発する際に実行すべき、改行エラーを解消する魔法のコマンド、
```magic.sh
git config --global core.autocrlf input
```
について紹介します。


簡単に言うと、Windowsユーザーがmacチームの作ったコードをそのまま自分の開発環境でも使えて、自分がコミットする際も悪影響を与えない役割を果たしてくれます。
<br>
### コマンド実行の注意点

１．使う場面
git clone前が適切です。既にチェックアウトしている場合は、もう一度クローンし直すのが最善です。

２．グローバル設定
紹介しているコマンドはグローバル設定を変更するため、プロジェクトごとに設定したい場合は、そのルートディレクトリで--globalなしで実行してください。
<br>
### なぜ改行コードが問題になるのか？

これは、両OSで使われる改行コードが異なるためです。
WindowsではCRLF、macやLinuxではLFという改行コードが一般的に使用されています。

* `CRLF(Carriage Return Line Feed)` : \rと\nの２つの文字を組み合わせて改行を表す。

* `LF(Line Feed)` : \nの一つの文字で改行を表す。

--------------------------------------------------------
（VS Code右下部分にありますね）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090951/63815164-f50a-4e3e-879f-6a8e0aea1ae4.png">

-------------------------------------------------
したがって、LF環境で作られたコードをCRLF環境で実行すると挙動が変わるのです。以下のようなスクリプトの実行エラーの原因となります。

例１改行文字を認識しない
```
error: syntax error near unexpected token $'\r''
```
例２ファイルが見つからない
```
error: No such file or directory
```
<br>
### 具体的なコマンドの意味

このコマンドはGitのグローバル設定にある、改行コードの扱いを取り決めるcore.autocrlfを変更します。core.autocrlfに設定できる値は以下の３つです。
    
* `input` : チェックアウト時は変更しない、コミット時はCRLF→LF
    
* `true` : チェックアウト時はLF→CRLF、コミット時はCRLF→LF

* `false` : チェックアウト時もコミット時も変更しない


Windowsユーザーが変更を加えないでGitをインストールすると、自動でtrueになっています。
core.autocrlfをinputにすることで、Windowsユーザーはmacユーザーが作ったコードを扱う際に無駄に変更を加えたり、コミット時にそれを戻したりする作業をしなくて済むのです。
<br>
### まとめ
この記事では、WindowsユーザーがmacOS/Linux中心のチームで開発する際に発生する問題を解消するためのコード`git config --global core.autocrlf input`について紹介しました。
この設定で、改行コードを意識せずにスムーズなチーム開発が望めます。
S3静的サイトデプロイ

# バケットタイプ
汎用は普通のやつ
ディレクトリはパフォーマンスがよくリアルタイム性に優れてるやつ

# バケット名
有効な文字が書いてあるのでそれ通りに
バケット名は全世界で？一意じゃないとだめっぽい

# ブロック
静的ウエブサイトだけ（公開してもいい物だけ）上げるときはブロックしない
クラウドフロント使うときはブロック

# ファイルアップロード
黄色の「↑アップロード」ボタンからフォルダごとアップロード可能
フォルダは末尾に「/」が入っているがこれは名前に含まれているわけではない

# 参考

https://dev.classmethod.jp/articles/aws-s3-web-iwazaki/

https://dev.classmethod.jp/articles/cloudfront-s3web/
ポケモン構築記事まとめサイトを生成AIでパワーアップさせる

# この記事は
AIエージェントを活用してWebアプリケーションの管理を自動化してみました。
概要的な構成を紹介します。

## 開発着手の背景
私は[ポケの記事](https://poke-article.com/matome-article/single_season24 "ポケの記事")というポケモンのパーティ記事まとめサイトを運営していました。

ポケの記事の機能はシンプルです。
 - Wordpressで作成
 - 自動で定期的に記事を収集（直近のXのポストからそれらしいものを取得）
 - ランキング順に並べて表示する

今は、更新を停止しています。
（作成当時、自動更新するサイトはありませんでしたが、今は他サイトが更新自動化＋画像認識をしているし、Xのアップデートでうまく動かないし）

ただ最近生成AIを見ていると、超パワーアップできそうなので、やってみました。

## 目標
 - 生成AIを使ってより詳細なデータを整理・表示できるようにする
 - 運営者に月30分以上の管理稼働をかけない（ポケの記事は月30分で管理できたので）
 - 日英対応する

## 開発の課題（今回越えるべき壁）
 - 記事はブログ形式で作成されることが多く、フリーフォーマットで作成されるためデータの整理が困難
 - 入力するパラメータが多すぎるため管理に時間がかかりすぎる（ポケモンのデータ、わざのデータなど）
 - 日英の翻訳

## 構成要素と概要的な役割
 - AIエージェント（[OpenAI Agents SDK](https://openai.github.io/openai-agents-python/ja/ "OpenAI Agents SDK")）
    - URLからテキスト情報を取得
    - テキスト情報をもとに、情報を整理、成形
    - Webアプリへ送信（REST APIでpost）
 - Webアプリ（[Django](https://docs.djangoproject.com/ja/5.2/)、[Django REST Framework](https://www.django-rest-framework.org/)）
    - AIエージェントのデータをDBに登録
    - ページを表示

![スクリーンショット 2025-06-08 21.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/f9bb0bd9-98ed-461b-be62-fca79a33b9bd.png)

:::note info
ポイント
 - AIエージェントとアプリと切り離して開発することで、AIエージェントをアップデートしやすくする
 - MCPは使わない（OpenAI Agents SDKはMCP対応している）
     - Webアプリとの間をMCP連携しない：受信側をどう作るのかナレッジが少ない、REST APIでも要件は実現可能
     - DBとの間をMCPで連携しない：Webアプリが行っているバリテーションチェックを行わず登録することにリスクがある
 - AIエージェントについては別記事にしました→[OpenAI Agent SDKでポケモンパーティ記事を分析する](https://qiita.com/tetsujin_081/items/6b06308a9e32bb760b75)
:::

## 課題の状況（今回越えるべき壁）
 - 記事はブログ形式で作成されることが多く、フリーフォーマットで作成されるためデータの整理が困難
   →ある程度解決(プロンプトをいじれば精度を向上できそうなレベル)
 - 入力するパラメータが多すぎるため管理に時間がかかりすぎる（ポケモンのデータ、わざのデータなど）
   →手作業だと1記事30分くらいかかりそうな作業が完全自動化（ただし精度は、、、）
 - 日英の翻訳
   →解決（英語で入力してとお願いすればOK）

## 成果物
[ポケモンバトルデータベース様に記載されているシーズン30のパーティ記事](https://sv.pokedb.tokyo/trainer/list?season=30&rule=0&party=1)をいくつかをAIエージェントへ入力しました。
 - 現時点で精度はまあまあです
 - 記事1つにつき約40円のコストがかかりますので、この画面を作るのに120円かかります
 - 画面はあまり綺麗に作っていないので細かいことは気にしないでください。
### ランキングページ
![スクリーンショット 2025-06-08 9.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/250f58b5-a462-4d37-a728-8fbee02cd0b9.png)

### 概要ページ
![スクリーンショット 2025-06-08 9.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/c6074299-8c08-4722-b1a2-ac8f7f789d91.png)

### 英語版概要ページ
![スクリーンショット 2025-06-08 9.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/1081b122-0042-445c-a875-c9d127507581.png)


 # 新たな課題
 ほぼ完成目前ですが、ややどうしようもない課題があります。
 個人サイトとしてはコストが高すぎる、という点です。
 [ポケの記事](https://poke-article.com/matome-article/single_season24 "ポケの記事")の運営経験より算出していますが、家計を直撃する値段です。
 - APIが高くつく（月大体100~200記事程度、なのでその40円倍がAPI費用想定です）
 - インフラリソースが高くつく（AWSで構築予定ですが、ポケの記事より大きいPVが想定され、冗長化、負荷分散を視野に入れていくと、どうなるんでしょうね）

ひとまずはコスト削減できるように、Agentを改良していきますが、うーん

# 今後の方針
ひとまず、生成AIのナレッジを公開してみようかなと。
生成AI関連ですが、こういった実例って少ないと思うので。
また、他のAgent構築ツールがあるのでそちらでも実装していこうかなと、そのためにAI部分を独立させているので。
パフォーマンスチューニング：パーティショニングを超簡単にまとめる

パフォーマンスチューニングについて調べている。

前回はインデックスについて調べた。
https://qiita.com/tetsuro-seki/items/926c78b41e89a7a1d118

今回は**パーティショニング**について。




### 1. パーティショニングとは
- **巨大テーブルを「小分けの箱」に自動分割**し、見た目は 1 テーブルのまま使えるしくみ  
- 例：`logs` テーブルを **月ごと** / **ユーザーごと** で分割  
- クエリは **該当パーティションだけ** を読むので全件走査を回避できる  

---

### 2. いつ使う
| 典型| 効果 |
| ---------- | -------- |
| **ログ／履歴が毎日数万〜数百万行増える** | 範囲検索 (`WHERE created_at >= '2025-06-01'`) が一瞬 |
| **古いデータを定期削除したい**  | `DROP PARTITION` 一発で月別データをまとめて削除|
| **ETL バッチが重い**  | 対象月だけロード → 処理時間が桁違いに短縮|

※ 数万行程度の小規模 DB や更新が多い OLTP テーブルではメリット薄め
※ETLバッチとは
大量データを Extract（取り出す） → Transform（加工する） → Load（書き込む） する定期バッチ。

### OLTP テーブルとは？

| 項目 | 内容 |
|------|------|
| **正式名称** | **O**nline **T**ransaction **P**rocessing（オンライン取引処理） |
| **役割** | 毎秒・毎分レベルで発生する “小さな取引（トランザクション）” を高速・確実に処理するためのテーブル |
| **典型例** | `orders`, `payments`, `users`, `inventory` など、<br>ECサイト・銀行・予約システムの**日常業務データ** |
| **特徴** | - **書き込み (INSERT/UPDATE/DELETE)** が多い<br>- 1 回のクエリは **短くシンプル** (主キー検索など)<br>- **整合性・同時実行性** が最優先<br>- 正規化が進んでおり、行数は増えても「リアルタイム性」を保つ |
| **対になる言葉** | **OLAP**（Online Analytical Processing）…集計・分析向けデータウェアハウス |

#### ざっくり
- **OLTP テーブル**: “レジの会計” をリアルタイムでさばくレジスター  
- **OLAP テーブル**: 売上をあとで集計して “経営会議の資料” を作るバックオフィス
---

### 3. 主なパーティショニング方式（PostgreSQL）

| 種類   | 例                                | 向き不向き       |
| ------ | --------------------------------- | ---------------- |
| RANGE  | `created_at < 2025-07-01`         | 時系列データ◎    |
| LIST   | `region IN ('JP','US')`           | 限られた値で分割 |
| HASH   | `user_id % N`                     | 均等分散したい大量 INSERT |

---

### 4. Laravel での作り方（マイグレーション例）

```php
// up()
DB::statement("
  CREATE TABLE logs (
    id          BIGSERIAL PRIMARY KEY,
    user_id     BIGINT,
    created_at  TIMESTAMP NOT NULL,
    payload     JSONB
  ) PARTITION BY RANGE (created_at);
");
// PARTITION BY RANGE (created_at)
// テーブル全体を created_at の範囲（RANGE）でパーティション分割すると宣言

// 1〜12までループ
foreach (range(1, 12) as $m) {
// 開始日
    $from = sprintf('2025-%02d-01', $m);
// 終了日
    $to   = sprintf('2025-%02d-01', $m + 1);
    DB::statement("
      CREATE TABLE logs_2025_$m
        PARTITION OF logs
        FOR VALUES FROM ('$from') TO ('$to');
    ");
// この子テーブルに格納する行は created_at が $from 以上 $to 未満 のものに限定
}
```
**%02d**
% フォーマット指定子の開始
0 ゼロで埋める
2 行数2に固定
d　整数を出力

- **Schema では未サポートのため raw SQL で定義するのが一般的**

### 5. 運用で気を付けること
- **パーティションキー必須クエリ**  ※1
  - `WHERE created_at BETWEEN …` がないと全パーティション走査で効果ゼロ
- **外部キー制約に制限あり**  
  - 親・子それぞれのテーブル側で制約を張れないケースがある
- **INSERT が遅くなる可能性**  
  - どのパーティションへ入れるか判定するオーバーヘッド  
  - **対策:** `HASH` 分割や *partition-wise join* の有効化

※1
パーティションプルーニングが効く例
```php
SELECT * FROM logs
 WHERE created_at BETWEEN '2025-06-01' AND '2025-06-30'
   AND user_id = 42;
```

※HASH分割 特定の値に偏りなく、均等に分割していく。
※partition-wise join 親テーブル同士のJOINを、対応するパーティション同士で並列実行


### 7. まとめ
1. **テラバイト級 / 毎日激増するテーブル** に効果
2. **月次・顧客別など自然な分割キー** があると導入コスト小  
3. Laravel では **マイグレーション = raw SQL／モデルは通常どおり**  
4. **キー付きクエリ厳守＋定期メンテ** で不要パーティション削除  
5. 親テーブル（Logs）はテーブル定義とパーテーション管理だけ
    子テーブルに実データが入っている
「grep」コマンドについてちょっとだけまとめてみた

##### 自己紹介
私は現在webエンジニアとして働く2年目のエンジニアです。
派遣という業務形態で働いており、現在参画している企業様は自社開発のサービスを運営しています。
この現場にアサインしてから、開発・保守運用チームに在籍しており、今まで触れてこなかったシステムの保守運用の観点やネットワークの知識について触れるようになりました。
Qiitaでは備忘録や学習記録として記事を投稿していきます。
拙い文章ですが、どうぞよろしくお願いいたします。

## webシステム運用でよく使用するコマンド「grep」について
今回はシステム運用をする様になってからよく使用する様になったコマンド、「grep」コマンドについてまとめたいと思います。
## grep：ファイルの中から文字列を探す

`grep`は、指定したファイルの中から、特定の文字列やパターンを含む行を抽出して表示するコマンドです。ログファイルからエラーメッセージを探したり、設定ファイルの中から特定の記述を見つけ出したりする際によく使用します。

### 使用方法
```bash
grep "検索したい文字列" ファイル名
```

使用例:
Nginxのエラーログから「error」という文字列を含む行を探す。

```bash
grep "error" /var/log/nginx/error.log
```

また、以下のようなオプションもよく使用します。

grep -i：大文字・小文字を区別せずに検索

grep -r：指定したディレクトリ以下を再帰的に検索
(再起的の意味：https://qiita.com/OTAGRAMER/items/0feab9fbf02e07a44915)

grep -v：指定した文字列を含まない行を表示

grep -e：複数の検索パターンを指定したいときに使用
以下の例では404エラーと500エラーを同時に検索している
(例：zcat access.log.gz | grep -e "404" -e "500")

### まとめ
運用上ではgrepコマンドを使用する機会が毎日あります。
例えば障害が起きた際も、ファイルがどの様なエラーを調べるときにgrepでerrorを検索し、
該当時間にどの様なエラーが起きているかを見て情報を追ったりします。
エンジニアは調べながら進められればいいとよく言われますが、障害など急務な対応の際に
「どんなコマンド打てばいいんだっけ,,,?」みたいな状態はよろしくありません。
最低限使うコマンドはすぐ使えるよう学習し、身につけておいた方がbetterです（自分に言い聞かせてます）

私はまだまだ未熟なエンジニアですが、これからどんどん備忘録、学習記録を投稿していきます！
記事ご覧いただき、ありがとうございました🙇‍♂️
Lambda Function URL と POST リクエスト

とっても些細なことで、６時間詰まったので共有です。

# 結論
Lambda 関数 URL で PUT メソッドまたは POST メソッドを使用する場合、ユーザーはリクエストを CloudFront に送信するときにリクエスト本文の SHA256 を計算し、本文のペイロードハッシュ値を x-amz-content-sha256 ヘッダーに含める必要があります。Lambda は、署名されていないペイロードをサポートしていません。

# 経緯
とあるひ、Cloud Front から、Lambda Function URLにPOSTリクエストを飛ばしました。

あれれ...。うまくいかない。
なんで GETは通るのに...。

Cloud Front => Lambda(Lambda Web Adaptor(Next.JS SSR Streaming)) の複雑な構成且つ、APIルート側のAPIを叩いていたので、Cloud Frontの OAC周りの設定が怪しいなと思っていたのですが....。

### なんのことはない、リクエストの仕方の問題でした😭

### 不精して、直接 Lambda Function URL を叩いてチェックしなかったのがよくなかったですね...。

# さいごに
### でも、わかってよかったw
同じところで引っかかってる方に届いたら嬉しいです。（もしかして僕だけ？）
【Unity・URP】失われし色、蘇るモノクロノ世界。Unityで世界をモノクロにする方法

# はじめに
Unityで簡単にモノクロを表現する方法を説明したいと思います
たった1つのものをSceneに追加することでモノクロ世界を作れます．

# 開発環境
Unity 6000.0.36f1
Universal 3D

# 本編

## 1. 新規プロジェクトの立ち上げ
UnityHubを開きNewProjectを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/ac89cf6b-49e4-44e4-a053-80ee19f3857f.png)

Universal 3Dを選択し，プロジェクト名，保存場所などは任意の入力をし，プロジェクトを作成します！

:::note
今回モノクロを試すためだけならなにも変えなくても大丈夫です
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/0b43fee7-7565-4da1-839f-66adae64f879.png)


## 2.モノクロ世界を作る
### カメラの設定
Mainカメラを開き，Renderingの欄のPostProcessingにチェックをつけます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/cd462cec-b53e-448e-8e23-c1dae3b496e0.png)

### Volumeの設定
次に、シーン全体に影響を与える Global Volume を作成します。
Hierarchy タブで右クリックを押し、Volume > Global Volume を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/edbbe0ed-b02c-48f6-99cd-e7d43d716b2d.png)

Global Volume オブジェクトが作成されたら、Inspector タブの Volume コンポーネントの一番下にある Volume Profile の欄の New を押します。これで、モノクロ用の新しい Volume Profile を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/09c0fb2a-7356-49ee-b0dc-2f4d6857f629.png)

「New」を押すと Volume Profile が作成され、自動的に選択された状態になるので、そのままダブルクリックをして開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/668a1322-acc9-416d-b876-bcce1f33d96c.png)


### モノクロエフェクトの追加
作成した Volume Profile を開いたら、いよいよモノクロエフェクトを追加します。

Volume Profile のインスペクターで「Add Override」ボタンをクリックし、Post-processing > Color Adjustments を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/39929f6f-f938-47ba-a73d-973ba1879d95.png)


Color Adjustments が追加されたら、以下の設定を変更します。

Saturation (彩度)のチェックボックスをオンにし、スライダーを -100 に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/f2b55690-d372-46af-a16c-2afab56179af.png)

これで、シーン全体がモノクロに表示されるはずです！Saturation を -100 にすることで、色情報が完全に失われ、グレースケール（モノクロ）になります。

### モノクロ世界の確認
シーンビューやゲームビューで、作成したオブジェクトや既存のオブジェクトがすべてモノクロになっていることを確認しましょう。
モノクロになった例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/7766b175-be3c-4de9-9b6d-9ddcb3d689fb.png)


# まとめ
Unity で Global Volume と Color Adjustments を利用することで、たった数ステップでシーン全体をモノクロにする方法を解説しました。

1. Universal 3D プロジェクト を作成する。
1. Main Camera の PostProcessing にチェックを入れる。
1. Global Volume をシーンに追加する。
1. Global Volume に 新しい Volume Profile を作成する。
1. Volume Profile に Color Adjustments を追加し、Saturation を -100 に設定する。
AWS Amplify だけで「Storage Browser for Amazon S3」を構築する手順 🚀

AWSアカウントだけで、「開発環境なし」でもブラウザ上で動く S3 用ストレージブラウザを簡単に構築できます。

---

## 🎯 この記事でできること

- AWS Amplify Hosting + Cognito + S3 を使用したブラウザベースのファイル管理UI構築
- コード・Git不要、Webコンソールだけで完結
- `StorageBrowser` コンポーネントの実装サンプル付き

---

## ✅ 前提条件

- AWSアカウントにログイン済み
- 開発マシン・Git・CLI は不要
- AWSコンソールだけで完結

---

## Step 1: Amplify アプリを作成

1. AWSコンソール → **Amplify** → 「アプリを作成」
2. **Manual Deploy** を選択し、空の React または Next.js アプリをドラッグ＆ドロップしてデプロイ

👉 この時点で、静的ホスティング環境が自動で作成されます。

---

## Step 2: ストレージ（S3）を追加

1. Amplifyコンソール → **バックエンド環境** → 「ストレージを追加」
2. 「S3 バケット」を選び、**Cognito 認証付き**で作成  
   - デフォルト設定でOK：バケット＆IAMロールが自動生成されます

---

## Step 3: 認証（Cognito Auth）を追加

1. Amplifyコンソール → **Auth** → 「認証を追加」
2. メールアドレスベースのサインアップ／サインインを有効化  
   - Cognito と IAM により、認証ユーザーごとの S3 アクセス制御が可能になります

---

## Step 4: UI コンポーネントを組み込む

Amplify の Web IDE やコンソールの「コード編集画面」で以下を追加します。

```bash
npm install @aws-amplify/ui-react-storage aws-amplify
```

```tsx
// src/App.tsx または pages/index.tsx

"use client";

import { Amplify } from "aws-amplify";
import {
  createAmplifyAuthAdapter,
  createStorageBrowser
} from "@aws-amplify/ui-react-storage/browser";
import "@aws-amplify/ui-react-storage/styles.css";
import config from "./amplify_outputs.json"; // Amplify出力ファイル

Amplify.configure(config);

const { StorageBrowser } = createStorageBrowser({
  config: createAmplifyAuthAdapter()
});

export default function App() {
  return <StorageBrowser />;
}
```

- 最新の `@aws-amplify/ui-react-storage` と `aws-amplify` を使用
- 上記コードをアプリに配置すると S3 ファイルUIが動きます

---

## Step 5: 動作確認

1. Amplify アプリの公開URLにアクセス  
2. ユーザー登録 → ログイン  
3. `StorageBrowser` 画面でファイルの一覧、アップロード、ダウンロード、削除ができます

---

## 🖥 CORSとIAM設定も確認しよう

- **CORS**: StorageBrowser はブラウザから S3 に直接アクセスするため、CORS 設定必須（Amplify自動設定済だが、必要なら調整）  
- **IAM**: 認証された Cognito ユーザーには S3 へ読み書き権限が自動付与されます

---

## ✅ まとめ

| 項目       | 内容 |
|------------|------|
| 構成       | Amplify の Hosting + Auth + Storage |
| UI         | `StorageBrowser` コンポーネントによる簡易ブラウザUI |
| 特徴       | コード不要／即用可能／認証付き |
| 注意点     | CORS・IAM権限・バケット構成の制御が必要 |

---

## 🔗 参考リンク

- Storage Browser コンポーネント: https://ui.docs.amplify.aws/react/connected-components/storage/storagebrowser
- AWS Amplify: https://docs.amplify.aws/

---

## 🏷 Giita投稿時のタグ例

```
aws amplify s3 react ui storage-browser cognito
```

---

以
自宅ラボ整備　Kubernetes (k3s) 編

今は要件を定めるだけなので実装は別記事にする予定

## やりたいこと

- 自宅鯖の `k3s` の再整備
    - ほったらかしにしてしまったので現状把握から
    - 場合によってはアップグレード
- cloudflare との連携
    - cloudflared を用いた `ingress` 
        - 既存のコントローラがあればそれを、無かったら自分で実装することも計画
    - 理想は `ingress` を作るだけで cloudflare側 のドメイン・エンドポイントが作成され、cloudflare tunnel で `service` を外部公開させること
        - これで簡単に web サービスを作れるようにしたい
- tor hidden service 用の `ingress` 
    - 一つ上の例の tor hs 版

## やらないこと

- クラスタ化・HA構成などの可用性の検討
    - ただの遊び環境なので

## 自宅鯖について

- 10年ぐらい前の古いノートPC  
- HW: 2 Core / 16GB / SSD 128GB + 256GB
- OS: Arch Linux
- MW: Docker / Docker-Compose / Sysbox 

古いけどVM借りるよりはコスト良いと思ってる

### 現在のk3sの状況

docker compose で kind で `rancher/k3s:v1.25.4-k3s1` が動いていたが……  
`sysbox-runc` が正常に動作してない。。。  

### おわりに

とりあえず、今日はここまで、、、  
明日は、`sysbox` を復活させる
エンジニア3日目の貴方へ～雑学編①ツール～

## はじめに
今の世には、たくさんの開発体験を向上させるアプリやサービスがあります。

今回は私が今まで使ったもので便利だったもの、もっと早く知りたかった事を書いていきます。

## バージョン管理

皆さん、バージョン管理はどうやってますか？
何もしてないとか、丸ごとバックアップだったりとか、ファイルをコピーしておくだったりとか...

そんなの面倒で分かりにくい！
この世にはバージョン管理システムは色々あるのですが、一番多くのエンジニアが使っているシステムを紹介します。

### GitHub
分散型バージョン管理システムと呼ばれ、Gitを活用したプラットフォームです。

複雑なバージョン管理を簡単にしたり、インターネット上に上げる事ができます。

チーム開発で必須級のサービスです。
もちろん個人製作でも大変便利なものになってます。
これを使って、煩雑なバージョン管理から卒業しましょう。

## デザインツール

アプリを作るとき、頭の中でデザインを思い浮かべると思います。
それを何らかの形で書き起こしたりしていますか？

自分でやるだけならいいや...と思うかもしれません。

個人開発でも、頭の中に思い浮かべただけのデザインでコーディングするより、書き起こしたほうが効率的な事もあります。

チーム制作ならなおさらデザインの共有は重要です。

チーム員が思い描くデザインが違えば、後々揉める原因になるかもしれません。
もう作っちゃった後にこんな事になりたくないですよね。

デザインを先にある程度決めておきましょう。

### Figma
個人的に一番よく利用しているサービスです。

プロジェクトを複数作ったり、その中で画面のデザインをしたり...
無料でも十分な機能が使えます！

### mermaid記法
後述で詳しく話します。

モックアップなどは出来ませんが、フローチャートや画面遷移図などには最適です。

## アイデアツール

個人、またはチームのアイデアツールはどうしていますか？
個人はメモ帳に書くだけでも十分かもしれませんが、チーム開発する場合は連携がとりにくく不十分です。

良いアイデアは、多くのアイデアから生まれます。
臆する事無くアイデアを出し合える環境をサポートしてくれるツールを紹介します。


### FigJam

Figmaと同じ会社が提供するオンラインホワイトボードツールです。
Figmaと連携して同じプロジェクトに置けるので便利です。


### Miro

オンラインホワイトボードツールです。
アイデアを自由に書いたり、様々なデザインが出来ます。
画面設計にも使われます。

### ZOOMホワイトボード

オンラインホワイトボードツールです。
ZOOMのアカウントがあるならすぐに使えて、基本的な事は一通りできて便利です。

### Notion

後述するMDやMermaid記法を使うことができるメモツールです。
個人、チーム開発両方で便利なツールです。

無料で書ける量に制限があるので普段使いではなく、チーム制作の時に使用しています。

### Obsidian

こちらも後述するMDやMermaid記法を使う事が出来るメモツールです。
個人のローカルで使う場合はすごく便利なツールですが、オンラインやチームには不向きです。

## 知って置いたら得な記述方法

テキストって、普通に書く以外の方法があったりします。
覚えていたら地味に便利だったりするので紹介します。

### MD(マークダウン)

文章を分かり易く、簡単に書くための記述方式です。

実はこの記事もMDで記述されています。
GitHubのREDMEなどもMDで書きます。
googleドキュメントなどでも使うことができます。


```md
# h1タグ
## h2タグ
### h3タグ
#### h4タグ
- 点
```

<details><summary>結果</summary>


# h1タグ
## h2タグ
### h3タグ
#### h4タグ
- 点
</details>

これらが特によく使うものです。
これを書くだけでいいので便利です。煩わしいGUI操作をしなくて済みます。

### mermaid記法

これはMDがベースの記述方式です。

コードで作図ができちゃいます。
```mermaid
graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-- コメント-->D;
```

<details
><summary>こんなコード
</summary>

```md
```mermaid
graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-- コメント-->D;
```
</details>

設計などで結構便利です。
個人的にフローチャートなどの作成に最押しの書き方です。



## 参考文献
https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
そのシステムは生きているのか？死んでいるのか？


# システムはどれくらいで更新するべきなのか

:::note warn
あくまでも個人的な意見が反映されています。
:::

個人開発でも、大規模な開発でも、システムを開発したら運用をしていかなければならない。
時期が来たら、システムを一新して新しく作り替えたり、時代のセキュリティに併せてシステムを構築しなおさなければならなくなるだろう。

今作っているものはどれくらい先まで見越して作っている物なのだろうか？

## システムはどれくらいの期間使われる想定か？

システム開発をする中で、未来の状態も想定して開発をしなければならないことがある。
しかし、そのシステムが使われる期間も想定しておくべきだろう。

このテーマは、今までもいろいろな人が考察してきたであろうテーマであるが、自分なりにも考えてみることにする。

## 使用するシステムの基盤はいつまで使えるのか？

まず、考えるのは、サーバーなど物理的な資産が、いつまで使えるのかと言うところだろう。
調べるところによると、資産の減価償却は5年で終わるらしい。
正直電子機器は、10年ぐらいで買い替えが必要なラインだろう。
最近は、クラウドコンピューティングサービスが展開されているため、この辺りは考慮に入らないかもしれない。

## では、OSのサポートはどだろう。

WindowsOSは大体５〜10年でOSのサポートを終える。
MacOSも公式のデータではないが、5、6年と言ったところ。
天下のWindowsやAppleが5〜10年でサポートを切って新しくしているのだ。
10年以上使ってそのシステムはセキュリティは大丈夫なのか考えるべきだろう。

## そもそもプログラム言語のサポートは？

システムは何かしらのプログラム言語で開発をするが、その言語のサポートはどうだろうか。
私は.NETをメインで開発をしているが、.NETは3,4年でサポートが終わってしまう(LTSの場合)
LTSでなければ2年もサポートしていない。

そんなサポートの切れたフレームワークを使い続けて大丈夫なのかと言うことも考えることが必要である。

VBに至っては、すでにMicrosoftは新しい機能の追加はしないと謳っている。(バグの修正はある)

## 使い続ける限界点は

日々のメンテナンスは勿論のこと、改修するためのコストもバカにならないだろう。
500万かけて作ったシステムが、2年後使い物にならなかったらそれはそれで問題である。

最低5年は使いたいところでは無いだろうか。

そう考えると、長くとも10年周期でシステムを構築し直し、システム自体の要件とともに見直しをすべきだろう。

* 時代に合っているのか。
* 顧客の要望に応え切れているのか。
* セキュリティ的に問題はないか。

今後システムの保守をするのに人材の確保はできるのか。

この辺りに問題が発生しそうな時こそシステムの寿命なのかもしれない。

サポートも切れてる・保守する人員もいない・システムを把握している人がいない。
こうなってしまったら、システムとしては死んでいるも同然だろう。

そうならないためにも、日々のメンテナンスから必要な修正や調整を入れつつ、
新しいシステムへの移行をしやすくするための、仕組みを構築しなければならない。

特に大規模なシステムに関してはとても重要なことだろう。

## 10年前と、10年後を想像して。

20年後の未来は想像できないが、10年前から変わったことは知ることができる。
たった10年でも大きく世の中は変わってしまっている。

10年前と同じ物があるのか。それは、10年後も生きている事は出来ているのか。
想像してシステムと向き合っていかなければならないだろう。


## まとめ
全てのシステムが、10年前後で更改する必要はないかもしれないが、
時代に合わせてシステムの中身を見直すことは必須だろう。

今自分が開発しているシステムは、いつ迄動き続けさせるのか。
動かせ続けられるのか一度整理するいい機会かもしれない。
Figma MCP Server β版を試してみた — VS Code × Copilot でノーコード開発してみる

# はじめに
Figma公式の Dev Mode MCP Server がオープンβ版で登場し、ローカルのFigma Desktopアプリから起動可能になっています。今回はこれを VS Code × GitHub Copilot で試してみたので、その使用感やハマった点をまとめます。

# Dev Mode MCP Server オープンβ解放
- MCPは、LLMやエージェントがFigmaやGitHubなどのツールから“設計情報”を取得するための標準プロトコル
https://modelcontextprotocol.io/introduction
- Figmaの Dev Mode MCP Server は、選択中のフレーム（またはフレームへのリンク等）からカラー値・変数・レイアウト構造などを抽出し、エージェントへ渡せるようにするローカルサーバー
https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server
- 対応エディタは VS Code、Cursor、Windsurf、Claude Code など

# 現状は「ローカル起動限定」
β版では、Figma Desktopアプリを通じてローカルでMCPサーバーを立ち上げる必要があります。よってクラウド環境で直接使うことはできず、GitHub Copilot Coding Agentなどには今のところ直結できません。

将来的な対応に期待です。

# VS Code × Copilot で試してみた
1. Figma Desktop で MCP Server を有効にする
    - `基本設定 → Dev Mode MCPサーバーを有効にする`をチェック
2. VS Code の設定（.vscode/mcp.json）に以下を追加
```json:.vscode/mcp.json
{
    "servers": {
        "Figma Dev Mode MCP": {
            "type": "sse",
            "url": "http://127.0.0.1:3845/sse"
        }
    }
}
```
これで Copilot Agent から「Figma Dev Mode MCP」が見える状態になります。

# Copilot Agentでノーコード開発
あらかじめ用意したFigmaのデザイン
![メイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532049/97a1ce42-74e2-45b6-8f7e-beadb9f6aac9.png)

試しに以下の2パターンでコード生成を試しました
- ① 既存HTMLを修正させる形
- ② 0からHTMLを生成させる形

### ① 既存HTMLを修正させる形
```text:プロンプト
Figmaのデザインに合わせてCSSを修正してください。
```

編集前のベースとなるアプリ画面
![スクリーンショット 2025-06-08 22.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532049/d9b0782d-b3b0-4261-888a-acc77743d1d4.png)

編集後のアプリ画面
![スクリーンショット 2025-06-08 17.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532049/06551fe1-4476-4e5e-9376-2424067c36ca.png)
パディングやマージンなどの微妙なスタイルがずれる結果となりました。
（何度か試しても完全一致はせず）

### ② 0からHTMLを生成させる形
```text:プロンプト
Figmaのデザインに合わせてindex.htmlとcssを実装してください。
今回は見た目が同じものを作れれば良いです。jsなどの実装は不要です。
```

生成されたアプリ画面
![スクリーンショット 2025-06-08 21.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532049/3a6f63e7-ad6b-4986-b20f-1afbe3b1c513.png)
完全一致といっても差し支えのないレベルです。
（ただし見た目だけの実装なのでアプリとしての動作はしません）

### 結果と考察
①では期待通りにはいかず、②ではFigma通りのHTML＋CSSが生成されました。

推測ですが、これはFigmaフレームとHTMLタグ構造が厳密に一致しないと調整が失敗しやすいからだと思います。
既存の実装はズレがあったのに対し、0から生成では自ら一致する構造を作れる点が有利でした。

# MCPの仕様とハマりどころ
- フレーム構造・ネスト階層とタグ構造のズレが生成品質に直結する
- すでにHTMLベースがある場合、Agentはどこを変更すればいいか理解しづらく、結果的に失敗しやすい
- フレーム全体を「ゼロからコード化」させると、MCPサーバーから得られるノード情報の順序・構造を崩さずに生成されやすい

# まとめ
- FigmaのMCPサーバーがオープンβ版で登場
    - 現状はローカル起動のみ、Github Copilot Coding Agent との接続は今後に期待
- ゼロベースHTMLが強い
    - 既存HTML修正よりも構造再生成の方が成功率高い
    - Figmaフレーム構造とタグ構造が一致しないと生成精度低下

MCPはまだβ版ですが、「Figma → コード」のフロー改善における大きな一歩といえます。
特に「ゼロからコンポーネントを生成」などの用途では即戦力になる予感があり、今後のアップデートが楽しみです。
fx-72Fで曜日を求める

## ツェラーの公式を使う
以前、[グラフ電卓のMicroPythonで曜日・日数を求める](https://qiita.com/harycurl/items/19cd7b93e99d857420ce)でツェラーの公式を使った曜日計算を行ったが、fx-72Fでもやってみることにする。

ツェラーの公式はWikipediaにもあるが、「コンピュータでの計算」のグレゴリオ暦の式を用いる。

https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%AE%E8%A8%88%E7%AE%97

## fx-72Fは搭載機能が限られている
fx-72Fのプログラム機能はキーに書かれている関数やセットアップコマンドの他は、以下のプログラム専用コマンドが使えるだけである。
- 基本動作コマンド：?、→、:、◢
- 無条件ジャンプコマンド：Goto～Lbl
- 条件ジャンプコマンド：⇒、＝、≠、＞、≧、＜、≦
- 制御構造系コマンド(If)：If～Then（～Else）～IfEnd
- 制御構造系コマンド(For)：For～To～Next、For～To～Step～Next
- 制御構造系コマンド(While)：While～WhileEnd
- プログラム制御コマンド：Break

## 床関数をfx-72Fで実現するには
ツェラーの公式には床関数が出てくるが、fx-72FにはIntやIntgの関数が搭載されていない。
ただし、Rnd（丸め関数）は用意されているため、これを使って床関数とする方法を考える。
- Rndは表示桁数に従って四捨五入するため、まずはモードをFix 0（小数点以下の桁数0）にする。
- このままでは四捨五入となってしまうため、床関数を適用したい数値から0.5を引き、Rnd関数を適用する。


## プログラム
以上を踏まえて作ったプログラムは以下のようになる。
本来1行で入力するものであるが、適宜改行した。

``` :Zeller
Fix 0:
?→A:
0.5→X:
Rnd(A÷10000-X)→B:
Rnd((A-10000B)÷100-X)→C:
A-10000B-100C→D:
If C≦2:Then B-1→B:C+12→C:IfEnd:
(B+Rnd(B÷4-X)-Rnd(B÷100-X)+Rnd(B÷400-X)+Rnd((13C+8)÷5-X)+D)→Y:
Y-Rnd(Y÷7-X)×7→M:
M:
Norm 1
```

1行目で表示設定をFix 0にし、最終行でNorm 1にすることで表示を戻している。Norm 1の部分で抜けない限り、Fix 0のままとなってしまう。
2行目で年月日を8桁数字（YYYYMMDD）で入力。この代わりに ?→B:?→C:?→D として、それぞれ年・月・日を入力させる方法もあり、その場合は4～6行目が不要となる。
0.5を引く操作が頻発するため、3行目で予め変数に入れておく。
「1月、2月を前年の13月、14月として扱う」の処理を7行目で行っている。
そして8行目と9行目でツェラーの公式を適用。
9行目で変数Mに代入した後、10行目でMの内容を表示させているが、変数Mに取っておく必要がなければ9行目を Y-Rnd(Y÷7-X)×7 とすることでそのまま曜日コードを表示させることができる。
結果は、日曜=0、月曜=1、…、土曜=6の曜日コードで表示される。

なお、エラーチェックはしていないため、存在しない年月日を入れても何らかの数字を表示してしまう点に注意が必要である。
Error: Bundles must have unique names. Conflicting names: index.jsの対処法

<h2>症状</h2>
percelを導入して、ビルドしたときに以下のエラーが表示された

翻訳すると、「エラー: バンドルの名前は一意である必要があります。名前が競合しています: index.js」
indexが競合してfailしてるとのこと

```terminal:error
 npm run dev

> hogeapp@1.0.0 dev
> parcel watch src/content.js src/background.js --dist-dir dist

🚨 Build failed.

Error: Bundles must have unique names. Conflicting names: index.js

  AssertionError [ERR_ASSERTION]: Bundles must have unique names. Conflicting names: index.js
      at BundlerRunner.validateBundles (D:\hogeapp\node_modules\@parcel\core\lib\requests\BundleGraphRequest.js:373:27)
      at BundlerRunner.bundle (D:\hogeapp\node_modules\@parcel\core\lib\requests\BundleGraphRequest.js:345:12)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Object.run (D:\hogeapp\node_modules\@parcel\core\lib\requests\BundleGraphRequest.js:123:17)
      at async RequestTracker.runRequest (D:\hogeapp\node_modules\@parcel\core\lib\RequestTracker.js:758:20)
      at async Object.run (D:\hogeapp\node_modules\@parcel\core\lib\requests\ParcelBuildRequest.js:52:7)
      at async RequestTracker.runRequest (D:\hogeapp\node_modules\@parcel\core\lib\RequestTracker.js:758:20)
      at async Parcel._build (D:\hogeapp\node_modules\@parcel\core\lib\Parcel.js:320:11)
      at async Parcel._startNextBuild (D:\hogeapp\node_modules\@parcel\core\lib\Parcel.js:228:24)
      at async $dad2a694f9c45026$export$2e2bcd8739ae039._runFn (D:\hogeapp\node_modules\@parcel\utils\lib\index.js:34252:13)
```

```json:manifest.json
{
  "manifest_version": 3,
  "name": "hogekinou",
  "version": "1.0",
  "description": "機能の詳細",
  "permissions": [
    "scripting"
  ],
  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "js": [
        "dist/content.js"
      ],
      "run_at": "document_idle"
    }
  ],
  "host_permissions": [
    "<all_urls>"
  ],
  "background": {
    "service_worker": "dist/background.js"
  },
  "action": {
    "default_title": "Hoge Kinou"
  }
}
```

```json:package.json
{
  "name": "hogeapp",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "parcel watch src/content.js src/background.js --dist-dir dist",
    "build": "parcel build src/content.js src/background.js --dist-dir dist"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "parcel": "^2.15.2"
  }
}
```

<h2>解決策</h2>
ビルド際にcontent.jsとbackground.jsが、同じフォルダのindex.jsというファイルで作成されてるからエラーが出ていた

作成される先のフォルダを別々に作成し、そこで作成されるようにすることでエラーが解消した

具体的には、scriptsの箇所を以下にした

```json:package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev:content": "parcel watch src/content.js --dist-dir dist/content",
    "dev:background": "parcel watch src/background.js --dist-dir dist/background",
    "dev": "npm run dev:content & npm run dev:background",
    "build": "parcel build src/content.js --dist-dir dist/content && parcel build src/background.js --dist-dir dist/background"
  },
```
【Canvas × JavaScript】BRAT風プロフィール画像やミームを簡単に作れる「Brat Generator」を使ってみ

![cover(900x600).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959521/01e8c0a3-05cf-4fdb-ae22-aab488227532.png)


## 💡 Brat Generatorとは？

「[Brat Generator](https://brat-generator.pro/)」は、以下のような“Bratっぽい”画像をブラウザ上で生成できる無料ツールです：

- グリーン背景にホワイト文字の怒りっぽいレイアウト
- 文字サイズ・行間・配置（左寄せ、中央、右寄せ）のカスタマイズ
- 背景色や文字色を自由に変更可能
- 解像度の指定（正方形・Twitter用・ストーリーズサイズなど）
- 青背景×赤文字、黒×ネオングリーンなど複数テーマをプリセット

---

## 🧪 実際に使ってみた

1. テキストを入力（例：「I AM THE DRAMA」など）
2. 背景色や文字色を選択
3. 文字の配置・フォントサイズを調整
4. ボタン一つで画像を生成
5. 「画像を保存」で即ダウンロード可能！

スマホでも動作が軽快で、SNS投稿・プロフィール画像・ミーム作成などに最適です。

---

## 🔧 技術的な実装概要

| モジュール | 技術構成 |
|------------|----------|
| レンダリング | HTML Canvas API |
| フレームワーク | Next.js（App Router） |
| スタイル | Tailwind CSS + DaisyUI |
| 画像出力 | html-to-image による PNG ダウンロード |
| 状態管理 | useRef + useState（React Hooks） |

文字列を複数行に分割 → Canvas API で中央配置 → DataURL で画像化 → a.download で保存、という構成です。完全にクライアントサイドで完結します。

---

## 🕹 活用シーン

- Charli XCX ファンアート・アルバム風カバー制作
- Twitter・Instagram・Threadsなどのヘッダー画像
- 自作ミーム・プロフィール画像（PFP）
- ショート動画のサムネイル・文字入り表紙

---

## 🌐 改良版はこちら

今回紹介した拡張機能付きの Brat Generator 改良版は以下のリンクから試せます：  
→ [Brat Text Generator](https://www.brat-generator.pro/)

---

## 📝 まとめ

Brat Generator は、デザインスキルがなくても「怒りっぽくて最高にクール」な画像を誰でも作れる素晴らしいジェネレーターです。  
Web技術だけでここまで表現できるのはとても面白く、学習にも最適です。  

最近の Web 表現に興味がある方、Charli XCX ファン、美学としての BRAT スタイルにハマっている方、  
ぜひ触ってみてください！
AWS Certified Machine Learning Engineer - Associate 受験記

AWS Certified Machine Learning Engineer - Associate（MLA-C01）の受験記になります。

# 自己紹介
- 総合電機メーカー 入社4年目
- 最近はIoT CoreやGreengrassを使った組み込みソフトウェア開発がメイン
- AWS歴 3年
- 好きなサービス Lambda
- 取得済みAWS認定 CLF, SAA, SOP, DVA, DOP, SAP, ANS, DEA(取得順)

# 受験のきっかけ
一か月前にAIFを受験しており、勉強していた際にSageMakerやML系サービスの内容が多くかなりMLAに繋がっていそうだと感じた。そのため、記憶が新しいうちに受けてしまおうと思い受験した。

# 勉強方法
今回はCloud Techのみを利用して解説を見つつ、不正解の選択肢についてもなぜ不正解なのか確認していった。
Cloud Techで問題を解き、わからない単語や概念、サービスの内容をPerplexityで調べて概要を理解しつつ、最終的にAWSの公式サイトの内容を見てファクトチェックするというのが学習のルーティンになっていた。

# 受験本番
いきなり１問目からわからない問題が出題されて焦った。いつもよりも判断に迷う問題が多かったので勉強不足だったのかもしれない。

一周目は32分で解いて、再度すべての問題を30分くらいかけて見直しした。最終的には
- 自信がある問題　52問
- 2分の1まで絞り込めてそうな問題　6問
- 自信がない問題　7問

という感じだった。

また、今回初めて並べ替え形式やケーススタディ形式の問題を見た。前回のAIFの時はなかったため本当にあるのか疑心暗鬼だったが、今回は出題されていた。内容についてはそこまで難しくはなかった。

# 結果
少し不安な部分もあったがきちんと合格していた。
毎回、解けなかった問題があるのにそれなりに高いのは解けなかったと思った問題がほとんど点数に関係していない問題なんだろうか・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/a2881e2c-434b-41f2-a4dd-ab42f9e6bdb4.png)


# 所感
今回はかなり勉強不足だった感じが否めない。あまりCloud Techだけでは網羅できていなかった気がする。エンドポイントの保護方法であったり、モデルのデプロイ方法についてもう少し勉強したほうがよかった。

# 終わりに
今年度中にAIF、MLA、MLS、SCSの4つを取得することを目標にしており、これで折り返し地点にきた。
今年のAWS reInventには会社のご厚意で行けるかもしれないので、それまでに全冠できるように勉強していきたい。
MLSも今回の内容に近いのでできれば7月末には取りたいなぁ・・・
毎日増加するお金



Paizaの「所持金が10%ずつ増える日数を求める問題」にチャレンジ！
今回のポイントは「小数点以下切り捨て」。

<br>

## 問題概要

- 所持金 A 円からスタート
- 毎日 10% 増加（小数点以下切り捨て）
- 目標金額 B 円を超えるのは何日後？
<br>
入力例：

    10 15

出力例：

    6

<br>

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__inc_percent

<br><br><br>

## ❌NG例
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [A, B] = input.split(' ').map(Number);
    
    
    let count = 0;
                             // ✗ 小数切り捨てしてない！
    for(let temp = A; temp <= B; temp *= 1.1, count++);
    
    console.log(count);

    
    rl.close();
});
```
❌ 1円未満の増加も加算されるから正解にならない！

<br><br>

## ✅OK例
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [A, B] = input.split(' ').map(Number);
    
    
    let count = 0;
    for(let temp = A; temp <= B; temp += Math.floor(temp * 0.1), count++);
    
    console.log(count);

    
    rl.close();
});
```
- 増加額  =  `Math.floor(現在の所持金 * 0.1)`
- 次の日の所持金 = 現在の所持金 + 増加額

<br><br>

## ✅whileバージョン
```js
const rl = require('readline').createInterface({input: process.stdin});

rl.once('line', (input) => {
    const [A, B] = input.split(' ').map(Number);

    let money = A;
    let days = 0;

    while (money <= B) {
        // 10%増加分（小数点以下切り捨て）
        let increase = Math.floor(money * 0.1);
        money += increase;
        days++;
    }

    console.log(days);
    rl.close();
});
```

<br><br>

## 📝 気づきメモ
- `temp *= 1.1` で進めると小数が残ってアウト！
- 1円未満の「増加額」は無視する　→　`Math.floor`


<br>

## まとめ

「10%増加問題」、実は小数切り捨てが一番のポイントだった。あとは、前回と同じようなコードでつまらなかった(´;ω;｀)

あと、毎日所持金が10％増加するとか、どこのファンドだよ。教えてくれ。


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/08/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e6%af%8e%e6%97%a5%e5%a2%97%e5%8a%a0%e3%81%99%e3%82%8b%e3%81%8a%e9%87%91/)
AWS完全初心者がAmazon Q CLIでゲームを作ってみた話

## はじめに
こんにちは。Tsukasaです！
今日は、先日の続きでAmazon Q CLIを使ってゲームを作った話について記事にしようと思います。
Q CLIのインストールについてはこちらをご覧ください。

https://qiita.com/tks_1128/items/54c7305c88f583ac72c4

## 挑戦に至った経緯
そもそも何故今回Amazon Q CLIでゲームを作ることになったかというとAWSで下記のようなキャンペーンをやっていたからです。
Q CLIでゲームを作って、それをQiitaなどのブログにアップするとTシャツがもらえるそうです。
興味のある方は是非みて見てください！

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

## 事前準備
先日Amazon Q CLIをインストールしましたが、今回のゲーム作成はPygameをインストールする必要があります。下記にリンクを貼っておきますので、こちらからやってみてください。

https://www.pygame.org/wiki/GettingStarted

## ゲームの作成
後やることとしては、ひたすらQ CLIにプロンプトを投げてゲームを作ってもらうことです。
私は野球が好きなので、野球に関するゲームにしたいなと思っていました。
キャプチャを撮り忘れたのですが、プロンプトに聞いたところ、ストラックアウト(ボールを的に向けて投げて当てるゲーム)になりました。
その上で、要件定義もやってもらい、取り敢えず形として見えるものになりました。
最初に出来上がったのがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/c6f06514-be25-496a-91b4-974dbe279805.png)

取り敢えず的のようなものが出来上がりましたが、文字化けしていて、何なのかわかりません。
ここからはひたすら修正していきます。
今回ターミナルにトラブルがあって、プロンプトの内容について全然キャプチャが取れなかったのですが、一部を紹介いたします。


![スクリーンショット 2025-06-08 18.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/ebdd5b53-fc22-48aa-bfc7-a6986034295e.png)


![スクリーンショット 2025-06-08 18.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/cbd35096-5fea-459e-987c-cb1c1161a5f2.png)

このようにしっかり理解できるように具体的に指示を出す必要があります。
トライアンドエラーを繰り返して、ゲームを作ってみました。


https://drive.google.com/open?id=1Rqa5osjz4dGrRBh20qhtBLYOUSR-6GKB&usp=drive_copy

こちらが実際の完成版になるので是非ご覧ください！
ソースコードも添付しておきます。

https://github.com/okdtks/pitching-game

## 難しかったポイント
今回難しかったポイントは、プロンプトの作成です。
指示を出さないといけないわけですけど、自分が作りたいゲームを如何に言語化するかがポイントになります。今回のハンズオンでもそうですが、どんな仕事をするにしても言語化は大切ですよね。
私も言語化するというところを今後の仕事や人間関係でもしっかり意識してやっていきたいなと思いました。

## 最後に
いかがでしたでしょうか？
初心者の自分でもゲームを作ることができました。
どんなゲームを作って良いかわからない人もいると思いますが、アイディアも一緒に考えてくれるので、是非挑戦してみてください！