RailsでApplicationHelperのスペックを書くときにハマったのでメモ。

準備

まず普通にスペックを書く場合

spec/helpers/appliction_helper_spec.rbを以下のように準備

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe ApplicationHelper, :type => :helper do

  helper_name :application
  %w{hoge}.each do |method_name|
    it "##{method_name}メソッドが存在すること" do
      helper.should be_respond_to(method_name)
    end
  end

end


helper_nameでへルーパー名を定義しておくのがポイント。
そしてExampleの中から「helper」を通じて、エクスペクテーションを書いていきます。(言葉の使い方あってる?)

リクエストを使うスペックを書きたい場合

ヘルパーメソッドの中でリクエストを参照する場合(そもそもヘルパーがリクエストを参照するのが美しいことなのか疑問を抱きましたが、とりあえず無視)

ApplicationControllerにスタブアクションを作ってあげる、というやり方でなんとかしました。

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe ApplicationHelper, :type => :helper do

  class ApplicationController
    def stub_action
      render :text => self
    end
  end

  helper_name :application

  it "ヘルパーの中からリクエストを参照できること" do
    get :stub_action
    helper.mobile_tracking_code.should be_xxxx
  end

end


こんな感じで、普通にコントローラースペックを書くときのようにgetとかpostとかヘルパースペックの中からリクエストを使ったテストを一応かけます。

もっと良い方法がある気がする。

Posted in ruby, ruby on rails at 10月 19th, 2009. No Comments.

個人的メモ

結構リソース食うので次はdelayed_jobにしたい・・

実行してことはあるけど、正常に終了してないキューを取得する

BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1])


キューをもう一回実行させる

BdrbJobQueue#release_job


上の合わせ技

BdrbJobQueue.find(:all, :conditions => ['finished = ? AND taken = ?',0,1]).each do |job|
  job.release_job
end


Posted in ruby, ruby on rails at 9月 30th, 2009. No Comments.

Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。

前回paperclipからS3を使う設定はわかったので、今回はさらにCloudFrontを利用するための設定です

前回のおさらい

has_attached_file :avatar,
  :storage => :s3,
  :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
  :path => ":attachment/:id/:style.:extension",
  :bucket => 'mybucket'


前回こんな感じでS3の設定をしました。

コンソールから利用してみると

user = User.new
user.avatar = File.open('/tmp/myface.jpg')
user.save

puts user.avatar.url #=> http://mybucket.s3.amazonaws.com/avatar/1/original.jpg


こんな感じでS3のURLがとれるようになっているはず。

s3_host_aliasを効かす

キャッシュサービスであるCloudFrontを利用する場合は、ホスト名を適宜変えるだけなので paperclipが勝手にやってくれるといいなぁ〜なんて思いました。

has_attached_file :avatar,
  :storage => :s3,
  :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
  :path => ":attachment/:id/:style.:extension",
  :bucket => 'mybucket',
  :s3_host_alias => "xxxxxxxxxxxx.cloudfront.net",
  :url => ":s3_alias_url"


オプションが2つ増えてます

  • :s3_host_alias は、エイリアスのFQDNを記述しておきます。
  • :url には「":s3_alias_url"」を記述します。注意なのは、rubyのシンボルじゃなくて、文字列だってところです。ハマりました。
user = User.new
user.avatar = File.open('/tmp/myface.jpg')
user.save

puts user.avatar.url #=> http://xxxxxxxxxxxx.cloudfront.net/avatar/1/original.jpg


わーーこりゃ幸せだ。

余談

さらにサイト全体でアセット関係(public以下)もCloudFrontにしたければ

config/environments/#{RAILS_ENV}.rb 内で

config.action_controller.asset_host = "http://xxxxxxxxxxxx.cloudfront.net"


こうしとけば、image_path()やらimage_tag()やらjavascript_include_tag()やらを使ったときに、リクエスト先を書き換えてくれてさらに幸せ度アップ

Posted in ruby, ruby on rails at 9月 10th, 2009. No Comments.

PaperClipはとってもシンプルなActiveRecordで添付ファイルを管理するプラグインです。

http://github.com/thoughtbot/paperclip/tree/master

便利すぎて鼻血がでそうなプラグインです

使い方のおさらい

カラムを追加して

