faviconを設定してないとログに404がずらずら並んで鬱陶しいですね。

そんな時はfaviconを適当に作って、headerに
<%= favicon_link_tag 'favicon.ico' %>
とか書いておけばOK。
rails3.1ならファイルはapp/assets/imagesに置く。

なお、faviconのために毎回インスタンス食われるのはもったいないので、前の記事を参考にnginxで静的ファイルを返すようにしておくのが良いかと。

Facebookアプリからアルバムに投稿する方法。
通常のwall postと違って目立つので、アルバムに投げるのが流行ってたりする。
ちなみにpermissionはpublish_streamでOK。

FBGraphにはアルバムに投げるメソッドがあるようだけど、RestGraphにはないため自分で実装しなければならない。
既にやってる人がいるので真似させてもらった。以下のURL参照。

http://forrst.com/posts/post_a_photo_to_the_fb_graph_api_with_ruby-CSa

multipart-postとmyme-typesのgemが必要。
なお、URLを投げても拾ってくれないので、動的に生成される画像についてはローカルにいったん保存してアップロードする必要がある。

Rails3.1.1のプロダクトをRails3.1.3にアップグレードした時のメモ。

1.Gemfileを書き換える

gem 'rails', '3.1.3'
gem 'rack' , '1.3.5'

しかしrackの最新が幾つなのか分かりにくいな。gem outdatedで出てこないから1.3.5で合ってるんだろうけど。

2.bundle update rails
bundle updateだけだと本体はアップデートされない。

必要なのはここまで。以下は必要なら。

3.rake rails:update
config以下の変更を自動的にやってくれるけど、大抵の場合必要ないと言うか、マイナーアップデートなら手でやった方がいいと思う。

4.rake doc:rails
APIドキュメント生成。いらなければ別に。

 

Agile Web Development with Rails第4版の翻訳がやっと出ますね。楽しみ。

このサーバのフロントエンドをapacheからnginxに入れ替えた。
passenger経由で動かしていたredmineがとても遅いというクレームがあったのと、最近apacheいじってなくて設定にちょっと不安が出てきたので。つーかnginxのが設定項目が少なくて楽だし。
参考にしたのはここここここ。init scriptとかまんまコピペですいません。

More »

Railsで非同期実行する際の定番、delayed_job
ドキュメントが今一分かりにくかったりforkされまくっててどれがオリジナルか分からなかったりするので、メモしておく。

起動・終了・再起動

bundle exec script/delayed_job start   # 起動
bundle exec script/delayed_job stop    # 終了
bundle exec script/delayed_job restart # 再起動

restartはプロセスが無いと起動してくれないので、stop→startの方が無難。

capistranoのレシピ

namespace :delayed_job do
  desc "Start delayed_job process"
  task :start, :roles => :job do
    run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job start"
  end

  desc "Stop delayed_job process"
    task :stop, :roles => :job do
    run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job stop"
  end
 
  desc "Restart delayed_job process"
    task :restart, :roles => :job do
    run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job restart"
  end
end

roleはお好みで。appとかやると全サーバで動き始めるのでお勧めしない。

遅延実行

job = Job.new
job.delay.execute

非同期で実行。デフォルトだと5分おき?にリトライされる。

時刻指定実行

job = Job.new
job.send_at Time.zone.now.tomorrow :execute

これくらいで十分ではないかと。
rails runnerで実行してるバッチもdelayed_jobにしたいんだけど(runnerだとRailsのプロセスが丸々一個上がるのでリソースの無駄)、いい方法ないかな。

Rails3.1でasset pipelineが導入された関係で、3.0のままのレシピでデプロイするといくつか問題が出る。

まずpublic/images、public/stylesheets、public/javascriptsがないというエラー。
エラーが出ても実害はないが、赤文字がずらずら流れるので心臓によろしくない。
これの解決は簡単で、deploy.rbに

set :normalize_asset_timestamps, false

を追加するだけでOK。

ちょっと悩ましいのが、rake assets:precompileをいつ実行するかということ。
ヒューマンエラーをなくすために、まずはdeploy時に実行するようにしてみる。
(deploy.rbではなく)Capfileに

require "deploy/assets"

Gemfileに

gem 'execjs'

を追加。さらにサーバ側にnode.jsをインストールしておく。
これでcap deployすると自動的にrake assets:precompileが実行される・・・んだけど、実はassets:precompileはかなり遅い。appサーバが複数あると全部で実行されるし、大変に効率が悪い。node.jsが簡単にインストールできない環境だとそれも面倒だし。(Ubuntuならapt-getするだけだが)
というわけで、assets:precompileはローカルで実行してリポジトリに含めておくことにした。

More »

Rails3.1からscssが標準になったので、scss-modeを入れてみる。

(autoload 'scss-mode "scss-mode")
(add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode))
(setq scss-compile-at-save nil)

Railsだとcssへのコンパイルはいらないので無効にした。
scss-compile-at-saveをtにしてるとセーブするごとにコンパイルが走って鬱陶しい。
これだとsass(ややこしい)も要らないはず。
scssは実に分かりやすいのでデザイナーさんにも啓蒙したい・・・

RestGraphを使ってFacebookアプリを書いていて、ドキュメントを参考にしつつ

rest_graph_setup(:app_id => API_ID,
:secret => API_SECRET,
:canvas => CANVAS_NAME,
:auto_authorize => true,
:auto_authorize_scope => 'publish_stream',
:auto_authorize_options => {},
:ensure_authorized => true,
:write_session => true,
:write_cookies => true,
:write_handler => nil,
:check_handler => nil,
:auto_decode => true,
)

とか初期設定しているんだけど、これだとスマートフォン版Facebook(アプリ、ブラウザ共に)で開くと延々とリダイレクトループになってOAUTHが通らない。

More »