2012-02-28

rspec2にあげたらundefined method `include_text'と言われたよ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsを2.3から3.0にあげました。

なのでrspecも1.3から2.0にあげました。

そして
rake spec
としたら
------------------
NoMethodError:
undefined method `include_text' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_3:0xb71a09e8>
# ./spec/controllers/xxx_controller_spec.rb:19
------------------
とか言われちゃいました。

前はあったinclude_textがなくなった模様です。

なので以下のように対応しました。
vi spec/support/include_text.rb
module RSpec::Rails
  module Matchers
    RSpec::Matchers.define :include_text do |text|
      match do |response_or_text|
        @content = response_or_text.respond_to?(:body) ? response_or_text.body : response_or_text
        @content.include?(text)
      end
    end
  end
end

2012-02-26

calendar_date_selectをjquery_datepickerに変える

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsを2.3から3.0にあげたついでにprototype利用からjquery利用に変えました。

2.3のときは、日付入力部分でカレンダーを表示させるために
calendar_date_select
を使っていたのですが、prototypeベースなので
jqueryでも同じようにカレンダー入力を行うために
jquery_datepicker
を使うことにしました。


Gemfileに以下を追加して
------------------
gem 'jquery_datepicker'
------------------
bundle install
です。

既存のcalendar_date_select関連の部分は、jquery_datepicker用の記述に変更する必要があります。



2012-02-25

railsを2.3から3.0にあげてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今までRailsの2.3を使っていたのですが、3.2も出たことだし、そろそろ過去に作ったものもバージョンをあげていこうかなぁとか思ったわけです。

さくっと簡単にアップデートできる感じではないです。
pluginとかいっぱい使っているほど面倒な感じです。

とりあえず、ざっくり以下のような流れでアップデートしてみました。
前提として、
・いくつかのRailsアプリがひとつのマシンで動いているのでシステム全体で利用するメインのバージョンは2.3でアップデートするアプリのみ3.0を使います
・ということでシステム全体にはRails2.3と3.0が入っている状態です

・rvmは使いません


アップデートするRailsアプリのディレクトリをaplとしてます。

まずは、ディレクトリをコピー
cp -r apl apl_23
aplの方を3.0にあげてapl_23の方は2.3のままにしておきます。

apl_23の方にRails3へのアップグレードを補助するプラグインrails_upgradeをインストールします。
cd apl_23
script/plugin install git://github.com/rails/rails_upgrade.git
これさえ入れれば、簡単に移行できます!という感じではなくあくまでもアップデートのための参考情報を取得するためだと思ってください。

apl環境にRails3.0を適用するため以下を実行
cd ../apl
rails new .

上書きされちゃったものを戻します。

cp ../apl_23/app/helpers/application_helper.rb app/helpers/application_helper.rb
cp ../apl_23/app/controllers/application_controller.rb app/controllers/application_controller.rb
cp ../apl_23/app/views/layouts/application.html.erb app/views/layouts/application.html.erb
cp ../apl_23/db/seeds.rb db/seeds.rb
とかを戻します。

config/database.ymlも前のものを参考に書き直す。

いらないファイルを削除します。

rm public/index.html
rm script/about
rm script/console
rm script/dbconsole
rm script/destroy
rm script/generate
rm script/performance
rm script/plugin
rm script/runner
rm script/server
rm config/initializers/new_rails_defaults.rb
とかです。他にもあるような気がします。

3.0環境ではGemfileを作成する必要があります。
修正するための参考情報としてapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:gems
これでGemfileに記述する参考情報が出力されます。
ここに出力されたものだけではたぶん足りないです。

Gemfileを修正します。
cd ../apl
vi Gemfile
以下のような感じで、本当はいろいろもっと書くことになります。
------------------------------------------
source 'http://rubygems.org'

gem 'rails', '3.0.10'
group :development, :test do
  gem 'rspec-rails'
end
------------------------------------------

今回アップデート対象の環境だけに新しいgemとかを適用させたいので、そのための設定を行います。
mkdir .bundle
vi .bundle/config
以下のようにしてvendor/bundleにインストールさせるようにします。
------------------------------
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
------------------------------
ちなみにこのようにした理由はrspecが新しいバージョンと古いバージョンが共存できなそうなためこのようにしました。
2.3ではrspec1.3系にしているのですが、3.0ではrspec2系になっているようです。これをうっかりシステム側に入れると2.3系のテストがうまくうごかなくなりました。

ここらでとりあえず一回
bundle install
しておきます。

routeを3.0用に書き換えます。どう書き換えるかの参考情報を得るためにapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:routes
ここで出力された内容を元にroutes.rbを書き換えます。

