このオアシスの水は、少々奇妙な味がする。成分(ソースコード)を詳しく調べてみる必要がありそうだ。
以前、私はPythonという軽やかな呪文で、手軽に動作するRedfishシミュレータを創り出した。しかし、真の探求者は、安住の地に留まらない。今回は、その魂を、あえてC++という古の言語で造られた、新たなゴーレムに移植するという、無謀とも思える挑戦の記録である。
「なぜ、動くものをわざわざ書き直すのか?」 その問いはもっともだ。かつてC++というゴーレムは、あまりに巨大で、動かすには難解な儀式と膨大な時間を要した。 しかし、時代は変わった。VS Codeという魔法の工房、POCOという名の万能部品、そしてGitHub Copilotという名の精霊の助けがあれば、C++でもPythonに劣らぬ手軽さで、力強いゴーレムを創り出せるのだ。
さあ、WSL2 Ubuntuという名の祭壇で、古のゴーレムに再び命を吹き込む、現代の移植秘儀をご覧に入れよう。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 魂の器を選ぶ儀式:POCOフレームワークという選択
- 冒険の準備:祭壇を整える
- ゴーレムを組み上げる儀式:ビルド
- 魂の設計図:全ソースコード解説
- 魂の鼓動を確認する儀式:動作確認
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- かつてC++というゴーレムの巨大さに挫折したが、もう一度その心臓に触れてみたいと願う者
- C++のPOCOフレームワークという、万能部品の数々に興味がある探求者
- Pythonなどで創り出した魂を、より力強いC++の器に移し替えることに関心がある錬金術師
魂の器を選ぶ儀式:POCOフレームワークという選択
C++という広大な砂漠では、どの部品を相棒に選ぶかが旅の運命を左右する。我々が選んだのは、多機能かつ堅牢なPOCO (POrtable COmponents) C++ Librariesだ。
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++ スタイルガイド」を携えれば、準備は万端だ。
ゴーレムを組み上げる儀式:ビルド
ビルドにはCMakeを使う。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という魔法の道具を使えば、その声を色付きで美しく聞くことができる。

羊皮紙を巻く前に
Python版と同等の機能を、C++でも驚くほど手軽に実装できることがお分かりいただけただろうか。VS Codeを中心としたモダンな開発環境は、C++を「難解な専門言語」から、「誰でも気軽に楽しめる強力なツール」へと変えてくれた。
パフォーマンスが求められる場面ではC++を、素早いプロトタイピングではPythonを。適材適所で言語を選べる引き出しを持つことは、我々探求者にとって大きな武器になる。特に、GitHub Copilotのような精霊の存在は革命的だ。彼は、我々の旅を導く最高の教師にもなってくれる。
今回の羊皮紙が、あんたの新たなC++への旅のきっかけとなれば幸いだ。
そろそろ干し肉に火を通す時間か。この話の続きは、また次の野営地で。
砂漠で見つけた魔法のランプ
- 相棒(Python版)の冒険日誌
- ゴーレムに魂を刻む儀式の記録
- その他、我らを導いた古文書たち
ラクダの独り言
この前、軽やかな呪文でヒョイっと創ったゴーレムを、今度はわざわざ石くれ(C++)からこね直しているらしい。やれ「儀式だ」の「魂だ」の言って、やけに組み立てに時間がかかっているぜ。前のやつの方が静かで早かったと思うんだがな。結局、どっちのゴーレムも、俺の代わりに荷物を運んじゃくれねえんだ。やれやれだぜ。
