ウェブサービスを作っています。

ruby

特定のプラットフォームに依存した gem を bundler で管理する

Rails, Capistrano も使ってる前提です。 まず Gemfile に、プラットフォーム別のグループを作ります。 darwin, linux というグループ名でなくてもいいですが、後述のことを考えるとこれが無難です。 group :darwin do gem 'mac 用 gem' end group :linux do…

RSpec 使用時 rails g model で、Factory Girl のファイルも作成する

rails (3.1.1)、rspec-rails (2.7.0)、factory_girl_rails (1.3.0) という環境です。 config/application.rb の config.generators に設定を書くだけです。 module Hoge class Application < Rails::Application ... config.generators do |g| g.fixture_rep…

Rails 3.1 バージョンアップメモ

自社サービスを Rails 3.1.1 にバージョンアップさせたので、メモです。 Asset Pipeline を使用する前提です。 参考にさせていただいた記事 だいたい以下を熟読したら何とかなりました。ありがとうございます。 Ruby on Rails Guides: Ruby on Rails 3.1 Rel…

rvm をやめて rbenv + ruby-build を導入

追記(2011/10/06 16:00): Homebrew で readline をインストールする記述が抜けていたので、追加しました。 また、一部記述ミスも修正しました。申し訳ありません。 rvm の調子がなんか悪いので、シンプルで、37signals 中の人が作ったという rbenv + ruby-bu…

OmniAuth で callback 後セッションが消える問題

おそらく csrf_token なしで戻ってくるからです。 なので、たとえば、callback 後のメソッドが SessionsController#create なら、 class SessionsController < ApplicationController protect_from_forgery :except => :create ... end のようにします。 参…

OmniAuth で /auth/failure?message=invalid_response にリダイレクトされたけど単なる typo だった

config/routes.rb Hoge::Application.routes.draw do ... match '/auth/:provider/callback' => 'sessions#create' match '/auth/failure' => 'sessions#failure' ... end app/controllers/sessions_controller.rb class SessionsController < ApplicationCo…

「スペースシャワーTV プラス」のオンエア曲をお知らせする Twitter BOT を作りました

最近、スカパーで「スペースシャワーTV プラス」を契約しました。 一日中音楽 PV が流れています。家で作業することが多くなったので、BGM 代わりに良いです。(月630円) ただ、今流れている曲を確認するために、テレビを見ないといけないのは結構面倒です。 …

prefetch-rspec + watchr

使ってみました。Rails3 用のようです。 spork を使っていた場合は、spec/spec_helper.rb の spork 関連処理を削除しておきます。 また .rspec に --drb オプションが書いてあると、prefetch-rspec がうまく動かないようです。 まずは Gemfile に prefetch-r…

MySQL の文字列で表記揺れを吸収しない

MySQL で、データベース・テーブル・カラムなどに collate = utf8_unicode_ci を指定すると、大文字・小文字・全角・半角・ひらがな・カタカナなどの表記揺れが吸収されます。 たとえば、「たろう」と「タロウ」の検索結果が同じになります。 参考: mysqlのc…

Delayed::Job のリトライ速度を調整する

Delayed::Job では、例外が発生した場合、 5 秒 + リトライ回数 ** 4秒経過した後にリトライしてくれますが、これを変更する方法です。 Delayed::Job のバージョンは、2.1.4 です。 やり方は簡単で、ジョブのクラスに、リトライ時刻を返す reschedule_at メ…

Mechanize で送信したデータが反映されないときがある

あけましておめでとうございます。Mechanize 1.0.0 のお話です。 example.com?xx=yy のようにパラメータのついた URL のページから、action 属性が空のフォーム <form action=""> を送信すると、パラメータ無しの URL (example.com) に送信されてしまいます。 agent = Mechan</form>…

MobileAdsense プラグインをリリース

携帯向け AdSense を簡単に設定できる Rails プラグイン MobileAdsense を作りました。 milk1000cc/mobile_adsense · GitHub このプラグインをインストールして、ビューで <%= mobile_adsense :client => 'pub-1234567890' %> のように書くだけで、携帯向け…

CRLF と LF が混ざった CSV ファイルを FasterCSV でパースすると FasterCSV::MalformedCSVError が発生する

FasterCSV.parse %!"123","4\n56"\r\n! # => FasterCSV::MalformedCSVError: FasterCSV::MalformedCSVError 改行コードを統一すれば OK FasterCSV.parse %!"123","4\n56"\r\n!.gsub(/\r\n?/, "\n") # => [["123", "4\n56"]]

Capistrano のレシピを Ruby から実行する