class AddAvatarColumnsToUser <ActiveRecord::Migration
    def self.up
      add_column :users, :avatar_file_name,    :string
      add_column :users, :avatar_content_type, :string
      add_column :users, :avatar_file_size,    :integer
      add_column :users, :avatar_updated_at,   :datetime
    end

    def self.down
      remove_column :users, :avatar_file_name
      remove_column :users, :avatar_content_type
      remove_column :users, :avatar_file_size
      remove_column :users, :avatar_updated_at
    end
  end


モデルクラスで定義

class User <ActiveRecord::Base
    has_attached_file :avatar
end


とするだけですね。 詳細はRDocをみてください

Amazon S3を使う

PaperClipはストレージにS3を使うためのオプションがあります

has_attached_file :avatar,
    :storage => :s3,
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
    :path => ":attachment/:id/:style.:extension",
    :bucket => 'mybucket'


config/s3.ymlには

access_key_id: 456...
secret_access_key: 456...


こんな感じのアクセスキーとシークレットキーを置いておきます

productionでだけS3を使いたい

開発中はローカルで完結したい場合は

has_attached_file :avatar, Proc.new {
    if RAILS_ENV == 'production'
      {
        :storage => :s3,
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
        :path => ":attachment/:id/:style.:extension",
        :bucket => 'mybucket'
      }
    else
      {}
    end
  }.call


こんな感じでいいかな

Posted in ruby, ruby on rails at 9月 9th, 2009. No Comments.

こんにちは、久々ですね

Railsでroutes.rbは本当に便利ですよね。

map.resources :users


なんて書くだけで、RESTFulなAPIが用意されます。

  • index
  • new
  • create
  • show
  • edit
  • update
  • destroy

に対応したURLをRailsがよしなにやってくれますよね。

しかし、こんなにたくさんのアクションはいらないー。わしゃcreateとshowだけでいいんじゃーなんて時もあったりします。そんなときは

map.resources :users, :only => ['create','show']


として、必要なアクションだけ列挙しましょう。

また、:exceptなんてオプションもあって、必要ないオプションを列挙します。

このへんにかいてありました

Posted in ruby, ruby on rails at 9月 4th, 2009. No Comments.

img_0282

img_0281

Mitaka.rbの第四回に行ってきました。

今回は吉祥寺のepicesという店を借り切って、美味しいものが食べたけりゃMitaka.rbへおいでってな感じです。

後半はフレンチを食べながらLTを見るという、貴重な体験もできましたよ。

Posted in 日記 at 8月 26th, 2009. No Comments.

サーバに引越に伴い、

の3つのサービスを数日間停止させていただきます。 大変ご迷惑おかけしますが、何卒ご了承ください。

Posted in Webサービス, 日記 at 8月 5th, 2009. No Comments.

先月づけで株式会社Syunを退職しました。

Syunは千葉県柏市にある小さなシステム会社で、僕が在籍している間には、こんなことあんなことをしていました。

「IT業界の名工」をうたっているのですがまさにそんな会社で、効率化よりもいかにお客さんに技術で応えるかという理念の基に仕事をしていたなぁと思います。技術だけでなくお客さんに対する誠意という面でたくさん学ぶことがありました。

Syunの皆さん、ありがとう。これからもがんばってください。

さて、退職後しばらくfunc09としてフリーランスのお仕事をぼちぼちやっていきます。無職になったらドラクエ9やるぞーと思っていたのですが、おかげさまでそんな余裕がない程度にお話が来てます。みなさんありがとう。

それに伴いというか、今週中に千葉から三鷹近辺に引越、2年ぶりに中央線人になります。 どうやら中央線沿線以外では生きて行けないらしいというのが、僕の結論なのでこの先中央線から出て行くことはないと思います。三鷹・吉祥寺ラヴ!

それでもって、千葉の時は行きづらかった勉強会やコミュニティに積極的に参加したいとも思っています。何度か参加している三鷹プログラマーズカフェやMitaka.rbはもちろんのこと、Rails東京や、Flash、デザイナーさんのコミュニティにも顔を出したいです。

なのでオススメの勉強会やらがあったら是非twitterなりで声を掛けてくださーい。

Posted in 日記 at 8月 2nd, 2009. 2 Comments.

things_title

ToDo管理何つかってますか?

手帳?付箋?OutLook?Remember The Milk? いろんな選択肢がありますが、この度RTMからThingsへ移行し、とってもGoodなのでメモがてらオススメします。

RTMを辞めた理由

RTMはとても素晴らしいToDo管理ツールだと思います。 僕はプロアカウントでiPhoneアプリも利用するほど気に入っていました。 しかし、プロジェクト単位のタスク管理にどうしても不満が消えませんでした。 そこで始めからGTD用ツールとして設計されていて、プロジェクト単位のタスクも管理できるMacのThingsへ移行してみました。

