2011年10月21日金曜日

コマンド置換でタブが消える


Korn shellでのコマンド置換をしていた。
タブ区切りのファイルの一行目だけを変数に代入しようと

hoge=`head -1 tab_file`

として無事格納。
なんだけど、その後の処理で、どうも躓く。

保存されている文字列は
aaa bbbb cc
というような形で当然、これがタブ区切りになっているはず。

しかし、
$ echo $hoge | cat -t
とやると
aaa bbbb cc
となるだけ…。

本来、タブ区切りになっていれば
aaa^Ibbbb^Icc
とタブの部分が「^I」になるはず…。

念のため、od -xコマンドでダンプをしてみると、やはりタブ(0x09)ではなくスペース(0x20)になっている。

$ echo $hoge | od -x
0000000 6161 61
20 6262 6262 2063 630a
0000014
$ head -1 tab_file | od -x
0000000 6161 61
09 6262 6262 0963 630a
0000014

headが悪いのかと思い、awkやperlで一行目だけ取ってみたが結果は同様。
「シェルの問題?」と思い、zshに変えたら、うまく行った。

% echo $hoge | cat -t
aaa^Ibbbb^Icc

とりあえずなんとかなったけど、それしかないのかなぁ…?
どなたか何か知ってたら教えてください!!

2011年10月20日木曜日

シェル変数をperlで扱う

備忘録。

シェルスクリプトを書いていて、便利なperlの力を借りたくなる時がある。
何度か「どうだったっけ?」と調べているので、備忘録として書いておこう。

hogeというシェル変数をperl上で扱いたいなら、シェルに展開させればいいので

hoge="hogehoge"
perl -e 'print \"$hoge\";' 
あるいはperl -e 'print "'$hoge'"';

環境によってはどっちかしか動かなかったりするみたい。

joinコマンドに渡すパラメタを作りたくて使ったのが下記。
( $field_num はフィールド数を格納したシェル変数 )

OUT_PARAM=`perl -e 'foreach ( 1..'$field_num' ) { print "1.$_ ";}'`
これで1.1 1.2 1.3 1.4 ...というような文字列が返される


2012.12.27 追記

perlのバージョンなのか、別のサーバでうまく動かなかったので、再度調べてみた。
一番いいのは、環境変数に突っ込んでしまうことみたい。


export hoge="hogehoge" 
perl -e 'print "$ENV{hoge}";' 
※export の代わりにtypeset -x でもOK


シェルスクリプトの中で環境変数に入れれば、子プロセスには引き継がれるけど、親が終われば、そこで元に戻るので、他に影響はないはず。

こっちの方が確実みたいです!

2011年10月13日木曜日

rpmが固まる


rpmが固まってしまい、無理矢理killするしかなくなってしまった…。
調べてみたら、
# rpm --rebuilddb
すれば直る、とあったのでやってみた。なんかDBがおかしくなっちゃったのね。
無理矢理killしたりも悪かったんだろう。

コマンド打って放置。
あれ、20分ぐらい経つけど、まだやってる…。
また固まってない??

さらに調べてみると、どうやらロックファイルが残っているため固まってしまうらしい。
http://his.luky.org/ML/linux-users.a/msg00348.html
# rm -f /var/lib/rpm/__db.*
# rpm -vv --rebuilddb
-vvを付けたので今度は動いているかは確認出来る。
お、5分もかからず復活!
よかったよかった!

しかし、killするしかないってのはキビシイ…。

Seleniumを使ってみた その3


前回前々回と引き続きSelenium 2.0の話。
Webアプリのテストに便利そうだけど、全部自分でスクリプト書くのはちょっと面倒だなぁ、なんて思っていたら、ちゃんとツールがあった。
Selenium IDE

Firefoxのアドインで、実際にブラウザ操作しながら記録できる。
しかも、その記録はJava, PHP, Perl, Rubyなど多種の言語にエクスポート可能!!
もちろんエクスポートしたコードはSeleniumが動いているサーバに置けば実行可能。
これはスゴイ!

自分でソース見ながら「このテキストボックスのIDがこれで、パスワードのIDがこれ…」とか地味な作業が一気になくなる。
なんて便利なんだ!!

