トップ 最新 追記
RSS feed

皮肉な日々と心意気


2010-09-03(金)

MacBookのバッテリーを交換した

ふだんはリッドクローズドモードで使っているMacBookを、ひさしぶりに持ち運ぼうとしたら、バッテリーがものすごく膨張していることに気がついた。(写真を撮影したつもりだったが撮ってなかった…)

購入から2年とちょっと。充放電回数や容量には問題なかったけど、ジーニアスバーに持って行ったら無償で交換してもらえた。

Tags: Mac

2010-09-04(土)

SnowLeopardのApacheでVirtualHostを設定する

Apacheの設定ファイルを編集する。

% sudo -e /private/etc/apache2/httpd.conf

sudoに-eオプションをつけると対象ファイルをユーザ権限で書き込める場所にコピーしてから、環境変数$VISUAL,$EDITORに設定されたエディタで編集できる。

#Include /private/etc/apache2/extra/httpd-vhosts.conf

上記の場所のコメントを外しておく。

次にvirtual hostを追加する。

% sudo -e /private/etc/apache2/extra/httpd-vosts.conf

サンプルが書かれているのでコメントアウトして、以下のように追加。

<VirtualHost *:80>
    <Directory /Users/sen/Sites/snest.net>
        AllowOverride All
    </Directory>
    ServerAdmin webmaster@snest.net
    DocumentRoot "/Users/sen/Sites/snest.net"
    ServerName snest.local
    ErrorLog "/private/var/log/apache2/snest.local-error_log"
    CustomLog "/private/var/log/apache2/snest.local-access_log" common
</VirtualHost>

お手軽にhostsファイルを編集して名前解決する。

% sudo -e /private/etc/hosts
127.0.0.1   snest.local

Apacheを開始または再起動する。

% sudo apachectl start

/Users/sen/Sites/snest.net/に適当なindex.htmlを置いて、http://snest.local/でアクセスできることを確認する。

以上。

Tags: Apache

2010-09-08(水)

tDiary3.0.0環境を作る その1 GitHubから公式リポジトリをcloneして自分用にカスタマイズする

GitHubのtDiary公式リポジトリを読み込み専用でcloneする。

% cd Sites/snest.net
% git clone git://github.com/tdiary/tdiary-core.git diary
Cloning into diary...
remote: Counting objects: 6949, done.
remote: Compressing objects: 100% (1861/1861), done.
remote: Total 6949 (delta 5078), reused 6705 (delta 4957)
Receiving objects: 100% (6949/6949), 1.40 MiB | 312 KiB/s, done.
Resolving deltas: 100% (5078/5078), done.

git remoteコマンドでリモートブランチの情報を確認する。

% git remote
origin
% git remote show origin
* remote origin
  Fetch URL: git://github.com/tdiary/tdiary-core.git
  Push  URL: git://github.com/tdiary/tdiary-core.git
  HEAD branch: master
  Remote branches:
    master   tracked
    testable tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

