株式会社オーム社 様のご厚意により,
書籍 "dRubyによる分散・Webプログラミング" を
ブックレビューコーナー にご献本いただきました.
この本のレビューをして頂くべく,
Linux Users ML
や本サイトにおいて
公募
を行い,
これにご希望頂いた方々より感想などをレビュー記事にまとめていただきました.
ここに, レビューアの方々から寄せられたレビュー記事を公開します. (原稿到着順)
オーム社様および レビューアの皆様のご厚意に感謝いたします.
なお, 以下のレビューは初版を対象としています.
最初もっと分厚い本を期待していたので, 手元に届いた時, 内容が少ないのではと少々がっかりしました. しかし読んでみると「最新の dRuby に関する情報をまとめることと, その周辺のライブラリを理解して応用するためのチュートリアルになること」という本書の目的を果たしており, お買い得な本だと感じました. 本の表紙, 装丁等も非常に気に入っています.
説明の都合上, Ruby や dRuby について前提知識がない方に, 僭越ながら私からの簡単な紹介を.
まず, Ruby は完全なオブジェクト指向スクリプト言語であり, お手軽にさまざまなクラスが定義できます. また, Array や, Hash, File, String, Queue など便利なクラスが標準ライブラリにたくさんあります.
そこで次にこれらの便利なクラスで作成したオブジェクトを共有したらどうなるのだろうか想像してください (dRuby で可能). ひとつのプログラム内で Array や Hash を使用すればプログラム終了と同時に消滅します. しかし, dRuby で分散環境にて一旦オブジェクトを作成すれば, サーバーの役割をするプログラムが終了しない限り, 他の複数のプログラムから参照したり更新することがいつでも可能です. つまり, 簡易データベースの代わりになるのです. また, Mutex を dRuby 化すれば分散環境にて排他制御が可能となります. IO (又は File) を dRuby 化すればプリントサーバやスプーラーを簡単に作成することが出来ます. 他にも Queue など, 共有化すれば面白いことがいろいろできそうです.
本書では, それらを簡潔に dRuby にて実現し, そのサンプルコードを紹介しています. それもいきなり結果をみせるのではなく, irb などでひとつずつ実験を重ね 段階を追ってサンプル・コードをいくつも紹介しています.
詳細な目次 を見れば本書の大体の内容が想像出来るかと思いますが,
第 1 章は, 分散オブジェクト・システムの概念の説明です. 図解が豊富で理解しやすい説明です. DCOM, CORBA, Java RMI を知っていれば, dRuby の特徴はすんなりと理解できますが, 多分まったく知らない人でもこの程度の説明で問題ないと思います.
第 2 章では, 2 つのチュートリアル・サンプルがあります. 1 つめは, 端末から他の端末へ "Hello World." を表示する例です. 7 ページにもわたって dRuby の仕組みを丁寧に紹介します. さらに 2 つめのチュートリアルは, 端末間で共有するメモ帳として Reminder のサンプル・スクリプトを紹介しています. dRuby という用語に初めて接した方も, 第 1 章と第 2 章を読めば, 先程紹介した dRuby の機能をある程度理解できます.
第 3 章では, eRuby を使って第 2 章でとりあげた Reminder サンプルを少しずつ洗練させていきます. この章の最後に紹介している 3 ページ余りのスクリプトが結論ですが, 重要なノウハウを読者に伝えるために そうなるまでの過程を順を追って, 30 ページに渡り分かりやすく説明しています. 私はこの章が一番好きです.
第 6 章の Web アプリケーションでは, プロセスの分割やオブジェクトの配置, Div フレームワークを使用したセッション管理の例などを解説しています. WEB アプリで面倒な箇所を肩代わりしてくれるものです. 私にとってはやや難解で, ページ数を増やしてでも, もう少し丁寧に解説してほしいと感じました. 大事なことがさらっと書かれていますが, 初心者は, その意味・意義を知りたいはずです.
第 7 章の Rinda に関する章は, プロセス協調のしくみが図解とともに丁寧なチュートリアルで解説してあります. Linda や Rinda という用語は知っていても今まで試そうとすら思わなかった私も Rinda に挑戦してみようかなという気にさせてくれます.
その他の章で解説されている参照渡しや値渡し, マルチ・スレッド, GC, セキュリティは, 分散アプリを組む上では欠かせない重要なポイントです. 紙面では, 一つ一つ段階を追って実験しています. これからプログラミングしようとする場合, 非常に参考になります.
文書やスクリプトの誤りは, 前後関係からある程度正解が類推できますが, 図の誤りにはがっかりしました (P.44 の図 3.9). 嬉しいことに著者による本書の紹介には 掲載スクリプトのダウンロードや正誤表があります.
この本は Ruby を知っていることが前提ですが, 分散システムをどのような仕組みで構築するか興味ある人には, Ruby を習得してでも読む価値があると確信します.
総ページ数が 236 頁 (はじめに, 目次, 付録, 索引を除く) ですが, 他に類書がないことと, それだけ簡潔にまとめられており, かつ初心者にも前半の丁寧なチュートリアルで, 分散プログラミングの重要な概念を一通り学ぶことが出来るのでお勧めです.
各章とも, 非常に短くまとめられていて読み易かったです. そのため, ちょっとした時間に少しずつ読み進めることができました. 実際, 私は手元に書籍が届いてから一日数十分ほどの読書時間で, 一週間で読破することができました. これは, 「時間は無いけど dRuby は覚えたい」と考えているかたにもお薦めできると思いました. 文章のスタイルも教科書的で, なれなれしい雰囲気などはあまり感じられず, すんなりと読むことができました. 難解な理論の部分には, 豊富な図を用いて解説しているので, 直感的に理解することができました. また, 書籍内で中心に使われる dRuby2.0 と, それ以前の 1.3 との違いも逐次解説されており, どちらのバージョンを使っていても安心して購入できる書籍だと思いました. 書籍内に全てのコードが掲載されているので, 学校の教科書などとして使ってもおもしろいのではないかと感じました.
第 1 章, 2 章は他の分散オブジェクトシステムとの違いを細かい図入りで解説した後, セオリーどおり Hello World を通しての dRuby の解説で始まります. ターミナルでの入力まで細かく解説してくれている上, 古い dRuby1.3 での用法についても解説されており, 親切なつくりになっていると感じました. また, 掲載されているコードを理解するための要求レベルは低めで, ちょっと Ruby をやったことのある人なら, スムーズに読み進めることができると思います.
3 章からは, もうひとつのタイトルである Web プログラミングへと話がひろがって行きます. CGI と dRuby の連携という形で話が進んで行くのですが, サンプルコードが長く, 手入力するのが嫌になってしまいました.
4 章は dRuby と通常の Ruby との大きな相異点である参照渡しと値渡しの話題ですが, この章は 3 章より前に持ってきた方が良かったのではないかと思いました. 確かに,この点はアプリケーション作りをしてからでないとよく分からない問題ではありますが, dRuby 単独で実習できる話題なので, 2 章のすぐ後に来た方が, より明解になったような気がします.
第 5 章ではマルチスレッドを解説し, いったん入門ゾーンは終了します. ここまでで, 広く浅く分散処理や Web プログラミングの解説がなされており, 個人的にはこのあたりで演習問題がいくつか挿入されても良かったのではないかと思いました.
6 章では Div と Tofu の解説がなされていますが, Web 分野に特化したこれらのことだけに, 3 章ともう少し近い箇所で解説して欲しかったです.
eRuby の文法を参照するために, 何度か 3 章と 6 章を行ったり来たりするのがややうっとうしく感じました. 章の構成以外では, どの章とも親切ていねいに解説がなされており, 入門書としての役割を十二分に果たす書籍だと感じました. 書籍を読み終わってから, ぜひ dRuby でのプログラミングをやってみようと感じさせてくれる一冊でした.
これは私が学生だからなのかもしれませんが, 入門書としてはやや高価な印象を受けました. 内容が良いものだけに, 価格によって購入を諦められる方がいると思うと残念です.
各章ごとに簡単なスクリプトが書かれているので, 実際に動かしながら理解を深めることができました. しかし, Ruby についてそれなりの知識がないと, 完璧に内容を理解するのは難しいと感じる部分もあります. Ruby のライブラリを通じて気軽に, 分散システム, スレッド, ネットワークプログラミングの概要を理解することができるので, J2EE や Java RMI など大がかりになりがちなシステムに抵抗を感じる人には, お勧めできます.
本書は, Ruby について一通りの知識があることを前提に書かれているので, 第 1 章から分散オブジェクトシステムと dRuby の説明が始まっています. この章のみスクリプトの例がなく概要を説明しているので, 分散システムを初めて学ぶ初心者がいきなりこの章を完璧に理解しようとすると, 難があります. まずは, 2 章以降を読んで, もう一度この章を読み返すとすんなり理解できると思います. 説明も図を多く用いてわかりやすく書かれています.
この章から実際に dRuby を使ったプログラミングが始まります. 簡単な例を通じて, 分散プログラミングのおもしろさを知ることができます. 分散プログラミングに敷居の高さを感じている人も, この気軽さにはびっくりすると思います. 普段の Ruby のプログラミングの感覚でできるところに, 少なからず感動しました.
ERB を用いて, 2 章で作った簡単なアプリケーションに CGI でインターフェースをつけます. ただ動くだけのプログラムではなく, クラスの設計にもこだわっており, 非常にプログラミングの参考になります. また, CGI の基本的な書き方についても, コードを通じて学ぶことができます.
dRuby での参照渡しと値渡しについて. 分散システムにおいて非常に重要なことですが, 参照渡しと値渡し自体の説明があまりされていないので, あらかじめ, Ruby のオブジェクトのコピーや C 言語のポインタ, Java の浅いコピー/深いコピーなどについて理解しておいたほうがわかりやすいと思います. dRuby での参照渡しと値渡しの説明自体は, 懇切丁寧に書かれています.
スレッドの基本から始まり, dRuby でのスレッドについて非常に丁寧に説明しています. 「スレッドがなぜ必要なのか」ということがわかっていないと, やっていることは理解できても, スレッドのありがたさがなかなか伝わってきません. 複雑な GUI アプリケーションなどを組んだことがある人には, 容易に理解できるでしょう. 分散システムを学ぶ初心者にとっては, まず, 4 章, 5 章を理解することが重要です.
dRuby を応用し, さらに高度な Web アプリケーションを作ります. この章以降, 分散オブジェクトシステムの応用となり, 難易度が上がります. 図が豊富なので実際にプログラムを動かしてみて, 逐一, 動作を確認しながら読んでいくといいでしょう. 後半には, 著者の開発した Web アプリケーションフレームワーク Div と Tofu を用いて, 実用的なアプリケーションを作っています. このアプリケーションは, デザインパターンのシングルトンを使うなど, コード自体も参考になります.
Linda について簡単な説明があり, タプル・タプルスペースについて知識がなくても, Rinda を実際に使って, プロセスの協調について理解を深めることができます. 分散処理システムについて無知な人でも, Rinda を使って何か面白いシステムを作ってやろうと思わせるような内容でした.
ガベージコレクションとセキュリティについて. この 2 つが最後の章で, 内容もレベルの高い話になっています. しかし, サンプルプログラムは非常に簡単に書かれているので, まずは試してみることで, より理解が深まると思います.
全体を通して, 図が豊富でサンプルコードも簡単で, 楽しく分散オブジェクトシステムを味わってもらおうという著者の心意気が感じられました. しかし, 著者が「はじめに」で「分散オブジェクトの定義やシステムの比較は他の本に譲ります」と書いている通り, 個々の概念についての説明が不足していることから, 全くの初心者には難しい内容となっています. やはり, 対象読者は, Ruby について一通りの知識があり, 各クラスライブラリを自由に操れる人が望ましいと思います. 本のタイトルは難しそうに聞こえますが, Ruby の延長線上で dRuby を学ぶことができるので, 非常にスムーズに取り組むことができました. 間違いなくプログラミングの幅を広げることができる良書です.
本書を最初に読んだときに「SF っぽいな」と思いました.
本書の世界に登場する Ruby のオブジェクトは, 他のマシン上のオブジェクトを,
ローカルマシンのオブジェクトと同じようにいとも簡単に呼び出せてしまうという世界設定となっています.
呼び出すだけならば CORBA とかもそうかもしれませんが, 呼び出される側も余計なコーディングはほとんど必要ありません.
いままでの Ruby とは違うけど, なんとも居心地の良い世界です.
ですが, これは空想科学でもなんでもなく,
require 'drb/drb'
という呪文を唱えるだけで現実として手に入れることが可能なのです.
この世界では, ネットワークプログラミングの方法や, 考え方をがらっと変えなければいけません. プロトコル (呼び出し規則) の変更は単純なメソッドの変更になってしまいます. その代わりに, 「こいつを dRuby で公開するからクラス構成をこうして, ああして…」といったように, dRuby 用にクラス構成が変わってくるでしょう (他の Web フレームワークに比べたら微小です). 本書には一例としての Web アプリケーションが載っていますが, おそらく dRuby のポテンシャル的には既存の Web アプリケーションの階層構造とはまったく別のアーキテクチャも可能だと思います. できれば, 紹介されているパターンとは別のアーキテクチャの例なんかも見たかったと思いますが, アーキテクチャ系の本でいい本に出会ったことがないので, 紹介してよ, というのもちょっと気が引けますね.
一通り本書を読んでみたあとに, dRuby の応用として P2P お絵かきチャットを作成してみました. SDL のサーフェス (画面をあらわすオブジェクト) に特異メソッドを追加して, タプルスペースで公開しつつ, ネットワーク内をブロードキャストして他のマシンを探索して, 完全な N 対 N のコネクションを作成してマウスイベントを転送するという壮大なものです. それでもわずか 63 行. いざ実験, と思ったら, MacOSX で SDL と dRuby をうまく共存させられなかったために, マシン一台しかなくなってしまって実験できず (^^; それでも, ファイル交換以外の, 実用的な意味での P2P が簡単に実装できそうという夢は見ることができました. 個人的に現在興味があるのは, Rinda の章で軽く触れられていた, 分散計算でしたので, 仕事でもプログラミング三昧してきた後だったにも関わらず, ワクワクしてしまいました.
本書の構成について気になった点がいくつかありました. 4 章の「参照渡しと値渡し」を最初に読んだときには内容が理解できませんでした. irb を起動した 2 つのターミナルに次々に命令を打ち込んでいって, 「はい, こうなりました」と説明が続いていきます. でも Ruby の文法はある程度理解しているが, Ruby ハッカーレベルに達していない僕には, 途中で 2 つのターミナルがこんがらがって「え〜と, どっちがどっちだっけ?」となってしまいました. 例えば, 見開きで両方のコード, および, 実行結果を比較できるような構成なんかはいかがでしょうか? また, 各章に, 2 〜 3 ページのまとまった分量のまとめのページがあればもっと読みやすくなると思います. 本書のような内容であればまとめの代わりに各章で登場したクラスのリファレンスでもいいかもしれません.
本書は言語としては Ruby の本ですが, 例え日常で Ruby を使っていなかったとしても, この「ふつーに他のマシンのオブジェクトを呼べる」世界に浸るだけでもいい刺激になると思います. そしていつの日にか, 仕事で C++ か何かのネットワークのプログラミングをすることになったときには, ぼそっと「dRuby なら簡単にできるのに」とつぶやいてしまいそうな気がしています.
より実践的な dRuby のシステム構築を考えている人にとっては, とても貴重な情報源になると思われる. 何よりも, ソースコードとコンソールベースでの表現がとても豊富な所は評価したい.
チュートリアルを元に, マルチスレッドについてや Rinda についてなど, ここまで事細かに実践に近く情報を得られる物はなかなか少ないのではないだろうかと思う.
だが, 残念なことに内容全体がとても堅物になってしまっている. ソースコードと文章が全体的に多すぎる. だからこそ, 実践的な内容になっているとも言える.
図などは UML などを活用して書かれているため, UML を経験したことがある人であれば, 難なく飲み込めていける様に書いてある. この点は, より現場向けな内容に感じる.
dRuby を柔軟に使いこなした技術者が社内向けに実践的資料として残した場合, こういった資料ができるのではないだろうか. つまり, それなりの言語経験とシステム構築経験が伴えば非常に読みやすいようになっている.
だが, 一方, 言語経験のみで本書を読まれる方は, 概念レベルでの理解が非常に難しくなるのではないだろうかと感じる. 特に、メモリーやプロセスについて、基本的概念の知識が暗黙的に必要になっている。
本書の重大な欠点は, 書籍に使われている色が非常に少ないことである. 全体的に読みにくいというよりも単調な印象を受ける. 読んでいても, 内容は非常に充実しているのだが, 視界から楽しめるという事がないのが残念である.
この本を読むことを薦めたいのは, ズバリ, J2EE などの大規模システムに疑問を感じ, WEB アプリケーションを開発したことのあるエンジニアである. 特にソースコードレベルでの知識としては新たな感動が生まれると思う. WEB アプリケーションを開発する現場の人間に是非読んで欲しいと思う.