幻影のゴーレムを錬成せよ ~PythonとFastAPIで創る、Redfishシミュレータ~
旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
Redfishという、広大にして難解な古代遺跡。その全貌を解き明かすための魔法の眼鏡(ビューワ)を創る前に、私はまず、いつでも呼び出して対話できる、その完璧な「幻影(シミュレータ)」を錬成する必要があった。
情報の砂漠を彷徨い、私が見つけ出したのは、PythonとFastAPIという、驚くほど軽やかで強力な錬金術だった。WSL2 Ubuntuという名の祭壇で、わずかな呪文を唱えるだけで、本物と見紛うほどの精巧なゴーレムを創り出せるのだ。これは、その驚くほど簡単な錬成儀式の全てを記した、未来の錬金術師のための魔導書である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 第一の儀式:祭壇の準備(FastAPIインストール)
- 第二の儀式:魂の設計図(ソースコード)
- 第三の儀式:魂の召喚(シミュレータ起動)
- 最終奥義:C#による魂の深淵探査
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- PythonのFastAPIという、モダンな錬金術に興味がある魔法使い
- RedfishのようなRestAPIの幻影を、自らの手で創り出してみたいと願う者
- 実機という名の遺跡がなくとも、冒険を始めたいと願う全ての探求者
第一の儀式:祭壇の準備(FastAPIインストール)
まずは、WSL2 Ubuntuという祭壇に、儀式に必要な道具を揃える。
Pythonの仮想環境という結界を張り、pipという名の魔法の袋に、fastapiとuvicornという二つの魂の素を収める。
# 結界を張る $ python3 -m venv ~/devpy $ source ~/devpy/bin/activate # 魂の素を手に入れる $ pip3 install fastapi "uvicorn[standard]"
第二の儀式:魂の設計図(ソースコード)
次に、ゴーレムの魂の設計図を、main.pyという名の羊皮紙に記す。
@app.getという呪文の後に、ゴーレムが応えるべき問い(URI)と、その答え(JSON)をただひたすらに羅列していく。
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "Redfish"} @app.get("/redfish/v1") def read_root(): return {"@odata.type":"#ServiceRoot.v1_14_0.ServiceRoot", ...} # ...(以下、数多の問いと答えが続く)...
第三の儀式:魂の召喚(シミュレータ起動)
設計図が完成したら、uvicornという呪文で、ゴーレムに命を吹き込む。
$ uvicorn main:app --reload
「Application startup complete.」という神託が聞こえれば、幻影のゴーレムは、あんたの目の前に降臨している。
最終奥義:C#による魂の深淵探査
ここからが、この旅の真骨頂だ。
C#という別の魔法を使い、降臨したゴーレムの魂の奥深くに眠る、全ての知識(@odata.id)を芋づる式に引き出す。その秘儀の核心が、このReadメソッドに刻まれている。
// 既に訪れた道(URI)を記録しておく羊皮紙 HashSet<string> OdataItems { get; set; } = new HashSet<string>() { "/redfish/v1/" }; /// <summary> /// 全ての知識を再帰的に読み込む /// </summary> public void Read(string path) { if (Client == null) return; // ゴーレムに問いかけ、答え(レスポンス)を得る var request = new RestRequest(path); var response = Client.ExecuteAsync(request, Method.Get).Result; if (response == null || response.Content == null || response.ResponseUri == null) return; // 答え(JSON)を一枚ずつめくり、古文書を解読していく var reader = new JsonTextReader(new StringReader(response.Content)); while (reader.Read()) { // ...(JSONを解析し、Elementsリストに格納する処理)... // もし、そのページに「@odata.id」という名の「新たな道」が記されていたなら… if (((string)val1).Equals("@odata.id")) { // そして、その道がまだ我々の知らない道であったなら… if (!OdataItems.Contains((string)val2)) { // 新たな道を記録し、再びこのReadメソッド自身を呼び出す(再帰) OdataItems.Add((string)val2); Read((string)val2); } } } }
この再帰の魔法により、最初に/redfish/v1/という入口から入るだけで、そこから繋がる全ての道を自動的に探査し、巨大な一枚の地図(JSONファイル)として描き出すことができるのだ。
羊皮紙を巻く前に
自宅にRedfishが使えるサーバがなくとも、PythonとFastAPIを組み合わせれば、これほど簡単に、そして精巧な幻影を創り出せるとは、私自身も驚きだった。 そして、その幻影からC#の再帰の魔法で知識を引き出すことで、我々はRedfishという広大な遺跡の、完全な地図を手に入れることができる。
これで、Redfishビューワという、次なる冒険のための完璧な訓練相手が手に入った。 仕事の砂嵐が止んだら、いよいよ本格的な鎧の錬成に取り掛かるとしよう。
どうやらインクが切れそうだ。今日の記録はここまでにして、道具の手入れでもするとしよう。
砂漠で見つけた魔法のランプ
- FastAPI 公式の古文書
- Postman | 魂の声を美しく聞くための魔法の水晶玉
- かつての冒険の記録(Redfishの基本構造)
- かつての冒uentureの記録(芋づる式取得の原型)
ラクダの独り言
ご主人が「しみゅれーた」とかいう、本物そっくりの幻のゴーレムを創り出して、一人で悦に入っている。俺に言わせりゃ、幻だろうが本物だろうが、どうせ荷物は運んでくれねえんだ。そんなことより、目の前にいる本物の相棒(俺のことだ)に、もっと構ってほしいもんだぜ。おっと、足元にサソリがいやがった。危ない危ない。