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

ruby

Sidekiq でリトライが起きたときだけ Sentry に送信する

エラートラッキングサービスの Sentry ですが、 一時的な通信エラーなど、Sidekiq で 1 回リトライすれば解決するようなエラーまで捕捉されると、通知が多くて厄介です。 そこで、リトライが起きたときだけ Sentry に送信されるようにしてみます。 まず、sen…

Ferrum を使った DOM 要素の可視性チェック

Ruby で Chrome を操作する gem Ferrum で、DOM 要素が表示されているかどうかを調べる方法です。 次のような visible? メソッドを作ります。 def visible?(selector) expr = <<~JS function(node) { return window.getComputedStyle(node).getPropertyValue…

slack-notifier で autolink を無効にする

slack-notifier で、URL がリンクになるのを防ぐ方法です。 payload の parse を none にしてあげます。 notifier = Slack::Notifier.new('WEBHOOK_URL') notifier.ping 'example.com', parse: 'none' 参考 api.slack.com

GitHub Actions で Rails のテストを実行する

GitHub Actions で、Rails + PostgreSQL のシンプルなアプリをテストする方法です。 .ruby-version ファイルで、Ruby のバージョンを指定しているものとします。 2020年7月8日現在の情報です。 .github/workflows/ci.yml name: CI on: push jobs: test: runs…

Shrine で、MIME type から拡張子を設定する

ファイルアップロード gem の Shrine で、画像ファイル名が foo.php などでも foo.jpeg のように変換する方法です。 プラグインの設定だけで実現できて便利でした。 Shrine.plugin :determine_mime_type Shrine.plugin :infer_extension, force: true

Headless Chrome でスクレイピングできる Kimurai Scraping Framework を Heroku で使う

Headless Chrome で簡単にスクレイピングできる Kimurai を Heroku で使用する方法です。 2019/11/4 現在の情報となります。 プロジェクトのディレクトリでコマンドを入力します。 heroku buildpacks:add heroku/ruby heroku buildpacks:add https://github.…

VCR で、タイムスタンプなどの動的パラメータを無視する

VCR 4.0.0 + RSpec 3.7.0 で確認しています。 spec/support/vcr.rb VCR.configure do |c| c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock c.configure_rspec_metadata! end spec vcr_options = { cassette_name: '...', match_requests_on…

CircleCI 2.0 + circleci-bundle-update-pr で、自動 bundle update

昨日の続きで、CircleCI 2.0 を使い、毎日 bundle update を自動実行する設定例です。 circleci-bundle-update-pr という便利なツールを使用させてもらいます。 circleci-bundle-update-pr の README にも設定例は掲載されていますが、別の例ということで。 …

Kaminari で、最大ページ数を指定する

Kaminari v0.17.0 で確認しました。 ページングされすぎて、サーバに負担がかかる場合などに便利です。 config/initializers/kaminari.rb Kaminari.configure do |config| config.max_pages = 100 end これで、ページネーション用のリンクなどが 100 ページ…

できるだけ簡単に ActiveRecord で utf8mb4 を動かす

MySQL で絵文字を扱うのに必要な utf8mb4 の設定方法です。 新規にデータベースを構築する場合向けです。 Rails 4.2.6 で確認しています。 データベースの設定 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 collation: utf8mb4…

active_decorator-rspec gem が便利

Active Decorator の decorator 内で、ヘルパーのメソッドを使っていると、テストをうまく書けないという問題があります。 今までは、 active_decorator のdecoratorをrspecでテストする方法 - アジャイルSEを目指すブログ を参考にさせていただいていたので…

エラー監視サービス「Rollbar」を使う

エラー監視サービス「Rollbar」の設定メモです。 同種のサービスと比べて、無料なのにサイト登録数が無制限というメリットがあります。 エラー発生数によって課金されますが、監視頻度を設定することで、課金を抑えることができます。 タイムゾーンの設定 プ…

CarrierWave で ConoHa オブジェクトストレージを使う

転送量無料で 100GB あたり 450 円/月という ConoHa オブジェクトストレージ を CarrierWave から使う方法です。 公開設定にすることで、画像サーバとして使うことができます。 CarrierWave のバージョンは 0.10.0、fog のバージョンは 1.24.0 で確認してい…

Middleman で Pow を使う

試した Middleman のバージョンは 3.3.6 です。 プロジェクトディレクトリに config.ru を置く require 'rubygems' require 'middleman/rack' run Middleman.server Pow の設定 ln -s ~/middleman-project ~/.pow/middleman-project 基本的にはこれだけで良…

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…

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

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

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…

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…

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…