このオアシスの水は少々奇妙な味がする。成分(ソースコード)を詳しく調べてみる必要がありそうだ。
以前、私はPythonという軽やかな呪文で手軽に動作するRedfishシミュレータを創り出した。しかし真の探求者は安住の地に留まらない。今回はその魂を、あえてC++という古の言語で造られた新たなゴーレムに移植するという、無謀とも思える挑戦の記録である。
「なぜ、動くものをわざわざ書き直すのか?」 その問いはもっともだ。かつてC++というゴーレムはあまりに巨大で、動かすには難解な儀式と膨大な時間を要した。 しかし、時代は変わった。VS Codeという魔法の工房、POCOという名の万能部品、そしてGitHub Copilotという名の精霊の助けがあれば、C++でもPythonに劣らぬ手軽さで力強いゴーレムを創り出せるのだ。
さあ、WSL2 Ubuntuという名の祭壇で古のゴーレムに再び命を吹き込む、現代の移植秘儀をご覧に入れよう。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- 魂の器を選ぶ儀式:POCOフレームワークという選択
- 冒険の準備:祭壇を整える
- ゴーレムを組み上げる儀式:ビルド
- 魂の設計図:全ソースコード解説
- 魂の鼓動を確認する儀式:動作確認
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- かつてC++というゴーレムの巨大さに挫折したが、もう一度その心臓に触れてみたいと願う者
- C++のPOCOフレームワークという万能部品の数々に興味がある探求者
- Pythonなどで創り出した魂をより力強いC++の器に移し替えることに関心がある錬金術師
- VS Codeとモダンな開発環境でC++開発を快適に始めたい技術者
砂漠の道標
- C++ - 高性能なプログラミング言語。処理速度が速く、システム開発やゲーム開発で広く使われるが、学習コストが高いとされる。
- POCOフレームワーク - C++用の汎用ライブラリ群。ネットワーク通信、Webサーバー、JSON処理など、多様な機能を提供する。
- Redfish - サーバー管理のための標準API仕様。ハードウェアの状態監視や設定変更をHTTP/RESTで実行できる。
- CMake - C/C++プロジェクトのビルド(コンパイル)を自動化するツール。複雑なビルド手順を簡潔に記述できる。
- スマートポインタ - C++のメモリ管理を自動化する仕組み。手動でのメモリ解放(delete)が不要になり、メモリリークを防げる。
- WSL2(Windows Subsystem for Linux 2) - Windows上でLinuxを動かすための仮想化技術。完全なLinux環境をWindows内で利用できる。
魂の器を選ぶ儀式: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にベタ書きしている。
詳細な実装とソースコードは、「たびとのアトリエ(GitHub)」で確認できる:
主要なクラス構成
// 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", ...})"}, // ... (以下省略) ... }; auto it = redfish_data.find(uri); return (it != redfish_data.end()) ? it->second : R"({"Error":"Unknown URI."})"; } }; // HTTPリクエストを処理するハンドラクラス class RedfishRequestHandler : public Poco::Net::HTTPRequestHandler { /* ... */ }; // ハンドラを生成するファクトリクラス class RedfishRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory { /* ... */ }; // Webサーバーのメインクラス class WebServer : public Poco::Util::ServerApplication { /* ... */ }; 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) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 実行ファイルの定義 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という魔法の道具(JSONフォーマッター)を使えば、その声を色付きで美しく聞くことができる。
羊皮紙を巻く前に
かつて「難解で巨大」と恐れられたC++という古のゴーレムも、POCOという万能部品とVS Codeという魔法の工房、そしてGitHub Copilotという精霊の助けがあれば、驚くほど手軽に命を吹き込めることを実感した旅だった。
C++でのRedfish実装の優れた点
- POCOフレームワークの恩恵 - Webサーバー、JSON処理、スマートポインタによる自動メモリ管理など、モダンな開発に必要な機能が揃っている
- VS Codeによる快適な開発体験 - ビルドもデバッグもボタン一つ、エラー箇所への瞬時ジャンプで、もはや黒い画面との睨み合いは不要
- GitHub Copilotという最高の教師 - コード補完だけでなく、C++の作法そのものを学べる革命的な存在
- 言語選択の自由 - パフォーマンスが必要ならC++、素早いプロトタイピングならPython。適材適所で選べる引き出しが増える
まとめ
Python版と同等の機能を持つRedfishシミュレータをC++で実装する旅を通じて、かつての「難解な専門言語」が「誰でも気軽に楽しめる強力なツール」へと変貌を遂げた現実を目の当たりにした。
モダンな開発環境の力を借りれば、C++という古のゴーレムも再び我々の頼れる相棒となる。この羊皮紙があんたの新たなC++への旅のきっかけとなれば幸いだ。
おっと、相棒が「そろそろ休憩しないか」と囁いている。今宵はここまでとしよう。
砂漠で見つけた魔法のランプ
- 幻影のゴーレムを錬成せよ ~PythonとFastAPIで創る、Redfishシミュレータ~ | この旅の始まりとなったPython版の冒険日誌
- Google C++ スタイルガイド(日本語訳) | 我が旅の地図となった賢者の言葉
- POCO C++ Libraries | 魂の器として選ばれた万能部品の古文書
- GCC Command-Line Options | C++20の力を解き放つための呪文
ラクダの独り言
この前、軽やかな呪文でヒョイっと創ったゴーレムを今度はわざわざ石くれ(C++)からこね直しているらしい。やれ「儀式だ」の「魂だ」の言ってやけに組み立てに時間がかかっているぜ。前のやつの方が静かで早かったと思うんだがな。結局どっちのゴーレムも俺の代わりに荷物を運んじゃくれねえ。まあ、ご主人が楽しそうだからいいか。まったく、飽きねえお人だ。