Things

Thingsでわかったタスク管理の肝

Thingsを使ってみてわかったのは、プロジェクト管理も重要だけど、それ以上に大事なのはタスクを「立場」で分類するという事。

1人の人間でもタスクは「立場」にぶら下がっていると考えられます。 例えば

  • 企画書を仕上げる
  • 古本をブックオフに持って行く
  • Thingsのオススメエントリーを書く

というようなタスクがあったとして、これらは全部同じ人間のタスクですが 実際には実行する立場が異なりますね。

  • 企画書を仕上げる(会社員としての自分)
  • 古本をブックオフに持って行く(家庭人としての自分)
  • Thingsのオススメエントリーを書く(個人としての自分)

こんな感じです。

これらがひとつのタイムラインにばーっと並ぶと、一見次にすべきことを上から順にこなせばいいようにも思いますが 実際には1日のうちで、自分の立場はコロコロ変わるので、立場によって優先順位も変わるはずです。

例えば職場で仕事している時に「古本をブックオフに持って行く」タスクが上位に存在したら、集中して仕事できないでしょう。

Thingsでは「立場」を「エリア」として扱える

そこでThingsでは「エリア」という分類方法を利用します。

things-area

エリアにはプロジェクトかタスクを格納しておくことが可能です。

things_today

今日やることが、プロジェクトで分割されてリストされています。 職場に居る時はエリア「会社」に属したプロジェクト「A社システム開発」のタスクが一番先にあっても良いですが 家に帰ったら、「引越」や「新規個人サービス開発」プロジェクトのタスクを優先したいでしょう。

そんな時はエリアの優先順位を入れ替えます。

things_change

左のエリアで「仕事」を一番下に下げることで、プロジェクトもエリアの並び順に影響されて順番が変わります。 すると今日やることリストのタスクの並び順もしっかりと変わり、家ですべき事が上に表示されるようになりました。

さいごに

RTMを使っていて、どうも上手く管理できていない感じは、タスクをそのタイミングにあった並び順にできない事にありました。 基本「今日やることリスト」しか見てませんので、その中がいろんな立場のタスクでごちゃごちゃになってしまっていたんですね。

それからRTMにくらべて良いなと思った点は、Thingsは終わったばかりのタスクはしばらく表示したままでいてくれることです(だいたい終日)。 これで、あれあのタスク終わったっけ・・?みたいな不安からタスクに集中できないなんてことも減りました。

Posted in mac, 日記 at 8月 2nd, 2009. No Comments.

最近家のiMacの調子が最悪だったので再インストールをしました。

ただ現在進行中のプロジェクトとかがあるので、リストアに掛けられる時間がせいぜい1日。 万が一データが吹っ飛んだり、環境の再構築に時間がかかったら死活問題。 しかし、いつ死ぬとも分からないMacと付き合うのも限界だったのです。

そこで選んだ道は、外付けのHDDを買ってTimeMachineにバックアップを取りつつ、そのバックアップ領域から復元する方法。これが本当に簡単だったので、Macは本当に使いやすくなったなぁと実感しました。

購入した外付けHDDはBaffaloのポータブル用のバスパワーHDD。 http://www.amazon.co.jp/dp/B0029U1R2Y

以前はNASをTimeMachine用にしてたんですが、あまりの遅さに閉口したので素直にUSBのHDDを買いました。ポータブル用でバスパワーなので全然邪魔にならずオススメ。

  • 外付けHDDを繋ぐ
  • TimeMachineの設定をする
  • とりあえず1回バックアップを作成する(数時間かかります)
  • Leopardをクリーンインストール
  • インストール終了後、ようこそウィザードでTimeMachineから復元を選ぶ
  • 復元を待つ(数時間)
  • 再起動したら、元の環境になってる

TimeMachineから復元すると、ちゃんとすべてのアカウントが元通りになりました。 アプリケーションもそのままです。 一部復元されていない箇所があり

  • /etc/hosts

は、クリーンインストールした時の状態でした。

また場合によって、~/.ssh/以下がまっさらだったりした。2台あるMacのうち1台は秘密鍵とかが消えてて焦った。

ホーム下のドットファイルとかは、ちゃんと復元されている。

こんな感じ。 バスパワーポータルHDD + TimeMachineおすすめ!

Posted in mac at 7月 27th, 2009. No Comments.