OmniAICreator/Qiita-1.07M huggingface dataset:
【自分用】Stable Diffusion プロンプト例: サンプルと表現の違いをチェック【髪型編】

# はじめに

元記事のプロンプトを実際に使用した場合の違いについて、実例で紹介します。

https://qiita.com/comty/items/fb06a2e9f730e3f1617b

この記事では髪型を扱います。

元々の画像はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/47dca83d-c60b-4df2-9105-bfcbd93b4c12.png)

プロンプトはこのようになっています。
```
parameters

best quality, beautiful girl, 18yo, (1girl:1.4), (anime coloring, anime screencap),
(gray eyes:1.4), (blond hair:1.4), realistic eye,
BREAK

bangs,

BREAK
spring park, golden hour, ((pink shirt))
blush, smile, look at viewer, dynamic angle, top of head

Negative prompt: worst quality, low quality, normal quality, messy drawing, bad anatomy, bad hands, mutated hands, (extra_fingers:1.2), extra digit, extra_arms, extra_legs, mosaic censorship, fat, text, (two shot:1.2), (mesh hair)

```

BREAKで囲っている髪型、今回は「bangs（前髪）」となっている部分を変えてみましょう。

| ロングヘアー<br>longhair | ボブカット<br>bob cut | カーリー<br>curlyhair | ポニーテール<br>ponytail | 三つ編み<br>braid |
| ---- | ---- | ---- | ---- | ---- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/a0d03b39-6dfd-4212-a28d-c484ac73eb83.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/47106964-b175-4f76-bdbd-8072984302ec.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/0c8ded32-a94b-4cd6-9e6e-6a5e3c98eee9.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/da5a8ed4-005a-46fa-af75-3b690e20e95f.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/cfd47a84-78a1-4e4c-a769-11b6999d7a7d.png) |
---
髪型を変えてキャラクターのイメージを変えることができます。
髪型のプロンプトにつられて服装やポーズが変わりましたが、本当に固めたい場合は別の手段を使うとして。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/4bcadd20-edfc-41bc-ba1f-8f7fd44cb2d8.png)

```
curlyhair, bangs,
```
このように、カーリーヘアと前髪など、プロンプトを足し算していくこともできます。

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/0340cbcd-8303-4f08-b5a5-d9f49dff7c24.png)

blond hair → red hair に変えるなど、カラーバリエーションも適用できます。

使用するモデルによっては、学習の方向性などで表現できない髪型があったりもしますが、いろいろとチャレンジしてみましょう。

---
# まとめ

多様なシーンに応用できるため、クリエイティブな表現の幅を広げる一助として活用してください。
キャラクターのイメージに合った髪型をプロンプトで指定して、画像生成を楽しんでいきましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/5fd762fd-e3c9-428a-90ed-39b1b1e72cff.png)
個人的備忘録：ハッカソンにおいて、単体テストと結合テストそれぞれの“目的”をちゃんと理解したい

## はじめに
アプリ開発におけるテストは、品質を保ち、バグの発生を防ぐために重要な工程です。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

中でも「単体テスト」と「結合テスト」は基礎的かつ重要なテスト手法として広く用いられています。

## 書こうと思ったきっかけ
受講しているITスクールでハッカソンというチーム開発をしており、どのタイミングでテストをするべきか悩んだことがきっかけになります。

## 単体テスト（ユニットテスト）とは？
単体テストとは、アプリケーションの中で最も小さな単位（関数、メソッド、クラスなど）を対象に、その動作が正しいかどうかを検証するテストです。

主な目的は以下の通りです：
- 各機能が個別に正しく動作するかを確認する
- 不具合の早期発見
- 修正やリファクタリング後の影響範囲を最小限にとどめる

**参考文献**

https://products.sint.co.jp/obpm/blog/unit-test

https://www.intra-mart.jp/im-press/useful/unit_test#:~:text=%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF-,%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E7%B5%84%E3%82%93%E3%81%A0%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%84%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88,%E3%81%A8%E3%81%84%E3%81%86%E6%B5%81%E3%82%8C%E3%81%A7%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

## 結合テストとは？
結合テストは、複数の単体モジュールを連携させたときに、システム全体として正しく機能するかを確認するテストです。

主な目的は以下の通りです：
- モジュール間のやり取りの整合性確認
- 実際の処理の流れを通じた不具合検出
- サブシステムや外部サービスとの連携の確認

**参考文献**

https://service.shiftinc.jp/column/4740/

https://www.skygroup.jp/software/quality/article/03/

## まとめ
単体テストは「部品」が正しく動くかをチェックするのに対し、結合テストは「部品同士がつながったとき」の正しさを検証するためのものです。

:::note warn
**両者を適切に使い分けることで、堅牢で信頼性の高いアプリケーションを開発することが可能になります！**
:::

***今後も理解が追いついていない部分は、自分なりに記事にまとめてアウトプットしていこうと思います！***
Food-101 で料理画像を分類してみたけどダメだった(日記)



##  はじめに

本記事では、101種類の料理画像を含む有名な画像データセット「**Food-101**」を使用し、**PyTorchの事前学習済みモデル（ResNet18）** を用いて料理画像の分類を行います。  
Google Colab を使うことで、GPU環境で簡単に試すことができます。

---

##  使用する技術スタック

| ツール / ライブラリ | 用途 |
|---------------------|------|
| Python              | 実装言語 |
| PyTorch             | 深層学習フレームワーク |
| torchvision         | ResNetなどのモデル提供 |
| Google Colab        | クラウド実行環境（GPU可） |
| Food-101 Dataset    | 101種類の料理画像データセット |

---

##  Food-101とは？

- スイスのチューリッヒ工科大学が提供
- **101種類の料理カテゴリ**
- 各カテゴリに **1000枚の画像（合計101,000枚）**
- データセットは `/images` と `/meta/classes.txt` で構成

---



###  Colabセルで実行するコード

```python
# --- STEP 1: 必要なライブラリのインストール ---
!pip install torchvision --quiet
!pip install torch --quiet
!pip install matplotlib --quiet
!pip install opencv-python --quiet

# --- STEP 2: Food-101 データセットのダウンロード ---
!wget -nc --no-check-certificate http://data.vision.ee.ethz.ch/cvl/food-101.tar.gz
!tar -xzf food-101.tar.gz

# --- STEP 3: モデルと前処理の定義 ---
import torch
import torchvision.transforms as transforms
from torchvision import models
from PIL import Image
import matplotlib.pyplot as plt

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = models.resnet18(pretrained=True)
model.fc = torch.nn.Linear(model.fc.in_features, 101)  # 出力をFood-101の101クラスに変更
model = model.to(device)
model.eval()

transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor()
])

# --- STEP 4: クラスラベルの読み込み ---
with open('food-101/meta/classes.txt', 'r') as f:
    classes = [line.strip() for line in f.readlines()]

# --- STEP 5: 画像をアップロード（手元の画像を使える） ---
from google.colab import files
uploaded = files.upload()
img_path = list(uploaded.keys())[0]

# --- STEP 6: 推論と表示 ---
image = Image.open(img_path).convert("RGB")
input_tensor = transform(image).unsqueeze(0).to(device)

with torch.no_grad():
    output = model(input_tensor)
    predicted_idx = output.argmax(1).item()
    predicted_class = classes[predicted_idx]

print(f"🍽 予測された料理カテゴリ: {predicted_class}")
plt.imshow(image)
plt.axis('off')
plt.title(f"Predicted: {predicted_class}")
plt.show()
```

---

##  実行結果

使った画像
![image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/956de2ef-89c1-47ce-adf1-96d13d183e3a.jpeg)

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/48b4e035-7c29-465c-88db-1e0ce1c02096.png)


要検討
デュエル・マスターズ工学(デドダムの確率)


##  コードの目的

- **40枚デッキ**の中に《デドダム》を4枚入れた構成で、
- 初期7枚（手札5枚＋2ターンドロー）に
  - **デドダム1枚**
  - **水・闇・自然の3文明が1枚ずつある**
- という条件を満たす確率をPythonシミュレーションで試算します。



