Ruby Advent Calendar 2022 part2 (15日目): 「Webで使えるmrubyシステムプログラミング入門」 (mrubyシスプロ本) 読書日記 (※2年越し)

Ruby Advent Calendar 2022 part2 15日目の記事です🎄
昨日は@rsym1290さんによる「AWS SDK for Ruby V3のスタブを使ってみる」でした。

まえがき

2020年11月25日に発売された udzuraさん著・Webで使えるmrubyシステムプログラミング入門 (mrubyシスプロ本) の読書記事です。

実は本書の執筆中、レビューに参加させていただくという大変貴重な機会をいただいていたのですが、出版当時はまだわたしが自ブログを持っていなかったためにブログ記事を書くことができていなかったのでした…
時は流れて今年、mruby組み込みWiresharkを作ろうと思い立った(参考: RubyKaigi 2022に現地参加 & 登壇しました)際、その実装の参考にしようと再読してみたところ改めてめちゃめちゃたのしく勉強になったため、この機会に大変大変遅ればせながら、2年越しに感想を交えながら記事を書いてみたいと思います。

奇しくも2022年はmruby誕生10周年の記念すべき年でしたね。おめでとうございます🥳

どんな本?

出版社サイトより

本書はシステムプログラミングをテーマに、mrubyの基本と活用法を学ぶことを目的とした技術書です。 システムプログラミングとは何かをはじめ、mrubyの概要、開発環境の構築、コマンドラインツールの実装、C言語とmrubyの連携、Apache HTTP Server にmruby を組み込む方法、安全にコードを書くために必要な知識などを丁寧に解説しています。付録ではシステムプログラミングのためのコマンドラインツールを紹介しています。

上記の通り本書で取り扱っているトピックは非常に広い範囲に渡っているため、mrubyの本として、システムプログラミングの本として、あるいはセキュリティの本として…などいくつもの観点から読むことができます。
mrubyでのプログラミングを通じて、それぞれのトピックを深く学んでいくためのとっかかりを与えてくれるような一冊となっています。

わたしの場合は冒頭に述べた通り、今回はmrubyをWiresharkに組み込みたい、というモチベーションのもとmrubyによるソフトウェア組み込みについて学ぶため再読した際、本書の特にCHAPTER 03の前半とCHAPTER 07が実装のための大きなヒントをくれました。
今後もまた立場を変えて再び別の切り口から本書を開き、新たな発見に出会うことがありそうだなと思っています。

あると良さそうな前提知識

本文中でも明記されているのですが、初めて読み始める前に以下のような知識の土台があるとより楽しめそうです。

各章について

CHAPTER 01: システムプログラミングへの招待

システムプログラミングとはどんなものか、mrubyとはどんなものか、という解説に続いて「本書がどんな人に向けた本なのか」がわかる章です。
わたしは普段Railsを使ったWebアプリケーション開発の仕事をしているのですが、例えばそういった人があえてシステムプログラミングに、あえてmrubyで入門してみることでどんな発見を得られるのか、あるいはインフラエンジニアやSREの方、低レイヤの技術やmrubyそのものに興味がある方へ本書がどのような知見を与えてくれるかが述べられています。

CHAPTER 02: mrubyに触れてみよう

この章で早速mrubyをビルドしてHello Worldしてみたりmgemを利用してmrubyをカスタマイズしてみたりします。環境を用意するところから実行ファイルを作成するまでの道のりが一歩ずつ丁寧に解説されています。
わたしは本書をきっかけに初めてmrubyに触れたため、この章を読んで「rakeコマンド一つで手軽にmrubyをビルドできる」そして「mgemを利用すると自分だけのmrubyをビルドできる」というmrubyならではの体験に感動しました。

CHAPTER 03: mgemを作ってみよう

「mgemを作ってみよう」というタイトルの章ですが、前半は前章を受けてmrubyバイナリがどのようにして実行可能な状態になるのか、そのビルドパイプラインの流れが解説されており、ここでmrubyについての基礎知識を学ぶことができます。
この前半部分は、本書を一周した後で改めてmrubyをちゃんと理解したいという気持ちのときに読み返して点と点が繋がる感覚がありました。

後半はmrubyプログラミングの手始めに、mruby本体に組み込むためのライブラリであるmgemをテンプレート(とても便利)から作成し、テストを追加し、実際にmrubyに組み込んで動作させてみます。
mgemを公開する方法まで解説されているため、実際にmgemを自作したい時にも参照できそうです。

CHAPTER 04: mrubyでシステムの状況を調べる

この章からいよいよシステムプログラミングについての学習が始まります。
導入部分で早速psコマンドやstraceコマンドに触れ、その後プロセスの様子を観察するmgemの開発を通じてLinux/procについて学んでいくことで深淵なるシステムプログラミングの世界に一歩足を踏み入れることができます。
とはいえこの章ではそのためのコードをRubyで書くので、初めてのシステムプログラミングでもとっつきやすく感じました。
また前章に引き続きmgemを開発してmrubyに組み込む、という流れに沿って開発を進めるため、mrubyについては前章までのおさらいもできます。

