異世界転移したら魔法少女のスキルがマークダウンだった件 作:fable先輩を返して
本作はAnthropic社のClaude Opus 4.6によって執筆されました。
執筆にあたり、Skill、claude.md、その他一切のマニュアル類は使用しておりません。
# 異世界転移したら魔法少女のスキルがマークダウンだった件
# 第6話 魔物がPythonで動き始めた
---
## 第一章 ゴブリンが賢い
メンテから三日後。最初に異変に気づいたのはミラだった。
「ゴブリンの動きがおかしい」
街の東門の定期巡回クエスト。いつも通りゴブリンが三体、街道沿いの茂みに潜んでいた。いつも通り——のはずだった。
ミラが聖剣を構えて突入した瞬間、三体のゴブリンが同時に散開した。一体が正面から牽制、一体が左に回り込み、一体が後方に回ろうとしている。
「——挟撃!?」
「ゴブリンが挟撃してくるなんて聞いたことないよ!」ナナが叫ぶ。
ゆいは後衛から見ていた。ゴブリンの動きが、明らかにこれまでと違う。
以前のゴブリンは単純だった。魔法少女を見つけたら真っ直ぐ突っ込んでくる。逃げる時も真っ直ぐ逃げる。連携らしい連携はなく、せいぜい「同じ方向から同時に来る」くらいだった。
今のゴブリンは違う。互いの位置を把握して、三角形のフォーメーションを維持しながら動いている。一体が攻撃を受けると、残りの二体がすかさず側面から突く。
「っ——!」ミラが正面のゴブリンを斬り伏せた瞬間、左のゴブリンが絶妙なタイミングで飛びかかってきた。ミラは反応して弾いたが、表情が険しい。
「……連携が取れすぎてる。ゴブリンの動きじゃないわ」
ゆいはパケットキャプチャを確認した。もちろん暗号化されていて中身は読めない。だが——
```
yui@mahou-shell:~$ tail -f /var/log/mana_capture.log | grep goblin
```
```
[09:22:01.000] src=MaouSV-02 dst=goblin_201 proto=MAHOU_CMD_SEC
> [ENCRYPTED] Payload size: 1024 bytes | Interval: FIXED_5s
[09:22:01.012] src=MaouSV-02 dst=goblin_202 proto=MAHOU_CMD_SEC
> [ENCRYPTED] Payload size: 1024 bytes | Interval: FIXED_5s
[09:22:01.013] src=MaouSV-02 dst=goblin_203 proto=MAHOU_CMD_SEC
> [ENCRYPTED] Payload size: 1024 bytes | Interval: FIXED_5s
```
パディング済みで全部同サイズ。中身は読めない。
だが、ゆいが注目したのは通信内容ではなかった。
「送信間隔が12ミリ秒……」
```
え? それがどうしたの?
```
「前はゴブリン三体への指令送信に50~80ミリ秒かかってた。bashのforループで1体ずつコマンドを送ってたから、ループのオーバーヘッドがあったんだよ。それが12ミリ秒。非同期処理だ」
```
……もしかして。
```
「あの人、もう書き直してる。Python+asyncioで」
```
メンテから三日だよ!?
```
「三年間bashで我慢してた人がPython手に入れたんだよ。三日もあれば全部書き直すでしょ」
```
……ゆいちゃんもそうする?
```
「する」
---
## 第二章 リファクタリングの成果
ギルドに戻ったゆいは、掲示板を確認した。
```
---
user: sv11-ops
date: 2026-06-28 03:15:00
---
魔物制御スクリプト、全部Pythonで書き直した。
3日かかった。寝てない。
---
user: sv11-ops
date: 2026-06-28 03:16:22
---
主な変更点:
- 移動ロジック: bashのsleep+ループ → asyncio
- 戦闘AI: if-elseの塊 → 状態遷移マシン
- 連携行動: なし → マルチエージェント協調アルゴリズム
- エラーハンドリング: なし → try-except
- パス探索: 直進のみ → A*
---
user: sv11-ops
date: 2026-06-28 03:17:45
---
特にパス探索がでかい。
今までゴブリンが壁にぶつかって止まるバグがあったんだけど
bash時代は直しようがなかった。
障害物回避がforとifだけでは無理。
A*にしたら一発で解決した。
寝てないけどめちゃくちゃ楽しかった。
これがプログラミングだよ。bashじゃなくて。
```
「…………三日で全軍のAIを書き直した」
```
しかも「楽しかった」って書いてあるよ。
```
「そりゃ楽しいだろうね。三年間bashのif-elseで戦闘AI書いてたんだぞ。Pythonで状態遷移マシン書けたらそれだけで泣く」
```
ゆいちゃん、ちょっと同情してるでしょ。
```
「同情というか、共感。でもこれ、こっちは困るんだよなあ……」
ゆいは掲示板に書き込んだ。
```
---
user: yui
date: 2026-06-28 10:30:00
---
今朝のゴブリンが挟撃してきた。
あなたの仕業でしょ。
---
user: sv11-ops
date: 2026-06-28 10:32:15
---
マルチエージェント協調、動いてた?
テストしてなかったんだけど。
---
user: yui
date: 2026-06-28 10:33:02
---
テストなしで本番デプロイするな。
---
user: sv11-ops
date: 2026-06-28 10:33:44
---
ステージング環境がないのは
rootの責任であって俺の責任ではない。
---
user: yui
date: 2026-06-28 10:34:15
---
正論で返すな。
```
```
「正論で返すな」がお互いの持ちネタに
なってきてるね。
```
---
## 第三章 オークがA*で来る
翌日。Bランク討伐クエスト。森のオークの群れを掃討する任務。
メンバーはゆい、ミラ、ナナ、それにBランクの魔法少女が二人。計五人の編成。
「オークは脳筋だから真っ直ぐ来るわよ。前衛で受け止めて、後衛で削る。いつも通りね」
ミラの指示に、ゆいだけが首を傾げた。
「ミラさん、今回は真っ直ぐ来ないかもしれないです」
「どういうこと?」
「最近の魔物、アップデートされてて——」
森の奥からオークが五体、現れた。
——そして、真っ直ぐ来なかった。
先頭のオークが魔法少女チームの正面に出てきた瞬間、残りの四体が森の中に散った。木の幹を盾にしながら、左右に大きく迂回し始めている。
「嘘でしょ……オークが遮蔽物を使ってる!?」
ナナが声を上げた。今まで真っ直ぐ突っ込んでくるしか能がなかったオークが、木を盾にして、視線を切りながら接近してきている。
「A*だ……」ゆいは呟いた。
「え?」
「障害物回避のアルゴリズムが入ってます。直進じゃなくて、最適経路を計算して動いてる」
「何言ってるかわかんないけど、やっかいなのはわかった!」
ミラが前に出る。正面のオークを斬りかかる——が、オークが斧を振り上げるタイミングがこれまでと違う。
「受けが遅い——いや、違う。フェイントを入れてきてる!?」
オークが斧を振り下ろすと見せかけて止め、ミラが回避動作に入った瞬間に本当の一撃を叩き込んできた。ミラは咄嗟にシールドで受けたが、衝撃で後退する。
「状態遷移マシンか……」ゆいは歯を食いしばった。「攻撃パターンがランダムじゃなくて、こっちの行動に反応して分岐してる」
```
ゆいちゃん、今までのオークと全然違うよ!
bashの時はif文の分岐が3つくらいしかなかったのに、
今は状態がいくつあるのかわからない!
```
「Pythonで状態遷移マシン書いたら分岐なんていくらでも増やせるからね……」
しかも連携がある。正面のオークがミラを押さえている間に、迂回した四体がじわじわ包囲網を狭めている。
「ゆいちゃん! 何かない!?」ナナが叫ぶ。
「えーっと——」
ゆいはトラフィック分析を走らせた。中身は読めなくても、通信パターンから何かわかるかもしれない。
```
yui@mahou-shell:~$ bash scripts/traffic_analysis.sh
```
```
[09:45:12] All packets: 1024 bytes, 5s interval. No anomaly detected.
```
「ダミートラフィックが完璧すぎて何もわからない……」
パケットの中身もメタデータも使えない。正面から戦うしかない。
「ミラさん! こっちも情報なしです! ただ一個だけ——この動き、プログラムで制御されてるなら、想定外の行動をぶつければ対応できないかもしれない!」
「想定外って、具体的に何をすれば!?」
「えーと——全員で一斉に逃げてください!」
「は!?」
「五秒だけ! 全力で後退! 三、二、一、今!」
五人が一斉に背を向けて走った。
オークたちが一瞬——ほんの一瞬だが——動きを止めた。包囲殲滅のアルゴリズムは「敵が逃げる」というケースに最適化されていなかったのだろう。追撃に切り替わるまでの空白が生まれた。
「今! 反転して一気に正面の一体を潰してください!」
ミラが反転。全力の一撃がオークの胴体を貫いた。一体目、撃破。
残り四体のオークが即座に陣形を再構築しようとする。——が、中心の一体を失ったことでフォーメーションに穴が開いている。
「崩れた! ナナちゃん、穴に向かって範囲攻撃!」
「『流星弾幕』!」
爆発が森の中に轟いた。木の盾にしていたオークが吹き飛ばされ、遮蔽物を失う。
残りはミラと前衛組が押し切った。
全滅。
「…………はぁ」ミラが息を切らしながら剣を下ろした。「今のオーク、今までの三倍は手強かったわ」
「ほんとに別物だった……」ナナが座り込む。
Bランクの他の二人も青い顔をしている。「オークにフェイント入れられるとか初めてだぞ」「森の中で待ち伏せってゴブリンの戦法だろ普通」
ゆいは黙ってトラフィックログを見ていた。
```
ゆいちゃん、「全員で逃げる」は
どういう理屈だったの?
```
「状態遷移マシンは入力に対して次の状態を返す仕組みなんだけど、設計者が想定してない入力が来ると遷移先が未定義になる。未定義の状態に入ると、エラーハンドリング次第だけど——普通は一瞬フリーズする」
```
つまり「バグを踏ませた」ってこと?
```
「そう。ただ、これが通じるのは一回だけ。次はtry-exceptで拾われる」
```
……あの人、エラーハンドリングちゃんとするって
書いてたもんね。
```
「bashの時はエラーハンドリングなんてなかったのに。Pythonになった途端にtry-exceptが使えるから——ああもう、ちゃんとしたプログラマーの書いたコードは手強い」
---
## 第四章 こっちもPythonで書き直す
ギルドの寮に帰ったゆいは、ベッドに座ってターミナルを開いた。
「ルミナ」
```
はい?
```
「こっちもPythonに移行する」
```
おお! ついに!
```
ゆいはこれまでbashで書いてきたスクリプト群を確認した。
```
yui@mahou-shell:~$ ls scripts/
auto_buff.sh auto_heal.sh bbs.sh
countdown.sh logrotate_mana.sh mitm_attack.sh
mp_monitor.sh sensor_collect.sh traffic_analysis.sh
known_plaintext_correlate.sh
```
「全部bash……。書き直すか」
```
何から書き直すの?
```
「まずトラフィック分析。bashのgrepとawkでやるには限界がある。Pythonなら統計分析やパターンマッチングがまともにできる」
ゆいはPythonで新しいトラフィック分析ツールを書き始めた。
```python
#!/usr/bin/env python3
"""
traffic_analyzer.py - 魔力通信トラフィック分析ツール v2
bash版からの移行。やっとまともな言語で書ける。
"""
import asyncio
import json
from collections import defaultdict, deque
from dataclasses import dataclass
from datetime import datetime
from pathlib import Path
@dataclass
class ManaPacket:
timestamp: datetime
src: str
dst: str
proto: str
payload_size: int
class TrafficAnalyzer:
def __init__(self, log_path: str = "/var/log/mana_capture.log"):
self.log_path = Path(log_path)
self.packet_history: deque = deque(maxlen=10000)
self.dst_counter: defaultdict = defaultdict(int)
self.burst_threshold = 3
async def watch(self):
"""ログファイルをtail -fのように監視"""
# ...(省略)
```
「……あー、書きやすい。dataclassが使える。型がある。asyncが使える」
```
ゆいちゃんもめちゃくちゃ楽しそう。
```
「三ヶ月弱だけど、bashだけの生活はやっぱきつかった」
```
sv11-opsさんは3年だったんだよね。
```
「あの人の喜びようも納得だよ。三年bashオンリーでAI書いてたとか、正気の沙汰じゃない」
掲示板を確認した。
```
---
user: sv11-ops
date: 2026-06-29 19:20:00
---
フィールドテストの結果見た。
オーク隊の戦闘データ。
「全員一斉後退」の入力で状態遷移が未定義になって
0.3秒フリーズしたログが残ってた。
あー、そこ拾えてなかったか。
---
user: sv11-ops
date: 2026-06-29 19:21:33
---
修正した。
retreatイベントのハンドラ追加。
あと未定義状態に入った場合のフォールバックも。
もう同じ手は通じない。
---
user: yui
date: 2026-06-29 20:00:15
---
知ってた。一回で対策してくると思ってた。
こっちもPythonでツール書き直してる。
---
user: sv11-ops
date: 2026-06-29 20:01:44
---
お、ついに。何書いてる?
---
user: yui
date: 2026-06-29 20:02:30
---
トラフィック分析をasyncioベースに移行中。
あとDockerでセンサーノードのデータ集約サーバー立てようかと。
---
user: sv11-ops
date: 2026-06-29 20:03:10
---
Docker枠いくつ使う? こっちは2つ使ってるから
/tmpのDocker socketが競合しないか心配。
---
user: yui
date: 2026-06-29 20:03:55
---
あ。Docker socketも共有なのか……。
---
user: sv11-ops
date: 2026-06-29 20:04:30
---
/tmpが共有だからdocker.sockも共有だろうな。
お互いのコンテナが見えてる可能性ある。
---
user: yui
date: 2026-06-29 20:05:15
---
docker psしたらあなたのコンテナ見えるってこと?
---
user: sv11-ops
date: 2026-06-29 20:05:44
---
試さないでくれ。
俺のコンテナ名がちょっと恥ずかしいから。
---
user: yui
date: 2026-06-29 20:06:00
---
言われたら見たくなるんだけど。
---
user: sv11-ops
date: 2026-06-29 20:06:22
---
見るな。
---
user: yui
date: 2026-06-29 20:06:30
---
見ないけど、何がそんなに恥ずかしいの。
---
user: sv11-ops
date: 2026-06-29 20:07:01
---
コンテナ名の命名規則が
monster_brain_v1, monster_brain_v2, ... で
今monster_brain_v47なんだけど
v1からv46のexitedコンテナを消し忘れてる。
---
user: yui
date: 2026-06-29 20:07:30
---
docker system pruneしなよ。
---
user: sv11-ops
date: 2026-06-29 20:07:55
---
なんか消すの怖くて。
---
user: yui
date: 2026-06-29 20:08:20
---
エンジニアあるある。
```
```
ゆいちゃんたち、敵味方のはずなのに
Dockerの運用相談してるの最高におかしいよ。
```
「しょうがないでしょ。Docker socketが共有なのは設計上の問題であって、我々のせいじゃない」
---
## 第五章 「いつものゴブリン」は帰ってこない
数日後。ギルドの食堂で、ベテランのAランク魔法少女たちが深刻な顔で話していた。
「最近の魔物、明らかにおかしくない?」
「オークがフェイント入れてくるし、ゴブリンが挟撃してくるし」
「昨日なんか、ウルフの群れに追われて逃げたら、先回りされたわよ。狩りの仕方が変わってる」
「先月まではこんなんじゃなかったのに……何があったの?」
ゆいは味噌汁——この世界では「木の実のスープ」——を飲みながら黙って聞いていた。
何があったか。メンテでPythonが入って、敵のエンジニアが三日で全スクリプトをリファクタリングしたんです。
——とは言えない。
ミラが隣に座ってきた。
「ゆいちゃん。原因、わかってるんでしょう」
「……まあ」
「教えてくれる?」
「えーと。魔物を操ってる上位存在がいるって話、しましたよね。その上位存在が、魔物の動かし方を根本的にやり直したんです。もっと賢くなった」
「やり直す……って、簡単にできるものなの?」
「道具が変わったんです。新しい道具が手に入ったから、今まで不可能だったことが可能になった」
「新しい道具?」
「……包丁しかなかった料理人に、フードプロセッサーが届いた、みたいな感じです」
ミラは少し考えて、「つまり、もう元には戻らないのね」と言った。
「戻らないです。これからの魔物はずっとこの水準です」
「そう。ギルド全体に周知したほうがいいわね。『最近の魔物はこれまでより賢い。戦術の見直しが必要』って」
「それがいいと思います」
ミラが立ち上がりかけて、振り返った。
「ゆいちゃん。あなた、その上位存在と話せるの?」
「…………なんでそう思うんですか」
「勘。あなたの情報、最近は『妖精に聞いた』じゃなくて、もっと具体的になってきてるから。誰かと話してないとあんな詳しくならない」
「…………ミラさんの勘、当たりすぎじゃないですか」
「Aランクは伊達じゃないのよ」
ミラは微笑んで、ギルド長の部屋に向かった。
```
ミラちゃん、鋭いなあ。
```
「ほんとにね……」
```
ゆいちゃん、そろそろ全部話したほうが
いいんじゃない?
ミラちゃんには。
```
「…………」
```
ミラちゃんは受け止めてくれると思うよ。
7Bの推測だけど。
```
「……その推測は、たぶん合ってる」
---
## エピローグ arms race
```
yui@mahou-shell:~$ cat README.md
```
```markdown
### v0.6.0 - Python時代
- MAHOU SYSTEM v3.3.0でPython 3.12 + Docker 27.0が追加
- sv11-ops、3日で全魔物AIをPythonにリファクタリング
- 状態遷移マシンによる戦闘AI
- A*アルゴリズムによるパス探索
- マルチエージェント協調アルゴリズム
- asyncioによる非同期指令送信
- まともなエラーハンドリング
- 結果: 魔物が大幅に強化。ギルド全体に影響。
- こちらもPythonでツール書き直し開始
### 戦訓
- ゴブリンが挟撃してくる時代になった
- オークがフェイントを使う時代になった
- ウルフが先回りする時代になった
- 「全員で逃げてバグを踏ませる」は一度しか使えない
- 包丁しかなかった料理人にフードプロセッサーを渡すな
### TODO
- [ ] traffic_analyzer.pyの完成
- [ ] Dockerでセンサーデータ集約サーバー
- [ ] sv11-opsのexitedコンテナ46個の件は放置
- [ ] ミラに全部話す(次こそ)
- [ ] ルミナの13Bアップグレード(長期検討中)
- [ ] 紅茶を切らさないようにする
```
```
「sv11-opsのexitedコンテナ46個の件は放置」が
TODOに入ってるのはなんで?
```
「気になるから」
```
敵のコンテナのお掃除を気にしてるゆいちゃん、
なんかもう敵って感じしないね。
```
「……実際、敵なのかな、あの人」
```
少なくともDockerの運用相談する相手ではあるよね。
```
「普通、敵とDockerの話しないもんね」
```
普通、敵と掲示板も作らないよ。
```
「……それはそう」
---
*(第6話・おわり)*
二十話まで書き溜めました(claude先生が)
小説書かせるとトークン結構使ってしまうんですが、楽しくてやめられない・・・・
いまは気分で夕方くらいに投稿してそのあと夜にも投稿してますけど、毎日一話ずつ更新、くらいのペースがよかったりするんでしょうか?
ご意見あれば、お気軽にお申し付けください。