OmniAICreator/Qiita-1.07M huggingface dataset:
投稿機能　(実務未経験状態でLaravelを使用した共同開発　タスク4)

## 0.背景
本記事は、記事「実務未経験状態でLaravelを使用した共同開発」で取り組んだタスクのうち、投稿機能についてまとめたもの

https://qiita.com/ashi__mo/items/9abff3c5227660dcddba

## 1.仕様内容
・トップページに投稿フォーム作成
・テキストエリアへ入力、投稿ボタンでpostsテーブルへ保存
・空欄では投稿不可（バリデーション）
・ユーザがログイン状態のみ投稿フォーム表示

##### UI ※デプロイしたもの
![top1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842139/ff67991d-1a3b-4a16-ae0e-7f5d7e72ac00.png)

## 2.タスクの見積もり
##### 期間
・７日
##### 理由
・メンバーのタスクがマージによるコンフリクト解消期間を考慮
・他メンバーの作業によるコンフリクト発生の可能性を想定
・実装中のエラー対応やレビュー対応時間も含めて算出
#### 実績
・仕様作成完了　４日
・PR完了　４日
・PRレビュー後修正　５日
・マージ完了　７日

## 3.実装
①routing
・web.php
・PostControllerのstoreメソッドを使用
・ログインユーザーのみが利用できるよう、auth ミドルウェアを適用
・投稿関連のルーティングを /posts にまとめるため prefix を使用
```
Route::group(['middleware' => 'auth'], function(){
    Route::prefix('/posts')->group(function(){
        Route::post('/','PostsController@store')->name('post.store'); // 新規登録処理
    });
});
```


②Model
・Post.php
・保存対象カラムの指定（$fillable）
・User モデルとのリレーション設定（1対多）
```
    protected $fillable = ['user_id', 'content'];
```
```
    public function user()
    {
        return $this->belongsTo(User::class);
    }
```
・User.php
・Post モデルとのリレーション設定（1対多）
```
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
```
③Controller
・PostsControllerを作成
・storeメソッドを記述
・PostRequest を使ってバリデーション処理を行う
・投稿保存処理を store メソッドに記述
・トップページへ戻る
```
    public function store(PostRequest $request)
    {
        Post::create([
            'user_id' => auth()->id(),
            'content' => $request->validated()['content'],
        ]);

        return redirect('/');
    }
```
④FormRequest
・PostRequestを作成
・空投稿、141字以上の投稿を弾くバリデーション設定
```
public function authorize()
    {
        return true;
    }
    
    public function rules()
    {
        return [
            'content' => ['required', 'max:140'],
        ];
    }

    public function messages()
    {
        return [
            'content.required' => '内容は必須です。',
            'content.max' => '投稿は140文字以内で入力してください。',
        ];
    }
```
⑤view
・posts/add_post.blade.phpを作成しトップページの該当箇所へinclude
・@csrf を使用してCSRF対策
・route('post.store') で投稿処理へ接続
```
<div class="text-center mb-3">
    <form method="POST" action="{{ route('post.store') }}" class="d-inline-block w-75">
        @csrf
        <div class="form-group">
            <textarea class="form-control" name="content">{{ old('content') }}</textarea>
            <div class="text-left mt-3">
                <button type="submit" class="btn btn-primary">投稿する</button>
            </div>
        </div>
    </form>
</div>
```

## 4.テスト実施
・ログイン状態でのみ投稿画面表示を確認
・投稿機能の確認
・空欄投稿や140文字超の投稿時にエラーメッセージが表示されることを確認

## 5.PRレビュー
・他メンバーのPRと一部内容が重複・矛盾していたため、自分のコードを修正
・該当PRの仕様・影響範囲も確認しながら対応を実施

## 6.本実装に関して
・再利用性：投稿フォームを部分テンプレートとしてカプセル化したことで、他画面でも再利用可能な設計にできた
・他メンバーのタスクとの連携・影響確認や、コンフリクト解消のプロセスを通じて、チーム開発における調整の重要性を学んだ
【第2回】Djangoでスマブラ対戦結果アプリを作ってみた（データ収集①）


## 🎮 はじめに

前回の記事では、スマブラ対戦データ分析プロジェクト全体の流れを紹介しました。  
今回は、ローカル環境に**対戦結果入力用のDjangoアプリ**を作成し、データ収集の基盤を整えます！

この記事では、**プロジェクト作成 → モデル設計 → 画面作成**まで、手順を解説していきます。

詳しいコードの内容はGithubに公開しておりますので、興味がある方はこちらをご覧ください。

https://github.com/sho-lab144/public_smash_bros


---
## 🛠 使用技術

- Django（Webフレームワーク）
- Docker（開発環境構築）
- SQLite（開発用DB）
- bash（コマンド自動化）

---

## 📦 プロジェクトの準備

まずはDjangoプロジェクトを作成します。  
今回はDockerを使った開発環境を構築しました。

### Dockerfile（抜粋）

```dockerfile
FROM python:3.8-slim

RUN apt-get update && apt-get install -y \
    tk \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /code

COPY requirements.txt .
RUN pip install --upgrade pip && \
    pip install -r requirements.txt

COPY . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
```
### docker-compose.yml（抜粋）

```dockerfile
version: '3.8'

services:
  web:
    build: .
    container_name: smash_app_export(ここは任意の名前)
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    env_file:
      - .env
```
### プロジェクト作成コマンド
```bash
django-admin startproject smash_project .
python manage.py startapp matches
```

これで、ブラウザで http://localhost:8000 にアクセスすればDjango初期画面が見えるはずです！


---
## 🏗 モデル設計

次に試合データを保存するため、**Djangoのモデル**（データ構造）を設計します。  
以下の情報を保存しています。

- match_id(ユニークid)
- 対戦時間
- 自分の使用キャラクター
- 相手の使用キャラクター
- 勝敗
- 戦闘力
- 対戦ステージ

### 📄 models.py（一部抜粋）

```python
from django.db import models

class Match(models.Model):
    match_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    match_time = models.DateTimeField(default=timezone.now, verbose_name="対戦時間")
    my_character_id = models.IntegerField(choices=CHARACTER_CHOICES, verbose_name="自分のキャラ")
    opponent_character_id = models.IntegerField(choices=CHARACTER_CHOICES, verbose_name="相手のキャラ")
    win_or_loss = models.CharField(max_length=10, verbose_name="勝敗")
    fighting_strength = models.IntegerField(verbose_name="戦闘力")
    stage = models.CharField(max_length=100, verbose_name="対戦ステージ")

```
---
## 🛠 モデルをDBに反映

マイグレーションコマンドを使って、データベースにテーブルを作成します。
```bash
python manage.py makemigrations
python manage.py migrate
```
これで、SQLiteに matchテーブルが作成されました！

---
## 🛠 画面作成

次にDjangoアプリのWeb画面を作っていきます。

Githubの「smash_bros_app_project/matches/templates/」フォルダに注目してください。

templatesフォルダの中に、Web画面に表示するhtmlが入っています。
Djangoでは、base.htmlという共通のテンプレートファイルを元に画面を作成していきます。

実際の画面が以下になります！

**対戦結果の入力画面**
![作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/09a2d9bd-1ada-4256-bcd6-f01e7fc23350.png)

**対戦結果一覧**
![リスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/d954e277-7311-4f68-91ef-3227139593d1.png)

**対戦結果の編集画面**
![編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/1e4e3a5b-c008-4747-bf46-9a8d8373e35c.png)

**対戦結果の削除画面**

![削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/a97507ef-24c8-46ec-a405-71ccc78f8267.png)

ちなみになのですが、自分は速くてかっこいいからという理由だけで、ソニックをよく使っています。（笑）

---

## 🚀 次回
簡単ではありますが、**対戦結果入力用のDjangoアプリ**の説明については以上になります。
次回は、BeautifulSoupを使った気象データのスクレイピングについて紹介していきます！  
https://qiita.com/shota1212/items/1eec2380f6e04ea59be4

---
Databricks Secretsによるシークレット管理とDatabricks Appsでの利用方法

# はじめに
Databricksでは、機密情報を安全に管理するためのシークレット管理機能が提供されています。
この記事では、Databricks CLIを使用したシークレットの管理方法と、
登録したシークレット値のDatabricks Appsからの利用方法について説明します。

# 前提条件
- Databricks CLIがインストールされていること
- Databricks CLIが設定されていること
  - `databricks configure --token` で設定

# シークレット管理の基本操作

## 1. シークレットスコープの作成
シークレットスコープは、シークレットをグループ化するための論理的なコンテナです。

```bash
databricks secrets create-scope <scope-name>

# 例:
databricks secrets create-scope my-scope
```

## 2. シークレットの追加
シークレットスコープ内にシークレットを追加します。

```bash
databricks secrets put-secret --json '{
  "scope": "<scope-name>",
  "key": "<key-name>",
  "string_value": "<secret>"
}'

# 例:
databricks secrets put-secret --json '{
  "scope": "my-scope",
  "key": "my-key",
  "string_value": "my-secret"
}'
```

## 3. シークレットの確認
作成したシークレットスコープとシークレットを確認できます。

```bash
# シークレットスコープの一覧表示
databricks secrets list-scopes

# 特定のスコープ内のシークレット一覧表示
databricks secrets list-secrets <scope-name>

# 例:
databricks secrets list-secrets my-scope
```

# Databricks Appsでのシークレットの利用

## 1. アプリ設定でのシークレット参照
Databricks Appsのアプリ設定画面でシークレットを参照するには、以下の設定を行います：

- scope: シークレットスコープ名
- secret key: シークレットキー名
- 権限: 読み取り可能
- リソースキー: 任意（アプリ内で参照する際に使用）

