cucumber の paths.rb で DBの値を利用する

2011 年 4 月 26 日 Aki コメントはありません

そもそも paths.rb の中で Model使えるのかとか思ったのですが、なんの事はない。普通に User.find(123) とかできるのですね。ちゃんと理解していないからこんな疑問が発生するのでしょう。

それはさておき。

when /フォロワーが([0-9]+)人いるユーザのプロフィール画面/
    user = Users.find(:first, :conditions => { :follower => $1.to_i} )
    edit_user_info_path(user.id)

([0-9]+) など、正規表現でマッチングさせておきと $1 で値渡してあげれば OK
正規表現のマッチングで () 内にヒットしたものが $1, $2…となるのを知らない人は意外にいるようだ。

paths.rb っていうか、結局 routes.rb の話なんだよね。

カテゴリー: Development, Ruby タグ: , ,

Titanium & Android SDK セットアップエラー

2011 年 3 月 28 日 Aki コメントはありません

Titanium Developer (1.2.2) で Android SDK を指定する際に

Couldn't find adb or android in your SDK's "tools"
というエラーが発生する場合

platform-tools/adb を toolsに移動するとエラーは発生しなくなる。
sdk のバージョンアップで adb の配置先が変わったようだ。

WEB+DB PRESS Vol.61

カテゴリー: Development タグ:

TDD テスト駆動開発 in 第4回勉強会@minami.rb

2011 年 2 月 3 日 Aki コメントはありません

第4回勉強会@minami.rb に参加してきた。
http://qwik.jp/minamirb/57.html

その中での1セッション 『TDD テスト駆動開発入門』(by yalabさん)での課題が時間内に終わらなかったので復習をかねて最後までやり遂げる事に。ruby はそんなに書きなれていない事もあり、なかなか手間取ったがやっと課題の要件はみたす事ができたので、ここに晒しておく。
ruby ではそうじゃないよとか、普通はこうだよね。的なツッコミを入れていただけると有難いです。

時間がかかったポイントとしては ruby の実装不足。慣れてないのが大きいのかなと。
ただコーディングするだけならすぐかもしれないが、いかにrubyっぽく綺麗に書けるのだろうかと考えながらだったからのような気がします。実際このコードが rubyの暗黙の美的センスに乗っ取っているかどうかはわからないのですが、極力そうしたつもり。
for とか while とかでぐるぐるまわして if で条件分岐してどうたらとかいうのは、なるべくしたくないですし。

こういう積み重ねが大切ですね。
まぁ、とりあえずこんな感じで一旦アップしておきます。
ちょっと思うところがあるので、これに手を入れてすぐに第2版をアップしたいと思います。

課題
http://www.slideshare.net/yalab/ss-6749458
・月末を返す last_day メソッドを作ってください。
・第一週の日曜日 (先月の最後の日曜日かもしれない)を返すメソッドを作ってください。
・最終週の土曜日(次月の最初の土曜日かもしれない)を返すメソッドを作ってください。
・各週と各日を操作するeach_weekとeach_dayを作ってください。
・月曜始まりと日曜始まりの両方を使えるようにしてください。

calendar.rb
カレンダー

calendarTest.rb
カレンダーのテストクラス
これが重要。これのおかげで一旦完成した後も躊躇なくリファクタリングを進める事ができる。
常々思っている事なのだが、テストコードは人の為と云うよりも自分の安心の為に書くものだと思う。

実行結果


$ ruby calendarTest.rb
Loaded suite calendarTest
Started
................
Finished in 0.02391 seconds.

16 tests, 16 assertions, 0 failures, 0 errors

Calendar.rb

class Calendar
  attr_reader :first_day
  attr_reader :last_day
  attr_reader :base_cwday

  def initialize(year, month, base_cwday = "Sun")
    @first_day = Date.new(year, month, 1)
