株式会社アスキー様のご厚意により,
書籍 "プログラミング Linux" を
JLUG および JLUG Webmasters あて ご献本いただきました.
この本のレビューをして頂くべく,
Linux Users ML
において公募を行い,
これにご応募頂いた方々より感想などをレビュー記事にまとめていただきました.
ここに, レビューアの方々から寄せられたレビュー記事を公開します.
株式会社アスキー様および レビューアの皆様のご厚意に感謝いたします.
なお, 以下のレビューは初版を対象としています.
Linux 関係の本には必ずといっていいほどのお決まりがある. それは, 大抵の場合, 本の一番最初にある Linux が誕生した経緯が書かれたセクションであるのだが, この本の場合はちょっと書き方が違う. 初心者向けに書かれた本には, 一番最初に「Linus Torvalds はヘルシンキ大学の学生で…」 といった文章が来るのであるが, この本ではまず, "Linux" という文字の意味について言及している. それは, 一つには, カーネルとしての "Linux" と, もう一つは, ツール, 開発環境まで含めた Linux をカーネルとするオペレーティングシステムとしての "Linux" という定義である. 後者はいわゆるディストリビューションが相当するので, 実際には, "Slackware Linux" とか, "Red Hat Linux" とか, "Debian GNU/Linux" とか呼ばれたりするのであるのだが, それらは広義の "Linux" として通用する.
この本ではこの意味での "Linux" を使用すると明記している. こういう事をまず始めに明記した点で察しがつくように, この本は, いわゆる初心者向けには書かれていない. また, プログラミングの参考書であるが, C 言語を解説するようなことはしていない. 読者は C 言語を習得している必要がある.
"hello.c" を期待してはいけない. C 言語を習得している読者向けに, プログラマから見た, Linux の Linux らしい部分について解説されているのが, 本書である.
さて, Linux の Linux らしい部分…ということは, 次の章では早速ハードウエアを叩くかな? と思うと, そうではない. 本書の第 2 章では「ライセンスと著作権」という, プログラマがソフトウエアを公開する際に一番苦手 (というのは僕の思い込みかもしれないけど, 僕自身は苦手) な法律のお話である. そして, 技術的なお話よりも前にこのセクションを持ってきた筆者の気持ちを察すると面白い. 筆者は "プログラムが出来たら公開してね" というメッセージを暗黙のうちに読者に送っているかのようにも思える. GPL はもちろん, MIT/X ライセンス, BSD ライセンス等の有名所のライセンス方式について, 簡単ではあるが重要なところを簡潔に記述してあり, 非常にわかりやすい.
"Appendix C" には, GPL と LGPL ついて, 原文と日本語訳 (日本語訳は GPL のみ) が掲載されており, 法律のことなどはシステムコールの使い方ほどには覚えていられない プログラマにとっては, 大きな助けになるだろう.
次の第 3 章は, 「Linux に関する情報源」というタイトルで, Linux についての情報を入手するための手段や, 情報の場所を紹介している. そもそも本書のような本を必要とするプログラマは, これらのリソースやアクセス手段を知らなければ話にならない. こういうことを解説するセクションを, やはり本の始めの方に持ってくるというのも, 筆者にこだわりがあるように思えるのは私だけだろうか. 大抵の場合, こういった物は本の一番最後に申し訳程度に記載されているのが普通である.
ここで残念なのは, 日本での事情についての説明が無いことである. 日本語の訳書であるのだから, 訳注としてでもいいから日本での情報源も記載して欲しかった. JLUG の運営する Linux Users ML を始めとして, 数多くのメーリングリストや, fj.os.linux 等の日本語で議論できるニュースグループがあり, カーネルや多くのディストリビューションや開発ツールが 日本にミラーされているのだから, それらの追記があっても良かった. 幸い, http://www.linux.or.jp/ が以前にも増して充実したサイトになっているから, 日本の事情を知りたければ, とりあえずは, http://www.linux.or.jp/ を見て欲しい.
先の第 3 章までが, "Part 1" となっている. 次の第 4 章からは "Part 2 開発ツールと開発環境" というタイトルで, 続く第 6 章まで, エディタ, make, gdb, gcc, メモリデバッグツールとして, Electric Fence, Checker, mpr 等のツールの使い方を解説している. エディタについては, 実際の使い方についての解説はなく, Emacs と vi の紹介に止まっている. これは, 非常に好感が持てる. エディタは開発環境の重要なツールの一つであるが, 開発の本質ではない. プログラマにとって, それよりも重要なのは, Makefile の書き方であったり, gdb や gcc の使い方, メモリリークをデバッグする為の方法である. これらのことに関しては, 簡単にではあるが, 必要なことを書くという本書のスタンスに則り読みやすく書かれている.
第 7 章はライブラリの作り方, 特に, 共有ライブラリの作り方について述べている. 共有ライブラリを作る際に注意すべきことが書かれている. 第 8 章はシステムコールの使い方について書いている.
さて, ここまでが "Part 2" の内容である. 続く "Part 3 システムプログラミング" では Linux がデザインの参考にした UNIX システムでも共通の概念であるところのプログラミング Tips を紹介している. プロセスモデル, ファイル・ディレクトリ操作, シグナル処理, ジョブコントロール, 端末, ネットワークなどである. これらを解説するために, もはや UNIX 本のセオリーである「コマンドシェル(ladsh)の作成」を例にとっている. シェルを作るというのは UNIX の教科書でずいぶんと使われた教え方の一つであり, 私はこの方法でシステムコールの使い方を教える本を数冊知っている. 本書もそれを踏襲している. 教える手法がすっかり枯れたものであるため, 安心して読める.
"Part 4" は, プログラミングの際に便利に使う事のできる開発ライブラリを紹介している. 文字列の glob を行ったり, 正規表現をを使う方法などを紹介している. また, S-Lang ライブラリを使った端末制御を行うプログラミング法についても 述べている. 私個人としては, 今後, X Window System 上で動作する GUI ベースのアプリケーションを開発する需要が, 端末上で動作するアプリケーションよりも増えると思っているので, S-Lang ライブラリプログラミングをわざわざページを割いて解説することについて, 若干の疑問がある点は否めない. ただ, 本書の最初で, 「例えば, X Window System は全ての Linux または UNIX プラットフォームで同一なので説明しない」と明記しているので, それが本書のスタンスである. かえって, X プログラミングの中途半端な解説があるよりはいいと思う.
23 章ではデータベースライブラリとして, dbm の使い方を解説している. 24 章では, アプリケーションを開発する際に結構需要があるにもかかわらず, 以外と自分で処理してしまう事が多い, コマンドラインオプションの解析に便利なライブラリについて解説している.
25 章では, ダイナミックローディングの手法, 26 章では, ユーザデータベースの処理について解説している. 26 章では, PAM (Pluggable Authentication Module) について紹介されているのだが, 紹介だけに終っているのが残念である. 実際の使用方法を解説してあると良かった.
ここまでで, 本文は終り, 続く Appendix A では, Linux システムの特徴でもある, ioperm システムコールの使い方を解説している. 簡単で Passive なコントロールだけで十分なデバイスを扱うために 非常に便利なものであるので, システムの制御に Linux を使う人も多いだろう. そういう人はこの章をじっくり読むと良いと思う. Appendix B では, システムコールの使い方を解説するために例にとって開発したシェル "ladsh" (Linux Application Development's SHell の略?) の全ソースコードが載っている. 最後の章となる Appendix C には, GPL の原文及び日本語訳, LGPL の原文のみが掲載されている. なぜか, LGPL の訳が掲載されていないのは残念である.
レビュー記事の最後として本書の全ての大章を列挙する.
第 1 章 | Linux 開発の沿革 |
第 2 章 | ライセンスと著作権 |
第 3 章 | Linux に関する情報限 |
第 4 章 | 開発ツール |
第 5 章 | gcc のオプションと拡張 |
第 6 章 | メモリデバッグツール |
第 7 章 | ライブラリの作成としよう |
第 8 章 | Linux 開発環境 |
第 9 章 | プロセスモデル |
第 10 章 | 簡単なファイル操作 |
第 11 章 | ディレクトリ操作 |
第 12 章 | 高度なファイル操作 |
第 13 章 | シグナル処理 |
第 14 章 | ジョブコントロール |
第 15 章 | 端末と疑似端末 |
第 16 章 | ソケットによるネットワーク |
第 17 章 | 時刻 |
第 18 章 | 乱数 |
第 19 章 | 仮想コンソールのプログラミング |
第 20 章 | Linux のコンソール |
第 21 章 | 文字列マッチング |
第 22 章 | S-Lang による端末処理 |
第 23 章 | データベースライブラリ |
第 24 章 | コマンドラインオプションの解析 |
第 25 章 | ダイナミックローディング |
第 26 章 | 名前とユーザデータベース |
Appendix A | I/O ポートへの直接アクセス |
Appendix B | ladsh ソースコード |
Appendix C | GNU ライセンス |
プログラミングLinux (アスキー出版局) 5800円+税 494ページ
第1章 | Linux開発の沿革 | 第2章 | ライセンスと著作権 |
第3章 | Linuxに関する情報源 | 第4章 | 開発ツール |
第5章 | gccのオプションと拡張 | 第6章 | メモリデバッグツール |
第7章 | ライブラリの作成と使用 | 第8章 | Linuxの開発環境 |
第9章 | プロセスモデル | 第10章 | 簡単なファイル操作 |
第11章 | ディレクトリ操作 | 第12章 | 高度なファイル操作 |
第13章 | シグナル処理 | 第14章 | ジョブコントロール |
第15章 | 端末と疑似端末 | 第16章 | ソケットによるネットワーク |
第17章 | 時刻 | 第18章 | 乱数 |
第19章 | 仮想コンソールのプログラミング | 第20章 | Linuxのコンソール |
第21章 | 文字列マッチング | 第22章 | S-Langによる端末処理 |
第23章 | データベースライブラリ | 第24章 | コマンドラインオプションの解析 |
第25章 | ダイナミックローディング | 第26章 | 名前とユーザデータベース |
Appendix |
上に目次を紹介していますが, 特色は次のようなところだと思います.
(a) Linux の特色を生かしたシステムプログラミングから 一般的なアプリケーションプログラムまでが作成できるように広くカバーしています. ただし, 他のプログラミング教本のように コーディング例が多数記載されているわけではありませんので, そのあたりは他の良書を参考にすればいいと思います. 一般的な中程度のプログラミング本としても良書だと思います.
(b) 開発環境やデバッグ環境を詳解しています. 実際にはこの辺は広く浅くであり実際に使いこなすにはエディタはエディタ, デバッガはデバッガなどそれぞれ別の本を参考にしなければならないと思いますが, Linux で提供されている開発の流れというのを感覚的に捉えることができます. こういったことはたいしたことではないようですが, 他のUNIX上での開発経験がある方でも プラットフォーム固有の環境でつまづく人も多いと思いますので, この程度の広く浅い扱いは有り難いと思います.
(c) ネットワーク周りの実装上の特色やライブラリの実装など Linux 固有の環境の説明について十分に述べられており, これも他のプラットフォームからのポーティングなどに役立つことと思います.
(d) スタティックライブラリ, 共有ライブラリ, ダイナミックローディングなど他の UNIX の書物だと理解しにくいものが 理解しやすく書かれており, この本を読んでから他の UNIX の書物を読むとわかりやすいということもあるかも知れません.
(e) 以前からGNU のプロダクトに明るい人はともかく, 最近のオープンソース活動で初めて知った方は GPL(GNU General Public License) の精神などに触れる機会はなかなかなかったと思いますが, この程度の記述はライセンスや著作権の問題をクリアするために 必要になることもあると思います. これに関する記述は役に立つときがあるでしょう.
この本は最近, 巷にあふれているいわゆるインストール本ではありませんし 「プログラミング」と名前をつけてはいるものの プログラミングの入門書でもありません.
前提条件として.
などをあげたいと思います.
これまでインストールばかりでこれから腰を据えて Linux 上で C 言語でのプログラミングをやろうとしている方にお勧めです.
Linux で自分のアプリケーションを動かしてみたい. そんな思いに駆られたことはないだろうか. 職業プログラマでも, 日頃 OS のシステムコールを直接利用している方は少ないと思う. かく言う私も SQL 言語との格闘の毎日で, 少しの Win32API を利用するだけである. そんな中にありながらも Linux のシステムコールを利用して アプリケーションを造ってみたいと思わずにはいられない. なぜなら, Linux は優れた OS であるし, 安価に UNIX プログラムができるという感動がある. しかも, 今後あらゆる場面のシステムに導入されるケースが増えてくるであろうから, Linux プログラマは必要とされると感じるからだ. では私のような UNIX プログラミング経験のない者が Linux 上でアプリケーションを作成するにはどうしたらいいのだろう. かなりの情報を得なければならないと思うが, この本を読むのもその一つの手段である.
以下に本書の内容を簡単に紹介する.
「プログラミング Linux」は Michael K.Johnson/Erik W.Troan 共著による "Linux Application Development"を和訳したもので, Linux カーネルシステムコールの解説書である. 4 パートの構成と 3 つの Appendix からなり, 途中にサンプルコードを使ってカーネルシステムコールの利用方法を説明しながら, 索引まであわせて 494 ページとなっている. 前書きの冒頭に
本書は, 経験のある(熟練でなくても学習意欲が旺盛な)プログラマで, Linux ソフトウェアの開発, または他のプラットフォームからの Linux へのソフトウェアのポーティングを行う人々を対象
とあるようにプログラムを全く経験したことのない人向けには書かれていない. C 言語でプログラムを書けることと, オペレーティングシステムの基本的な知識を有している必要がある. Linux カーネルのインターフェースは C 言語であるし, Linux は紛れもなくオペレーティングシステムだからである.
最初のパートは「はじめに」と題されており, Linux に関する一般常識講座で始まる. カーネルの開発経緯やライセンス関係の情報, 情報源の収集場所の紹介である. この部分はどの Linux 書籍でも触れられる部分であるが, 特にライセンスについてはアプリケーションを作成するうえで 注意すべきことについて述べられている.
次のパートは, プログラミングに使用されるツールと開発環境について説明されている. make, gdb の使用方法と gcc のオプションについて説明し, また, メモリーリークとバッファオーバーランといったエラーについて デバッグを容易にする "ElectricFence", "Checker" および "mpr" といったツールを紹介し使用方法を説明している. 共有ライブラリの作成方法と使用方法, およびシステムコールの返すエラーコード利用方法もこのパートに含められている.
3 番目のパートからいよいよプログラミングの手ほどきに入る. 最初に説明されるのはプログラムの実行単位であるプロセスモデルである. プロセスの属性の情報を得る方法や, プロセスからプロセスを作成する方法等を解説する. ここで "ladsh" という UNIX コマンドシェルの機能を持つサンプルプログラムが載っている. ladsh は本書を読みながら変更を加えていって 読み終わる頃に完成することになっている. そして, 次はやはりファイルの操作方法である. ファイルの読み書きやアクセス権について解説している. 基本的なファイル操作を述べたところで, "ladsh" へリダイレクションの機能追加が行われる. その後, ディレクトリの操作方法とファイル名補完の方法が説明され, "ladsh" にディレクトリ移動とファイル名補完機能が追加される. このようにシステムコールを学習してはサンプルコードで利用していくという形式で プログラミングしながら, システムコールの動作を見ていくことができるようになっている. このパートではこの後に, tty インターフェース, ファイル入出力の多重化の方法, ファイルマッピングの方法, プロセス間通信の手法であるシグナル処理, ジョブコントロールためにプロセスグループを操作, ソケットによるネットワークプログラミング, 仮想コンソールと Linux コンソールについて解説する.
最後のパートはライブラリについての解説である. S-Lang による端末処理, データベースライブラリ, コマンドラインオプション解析, ダイナミックローディング, 名前とユーザデータベースについて解説している.
Appendix にも重要な情報が載っている. I/O ポートへの直接アクセスについてわずかであるが使用方法が述べてある. 後は GPL とその和訳, LGPL が掲載され, 最後に用語の解説と参考文献一覧が載っている.
以上が本書の内容であるが, 全体的に UNIX を意識して書かれていない. Linux が中心となっていて UNIX との互換性について必要な情報を与える様になっている. UNIX システムコール全般を解説しているわけではないので, 解説されていないシステムコールについては他の情報源を探さなくてはならない. 幸い本文の各所に参考文献の紹介が載せられてある. 例えばソケットによるネットワークプログラミングについては, Stevens, W. Richard. 著 UNIX Network Programing が紹介されている.
私は UNIX プログラミングを経験していないため, 本書を読んですぐにプログラミングできるとは感じなかったが, C 言語が理解できればその他の UNIX プログラミング書籍と併せて学習し, アプリケーションを造ることは可能だと思う. Linux システムコール(そのほとんどは POSIX 互換らしいが)について 解説する書籍は現在数少ない状況であるから, この本は Linux プログラマにとって必携の書となるのではないだろうか.
Linux 上で自分のプログラムが走るのを夢見て, さて, もう一度じっくり読み直しである.