https://dic.pixiv.net/a/%E5%A4%A9%E7%81%BD%E3%83%87%E3%83%89%E3%83%80%E3%83%A0


##  プログラムコード
```python
import random

# --- デッキ構成の設定 / Define deck composition ---
deck_size = 40              # デッキ枚数 / total number of cards in the deck
trials = 100000             # 試行回数 / number of simulations

deck = (
    ['デドダム'] * 4 +       # デドダム4枚 / 4 copies of Dedodam
    ['水'] * 10 +            # 水文明カード10枚 / 10 water cards
    ['闇'] * 10 +            # 闇文明カード10枚 / 10 darkness cards
    ['自然'] * 10 +          # 自然文明カード10枚 / 10 nature cards
    ['その他'] * (deck_size - 4 - 10 - 10 - 10)  # 残りのカード / others
)

success = 0  # デドダム召喚成功回数 / Count of successful turn-3 Dedodam plays

for _ in range(trials):
    hand = random.sample(deck, 7)  # 初期手札＋2ターンドロー / 7 cards by turn 3
    has_dedodam = 'デドダム' in hand

    # 手札に存在する文明をセットで取得 / Get unique civilizations in hand
    mana_pool = set(card for card in hand if card in ['水', '闇', '自然'])

    # デドダムがあり、3色揃っていれば成功 / Check if Dedodam + 3 colors exist
    if has_dedodam and {'水', '闇', '自然'}.issubset(mana_pool):
        success += 1

# --- 成功確率の表示 / Print success probability ---
prob = success / trials
print(f"3ターン目に《天災 デドダム》を召喚できる確率：{prob:.2%}")
```

---

## 結果例（実行時の出力）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/84f599fe-0c87-4260-9965-cb8a404b5976.png)
物体検出に特化したYOLOv5と顔属性の分析が可能なDeepFaceを組み合わせ


##  はじめに
近年、AIによる画像認識技術は急速に進化しており、顔の検出だけでなく、年齢・性別・感情といった属性までリアルタイムに推定することが可能になってきました。
本記事では、物体検出に特化したYOLOv5と、顔属性の分析が可能なDeepFaceを組み合わせて、画像内の人物を検出し、その顔属性（年齢・性別・感情）を分析・可視化するPythonコードをご紹介します。

Google Colab上で動作するため、ローカル環境に依存せず簡単に実行できます。

##  参考リンクまとめ
https://x.com/miyashin_prg/status/1910894391792914790?s=46


##  Pythonコード


```python
# --- 必要なライブラリをインストール / Install required libraries ---
!git clone https://github.com/ultralytics/yolov5.git
%cd yolov5
%pip install -r requirements.txt
%pip install deepface opencv-python fer

# --- ライブラリ読み込み / Import libraries ---
from deepface import DeepFace
from fer import FER
import torch
import cv2
import pandas as pd
from matplotlib import pyplot as plt
from google.colab import files

# --- モデルロード / Load models ---
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
fer_detector = FER()

# --- Google Colab に画像アップロード / Upload image ---
uploaded = files.upload()
img_path = list(uploaded.keys())[0]
img = cv2.imread(img_path)

# --- 人物検出（YOLOv5）/ Detect "person" class ---
results = model(img_path)
df = results.pandas().xyxy[0]
faces = df[df['name'] == 'person']

# --- 各人物に感情分析を適用（FER＋DeepFace） ---
for i, row in faces.iterrows():
    x1, y1, x2, y2 = map(int, [row['xmin'], row['ymin'], row['xmax'], row['ymax']])
    cropped = img[y1:y2, x1:x2]

    # FERによる感情分析
    fer_result = fer_detector.detect_emotions(cropped)
    fer_emotion = "N/A"
    if fer_result:
        fer_top, fer_score = fer_detector.top_emotion(cropped)
        fer_emotion = f"{fer_top} ({fer_score:.2f})"
    else:
        fer_emotion = "FER: Fail"

    # DeepFaceによる感情分析
    try:
        deep_result = DeepFace.analyze(cropped, actions=['emotion'], enforce_detection=False)
        deep_emotion = deep_result[0]['dominant_emotion']
    except:
        deep_emotion = "DeepFace: Fail"

    # 結果表示（print & 画像に描画）/ Print and draw results
    label = f"FER: {fer_emotion} / DF: {deep_emotion}"
    print(f"Person {i+1}: {label}")
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 128, 255), 2)
    cv2.putText(img, label, (x1, y1 - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# --- 画像表示 / Show annotated image ---
plt.figure(figsize=(12, 8))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.title("Emotion Analysis: FER vs DeepFace")
plt.show()





```
結果

使った画像
![model_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/0bdc3e89-3289-4f01-8b01-d3165293be08.png)

Person 1 emotion: happy


改善の余地あり
絶対音感を育成するwebアプリを作った話

　こんにちは！私はピアノが大好きな文系大学生で、Webエンジニアを目指して日々勉強中です。最近はフロントエンドだけでなく、バックエンドにも興味を持ち始めて、個人開発を通して少しずつ理解を深めています。

　今回紹介するのは、自分の趣味と毎日使いたくなるような要素を組み合わせて開発した「音感ラボ」というWebアプリです。  
　楽しみながら絶対音感を鍛えられることをテーマに、Next.jsやSupabaseなどの技術を活用して作成しました。
## **アプリ概要 - 音感ラボ**

**音感ラボ**は、楽しみながら絶対音感を鍛えることができるWebアプリです。