#    @last_day = (Date.new(year, month, 1) >> 1) - 1
    @last_day = (Date.new(year, month, -1))
    @base_cwday = Date::ABBR_DAYNAMES.index(base_cwday)
  end

  # カレンダー表示上の最初の日を返す
  def display_first_day
    return @first_day - @first_day.cwday + @base_cwday
  end

  # カレンダー表示上の最後の日を返す
  def display_last_day
    return @last_day + (6 - @last_day.cwday + @base_cwday)
  end

  # 当月すべての日を週ごとに配列にして返す
  def each_week
    weeks = Array.new()
    display_first_day.step(display_last_day, 7) {|wd|
      week = Array.new()
      wd.step(wd + 6, 1) {|d|
        week < < d if first_day.month == d.month
      }
      weeks << week
    }
    return weeks
  end

  # 当月すべての日を配列にして返す
  def each_day
    days = Array.new()
    @first_day.step(@last_day, 1) {|date|
      days << date
    }
    return days
  end
end

CalendarTest

require 'test/unit'
require 'date'
require './calendar'

class CalendarTest  < Test::Unit::TestCase

  # 基本パターン
  def test_first_day_201101
    actual = Calendar.new(2011, 1)
    assert_equal Date.new(2011, 1, 1), actual.first_day
  end

  # 固定値で返してないか別の月で確認
  def test_first_day_201102
    actual = Calendar.new(2011, 2)
    assert_equal Date.new(2011, 2, 1), actual.first_day
  end

  # 日数 31日
  def test_last_day_201101
    actual = Calendar.new(2011, 1)
    assert_equal Date.new(2011, 1, 31), actual.last_day
  end

  # 日数 28日
  def test_last_day_201102
    actual = Calendar.new(2011, 2)
    assert_equal Date.new(2011, 2, 28), actual.last_day
  end

  # 日数 29日
  def test_last_day_201002
    actual = Calendar.new(2012, 2)
    assert_equal Date.new(2012, 2, 29), actual.last_day
  end

  # 日数 30日
  def test_last_day_201004
    actual = Calendar.new(2010, 4)
    assert_equal Date.new(2010, 4, 30), actual.last_day
  end

  ## display_first_sunday
  # カレンダー上の最初日曜が前月にあるパターン
  def test_display_first_day_feb
    feb = Calendar.new(2011, 2)
    assert_equal Date.new(2011, 1, 30), feb.display_first_day
  end

  # カレンダー上の最初日曜が前月にあるパターン(月曜始まり)
  def test_display_first_day_feb_Mon
    feb = Calendar.new(2011, 2, "Mon")
    assert_equal Date.new(2011, 1, 31), feb.display_first_day
    puts feb.base_cwday
  end

  # カレンダー上の最初日曜が前年前月にあるパターン
  def test_display_first_day_jan
    feb = Calendar.new(2011, 1)
    assert_equal Date.new(2010, 12, 26), feb.display_first_day
  end

  ## display_last_saturday
  # カレンダー上の最終土曜が翌月にあるパターン2
  def test_display_last_day_201101
    actual = Calendar.new(2011, 1)
    assert_equal Date.new(2011, 2, 5), actual.display_last_day
  end

  # カレンダー上の最終土曜が翌年翌月にあるパターン
  def test_display_last_day_201012
    actual = Calendar.new(2010, 12)
    assert_equal Date.new(2011, 1, 1), actual.display_last_day
  end

  # カレンダー上の最終土曜が翌年翌月にあるパターン(月曜始まり)
  def test_display_last_day_201012_mon
    actual = Calendar.new(2010, 12, "Mon")
    assert_equal Date.new(2011, 1, 2), actual.display_last_day
  end

  # カレンダー上の最終日が当月にあるパターン
  def test_display_last_day_201104
    actual = Calendar.new(2011, 4)
    assert_equal Date.new(2011, 4, 30), actual.display_last_day
  end

  # カレンダー上の最終日が当月にあるパターン(月曜始まり)
  def test_display_last_day_201107_mon
    actual = Calendar.new(2011, 7, "Mon")
    assert_equal Date.new(2011, 7, 31), actual.display_last_day
  end

  def test_each_week
    actual = Calendar.new(2011, 1)
    expect = [
    	Array.new(1) { |i| i+1 },
    	Array.new(7) { |i| i+2 },
    	Array.new(7) { |i| i+9 },
    	Array.new(7) { |i| i+16 },
    	Array.new(7) { |i| i+23 },
    	Array.new(2) { |i| i+30 },
    	]
    weeks = Array.new()
    expect.each { |e|
      week = Array.new()
      e.each { |d|
        week << Date.new(2011,1,d)
      }
      weeks << week
    }
    assert actual.each_week == weeks
  end

  def test_each_day
    actual = Calendar.new(2011, 1)

    array = Array.new([])
    (1..31).each { |day|
      array << Date.new(2011,1,day)
    }
    assert actual.each_day == array
  end