GUIも大好きなので、GitX(http://gitx.frim.nl/)をインストールしてコミットツリーを見てみる。GitXのバージョンは0.7。

GitX #1

コミットメッセージの前に色つきのラベルがあり、

  • 水色はリモートブランチ
  • 緑色はローカルブランチ(この画像では橙色のラベルが覆い被さっているので見えない)
  • 橙色はカレントブランチ
  • 黄色はタグ

だそうです。

次に自分用の変更だけを管理するためのローカルブランチを作る。snest.netで動かすためのブランチということで単純にsnestという名前にしてみる。作ったらチェックアウトしてカレントブランチをsnestに変更する。

% git branch snest
% git branch
  snest
* master
% git checkout snest
Switched to branch 'snest'
% git branch
* snest
  master

GitXで見てみるとこうなる。

GitX #2

ウインドウタイトルにもカレントブランチの名前が出ている。

で、.htaccessを追加したり、tdiary.confを追加したり、動かすための最低限の設定を書いてcommitしたり、commitを間違えてぎゃーってなったり、それをgit commit --amendでやりなおしたり、疲れたので気分転換にブロッコリーをゆでたりしていくと、コミットツリーはこんな感じになる。

GitX #3

このあと公式リポジトリに3.0.1に向けてのコミットがされていくので、それを取り込む練習はまた今度です。

Tags: tDiary

flickrにアルファチャンネルつきのpngをアップロードすると作成されるサムネイルからはアルファチャンネルが欠落する、らしい

ぬぬ。格好が悪かったので画像を切り抜いてアップロードしなおした。「指定したウインドウのスクリーンショットを影なしで撮る」お手軽な方法を調べないといけん。

検索してみたら参考になるページはたくさん見つかった。

  • Leopardから影がつくようになった。
  • /Applications/Utilities/Grab.appを起動して、メニューバー > 取り込み > ウインドウ、で撮影すると影はつかない。ただし非アクティブなウインドウになってしまう。
  • defaults write com.apple.screencapture "disable-shadow" -bool trueでデフォルト動作を書き換えてもいい。ただしログインしなおさないといけない。

デフォルト書き換えでいっとこう。

Tags: flickr

2010-09-09(木)

tDiary3.0.0環境を作る その2 codereposにあるtDiary用contribリポジトリも使わせてもらう

昨日の日記でGitHubのtdiary/tdiary-coreを$HOME/Sites/snest.net/diaryにcloneしたのは「同一サーバで複数のtDiaryを運用する方法」をやめて、シンプルな形にしたかったからなんだけど、contribリポジトリをcodereposから持ってこようとしたときに配置場所をどうしようか、と考える。

$HOME/
  Sites/
    snest.net/
      diary/		<- githubのtdiary/tdiary-core
      coderepos/	<- codereposのplatform/tdiary
  var/
    diary/		<- 日記データ

なんか落ち着かないなあ。それに.htaccessやtdiary.confを自分用に設定するのは「tdiary-coreに対する変更」ではないよな。昨日やったようにtdiary/tdiary-coreにコミットするのはおかしい。

ということで配置を変更する。

$HOME/
  Sites/
    snest.net/
      diary/
  share/
    tdiary/
      coderepos/	<- codereposのplatform/tdiary
      tdiary-core/	<- githubのtdiary/tdiary-core
  var/
    diary/		<- 日記データ

こうじゃないか? で、snest.net以下を自分でバージョン管理する。.htaccessやtdiary.confの変更はそこにコミットするのが意味があってる。2004年にはじめてtDiaryを設置しておきながら、6年目にして開眼した。こんなこと書くのも恥ずかしいけども。

というか「複数のtDiaryを運用する方法」を採用したときに「こっちのほうが論理的に正しいな」と感じたのをすっかり忘れていた。

codereposからcontribを持ってくるところの作業記録。あ、書き忘れていたがgitはhomebrewでインストールしたものでバージョンは1.7.2.2です。

% cd ~/share/tdiary/
% git svn clone http://svn.coderepos.org/share/platform/tdiary coderepos

けっこう時間がかかった。 tdiary.confに

@options['sp.path'] = [
	'../../../share/tdiary/tdiary-core/misc/plugin',
	'../../../share/tdiary/coderepos/plugin'
]

とプラグイン選択パスを書いて、有効にするプラグインオプションなんかも書いて。

これでプラグインに関しても、現在さくらインターネットの上で動いているのと同じ環境が再現できた。

あとは、テーマか。

Tags: tDiary

2010-09-11(土)

ATOK定額制サービスの試用を開始

ATOK2009をMac+Windows版で購入したときにも定額制にするかどうか迷った。迷った末に「ATOK2010はスルーする」と決めたんだけど、結局購入することになりそうだ。それなら定額制サービスにするよ。

Tags: Mac ATOK

2010-09-12(日)

電子レンジがんばる

電子レンジのターンテーブルが回らなくなってから1ヶ月近くたった。「温める」という本質の仕事はこなしているので、買い換えをずるずると延ばしていたら、今日になって急にターンテーブルが回り始めた。

まあ、1989年製なんでいいかげん買い換えろという気もするけど。粗大ゴミとして出したりするのが面倒なんだ。

Tags: days

2010-09-15(水)

zshのEXTENDED_GLOBオプションを有効にしてるとgitでHEAD^指定が失敗する

^が特殊グロッビング記号として扱われるから。

解決策としては、

解決策はこれでいいんだけど、そもそもEXTENDED_GLOBの動作を理解しないまま設定していたのが間違いだよな。

先日購入したzshの本をきちんと読んで、.zshrc作成をやり直そう。

zshの本 (エッセンシャルソフトウェアガイドブック)
広瀬 雄二/A5
技術評論社
¥ 3,360

Tags: zsh git

2010-09-16(木)

tDiary3.0.0環境を作る その3 自分のプロジェクトをさくらインターネットに作った共用リポジトリで管理する

gitでバージョン管理している$HOME/Sites/snest.netの更新をサーバ側に反映させるために、サーバ側に共用リポジトリがあると便利。なので作業開始。

サーバにgitの共用リポジトリを作る

SERVER % mkdir -p ~/gitrepos/snest.net.git
SERVER % cd ~/gitrepos/snest.net.git
SERVER % git --bare init

共用リポジトリと呼んではいるが自分しか使わないので--shareオプションはつけなかった。

共用リポジトリにpush

% cd ~/Sites/snest.net
% git push ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git master
zsh:1: command not found: git-receive-pack
fatal: The remote end hung up unexpectedly

サーバ側の.zshrcは対話的に起動したときにしか読み込まれない。なのでPATHが通っていないためコマンドが見つからない。.zshenvでも書けばいいのかと思ったら、もっと簡単な方法があった。

SERVER % ln -s /home/user/local/bin /home/user/bin

ふたたび共用リポジトリにpush

% git push ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git master
Counting objects: 123, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (110/110), done.
Writing objects: 100% (123/123), 20.74 KiB, done.
Total 123 (delta 70), reused 0 (delta 0)
To ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git
 * [new branch]      master -> master

共用リポジトリに新しくmasterブランチが作られた。

共用リポジトリからclone

共用リポジトリをoriginにしたローカルリポジトリを作る。tdiary-coreリポジトリはリモートリポジトリoriginを変更しないけど、こっちは変更してしまえ。

% cd ~/Sites
% git clone ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git snest.net.new
Cloning into snest.net.new...
remote: Counting objects: 123, done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 123 (delta 70), reused 123 (delta 70)
Receiving objects: 100% (123/123), 20.74 KiB, done.
Resolving deltas: 100% (70/70), done.

確認

% cd ~/Sites/snest.net.new
% git remote show origin
* remote origin
  Fetch URL: ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git
  Push  URL: ssh://user@server.sakura.ne.jp/home/user/gitrepos/snest.net.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

クローンできているのを確認したら移行

% cd ~/Sites
% rm -rf snest.net && mv snest.net{.new,}

sakuraブランチを作成

さくらインターネットで動かすための変更だけを含めたブランチを用意して変更を行う。

  • index.rb, update.rb
    • それぞれ拡張子を.cgiに変更
    • shebangを修正
  • .htaccess
    • update.cgiへのアクセス制限
  • favicon.icoの入れ替え

などなど。

sakuraブランチをpush

% git push origin sakura
(--- 省略 ---)
 * [new branch]      sakura -> sakura

確認

% git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/sakura
% git remote show origin
* remote origin
(--- 省略 ---)
  Remote branches:
    master tracked
    sakura tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    master pushes to master (up to date)
    sakura pushes to sakura (up to date)

これでgit pushしたときにmaster, sakuraの両ブランチが転送されるようになった。

次は公開用ディレクトリに共用リポジトリのクローンを作って、hookを利用した自動pull更新をする、だ。

Tags: git

2010-09-19(日)

QNAP TS-110を購入

バックアップ用HDDの空き容量がいよいよ残り少なくなってきたので、Amazonにて2TiBのWesternDigital製HDD(WD20EARS-R)と一緒に購入。NAS初体験なので一番安いやつにしておいた。

QNAP ターボNAS TS-110 白 TS-110

QNAP
¥ 18,783

セットアップは簡単に終わった。QNAPのNASはいろいろなサービスが簡単に動かせることを売りにしているので、ファイルをコピーする前に遊んでみる。ファイルをたっぷりつめこんでからでは怖くていじれないだろうし。

で、まずは標準で搭載されているuPnPサーバなど動かしてみたが、DLNAクライアントになるものを持っていない。なんかWindows Media Player 11はDLNAクライアントになるらしいけど、PCからなら単に共有フォルダからアクセスすればいいもんなあ。液晶テレビもレコーダーもないし。

PS3を持っていれば、PS3をDLNAクライアントにしてさらにPSPに飛ばすリモートプレイとやらができるそうで、これはいいなと思ったけどそのためだけにPS3の購入はできん。PSP単体ではDLNAクライアントにはならないようだ。

iTunesサービスってのも別に…。音楽ファイルはMacBookのローカルHDDに全部入れていて再生するのもMacBookから、だけ。このiTunes LibraryそのものをNAS上に移動しちゃうのは後でやるとして、それもファイル共有の担当だし。というわけでこいつは試しもせず。

監視ステーション。Webカメラ持ってない。しかしこれは遊んだら楽しそうだな。

ダウンロードステーション。torrent, http, ftpのダウンロードをする。OSのインストールディスクイメージをダウンロードするときには使うかも?

どうも日常的に使うのは外には公開しないWebサーバくらいになりそうだなあ。ipkgというパッケージ管理システムを使うと、もっといろいろ遊べるみたいだけど、試しにSSHログイン(adminでしかできない…)などしてみるもbashとbusyboxという環境。トラブルを引き起こしてしまったときにすみやかに原因特定できない、という事態がいかにも起きそうだ。まずはファイルサーバとして安定して動いてもらうことが先か。

あ、NAS-Router間は付属のカテゴリー5eのLANケーブルでつないだけど、Router-Windows間のケーブルはこれギガビットイーサ対応ケーブルじゃないな確か。買ってこなくては。MacBookはIEEE802.11nの無線。

あとはさらにバックアップのために裸族のお立ち台的なものを買えばいいか。

Tags: QNAP

2010-09-20(月)

snest.netリポジトリ、tdiary-coreリポジトリのブランチについて

考え方を変えた方がいいな。

  • snest.netリポジトリ
    • masterブランチがさくらインターネットで動かせるブランチ
    • developブランチがMacBookでの作業時用の変更だけを含むブランチ
      • たとえばBASIC認証を.htaccessから削除、とか
      • このブランチが成長することはほとんどない
      • masterブランチが進んだときはgit rebase masterしていく
    • サーバ側ではmasterブランチだけを追跡してチェックアウトすればいい
    • 修正はmasterから分岐させたトピックブランチで作業する。
      • ローカルで確認するためにdevelopブランチを"git rebase トピックブランチ"する
      • 完成したらトピックブランチをmasterにマージ。さらにdevelopブランチをgit rebase masterする
    • つまりdevelopブランチはmasterのさきっぽにくっついたり、トピックブランチのさきっぽにくっついたりと動きまくる
      • えっ。いいのか。
  • tdiary-coreリポジトリ

codereposリポジトリはtdiary-coreリポジトリと同じ方針で。

そうこうするうちにtDiary-3.0.1がリリースされ、公式masterにはtestableがマージされそうな勢い。

Tags: tDiary git

2010-09-22(水)

無事tDiary3.0.1にアップデート

ほんとうはGitのブランチがわやになったんだけど、無事と言い張る。

あと、はてなブックマークのホットエントリをサイドバーに表示するようにしたんだけど、ローカルでテストしているときには表示されなかったのでCSSを修正するなどした。

Tags: tDiary
本日のツッコミ(全1件) [ツッコミを入れる]

senosa [わやになるってどこの方言?]


2010-09-26(日)

Rails3 その1

どれ、Rails3で遊んでみるとする。

環境は、

% ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
% gem -v
1.3.7
% git --version
git version 1.7.2.2
% sqlite3 -version
3.6.12
% gem install rails

riドキュメントとrdocドキュメントがはいってしまった。まあいいか。

テストはRSpecを使おう。

% rails new emkuma -T
% cd emkuma
% git init
% git add -A
% git commit -m "rails new emkuma -T"

最初から.gitignoreが用意されている。

Gemfileを編集してbundlerがインストールすべきGemを指定する。

% cat Gemfile
source 'http://rubygems.org'

gem 'rails', '3.0.0'
gem 'sqlite3-ruby', :require => 'sqlite3'

group :development, :test do
  gem 'rspec-rails', '>= 2.0.0.beta.22'
  gem 'autotest'
end
% bundle install
% rails g rspec:install

試しにモデルを作ってテストを実行してみる。

% rails g model comic
% rake db:migrate
% rake
% bundle exec autotest

OK。

growlnotifyを使って通知させたりして遊んだ。

あー、Emacsで自動保存するauto-save-buffersを使っていると、書きかけのspecを実行してautotestが止まってしまう。自動保存をあきらめるしかないのか。

Tags: Rails

2010-09-27(月)

Rails3 その2 Steak+Capybaraで受け入れテスト(1)

testable tDiaryでは受け入れテストを書くのにSteakとCapybaraが使われている(参考:tDiary 3.0 時代のテスト方法 (steak/capybara, rack, bundler) - まちゅダイアリー(2010-08-28))。 Rails3で作った自分のプロジェクトでも、きちんと受け入れテストを書こう。まずはtestable tDiaryのテストを動かしてみてSteakとCapybaraを理解する。

specを読む

まずはtestable tDiaryのspecを見てみる。

% git branch testable origin/testable
Branch testable set up to track remote branch testable from origin.
% git checkout testable
% git branch -v
  master   29b38b8 supported X-Frame-Options in HTTP header.
  snest    947de21 Merge branch 'master' into snest
* testable 2744c6b rename TDiary::Application

tdiary-core/spec/acceptance/view_diary_spec.rbの大まかな構造は?

require File.expand_path('../acceptance_helper', __FILE__)

feature '日記を読む' do
	background do
		setup_tdiary
	end

	scenario '最新の日記の表示' do
	end

	scenario '月またぎの日記の表示' do
	end

	(ほかにもいくつものscenario)
end

まず../acceptance_helperをrequireしている。acceptance_helper.rbでは、

  • steakやらcapybara/dslやら
  • tdiary_application(RackアプリケーションになったtDiaryのこと?)
  • tdiary-core/spec/acceptance/support/**/*.rb

こういったものをrequireしている。

次、

feature '日記を読む' do
 ~
end

で、このテストが検証する機能が書いてある。update_diary_spec.rbならばfeature '日記の更新'だ。そしてブロックの中に、事前処理(backgroud)とシナリオ(scenario 'hoge')が書かれている。

backgroundの中で呼ばれているsetup_tdiaryはtdiary-core/spec/acceptance/support/helper.rbで定義してあって、tdiary.conrを読み込んだりテスト日記データ用のディレクトリを準備したり。

シナリオの中では

visit '/'
click_link "#{before_day}"

こんなふうにユーザの行動と、その行動に対して期待される振る舞い(expectation)が書かれている。

なるほどー。単体テストするときに書くふつうのspecとよく似ているんだなー。聞くところによるとCucumberの場合はもっと自然言語っぽく書くらしい。けど、Steakのほうが自分の好みにあっていそうな気がする。

なんか機能を作るときは、

  • Steakで外から見たテストを書き、テスト失敗する
  • RSpecで内部(モデルなど)のテストを書き、テスト失敗する
  • RSpecのテストが成功するように実装する
  • Steakのテストが成功するように実装する

こういう手順になるんだな。

ところで話は変わりますが

石黒正数の「ネムルバカ」には、カピバラステーキが出てくるそうですよ。こりゃ買うしかないね。

ネムルバカ (リュウコミックス)
石黒 正数
徳間書店
¥ 580

specを実行してみる

% bundle install
Fetching git://github.com/cavalle/steak.git
remote: Counting objects: 754, done.
remote: Compressing objects: 100% (498/498), done.
remote: Total 754 (delta 387), reused 334 (delta 173)
Receiving objects: 100% (754/754), 80.87 KiB | 79 KiB/s, done.
Resolving deltas: 100% (387/387), done.
Fetching git://github.com/jnicklas/capybara.git
remote: Counting objects: 4821, done.
remote: Compressing objects: 100% (1745/1745), done.
remote: Total 4821 (delta 3301), reused 4499 (delta 3054)
Receiving objects: 100% (4821/4821), 5.53 MiB | 351 KiB/s, done.
Resolving deltas: 100% (3301/3301), done.
Fetching source index for http://rubygems.org/
Using rake (0.8.7)
Installing celerity (0.8.2)
Using culerity (0.2.12)
Using mime-types (1.16)
Using nokogiri (1.4.3.1)
Using rack (1.2.1)
Installing rack-test (0.5.4)
Using ffi (0.6.3)
Using json_pure (1.4.6)
Using rubyzip (0.9.4)
Using selenium-webdriver (0.0.28)
Installing xpath (0.1.0)
Using capybara (0.3.9) from git://github.com/jnicklas/capybara.git (at master)
Installing configuration (1.1.0)
Using diff-lcs (1.1.2)
Installing launchy (0.3.7)
Installing rcov (0.9.9) with native extensions
Installing rr (1.0.0)
Using rspec-core (2.0.0.beta.22)
Using rspec-expectations (2.0.0.beta.22)
Using rspec-mocks (2.0.0.beta.22)
Using rspec (2.0.0.beta.22)
Using steak (1.0.0.beta.1) from git://github.com/cavalle/steak.git (at master)
Using bundler (1.0.0)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

Your bundle was installed to `/Users/sen/.rvm/gems/ruby-1.9.2-p0`
% bundle exec rspec spec/acceptance/view_diary_spec.rb
/Users/sen/share/tdiary/tdiary-core/tdiary/tdiary_application.rb:7:in `require': no such file to load -- tdiary/dispatcher (LoadError)
        from /Users/sen/share/tdiary/tdiary-core/tdiary/tdiary_application.rb:7:in `<top (required)>'
        from /Users/sen/share/tdiary/tdiary-core/spec/acceptance/acceptance_helper.rb:7:in `require'
        from /Users/sen/share/tdiary/tdiary-core/spec/acceptance/acceptance_helper.rb:7:in `<top (required)>'
        from /Users/sen/share/tdiary/tdiary-core/spec/acceptance/view_diary_spec.rb:2:in `require'
        from /Users/sen/share/tdiary/tdiary-core/spec/acceptance/view_diary_spec.rb:2:in `<top (required)>'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/configuration.rb:308:in `load'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/configuration.rb:308:in `block in load_spec_files'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/configuration.rb:308:in `map'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/configuration.rb:308:in `load_spec_files'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/command_line.rb:18:in `run'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/runner.rb:36:in `run_in_process'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/runner.rb:27:in `run'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.0.0.beta.22/bin/rspec:3:in `<top (required)>'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/bin/rspec:19:in `load'
        from /Users/sen/.rvm/gems/ruby-1.9.2-p0/bin/rspec:19:in `<main>'

えー。tdiary/dispatcher.rbはありますよー? ruby-1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなったからか。相対パスで書けばいいのか?

ひとまずRVMでruby-1.8.7-p302に切り替えて、改めてbundle installしてからテストを実行したら動いた。

% bundle exec rspec spec/acceptance/view_diary_spec.rb
...*..

Pending:
  日記を読む n年日記機能を表示
    # Not Yet Implemented
    # ./spec/acceptance/view_diary_spec.rb:54

Finished in 149.86 seconds
6 examples, 0 failures, 1 pending

動いたけど、不安になるくらい時間がかかってるな。149秒って。こういうものなんだろうか。いやそんなはずは。もしやと思ってtmuxを終了させてみたり、ターミナルを再起動したりしてたら、

% bundle exec rspec spec/acceptance/view_diary_spec.rb
...*..

Pending:
  日記を読む n年日記機能を表示
    # Not Yet Implemented
    # ./spec/acceptance/view_diary_spec.rb:54

Finished in 20.55 seconds
6 examples, 0 failures, 1 pending

20秒。基本的にこれくらいの時間で動くようになったけど、このあとも50秒くらいだったりいろいろ。なぜそんなに気まぐれなんだ。

試しにspec/acceptance全部を動かしてみる。

% bundle exec rake spec:acceptance
(in /Users/sen/share/tdiary/tdiary-core)
/Users/sen/.rvm/rubies/ruby-1.8.7-p302/bin/ruby -S bundle exec rspec "spec/acceptance/append_comment_spec.rb" "spec/acceptance/append_diary_spec.rb" "spec/acceptance/save_conf_comment_spec.rb" "spec/acceptance/save_conf_default_spec.rb" "spec/acceptance/save_conf_dnsbl_spec.rb" "spec/acceptance/save_conf_plugin_spec.rb" "spec/acceptance/save_conf_referer_spec.rb" "spec/acceptance/save_conf_security_spec.rb" "spec/acceptance/update_diary_spec.rb" "spec/acceptance/view_category_spec.rb" "spec/acceptance/view_comment_spec.rb" "spec/acceptance/view_diary_spec.rb" "spec/acceptance/view_referer_spec.rb"
................******..*.***.....***........*....

Pending:
  spamフィルタ設定の利用 IPベースのブラックリストが動作する
    # Not Yet Implemented
    # ./spec/acceptance/save_conf_dnsbl_spec.rb:9
  (以下、pendingを省略)

Finished in 233.45 seconds
50 examples, 0 failures, 14 pending

おおー。failuresがない。

やけに時間がかかっているような気がするけど、比較対象がないので判断できない。あとで自分が作ったRails3プロジェクトでテストを書いて実行してみよう。

Tags: Rails

2010-09-29(水)

Rails3 その3 Steak+Capybaraで受け入れテスト (2)

Rails3で作ったプロジェクトにSteakとCapybaraを組み込む

プロジェクトルートにあるGemfileを編集。

% git diff Gemfile
diff --git a/Gemfile b/Gemfile
index 7556e59..25f9c3c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -7,4 +7,6 @@ gem 'sqlite3-ruby', :require => 'sqlite3'
 group :development, :test do
   gem 'rspec-rails', '>= 2.0.0.beta.22'
   gem 'autotest'
+  gem 'steak', '>= 1.0.0.beta.1'
+  gem 'capybara'
 end

bundleインストールする

% bundle install
Fetching source index for http://rubygems.org/
(Using行は省略)
Installing nokogiri (1.4.3.1) with native extensions
Installing ffi (0.6.3) with native extensions
Installing json_pure (1.4.6)
Installing rubyzip (0.9.4)
Installing selenium-webdriver (0.0.28)
Installing capybara (0.3.9)
Installing steak (1.0.0.beta.2)

generatorを実行

% rails g steak:install
Defaulting to Capybara...
      create  spec/acceptance/support
      create  spec/acceptance/acceptance_helper.rb
      create  spec/acceptance/support/helpers.rb
      create  spec/acceptance/support/paths.rb

準備完了。

specを書いてみる

単純な機能を作ってみる。Railsアプリケーションの/authorsにアクセスすると、著者一覧が表示されるようにする。

% r g model author name:string
      invoke  active_record
      create    db/migrate/20100929081958_create_authors.rb
      create    app/models/author.rb
      invoke    rspec
      create      spec/models/author_spec.rb
% rake db:migrate
% r g steak:spec authors
       exist  spec/acceptance
      create  spec/acceptance/authors_spec.rb

最低限のspec書いて実行。

% cat spec/acceptance/authors_spec.rb
# -*- coding: utf-8 -*-
require File.dirname(__FILE__) + '/acceptance_helper'

feature "Authors" do
  scenario "著者一覧の表示" do
    visit '/authors'
    page.should have_content('著者一覧')
  end
end
% rspec spec/acceptance/authors_spec.rb
F

Failures:
  1) Authors 著者一覧の表示
     Failure/Error: page.should have_content('著者一覧')
     expected #has_content?("著者一覧") to return true, got false
     # ./spec/acceptance/authors_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 0.43047 seconds
1 example, 1 failure

正しくテスト失敗した。controllerをgenerate。

% r g controller authors index
      create  app/controllers/authors_controller.rb
       route  get "authors/index"
      invoke  erb
      create    app/views/authors
      create    app/views/authors/index.html.erb
      invoke  rspec
      invoke  helper
      create    app/helpers/authors_helper.rb
      invoke    rspec
      create      spec/helpers/authors_helper_spec.rb

config/routes.rbを編集。

Emkuma::Application.routes.draw do
  resources :authors, :only => [:index]
end

app/views/authors/index.html.erbを編集してからspec実行

% rspec spec/acceptance/authors_spec.rb
.

Finished in 0.42275 seconds
1 example, 0 failures

これで、

  • /authorsにアクセスしたときにauthors#indexにルーティング
  • その結果表示されるビュー

の最低限のテストが通った、と。

さらにspecを書いてみる

次にauthorsテーブルからちゃんとレコードを取り出していることをテストする。 modelは生成済み。

% cat db/schema.rb
ActiveRecord::Schema.define(:version => 20100929081958) do

  create_table "authors", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "comics", :force => true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

fixtureを用意する。この時点でspec/fixturesディレクトリって自動で生成されていないのか。

% cat spec/fixtures/authors.yml
isikei:
  name: 石恵

cuvie:
  name: Cuvie

specを再編集して、実行。

% cat spec/acceptance/authors_spec.rb
# -*- coding: utf-8 -*-
require File.dirname(__FILE__) + '/acceptance_helper'

feature "Authors" do

  fixtures :authors

  scenario "著者一覧の表示" do
    visit '/authors'
    page.should have_content('著者一覧')
    page.should have_content('Cuvie')
    page.should have_content('石恵')
  end
end
% rspec spec/acceptance/authors_spec.rb
F

Failures:
  1) Authors 著者一覧の表示
     Failure/Error: page.should have_content('Cuvie')
     expected #has_content?("Cuvie") to return true, got false
     # ./spec/acceptance/authors_spec.rb:9:in `block (2 levels) in <top (required)>'

Finished in 0.43361 seconds
1 example, 1 failure

きちんとテスト失敗した。では、controllerを編集。

% cat app/controllers/authors_controller.rb
class AuthorsController < ApplicationController
  def index
    @authors = Author.all
  end

end

つづいてviewを編集。

% cat app/views/authors/index.html.erb
<h1>著者一覧</h1>

<table class="authors">
  <col class="name" />
  <tr>
    <th>名前</th>
  </tr>
  <%= render @authors %>
</table>
% cat app/views/authors/_author.html.erb
<tr>
  <td><%= author.name %></td>
</tr>

再度spec実行。

% rspec spec/acceptance/authors_spec.rb
.

Finished in 0.52989 seconds
1 example, 0 failures

通った。

自分でブラウザを操作して確認してみよう。としたら問題が。

% rake db:fixtures:load
(in /Users/sen/code/rails/emkuma)

% r c
Loading development environment (Rails 3.0.0)
ruby-1.9.2-p0 > Author.count
 => 0

rake db:fixtures:load してもdevelopment環境にfixturesがロードされていないぞ。なぜだ。

試しにtest/fixturesにコピーしたら、ちゃんとロードされたよ。rspec-railsのインストールに失敗でもしてるのかな。

% mkdir -p test/fixtures
% cp spec/fixtures/authors.yml test/fixtures
% rake db:fixtures:load
(in /Users/sen/code/rails/emkuma)
% r c
Loading development environment (Rails 3.0.0)
ruby-1.9.2-p0 > Author.count
 => 2
Tags: Rails

トップ 最新 追記
RSS feed