砂漠の旅人(たびと)|新天地:たびとの旅路

電脳砂漠を旅する、ある旅人の日記。フロッピーを頼りに歩いた日から、クラウドの地平を見つめる今日まで。見つけたオアシスも、迷い込んだ砂の迷宮も、全てこの羊皮紙に。

幻影のゴーレムを錬成せよ ~PythonとFastAPIで創る、Redfishシミュレータ~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

Redfishという、広大にして難解な古代遺跡。その全貌を解き明かすための魔法の眼鏡(ビューワ)を創る前に、私はまず、いつでも呼び出して対話できる、その完璧な「幻影(シミュレータ)」を錬成する必要があった。

情報の砂漠を彷徨い、私が見つけ出したのは、PythonとFastAPIという、驚くほど軽やかで強力な錬金術だった。WSL2 Ubuntuという名の祭壇で、わずかな呪文を唱えるだけで、本物と見紛うほどの精巧なゴーレムを創り出せるのだ。これは、その驚くほど簡単な錬成儀式の全てを記した、未来の錬金術師のための魔導書である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • PythonのFastAPIという、モダンな錬金術に興味がある魔法使い
  • RedfishのようなRestAPIの幻影を、自らの手で創り出してみたいと願う者
  • 実機という名の遺跡がなくとも、冒険を始めたいと願う全ての探求者

第一の儀式:祭壇の準備(FastAPIインストール)

まずは、WSL2 Ubuntuという祭壇に、儀式に必要な道具を揃える。 Pythonの仮想環境という結界を張り、pipという名の魔法の袋に、fastapiuvicornという二つの魂の素を収める。

# 結界を張る
$ 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の記録(芋づる式取得の原型)

ラクダの独り言

ご主人が「しみゅれーた」とかいう、本物そっくりの幻のゴーレムを創り出して、一人で悦に入っている。俺に言わせりゃ、幻だろうが本物だろうが、どうせ荷物は運んでくれねえんだ。そんなことより、目の前にいる本物の相棒(俺のことだ)に、もっと構ってほしいもんだぜ。おっと、足元にサソリがいやがった。危ない危ない。