5/26、プログラミングRuby 1.9
RailsによるアジャイルWebアプリケーション開発 第3版 2
レビューに少し協力した関係で
RailsによるアジャイルWebアプリケーション開発 第3版[rakuten]を一足早く入手した。レビュー中には24〜27章に手をつけられなかった。せっかくいただいた本なのでまずはそのあたりから読んでいこうと思っている。
例によってぶ厚くて、しかも辞書のように(ちょっと大げさ)薄い紙の本。このボリュームを改めて通読しようとすると、まず、始めるぞという意識的に気持ちを高めて取り掛かることになる。というのは、いくらかでもRailsを触ってきたり、コードを読んだり、コードを書いたり、という経験があるからだ。
けれども、実際に通読してみると(まあ途中までなんだが)、思った以上に広い範囲のことが書かれているのがわかる。
中級者以上を対象としたRails本がたくさん出てきているなかでは、入門者も対象とするこの本は、もしかするとちょっと距離をとられてしまいがちなのかもしれない。でももし自分の知識にどこかに不安があったり、あるいは安定感に欠けるなどと思うことがあったりするなら、改めてこの本にあたってみてはどうだろうか。間口が広いわりには「奥が深い」ところのあるRailsなので、何かしら発見があるかもしれない。
もちろんRailsをこれから始めるという人にもおすすめできる。
上述の通りかなりのボリューム感だが、本を読み始めてほどなく、ほんのちょっと手を動かすだけで、実際に動くRailsアプリケーションを作ることができる。ボリューム感はむしろどこまででも付き合ってくれる安心感につながる。Railsの入門書もやはりたくさん出てきている。好みや相性もあるからどんな人にでもとは言えないが、たくさんある本の中から選びかねているならまずはこれ、とは言えそうだ。
なお、対応しているRailsのバージョンは次の通り。
本書はRails 2.2に基づいています。具体的には、本書のコードはRails 2.2.2のRubyGemsパッケージにより動作確認を行っています。
(5ページ、原書についての記述)Rails 2.3の変更点については、注で補足しています。また、Rails 2.2.2およびRails 2.3.3以前のバージョンには脆弱性がありますので、本番環境で利用する場合は、2.2.3以降(2.3系の場合は2.3.4以降)のバージョンにアップグレードしてください。
(iiiページ、訳注)
入門git
先日発売された
入門git[rakuten]は、レビューに参加させてもらった関係で一足早く通読した。
これまでgitの解説というと、インストールを終え、コマンドラインの雰囲気を軽くさらったあたりで急に深い話題になってしまうものが多くあった。オブジェクトがどうこうとか。そうでなければ最初から最後までごくごく軽い話題にとどまるか。
オブジェクトがどうこうというような話は、知っているかどうかで「使いこなし」に大きな影響があるのはたしか。理解を深めたり、何かあったときの対処にも影響するかもしれない。よって、それはそれで役に立つというか、なくてはならない解説であるのもたしか。技術的な刺激も得られるかもしれない。だが、何はともあれ使い始めなければならなくなってしまったといった状況で読むのには、そうした文書はちょっと重い。
入門gitはそのような状況にぴったり合う。
この本では、gitの奥深い話はおくことにしたようだ。その上で、普通のバージョン管理システムとしての機能を使うのに十分な情報を段階的に解説している。他のバージョン管理システムとの対比がないわけではないが、本格的にバージョン管理システムを使うのは初めてという人でもまずまず読みこなせるのではないかなと思う。
そんなわけで、そろそろgitにも手を出さなきゃな、とか、気にはなっていたけど難しそうだな、とか、バージョン管理システムはよくわかんないんだけどRailsがgitらしくて、とか、そんなふうに考えているなら手に取ってみてほしい。
入門書の次に読むRailsデプロイ
とあるきっかけから、監訳者の一人の橋本さんを通してオライリーさんから
Railsデプロイ[rakuten]をいただいた。Railsプログラミングがひと通りできるようになった、常用しているマシンの上で動作させてきた、自分以外の人々に向けたサービスをこれから始める。本書はそんな人々を助けてくれるだろう。
プライベートに運用するアプリケーションを除くと、普段は自分がログインすることがほとんどないようなマシンがアプリケーションを動かすための場になる。そのようなマシンは一つだけではなく、用途ごとに複数のマシンを並べて動作させることが多い。このようなマシン環境下でアプリケーション群を正常動作させ続けるには、いつも使っているマシンでアプリケーションを運用するのとは異なった視点・手法・作業が求められる。
たとえば、アプリケーションを動かすのに必要なハードウェア環境…… はともかくとしても、ソフトウェア環境を整えなければならない。それはRubyのインストールから始まるかもしれないし、もしかするとRubyをインストールするための環境作りから始まるかもしれない。また、HTTPサーバを設定しなければならないだろうし、複数あるマシンがうまく連携できるようにもするだろう。アプリケーションのリリースは複数のマシンが対象となる。マシンの用途が違えば作業も違う。そして、マシンを増やすことがあればそのたびにそれらすべてを行う必要がある。いきなりなにもかもやろうとすると大変だ。
本書を読むと、手元で動かす→他のある程度整備されたホストで動かしす→VPSを借りて動かす→専用ハードを借りて……、といった具合にじょじょに規模を拡大していく工程をひと通りながめることができる。その内容は単に「Railsアプリケーションをリリースする」というだけではなく、複数のマシンでサービスを運用するための機能分散の方法や負荷分散をするためのリバースプロキシの設定など広い範囲をカバーしている。
そのうえ、複数のデータベースを運用するためのMySQLの設定とアプリケーション側での対処、チューニングのためのベンチマークやプロファイルの取り方、キャッシュの使い方とキャッシュ乱用への注意など、アプリケーションをサービスとして運用するのに必要な領域についても実践的に解説する。そのような点から、アプリケーションを作れるようになり、さあこれからデプロイしようといったストーリーの入口で本書は活躍するだろう。
少々残念なのは、今この時期にPassengerが扱われていない点。もちろん出版時期などからいたしかたないところではあるのだが、カバーしている範囲の広さからすると実におしい。また、Railsからはやや離れたところでの説明や表現にはいくつかひっかかる点もあった。一つあげると125ページの「Linux上でRailsアプリケーションを動作させるためには……最低限でもCやC++のコンパイラ……が必要」といった記述で、これはRMagickなどをRubyGemsで運用することなどを前提にしているのであるが、できるならコンパイラは避けたいところと考える人も少なくないはずだ。(他のものも含めて出版社の方に伝えておいた。)
一方、本筋とやや離れたところでちょっと感心したのは、Apache HTTPサーバの設定作業の中で、a2enmodやa2dismodなどに触れている点だった(本書ではUbuntuを主な環境としている)。この種の特定のOS環境(この場合はDebian/Ubuntu)に独特な手順というのはともすれば流されてしまいがちである。もちろん明確な方針があって別のやり方で運用するのは構わない。だが、マシンはいつか自分の手を離れるものであるとすると、理由がなければできるだけその環境の流儀に従っておいたほうがよいと思う。考えてみればRailsだってそうなのだから、環境整備でも同じようにしたってよいだろう。
追記(2009-07-24)
読んでいてひっかかった点は編集さんに送ったが、そのうち正誤表に載っていないものや載らなそうなものを以下に挙げておく。
- 56ページ15行目「コマンドラインに関する知識と何でもGoogleで検索してみる」
- 「知識を何でも」?
- 67ページ下から10行目「インストール中にどのような種類の設定を行うか聞かれたら"Internet site: ... "(メールはSMTPを使って直接送受信される)という選択肢を選んでください」
- 他のところでメール関連のことを扱っているのかなとも思ったのだけど特別に前提条件はなさそうなので、本文の記述に従うと外部からアクセス可能なSMTPサーバをたてるということになりそう
- となると、一般的な選択という点ではローカルホストのみで動作させるくらいにして、必要に応じてそのような設定をしよう、というような書き方のほうがよいのでは
- 106ページ囲み
- ファイルを/etc/init.dにコピーするだけでよいように読めるが一般にそのようなことはないはず
- Debian系であればupdate-rc.d、Red Hat Linux系であればchkconfigでの操作が必要になる
- 107ページ囲み「flexとbisonそしてbyaccをインストールしましょう」
- flex、bison、byaccのうちのいずれか、ではないのかな
- 110ページ15行目「Linuxシステムでは、initは/etc/init.dに置かれるすべてのスクリプトの実行を担当しています」
- initはすべてのプロセスの祖先ですから間違いとはいえないが、 ここでいおうとしているinitの用法と /etc/init.d(より正しくは/etc/rc*.d)以下のファイルの運用はまた別だといっても差し支えないと思いう
- /etc/init.d(略)以下のファイルにより起動したサービスは /etc/inittabで管理されるプロセスとは違ってinitにより再起動されることは通常ない
- 110ページ訳注「sudo update-rc.d monit remove」
- /etc/init.d/monitが残っている場合、update-rc.d -f monit removeとする必要がある
- そうでなければrm /etc/init.d/monitした上でupdate-rc.d monit removeとする
- 110ページ下から4行目「Monitを使ってMongrelを管理するようになったら…mongrel_cluster/recipesを使う必要はなくなりました」
- mongrel_cluster/recipesが唐突に出てきている…… ような気がする
- 読み落としてしまっただけかも(検索可能な何かがあればなあ)
- 111ページ下から4行目「FastCGIのゾンビプロセス」
- 「なぜか居残り続けてしまう、仕事をしないfastcgi管理下のプロセス」にすぎず、UNIX一般にはこのようなプロセスをゾンビとは呼ばないように思う
- 実際、reaperはfastcgiプロセスに対してシグナルを送っているわけだけど、本来の意味でのゾンビプロセスはそもそもシグナルを受け取れる状態にない
- 参考: プロセス - 終了状態
- 117ページ15行目「ハートビート」
- 外部から動いていることを確認すること自体をハートビートとはあまり呼ばないような気が
- 一般的には生存証明を自らするようなものをそう呼んだり、あるいは、HAクラスタなどでサービスが動作していることを待機系とで情報交換するような仕組み全体を指すことはあると思う
- いずれにしても本文で説明されているのはNagiosなどがするような監視であって、死活監視などと呼ぶほうが一般的ではないだろうか
- 127ページ下から二行目「CNAMEレコードはAレコードのエイリアス(別名)のようなものです。対象のAレコードは自分のものでも他人のものでもかまいません」
- DNSの「リソースレコード」と「名前」が混同されているように思える
- CNAMEレコードでは名前に対応する正しい名前を定義する
- CNAMEレコード全体をもってエイリアスと表現するのは間違いとまではいえないが、CNAMEレコードの対象がAレコードというのは表現としておかしいのではないか
- 実際、CNAMEレコードを持つ「名前」に他のリソースレコードを付けてはならないことになっているはずで
- 129ページ10行目「大きな値(例えば7日)を指定すると、ブラウザなどのクライアントソフトウェアがDNSに問い合わせを行う回数を削減でき」
- 「クライアントソフトウェアがDNSに問い合わせを行う」というのはリゾルバの動作で、リゾルバの動作にはTTLはリゾルバの動作に影響を与えない…… のではないかしら
- MS-Windowsなど、ある種の環境ではDNS問い合わせについてのキャッシュ機構があるようだが、それらを考えにいれたとしても実装依存というのがやっとだと思う(MS-Windowsの機構はキャッシュサーバの一種なのではないかしら?)
「プログラミング言語Ruby」を読まなくてもよいのは誰か
一昨日になってようやく入手できた
プログラミング言語Ruby[rakuten]を、Ruby 1.9.1RC2とそのNEWSファイルを手元に置きながら読んだ。
少々乱暴な言い方になるかもしれないが、この本は以下のような人には用のないものだと思う。
- Ruby 1.9.xもRuby 1.8.xも十分に理解できている
- Ruby 1.9.xをしばらくは使うつもりがなく、自分が使う範囲においてRuby 1.8.xに不明なところはない
- Rubyの経験がなく、その他のオブジェクト指向言語の経験および知識もない
- プログラミング経験がなく、これからプログラミングの学習を始める
この本はRubyそのもののかなり詳しい解説書である。入門書ではない。一応は簡単なところから入る形になっているのだが、大部分はすでにRubyを使っていて、ちょっとしたことなら困らない程度の知識があることを前提としている。つまり、Rubyをより深く知るための解説がある。プログラミング自体の入門者は別の本(おそらく初めてのRuby[rakuten]やたのしいRuby[rakuten]など)が適切だろう。プログラミングの経験はあるが、Rubyやその他のオブジェクト指向言語に馴染みがないという人は、チュートリアルなどをこなしてからにしたほうがよさそうだ(これに当たる人には「用のない」とまでは言えない)。
全体的にはRuby 1.8系をベースにしていると思われるが、Ruby 1.9.1での状況についてもそれなりのスペースを当てている。私は1.9.1での新しい機能や1.8系との非互換に特に注目して読み進めたのだが、たとえば多言語化関係のような大きなトピックにはそれなりのスペースがあてられている。込み入ったところではどうかは分からないが、多言語化の仕様・実装の推移をほとんど追いかけていなかった(追いかけられなかった)私でも、その基本的な使い方や注意点がわかるのに十分な記述はある。細いところでも、メソッドの追加や削除についての補足があり、場合によっては新しい機能(たとえば->(){}やノンブロッキングIOなど)の詳しい使い方が示されてもいる。
参考までにRuby 1.9.1RC2のNEWSファイルとの対応状況をごく簡単にまとめてみたところ、少なくとも六割くらいはカバーされていることが分かった。NEWSファイルの記述は粒度がまちまちだということもあって、実のところ、読んでみた印象よりもこれは低い数値だった。とはいえ、前述した通り大きなトピックについては十分にカバーされている。
Ruby 1.8系から変化のない部分についても(もちろん)詳しい説明がある。思いもよらぬ機能や動作があることをこの本によって知ることができた。たとえばこんなことである。
f(3+2)+1とf (3+2)+1の違いp {1=>2}とp 1=>2で正しいのは?to_sとto_strの違いinitialize_copyの機能とdup、cloneandと&&の使い分け方ensure節の中でreturnすると例外が消える- Ruby 1.9.1の
Range#include?の遅さ - Ruby 1.9.1のスレッド実装では複数スレッドが同時に実行されることはない
これらは、このような細いところまで説明しているという単なる例だ。一方で、HashやNumericなどと馴染むような標準的なクラスの作り方(7.1節)に十分なページ(20ページ)があてられてもいる。そうかと思えば「関数プログラミング」と題して10ページほどの解説を展開したりする(6.8節)。
そのようなわけで、Ruby 1.9.1をこれから始めようというのならおすすめだし、Ruby 1.9.1を使わないにしてもRuby 1.8.xで不明な点があるなら(そして他の書籍などが手元にないなら)やはりおすすめできる。結局のところ、多くのRubyユーザにとって読んでみて損のない本だと思う。ただし、何かの作業のための実用的な(というのは外部コマンドを起動したり、特定の形式のデータ処理をするような、実務的な)プログラミングのためのヒントは限られたものしかないため、そのような意味での情報を求めている人は別の書籍なりなんなりと比較してみたほうが良いだろう。
現場で使えるMySQL
先日の文字化け——というより文字欠けの件があってから、MySQLのそのあたりの動きをもう少し知っておこうかなと思い、マニュアルなんかにもあたってはみていたのだが、ちょうど書店に行ったので並んでいる本を比較してみた。
店頭にはMySQLについてだけを説明する本と、Apache HTTPサーバやPHPを組み合わせてインスタントなサーバ構築みたいな本とがあって、後者のほうが量としては多い。いくつかは手に取って見てみたが、これらの本はおおざっぱなこと、たとえば「SET NAMESでハッピー」みたいなことしか書いてないのが多いようだった。さすがにそれではダメなのでパスすることにして、
MySQL徹底入門 第2版[rakuten]と
現場で使えるMySQL[rakuten]、それにムックの
超・極める!MySQL[rakuten]を見てみることにした。店頭にあったそれ以外のMySQL本は文字コードまわりの話題にまとまったページを割いておらず、コラムなどの形で「SET NAMESで」とある程度であった。
三冊のうちで文字コードまわりの話題を平易に説明していたのは徹底入門だと思った。著者の考える基本的な指針を示しているところなどはシンプルで分かりやすいと思う。そういった易しいところだけでなく、文字コード変換がどこでどのように行われていて、各種の設定がどう効いてくるのかもきちんと説明している。skip-character-set-client-handshakeのことも書いてあって、この設定が悩みをかなり少なくしてくれる可能性が示されている。
ところが、次にムックをあたってみると「skip-character-set-client-handshakeでハッピー」というのにも制限があって、それは、たとえばmysqlコマンドの--default-charcter-setの指定が無視されるようになってしまう点だとある。同ムックではこのことが徹底入門には書かれていないとあったが、たしかに明確には書かれてなさそうだった(索引で調べられなかったので、はっきりしたことは言えないが)。つまりこのオプションはバージョン4.0の時代の挙動に戻すものであると説明されており(たしかそんなような記述だったと思う)、なるほどなと納得。改めて英語のマニュアルを読んでみるとたしかにそのように書かれていて、このあたりskip-character-set-client-handshakeも名前だけが独り歩きする状況が少しあるのかもしれない。
現場で使える〜は雑誌記事の連載をまとめたもののようで、そういった雰囲気の中でではあるが、わりにきちんとした説明があった。前述の二冊でも文字コード変換とは別にエスケープによる問題を扱っているが、そのあたりの詳細はこの本が一番だと思った。切り口としては落し穴にはまらないようにというものであり、徹底入門のようなタイプの説明とは違った分かり易さがある。binaryにしてはまる、といったような。文字コードまわりの説明も、やはり説明の仕方は違っているが、他の書箱と同様に丁寧なものだと思った。
それぞれの難点を挙げると、徹底入門はやや推奨設定を前提としている雰囲気があり、ムックでの指摘のようなところるある。また、索引が粗い印象を受けた。ムックのほうはというと記事が書き言語ではなくて話し言語で書かれている点に、少々読み難い印象を受けた。徹底入門の捕捉として読んでみても良いのではないか、とは思うのだが。現場で使える〜は、ムックのような意味でではないが、やはり連載記事がベースになっているので徹底入門のような体系的な読み易さは得られないところがある。もっとも、そういったエリアを狙った本ではないと思うので、それだから問題だということもないとは思う。
ま、そういう経緯を経て現場で使えるMySQLを買ってきた。
dRubyによる分散・Webプログラミング
おっ、dRubyによる分散・Webプログラミングがいよいよ出ますか。楽しみ。
Rubyist Magazine 005
どうもRubyist Magazineの記事をブラウザで読むのは疲れる。なんでだろ、というのは深く考えず、試しにいくつか——ちょうどよくRuby on Railsの記事とCGIKitの記事があるのでそれらをプリントアウトしてみた。
で、CGIKitの記事から読み始めたのだけれど、……うーん、文章自体が難しくてよく分からない。たとえばこれらのファイル*1で記述されたエレメント (インスタンス変数やメソッドを HTML として表示する仕組み) をコードがバインディングし、HTML に変換して出力することで Web ページが表示されるようになっています
って、どういう意味だろう。そもそもファイルの種類を示していると思われる「バイディング」とこの文中の「バインディング」が同じものなのかそうでないのかも分からない。とりあえず置いといてもう少し続きを読んでみたのだけど、やっぱり分からないなあ。同様に「エレメント」なんかも意味をとりにくい。
その他、どうしてCVSからコードを取らねばならないのかなあとか、「はじめに」でCGIKitの比較対象がcgi.rbというのは無理があるのではないかなあとか。「CGIKitとは」や「TapKitとは」というところから始まる記事なのでそれらをあまり知らない人向けの記事だと思ったのだけど、そうでもないのかも。
というところで今日のところは断念してまた今度。RoRの記事もまたにしよう。
*1 テンプレート(.html)、バインディング(.ckd)、コード(.rb)とある。

言語編
ライブラリ編