end
カテゴリー: 未分類 タグ: , ,

Mac OS X での Rails アップデート

2011 年 1 月 4 日 Aki コメントはありません

既存バージョンの確認

$ ruby -v
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]

$ gem -v
1.3.5

$ rails -v
Rails 2.3.5

Mac でのアップデートは簡単。以下の通り。

sudo gem update --system

sudo gem install rails

sudo gem update rake

確認

$ gem -v
1.4.1

$ rails -v
Rails 3.0.3

昔はgemすら入ってなかったのに、今は gemもRailsもプリインストールされている。
便利な環境になったもんです。

ちなみに Rails2.3.5 と Rails3.0.3 は共存しています。
Rails2.3.5 系を実行したい場合は

rails _2.3.5_

とすればOKです。

カテゴリー: Development タグ:

JDOM

2010 年 5 月 13 日 Aki コメントはありません

JDOM(Java Document Object Model)はJavaでXMLを容易に扱うため、DOMより使いやすいAPIを提供することを目指して設計された軽量XMLライブラリ

JDOMでXMLプログラミングを単純化する

java: JDOM入門 ~XMLファイルを 読み込む・書き出す~

JDOM – JavaでXMLを容易に扱える軽量XMLライブラリ – オープンソースコラム

カテゴリー: 未分類 タグ:

Selenium がイロイロとバージョンアップしてた。

2010 年 4 月 20 日 Aki コメントはありません

Selenium バージョン1.0 が 2009/6/20 にリリースされた。
Firefox 3.0, 3.5 IE 8 などへの対応を含めているようだ。
また、自動テストツール Selenium の派生プロジェクトが随分と追加されている。

http://seleniumhq.org/projects/

■Selenium Grid
グリッド環境。複数の環境で同時テストを行う

■Selenium Ruby
Ruby テスト用

■Selenium on Rails

■Cubic Test
Eclipse 上でテスト対象の画面遷移がグラフィカルに参照できる。
これは欲しかった。わかりやすい。

カテゴリー: 未分類 タグ:

watij

2010 年 4 月 18 日 Aki コメントはありません

webア プリケーションに selenium を採用してからかなりの時間が経つが、やはりしっくりこない点が多く、IE では使いにくい。他に良いテスティン グツールはないものかとをネットを探していたら、watij (ワットと発音?)なるものがあった。

IE で使うなら selenium よりも使い勝手が良さそう。試行錯誤の度合いも selenium を使うよりは少なかった気がする。

もちろん Alert や Confirm にも対応しており、子ウィンドウや webページダイアロ グにも対応している。ただし FireFox や Opera, Chrome などク ロスブラウザで使う必要があり、FireFox で Selenium IDE など強力な Webオペレーション記録ツールが使用可能なら Selenium を利用する方がコ ストパフォーマンスは良いかもしれない。

今回は IE のみで動く 昔ながらのビジネスア プリケーションをテストする必要があったので Watij を採用する事にした。ネット上にドキュメントがかなり少ないようなので、つまずいた点や参考になりそうな点をつらづらと綴っていく。