たとえば $ cap delayed_job:restart を ruby で実行する場合は、 require 'capistrano/cli' Capistrano::CLI.parse(['delayed_job:restart']).execute! でできました。 Capistrano のソース (capistrano-2.5.19/lib/capistrano/cli/execute.rb 14 行目あた…

Pacecar が便利

Pacecar とは 便利な named_scope のモジュール集です。 Paperclip, Shoulda, Factory Girl, Clearance など、素晴らしいライブラリを多数開発されている thoughtbot 製。 class SomeModel < ActiveRecord::Base include Pacecar end だけで、『表示可能で投…

rake タスクで発生した例外を Exceptional に通知する

Exceptional.rescue_and_reraise で囲えば OK。 desc 'foo' task :bar => :environment do Exceptional.rescue_and_reraise { ... } end 開発環境では捕捉されて欲しくないので、Exceptional.rescue ではなく Exceptional.rescue_and_reraise を使っています…

ActiveSupport の ClassInheritableAttributes に関して

以下、Ruby 1.8 での話です。 ActiveSupport の機能で ClassInheritableAttributes というものがあります。 これは、継承するクラス変数のようなものです。 クラス変数の問題点 クラス変数は、親クラスに同名のものが存在する場合、子クラスでの変更が親クラ…

role_requirement を導入すると render_optional_error_file がオーバーライドされてしまう

ステータスコード 404 や 500 でも「You don't have access here.」とか出てしまうので、Rails.root/lib/role_requirement_system.rb を修正。 render_optional_error_file オーバーライド部分をコメントアウト # def render_optional_error_file(status) # …

似たようなレイアウトを DRY に記述する

A と B というレイアウトがあって、どちらもほとんど同じレイアウトだけれども、微妙にいろんな箇所が違うという場合にどうするか考えてみました。 まず、骨格となる app/views/layouts/base.html.erb というファイルを作ります。ここには、A・B の共通部分…

role_requirement で、一部のコントローラだけ権限を不要とする

restful_authentication プラグインに権限管理機能を追加する role_requirement というプラグインがあります。 rolerequirement - Clean role-based security for restful_authentication (or acts_as_authenticated) - Google Project Hosting Ruby on Rail…

Nested Attributes の _delete カラムが非推奨になっている

Nested Attributes でデータを削除するためには _delete カラムを使うべきだった気がするのですが、いつの間にか非推奨になっていました。 以下のメッセージが、ログに吐かれます (Rails 2.3.5)。 DEPRECATION WARNING: _delete is deprecated in nested att…

HTTPClient の HTTP::Message::escape_query がちょっと便利かもしれない

require 'rubygems' require 'httpclient' HTTP::Message.escape_query(:a => 'あ', :b => 'foo') # => "b=foo&a=%E3%81%82"

EventMachine によるクローラ実装例

グローバルな並列リクエスト数と、ホスト毎の並列リクエスト数を考慮した試作版です。 もう少し改善出来そうな気がします。 require 'rubygems' require 'em-http' require 'addressable/uri' PARALLEL_REQUEST_NUM = 50 PARALLEL_REQUEST_PER_HOST = 2 uris…

Sinatra でとりあえず logging

require 'rubygems' require 'sinatra' log = File.new(File.expand_path("log/#{ Sinatra::Application.environment }.log", File.dirname(__FILE__)), 'a') STDOUT.reopen(log) STDERR.reopen(log) ..(main code).. もっといい方法がありそうな...

JIT コンパイルを無効にする

google-appengine gem (v0.0.6) を使って GAE + JRuby アプリを作っていると、JIT コンパイルのせいでよくわからないエラーになることがあります。 そういうときに JIT コンパイルを無効にする方法です。 config.ru に追記するだけ。 AppEngine::Rack.app.sy…

メモリリークを起こすジョブを DelayedJob で実行する

1 ジョブごとに worker を終了させて god で再度起動させる、あまり良くない方法です。 ジョブ。グローバル変数 $exit を true にすると、job から worker を終了させられます。 class HogeJob def perform .. (leaking process) .. $exit = true end end de…

Ruby で Task Queue

GAE SDK (Java) 1.2.5 から、Task Queue がサポートされて、appengine-apis (0.0.9) にも早速実装されているようなので試してみました。 taskqueue という適当なタスク追加アプリケーションを sinatra で作ってみます。 ローカルでのみ確認しています。 $ mk…

URI Encode と Punycode の共存

http://日本語.jp/カ/ひ?a=漢みたいな URL を Ruby で http://xn--wgv71a119e.jp/%E3%82%AB/%E3%81%B2?a=%E6%BC%A2に変換する必要があったので、適当にでっち上げました。 弾さんの記事に感謝。あと、punycode4r っていう gem のおかげです。 とりあえず enc…

Delayed Job で、can't dump anonymous class Class というエラーが発生する

Delayed Job とは何か BackgrounDRb 的な何かです。詳しくはググれば、英語のチュートリアル的なものがいろいろ見つけられると思います。 コンストラクタで複雑なことをしているとエラーになる class CrawlJob def initialize @agent = WWW::Mechanize.new e…

Warbler で簡単 Sinatra アプリ on GAE

JRuby と AppEngine SDK (Java) はインストールされているものとします。 JRuby は、mac なら macports などで導入できます。 SDK はインストールとか不要で、ダウンロードして解凍するだけで使えるので、はじめの一歩を踏み出しましょう。 Downloads - Goog…