railas3.0用にroutes.rbを修正します。
cd ../apl
vi config/routes.rb
私の場合は、
 root :to => 'welcome#index'
のようにアプリケーションのルートの指定と
 match ':controller(/:action(/:id(.:format)))'
の#をはずすことをやりました。

application.rbも修正するための参考情報を得るためにapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:configuration
ここで出力された内容を元にapplication.rbを書き換えます。

rails3.0用にapplication.rbを修正します。
cd ../apl
vi config/application.rb
上記出力を元に適当に修正します。

apl_23環境でRails2.3依存コードの確認のため以下を実行
cd ../apl_23
rake rails:upgrade:check
ここの出力を元に修正をおこなっていく。

2.3依存コードの除去をします。
cd ../apl
いろいろ作業します・・・・

この後にplugin系のアップデートが必要なケースがあると思います。
vendor/plugins
に入れていたもので、3.0でバージョンが古く動かない感じのものは削除してしまって、3.0で動くバージョンのものを
Gemfileに記述してbundle installします。


アップデート作業はこんな感じです。
一番めんどっちいのがpluginとかの対応でした。どれをどう変えるかいちいち個別に確認しないといけない感じですので。


で、ここまできたらせっかくなのでprototypeをjqueryに変更しておこうと思います。
vi Gemfile
以下を追加します。
--------------
gem 'jquery-rails'
--------------
bundle install

rails generate jquery:install
rails generate jquery:install --ui

あとは、prototypeに依存して書いていた部分をjqueryに書き直します。

ひとつ環境をあげて、思ったよりも面倒だったので気持ちが萎えてしまったのだけど、他のもやらなくちゃなぁ・・・
3.0→3.1→3.2
は、もっと簡単にあがるといいなぁとか思ってみたりしています。

2012-02-14

rails_best_practicesで指摘されたから、末尾の空白を一括で除去する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsでの開発でのベストプラクティスをまとめた以下のサイトがあるということを知りました。

http://rails-bestpractices.com/

ここで紹介されているベストプラクティスに自分のコードが従っていない部分をしてくれる

rails_best_practices

というのもあるということを知ったのです。

インストールは、
gem install rails_best_practices
でOKらしいですが、私の環境ではripperというのも必要な感じでしたので
gem install ripper
もやっておきました。


利用は、確認したいRailsアプリのRAILS_ROOTに移動して

rails_best_practices

とすれば、いろいろ指摘してくれます。

いろいろ指摘してくれるのですが、私の場合は、
./app/views/layouts/application.html.erb:4 - remove trailing whitespace
という感じで、末尾に空白があるよ~~というのが、うんざりするほど出てきました。

なので以下のような感じで一括で変更してみました。

rails_best_practices --without-color |grep 'remove trailing whitespace' | awk -F":" '{print $1}' | xargs ruby -p -i -e '$_.sub! /\s+$/,"\n"'

あと、
./app/views/layouts/application.html.erb:6 - remove tab, use spaces instead
という感じでタブじゃなくて、スペースを使いなさ~~いというのも、ちょっと出たので同じように以下のように一括で対応してみました。

rails_best_practices --without-color |grep 'remove tab, use spaces instead' | awk -F":" '{print $1}' | xargs ruby -p -i -e '$_.sub! /\t/," "'

タブをスペース2つに置換しています。

他のベストプラクティスは、今のところ個別対応をしてみています。


2012-02-13

綿花の種をもらってみようと思ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ふと衝動的に綿花を育ててみたいと思ってみて調べてみたところ
ちょうどいい具合に綿花の種をプレゼントしていただけるものがあるのを発見したのです。
http://cotton.or.jp/pr2012-01-30.htm

というわけで申し込んでみることにしてみたのです。

2012-02-08

WBS「トレたま」で放送された商品をAmazonで検索してみた(201201放送分)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
WBSのコーナーの「トレたま」で放送された商品をAmazonで検索してみました。

「ギボン スラックライン」という綱渡り用の紐みたいなものがキニナル感じです。


消しゴムサイズのマウス (放送:1月31日)
見つかりませんでした

電子マネー付きマラソン用腕時計 (放送:1月30日)
見つかりませんでした

スマートウォッチ (放送:1月27日)
見つかりませんでした

はんこの自動販売機 (放送:1月26日)
見つかりませんでした

最強のタブレット (放送:1月25日)
見つかりませんでした

次世代自販機 (放送:1月24日)
見つかりませんでした

収納付きまな板 (放送:1月23日)
amazonにありました


雨でも快適 電動パラソル (放送:1月20日)
見つかりませんでした

