またもやワインのことなど
RubyによるWebテスト自動化ツール Watir
お仕事でちょっと負荷テストをしたいなぁと思いまして、対応するツールを調べていましたところ、watir というRubyのツールを見つけました。(何て読むんでしょうね?「ウェイター」?「ワチール」?)
インストール方法はシンプルで以下のコマンドを実行するだけです。
> gem update --system > gem install watir -r -y
さて、実行したところ驚かされるのが、依存関係の多さ。いっぱいインストールされました。
C:\ruby18\bin>gem dependency watir -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz Gem watir-1.6.5 win32-process (>= 0.5.5, runtime) windows-pr (>= 0.6.6, runtime) commonwatir (= 1.6.5, runtime) firewatir (= 1.6.5, runtime) nokogiri (>= 0, runtime) C:\ruby18\bin>gem dependency windows-pr -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz Gem windows-pr-1.0.8 windows-api (>= 0.3.0, runtime) win32-api (>= 1.4.5, runtime) C:\ruby18\bin>gem dependency commonwatir -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz GET 200 OK: http://gems.rubyforge.org/quick/Marshal.4.8/commonwatir-1.6.5.gemspec.rz Gem commonwatir-1.6.5 user-choices (>= 0, runtime) hoe (>= 2.3.3, development) C:\ruby18\bin>gem dependency firewatir -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz Gem firewatir-1.6.5 commonwatir (= 1.6.5, runtime) activesupport (>= 0, runtime) C:\ruby18\bin>gem dependency nokogiri -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz Gem nokogiri-1.4.0-x86-mswin32 racc (>= 0, development) rexical (>= 0, development) rake-compiler (>= 0, development) hoe (>= 2.3.3, development) C:\ruby18\bin>gem dependency user-choices -r -V GET 304 Not Modified: http://gems.rubyforge.org/latest_specs.4.8.gz GET 200 OK: http://gems.rubyforge.org/quick/Marshal.4.8/user-choices-1.1.6.gemspec.rz Gem user-choices-1.1.6 xml-simple (>= 1.0.11, runtime) s4t-utils (>= 1.0.3, runtime) builder (>= 2.1.2, runtime) hoe (>= 1.3.0, runtime)
たまにMLで目にする話題のnokogiriやactivesupportが入っていたりしますので、インストール中はちょっと慌てました。
使い方は、RDocを読んでいただければいいのですが、ASRで使った場合はこんな感じでした。
#! ruby -Ks require 'rubygems' require 'watir' ie = Watir::IE.new # サイトを開く site = 'http://www.google.com' ie.goto site # 入力して実行 form = ie.form(:name, 'f') txfield = form.text_field(:name, 'q') txfield.value = 'raito' button = form.button(:name, 'btnG') button.click
面白かったのは、ボタンオブジェクトに対して利用できるクリックイベント発生用メソッドに、click, click!, click_no_waitの3種類があることです。
- click はクリック結果が表示し終わるまで待ちます。
- click! はクリックをした直後の状況を扱えます。(待ちません)
- click_no_wait はソースをよく読んでいないので、わかりません。
前の2つのメソッドを使い分けることで、click で問題のあるページに確実に移動し、click! で問題となっているアクセスを連発する、なんてことができるわけです。
Ruby関西で発表してきます
iDの端末の起動する瞬間を見た
先日、神戸のラーメン屋での会計の折り、レジにEdyとiDのマークが並んでいたので、「iDで支払います」と宣言してみました。そうすると店長が「ちょっと時間がかかりますので。」と言って、iDの端末をいそいそと起動を始めたのです。
・・・待つこと3分余り。店長曰く、端末起動後、センターと回線を介してそれまでの会計結果を全て読み込むため、どうしても起動直後から時間がかかるのだそうです。
Edyの場合には、会社が違うから起動が速いのか、利用者が多いからあらかじめ起動しておくのか、あまり問題にならないようですが、iD端末の起動は「早ければ10秒くらい、遅ければ2分はかかる」のだそうです。
この場合、「(1)お店の開店時にiD端末を起動する」「(2)オンデマンドで起動する」という2つの選択肢があり、このラーメン店では(2)を選択したようです。利用頻度が極端に低いことを考えれば、回線料金が無駄にかかってしまう(1)よりもお得です。しかし、(2)の場合、お客は帰りしなに待たされることになるため、お店・お客ともヤキモキしてしまい、互いに嫌な印象を残すことになるという点では、「無い方がマシ」と云えそうです。
最近は、様々な電子マネーを使えるようになり、(支払時期やポイントなどの面で)利用者にとって有利な買い物ができるようになりました。しかし、お店側にしてみれば、対応端末を置かなかったら機会損失の可能性が高まり、さりとて置いたところで高いモノを買ってくれるわけでもなく、手数料分だけ利益が目減りするなど、なかなか厳しい時代になったものだ、痛感いたします。
完全「国産」主義
最後にブログを書いたのがいつだったが判らないくらい、放置してしまいました。このくらい放置してしまうと、「次これブログに書こう!」って思ったって、なかなか書けなくなるから不思議です。
さて、そんな中で書くことを決意したのはこれ。
半年くらい前に近所のスーパーで、北海道ワイン(株)の白ワイン「おたる ナイヤガラ」を見かけて飲んでみたのですが、これがなかなか珍しい味わい。一気に惚れ込んでしまいました。以来、何かの折にお土産にお持ちする品物が、もっぱらこの白ワインになってしまいました。今回紹介するのは北海道ワインの社長が書いた本です。
内容自体は、「業界」の常識に関する暴露話とこの会社の道程で、それだけでもそれなりに楽しめるます。しかし、繰り返されるメッセージ「愚直であれ!」がむしろ印象的でありました。
ブドウへの熱い想い、ブドウ農家との信頼関係、ワイン作りへの情熱、地元への愛情(ただし、嶌村氏は道外出身者)・・・我々消費者が「そうあって欲しい」と願い、同時に「そんなことやっていて倒産しないはずがない」と信じ込んでいることを、本当に愚直にやり続け何度も倒産しかけたのだそうです。
儲けさえ産み出しさえすればそれで由とされる時代にあって、手抜きをせず、愚直にもの作りに専念し、地域活性化に貢献する北海道ワイン株式会社。故郷小樽に本拠を置くことを抜きにしても、応援していきたいと思います。
試しに飲んでみたいという方には、1,000円台の白ワインがオススメです。
Ruby勉強会@関西#35に参加してきました。
ohaiさんのRuby/SDLのメンテナンス期間が素晴らしく長い件。
新バージョンから、それまでGC頼りだったリソースの解放が明示的にできるようになった、ということが語られていました。すごい。
ただ、何故かチャットではGCの方が話題になり、それってザ・ワールドだよね、ということで作ってみました。
module Kernel def The(proc) proc.call end def World() Proc.new{ GC.start } end end The World #=> NameError: uninitialized constant World The World() #=> nil (OK)
カッコがださいので、world を使うという逃げ方もできるわけですが、破壊的なメソッドには、! を使うというローカルルールがありますので、こう書くことになりました。
# 差分のみ module Kernel def World! Proc.new{ GC.start } end end The World! #=> nil (OK)
使い途?そんなものはありません。GC.start を使いましょう。