**デプロイURL**: [https://absolute-pitch-ten.vercel.app/](https://absolute-pitch-ten.vercel.app/)

**リポジトリURL**:→ [https://github.com/tensho1026/absolute-pitch-app](https://github.com/tensho1026/absolute-pitch-app)


---

### **ホーム画面**

こんな感じのデザインで構成されています。

![image](https://github.com/user-attachments/assets/9f8d362b-7987-4901-9b6e-8cfeb7391d41)

---


## **📌 このアプリを作った理由と工夫した点**

絶対音感を確かめるサイトやアプリは他にもいくつか存在していましたが、**他ユーザーのスコアや自分の正解・不正解データを振り返れるような本格的なアプリが他になかった**ため、「あったら良いのでは」と思って制作しました。

実装中は、`useState`で管理する状態が1ページに7つ以上ある場面もあり、`if`文で複雑な条件分岐を行うのが難しく、状態管理や構造に悩みました。また、ホーム画面のデザインはファーストビューとして重要なため、何度も修正してこだわって作成しています。

特に苦労したのは、自己分析ページの**データベース設計**です。音階が全部で12個あるため、正解・不正解のデータをどう構造化するかに悩みました。

このアプリで最もこだわった点は、「各音階に対する自分の正答率を可視化すること」です。これにより、自分の得意な音・苦手な音を認識し、演奏時にその音を意識して聴く・弾くことで、**音階への理解をより深められるように**なることを目指しています。

### **主な機能一覧**

- **ピアノ演奏ページ**：仮想キーボードで自由に演奏できる
- **絶対音感クイズページ**：ランダムな音を聴いて音名を当てる
- **チャレンジモード**：10問の連続クイズでスコアを競う
- **スコアランキング**：他ユーザーと成績を比較できる
- **自己分析ページ**：自分の得意・苦手な音を視覚的に確認できる

---

### **使用技術スタック**

- **フレームワーク**：Next.js, TypeScript  
- **スタイリング**：Tailwind CSS, shadcn/ui  
- **認証管理**：Clerk  
- **データベース**：Supabase  
- **音声処理**：Tone.js  
- **グラフ描画**：Recharts  
- **その他**：framer-motion, lucide-react, react-hot-toast, react-icons  

---

## **各ページの紹介**

### Play Piano  
自由に仮想キーボードを演奏できるページです。音を確かめたり、自主練習に使ったり、耳を慣らすための基礎トレーニングに活用できます。  
![image](https://github.com/user-attachments/assets/f66c2019-4256-4ef6-9374-150b9863baf0)

### Challenge  
ランダムに鳴る音を聴き取って答えるクイズ形式のモードです。正答数に応じてスコアが決まり、集中力と音感が試されます。  
![image](https://github.com/user-attachments/assets/25cd3d11-fedc-49c1-b1c2-5c77cf282656)

### Ranking  
チャレンジモードで獲得したスコアのランキングが表示されます。他のユーザーと自分の成績を比較して、モチベーションを維持できます。  
![image](https://github.com/user-attachments/assets/9167e887-1836-456b-a6ea-511d21e35c2a)

### My Data  
自分がこれまでチャレンジしたクイズの記録を確認できます。正解・不正解の傾向をグラフで視覚的に把握し、得意な音・苦手な音を分析できます。  
![image](https://github.com/user-attachments/assets/b3d7886a-3340-41dd-b7d2-392ea0977536)

### Tech Info（技術紹介ページ）  
このアプリで使われている技術スタックや、技術選定理由をまとめた技術紹介ページです。開発者や技術に興味のある方向け。  
![image](https://github.com/user-attachments/assets/64127fd5-2103-427f-b95d-fd22a7042d50)

---

## **🎯 対象ユーザー**

- **音楽が好きな方！**
- 音感を鍛えたい音楽初心者・中級者
- 音楽教育を行っている先生や指導者
- 絶対音感に興味のあるすべての方

---

## **💻 利用環境について**

本アプリはPCでの使用を前提に設計されています。  
演奏体験や操作性を重視しているため、スマートフォンやタブレットなどのモバイル端末には対応していません。  
今後のアップデートでモバイル対応も検討予定です。

---

## **🛠 今後のアップデート予定**

- モバイル対応（レスポンシブ対応）
- チャレンジモードの難易度選択追加
- 実力に応じた「音感級・音感段」制度の実装（例：初級〜1級、1段〜5段など）
- 練習履歴グラフの可視化

---



## 🙌 最後に

 
　音感ラボは、音楽が好きな人にとって役立つだけでなく、自分自身の成長を“見える化”することを意識して作ったアプリです。
　ここまで読んでいただきありがとうございました！
オンプレミスIBM Power で Ansible Automation Platform と GitLab を連携する

### はじめに

Ansible Automation Platform (AAP) で GitLab を連携し、GitLab 上の Ansible コードを AAP で実行する手順を確認しました。

---

### 環境

・HW: IBM Power10 S1022
　仮想マシン：
　　OS: RHEL 9.4 ppc64le (PU Desired 0.5, VP Max 1, Memory 32GB で設定)
・Ansible Automation Platform 2.5.9 (1 ノード構成)

<br>

GitLab は以下で作成した別のサーバーです。

https://qiita.com/c_u/items/f6c1ccf31151508e9fa4




---

### 認証情報の作成

認証情報

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/f9973dd9-9216-4661-ad9f-e6dd03eb2f14.png)

認証情報タイプは"Source Control" を指定しています。

認証情報タイプに "GitLab Access Token" の選択もありましたが、後の設定で問題が発生したため、ユーザー・パスワード設定としています。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/63a89f93-e18d-4e16-b5ca-6f94d1731255.png)


GitLab という名前の認証情報を作成しました。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/fccf9b16-8c08-4222-bcb1-e24215235324.png)


---

### GitLab をソースとするプロジェクトの作成

プロジェクトの作成で以下を選択します。
**名前** : <プロジェクト名>
**組織** ： <対象の組織> 
**ソースコントロールのタイプ** ： **Git** 
**ソースコントロールのURL** ：　**http://xxx.xxx.xxx.xxx:xxx/xxx.git**
***ソースコントロール認証情報** : **GitLab**  (作成した認証情報を指定) 


その他は指定せず、作成を押します。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/4de396a3-8619-4d63-b462-7e94f4e9a1d5.png)

* "GitLab Access Token" を指定した認証情報は選択肢に表示されなかったため、"ソースコントロール" タイプを使用しています。

---
### 対象のプロジェクトを使用したジョブテンプレートの作成


ジョブテンプレートの作成で以下を選択します。
**名前** : <テンプレート名>
**プロジェクト名** ： <対象のプロジェクト> 
**playbook** ： **<Gitにあるplaybookが自動的に選択肢に表示されました>** 





![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/0b2fa331-3b95-41fd-8884-f4ce1ef62568.png)

<br>

----

### ジョブテンプレートの実行

作成したジョブテンプレートを実行します。

正常に稼働しました。

![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/afd6d669-7220-49c6-b42c-69282aaaaf5f.png)

<br>

### おわりに

GitLab Access Token 認証情報を指定した設定方法は今後(時間があれば)確認する予定です。

→(後日追記) Source Control 指定で任意のユーザー(適当な文字列)を指定し、パスワードに token を入れるとちゃんと動くことが確認できました。


### 参考

**マニュアル**

・[認証情報タイプ](https://docs.redhat.com/ja/documentation/red_hat_ansible_automation_platform/2.4/html/automation_controller_user_guide/ref-controller-credential-types#ref-controller-credential-types)


・[Source Control](https://docs.ansible.com/automation-controller/4.1.1/html_ja/userguide/credentials.html#source-control)


>SCM (ソースコントロール) 認証情報は、ローカルソースコードのリポジトリーを、Git、Subversion などのリモートのリビジョンコントロールシステムからクローン作成したり、更新したりするためにプロジェクトで使用されます。


・[ソースコントロールを使用した Playbook の管理](https://docs.redhat.com/ja/documentation/red_hat_ansible_automation_platform/2.4/html/automation_controller_user_guide/controller-projects#ref-projects-manage-playbooks-with-source-control)

<br><br>


**AAP 設定参考ログ**

https://qiita.com/c_u/items/a30ae82ac749a3581af0

https://qiita.com/c_u/items/1dbea6fe42411f5438e5

https://qiita.com/c_u/items/492b615bb47a7bb04c54

<br><br>


以上です。
clauddeのティファクトの活用して仕様書を作成した話



# clauddeのティファクトの活用方法

## 自己紹介
私は、20年以上、Web系のシステム開発に従事してきたエンジニアです。主に、ColdFusionやPHPを使用したWebアプリケーションの開発を行ってきました。最近では、ReactやTypeScriptを使用したフロントエンド開発にも力を入れています。
最近のAI技術の進化により、開発効率が大幅に向上しました。特に、clauddeのティファクトは、私の開発スタイルを大きく変えるものでした。以下に、私がclauddeのティファクトをどのように活用しているかを紹介します。

## 想定場面
企業管理システムの企業検索画面の仕様書を作成する際に、clauddeのティファクトを活用することを想定しています。
以下は、clauddeのティファクトを使用して作成した企業検索画面の例です。

### 1.アバウトに作成
````
React +  Tailwind CSS + shadcn/uiで作成された企業管理システムの企業検索画面をアーティファクト表示
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270948/b804c347-fbaf-46ea-b58c-4e4b23997160.png)

### 2.アバウトに作成したものをclauddeのティファクトを表示されるので修正点を伝える
````
検索結果に担当者を追加してください
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270948/edb70c29-de84-433a-9b9c-1842475e0450.png)

### 仕様書の作成
要件定義と画面設計書を作成し、レビュー、更新を行います。
````
この画面の要件定義と画面設計書を作成
````

3つを実行することで、clauddeのティファクトを活用して、実際の画面を見ながら企業検索画面の要件定義と画面設計書を作成することができます。

## 活用方法
- チームやクライアントと行えば、イメージの共有、要件の確認、フィードバックを１度に行えるかもしれません。
  
## まとめ
- clauddeのティファクトは、私の開発スタイルを大きく変えるものでした。
- 実際の画面を見ながら、指示ができるので、超便利＆超早いです。
- 作成した要件定義書や画面設計書は、保存しておくことで、再利用も可能です。
- AIは優秀だが、自分でレビューを行うことが重要です。最近、xで[AIがやりました]という投稿を見かけますが、AIはあくまで補助的な役割であり、最終的な判断は人間が行うべきです。
- よりいいパートナーになれるようにしていくことが大切だと思います。
Risa/Asirのインストール

# ここでインストールするもの

タイトル見たらわかると思いますが，$\texttt{Risa/Asir}$です．

https://www.math.kobe-u.ac.jp/Asir/asir-ja.html

## 下準備
いくつかインストールしておかなければならないようなのでしておきます．

```bash
$ sudo apt install automake bison libxt-dev libxaw7-dev
```

## ソースのダウンロード

https://www.math.kobe-u.ac.jp/pub/OpenXM/head/

上記のサイトからダウンロードして，解凍します．

```bash
# ダウンロード
$ wget https://www.math.kobe-u.ac.jp/pub/OpenXM/head/openxm-head.tar.gz

# 解凍
$ tar -zxvf openxm-head.tar.gz
```

## インストール

``make``するときに，色々とファイルをダウンロードしているので，インターネットに接続されている必要があります．

```bash
$ cd OpenXM/src
OpenXM/src$ make install

OpenXM/src$ cd ../rc
OpenXM/rc$ make install
```

インストールに成功していれば``asir``コマンドで起動できるかと思います．

```bash: Risa/Asirの起動
$ asir
This is Risa/Asir, full GMP Version 20220328 (Kobe Distribution).
Copyright (C) 1994-2000, all rights reserved, FUJITSU LABORATORIES LIMITED.
Copyright 2000-2021, Risa/Asir committers, http://www.openxm.org/.
GC 7.6.12 copyright 1988-2018, H-J. Boehm, A. J. Demers, Xerox, SGI, HP, I. Maidanski.
Debug windows of ox servers will not be opened. Set Xm_noX=0 to open it.
OpenXM/Risa/Asir-Contrib $Revision: 1.168 $ (20220114), Copyright 2000-2021, OpenXM.org committers
helph(); [html help], ox_help(0); ox_help("keyword"); ox_grep("keyword");
     for help messages (unix version only).
http://www.math.kobe-u.ac.jp/OpenXM/Current/doc/index-doc.html
load : "nn_ndbf.rr" not found in the search path
return to toplevel
[1029]
```

## 実行してみる

とりあえず``hello world``してみます．``asir``コマンドで$\texttt{Risa/Asir}$を起動したら，``print("hello, world!")``でプリントできます．
```bash
$ asir
This is Risa/Asir, full GMP Version 20220328 (Kobe Distribution).
Copyright (C) 1994-2000, all rights reserved, FUJITSU LABORATORIES LIMITED.
Copyright 2000-2021, Risa/Asir committers, http://www.openxm.org/.
GC 7.6.12 copyright 1988-2018, H-J. Boehm, A. J. Demers, Xerox, SGI, HP, I. Maidanski.
Debug windows of ox servers will not be opened. Set Xm_noX=0 to open it.
OpenXM/Risa/Asir-Contrib $Revision: 1.168 $ (20220114), Copyright 2000-2021, OpenXM.org committers
helph(); [html help], ox_help(0); ox_help("keyword"); ox_grep("keyword");
     for help messages (unix version only).
http://www.math.kobe-u.ac.jp/OpenXM/Current/doc/index-doc.html
load : "nn_ndbf.rr" not found in the search path
return to toplevel
[1029] print("hello, world!");
hello, world!
0
```
正常に動いてるらしい．``load``関数を使うとソースを読み込むことができるので，``hello, world``するだけのソース``hello.rr``を実行してみます．

因みに，``hello.rr``の中身は以下の様になっています．

```py: hello.rr
print("hello, world!");

end$
```

```bash
[1030] load("hello.rr");
hello, world!
0
```

ちゃんとできた．

# Colabにおいておいた

Colab上で$\texttt{Risa/Asir}$をインストールできるものを作っておいたので，Ubuntuとかがない人はここでもできます．ただ，インストールには20分強かかりますので，急ぎの人はやめた方が良いです（毎回毎回インストールしなおす必要があるから）．

https://colab.research.google.com/drive/1oua11697LDd18x7cJ781W4adsdY4tQph?usp=sharing

# 参考にしたもの

https://zenn.dev/toru3/articles/e8d70493e84d3f

https://www.math.kobe-u.ac.jp/OpenXM/Current/install-ja.txt
[Linux][command] ディレクトリ・ファイル管理_表示_ls, stat, less, more, file

# lsコマンド
~~~terminal
$ ls [オプション] ファイル名
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | list | - 指定したファイルやディレクトリを一覧表示 |
| `-a` | all | - 隠しファイル（`.`で始まるファイル）を含め、すべてのファイルを表示 |
| `-d` | directory | - ディレクトリ**のみ**を表示<br>（例：`ls -d /etc`） |
| `-i` | inode | - 各ファイルのinode番号を表示 |
| `-l` | long format | - 詳細情報を表示<br>（パーミッション、所有者、サイズ、更新日時など） |
| `-F` | file type | - 各ファイルの種類を表示<br>（末尾に`/`：ディレクトリ、`*`：実行可能ファイルなど) |
| `-R` | recursive | - サブディレクトリも含めて**再帰的に**内容を表示 |


# statコマンド  
~~~terminal  
$ stat [オプション] ファイル名  
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | status | - 詳細情報を表示<br>（サイズ、タイムスタンプ、パーミッション、inode番号など） |
| `-t` | terse | - 簡潔形式で情報を表示（スクリプト向け） |


# lessコマンド
~~~terminal
$ less [オプション] ファイル名
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | less | - ファイルの内容を**ページ単位**で表示（双方向スクロール可）<br>- `/` で検索、`↑` `↓` `PgUp` `PgDn` で移動可能 |
| `-N` | number | - 各行の行番号を表示する |
| `+F` | follow | - `tail -f` のように、ファイルの更新をリアルタイムに追跡表示 |
| `-S` | chop long lines | - 長い行を折り返さずに右にスクロールして表示する |

# fileコマンド
~~~terminal:
$ file [オプション] ファイル名
~~~

|オプション|由来|説明|
|:--|:--|:--|
| default | なし | - 指定されたファイルの種類（テキストファイル、バイナリファイルなど）を表示する |
| `-i` | mime-type | - MIMEタイプ（ファイルの種類）を表示する |
| `-b` | brief | - ファイルタイプの出力を簡潔に表示（ファイル名を除く） |
| `-f` | file list | - 指定したファイルリストから、複数のファイルのタイプを調べて出力する |
| `-z` | compressed | - 圧縮されたファイルも展開してタイプを表示する |
| `-m` | magic file | - 特定のマジックファイルを使用してファイルタイプを判定する |

# Ping-t

ls
- [3144_ls](https://mondai.ping-t.com/question_subjects/31/question_sessions/31541108/progressing_questions/483298467)
- [3146_ls -F](https://mondai.ping-t.com/question_subjects/31/question_sessions/31969785/progressing_questions/489837017)
- [3147_ls -dl](https://mondai.ping-t.com/question_subjects/31/question_sessions/31916304/progressing_questions/489057810)
- [3149_ls -i](https://mondai.ping-t.com/question_subjects/31/question_sessions/31223415/progressing_questions/478442917)

stat
- [3363_stat](https://mondai.ping-t.com/question_subjects/31/question_sessions/32200924/progressing_questions/493334504)

less, more
- [3082_less, more](https://mondai.ping-t.com/question_subjects/31/question_sessions/31916304/progressing_questions/489057819)

file
- [3171_file](https://mondai.ping-t.com/question_subjects/31/question_sessions/31969785/progressing_questions/489837027)
Rocket Visual COBOL Personal Editionを使う

# はじめに
https://qiita.com/etoootak/items/15c8384e30144f074f8b
の続きです。
Rocket Visual COBOL Personal EditionをWindows11にインストールして使ってみます。

# ダウンロード
https://www.rocketsoftware.com/en-us/products/cobol/visual-cobol-personal-edition
ここからダウンロードの申請をします。

![01_download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/b2e8d268-adf0-468c-ad1c-51005ddf981f.jpeg)
「Download now」を押して、必要な事項を入力します。

![02_download_re![07_menyu_bar.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/ea2864a5-6532-4e6e-92cd-2aa11877603e.jpeg)
gist.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/21418290-46e3-40c0-a7d6-d55458e5d0f6.jpeg)

しばらくするとメールが届きます。
そのメールの「Start Your Free Trial Now」を押すとダウンロードが始まります。

Visual COBOL for Visual Studio Personal Edition 10.0.zip
がダウンロードできたら解凍します。
![04_install_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/ac0e63e7-834a-4362-b727-c600afee916e.jpeg)

# インストール
展開した中のvcvs2022_100.exeをインストールします。
![05_install_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/078c5b15-3720-40ec-b586-a3458700549e.jpeg)

インストールが完了したらスタートメニューからライセンス管理システムを起動します。
![06_install_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/50779c23-46b9-4664-89ee-eef9601494bf.jpeg)

![07_menyu_bar.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/2004ea9a-760c-4d6b-a0c8-facc4e5bdf2b.jpeg)

ダウンロードしたzipの中に入っているxmlファイルをライセンス管理システムに追加します。
![08_lisence_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/90bbdaa9-be4d-4913-b8e1-cb59cb13120e.jpeg)
※xmlファイルを指定し「ライセンスをインストール」を押す。

ライセンスが登録されればOKです。
![09_lisence_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/15041fd4-e79d-4dc4-9305-0b7a8354ff25.jpeg)

# 使ってみる
COBOLの使い方はMicroFocus時代と同じです。
Visual StudioでCOBOLのプロジェクトを作ってもいいし、コマンドラインからCOBOLソースをコンパイルしてもいいです。
また、ライセンスの期間が次の年の最後までになっているようです。以前より長いです。
それにライセンスファイルがダウンロードしたzipファイルの中に最初から入っているなど、MicroFocus時代よりも手順が楽になっていますね。

これで、いろいろCOBOLで遊べます。Happy COBOL Coding！！
![10_happy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/7ffa6686-9035-49c4-a100-a07b237f27b1.jpeg)
A5:SQLでテーブル定義書を自動生成する方法

A5:SQLというソフトを使用してテーブル定義書を自動生成する方法です。
※Windowsのみ対応

A5:SQL起動後、テーブル定義書を作成したいDBに接続するためにメニューからデータベース→データベースの追加と削除と進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/067d5e83-e43e-486b-9b51-874bef42dc96.png)
 
下記のようなウィンドウが表示されるので、左下の「追加」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/a7abb87a-d839-4668-a52f-3f994283f20a.png)
 
接続したいDBを選択します。今回は「MySQL／MariaDB(直接接続)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/95465f90-744e-4cf9-acd5-ee9c0b051674.png)
 
接続するDBのホスト名やユーザーIDなどを入力します。「テスト接続」をクリックして「接続に成功しました。」と表示されれば接続成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/b40a7283-07f6-4273-800f-6191fb930416.png)
 
テスト接続が成功したらDBの情報を保存します。
「OK」をクリックすると下記のようなウィンドウが表示されるので、自分がわかりやすい名前を入力して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/281bc5f7-0366-435e-8626-3a3dccc3902d.png)
 
「閉じる」をクリックしてDBの追加を終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/a988c582-542b-4a88-9d45-ba42465e459d.png)
 
元の画面に戻ると左のツリーに先ほど追加したDBが表示されています。
追加したDBを選択して(下記の例では「test」)右クリック→データベースを開くと進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/ddeaa285-2114-4920-a2dd-688689cd1190.png
 
「接続」をクリックするとDBに接続出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/f8c3fe0d-5a9f-4790-9502-84ec6789243c.png)
 
DBに接続出来たらメニューからデータベース > テーブル定義書作成と進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/892bc356-acc4-44d6-8d08-552ddc73b8c6.png)
 
テーブル定義書を作成したいテーブルを選択し、「テーブル定義書作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/d05ed462-85b3-41ed-bd0d-f7c04e902790.png)

しばらく待っていると下記のようにExcelでテーブル定義書が作成されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/8e94d39c-6100-4f29-9d98-1742ca2a7d85.png)
【用語解説】エンクロージャーとは

### エンクロージャー（enclosure）とは

:::note info
そもそもの意味：囲い、筐体などの意味を持つ英単語、it系の分野では機械製品（サーバーなど）の外装、筐体、ケース部分を指す。
:::

一般的にはケース、筐体と呼ぶ事のほうが多いらしい。
エンクロージャーと呼ぶ場合は、形状が箱型とは限らない場合や、単に本体を覆って部品を組み付ける以外の積極的な機能上の役割がある場合、筐体が独立していて中身を複数・多数収納出来るような構成になっている場合が多いらしい。

一般的にスピーカーの筐体のことをエンクロージャーと呼ぶ。
しかし、IT系の分野では、内部に独立した装置を複数設置して仕様するストレージ製品やブレードサーバーの用例が有名である。

:::note info
ブレードサーバーってなんだよって人。
→　一枚の電子基板にメモリーやCPUなどのコンピューターに必要な要素を実装し、小型の筐体に搭載したサーバーの集合体らしい。
https://business.ntt-west.co.jp/glossary/words-00260.html

:::


### 参考文献（2025年4月12日）

https://ewords.jp/w/%E3%82%A8%E3%83%B3%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3.html#:~:text=%E3%82%A8%E3%83%B3%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%20%E3%80%90enclosure%E3%80%91&text=%E3%82%A8%E3%83%B3%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%EF%BC%88enclosure%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81,%E4%BD%93%E3%80%81%E3%82%B1%E3%83%BC%E3%82%B9%E9%83%A8%E5%88%86%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82
Docker compose 簡易操作チートシート

# よく使うdocker composeコマンド
これらのコマンドはdocker-compose.ymlのある階層で実行してください
- Dockerコンテナを作成
```
docker compose up -d
```
- Dockerコンテナを削除(停止)
```
docker compose down
```
- dockerコンテナの再スタート
```
docker compose restart
```
- Docekrコンテナの監視
```
docker compose logs -f
```
- Dockerコンテナの状態を確認
```
docker compose ps
```

# トラブルシューティング
- Dockerfileなどを変更しても適用されない
→以下のコマンドで再ビルドしてコンテナを立てる
```
docker compose up -d --build
```
- コンテナを実行したが接続できない
→上に書いてあるDockerコンテナの状態を確認しても何も表示されていないならばエラーでDockerコンテナが正しく起動できていないのでDockerfileやdocker-compose.ymlを見直しデバッグする
Google Colabで日本語対応する

## はじめに
Google Colabを利用するとグラフにタイトルを出した場合、文字化けします。
なかなか解決方法が書いてなかったので、書いておきます。

## 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/06c6c7e3-0c04-4faa-9818-f44b216f2103.png)


```py
!apt-get -y install fonts-ipafont-gothic
!pip install japanize-matplotlib
import japanize_matplotlib
import matplotlib.pyplot as plt

# 場合によっては必要
plt.rcParams['font.family'] = 'IPAPGothic'
japanize_matplotlib.japanize()

# グラフを描いて日本語確認
plt.figure(figsize=(6, 4))
plt.plot([60, 70, 80], [1, 2, 3])
plt.title("数学の点数推移")  # 日本語が出るかチェック
plt.xlabel("点数")
plt.ylabel("回数")
plt.grid(True)
plt.show()
```
#0104（2025/04/12）AWS SAM（Serverless Application Model）ガイド

# AWS SAM（Serverless Application Model）ガイド

AWS SAM（Serverless Application Model）は、サーバーレスアプリケーションを簡単に構築・デプロイ・管理するためのAWS公式フレームワークです。この記事では、SAMの概要から使い方、利点、CLIコマンドなどを詳しく解説します。

---

## 📌 SAMとは何か？

| 項目 | 内容 |
|------|------|
| 名称 | AWS Serverless Application Model (SAM) |
| 提供元 | Amazon Web Services（AWS公式） |
| 目的 | サーバーレスアプリケーションの簡易構築と運用 |
| 基盤 | AWS CloudFormation（インフラ構成のIaC） |
| 特徴 | CloudFormationの簡略版テンプレート記法を使える / ローカル開発が容易 / デプロイが高速 |

SAMはCloudFormationの拡張であり、`template.yaml` を使ってLambda、API Gateway、DynamoDBなどのリソースを宣言的に定義・管理します。

---

## 🧱 SAMのアーキテクチャと構成要素

SAMで定義可能な主要リソース：

- `AWS::Serverless::Function`：Lambda関数
- `AWS::Serverless::Api`：API Gateway
- `AWS::Serverless::SimpleTable`：DynamoDB
- `AWS::Serverless::LayerVersion`：Lambdaレイヤー

SAMテンプレートはYAML形式で記述され、CloudFormationに変換されてデプロイされます。

---

## 🧰 SAM CLI とは？

SAM CLIはSAMアプリケーションのローカルビルド・テスト・デプロイなどを簡単に行えるコマンドラインツールです。

### 主要なコマンド一覧

| コマンド | 説明 |
|----------|------|
| `sam init` | プロジェクトの初期化（テンプレート生成） |
| `sam build` | Lambda関数などをビルド（依存のインストール含む） |
| `sam local invoke` | ローカルで関数をテスト（Docker使用） |
| `sam local start-api` | ローカルでAPI Gatewayを模擬起動（REST API） |
| `sam deploy --guided` | 初回デプロイ（スタック名などを対話式で設定） |
| `sam logs` | CloudWatchログをCLIから取得 |
| `sam delete` | deploy削除 |

---

## 🐳 SAMとDockerの関係

SAM CLIは、Lambdaの実行環境をローカルで再現するためにDockerを利用します。これにより、本番に近い環境で関数をテストできます。

```bash
sam local invoke        # ローカルで1回実行
sam local start-api     # ローカルでHTTPサーバー起動
```


---

## 📂 SAM プロジェクト構成例

```
sam-app/
├── template.yaml          # SAMテンプレート
├── hello_world/
│   ├── app.py             # Lambda関数コード
│   └── requirements.txt   # Python依存（pip）
├── events/                # テストイベント（任意）
└── .aws-sam/              # ビルド成果物（自動生成）
```

---

## ✨ SAMのメリット

- YAMLによる簡易テンプレートでサーバーレス開発が高速に
- CloudFormationベースなのでIaCのベストプラクティスに対応
- Dockerを使って本番に近い環境でローカルテスト可能
- CLIでビルド・デプロイ・ログ確認が一括でできる


---

## 🔗 公式リソース

- [SAM 公式ドキュメント](https://docs.aws.amazon.com/serverless-application-model/)
- [GitHub: aws/aws-sam-cli](https://github.com/aws/aws-sam-cli)
複素数平面「(その4/4)【1問多解】2025年 京都大(理系) 複素数の絶対値の最大・最小」様ををAI先生へ、5通りで解いて下さい。

・回答省略
・???深入りはしていません。
　あっているような、あっていないような。

:::note info
[(その1/4) sympyで](https://qiita.com/mrrclb48z/items/af2e0208b8ef1b8a92a5)
[(その2/4) AI先生へ丸投げ](https://qiita.com/mrrclb48z/items/43f7e7e76c63a100025e)
[(その3/4) AI先生へxy平面へ書き換え](https://qiita.com/mrrclb48z/items/7116ef1032b91886e749)
(その4/4) 本ページ
:::
```
下記の複素数平面の問題文を5通りで解いて下さい。
<div class="qbody">
<p class="slevel"><a name="q-0101" 
id="q-0101"></a><span 
class="qnum">【１】</span>　次の各問に答えよ．</p>
<a name="s-0101" id="s-0101"></a><p class="s1level"><span 
class="shomon1">問１</span>　<math>
<mi>i</mi><mspace width=".2em"></mspace>
</math>は虚数単位とする．複素数<math>
<mspace width=".2em"></mspace><mi>z</mi><mspace width=".2em"></mspace>
</math>が，絶対値が<math>
<mspace width=".2em"></mspace><mn>2</mn><mspace width=".2em"></mspace>
</math>である複素数全体を動くとき，<math>
<mrow><mo rspace=".2em">|</mo><mi>z</mi>
<mo>−</mo><mstyle displaystyle="true"><mfrac><mi>i</mi><mi>z</mi>
</mfrac></mstyle><mo lspace=".2em" rspace=".2em">|</mo></mrow>
</math>の最大値と最小値を求めよ．
</p>
```
# (本日の)ChatGPT先生へ

>【解法1：三角関数表示による計算】
【解法2：z と 1/z の性質を利用（代数的に）】 ←不自然なので別の方法へ
【解法3：実部・虚部に分けて（幾何的に）】 いや、また混乱する… →極形式で整理
【解法4：極形式で整理（再）】
【解法5：定義に忠実に計算（決定版）】

決定版だそうです。


# Gemini先生へ
>解法1：極形式を利用する
解法2：三角不等式を利用する
解法3：zをa+biとおく
解法4：幾何学的に考える
解法5：コーシー・シュワルツの不等式を利用する

以下のまとめがありました。

>まとめ（5通りの解法）
解法	内容	備考
1	三角関数で変形	途中混乱あり
2	代数的に (	z
3	実部・虚部で処理	途中計算誤りあり
4	極形式での整理	有効だが混乱しやすい
5	極形式＋実部虚部に分けて処理	最も明確・正確


# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。

#### Qiita内
アーキテクチャについて

## はじめに
iOSアプリ開発を進めていく中で、色々なアーキテクチャがあることを知ったので、備忘録として代表的なものをまとめました。

## 開発におけるアーキテクチャとは
アーキテクチャとは、「システム全体の設計や構造」のことを指します。
簡単にいうと、「アプリやシステムをどのような仕組みで作るか」という設計のルールです。

## なぜアーキテクチャが重要なのか
✅ コードが整理され、わかりやすくなる
✅ 機能追加や修正がしやすくなる
✅ チーム開発がスムーズに進む

アーキテクチャがしっかりしていないと、コードがぐちゃぐちゃになり、バグが増えたり、修正が大変になったりします。

## アーキテクチャの具体例
アプリ開発では、以下のような代表的なアーキテクチャがあります。

### 1. MVC（Model-View-Controller）
🔹 Model（データの処理）
🔹 View（画面の表示）
🔹 Controller（画面の操作やデータの橋渡し）

👉 iOSアプリ開発で標準的に使われるが、Controllerに処理が集中して肥大化しやすい。

### 2. MVVM（Model-View-ViewModel）
🔹 Model（データの処理）
🔹 View（画面の表示）
🔹 ViewModel（データと画面をつなぐ）

👉 SwiftUIではMVVMが推奨されることが多く、Viewとロジックを分けやすいのが特徴。

### 3. クリーンアーキテクチャ
🔹 データの処理、ビジネスロジック、UIを明確に分離
🔹 コードが整理され、大規模開発に向いている
🔹 学習コストが高め

👉 複雑なアプリやチーム開発でよく使われる。

## まとめ
アーキテクチャとは、「アプリやシステムをどのような仕組みで作るか」という設計のルールのこと。
アプリ開発では、代表的なアーキテクチャとして**MVC**、**MVVM**、**クリーンアーキテクチャ**などがある。
Unity Install package from tarball用のパッケージを作成する

# はじめに

UnityPackageManagerや、UnityPackageでパッケージを読み込むのが今となっては主流ですが、たまにtarballで管理したいことがあります。
そのたびにtar.gzどう作るか忘れてしまうので、まとめたいと思いました。

# 環境
MacOS

# 新規追加手順

## パッケージの準備

パッケージにしたいアセットやスクリプトを一つのディレクトリにまとめて、直下にpackage.jsonを配置します。
あと、必要に応じてアセンブリディフィニションを追加します。

```package.json
{
  "name": "com.my.package",
  "displayName": "MyPackage",
  "version": "1.0.0",
  "unity": "2021.3",
  "description": "This is my package",
  "author": {
    "name": "MyName"
  }
}
```

ディレクトリ構成はこんな感じで参考程度に

```
MyPackage/
├── Editor/
│   └── Scripts/
│   └── MyPackage.Editor.asmdef
├── Runtime/
│   └── Scripts/
│   └── MyPackage.asmdef
├── package.json
```

## デスクトップなど適当なところにディレクトリをコピー

適当な場所にMyPackage/をコピーして、package/にリネームします。

:::note warn
ディレクトリ名がpackageでないと、読み込み失敗します
:::

## コマンドで圧縮

```
tar -czvf com.my.package-1.0.0.tar.gz package/
```

**※./package/のように指定すると、読み込めなくなるので上記の形で指定してください**

## プロジェクトにtar.gzを配置する

Assetsディレクトリ外に、任意のディレクトリを作るかPackagesの中にtar.gzを配置します。

## PackageManagerで読み込む

PackageManagerのInstall package from tarball...で、上の手順で追加したtar.gzを指定して読み込みます。

## Packages/manifest.jsonを編集

PackageManagerで読み込むと絶対パスになっているので、Assetsからの相対パスに変更します。
Packages/にtar.gzを追加したときの例です。

```diff
- "com.my.package": "file:/Users/MyName/WorkDir/MyProject/Packages/com.my.package-1.0.0.tar.gz",
+ "com.my.package": "file:../Packages/com.my.package-1.0.0.tar.gz",
```

# 更新手順

バージョン名を変更して圧縮し、

```
tar -czvf com.my.package-1.1.0.tar.gz package/
```

バージョン部分を変更すればOKです。

```diff
- "com.my.package": "file:../Packages/com.my.package-1.0.0.tar.gz",
+ "com.my.package": "file:../Packages/com.my.package-1.1.0.tar.gz",
```

バージョン名なしで、tar.gzを上書きでも大丈夫ですが、バージョン見えていたほうが管理しやすいと思います。
#0103（2025/04/12）AWS Lambda(SAM) +  API Gateway で Gmail通知

# AWS Lambda + SAM + Docker + API Gateway で Gmail通知

この記事では、AWSを利用して、外部からのHTTPリクエストを受け取り、その内容をGmailで送信するシステムの構築方法を解説します。

## 📌 構成と役割

構成図：

```
[ローカルPC(curl)]
     ↓
[API Gateway]
     ↓
[AWS Lambda（Python）]
     ↓
[Gmail送信（SMTP）]
```

各技術の役割：

- **SAM（Serverless Application Model）**
  - LambdaやAPI Gatewayの構築・管理を簡単に行うCLIツール

- **Lambda**
  - サーバーレス関数を実行するAWSサービス

- **Docker**
  - Lambdaと同じ環境をローカルで再現してテストできる

- **API Gateway**
  - Lambda関数をHTTP経由で呼び出すための入り口

- **Gmail (SMTP)**
  - メール送信の仕組み

## 📌 構築＆デプロイ手順

### ① AWS CLI, SAM CLI インストール

```bash
brew install awscli aws-sam-cli
```

### ② AWS CLI 設定

```bash
aws configure
```

### ③ SAMでプロジェクト作成

```bash
sam init
```

- Package type: Zip
- Runtime: Python3.11
- Template: Hello World Example

### ④ Lambdaコードとtemplate.yamlを修正

`app.py`
```python
import json, smtplib
from email.mime.text import MIMEText
import os

def lambda_handler(event, context):
    body = json.loads(event.get("body", "{}"))
    to = body.get("to", "youraddress@gmail.com")
    message_body = body.get("body", "メッセージがありません")

    smtp_server = "smtp.gmail.com"
    smtp_port = 587
    sender_email = os.environ["GMAIL_USER"]
    sender_pass = os.environ["GMAIL_PASS"]

    msg = MIMEText(message_body)
    msg["Subject"] = "Lambdaからの通知"
    msg["From"] = sender_email
    msg["To"] = to

    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender_email, sender_pass)
        server.sendmail(sender_email, to, msg.as_string())
        server.quit()
        return {"statusCode":200,"body":json.dumps({"result":"送信成功！"}, ensure_ascii=False)}
    except Exception as e:
        return {"statusCode":500,"body":json.dumps({"error":str(e)})}
```

`template.yaml`
```yaml
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.11
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: POST
      Environment:
        Variables:
          GMAIL_USER: youraddress@gmail.com
          GMAIL_PASS: xxxxxxx
```

### ⑤ Gmailアプリパスワード取得

- Googleアカウント → 2段階認証有効化
- 「アプリパスワード」を生成し、`template.yaml`に設定

### ⑥ ビルド＆デプロイ

```bash
sam build
sam deploy --guided
```

### ⑦ API動作テスト

```bash
curl -X POST https://YOUR_API_URL/Prod/hello \
  -H "Content-Type: application/json" \
  -d '{"to":"test@example.com", "body":"テストメールです！"}'
```
【React】useNavigateでのページ遷移がJestでうまくテストできない


React と Jest を用いた開発中にちょっと詰まってしまったため、記録を残します。

## 状況

API に Post を実行後にホーム画面に戻る簡単な処理に単体テストを作成していました。ブラウザ上で動かすと問題なくページ遷移できているのに Jest 上では失敗していました。

その時のテストコード(必要なところのみ抜粋)

```tsx
jest.mock("react-router-dom", () => ({
  useNavigate: jest.fn(),
}));

describe("AddBizCard", () => {
  const navigate = jest.fn();

  it("should render home after submit", async () => {
    const response: User = {
      id: 1,
      userName: "testUser",
    };

    mockedAxios.post.mockResolvedValueOnce({ data: response });
    render(
      <MemoryRouter>
        <ChakraProvider value={defaultSystem}>
          <AddCard />
        </ChakraProvider>
      </MemoryRouter>
    );

    userEvent.type(screen.getByLabelText("ユーザ名"), testUserData.userName);
    const registrarButton = screen.getByTestId("submit-button");

    userEvent.click(registrarButton);

    expect(navigate).toHaveBeenCalledWith("/home"); // この行で失敗
  });
});
```

## 原因 ①

`react-router-dom`をモックする際に`useNavigate`しかモックしていなかったため、その他の機能が使用できていなかった。

## 原因 ②

適切に待機していなかったため、ページ遷移が発生する前に Jest によるチェックを実行していた。

## 修正

```diff_tsx
jest.mock("react-router-dom", () => ({
+ ...jest.requireActual("react-router-dom"),
  useNavigate: jest.fn(),
}));

describe("AddBizCard", () => {
  const navigate = jest.fn();

  it("should render home after submit", async () => {
    const response: User = {
      id: 1,
      userName: "testUser",
    };

    mockedAxios.post.mockResolvedValueOnce({ data: response });
    render(
      <MemoryRouter>
        <ChakraProvider value={defaultSystem}>
          <AddCard />
        </ChakraProvider>
      </MemoryRouter>
    );

-   userEvent.type(screen.getByLabelText("ユーザ名"), testUserData.userName);
+   await userEvent.type(
+     screen.getByLabelText("ユーザ名"),
+     testUserData.userName
+   );

    const registrarButton = screen.getByTestId("submit-button");

-   userEvent.click(registrarButton);
+   await userEvent.click(submitButton);

-   expect(navigate).toHaveBeenCalledWith("/home"); // この行で失敗
+   await waitFor(() => {
+     expect(navigate).toHaveBeenCalledWith("/home");
+   });
  });
});
```

`react-router-dom`のモックについて必要な部分のみモックして、それ以外の部分はそのまま使用する設定に変更しました。

また各入力段階において Wait を追加しました。

## おわりに

記事にまとめてみると大したことは書いてないですが、作業時は結構詰まりました。

この記事が皆様のコーディングライフの助けになれば幸いです。
MySQL WorkbenchでCSVのエクスポートとインポートする方法

## CSVのエクスポート方法

エクスポートしたいテーブルのレコードを抽出しておき、下記画像赤枠のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/97ebb160-cfe3-4572-9179-5636a0983b4b.png)

ファイル名、ファイルの保存場所、ファイルのフォーマット(CSVでいい場合はそのまま)を選択してSaveボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/cca3e13d-568a-44cc-a777-1a0f460fdc8f.png)

## CSVファイルのインポート方法

インポートしたいCSVを用意します。

例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/677c9095-9f24-4755-8e09-5f4574aa1b47.png)

インポートしたいテーブルのSelect文を実行後、下記画像赤枠のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/30b6df74-60de-478b-8110-999db97ff106.png)

インポートしたいファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/b11abcee-b871-4b23-86ae-ae22ce237d35.png)

既存のテーブルにインポートする場合は「Use existing table」を選択してNextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/36d3b399-f769-419e-b115-e7a3076c19c6.png)

インポートされるレコードが表示されるので問題がなければNextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/72d622a3-90bb-43bf-bde0-e8bcbf6fc76e.png)

Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/bc8ab5e8-a798-45a0-a4dc-782275738477.png)

