以下の内容はhttps://sabakunotabito.hatenablog.com/entry/2025/01/31/003418より取得しました。


古のゴーレムに、再び命を ~PythonからC++へ、魂の移植秘儀~

このオアシスの水は、少々奇妙な味がする。成分(ソースコード)を詳しく調べてみる必要がありそうだ。

以前、私はPythonという軽やかな呪文で、手軽に動作するRedfishシミュレータを創り出した。しかし、真の探求者は、安住の地に留まらない。今回は、その魂を、あえてC++という古の言語で造られた、新たなゴーレムに移植するという、無謀とも思える挑戦の記録である。

「なぜ、動くものをわざわざ書き直すのか?」 その問いはもっともだ。かつてC++というゴーレムは、あまりに巨大で、動かすには難解な儀式と膨大な時間を要した。 しかし、時代は変わった。VS Codeという魔法の工房、POCOという名の万能部品、そしてGitHub Copilotという名の精霊の助けがあれば、C++でもPythonに劣らぬ手軽さで、力強いゴーレムを創り出せるのだ。

さあ、WSL2 Ubuntuという名の祭壇で、古のゴーレムに再び命を吹き込む、現代の移植秘儀をご覧に入れよう。

この羊皮紙のあらまし

この羊皮紙が導く者

  • かつてC++というゴーレムの巨大さに挫折したが、もう一度その心臓に触れてみたいと願う者
  • C++のPOCOフレームワークという、万能部品の数々に興味がある探求者
  • Pythonなどで創り出した魂を、より力強いC++の器に移し替えることに関心がある錬金術

魂の器を選ぶ儀式:POCOフレームワークという選択

C++という広大な砂漠では、どの部品を相棒に選ぶかが旅の運命を左右する。我々が選んだのは、多機能かつ堅牢なPOCO (POrtable COmponents) C++ Librariesだ。

pocoproject.org

POCOを選ぶ最大の理由は、Webサーバー機能をはじめとする豊富な機能に加え、スマートポインタという名の魔法により、我々をメモリ管理という悪夢から解放してくれることにある。もはや、deleteの呼び忘れという呪いに怯える必要はない。

冒険の準備:祭壇を整える

まずは、WSL2 Ubuntuという祭壇に、儀式に必要な道具を揃える。

# C++コンパイラやmakeなどの基本の祭具
sudo apt install build-essential
# ビルドの儀式を司るCMake
sudo apt install cmake
# 魂の器となるPOCO C++ Libraries
sudo apt install libpoco-dev

道に迷わぬための地図としてGoogle C++ スタイルガイド」を携えれば、準備は万端だ。

ttsuki.github.io

ゴーレムを組み上げる儀式:ビルド

ビルドにはCMakeを使う。VS Codeという魔法の工房を使えば、ビルドもデバッグも、もはや黒い画面との睨み合いではない。ボタン一つで、エラー箇所へ瞬時に飛べる快適な旅が待っている。

VS Codeならビルドもデバッグも快適

魂の設計図:全ソースコード解説

今回のゴーレムは、たった2枚の羊皮紙だけで構成される。

  • webserver.cc: ゴーレムの心臓部
  • CMakeLists.txt: 組み立ての指示書

webserver.cc:心臓部の構造

POCOを使ったWebサーバーは、ある程度決まった「お作法」に沿って実装する。この形を一度覚えてしまえば、様々な応用が可能だ。Python版と同様、まずは手軽に動かすことを目指し、Redfishの各URIに対応するJSONデータは、std::mapにベタ書きしている。

#include <iostream>
#include <map>
// ... (中略) ...
#include <Poco/JSON/Parser.h>

// Redfishのデータを管理するクラス
class RedfishManager
{
public:
    std::string getJsonForUri(const std::string &uri)
    {
        // Python版と同様、お手軽にmapでデータを保持
        static const std::map<std::string, std::string> redfish_data = {
            {"/", R"({"Hello": "Redfish"})"},
            {"/redfish/v1", R"({"Name":"Root Service", ...})"},
            {"/redfish/v1/Systems", R"({"@odata.type":"#ComputerSystemCollection...", ...})"},
            // ... (膨大なデータのため、大部分を省略) ...
            {"/redfish/v1/Systems/437XR1138R2/SecureBoot/SecureBootDatabases/PKDefault", R"({"Name":"PKDefault - Default Platform Key", ...})"},
        };

        auto it = redfish_data.find(uri);
        return (it != redfish_data.end()) ? it->second : R"({"Error":"Unknown URI."})";
    }
};

// ... (中略:RequestHandler, Factory, WebServerクラスは記事の通り) ...

POCO_SERVER_MAIN(WebServer) // main()関数を自動生成するマクロ

CMakeLists.txt:組み立ての指示書

VS Codeと連携し、モダンなC++の機能を有効にするためのビルドスクリプトだ。

cmake_minimum_required(VERSION 3.20)
project(webserver CXX)

# C++20を有効化
set(CMAKE_CXX_STANDARD 20)
# ... (中略) ...

# 実行ファイルの定義
add_executable(webserver webserver.cc)

# POCOライブラリとのリンク
target_link_libraries(webserver PRIVATE
    PocoFoundation PocoJSON PocoNet PocoUtil
)

魂の鼓動を確認する儀式:動作確認

ビルドしたゴーレムを起動し、別のターミナルからcurlで魂の声を聴いてみる。

# 起動
./build/webserver
# 魂の声を聴く
curl http://localhost:8001/redfish/v1

サーバー側のコンソールには、整形されたJSONが出力されるはずだ。

ゴーレムの心臓から発せられる声

さらに、クライアント側でjqという魔法の道具を使えば、その声を色付きで美しく聞くことができる。

jqで美しく整形された魂の響き

羊皮紙を巻く前に

Python版と同等の機能を、C++でも驚くほど手軽に実装できることがお分かりいただけただろうか。VS Codeを中心としたモダンな開発環境は、C++を「難解な専門言語」から、「誰でも気軽に楽しめる強力なツール」へと変えてくれた。

パフォーマンスが求められる場面ではC++を、素早いプロトタイピングではPythonを。適材適所で言語を選べる引き出しを持つことは、我々探求者にとって大きな武器になる。特に、GitHub Copilotのような精霊の存在は革命的だ。彼は、我々の旅を導く最高の教師にもなってくれる。

今回の羊皮紙が、あんたの新たなC++への旅のきっかけとなれば幸いだ。

そろそろ干し肉に火を通す時間か。この話の続きは、また次の野営地で。

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

ラクダの独り言

この前、軽やかな呪文でヒョイっと創ったゴーレムを、今度はわざわざ石くれ(C++)からこね直しているらしい。やれ「儀式だ」の「魂だ」の言って、やけに組み立てに時間がかかっているぜ。前のやつの方が静かで早かったと思うんだがな。結局、どっちのゴーレムも、俺の代わりに荷物を運んじゃくれねえんだ。やれやれだぜ。




以上の内容はhttps://sabakunotabito.hatenablog.com/entry/2025/01/31/003418より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14