とりあえずPerlでやってみる。
cpanでいろいろインストールが必要だったが、特に問題なく終了。
ただUTF8が前提なので、is_test_present_okなどで日本語の文字列の存在確認をしようとするとそのままだと失敗する。
use utf8;
を最初にくっつければ動くようになった!

2011年10月12日水曜日

Seleniumを使ってみた その2


前回は導入しただけなので、引き続き、Seleniumを使ってみる。

まずはWebDriverのドライバ(ややこしいな)を選ぶ。
大雑把に言ってしまうとWebDriverは、ブラウザの名前。
Firefox, IE, Chrome, Opera, iPhone, Android, それにHtmlUnitというのがある。
(2011年10月12日現在では、Opera, iPhone, Androidは使用不可)
例えば、Firefoxのドライバは、Firefoxをブラウザとして使用してテストする。
IE, Chromeもその名のとおり。
HtmlUnitというのはサーバから返されるHTML文書を解析して動くらしい。
テキストだけなのでやりやすいけど、実際の画面は見えないし、「本当にIEで動かしたらどう見えるか?」は分からないのが欠点。
でも、Rubyではサポートされてない…。

使い方は
driver = Selenium::WebDriver.for :<ドライバ名>
とすればロードされる。

テストしたいページを開くには
driver.get
となる。

さて、例えばログイン画面が出てきて、ちゃんとログインできるかテストするにはどうするか?
そんな難しい話ではなく、HTMLエレメントの名前やらIDを使って指定すればいい。

まずはエレメントを探す。
id = driver.find_element :name => "username"

そのエレメントに値を入力するには
id.send_keys <ユーザ名>

パスワードも同様に
pass = driver.find_element :name => "password"
pass.send_keys <パスワード>

でフォームの内容を送信。
pass.submit

divのcontentクラス内のh3を取得(10秒だけ待つような設定)
wait = Selenium::WebDriver::Wait.new(:timeout => 10 ) #10 秒
begin
  result = wait.until { driver.find_element(:xpath => "//div[@class='content']/h3") }
ensure
  driver.quit
end

これでassertとかすればよさそう。

Selenium 2.0は便利だけど、ドキュメントがまだまだ整備されていないのが残念。
これからどんどん増えることを希望。

さらに続きます。

Seleniumを使ってみた その1


最近リリースされたSelenium 2.0を使ってみた。
http://seleniumhq.org/
公式には前バージョンからいろいろ変わった点があるが、そもそも前バージョンを使ったことがないので、この辺は読み飛ばし。

テストプロジェクトの設定で、2011年10月12日現在ではJava, C#, Python, Rubyしかサポートされていないらしい。
この中じゃJavaが一番分かるかなぁ、と思いきやMavenを入れる必要があるっぽい。
いや、なくても出来るんだろうが大変らしい。
業務でJava使わないからそこで時間取られるのもなぁ。
う~ん、サンプルコードしか打ったことないけどRubyにするか(無謀?!)。

まずはインストール。
公式からSelenium Serverをダウンロードしたけど、要らなかったかも…。
http://seleniumhq.org/download/

単に
# gem install selenium-webdriver
でよかったみたい。

rubyのサンプルコードも公式にあったので、そのままコピペしてgoogleTest.rbというファイルに保存し動かしてみる。

% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/binary.rb:116:in `path': Could not find Firefox binary (os=linux). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path= (Selenium::WebDriver::Error::WebDriverError)

失敗。
firefoxを使ってテストしているのに、firefoxが入ってなかった…。
そういえばfirefoxがなかった。yumでインストール後、再度実行。
% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:77:in `connect_until_stable': unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:37:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/socket_lock.rb:20:in `locked'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/bridge.rb:19:in `initialize'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `new'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `for'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver.rb:81:in `for'
        from googleTest.rb:4

またも失敗。
そうか、firefoxだからGUIが必要。CUIでやってたらそりゃ起動できないわ。

気を取り直してGUIで実行。
(TeraTerm + Xmingの環境構築はこちらを参考に。)
http://d.hatena.ne.jp/information-world/20090602/1243938029

firefoxが起動後、パパっと勝手に動いて結果出たら終了。
% ruby googleTest.rb
Page title is Cheese! - Google 検索
Page title is Cheese! - Google 検索

なかなかおもしろい!
続きます!