![Databricks Appsのシークレットの利用](./images/databricks-apps-secret.png)

## 2. アプリでのシークレット利用

### app.yamlの設定
アプリの設定ファイル（app.yaml）でシークレットを参照するには、以下のように設定します：

```yaml
env:
  - name: 'my-key'  # アプリ内で使用する環境変数名
    valueFrom: 'my-key'  # 設定したリソースキー名
```

### アプリケーションコードでの利用
アプリケーションコードでは、環境変数としてシークレットを参照できます：

```python
import os

# シークレットの取得
secret_value = os.getenv('my-key')
```

# まとめ

Databricksのシークレット管理機能を使用することで、以下のメリットが得られます：

1. 機密情報の安全な管理
2. アプリケーションコードからの簡単な参照
3. アクセス権限の細かい制御

シークレット管理はセキュリティの重要な要素です。適切な管理と定期的な見直しを行うことで、より安全な運用が可能になります。

# 参考資料
- [Databricks Secrets](https://docs.databricks.com/security/secrets/index.html)
- [Databricks Apps](https://docs.databricks.com/aws/ja/dev-tools/databricks-apps/configuration#databricks-%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B)
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIによる自動運転車事故の責任問題


## AIによる自動運転車事故の責任問題をエンジニア目線で分解する

---

### 🚗 1. はじめに：自動運転の「もしも」に備えるべき理由

最近、自動運転車の技術が急速に進化し、レベル4の実証実験も各地で始まっています。しかしそれに伴い、ある疑問がエンジニアの間でも浮上しています。

> 「もしAIが運転中に事故を起こしたら、責任は誰にあるのか？」

これは技術だけでなく、法制度や社会倫理とも深く関わる問題です。本記事では、AIによる自動運転の事故責任問題を技術視点から掘り下げ、エンジニアとして理解しておくべきポイントと対策を紹介します。

---

### 🤖 2. 自動運転AIの仕組みと責任が曖昧になる理由

自動運転システムは大まかに以下の3レイヤーで構成されています：

- **認知（Perception）**：カメラやLiDARで環境を認識（例：Pedestrianを検出）
- **判断（Decision）**：検知結果をもとにどう動くかをAIが判断
- **操作（Control）**：実際にステアリング・ブレーキを制御

#### 🔍 問題の本質：
自動運転事故が起きた際、問題が以下のどこで起きたのかが明確でないケースが多くあります：

| レイヤー | 想定される問題例 | 責任対象 |
|----------|------------------|----------|
| 認知     | センサーの誤検出 | ハード・デバイス提供者 |
| 判断     | モデルの誤判断   | ソフトウェア開発者 |
| 操作     | 制御不能         | メカニカルエンジニア |

→ つまり、**責任の分散と「ブラックボックス性」**が最大の問題です。

---

### 🛠️ 3. 実際のケースを再現：PyTorchで誤認識の簡易シミュレーション

ここでは、物体検出モデルが「人」を「標識」と誤認識するケースを簡易的に再現します。

```python
import torch
import torchvision
from PIL import Image
from torchvision import transforms

# モデルと前処理を準備
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()

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

# 画像を読み込む（例：歩行者画像）
img = Image.open("pedestrian.jpg")
input_tensor = transform(img).unsqueeze(0)

# 推論
with torch.no_grad():
    outputs = model(input_tensor)

# 結果を確認
for box, label, score in zip(outputs[0]["boxes"], outputs[0]["labels"], outputs[0]["scores"]):
    if score > 0.5:
        print(f"検出ラベル: {label}, スコア: {score:.2f}")
```

#### 🧪 結果例（誤検出）：
```
検出ラベル: 13 (stop sign), スコア: 0.76
```

このように、AIは人間には明らかなものでも、誤認識する可能性があります。これが実際の車載環境で発生すれば、重大事故につながることも。

---

### 🧩 4. 現場で役立つ実践Tips & よくある落とし穴

#### ✅ **Tips**
- **データセットのバイアス確認**：多様な天候・環境での画像を使う
- **SHAPやGrad-CAMなどで判断根拠を可視化**：ブラックボックス解消に効果的
- **モデルの振る舞いテストケースを作成**：ユニットテストと同様にAIにも必要

#### ❌ **落とし穴**
- **「高精度＝安心」と思い込む**：精度99%でも1%のミスが命に関わる
- **ログが不十分**：後で原因解析できないと法的にも不利

---

### 🚀 5. 応用と未来展望：説明可能なAI（XAI）×自動運転

今後の注目分野は**説明可能なAI（Explainable AI）**です。たとえば：

- 🧠 自動運転AIが「なぜその経路を選んだか」を人間に説明できる
- ⚖️ モデルの判断プロセスを第三者がレビューできる仕組みの導入
- 📄 法的に「AIの判断ログ提出」が義務化される可能性

これらを視野に入れた設計が、今後のプロダクトの信頼性を高めます。

---

### 📝 6. まとめ：技術者として意識すべきこと

| 観点 | ポイント |
|------|----------|
| ✅ メリット | 効率的・安全な移動、自動化による事故率の低減 |
| ⚠️ リスク | 判断根拠の不透明さ、責任の所在の曖昧さ |
| 🎯 未来展望 | XAI、AI監査ログ、法整備と並行した技術設計 |

---

### 🔚 最後に

自動運転AIは夢の技術ですが、夢を現実にするためには技術だけでは足りません。  
**「万が一」を設計段階から考慮するのが、真のエンジニアリングです。**

この記事を読んで「自分のプロジェクトにもXAI導入してみよう」と感じてもらえたら嬉しいです！

---

### 🖼️ 補足：図解イメージ例（7点）

1. 自動運転の3レイヤー構造図  
2. センサー誤認識と判断ミスの流れ図  
3. PyTorchモデルの推論フロー  
4. 誤認識の具体例（人 vs 標識）  
5. Grad-CAM可視化例  
6. AI判断の説明フレームワーク図  
7. AI事故時の責任分散マトリクス
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIによる心理的操作のリスク

  
## 「AIによる心理的操作のリスクとは？〜ユーザーの無意識を操るアルゴリズムの裏側〜」

---

### 1. はじめに：無意識のクリック、それAIのせいかも？

現代のAI技術は、検索結果の順位付けから、SNSフィードの最適化、ショッピングサイトでのレコメンドまで、私たちの生活のあらゆる場面に関わっています。しかしこの裏側では、「心理的操作（psychological manipulation）」と呼ばれる深刻なリスクが静かに進行しています。

たとえば、ユーザーの不安感や孤独感を意図的に増幅し、特定の行動（クリック、購入、シェアなど）を誘導する「アルゴリズムの暗黒面」――それは単なる UX 改善ではなく、倫理的にグレーまたはアウトな領域に踏み込みかねません。

本記事では、この「AIによる心理的操作リスク」について、技術的観点と現場の経験を交えてわかりやすく解説します。

---

### 2. AIと心理的操作：どこまでが最適化で、どこからが操作なのか？

#### ✅ 用語解説
- **心理的操作（Psychological manipulation）**：人の思考や行動に影響を与えるための意図的な操作。
- **強化学習型レコメンドAI**：ユーザーの反応に応じて報酬最大化を学習するアルゴリズム。
- **ダークパターン**：ユーザーの意図に反した選択を誘導するUI・UX設計。

#### 🔍 背景
近年のAIは、ユーザーの「注意」「感情」「行動ログ」などを収集し、最も反応しやすい刺激を学習・最適化します。これが強化学習の成果である一方、「不安を煽るニュース」「怒りを引き出す投稿」が意図せず優先されるケースも多く、ユーザーの心理に悪影響を与えかねません。

---

### 3. 実例：Pythonで簡単な「ユーザー操作アルゴリズム」を体験する

以下は、強化学習に基づくユーザー誘導のシンプルなシミュレーションです。

```python
import random

# ユーザーの状態（感情スコア）を模倣
user_emotion = {"neutral": 0, "happy": 0, "angry": 0, "anxious": 0}

# フィード候補コンテンツ
contents = [
    {"type": "cute cat", "reaction": "happy"},
    {"type": "political rant", "reaction": "angry"},
    {"type": "economic crisis", "reaction": "anxious"},
]

# 強化学習的ロジック（最も反応が高い投稿を優先）
def recommend_content():
    # 最大反応数を持つ感情を調査
    dominant_emotion = max(user_emotion, key=user_emotion.get)
    if user_emotion[dominant_emotion] == 0:
        return random.choice(contents)
    return next((c for c in contents if c["reaction"] == dominant_emotion), random.choice(contents))

# シミュレーション（ユーザーの反応により学習）
for i in range(20):
    content = recommend_content()
    user_emotion[content["reaction"]] += 1
    print(f"[{i}] {content['type']} -> ユーザー感情: {content['reaction']}")
```

このスクリプトを実行すると、「angry」や「anxious」なコンテンツが偏って提示され、ユーザーがその感情に陥るループが生じるのがわかります。

---

### 4. 現場で学んだ3つの教訓：AI設計者としての責任

#### 💡 実践的なTips
1. **報酬関数の設計に「倫理パラメータ」を加える**  
   例：クリック率だけでなく、ユーザーの満足度スコアも反映する

2. **ダークパターンの排除チェックリストを作る**  
   UXチームと連携して定期的にレビュー

3. **A/BテストのKPIに「エンゲージメントの健全性指標」を導入**  
   長期的なユーザー維持率や感情ログ分析を取り入れる

#### ❌ よくある失敗
- CTRにだけ最適化 → 感情的な刺激ばかりが強化される
- フィードバックループの未設計 → 操作性が強まりバイアスが固定化

---

### 5. 応用：倫理的AI設計へのアプローチ

#### 📘 例：Facebookの「Well-being」プロジェクト
「一時的なエンゲージメントよりも、長期的な幸福感を重視」するために、アルゴリズムのロジックに“emotional impact”を評価する指標を導入。

#### 🧠 応用アイデア
- 感情トリガーの自動検出＋バランスフィード制御
- ユーザーの自己選択権を強化するオプション提供（例：フィードタイプ切替）

---

### 6. まとめ：AIが人の心を動かす時、設計者に求められる倫理観

#### ✅ メリット
- エンゲージメントを向上させる効果
- コンテンツの最適化によるUX向上

#### ❌ リスク
- 感情の偏重による精神的負荷
- 無意識的な行動誘導＝個人の自由を侵害する可能性

#### 🚀 今後の展望
「AI × 倫理設計」は今後ますます重要に。特に法規制や設計フレームワークの整備が求められます。

---

> 💬 「技術者は世界を変えるが、それと同時に人の心も左右する存在である」  
> それを忘れずに、責任あるAI設計に取り組みましょう。

---

🖼️（図の提案：以下の図を挿入可能）  
1. 心理的操作の構造図  
2. ユーザー感情とレコメンド強化学習の関係図  
3. A/Bテストでの倫理パラメータの比較表  
4. ダークパターン vs エシカルデザインの比較図  
5. Facebookの「emotional impact」評価指標フロー  
6. ユーザーの感情ループシミュレーション図  
7. エンゲージメントと幸福度の相関グラフ

---
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIと宗教：信仰との共存は可能か？

 
## AIと宗教：信仰との共存は可能か？

---

## 1. はじめに 〜「信じる」機械との付き合い方とは？〜

近年、AI（人工知能）の進化はとどまるところを知らず、医療・教育・ビジネスだけでなく、「信仰」や「宗教」という極めて人間的な領域にも踏み込み始めています。

「AIが説法を行う」「AIが神の声を代弁する」といった試みはすでに世界各地で始まっており、ChatGPTのようなLLM（大規模言語モデル）を利用した“AI牧師”や“仏教Bot”の登場が話題を集めました。

しかし、  
👉 AIは「信仰」を理解できるのか？  
👉 人間の宗教的感情とAIは共存できるのか？  
👉 倫理的・技術的な課題は何か？  

本記事では、宗教とAIの接点を技術的・倫理的な観点から分析し、エンジニアとして私たちが何に気をつけるべきか、具体的なコード例とともに実践的に解説します。

---

## 2. AIと宗教：背景と技術の概要

### ■ AIと宗教の接点とは？

| 分野 | AIの活用例 |
|------|-------------|
| 仏教 | ChatGPTにお経を学習させて相談Bot化 |
| キリスト教 | バーチャル牧師（Bible AI Assistant） |
| イスラム教 | 毎日の祈りのリマインダー、Q&A Bot |

### ■ 技術スタック概要

| 技術 | 内容 |
|------|------|
| LLM（大規模言語モデル） | ChatGPT, Claude, Mistral 等 |
| Vector DB（ベクトルデータベース） | 宗教文献の検索・類似性マッチング |
| LangChain / LlamaIndex | 宗教文献のRAG実装に有効 |
| Text-to-Speech | 音声による礼拝案内や読み上げ |

---

## 3. 実践：仏教Botをつくってみよう（RAGアーキテクチャ）

ここでは、ベクトル検索とLLMを組み合わせて、「仏教相談Bot」を作成する実装例を紹介します。

### 🔧 使用技術
- `OpenAI API`
- `LangChain`
- `FAISS`（ベクトルDB）
- `Streamlit`（UI）

### 💡 ステップ概要
1. 仏教の教典（例：般若心経）を分割・埋め込み
2. FAISSにインデックス化
3. LangChainのRAGで回答生成
4. Streamlitでインターフェース構築

```python
from langchain.document_loaders import TextLoader
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

# 教典のロード
loader = TextLoader("hannya-shingyo.txt", encoding="utf-8")
docs = loader.load()

# ベクトル化
embedding = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embedding)

# チェーン作成
llm = ChatOpenAI(temperature=0.2)
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=db.as_retriever()
)

# 質問してみる
query = "人間の苦しみはなぜ存在するのか？"
print(qa.run(query))
```

---

## 4. 現場で役立つTipsと注意点

### ✅ 実践Tips
- 宗教文献は形式が特殊：正規化前処理をしっかり！
- 難解な文語訳より現代語訳を優先
- 類似文のクラスタリングで精度が向上

### ⚠️ よくある問題と対処法
| 問題 | 原因 | 解決策 |
|------|------|--------|
| 意味不明な回答 | 教典が形式的すぎる | 現代語訳＋Context補足 |
| 冗長すぎる返答 | トークン数超過 | 要約モデルの併用 |
| 内容の偏り | 教派間の違い | 多様な資料を使用すること |

---

## 5. 応用と拡張：多宗教対応チャットBotへ

### 🔄 拡張アイデア
- 複数宗教の文献を統合し、ユーザーが選べるBot
- Text-to-Speechで説法読み上げ（gTTS + Streamlit）
- 「宗教的感情」を考慮したPrompt Tuning

### 📌 ユーザーごとの倫理ガード
- ユーザーに対する「答えを断る」機能の実装  
例：
```python
if "神は存在するか" in query:
    return "この質問には一概にお答えできません。"
```

---

## 6. まとめ：AIと信仰の未来

| 視点 | ポジティブ | リスク・懸念 |
|------|-------------|----------------|
| 技術的 | 幅広い活用が可能 | 不正確・無責任な回答 |
| 倫理的 | 宗教教育の支援 | 教義の誤解・神格化の危険 |
| 社会的 | 孤独の解消 | 誤信によるトラブル |

### 🔮 今後の展望
- **AIと宗教倫理の共通ガイドライン**の策定が必要
- 人間とAIが「精神的に共存」できるための設計がカギ

---

## 📷 おすすめ図解（全7枚）

1. AIと宗教の接点マップ  
2. LLM + ベクトルDBの構成図  
3. 仏教Botのアーキテクチャ  
4. トークン制限と対策  
5. 多宗教対応の設計フロー  
6. 信仰的質問の例と制御方法  
7. 倫理リスク分類チャート  

---

## ✍️ 最後に

宗教という「人間の根幹」に関わる領域にAIを使う以上、技術力だけでなく、深い倫理意識と謙虚さが求められます。

「AIに答えを委ねる」のではなく、  
**「人間の理解を助ける道具」として設計する**ことこそ、エンジニアの真価が問われる部分です。

次回は「AIと芸術創作の倫理的ジレンマ」について掘り下げます。お楽しみに！

---
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️芸術分野におけるAI生成問題


##  芸術×AI：生成AIがアートにもたらす光と影

---

### 1. はじめに：AIとアートの出会い、その衝撃

近年、Stable DiffusionやMidjourneyといった画像生成AIが注目を集めています。ボタン一つで美麗なイラストやリアルな写真風画像を生成できるようになり、芸術分野に革新が起きています。

しかし、その一方で「著作権侵害」「クリエイター軽視」「AI作品の倫理的評価」などの課題も浮上しています。

本記事では、**アート分野におけるAI生成の技術的な仕組み**とともに、**実務レベルで遭遇するリスクや対応策**を技術者視点から解説します。

---

### 2. 生成AIとは何か？ ～芸術生成のメカニズム～

まず、芸術作品を生成するAIの基本原理について簡単に触れておきましょう。

#### 🔧 背景技術：Diffusionモデルとは？

Diffusionモデルは、「ノイズから画像を復元する」プロセスを学習する仕組みです。以下はその流れの簡略図です：

```
ランダムノイズ
　　↓
段階的に画像構造を再構成
　　↓
猫のイラスト完成！
```

多くの画像生成AIは、数億枚規模の画像・テキストペア（例：LAION-5Bなど）を学習しており、「猫　浮世絵風」といったプロンプトに応じて対応する画像を合成します。

---

### 3. 実践編：Pythonで簡単な画像生成AIを動かしてみる

ここでは、`diffusers`ライブラリを用いた簡単なStable Diffusionの画像生成例を紹介します。

#### 🖥️ 必要なライブラリ
```bash
pip install diffusers transformers torch accelerate
```

#### 🧪 コード例（Google Colabで動作確認済）

```python
from diffusers import StableDiffusionPipeline
import torch

# HuggingFaceのアクセストークンが必要です（無料）
pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16,
    use_auth_token="YOUR_HUGGINGFACE_TOKEN"
).to("cuda")

prompt = "a watercolor painting of Mount Fuji in traditional Japanese art style"
image = pipe(prompt).images[0]
image.save("mount_fuji_art.png")
```

このコードを実行すると、日本画風の富士山画像が1枚生成されます。

---

### 4. 実務Tips：よくある課題とその対策

#### ❗課題①：著作権の問題

- 問題：学習データに無断使用された作品が含まれている可能性あり
- 対策：商用利用時は**著作権フリーのモデル（例：Openjourney, Dreamlike）**を選択

#### ❗課題②：AI作品と人間作品の区別

- 問題：コンペや展示での不正利用の懸念
- 対策：メタデータ（生成ログ）やWatermark付与による透明性向上

#### ❗課題③：社会的信用の低下

- 問題：アーティストへの信頼性が揺らぐ
- 対策：**生成過程を可視化（例：プロンプト共有）**する文化の醸成

---

### 5. 応用編：人間とAIの協業アート

AIを「道具」として捉える視点が重要です。

#### 💡事例：Prompt Engineering + Human Editing

1. **AIで下絵生成**  
　→ 背景や雰囲気をAIで素早く描画  
2. **Photoshop等で加筆修正**  
　→ 人間のタッチを加え、独自性を強化

このような「人とAIの協創」が、現代アートの新しいスタイルとして注目されています。

---

### 6. まとめ：倫理を守り、技術を活かす未来へ

| 項目 | 内容 |
|------|------|
| ✅メリット | 創造性の拡張、生産性向上 |
| ❌デメリット | 著作権問題、信用の揺らぎ |
| 💡未来展望 | 技術の進化とともに倫理フレームの整備が鍵 |

---

### 📌補足：用語解説（初心者向け）

- **Diffusion Model**：ノイズから画像を再構成する生成AIの仕組み
- **Prompt**：AIに指示を与えるテキスト入力
- **LAION-5B**：画像生成AIの代表的な学習用データセット
- **メタデータ**：画像に埋め込まれた生成情報や履歴

---

### 🖼️画像構成の例（7枚）

1. Diffusionモデルの仕組み（図解）
2. 学習データの流れ
3. Stable Diffusionで生成した例
4. Promptと結果の関係図
5. 著作権問題を視覚化した構成
6. 人間とAIの協業プロセス図
7. 倫理リスクと回避策のマトリクス

---

ご希望であれば、実際に使用する画像（図解・コード実行例）を生成して添付も可能です。  
図やグラフが必要な場合、お知らせください！

このテーマでさらに深堀りしたい内容はありますか？
【第1回：導入編】スマブラ勝率を徹底分析！データで読み解くキャラ性能と戦略


## 🎮 はじめに

大乱闘スマッシュブラザーズ（スマブラ）は、世界中で人気の高い対戦型アクションゲームです。  
プレイヤー同士の駆け引きやテクニックが勝敗を分けますが、実はそこに「データ的な傾向」が存在するのでは？という興味から、今回のプロジェクトを立ち上げました。

本シリーズでは、スマブラの対戦結果データと気象情報を組み合わせて、以下の疑問をデータで解明していきます！

- キャラクターごとに勝率に違いはあるのか？
- 特定のキャラ同士に有利・不利な相性はあるのか？
- 気温・時間帯が勝敗に影響することはあるのか？

---

## 🧰 使用技術スタック

| 分類         | 使用技術                                                  |
|--------------|------------------------------------------------------------|
| ローカル環境 | Docker / Django / Python / BeautifulSoup / GitHub / bash |
| データ処理   | AWS S3 / Glue / PySpark / Step Functions / Lambda |
| 可視化       | Tableau Desktop                                            |

---

## 📊 プロジェクト概要とアーキテクチャ

今回の分析基盤は、以下のような3つの環境に分かれています。

1. **ローカル環境**：対戦データ入力アプリ（Django）と気象データ収集（スクレイピング）
2. **AWS環境**：S3によるデータレイクと、Glue × PySparkによるETL基盤
3. **分析環境**：Tableau Desktopによるデータ可視化・インサイト抽出

以下が全体のシステム構成図になります

![設計図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/08789f2d-e304-41a2-ac7e-77ee9c7a0fd7.png)

---
## 🗃 分析対象となるデータ構造

データは以下の3層に整理しています。

- **データレイク**：試合ごとの対戦結果、気象データ（生データ）
- **データウェアハウス**：試合データと気象データを整形した中間データ
- **データマート**：キャラクター別勝率、キャラ間の相性、天候別勝率などを集計済みデータ

以下がテーブル設計図になります

![テーブル定義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/20d8ebc0-55d0-4517-ac66-f29c3e272943.png)

## 🛠 処理の簡単な流れ

今回のスマブラ対戦分析プロジェクトは、以下の流れでデータを収集・加工・分析しています。

---

### ① ローカル環境でデータ収集

- Djangoアプリで対戦結果（使用キャラ、勝敗、試合時間など）を入力  
- Python（BeautifulSoup）で気象データをスクレイピングして収集

---

### ② AWSにデータをアップロード

- ローカルからS3（データレイク）へCSVファイルをアップロード  
- bashコマンドやAWS CLIを活用して自動化

---

### ③ AWS Glue × PySparkでデータ加工

- S3に格納された試合データと天候データを整形  
- キャラクターごとの勝率、キャラ間の相性、天候別勝率を算出  
- データウェアハウス、データマートを作成して整理

---

### ④ Step Functions + Lambdaで処理を自動化

- S3アップロードをトリガーにGlue ETL処理を自動実行  
- サーバレスでデータ加工のワークフローを構築

---

### ⑤ Tableauで可視化・分析

- キャラクター別勝率傾向をグラフ化  
- キャラクター組み合わせ別勝率傾向をグラフ化 
- 時間帯・天候別に勝率の違いを可視化してインサイトを抽出

---


各ステージのテーブル設計はこちら
![テーブル定義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785161/fd639b49-9f24-43a6-95dc-f06b90d3cf2b.png)
---
## 🔁 今後の連載予定
| 回 | タイトル |
|----|----------|
| 第2回 | Djangoでスマブラ対戦結果アプリを作成（データ収集①） |
| 第3回 | BeautifulSoupで気象データをスクレイピング（データ収集②） |
| 第4回 | bashを使って、S3にデータアップロード（自動化） |
| 第5回 | Glue × PySparkでETLパイプラインを構築（データ加工） |
| 第6回 | Step Functions + Lambdaで自動処理化（ワークフロー設計） |
| 第7回 | スマブラ勝率・キャラ相性・気温影響を可視化（分析編） |

---

## 🚀 次回

次回は、ローカル環境で作成した「スマブラ対戦結果入力アプリ」について紹介していきます！  
https://qiita.com/shota1212/items/38c381a42faad5413a4d

---
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIが生む「ディストピア社会」とは？

  
## 「AIが生むディストピア社会」とは？リアルな危機とエンジニアができる対策

---

## 🧩 1. はじめに：ディストピアはSFだけの話じゃない？

「AIが社会を便利にする」は当たり前になった今、逆に「AIがもたらすディストピア的未来」が現実味を帯びています。

例えば：
- **信用スコア**に基づいて行動が制限される
- AIによる**監視社会の常態化**
- **自律兵器**が判断する「敵と味方」

本記事では、この「ディストピア化」の構造を技術視点で紐解き、**私たちエンジニアが何を意識し、どう行動すべきか**を掘り下げていきます。

---

## 🤖 2. 「AIディストピア」の正体：何が危険なのか？

ディストピア的なAI利用は、単なる「技術の暴走」ではありません。むしろ次の3つの要因が複雑に絡み合っています。

### ✍️ 用語解説：
| 用語             | 意味 |
|------------------|------|
| テクノロジー独裁 | 技術的権力が民主的意思決定を凌駕する状態 |
| アルゴリズムバイアス | 学習データや設計思想に起因する偏り |
| 透明性の欠如     | AIの意思決定過程がブラックボックス化すること |

### 危険因子の構造図：
🧠 AI → 📊 データ → 🔒 意思決定 → 👁️ 監視／操作

この流れの中で、以下のような事象が現れます：

- AIが**市民の行動をスコア化**
- 評価が悪ければ**サービス制限**
- 不満を言えば**監視対象**に

これはもはやSFではなく、**中国の社会信用システム**に近い現実です。

---

## 💻 3. 実例：AIによる行動スコアリングシステムのモデル

以下は、PythonとScikit-learnを用いた**行動スコアリングの簡易シミュレーション**です。

```python
import pandas as pd
from sklearn.linear_model import LogisticRegression

# 行動ログのダミーデータ
data = pd.DataFrame({
    'late_payments': [0, 1, 2, 0, 3],
    'public_posts_negative': [0, 1, 2, 1, 3],
    'score': [1, 0, 0, 1, 0]  # 1=信用高, 0=信用低
})

X = data[['late_payments', 'public_posts_negative']]
y = data['score']

model = LogisticRegression()
model.fit(X, y)

# 新たな行動ログ
new_user = pd.DataFrame({
    'late_payments': [1],
    'public_posts_negative': [2]
})

pred = model.predict_proba(new_user)
print("信用スコア:", pred[0][1])
```

このコードは教育目的ですが、現実世界ではこれに**顔認識・位置情報・発言内容**などが追加され、AIが個人の人生に影響を与える判断を下す可能性があります。

---

## 🛠️ 4. エンジニアとして気をつけたいこと・あるあるミス

### ✅ 実践Tips：
| 観点 | 内容 |
|------|------|
| データ取得 | プライバシー配慮された収集に限定する |
| 学習設計 | バイアスチェック（人種・性別・地理）を定期的に行う |
| モデル監査 | Explainable AI (XAI) やSHAP値などを活用して「説明可能性」を担保する |
| デプロイ運用 | モデルの振る舞いを常にログ・監視する体制を整える |

### ❌ よくあるミス：
- 「便利だからとにかく導入！」という安易な意思決定
- 法的・倫理的な確認が**後回し**
- モデルの「ブラックボックス化」を放置

---

## 🚀 5. 応用・拡張：より倫理的なAIを構築する方法

### Ethical AIフレームワークの導入：
- **AI倫理方針（AI Ethics Policy）**の策定
- 社内に**AI倫理委員会**を設ける
- 開発プロセスに**第三者レビュー**を組み込む

### 技術スタックの拡張例：
- `AI Fairness 360`（IBM提供）で偏り検出
- `TensorFlow Model Card`でモデル情報の可視化
- `Differential Privacy`による匿名性確保

---

## 🧭 6. 結論：AIに社会を任せる前に

AIは強力なツールですが、それゆえに「どう使うか」が問われます。

| 項目 | 内容 |
|------|------|
| メリット | 効率化、自動化、公平性の可能性 |
| デメリット | 誤判断、差別、監視、自由の制限 |
| 未来展望 | 「人間中心のAI（Human-centric AI）」が鍵となる |

私たちエンジニアは単に技術を使うだけでなく、**社会との接点を意識して設計・運用する責任**があります。

---

## 🔚 最後に：あなたの一行が社会を変える

もしあなたが「たった1行のコードを書いている」と感じているなら、それは間違いです。

その1行が、
- 子どもの教育機会を決めるかもしれない
- 誰かの発言を封じるかもしれない
- 自由を守るかもしれない

**だからこそ、考えて書こう。技術は未来をつくるから。**

---

### 📌 本記事で紹介したリソース一覧
- [AI Fairness 360 (IBM)](https://aif360.mybluemix.net/)
- [SHAP Documentation](https://shap.readthedocs.io/)
- [TensorFlow Model Card Toolkit](https://www.tensorflow.org/responsible_ai/model_card_toolkit)
ecrでipv6経由でアクセスしてローカルダウンロードを高速化できるかもしれない

日本ではipv4よりipv6アクセスのほうが高速なことがあります。

2025年5月のアップデートでipv6が使える(dualstack)ECRのエンドポイントが新しくできました

AWS内やCI/CDはともかく、ローカルから通信しているなら切り替えると良いことがある人もいるでしょう

## ecr

ipv6対応
`dkr-ecr.ap-northeast-1.on.aws`


今まで(ipv4専用)
dkr.ecr.ap-northeast-1.amazonaws.com


https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html


## public ecr
ipv6対応
`ecr-public.aws.com`

今まで(ipv4専用)
public.ecr.aws

https://docs.aws.amazon.com/AmazonECR/latest/public/public-ecr-requests.html


よく見ると地味にいろいろ変わってますね
Ubuntu 24.04 LTSにてCanon PIXUS MG3130を使えるようにする方法

だいぶ古いCanon製複合機MG3130をUbuntu 24.04 LTSで使えるようにしました、という記事です。

# 作業の流れ
1. 純正ドライバのインストール
1. カラー印刷設定

# 1. 純正ドライバのインストール
まずは、CanonのHPより純正のドライバをダウンロードしてきます。
<https://canon.jp/support/software/os/select?pr=3160&os=20>

ダウンロードするファイルは2つです。
* cnijfilter-mg3100series-3.60-1-deb.tar.gz
* scangearmp-mg3100series-1.80-1-deb.tar.gz

マニュアル通りだと、この圧縮ファイルの中にあるインストーラ（install.sh）を実行すればインストール＆設定はすべて完了なのですが、いかんせん古いパッケージなのでUbuntu 24.04 LTSでは依存関係が解決できません。具体的には下記のパッケージが無いと怒られます。
* libpango1.0-0
* libpng12-0
* libtiff4

まずlibpango1.0-0ですが、同等と思しきパッケージが『libpango-1.0-0』という名前でaptのリポジトリに登録されています。そこで、debパッケージに記載されている依存関係を書き換えて無理やりインストールすることにします。書き換える方法は下記のサイトを参考にしました。
<https://ubuntuforums.org/showthread.php?t=636724>

次にlibpng12-0とlibtiff4ですが、これはUbuntu 24.04 LTSのリポジトリには無いため、古いリポジトリを一時的に追加してインストールします。
~~~
$ sudo echo 'deb [trusted=yes] http://old-releases.ubuntu.com/ubuntu/ precise main universe' >> /etc/apt/sources.list.d/extra.list
$ sudo apt update
$ sudo apt install libpng12-0 libtiff4
$ sudo rm /etc/apt/sources.list.d/extra.list
$ sudo apt update
~~~

また、libusb-0.1-4とlibcanberra-gtk-moduleも依存しているようなのでインストールしておきます。
~~~
$ sudo apt install libusb-0.1-4 libcanberra-gtk-module
~~~

ここまで済んだらようやく純正ドライバのインストーラが問題なく通るようになるので実行します。
~~~
$ sudo ./install.sh
~~~

あとはマニュアル通りです。


# 2. カラー印刷設定
なぜか私の環境ではデフォルトでカラー印刷ができない状態だったので設定します。やることは下記のコマンドを実行するだけです。（プリンタ名はインストールした際に指定した名前を入力してください）
~~~
$ lpadmin -p <プリンタ名> -o print-color-mode-default=color
$ lpadmin -p <プリンタ名> -o print-color-mode=color
~~~

以上です。お疲れさまでした。
OCI#12 Cloud ShellからインスタンスへのSSH接続時エラー

## 概要
Cloud Shellを使用してインスタンスへSSH接続する際のエラー対応のメモ。

## エラー内容
```
userXXX@cloudshell:~ (ap-tokyo-1)$ ssh -i xxxx.key opc@10.0.1.12
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
## 原因
下記を満たしたときに発生。
Cloud ShellやOCI関連でのエラーではなく、SSH鍵認証によるエラー。
- Cloud Shellを使用してインスタンス(10.0.1.12)へSSH接続済み
- .ssh/known_hostsにインスタンス公開鍵追加済み
- インスタンスを再作成して同一プライベートIPアドレスを設定

## 対処方法
### known_hostsの公開鍵を削除
1.Cloud Shellへ接続
2.公開鍵を削除
```
userXXX@cloudshell:~ (ap-tokyo-1)$ ssh-keygen -R <IPaddress/Hostname>
```
### 再度鍵を使用してSSH接続
1.Cloud Shellへ接続
2.SSH接続
```
userXXX@cloudshell:~ (ap-tokyo-1)$ ssh -i xxxx.key opc@10.0.1.12
...
[opc@vm02 ~]$ 
```
【シリーズすごいぞiQ-F】「いわゆる構造化プログラミング」への道　オマケ1～構造体型ラベルの転送について

## はじめに
ここまで「いわゆる構造化プログラミング」として4回に分けて記事にしました。
しかし、良いことばかりでは無く、従来型プログラムに慣れていると引っかかるポイントがいくつかあったので雑多ですがオマケとして紹介します。
+ オマケ1～構造体型ラベルの転送について
+ オマケ2～ラベルプログラムでの一括処理の違いについて
+ オマケ3～ラッチラベルで注意することと全変換への対応について

あたりについて書きたいと思いますが、気が変わって歴史修正するかもしれません。

## 構造体型ラベルの転送について
### 1．構造体で多点数を転送する方法
+ ST又はインラインSTを使用する
    + 型が同じ構造体のインスタンス同士の代入で記述できます
    + 構造体型ラベルにデバイスが割り付けられているとステップ数が増大します
+ 汎用ファンクションの算術ファンクションを使用する
    + 算術ファンクション　「MOVE」を使用する
    + 構造体型ラベルにデバイスが割り付けられているとステップ数が増大します
+ CPUユニット命令を使用する
    + ワードは「BMOV」、ビットは「BLKMOVB」を使用してブロック転送する
        + デバイスの連続性が保証される範囲を正確にしていする必要があります
        + 以下の例は「w_読み出しデータ」は配列型8要素で、連番で定義されている転送先の構造体メンバのw_Dat01からDat08へブロック転送されます 
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/b6ba2f7d-51fd-4f32-8dd7-f9f0bdd55430.png)
    + 構造体型ラベルにデバイスが割り付けられていてもステップ数に影響はありません

### 2．デバイス割り付けた構造体型ラベルを転送する際のステップ数の増大に対する考え方と対応
デバイスを割り付けた構造体型グローバルラベルを転送すると、内部ではデバイス1点ずつのMOV命令に変換され、ステップ数が増大します。

この事がどのようにプログラミングに影響するか考えます
#### プログラム容量について
ハッキリしたことは言えませんが、従来1万ステップ程度で収まるプログラムであれば2，3倍のステップ数が必要になる可能性があります。

私の場合は48,000～64,000ステップの間に収まる事はほぼ確実なので問題視していませんが、皆さんの場合はどうなのか正直分かりません。

#### スキャンタイムについて
プログラムを全てMOV命令で埋め尽くしたとして概算します。
MOV命令4ステップ、命令実行時間（高速命令）として
+ FX5S ON 0.1μsec
    + 命令実行時間 0.1μsecｘ48,000/4＝1.2msec
+ FX5U ON 0.034μsec
    + 命令実行時間 0.034μsecｘ64,000/4＝0.544msec

私の場合はこの程度のスキャンタイムの増加は全く問題の無いプログラムしか組みませんが、影響がある方は事前に詳細な検討が必要かと思われます。

#### BMOVやBLKMOVBを使用してステップ数を削減できる
主にデバイスを割り付けてあるラベル同士での転送に使用します。

以前、構造体のメンバを8とか10とか連番で決まった数用意するというのはこれを行うためでもあります。

転送数の指定を間違えると思わぬバグを招くので十分注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/74139077-b0ca-4a59-b29e-8378a9d29d99.png)

構造体型ラベルにデバイスを割り付けてある場合はデバイス転送と同じ考えでBMOV系の命令を使用し、割付が無い場合はCPU命令以外でのSTなどでの転送を行うのが定石でしょうか。

ステップ数が許容できる範囲ならデバイスを割り付けていてもSTやMOVEでの転送でも良いでしょう。

#### マクロ型ファンクションブロックを使用する
マクロ型ファンクションブロックを使用すると、FBへの入出力は転送では無くFBのロジック内へ直接書き込まれる形で変換されるので転送によるステップ数の増加はありません。

但し、処理の方がプログラム中に配置したFBのインスタンスの数だけステップを費やす事になります。

三菱で用意しているユニットFBが全てマクロ型ファンクションブロックなのは、FBの入力に用いる巨大なユニットラベルの転送を行わないためです。

## おわりに
構造体型ラベルの転送について、プログラムをしていてステップ数の増加に驚いたので記事にしてみました。

この辺はプログラムの本質に関係ない小賢しい話ではありますが、過渡期として必要なテクニックと考えて諦めています。

## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
まいにちコード - Gemini APIの活用例

## はじめに
Python講師をしているmei_13と申します。
最近はレッスンにも生成AIを取り入れはじめています。
まだまだ試行錯誤の段階ですが、一例をご紹介いたします。

## まいにちコードとは?
私の運営しているサイトでは、Geminiが毎日プログラミングの簡単な問題を出してくれています。
元々は多忙な生徒様のご要望があり、通勤・通学時などの隙間時間に少しでもPythonコードに触れられないかということで、このシステムを開発しました。

https://python.hisakatano.com/?page=dailycode

出力を解答できるようになっており、丁寧な解説もついています。
![Screenshot from 2025-05-05 22-52-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073600/bcbcbb17-7650-46b3-a970-511633e4186e.png)


## 改善点
まだまだコードのバリエーションが少なすぎます。プロンプトを改善しないといけないとは思うのですが...
日々試行錯誤しているところです。

## おわりに
生成AIの活用がかなり広まってきました。私もエンジニアとして、取り残されないようにがんばりたいところです。
DockerでQiita CLI環境を構築する


# はじめに

最近はQiita記事の執筆に生成AIを活用して、マークダウンで記事を書くことが増えてきました。
それを手動でQiitaに書き写しており面倒だったので、Qiita CLIを使ってマークダウンのまま、記事を投稿してみようと思いました。

Qiita CLIを使うことで、ローカル環境でQiita記事を執筆・プレビュー・投稿できるようになり、
さらにDockerを使用することで、クリーンで再現性の高い執筆環境を構築できます。

本記事では、Dockerを使用してQiita CLI環境を構築する方法を紹介します。

# 前提
- Docker Desktopがインストールされている
- Qiitaのアカウントを持っている
- ターミナルの基本的な操作ができる

# 手順

## 1. プロジェクトの準備
まず、プロジェクトのディレクトリを作成し、必要なファイルを用意します：

```bash
mkdir qiita-cli
cd qiita-cli
```

## 2. Dockerfileの作成
以下の内容でDockerfileを作成します：

```dockerfile
FROM node:23-slim

WORKDIR /app    

RUN apt-get update && \
    apt-get install -y git && \
    npm install -g @qiita/qiita-cli && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Node.jsの環境変数を設定
ENV NODE_ENV=production
ENV NODE_OPTIONS=--no-warnings

CMD ["sleep", "infinity"]
```

## 3. docker-compose.ymlの作成
以下の内容でdocker-compose.ymlを作成します：

```yaml
services:
  qiita-cli:
    build: .
    volumes:
      - ./:/app
    ports:
      - "8888:8888"
    environment:
      - QIITA_TOKEN=${QIITA_TOKEN}
    tty: true
    extra_hosts:
      - "host.docker.internal:host-gateway"

networks:
  qiita-network:
    driver: bridge
```

## 4. qiita.config.jsonの作成（プレビュー設定）
以下の内容でqiita.config.jsonを作成します：

```json
{
  "includePrivate": false,
  "host": "0.0.0.0",
  "port": 8888
}
```

## 5. Qiita APIトークンの取得と設定

1. [Qiitaの設定ページ](https://qiita.com/settings/tokens/new)にアクセス
2. 新しいトークンを作成（`read_qiita`と`write_qiita`の権限が必要）
3. `.env`ファイルを作成し、以下の内容を追加：
   ```
   QIITA_TOKEN=your_qiita_token
   ```

## 6. 環境の起動
以下のコマンドでDocker環境を起動します：

```bash
docker-compose up -d
```

## 7. 記事の作成と管理

### 新規記事の作成
```bash
docker-compose exec qiita-cli qiita new my-article
```

### プレビュー
```bash
docker-compose exec qiita-cli qiita preview
```
ブラウザで`http://localhost:8888`にアクセスすると、記事のプレビューが表示されます。

### 記事の投稿
```bash
docker-compose exec qiita-cli qiita publish my-article
```

# まとめ

Docker環境でQiita CLIを使用することで、ローカル環境を汚さずにQiita記事の執筆・プレビュー・投稿が可能になります。
画像だけ事前のアップロードが必要ですが、生成AIを活用して記事の執筆を効率化するために活用してみてください。

# 参考
- [Qiita CLI公式ドキュメント](https://github.com/increments/qiita-cli)
プログラミングの流れ（初記事）

# プログラミングの流れ
初めましてhikaといいます！初めて記事を書きました。
今回は「**順次、条件分岐、繰り返し**」について学んだことをまとめました。
参考になればうれしいです。

## 順次
順次とは上から下へとプログラミングが流れるように進むことを指します。

```javascript:hello.js
const Animal = [
    {name: "ライオン",age: 8},
    {name: "カンガルー",age: 3},
];
console.log(Animal[0].name);
```

このように上から下へ流れるような処理のことを「**順次**」と呼びます

## 条件分岐
条件分岐はある点で処理が分岐するような処理のことを指します。
```javascript: hello.js
const animalAge = 7;
if(animalAge > 6) {
    console.log("カンガルーさんは7歳以上です。");
    }else {
    console.log("カンガルーさんは6歳以下です。");
}
```
このようにif分の前後で処理が分岐している処理を「**条件分岐**」と呼びます。

## 繰り返し
繰り返しはある特定の処理を同じように繰り返している処理のことを指します。
```javascript: hello.js
let i = 0;
while(i < 3) {
console.log("こんにちは、どうもよろしくね！");
i++;
}
```
このように同じ処理を繰り返している処理を「**繰り返し**」と呼びます。

## これどこで使うん？
主にこの3つは詳細設計などでフローチャートを作るときに使う概念です。

順次

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056949/196b0c98-12ef-4706-9f98-451599703eef.png)

条件分岐
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056949/ee352547-80c5-42da-ae2e-8a035e138bf8.png)


繰り返し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056949/714a010e-bf2e-448a-ad5b-7c84057d1c9a.png)

このようにフローチャートを書くときに基本となる3つの軸になります。
なので、フローチャートを書くときにはぜひこの3つを意識して書いてみるように
してはいかがでしょうか？

## まとめ
「**順次、条件分岐、繰り返し**」はフローチャートを書く時の基本軸となる。
【10日で合格】AZ-104合格体験記

先日、AZ-104という試験に合格しました。
>AZ-104 は、Microsoft が提供する認定資格試験で、「Microsoft Azure Administrator Associate」として知られています。この資格は、Microsoft Azure の管理に関する中級レベルのスキルを認定するもので、主に Azure 環境の運用と監視、リソースの管理に携わる IT プロフェッショナル向けです。

## 試験前の筆者の状態
azureの業務未経験で、azure portalはもちろん触ったことがないです。azureの読み方すらわかりませんでした。
(一応、基本情報技術者保持)

# 勉強スケジュール
### 1日目〜4日目

https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-Microsoft-Azure-Administrator%E6%95%99%E7%A7%91%E6%9B%B8-AZ-104/dp/4295013692/ref=sr_1_4_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3IK105YFXTLVY&dib=eyJ2IjoiMSJ9.YyOBQkO9fioqM3kfrlErMzIEqGwggeKUZWTnAi5aJHdd3cZjboOE0voD3gfKV1AszCSwes5qIcj0opB7WxHEs1e7GhJujE3bvKnPtw27mP0owINv3O9USNdt2_xQ49Y6yEZ8tqu7H7WnjvKARDfTv5z9KubAVCPTAKw8z7v1HCd3IlcxNUcijLU_6fgBJfX-HeiyUo9MTeXc7sfFrrcpT9GgtT3dGNQHbwfL3LzuulsPSv0ADM1F5l4CbgJhfUxxc4PkQRMRFOfxOi6t0OwZNcMDJE__44cpAY8vxw5Twew.RuLlYylFSsGeRat1LiNYsXZy5vRaflJWq-_eJeXIYcc&dib_tag=se&keywords=az104&qid=1746452062&sprefix=az10%2Caps%2C164&sr=8-4-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1

↑の参考書を一周読みました

### 5日目〜10日目
Udemy

https://www.udemy.com/course/30az-104-microsoft-azure-administrator240/

↑の模擬問題①〜⑤を６周ずつ解いて、正答率を９割ほどにしました。

解答を覚えるのはもちろん、なぜその解答になるのか、なぜこの解答は違うのかを答えられるようにしました。

# 反省
合格はしましたが、azureに対しての理解度は乏しく、実務に活かせるかは微妙だと感じました。
合格するためだけの勉強ならこの方法でいいかもしれませんが、自分のスキルとして持っておくべきなら問題集だけでなくAzure portalの画面などを触った方が良いと思いました。
PHP備忘録：Laravelでのフォーム入力からバリデーション、データベース保存までの流れをまとめてみた

## はじめに

Docker上でLaravel環境を構築し、メッセージ投稿フォームの作成を通じて基本的なMVC（Model-View-Controller）構成の流れを理解する学習を行いました。

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

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

個人的にPHPのキャッチアップをしたくて、Laravelを使った実践を通じて、フォーム入力 → バリデーション → データベース保存という一連の流れを学びたかったためです。完全に初学者としての備忘録となります。

## 内容

### 環境

* Laravel を Docker コンテナ上に構築
* `php-app`, `mysql`, `phpmyadmin` の3つのサービスで構成

### コントローラーの作成

```bash
docker compose exec php-app php artisan make:controller MessageController
```

### コントローラーの中身（重複定義の修正も含む）

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Message;

class MessageController extends Controller
{
    public function create()
    {
        return view('message.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|max:255',
            'message' => 'required',
        ]);

        Message::create($validated);

        return redirect('/message')->with('success', '保存しました！');
    }
}
```

### モデルの作成と設定

```bash
docker compose exec php-app php artisan make:model Message -m
```

Messageモデルでは、`$fillable` に name, message を指定：

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    // 保存を許可するカラムを指定
    protected $fillable = ['name', 'message'];
}
```

### マイグレーションとDB作成

```bash
docker compose exec php-app php artisan migrate
```

### ビューの作成

`resources/views/message/create.blade.php` に以下を作成：

```blade
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>メッセージ投稿</title>
</head>
<body>
    <h1>メッセージ投稿フォーム</h1>

    @if(session('success'))
        <p style="color:green">{{ session('success') }}</p>
    @endif

    <form action="/message" method="POST">
        @csrf
        <label>名前: <input type="text" name="name" required></label><br><br>
        <label>メッセージ:<br><textarea name="message" rows="5" cols="40" required></textarea></label><br><br>
        <button type="submit">送信</button>
    </form>
</body>
</html>
```

### ルーティング

```php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HelloController;
use App\Http\Controllers\MessageController;

Route::get('/', function () {
    return view('welcome');
});

// Hello関連
Route::get('/hello', [HelloController::class, 'index']);
Route::post('/hello', [HelloController::class, 'post']);

// Message関連
Route::get('/message', [MessageController::class, 'create']);
Route::post('/message', [MessageController::class, 'store']);
```

## まとめ

Laravelでの基本的なフォーム処理とDB保存までの流れを、一通り経験できました。

:::note info
MessageControllerの重複定義エラーや `BindingResolutionException` によるつまづきもありましたが、クラス定義の整理と `composer dump-autoload` によるオートロードの修正で解決できました。
:::

Docker環境との連携も含めて、今後のLaravel開発に向けての土台が少し見えてきました...！
【Mac】コマンドでシステム設定の特定のパネルを開く方法


## システム設定を開く

ターミナルからシステム設定を開くには以下のコマンドを実行します。

```terminal
open -a "System Settings"
```

または

```terminal
open "/System/Applications/System Settings.app"
```

システム設定の「一般」パネルが開きます。

## 特定のパネルを開く

以下のようにすると特定のパネルを指定して開けます。

```terminal
open "/System/Library/PreferencePanes/パネル.prefPane"
```

「外観」パネルを開く場合は次のようになります。

```terminal
open "/System/Library/PreferencePanes/Appearance.prefPane"
```

指定できるパネルの一覧は`ls /System/Library/PreferencePanes/`で取得できます。

```terminal
$ ls /System/Library/PreferencePanes/
Accounts.prefPane/                 Mouse.prefPane/
Appearance.prefPane/               Network.prefPane/
AppleIDPrefPane.prefPane/          Notifications.prefPane/
Battery.prefPane/                  Passwords.prefPane/
Bluetooth.prefPane/                PrintAndFax.prefPane/
ClassKitPreferencePane.prefPane/   PrintAndScan.prefPane/
ClassroomSettings.prefPane/        Profiles.prefPane/
DateAndTime.prefPane/              ScreenTime.prefPane/
DesktopScreenEffectsPref.prefPane/ Security.prefPane/
DigiHubDiscs.prefPane/             SharingPref.prefPane/
Displays.prefPane/                 SoftwareUpdate.prefPane/
Dock.prefPane/                     Sound.prefPane/
EnergySaver.prefPane/              Speech.prefPane/
EnergySaverPref.prefPane/          Spotlight.prefPane/
Expose.prefPane/                   StartupDisk.prefPane/
Extensions.prefPane/               TimeMachine.prefPane/
FamilySharingPrefPane.prefPane/    TouchID.prefPane/
InternetAccounts.prefPane/         Trackpad.prefPane/
Keyboard.prefPane/                 UniversalAccessPref.prefPane/
Localization.prefPane/             Wallet.prefPane/

```
【超コンパクト】UART to Ethernet変換モジュール「PP-Ethernet-UART-MINI」紹介

# 【UART to Ethernet】PP-Ethernet-UART-MINIでシリアル機器を簡単にネットワーク化する方法

シリアル（UART）機器をEthernet対応にしたいと思ったことはありませんか？

Platypusの「PP-Ethernet-UART-MINI」は、UARTインターフェースを持つ既存機器を、シンプルな設計でEthernetネットワークに対応させることができる小型変換モジュールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077151/3cf0c363-9e4f-49eb-9ee1-2805c4277f0c.png)


---

## 特徴（主な機能）

- **UART ↔ Ethernet 双方向変換**  
- 10/100Mbps Ethernet 対応  
- 最大 921.6kbps のシリアル通信速度  
- ATコマンドによる設定制御  
- 設定ツール（GUI）・Web UI あり  
- 固有のMACアドレスを内蔵  
- 消費電流：50〜150mA / 動作温度：-40～85℃

---

## 接続構成とインターフェース

以下のような構成でUARTデバイスをネットワークに接続可能：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077151/1dc8cb7c-ddec-44d9-9304-e712b1246618.png)


