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

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…

Xperia neo を購入

今まで iPhone を使っていたのですが、興味があって Android 携帯を購入しました。 いろいろ考えた結果、SIM ロックフリーの Xperia neo (赤) という機種を購入しました。 購入 1shopmobile というお店で買いました。 http://www.1shopmobile.com/catalog.ph…

Qt をアンインストールする

mac

Mac でインストーラを使ってインストールした場合、以下のスクリプトでアンインストールすることができます。 % sudo /Developer/Tools/uninstall-qt.py 参考 http://forums.macrumors.com/showthread.php?t=587092

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円) ただ、今流れている曲を確認するために、テレビを見ないといけないのは結構面倒です。 …

Chrome 拡張版 LDR Hatebu Comments を作りました

livedoor Reader に、はてなブックマークのコメントを表示する LDR Hatebu Comments というグリモンを以前作りました。 そして今回、それの Google Chrome 拡張版を作りました。 https://chrome.google.com/extensions/detail/lmdjjmpmkjmjdpijdiadmfbpcaoic…

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…

独立しました

3月31日で前職を退職し、4月1日から独立して働くことになりました。 また、株式会社ユーザーファーストという法人を設立しました。 会社を作った理由はいろいろありますが、会社作るの面白そう、と思ったことが一番の理由でしょうか。 この本の影響を受けた…

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>…

iTerm2 で Command キーを Meta キーの意味にするパッチ (SnowLeopard, iTerm2 rev404)

iTerm で Command キーを Meta キーの意味にするパッチ (SnowLeopard, iTerm 0.10) - milk1000cc これの iTerm2 版です。今回は Command と Alt を入れ替えるので、Alt + v でペーストできます。 インストール $ curl https://gist.github.com/raw/737855/it…

Rails2 と Rails3 で after_filter の実行順序が逆になっている

class FiltersController < ApplicationController before_filter { |c| c.logger.info 'before_A' } before_filter { |c| c.logger.info 'before_B' } before_filter { |c| c.logger.info 'before_C' } after_filter { |c| c.logger.info 'after_A' } after…