2010-09-03(金)
■ MacBookのバッテリーを交換した
ふだんはリッドクローズドモードで使っているMacBookを、ひさしぶりに持ち運ぼうとしたら、バッテリーがものすごく膨張していることに気がついた。(写真を撮影したつもりだったが撮ってなかった…)
購入から2年とちょっと。充放電回数や容量には問題なかったけど、ジーニアスバーに持って行ったら無償で交換してもらえた。
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/でアクセスできることを確認する。
以上。
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。
コミットメッセージの前に色つきのラベルがあり、
- 水色はリモートブランチ
- 緑色はローカルブランチ(この画像では橙色のラベルが覆い被さっているので見えない)
- 橙色はカレントブランチ
- 黄色はタグ
だそうです。
次に自分用の変更だけを管理するためのローカルブランチを作る。snest.netで動かすためのブランチということで単純にsnestという名前にしてみる。作ったらチェックアウトしてカレントブランチをsnestに変更する。
% git branch snest % git branch snest * master % git checkout snest Switched to branch 'snest' % git branch * snest master
GitXで見てみるとこうなる。
ウインドウタイトルにもカレントブランチの名前が出ている。
で、.htaccessを追加したり、tdiary.confを追加したり、動かすための最低限の設定を書いてcommitしたり、commitを間違えてぎゃーってなったり、それをgit commit --amendでやりなおしたり、疲れたので気分転換にブロッコリーをゆでたりしていくと、コミットツリーはこんな感じになる。
このあと公式リポジトリに3.0.1に向けてのコミットがされていくので、それを取り込む練習はまた今度です。
■ flickrにアルファチャンネルつきのpngをアップロードすると作成されるサムネイルからはアルファチャンネルが欠落する、らしい
ぬぬ。格好が悪かったので画像を切り抜いてアップロードしなおした。「指定したウインドウのスクリーンショットを影なしで撮る」お手軽な方法を調べないといけん。
検索してみたら参考になるページはたくさん見つかった。
- Leopardから影がつくようになった。
- /Applications/Utilities/Grab.appを起動して、メニューバー > 取り込み > ウインドウ、で撮影すると影はつかない。ただし非アクティブなウインドウになってしまう。
- defaults write com.apple.screencapture "disable-shadow" -bool trueでデフォルト動作を書き換えてもいい。ただしログインしなおさないといけない。
デフォルト書き換えでいっとこう。
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' ]
とプラグイン選択パスを書いて、有効にするプラグインオプションなんかも書いて。
これでプラグインに関しても、現在さくらインターネットの上で動いているのと同じ環境が再現できた。
あとは、テーマか。
2010-09-11(土)
■ ATOK定額制サービスの試用を開始
ATOK2009をMac+Windows版で購入したときにも定額制にするかどうか迷った。迷った末に「ATOK2010はスルーする」と決めたんだけど、結局購入することになりそうだ。それなら定額制サービスにするよ。
2010-09-12(日)
■ 電子レンジがんばる
電子レンジのターンテーブルが回らなくなってから1ヶ月近くたった。「温める」という本質の仕事はこなしているので、買い換えをずるずると延ばしていたら、今日になって急にターンテーブルが回り始めた。
まあ、1989年製なんでいいかげん買い換えろという気もするけど。粗大ゴミとして出したりするのが面倒なんだ。
2010-09-15(水)
■ zshのEXTENDED_GLOBオプションを有効にしてるとgitでHEAD^指定が失敗する
^が特殊グロッビング記号として扱われるから。
解決策としては、
- EXTENDED_GLOBオプションのオフ
- HEAD\^とクォートする
- 自動で補完されるような関数を作っている方も。zsh の exntended_glob と HEAD^^^ を共存させる。 - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech
- HEAD~と指定する
- ~もEXTENDED_GLOBで使うグロッビング記号だけどこれなら大丈夫。HEAD~2も大丈夫
解決策はこれでいいんだけど、そもそもEXTENDED_GLOBの動作を理解しないまま設定していたのが間違いだよな。
先日購入したzshの本をきちんと読んで、.zshrc作成をやり直そう。
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更新をする、だ。
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の無線。
あとはさらにバックアップのために裸族のお立ち台的なものを買えばいいか。
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リポジトリ
- masterブランチは公式の追っかけ
- snestブランチが自分専用カスタマイズ
- masterブランチが進んだときはsnestにマージしていく
- サーバではsnestブランチを追跡
- もし公式に取り入れてもらいたい修正をするならmasterから分岐させたトピックブランチで作業をすすめる。参考(Subversion ユーザーが GitHub を使ってみたよ (その2: 他人のプロジェクト編) - まちゅダイアリー(2010-07-05)
codereposリポジトリはtdiary-coreリポジトリと同じ方針で。
そうこうするうちにtDiary-3.0.1がリリースされ、公式masterにはtestableがマージされそうな勢い。
2010-09-22(水)
■ 無事tDiary3.0.1にアップデート
ほんとうはGitのブランチがわやになったんだけど、無事と言い張る。
あと、はてなブックマークのホットエントリをサイドバーに表示するようにしたんだけど、ローカルでテストしているときには表示されなかったのでCSSを修正するなどした。
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が止まってしまう。自動保存をあきらめるしかないのか。
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のテストが成功するように実装する
こういう手順になるんだな。
ところで話は変わりますが
石黒正数の「ネムルバカ」には、カピバラステーキが出てくるそうですよ。こりゃ買うしかないね。
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プロジェクトでテストを書いて実行してみよう。
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



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