CSVのレコードがインポートされるので、Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/83db9bfe-b554-4473-9ad4-f1aeacf50f52.png)

Finishをクリックして終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/5c5b1b56-3a13-434c-9106-80ee57ab8d84.png)
LINQの落とし穴（遅延実行）

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

https://youtube.com/shorts/r73a5QdsqF0?si=mu2LhbZOhAHPp8kI

## 遅延実行（Deferred Execution）
LINQが用意する、コレクションを戻すメソッドの多くは、

- メソッドを呼んだ時点では、結果のコレクションの中の個々の要素は生成されていない
- 結果のコレクションから要素を取り出す時点で、その要素が生成される

という動作をします。（**遅延実行**）

```cs
int[] source = [1, 2, 3];
var results = source.Select(x => Guid.NewGuid()); // ここで全要素が生成されるのではない

foreach (var item in results) // 要素が取り出される時点で、Guid.NewGuid()が実行される
{
    Console.WriteLine(item);
}
```
この遅延実行は、問題となる可能性があります。

### 要素を複数回取り出すと、値が異なる
LINQのメソッドが戻す結果のコレクションから、要素を複数回取り出す場合（例えば、結果のコレクションに対して`foreach`を２回使う）、そのたびに要素が生成されてしまいます。

```cs
int[] source = [1, 2, 3];
var results = source.Select(x => Guid.NewGuid()); // ここで全要素が生成されるのではない

foreach (var item in results) // ここで実行したGuid.NewGuid()と
{
    Console.WriteLine(item);
}

foreach (var item in results) // ここで実行したGuid.NewGuid()は、異なる値を戻す
{
    Console.WriteLine(item);
}
```

