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

Sunspot の search ブロックをメソッドに分割する

Sunspot で複雑な検索を行う場合、検索ブロックが長くなることがあります。 Post.search(include: [:author, :comments]) do # complex1 if complex_conditions1 with :blog_id, 1 else with(:published_at).less_than Time.now end # complex2 if complex_c…

Trigram という gem を作りました

2 つの文字列の類似度を計算する Trigram という gem を作りました。 https://github.com/milk1000cc/trigram Trigram.compare 'he is genius', 'he is genius' # => 1 Trigram.compare 'he is genius', 'he is very genius' # => 0.5625 Trigram.compare 'h…

RSpec + VCR で HTTP テストデータを簡単に作成する

HTTP リクエストをスタブ化する WebMock というライブラリがあります。 これは便利なのですが、リクエストの数が増えてくると、テストデータの管理が大変な場合があります。 VCR を使うと、自動でテストデータを作成してくれて便利です。 参考: VCRを使うとR…

CarrierWave で Amazon S3 にアップロードする

img.example.com から配信 production 環境のみ という前提です。 CarrierWave のバージョンは 0.10.0 です。 Gemfile gem 'carrierwave' gem 'fog' gem 'dotenv-rails' config/initializers/carrierwave.rb CarrierWave.configure do |config| if Rails.env…

登録後からログインしたままにする Devise の設定

Devise (v3.2.2) で会員登録した後、ブラウザを閉じるとログアウト状態になってしまいます。 これを回避し、会員登録の直後から、常にログインしたままとする方法を考えてみました。 app/controllers/users/registrations_controller.rb class Users::Regist…

さくらのVPSでカスタムOSインストールができないとき

さくらの VPS で、カスタム OS インストールをしようとしたのですが、VNC コンソールが立ち上がりませんでした。 原因は、Java のセキュリティ設定でした。 以下、Mac の場合ですが、Windows などでも同様の手順で対処できると思います。 対処方法 最新版の …

Chef Solo 基本操作まとめ

初回の操作 必要ならば Virtualbox, Vagrant をインストールしておく。 gem インストール gem install chef # chef-solo, knife コマンドが入る knife configure # 空欄で OK gem install knife-solo # knife solo が使えるようになる レポジトリ作成 cd ~/d…

Chef でロケールを設定するレシピ

Debian / Ubuntu 用です。日本語に変えてみます。 bash 'locale-gen' do code 'locale-gen ja_JP.UTF-8' end bash 'update-locale' do code 'update-locale --reset LANG=ja_JP.UTF-8' end

Chef でタイムゾーンを設定するレシピ

Debian / Ubuntu 用です。 file '/etc/timezone' do content 'Asia/Tokyo' end bash 'update tzdata' do code 'dpkg-reconfigure -f noninteractive tzdata' end 参考 winhamwr/chef-timezone · GitHub

はてなブログに移行しました

何となく変えてみました。新しいものはいいですね。 Zen for Hatena Blog というテーマを使わせていただいています。 記事下のバナー広告がどうも気に入らなかったので、お金を払って広告非表示にしました。 今後とも、よろしくお願いいたします。

wercker + Capistrano で自動デプロイ

GitHub / Bitbucket のプライベートリポジトリも無料で CI し放題の wercker というサービスがあります。(2013/11/30 現在) サイトもきれいで素敵です。ビルド成功後、Capistrano でデプロイが自動実行される方法を書いておきます。 まず、アプリの設定で SS…

order メソッドをチェインしたときの挙動が Rails3 と Rails4.0.0 で逆

ActiveRecord の AR::Relation#order メソッドですが、チェインした場合の挙動が Rails4.0.0 で変更されていました。 追記(2013/11/7 18:00): Rails4.0.1 で、Rails3 の挙動に戻りましたので、この記事は Rails4.0.0 に対してのみ有用です。ご注意ください。…

git push されたら Jenkins でビルドする

まず、Jenkins を叩くスクリプトを ~/git/jenkins.rb などに置きます。 require 'net/http' require 'uri' Net::HTTP.version_1_2 unless ARGV[0] puts 'usage: ruby jenkins.rb [JOB_NAME]' exit 1 end user = "(Jenkins ユーザーID)" api_token = "(ユーザ…

Devise + OmniAuth で Facebook ログインしているユーザのウォールに自動で投稿する