参考サイト

ダ ウンロード

こちらから

zip を解 凍し、lib 配下の jar ファイルをすべて eclipse プロジェクトなどにコピーしておくのを忘れないように。

※ダ ウンロードした zipファ イルの中 (src/java-test/watij) に テストクラスがあるので、テスト方法がわからない場合は参考にすればよい。かなり参考になると思う。

使用方法

私の環境では beanShell はうまく動かなかった事と、Java 方が馴染みがある事と、どうせ Java Web ア プリケーションをテストする為に使うので Java 技術者に広く展開できるよ うに Java UI でのテストを試みる。

http://watij.com/ には

IE ie = new IE();
ie.start("http://www.google.com");
ie.textField(name,"q").set("Watij");
ie.button("Google Search").click();

のように書いてあるのだが name が解決できるわけがない。。

どうしてコレでみんなうまくいくのかが実はよくわからず。

自分なりの解決方法をで解決を試みる。*1

Symbol name = new AttributeFinder("name");

結局 Symbol が見つからないだけなので、上記のようにあらかじめ指定して解決。

(BeanShell ではこのままでうまくいったりするのでしょうか?これがよくわからないです。あくまでも例文はそれくらいわかるやろ的なある程度抽象化したコードだったのでしょうか?)

その他のシンボルはこのような感じで指定できる。

Symbol value = new AttributeFinder("value");
Symbol text = new TextFinder();
Symbol xpath = new XPathFinder();
Symbol tag = new TagFinder();
Symbol url = new UrlFinder();

ス クリーンショット

ie.windowCapture("C:\\xxx\\yyy\\0000.png");
ie.windowCapture("./0000.png");

Aタグの href属性に記述された特定の文字列を探し、そのリンク をクリックする方法。

ie.link(xpath,"//A[contains(@href,'javascript') and contains(@href,'shop=00001') and contains(@href,'dept=DA0001')]").click();

例えば href=”javascript(’shop=00001′,’dept=DA0001′,’sex=female’);” のように関数処理したりしている場合でもこのよ うな指定で画面中の任意のリンクをクリックできる。

xpath文 の記述中でHTMLタグは 大文字で記述しないとelementの検索がうまくいかないので注意が必要。

※ 2010.04.09 追記

この問題は

import static watij.finders.SymbolFactory.*;

とする事で解決できる事を確認 ( Release 3.1.0にて確認済み。 )

カテゴリー: Development タグ: , ,

word press プラグインの追加

2010 年 4 月 18 日 admin コメントはありません

■404 Notifier
movable type からの移行に合わせて、可能か限りパーマリンクは一致させたハズなのですが、万が一存在しない URL にアクセスされた場合に登録していたメールアドレスに通知メールを送ってくれる。

WPtouch iPhone Theme
iPodTouch iPhone からのアクセスがあった場合にはそれぞれに最適化した状態で表示してくれる。これは便利 !!

カテゴリー: 未分類 タグ: , ,

CMS の移行

2010 年 4 月 18 日 admin コメントはありません

Movable Type 3.33 から Word Press 2.9.2 に移行してみた。
テーマとかプラグインが管理ツール上でインストールできるのがいいですね。

もしかしたら MT5 にも標準で備わっている機能なのかもしれませんし、MT3 の頃にも style catcher っていうプラグインがありましたが、しばらく Word Press を使ってみようと思います。(本当は MT5 を使ってみないと比較にはならないのですが。。。)

皆様にはご迷惑をおかけします。ご了承ください。
なるべくパーマリンクはそのまま引き継ぐ設定に変更したつもりなのですが、問題があったら教えていただけるとありがたいです。

参考にしたサイト

カテゴリー: 未分類 タグ:

Hello world!

2010 年 4 月 17 日 admin コメント 1 件

WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !

カテゴリー: 未分類 タグ: