Ruby スクリプティングテクニック |
作成日: 2008-04-06 最終更新日: |
主にテスト技術者を対象に、 テストを確実に、楽に行うための方法を提供する。 道具は Ruby である。 4種類のプロジェクトを例にとって、その方法を説明する。
ハードディスクのあらゆるスナップショットを取り、比較する
変更情報を取得し、要約する
Webサイトから情報を取り出し、加工する
長時間実行されているプログラムを監視し、終了時にメッセージを届ける
原題は "Everyday Scripting with Ruby" (Ruby で毎日スクリプティング) である。 サポートページ (http://www.pragprog.com/, 英語)がある。
ここは特に問題はなかった。
戸惑った点がある。
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)
以上の記述は、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)
ここからは再度(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)
第 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 スクリプティングテクニック