たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

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

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

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

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

この羊皮紙のあらまし

この羊皮紙が導く者

  • PythonのFastAPIという、モダンな錬金術に興味がある魔法使い
  • RedfishのようなRestAPIの幻影を自らの手で創り出してみたいと願う者
  • 実機という名の遺跡がなくとも、冒険を始めたいと願う全ての探求者
  • 開発環境でAPIテストを繰り返し行いたい実践的な技術者
  • 再帰処理による効率的なデータ収集手法を学びたい探求者

砂漠の道標

  • Redfish - サーバー管理のための標準規格。RESTful APIでハードウェア情報を取得・制御できる。
  • シミュレータ - 実際の機器を模倣する仮想環境。開発やテストに使用する。
  • Python - シンプルで読みやすいプログラミング言語。Web開発や機械学習で広く使われる。
  • FastAPI - Pythonの高速Webフレームワーク。REST APIの構築に特化している。
  • WSL2 - Windows Subsystem for Linux 2。Windows上でLinuxを動かす仮想環境。
  • 仮想環境 - Pythonパッケージを独立して管理する仕組み。プロジェクト間の干渉を防ぐ。
  • JSON - JavaScript Object Notationの略。データ交換用の軽量テキスト形式。
  • 再帰 - 関数が自分自身を呼び出す処理。階層構造の探索に有効。
  • @odata.id - Redfish内でリソースへのリンクを示す特殊なキー。これを辿って全体構造を把握する。

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

まずはWSL2 Ubuntuという祭壇に、儀式に必要な道具を揃える。 Pythonの仮想環境(独立した実行環境)という結界を張り、pip(パッケージ管理ツール)という名の魔法の袋に、fastapiuvicorn(Webサーバー)という二つの魂の素を収める。

# 結界を張る
$ 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という広大な遺跡の完全な地図を手に入れることができる。

FastAPIシミュレータの優れた点

  1. 軽量性と即応性 - 数十行のコードで本格的なAPI環境を構築できる圧倒的な手軽さ。
  2. 再帰処理による完全探索 - @odata.idを辿る再帰の魔法により、階層構造を自動的に全探索できる。
  3. 実機不要の開発環境 - 高価なサーバを持たずとも、完璧な訓練相手を手に入れられる。
  4. 理解の深化 - 幻影を創る過程でRedfish規格そのものへの理解が飛躍的に深まる。

まとめ

これでRedfishビューワという次なる冒険のための完璧な訓練相手が手に入った。 仕事の砂嵐が止んだら、いよいよ本格的な鎧の錬成に取り掛かるとしよう。 この幻影のゴーレムが、未来の錬金術師たちの道標となることを願って。

どうやらインクが切れそうだ。 今日の記録はここまでにして、道具の手入れでもするとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

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