切らずにスクラップ (放送:1月19日)
見つかりませんでした

瞬間を切り取るムービー (放送:1月18日)
見つかりませんでした

のどの振動を拾うマイク (放送:1月17日)
見つかりませんでした

紙バイオ電池 (放送:1月16日)
見つかりませんでした

空気清浄ライト! (放送:1月13日)
見つかりませんでした

かざせば翻訳! (放送:1月12日)
見つかりませんでした

車いすエアバッグ! (放送:1月11日)
見つかりませんでした

巻いて防寒! (放送:1月10日)
見つかりませんでした

カバンにピアノ?! (放送:1月9日)
amazonにありました


綱渡りで鍛える (放送:1月6日)
ギボン スラックラック(スラックライン)
amazonにありました


靴ひも用スプレー (放送:1月5日)
見つかりませんでした

8mm風のトイカメラ (放送:1月4日)
amazonにありました

2012-02-07

sinatraでファイルアップロードのテストをする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
sinatraでファイルをアップロードさせるよなアプリのテストをする場合です。

ファイルアップロードは、以下が参考になります。
http://d.hatena.ne.jp/yamamucho/20100620/1277003595

抜粋かつちょっと改造ですが、こんな感じでfileという名前のパラメータでファイルを受け取るとします。
require 'rubygems'
require 'sinatra'

post '/upload' do
  if params[:file]
    content_type params[:file][:type]
    f = params[:file][:tempfile]
    f.read f.size
  end
end

このようなアプリのテストをする場合は、以下のような感じです。 rspecでテストする場合は、以下のような感じです。
require 'rubygems'
it "アップロードしたらファイルの中身が帰ってくる" do
  upload_file = File.dirname(__FILE__) + "/foo.txt"
  post_file   = Rack::Test::UploadedFile.new(upload_file)
  post "/upload", "file" => post_file
  last_response.body.should == "foo"
end


sinatraをpassengerで使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで簡単なwebプログラムを組みたいなぁ、Rails使うほどの規模でもないなぁというときは軽量フレームワークのSinatraがステキです。

Sinatraの詳しい使い方は、以下を見ればOKです。
http://www.sinatrarb.com/intro-jp.html

本当に簡単に試すならばファイルがひとつあればいいお手軽さなのですが、
Sinatraで作ったものをPassengerを使って公開するときには、ちょっと準備が必要です。
具体的には、以下が参考になります。SubURIで動かしています。
http://d.hatena.ne.jp/seiunsky/20090614/1244978847

Sinatraアプリとしては、以下のファイルとディレクトリが必要になります。

+public(空ディレクトリ)
+tmp(空ディレクトリ)
+app.rb(アプリ本体 たとえばこういうやつ)
+config.ru(おまじないファイル。こんな感じ)

これだけでOKです。
sinatra_appというSubURLで公開するならば
publicディレクトリをhtdocs/sinatra_appにリンクを張って
Passengerの設定で
RackBaseURI /sinatra_app
と書けばOKです。

これでとりあえずOKなのですが、さくっと作ったプログラムだとなんで作ったのかとか忘れがちなのでドキュメント用のディレクトリも使いした方がよいかなぁとか思います。
そしてさくっと作ってもrspecでテストをしておいた方がよいよなぁと思うわけなので、上記にさらにいくつか追加して以下のような感じにします。


+doc(ドキュメント格納用ディレクトリ)
+public
+spec
| |-app_spec.rb(テストファイル)
| |-spec.opts(rspecのオプション情報)
| |-spec_helper.rb(テスト用helper)
+tmp
+README(ざっくり説明用。これだけあればよいときも多いと思います)
+Rakefile(rake specとやるために準備)
+app.rb
+config.ru

sinatraでrspecを使うためには、以下が参考になります。
http://d.hatena.ne.jp/amacou/20100221/1266768409
http://labs.unoh.net/2009/07/bdd_on_sinatra.html

こちらを元に以下のファイルを作成してみました。


+spec
| |-app_spec.rb
| |-spec.opts
| |-spec_helper.rb
+Rakefile

ということで、これらのサンプルをとりあえず
https://github.com/vivahiraj/sinatra_template
に置いてみました。








追記(2013/10/24)
bundlerを利用したテンプレートも作成してみました。
sinatraでbundlerを使う

2012-02-04

iRemoconがキニナル

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク


http://i-remocon.com/ 

家のあるリモコンを学習させておいて、外からスマホとか使って操作できる便利リモコンでキニナルのです。
エアコンも使えるようです。エアコンは使えると便利そうだなぁと思うわけです。

お値段がまだちょいと高めなので、お安い機種が出ることを期待するのです。