上記の例では、同じ`results`から２回要素を取り出していますが、取り出した値は異なります。

`results`から要素が取り出されるたびに、`Select`メソッドに渡した`Guid.NewGuid`メソッドが実行されるからです。

### 要素を取り出そうとしたときに、例外が起きる
LINQのメソッドを呼んだ時点では利用できていたリソースが、結果のコレクションから要素を取り出す時点では利用できなくなっている場合が考えられ、この場合、例外などの異常が起きる可能性があります。
```cs
// メソッドの戻り値が、LINQのメソッドが戻す結果のコレクション
IEnumerable<int> GetResults(IEnumerable<int> source)
{
    using var someDisposable = new SomeDisposable();
    return source.Where(x => /* someDisposableを利用する処理 */ );
    // メソッドから戻る時点で、someDisposableに対して、Dispose()が呼ばれる
}

var results = GetResults([1, 2, 3]); // 上記のメソッドを呼ぶ
foreach (var item in results) // someDisposableが、Dispose()されていて、利用できない
{
    Console.WriteLine(item);
}
```

### 遅延実行による問題を防ぐ方法
上記のような問題があり、遅延実行を防ぎたい場合、LINQのメソッドが戻した結果のコレクションに対して`ToArray`メソッドや`ToList`メソッドを呼び、全要素を生成してしまうといいでしょう。