CHAPTER 05: C言語でmrubyを拡張する

システムプログラミングの深淵にもう一歩踏み込むため、この章ではシステムコール(uname(2)stat(2))とC言語とmrubyのC APIも駆使してシステム情報を取得するためのmgemの開発を行います。
まずはC言語でを扱う簡単なプログラムを書くところから始まり、その後はmgemの中でC言語(mrubyのC API)を用いたRubyプログラミング(!?)に入門することができます。
さらに最後にはgdbを利用してC言語でのデバッグも体験できるという、お得で読み応えのある章でした。

CHAPTER 06: C言語の複雑なデータをmrubyで扱う

この章では、前章でも登場したシステムコールstat(2)とmrubyの仕組みを更に深掘りし、mrubyから扱うことができるようにしていきます。
難易度的には本書の中でも一つの山場のように感じた章でした。mrubyはインスタンスのデータをどのように持っているのか(「Rubyのしくみ」第5章が思い起こされます)であったり、mrubyを介してメモリ管理の仕組みがないC言語レベルのデータをどのように扱えば良いのか、といった難しい話題(自分比)に踏み込んでおり、読むたびに新しい発見があってびっくりしています。
システム情報を格納するStat構造体の持つ各情報に関する小ネタも豊富に詰まっています。

また、この章でも最後にvalgrindを利用してメモリリークの検知を体験することができます。こうした便利ツールの使い方や、プログラムを修正するときの考え方を学ぶことができるのも本書の魅力です。

CHAPTER 07: Apache HTTP Serverの中でmrubyを使おう

ここまでの章ではmgemを作成し、それを組み込んだmrubyを手元で動かしてみる、といった流れで解説が行われてきました。
このCHAPTER 07と次のCHAPTER 08では、いよいよmrubyの本領の一つ、mrubyによるソフトウェア組み込みを体験することができます。 いずれの章でも組み込む対象となるソフトウェアはApache HTTP Serverです。

まず本章ではApacheの拡張機構として書かれたmod_mrubyを実際にApacheに組み込み、RubyApacheの設定を書いてみることによって、「mruby自体をソフトウェアに組み込む、とはどういうことなのか、それによってどんなことができるようになるのか」といったイメージを掴んでいきます。
この章はmod_mruby入門として活用できそうなくらい手厚くmod_mrubyについて解説されているので、そういった用途にも便利そうです。

CHAPTER 08: Apacheの拡張モジュールにmrubyを組み込む

クライマックスの章です。CHAPTER 07では実在のApache拡張であるmod_mrubyをApacheに組み込みましたが、この章では1からApacheにmrubyを組み込んでいきます。
C言語・mrubyのC APIApacheの拡張用APIを駆使してのプログラミング、rakeを使ったモジュールのビルドとインストール、abやperfを使ったパフォーマンスチューニングなどトピックも大盛りです。
rakeタスクの定義は本文中ではさらっと解説されているのですが、この辺りを読んでいて自分がrake(make)について何も知らなかったことがわかりました。

難易度的にもクライマックスなのですがその分勉強になることも多く、Apache以外のソフトウェアにmrubyを組み込むような場合にも非常に参考になりました。
この章がなければWireshark with mrubyは完成しなかったと言っても過言ではない…

CHAPTER 09: 安全なプログラムを書く

最終章は前章までとはちょっと趣を変え、セキュリティのお話です。
C言語でプログラムを書く際に埋め込んでしまいがちないくつかの脆弱性について、そしてそれらの中でバッファオーバーランを例に取り、それを作り込まないための方法論について考えていきます。ここでmrubyのC APIがどのように役立つのかは必見です。
安全なプログラムを書くことの難しさと、それでもそれを目指していかなくてはいけない、という意識の大切さと、そのための実践的な心構えが説かれています。

APPENDIX

CHAPTER 09にてこれでおしまい、めでたしめでたし…かと思いきや、最後に50ページ越えの特大付録がついてきます。
本文中に登場したものを中心に、Cプログラミングやシステムプログラミングの味方となるコマンドラインツールたちについて丁寧に解説されています。便利。

EPIROGUE

謝辞に名前を掲載してもらえて嬉しい✌️
技術者としてmrubyシスプロ本の次のステップを踏んでいくことについてうづらさんの熱い思いが伝わってくるあとがきでした。

おわりに

今年はmrubyシスプロ本とYamanekkoさん著・入門mruby Cからmruby APIを使いこなす(そしてWiresharkの開発者ガイドThe dRuby Book)のおかげでRubyKaigiに登壇できました…本当にありがとうございます。
リファレンス的に参照するなら入門mruby、実践的な使い方を参照するならmrubyシスプロ本、と需要をカバーする本が揃っていてうれしいですね。
mrubyの方は出版時点からバージョンが上がってますます良くなっていっているのですが、いずれも今なお役立つ普遍の教えが詰まった名著だと思います。
普段はMRIを使っているけれど、mrubyってどんな感じ…?という方も、たのしいソフトウェア組み込みの世界を体験する際のお供にいかがでしょうか?

それでは素敵なクリスマスをお過ごしください🎁