ソフトバンクパブリッシング 様のご厚意により,
書籍 Linux プログラミング を
ブックレビューコーナー にご献本いただきました.
この本のレビューをして頂くべく,
Linux Users ML
や本サイトにおいて公募を行い,
これにご希望頂いた方々より感想などをレビュー記事にまとめていただきました.
ここに, レビューアの方々から寄せられたレビュー記事を公開します. (原稿到着順)
ソフトバンクパブリッシング 様および レビューアの皆様のご厚意に感謝いたします.
なお, 以下のレビューは初版を対象としています.
「C 言語入門は卒業した. つぎのステップは?」
Linux プログラミングの学習は,
従来は Unix 一般について書かれた本を読み,
Linux に関する情報は man やソースコード, もしくは洋書から得るしかなかった.
しかし, 1998 年 12 月に ASCII から「プログラミング Linux」が, そして 1999 年 3 月に SOFT BANK から本書「Linux プログラミング」が相次いで刊行された. これによって, 「日本語の Linux の本を使って Linux プログラミングについて学ぶ」 ことが可能となりそうである. 私のような日曜プログラマー (志願者) にとっては非常に喜ばしいことだが, 2 冊合わせて 1 万円の出費は正直痛い.
そこで, 本書「Linux プログラミング」の内容を見ながら「プログラミング Linux」と比較して, 読者の『次の一冊』の選択の助けとしたい. なお, 「プログラミング Linux」の細かい内容については, 第 6 回ブックレビュー を参照してほしい.
本書は, UNIX (主として Linux) の機能, ライブラリ, 基本的な開発ツール等を用いたプログラミングに関して, 音楽 CD データベースの 製作例を取り上げながら解説している. 「プログラミング Linux」と同様, C 言語に関する知識は必須である. ただし, 本文, 例題の解説ともに丁寧に書かれているため, C 言語の入門書を片手に読み進めるといったことは可能だと思う.
残念なのは一部, 特に一章の内容が少々不正確であったり, 古かったりすることだ. どうやら Linux カーネルの Ver.1.2 系の頃の話なので, 読むときは気をつけてほしい. 本書が版を重ねることがあったら, ぜひ情報を更新していただきたい.
本書の表記法だが, 関数や変数, 端末の出力と入力のフォントが分けられ, サンプルコードも話題の部分が網がけされている. 配慮が行き届いていて, 読み進めるのが楽である. また, 目次や索引も充実しているので, リファレンスブックとしても十分活用できると思う.
日本語 Readme ファイル付きの全サンプルコードを SOFT BANK の Web ページから入手できる. あまり重要でない部分は実行のみを行なうなど, 読者の事情にあった使い方ができて便利である.
本書で特筆すべきは, 第 9 章「デバッグ」だ. 主にデバッグライトの仕方と gdb の使い方について書かれているが, 内容が具体的でわかりやすい. gdb というとコマンドリファレンスのみが多い中, 初心者には頼もしい味方になってくれるだろう.
逆に, 付録 A 「X プログラミングの概要」は X の概要にしかなっておらず, まったくの無駄である. また, プログラム内部での日本語の取り扱い方について, 何も触れられていないのも翻訳本とはいえ寂しい. これらの分野の入門書はなかなか見ないだけに, Linux ブームに乗っての良書の登場を待ちたい.
さて, 本書と「プログラミング Linux」との違いだが, 想像以上に大きかった. たしかに, 内容の難易度は同等であるし, 目次を見る限りでは同じような事を取り上げている. しかし, 両者のスタンスは全く別であった.
28:78 と 55:13. これは, 本書の第一章に出てきた"Linux"と"UNIX"の単語の数と, 「プログラミング Linux」 Part 1 に出てきたそれである. 正確な数字ではないが, まったく傾向が逆であることがわかる. この傾向は全体の内容についても同様で, 本書が「UNIX 一般」の立場であるのに対して「プログラミング Linux」は 「Linux が中心」である.
また, 取り上げる物にも特徴が現れた. 以下に気づいたものをあげてみる.
まとめると, 本書はなるべく汎用的な UNIX プログラミングを解説しているのに対して, 「プログラミング Linux」は一般性を捨てて Linux にターゲットをしぼっている, といえる.
最後に本書の対象読者だが, Linux に特化しないプログラムを書きたい人や, UNIX プログラミングのイロハを知りたい人であろう. また, Linux 以外の UNIX OS を使っているという人にとっても, 悪くない選択だと思う. 逆に, 装置制御プログラムやゲームなどを書きたい人や, UNIX プログラミング経験者で Linux について学びたい人には不向きだ. すでに自分が満足できる UNIX プログラミングの本を持っている人にも不要だろう.
本書は以下の章から成っている.
第 1 章 | さあ, はじめよう |
第 2 章 | シェルプログラミング |
第 3 章 | ファイルの操作 |
第 4 章 | UNIX 環境 |
第 5 章 | 端末 |
第 6 章 | curses |
第 7 章 | データの管理 |
第 8 章 | 開発ツール |
第 9 章 | デバッグ |
第 10 章 | プロセスとシグナル |
第 11 章 | プロセス間通信とパイプ |
第 12 章 | セマフォ, メッセージキュー, 共有メモリ |
第 13 章 | ソケット |
各章ではシステムコールやライブラリ関数などの説明のために小さな例題 を用いている. また, 本書では小さな例題の他に実際のアプリケーションとして, CD データベースアプリケーションを各章で学んだことを基に拡張をしていっている.
本書の著者は Neil Matthew と Richard Stones という人々なので, この本は訳本である. 普通, 訳本というのは日本語として意味が通じず, 原書を買ったほうがましである場合が多いが, 本書にはそのようなことは当てはまらない. 複雑な概念を説明しているわけではないということもあるだろうが, とても分かりやすい日本語で訳されているので非常に読みやすかった. また, ところどころにメモや注意などとして tips のようなことが書いてあり, それらが実際に参考になる内容であった.
プログラミングの本などでは, 長いソースにコメントがあって, そしてその後に解説があるというパターンがよく見られる. 本書では短かいセグメントごとに区切り, これから何をするのかを簡潔に述べながらコードを掲載しているので従来のパターンに比べて見やすいし, コードに圧倒されるということもないのではないかと思う.
本書では Linux の知識というよりも Unix でのプログラミングで使用できる知識を全般的に広く述べている. システムコールだけではなくて, シェルプログラミングと termio, terminfo, curses についても解説しているので, なかなかお得なのではないだろうか. 特に curses は解説している本が少ないので入門として良い. 他にも syslog 関係のライブラリ関数や dbm 関数などの, あまり紹介されないものについても記述されているので, 色々な基礎知識を広げることができる.
Unix の開発では必須の makefile や gdb などの開発ツールについての解説 に 2 章割かれている. 普段, 良く使うことや使うと便利な機能がまとめられている.
CD データベースアプリケーションを拡張していく形で各章の最後にコードが 解説されているのだが, このコードが長すぎる. 200 から 300 行くらいなら耐えて入力できるけど, 倍くらいある章もあるので入力するのはキツイ. ダウンロードして眺めるだけじゃ, あまり勉強にならないし, もう少し短かくしてほしかった.
また, gettimeofday や setitimer などのシステムコールを解説していないのが気になった. 本書では基礎的な部分を網羅しているので, そのようなシステムコールについても述べてほしかったし, それに国際化についても少し書いておいてほしかった.
本書は K & R の本を終了して, 次の本を探している人に薦めたい. C 言語未経験者には CD データベースアプリケーションのところが難しすぎるだろうし, 自分で何かアプリケーションを作って公開している人には当たり前のことが多いのであまり役に立たないであろう. Linux でプログラミングをしたくて, C を勉強したけど, 何をしたらいいか分からないという人には是非これを読んでほしい. Unix の知識も得られるし, 広く基礎知識を持てるであろう.
私は, C 言語については 10 数年前から仕事で経験はありますが, もっぱら DOS, Windows のプログラムで, しかもマルチタスクプログラムは作ったことがありません. Linux に関してもまったくの初心者です. もうぐちゃぐちゃの Windows の開発環境 (COM とか DNA ってなに?) から抜け出たい, 21 世紀は Linux でプログラムできないとヤバイ. そんな危機感を感じている方も多いことでしょう. この本が我々の救世主となるかレビューしてみたいと思います (ちょっと大げさ?).
() 内はその章のページ数です.
第 1 章 | さあ, はじめよう | (20Page) |
第 2 章 | シェルプログラミング | (72Page) |
第 3 章 | ファイルの操作 | (46Page) |
第 4 章 | UNIX 環境 | (38Page) |
第 5 章 | 端末 | (38Page) |
第 6 章 | curses | (50Page) |
第 7 章 | データの管理 | (62Page) |
第 8 章 | 開発ツール | (40Page) |
第 9 章 | デバッグ | (32Page) |
第 10 章 | プロセスとシグナル | (38Page) |
第 11 章 | プロセス間通信とパイプ | (60Page) |
第 12 章 | セマフォ, メッセージキュー, 共有メモリ | (34Page) |
第 13 章 | ソケット | (44Page) |
付録 A | X プログラミングの概要 | (10Page) |
付録 B | GNU General Public License (GPL) | (19Page) |
付録 C | 参考文献 | (4Page) |
シェルに関しては sh を対象に 72 ページに渡って詳しく解説されています. 起動スクリプトのお呪いを理解するには必要以上の情報量です. この本は DOS, Windows でのプログラム経験者も考慮して書かれています. 例えば, ライブラリは, 「共有ライブラリは多くの点で Windows の DLL と似ています」 というような感じで説明されています. 第 6 章では curses ライブラリを使った CUI プログラムの解説がされていますが, 「テキストエディタの vi も curses ライブラリを使っています」なんて説明されたら, 読まずにはいられません. また第 3 章のディレクトリの走査も再帰を使ったサンプルがありますが, 「ls や find のソースコードも参照して...」と書かれていると, ここの解説が理解できれば, ls や find のソースコードも読めそうな気がします. ソースコード管理ソフトは Windows にもありましたが, 一度も使う気にならなかったのが, 第 8 章の, たった 9 ページの RCS の解説を読んだだけで使ってみたい気になりました. 第 10 章〜第 12 章のマルチタスク関連のプログラミングについては, やや難しいですが, パイプやリダイレクションの実力を実感できることでしょう. 付録 A の X プログラミングの概要については, 本当に概要だけでサンプルリストもありません. GUI プログラミングへのきっかけにする程度です. X Window System も Xlib から各種ツールキットまで範囲が広いので, この本に載せられないのは納得できます.
通常のサンプルコードは必要最小限の長さで, 動きがつかみ易く作られています. また, わざと遅いプログラムと高速なプログラムを対比させてみたり, 目的の同じプログラムを 2 種類の方法で示したりする説明もとてもわかりやすいです. 本文中にはサンプルの実行例と解説が載っているので, 実際に動作させなくても動きがつかめるように書かれています.
実用的なサンプルとして CD タイトルのデータベースを題材にして, 次のような段階を踏んで実践的な技法を習得できるようになっています. 第 2 章の「シェルのプログラミング」では, この CD のデータベースをシェルで作成し, シェルでも実用的なアプリができると同時にシェルでの限界を示しています. 第 6 章の「curses」でシェルを C 言語に移植し CUI ベースに仕上げています. 第 7 章の「データの管理」で dbm というデータベース関数を使って書き直し 第 11 章でパイプを使ってクライアント, サーバー型にし 第 12 章ではパイプをメッセージキューに書き直して, メッセージキューの利点を説明しています. すべてのサンプルソースは Web 上で入手できます.
第 8 章の「開発ツール」および, 第 9 章の「デバッグ」については, もう少し統合環境のような開発手法を解説してもらえると良かったように思う. Emacs と gdb や RCS などのツールを組み合わせると, エディタ上から make, 関数上でのオンラインヘルプ, タグジャンプ, ソースコードデバッグ, RCS へのチェックイン・アウトなどができるはずです. 個々のツールの解説は非常に分かりやすいのだが, この状態でこれらのツールを如何に組み合わせて 自分なりの開発環境を作り上げるかは紹介されていません. UNIX USER 誌の 99/5 の「Linux によるプログラミング入門」は必見です. 今後このような特集や, 専門書がでれば開発環境はより充実してくることでしょう.
本書は C 言語の知識・経験があれば十分に理解できる内容です. DOS, Windows での経験があれば, その経験は十分に役立つことでしょう. また, Linux を学習したい方で, 多少の C 言語の知識がある方ならば中途半端な入門書より, このような本で内側から具体的に理解する方が近道かもしれません. 私自身, この本から他の入門書では得られない知識をいくつも得ました. アスキーの『プログラミング Linux』と, どちらを買おうか迷っている方も多いと思います. 残念ながらアスキーの本は詳しくは見ていないのではっきり言えませんが, ざっと見たかぎりでは, この『Linux プログラミング』の方が易しいと思います. 項目についてもこちらの方が少ない分, 的が絞られていると思います. この本を読んだ後アスキーの本を読むとより知識が膨らむのではないでしょうか. この『Linux プログラミング』は, 元々実績のある本の和訳書ですが, それは十分納得できるものでした. サンプルの出来の良さ, 丁寧な解説は特にこの本の特長であると思います. この本を読めば UNIX の哲学, Linux プログラミングスタイルが形なりにも理解でき, さらに Linux の内部の動きも学習できます. 無理やり UNIX を真似た DOS の壁壁壁の世界から, 壁の無い非常にシンプルで奥の深い UNIX の世界が実感できることでしょう. 是非, これから Linux プログラムを始めたい方にお勧めしたい一冊です.
最近の本の主流である A4 版です. 活字も大き目で, 読みやすいです.
この本は, "Linux の"プログラミングに関する本, というよりも, むしろ"UNIX の (本の中では X/Open 規格とか, POSIX という形でかかれているが)" プログラミングの本という方が正確です. 本の中では頻繁に"Linux では"という話ではなく, "X/Open 規格では"という話が出てきます. もっとも, Linux はかなり厳格に X/Open 規格に準拠しているようなので, このことは "Linux でのプログラミングに向いていない" ということを意味しているのではまったくありません. ただ, Linux 以外の UNIX を使うことを目標にしている人にも参考になる本ではあります. 実際, 今回のサンプルコードのいくつかを NEC EWS4800 であるとか, FreeBSD といった Linux 以外の OS の上でコンパイルしてみました. 特に大きな問題は出なかったです. また, 特に古い UNIX 等では X/Open 規格に準拠していない場合もあるわけですが, そういう UNIX (特に古い UNIX) ではどうなっているのかという話も簡単に (おまけ程度ですが) 出てきます. なので, 古い UNIX からの移植だとか, 古い UNIX でのプログラム作成/修正を行なう人にも参考になるかもしれません.
内容としては, いわゆるシステムプログラミングの話が中心です. なのですが, 旧来のシステムプログラミングの範疇には余り入らない (と, 私が思っているだけなのかもしれませんが) curses や dbm の話もありますし, make,RCS, man (の書き方) といったソフトウエア開発ツールの話, デバッガ (gdb) の話といった幅広い分野の内容があります. そして, それぞれの分野の細部に渡り内容詳細に解説しているわけではなく, 必要最小限の事柄を丁寧に解説しています. 結局, Linux で実用的なプログラムを作ることを目標とし, そのための足がかりを勉強するための内容が厳選されているのだと思います. あとは man page 等もありますし, 合理的な方法だと思います.
非常に懇切丁寧な説明がなされているという印象を受けました. それほど簡単ではない事柄を説明していると思うのですが, すんなりと理解することができました. もっとも, それはサンプルコードに負うところが大きいと思います. サンプルコードの挟み方と説明方法に関してかなり計算されていると感じました. コードを読んで, コードをいじりながら勉強する, その手がかりとしての親切な説明がなされています.
サンプルコードの量自体は, こういう性質の本としては特に多いとは思いません. ただ, ポイントとなる, 分かり難いところで効果的にコードが挟まれており, 一つ一つの例題/サンプルコードに対して詳細な解説があります. また, サンプルコードが非常に癖が少ない教育的なコードで書かれています. そのため, (最低限の C の知識が存在するのであれば) 本題以外の部分で悩むことが少ないと思います. 欲を言うと, 一つ一つのサンプルコードがぶつ切れになってしまっていて そのあいだに解説が入っているので, 一つ一つのサンプルコードの流れがつかみにくいことがあります (特に長いコードでそうなっていることが多いです). まあ, サンプルコード自体は ftp により Internet 経由で取得できるので, 取得して自分で印刷する/オンラインで見るのが正しい姿なのでしょう.
この本の特徴として, CD タイトル管理システムの作成というものがあります. アプリケーションを高機能にしていくということで実用的なアプリケーション作成方法を学ぶという流れになっています. これが効果的なのかどうかは私にはよくわかりません. 実用的なアプリケーションの作成方法をまなべるのも確かでしょうが, 最初の部分を飛ばして途中から読み出した時に何をやっているのかわからなくなる, というのも確かです.
個人的な希望としては, CD タイトル管理システムで是非日本語が扱えるようにしてほしかったです. つまり, プログラムの国際化という面に関しても言及してほしかったです. locale というものがあってこう使えるのだということを少し述べてくれるだけでもよかったのですが.
Unix で (あえて Linux で, とはかきません) 実用的なプログラムが書きたい人や, 書く必要のある人. かつ, C の知識, UNIX の知識のある人 (ない人は, とりあえず K & R を読むことをお勧めします). この手の硬派な本としては説明が非常に親切でわかりやすいです. それほど専門知識のない人でもすんなりと読めると思います.