Gemfile は、以下の通りです。koala gem は、Facebook を処理するライブラリです。 gem 'devise', '2.1.2' gem 'omniauth-facebook', '1.4.1' gem 'koala', '1.6.0' config/initializers/devise.rb の facebook 設定に、scope オプションを追加します。 ウォ…

capybara-webkit を debian の CI サーバで動かす (headless)

まず、Qt と xvfb を入れます。 sudo aptitude install libqt4-dev xvfb Gemfile に、headless gem を追加します。 group :test do ... gem 'capybara' gem 'database_cleaner' gem 'launchy' gem 'capybara-webkit' gem 'headless' ... end spec/spec_helpe…

Paperclip でユーザが画像をアップロード

ImageMagick 系のエラーを表示しない 画像以外のファイルをアップロードされたらエラーを表示する 最大サイズを 5MB に制限 という場合です。content_type はこれでいいのか、ちょっと自信がありません。 has_attached_file :photo, whiny: false # whiny: f…

SSSSLIDE にスライド検索機能がつきました

SlideShare や Speaker Deck のスライドを、縦に並べて表示する「SSSSLIDE」というサービスをやっています。 このたびリニューアルし、スライド検索機能を追加しました。 SSSSLIDE Twitter でつぶやかれたことのある、日本語スライドを中心に検索できます。 …

運用のための Sunspot 設定

Ruby on Rails で Solr による検索を行う Sunspot に関して、私が運用上設定している内容を公開します。 config/sunspot.yml の設定 Sunspot (v1.3.3 現在) では、ジョブやタスクでインデックスを追加・更新した場合、自動でコミットが行われません。 そのた…

rake "sunspot:solr:reindex[,Model]" ではなく rake "sunspot:reindex[,Model]"

Sunspot (v1.3.0) で特定のモデルを再インデックスする場合、 rake "sunspot:solr:reindex[,Model]" としろと README に書いてあるのですけれど、これだと [,Model] の設定が無視されるようです。 rake "sunspot:reindex[,Model]" なら大丈夫です。 関連 URL…

bundle exec と打たなくても済むようにする

~/.zshrc などに export PATH=./bin:$PATH を追記し、bundle install を binstubs オプション付きで実行。 最小限パターン % bundle install --binstubs rbenv を使っているとき % bundle install --binstubs --shebang ruby-local-exec rbenv 使用 + vendor…

perform の引数を破壊的に変更していると resque-retry の挙動がおかしい

Resque のプラグインで、Delayed::Job のように自動リトライをしてくれる resque-retry というものがあります。で、 Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis] Resque::Failure.backend = Resque::Failure::Multip…

スライドを縦に並べて表示する「SSSSLIDE」というサービスを作りました

SlideShare や Speaker Deck のスライドを、縦に並べて表示する「SSSSLIDE」というサービスを作りました。 SSSSLIDE SlideShare や Speaker Deck は大変素晴らしいサイトだと思うのですが、1 ページごとにポチポチとクリックする必要があり、ちょっと不便で…

ActsAsDigestedOn を Rails3 に対応

acts_as_digested_on という gem を 3 年前に作ったのですが、Rails 3.1 から動かなくなっていたので修正しました。 モデルに 1 行追加するだけで、SHA1 ハッシュを自動でカラムに保存するというものです。 https://rubygems.org/gems/acts_as_digested_on h…

URI のクエリを書き換える

Addressable::URI を使うと、割ときれいに書ける気がします。忘れるのでメモ。 require 'addressable/uri' uri = Addressable::URI.parse('http://example.com').normalize uri.query_values = (uri.query_values or {}).merge('a' => '2') uri.to_s # => "h…

全角空白も含めた strip

" 全 半 \n 混 在 ".gsub(/(\A(\s|\u3000)+)|((\s|\u3000)+\Z)/, '') # => "全 半 \n 混 在" 参考 Ruby【全角空白も除去】できるstrip!()ありますか? s = " 全.. - 人力検索はてな 解答例だと、途中に改行が含まれている場合の挙動が意図したものと違う

ActiveDecorator で、強制的にヘルパーのメソッドを呼び出す

ActiveDecorator (v0.1.0) では、モデルのメソッド名とヘルパーのメソッド名が衝突した場合、モデルのメソッドが呼ばれるようです。 強制的にヘルパーのメソッドを呼び出したいときは、以下のようにすれば可能でした。 module HogeDecorator def my_truncate…

特定のプラットフォームに依存した 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…