`ToArray`メソッドや`ToList`メソッドを呼んだ結果の配列や`List<T>`には、生成済みの要素が入ります。要素を取り出す際は、生成済みの要素が取り出されるだけですから、遅延実行に伴う問題は起こりません。

```cs
int[] source = [1, 2, 3];
var results = source.Select(x => Guid.NewGuid())
                    .ToArray(); // ここで全要素が生成され、配列に入る

foreach (var item in results) // ここで取り出す要素と
{
    Console.WriteLine(item);
}

foreach (var item in results) // ここで取り出す要素は、同じ
{
    Console.WriteLine(item);
}
```

```cs
// メソッドの戻り値が、LINQのメソッドが戻す結果のコレクション
IEnumerable<int> GetResults(IEnumerable<int> source)
{
    using var someDisposable = new SomeDisposable();
    return source.Where(x => /* someDisposableを利用する処理 */ )
                 .ToArray(); // ここで全要素が生成され、配列に入る
}

var results = GetResults([1, 2, 3]); // 上記のメソッドを呼ぶ
foreach (var item in results) // 配列から要素を取り出す。someDisposableは関係ない
{
    Console.WriteLine(item);
}
```
【AWSクイズ】あなたはLambdaをどこまで知っている？

突然ですが、あなたはAWS Lambdaを知っていますか？
私がAWSを始めた頃はこう思っていました。
> Lambda？知ってるよ、サーバレスで一番有名なやつでしょ？

