Ruby スクリプティングテクニック

作成日: 2008-04-06
最終更新日:

本書の目的

主にテスト技術者を対象に、 テストを確実に、楽に行うための方法を提供する。 道具は Ruby である。 4種類のプロジェクトを例にとって、その方法を説明する。

アンインストールチェッカー

ハードディスクのあらゆるスナップショットを取り、比較する

バージョン管理システム

変更情報を取得し、要約する

Web情報処理

Webサイトから情報を取り出し、加工する

ウォッチドッグ

長時間実行されているプログラムを監視し、終了時にメッセージを届ける

原題は "Everyday Scripting with Ruby" (Ruby で毎日スクリプティング) である。 サポートページ (http://www.pragprog.com/, 英語)がある。

アンインストールチェッカー

ここは特に問題はなかった。

バージョン管理システム

戸惑った点がある。

Subversion のインストール

Subversion とは、バージョン管理システムの一つであり、 CVS の後継であるといってよい。 p.56 では「ただしこのプロジェクトに取り組むのに Subversion は必要ありません。」とある。しかし、 後の確認作業では、やはり Subversion は必要である。 インストールしないと、churn.rb の実行時に
svn: Command not found
のようなエラーが出る。svn が、 Subversion のコマンドである。

インターネット接続

ruby churn.rb を行うときは、 インターネットに接続することが条件である。 なお、Subversion のインストールとインターネット接続が必須であることは、 p.77 で説明されている。

チャーンとは

第6章の表題は「チャーン(churn):落ち着いてプロジェクトを記述する」 である。この、チャーンということばがわからない。 チャーンとは、牛乳を振ってバターを作るための攪乳器であり、 自動詞として使われると、激しく揺れ動くなどの意味がある。 また、携帯電話などで新しいサービスを求め会社をすぐに変える、 移り気な顧客のことをチャーンというようだ(e-wordによる)。 だから、この章は「移り気」とか「猫の目」と呼ぶといいだろう。

結果はこれでいいのか

最終結果は、変更数が数字とアスタリスクのバーで出ることになっている。 しかし、私がやってみると、このとおり。

$ ruby churn.rb
Changes since 2008-03-09:
         audit  (0)
   fulfillment  (0)
   persistence  (0)
            ui  (0)
          util  (0)
     inventory  (0)

何がわるいのか?(2008-04-06)

まず svn から

以上の記述は、Vine Linux 4.1 で行った。最近は日和見して Windows XP に戻った(退化した)ので、 こちらで実験してみる。 まず、p.78 の実行結果から

prompt> ruby churn.rb
Changes since 2009-01-14:
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
         audit  (-1)
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
   fulfillment  (-1)
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
   persistence  (-1)
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
            ui  (-1)
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
          util  (-1)
svn: リビジョン引数 ''HEAD:{2009-01-14}'' で構文エラーが生じました
     inventory  (-1)

この無節操なエラーは何だ?元に戻って確かめてみよう。

まず、p.56 と同じように svn log を実行した結果が出るかどうか確かめよう。

prompt> svn log --revision 'HEAD:{2005-07-30}' svn://rubyforge.org/var/svn/churn-demo/inventory
svn: リビジョン引数 ''HEAD:{2005-07-30}'' で構文エラーが生じました

本と同じように実行したのに、無慈悲なエラーが出る。試行錯誤の末、 正しい結果が返ってくるコマンドは次の通りだった。

prompt> svn log --revision HEAD:{2005-07-30} svn://rubyforge.org/var/svn/churn-demo/inventory
------------------------------------------------------------------------
r2 | marick | 2006-08-08 04:26:21 +0900 (火, 08 8 2006) | 1 line

added code to handle merger
------------------------------------------------------------------------
r1 | marick | 2006-08-08 04:21:47 +0900 (火, 08 8 2006) | 1 line

first touches
------------------------------------------------------------------------

結局、リビジョン引数を一重引用符で囲っていたのが誤りだとわかった。 なお、svn のバージョンは 1.4.6 (Windows) である。 ちなみに、日付に空白を含むのであれば、日付の中を二重引用符で囲む。

prompt> svn log --revision HEAD:{"2005-07-30 17:05"} svn://rubyforge.org/var/svn/churn-demo/inventory

気持ちを新たにして churn.rb の該当箇所を修正しよう。今度はどうか。

Changes since 2009-01-14:
         audit  (0)
   fulfillment  (0)
   persistence  (0)
            ui  (0)
          util  (0)
     inventory  (0)

前の結果と同じだ。何が悪いのだろう。

いろいろ回り道をした挙句、やっとわかった。 本プログラム churn.rb の仕様は「一ヶ月前から今日までに加えられた変更を知る」 ものである。サンプルのデータははるか前から変更が加えられていないので、 変更ゼロ件として報告される。だから挙動は正しかった。私が誤解していただけである。 何かしらの数が出てくるようにしたいならば、仕様を変更すればよい。 たとえば、前月の日付を計算するところを、固定の日付にすればよい。 この場合は、churn.rb の
start_date = month_before(Time.now)
の行を書き換え、次のように固定日付にすればよい。
start_date = "2005-07-30"
結果は次の通り。本の数値とは違うが、svn log ... コマンドの結果と整合する数値が表示されるので、これでよい。

Changes since 2005-07-30:
         audit * (5)
   fulfillment  (2)
   persistence * (3)
            ui ** (8)
          util * (4)
     inventory  (2)

そういえば、上述のサポートページの Errata にこのような投稿があったのだが、 眺めただけで記憶に残していなかった。重要な指摘なので、ここに訳しておく。

#28386: 他の方も指摘している通り、(本の通り行うと)この svn リボジトリは長らく更新されていないので、つまらないテスト結果しか出ない。 それなら、開始時を Time.local(2006, 7, 11)のように固定してはどうか。 こうすれば、意味のある変更がなされた結果が表示される。 ただし、固定すると練習問題1がおかしくなるので、こうすればよい。(後略)

本項の見直し結果をするにあたり、 掲示板で有益な情報を提供いただいた Tatsuo Indou さんに感謝します。(2009-02-11)

Web 情報処理

ここからは再度(2008-04-06)に記述した項である。 ここでも少し戸惑った。

大文字化

132ページの text.scan(/Cusomers.*also/)は、何もマッチしない。 もとの Amazon では、also ではなく、Also だからである。 そのため、正規表現に、大文字小文字の区別をしない i オプションをつけるとよい。すなわち、 text.scan(/Cusomers.*also/i) とする。

表示の違い

130ページのアフィニティトリップの結果は次の通り (2008-04-06T10:33:00)

$ ruby affinity-trip.rb 0974514055
<span id="btAsinTitle">Programming Ruby: The Pragmatic Programmers' Guide, Second Edition [ILLUSTRATED]
(Paperback)</span><!--aoeui-->
affinity-trip.rb:118:in `scrape_affinity_list': private method `scan' called for nil:NilClass (NoMethodError) from affinity-trip.rb:40:in `trip' from affinity-trip.rb:34:in `times' from affinity-trip.rb:34:in `trip' from affinity-trip.rb:153

これは、タイトルの取得のところで、 この本の出版以降 Amazon の書式が変ったためと思われる。 そこで、scrape_title メソッドでは次のように span タグを考慮しないといけない。

  変更前:%r{<b.*?>(.*?)</b\s*>}m =~ html
  変更後:%r{<b.*?><span\sid.*?>(.*?)</span\s*>}m =~ html

この変更により、最初の1行は、不要なタグが消えた。

もうひとつのエラーは、scrape_authors メソッドで、 抽出条件の文字列を field-author-exact から field-author に変えれば解消されるはずである。しかし、試した結果、 不具合は解消されなかった。

Programming Ruby: The Pragmatic Programmers' Guide, Second Edition [ILLUSTRATED]
(Paperback)

watchdog

第 IV 部は「完ぺきなスクリプタを目指して」となっている。最初に watchdog のインストールについて書かれている。 ruby setup.rb all を実行する、とある。しかし、今では gems を使うのが普通だろう。 私は gems install --remote watchdog を行った。

C:\Users\satosi>gem install --remote watchdog
Fetching: watchdog-0.3.0.gem (100%)
Successfully installed watchdog-0.3.0
Parsing documentation for watchdog-0.3.0
Installing ri documentation for watchdog-0.3.0
Done installing documentation for watchdog after 1 seconds
1 gem installed

(この項 2014-11-29)

まりんきょ学問所Rubyの浮き輪 > Ruby スクリプティングテクニック


MARUYAMA Satosi