- UART：TX / RX / RTS / CTS  
- Ethernet：10/100Base-T（RJ-45）  
- 外部制御ピン：RESET, RP_BOOT など

---

## 🛠 設定方法

以下の3つの方法で設定可能です：

1. **Configuration Tool（GUI）**  
2. **ATコマンド（UART経由）**  
3. **Web設定ページ（ブラウザからアクセス）**

ユーザーマニュアルはこちら：  
[PP-Ethernet-UART-MINI マニュアル（PDF）](https://drive.google.com/file/d/11ET3biszUvpxu2DGhvO3T3xeXGgFL11p/view)

---

## 拡張設計：RS-232 / RS-485 / RS-422

オプションとして以下のモードにも対応しています：

- RS-232モード：CSピンをGND  
- RS-485 / RS-422モード：CSピンをHIGH、外部トランシーバ回路が必要  
- RTSピンの制御で方向設定も可能

これにより、産業用プロトコルや長距離通信にも柔軟に対応できます。

---

## 活用例

- 組み込みセンサーデバイスのEthernet化  
- Modbusシリアル機器との通信ブリッジ  
- データロガーとクラウド間の中継モジュールとして  
- MQTTによるデータ送信機器の開発用にも

---

## 製品概要

- 製品名：**PP-Ethernet-UART-MINI**  
- メーカー：Platypus  
- 製品ページ：[PP-Ethernet-UART-MINI](https://jp.us-platypus.com/25/?idx=38)

---

## おわりに

PP-Ethernet-UART-MINI は、**ファームウェアとMACがあらかじめ書き込み済み**で、すぐに開発・量産に使える便利なUART-Ethernet変換モジュールです。

シリアル機器のネットワーク化でお困りの方、ぜひ一度試してみてください！

質問・コメント歓迎です 😊
コンビネータ論理：抽象化2 Exercise 2.26

[コンビネータ論理](https://qiita.com/Trubetzkoy/items/453cbc556fa2906210d7)を学んでいて、練習問題で結構難しかったので、メモ。
参考にしているのは下記の書籍：

https://amzn.to/3F1l7iV

[Lambda-Calculus and Combinators:An Introduction PDF](https://api.pageplace.de/preview/DT0400.9780511410963_A23678190/preview-9780511410963_A23678190.pdf)

### 定義 2.18（抽象化）

(a)$\ [x].M\equiv KM$ if $x\in FV(M)$
(b)$\ [x].x\equiv I$
(c)$\ [x].Ux\equiv U$ if $ x\notin FV(U)$
(f)$\ [x].UV\equiv S([x].U)([x].V)$もし(a)も(c)も適用できない場合。

### 練習問題 2.26*
$[x,y,z].y(xz)$
上式は以下のようになるので
$\equiv [x].([y].([z].y(xz)))$

#### 一番内側の式は[z]について抽象化。
$[z].y(xz)\equiv S([z].y)([z].xz)$
$\equiv S(Ky)(S([z].x)([z].z)$
$\equiv S(Ky)(S(Kx)I)$
となる。

検証のために$z$を適用してみると
$S(Ky)(S(Kx)I)z$
$\equiv(Ky)z(S(Kx)Iz)$
$\equiv y((Kx)z(Iz))$ by $(Ky)z\equiv z$ and $S(Kx)Iz\equiv (Kx)z(Iz)$
$\equiv y(xz)$ by $(x)z\equiv x$ and $Iz\equiv z$

$S(Ky)(S(Kx)I)z\rightarrow y(xz)$が示された。

#### 更に[y]で抽象化
$[y].([z].y(xz))$
$\equiv [y].(S(Ky)(S(Kx)I))$
$\equiv S\underbrace{([y].S(Ky))}\underbrace{([y].S(Kx)I)}$
二項目は
$[y].S(Ky)$
$\equiv S([y].S)([y].Ky)$ by (f)
$\equiv S(KS)K$
三項目は
$[y].S(Kx)I$
$\equiv K(S(Kx)I)$
合わせて、
$[y].(S(Ky)(S(Kx)I))\equiv S(S(KS)K)(K(S(Kx)I))$
元の式になっているので、検証できた。

検証のためにyを右から適用してみる。
$S(S(KS)K)(K(S(Kx)I))$
$\equiv S(KS)K)y[K(S(Kx)I)y]$
$\equiv (KS)y(Ky)[S(Kx)I]$
$\equiv S(Ky)[S(Kx)I]$

#### 最後に[x]で抽象化
$[x].S(S(KS)K)(K(S(Kx)I))y$
$\equiv S\underbrace{([x].S(S(KS)K))}\underbrace{([x].K(S(Kx)I))}$ by (f)
二項目は、
$[x].S(S(KS)K)$
$\equiv K(S(S(KS)K))$
三項目は、
$[x].K(S(Kx)I)$
$\equiv S([x].K)([x].S(Kx)I)$
$\equiv S(KK)(S\underbrace{([x].K)}\underbrace{([x].S(Kx)I)})$
ここで
$(S([x].K)\equiv KK$
$([x].S(Kx)I)$
$\equiv S([x].S(Kx))([x].I)$
$\equiv S(S([x].S)([x].Kx))(KI)$
$\equiv S(S(KS)K)(KI)$
従って三項目
$[x].K(S(Kx)I)$
$\equiv S(KK)(S(KK)(S(S(KS)K)(KI)))$

全体の式
$[x].S(S(KS)K)(K(S(Kx)I))$
$\equiv S(K(S(S(KS)K)))(S(KK)(S(KK)(S(S(KS)K)(KI))))$

検証のためにxを右から適用すると
$S\underbrace{(K(S(S(KS)K)))}
\underbrace{(S(KK)(S(KK)(S(S(KS)K)(KI))))}x$
$(K(S(S(KS)K)))x[(S(KK)(S(KK)(S(S(KS)K)(KI)))x]$
最終的に
$\equiv S(S(KS)K)(K(S(Kx)I))$となるので、検証できた。

変数の順序が入れ替わっているだけなのに、こんな複雑な式になるのは不思議だ。
【初心者】AWS認定クラウドプラクティショナー（CLF-C02）学習まとめ

# はじめに
基本はRailsの学習を行っていますが少しずつAWSについても少しづつ学習してますので
かなりの後追いにはなりますが投稿していこうと思います。

まずは、受験予定の試験、「AWS認定クラウドプラクティショナー（CLF-C02）」の
概要と分野1～4の詳細について整理します。

## 📘 試験概要
AWS認定クラウドプラクティショナーは、クラウドの基本的な概念やAWSの主要サービス、セキュリティ、料金体系などの広範な基礎知識を問う試験です。

## 🌩️ 第1分野：クラウドのコンセプト（24%）
| 項目         | 解説                                 |
| ---------- | ---------------------------------- |
| クラウドの利点    | コスト削減、スピード、スケーラビリティ、弾力性、グローバル展開など  |
| オンプレミスとの違い | 物理サーバー管理不要、従量課金、事前キャパシティ計画が不要      |
| クラウドの種類    | パブリック（例：AWS）、プライベート、ハイブリッド         |
| デプロイモデル    | オンプレミス、クラウド、ハイブリッド（例：AWS Outposts） |
| 設計原則       | 障害前提設計、疎結合、スケーラブル設計、自動化の活用         |

## 🔐 第2分野：セキュリティとコンプライアンス（30%）
| 項目           | 解説                                                 |
| ------------ | -------------------------------------------------- |
| 責任共有モデル      | AWS：インフラまでのセキュリティ、ユーザー：データと設定のセキュリティ               |
| IAM          | ユーザー・グループ・ロール・ポリシーによるアクセス管理                        |
| MFA（多要素認証）   | パスワード＋追加認証手段でセキュリティ強化                              |
| AWS Artifact | コンプライアンス証明書を取得可能                                   |
| 暗号化          | データ保存時（例：S3）、送信時（例：HTTPS）                          |
| ログと監視        | CloudTrail（操作ログ）、CloudWatch（監視）、AWS Config（構成監視）など |

## 🧱 第3分野：クラウドテクノロジーとサービス（34%）
| カテゴリ      | 代表サービス                                      |
| --------- | ------------------------------------------- |
| グローバルインフラ | リージョン、アベイラビリティゾーン（AZ）                       |
| コンピュート    | EC2（仮想サーバー）、Lambda（FaaS）                    |
| ストレージ     | S3（オブジェクト）、EBS（ブロック）                        |
| データベース    | RDS（リレーショナル）、DynamoDB（NoSQL）                |
| ネットワーク    | VPC、CloudFront（CDN）                         |
| デプロイ支援    | Elastic Beanstalk（PaaS）、CloudFormation（IaC） |
| 可用性設計     | マルチAZ、オートスケーリング、ELB（負荷分散）                   |

## 💰 第4分野：請求、料金、およびサポート（12%）
| 項目       | 解説                             |
| -------- | ------------------------------ |
| 料金体系     | 従量課金、リザーブドインスタンス、Savings Plans |
| 見積もりツール  | AWS Pricing Calculator         |
| アカウント管理  | AWS Organizationsで一括管理可能       |
| コスト管理ツール | Cost Explorer、Budgets、アラート設定など |
| サポートプラン  | ベーシック、開発者、ビジネス、エンタープライズ        |

## ✏️ まとめ
AWSクラウドの基本概念から、主要なサービス、セキュリティ対策、課金体系まで広く浅く理解することが重要です。特に、責任共有モデル、主要サービス、料金プラン、セキュリティ対策は重点項目です。
【IT DIY】生成AIで自動観光案内【Python×GPS×Gemini×VOICEVOX】

# はじめに
## やることをひとことで
常時BGMを再生し，ボタンを押された際に現在地点の観光案内を流すシステムを作ります．
移動中にポチして勝手にﾆﾔﾆﾔ楽しむことを想定しています．
<iframe width="560" height="315" src="https://www.youtube.com/embed/A3jkdPXgZLs?si=QsNwS1ELrXcj5g_g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 動機&目的
散歩をしている最中に周囲の施設を見て「ここ何だろう？」と思うことが多いのですが，その度にスマホで地図を開くのが面倒に思いました．
そこで，「その土地のことを何でも教えてくれる，おせっかいで噂好きな地元の人」に相当する存在を作ることにしました．
まだ出来ていませんが，最終的には「常時BGMを流しておき，名所などの面白地点に近づいたときに，自動的に案内を放送してくれるシステム」を作りたいと思っています．
## 作成コードについて
こちらに公開しています．ご自由にお持ちください～
https://github.com/kazunosuke1108/tourist_guide
pathの管理などは結構適当なので，あまり期待しないでください...
ご不明点はいつでもご連絡ください．

# 方法
## 準備
今回の実装環境です．
- Laptop PC
    - Windows 11 Home
    - AMD Ryzen™ 7 7735Uプロセッサー（音声合成でCPUを使うので一応記載）
- Python
    - Python 3.10.8
    - Anaconda環境
- Gemini
    - この辺りを参考に，API keyを取得しておきます
    https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=python
- VOICEVOX
    - この辺りを参考に，GUIアプリを使えるようにしておきます
    https://voicevox.hiroshiba.jp/
::: note
- 再生する音楽のダウンロード等はご自身で実施し，適宜pathを書き換えるようにお願いします．
:::

## コーディング
### 1. 現在地の取得

`get_geo_info.py`では、Windowsの位置情報APIを使って現在地を取得します。
`asyncio`で非同期処理してます。
HeartRailsのAPIで地名（県・市・町）まで引っ張ってきます。

```python
from get_geo_info import getGeoInfo

geo = getGeoInfo()
lat, lng, loc = geo.get_geo_info()
```

---

### 2. 観光案内文の生成（by Gemini）

地名が取れたら、Geminiでその場所の観光紹介文を1文だけ生成します。
モデルには `gemini-2.0-flash` を使っていますが，ちょくちょく間違えます。

```python
from get_introduction import get_introduction

text = get_introduction(loc)
print(text)  # 例：「東京タワーは夜景がとても綺麗です。」
```

---

### 3. VOICEVOXで音声合成

生成された観光文を、VOICEVOXエンジン（ローカルで動作）で `.wav` ファイルに変換します。

```python
from talk import talk

talk.generate_wav(text, speaker=1, filepath='./audio.wav')
```

※ VOICEVOXエンジンが起動済み＆ポート50021で待ち受けている必要があります。VOICEVOXのGUIアプリを立ち上げておけばOKです．

---

### 4. 地図の画像を用意

SeleniumとFoliumで、現在地にマーカーをつけた地図をレンダリング → 画面キャプチャして、画像ファイルとして保存します。
この辺りは完全に[天の声](https://chatgpt.com/)にお任せしました．

```python
import folium
from selenium import webdriver

# 中略
folium.Map(...).save("map.html")
driver.get("file://" + os.path.abspath("map.html"))
driver.save_screenshot("map_capture.png")
```

---

### 5. 音声＋地図を再生＆表示

`pygame`を使って、BGMを流しつつ、観光ガイド音声を再生！地図画像も同時に表示されます。
再生が終わったらBGMの音量が元に戻ります。

---

### 6. ボタンで全部まとめて動かす（Tkinter）

「現在地案内を再生」ボタンを押すと、↑の流れが一通り自動で実行されます。
非同期スレッドで動かしてます。

---

## おわりに

### まとめ

- 現在地を取得して  
- 観光ガイド文を生成して  
- 音声化して  
- 地図と一緒に再生する  

という一連の流れを、自分のPCで完結する形で作りました。

### 今後のToDo
- ボタンを押したタイミングではなく，近くに観光案内すべき場所があるときに案内する
- ユーザの進路に応じて，「右に見えますのは～」的案内を入れる

---

## 参考文献

- [VOICEVOX](https://voicevox.hiroshiba.jp/)  
- [Gemini API](https://ai.google.dev/gemini-api/docs/quickstart?hl=ja)  
- [Folium](https://python-visualization.github.io/folium/)  
- [Pygame](https://www.pygame.org/docs/)  
- [Tkinter](https://docs.python.org/ja/3/library/tk.html)