しかし、そう思った方に伝えたい。

**「Lambdaはものすごく奥が深いんだぞ！！」と。**

---
ということで、Lambdaのクイズを３問作ってみました！
あなたは何問正解できるかな？
出典：https://www.youtube.com/watch?v=QvPgjEwgiew
<br>
※５年前の動画を参考にしているため、内容に誤りがありましたらコメントにてご指摘ください。

# 第１問：同時実行数の上限
次のうち、正しい文はどれ？
1. 同時実行数の上限は、デフォルトで100万回である
1. 同時実行数の上限緩和申請後、直ちに上限が変更される
1. 同時実行数の上限を超えてリクエストされた場合、ステータスコード429が返却される
1. 同時実行数は、秒間の平均呼び出し回数×平均実行時間で常に見積もることができる

<details>
<summary>正解を表示</summary>
正解は３です！

https://repost.aws/ja/knowledge-center/lambda-concurrency-limit-increase
<br>
その他の選択肢は以下の通り。
- デフォルトの最大同時実行数は1000回です
（100万回は、１か月に無料で利用できる回数です）
- 上限緩和申請では、AWSの審査が行われ、申請却下となる場合があります
- イベントソースがポーリングベースの場合は見積もり方法が異なります。例えばKinesisをイベントソースとする場合、シャード数が同時実行数と一致します
</details>

# 第２問：コールドスタート
次のうち、**誤っている**文はどれ？
1. コールドスタートの場合、デプロイパッケージをS3からダウンロードし、zip展開する
1. 既存のLambdaをVPCアクセス可能に変更した場合、コールドスタートでENIの作成が実行される
1. Lambdaがコールドスタートで実行されるのは、「コードや設定を変更した」または「コンテナが１つも存在しない」場合である

<details>
<summary>正解を表示</summary>
正解は３です！
利用可能な数以上にリクエストが来た場合にも、コールドスタートで実行されます。
その他の選択肢は全て正しいです。
</details>

# 第３問：Lambdaの制限
次のうち、Lambdaの（デフォルト状態での）制約として**誤っている**文はどれ？
1. SMTP（ポート番号25）が利用不可
1. TCP/UDP以外のインバウンド通信はブロックされる
1. TCP/UDP以外のアウトバウンド通信はブロックされる
1. ptraceシステムコールはブロックされる
<details>
<summary>正解を表示</summary>
正解は２です！
Lambdaでは、すべてのインバウンド通信がブロックされます。
その他の選択肢は全て正しいです。
</details>

---
いかがでしたか？
全問正解された方はぜひ自慢してください！笑

私もまだまだ初学者なので、もう少し勉強したら第二弾を作ってみようかなと思います。
React Hook Formのresetは「Formを空にする」わけではない

React Hook Formのresetは「Formを空の状態にする」という理解でいましたが勘違いしていました。

```react
"use client";

import { useForm, SubmitHandler } from "react-hook-form";

export default function Home() {
  const { register, reset } = useForm({
    defaultValues: {
      hoge: "test",
    },
  });

  return (
    <>
      <input {...register("hoge")} />
      <button
        onClick={() => {
          reset();
        }}
      >
        リセット
      </button>
    </>
  );
}

```

上記は、defaultValuesでhogeの初期値に「test」を設定しています。
hogeの値を変更後、リセットボタンを押下するとhogeの値は空ではなく「test」になりました。

値を空にするにはreset({ hoge: "" })とするか、setValueを使用してsetValue("hoge", "")とすれば可能です。