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

rake kamal:ssh, kamal:console などを作っておくと便利

Kamal で、コンテナ作業をしたいとき kamal app exec -i --reuse "bin/rails console" などと入力するのは大変です。 以下のような rake タスクを作っておくと、rails kamal:console などで実現できて便利かと思います。 lib/tasks/kamal.rake namespace :ka…

Elasticsearch v7 最新版と elasticsearch-sudachi が入った Docker イメージを作る

大変便利な elasticsearch-sudachi (analysis-sudachi) ですが、 2024/1/28 現在ですと Elasticsearch の v7 最新版 7.17.17 に対応したパッケージが提供されていません。 そこで、analysis-sudachi を自前ビルドする Dockerfile を作りました。 README に書…

Rails + Kamal + Cloudflare で訪問者の IP アドレスを取得する

Cloudflare を使っていると、Rails の request.remote_ip に訪問者の IP アドレスではなく、Cloudflare の IP アドレスが入ってきてしまいます。 cloudflare-rails という gem でこの問題が解消されるはずなのですが、なぜかうまくいかず悩んでいました。 原…

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…

Rails アプリの開発で Browsersync を使用する

追記(2022/12/24): proxy を使用しない方法に書き換えました。 Rails v7.0.4 で、sprockets-rails, jsbundling-rails を使用している前提です。 Browsersync は v2.28.1 で確認しています。 まずは、プロジェクトのルートでインストール。 yarn add browser-…

slack-notifier で autolink を無効にする

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

details 要素 + Stimulus で開閉アニメーション表示をする (高さ可変のアコーディオンメニュー)

<details> 要素 を使うと JavaScript を使わずにアコーディオンメニューを実装することができます。 ただ、2022年2月時点では、開閉のアニメーション表示をする組み込みの方法がありません。 そこで、Stimulus を使って開閉アニメーション表示をするコードを示します</details>…

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

Chromebook ターミナルのフォントを Inconsolata などに変更する

Chrome OS のターミナルは Web フォントを設定することで、フォントの変更ができます。 私は Powerline を使っていませんが、powerline-web-fonts というものを使うと、簡単に変更することができました。 GitHub - wernight/powerline-web-fonts: Powerline …

Chrome OS の拡張機能で、カレントウインドウがターミナルかどうか判別する

最近 Chromebook を入手したので Emacs keybindings がちゃんと使えるようにしたく、試行錯誤しています。 その過程で拡張機能を作っており、思いついたコードです。 const TERMINAL_URL_REGEXP = /^chrome\-extension:\/\/.+\/html\/crosh\.html/ let onTer…

Webpacker4 で Vue と Pug を扱う

webpacker v4.0.2 で確認しています。 Webpacker4 + Vue.js の単一ファイルコンポーネント (SFC) で、 <template lang="pug"> .hoge </template> のような Pug テンプレートを扱う方法です。 yarn add pug pug-plain-loader config/webpack/loaders/pug.js module.exports = { test: /\.pug$/…

Webpacker4 で、Sass のインデント記法を有効にする

webpacker v4.0.2 で確認しています。 config/webpack/environment.js const { environment } = require('@rails/webpacker') // 追加 environment.loaders.get('sass').use.find(u => u.loader === 'sass-loader'). options.indentedSyntax = true module.e…

IE10以下で HTMLElement.dataset を使う

JavaScript で HTML 要素の data- 属性 を取得する際、モダンブラウザでは elem.dataset.xxx のように取得できます。 HTMLElement.dataset - Web API | MDN ただ、この機能は IE10 以下で使うことができません。 element-dataset という npm モジュールを使…

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…

Rails で本番環境の deprecation warning を独自ログに出力する

Rails 5.0.6 で確認しています。 もっと良い方法がある気もするので、ご存知でしたら教えていただけると幸いです。 config/environments/production.rb (デフォルトで :notify になっていると思います) config.active_support.deprecation = :notify config/…

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

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

CircleCI 2.0 + Capistrano で自動デプロイ

CircleCI 2.0 で、Rails アプリを自動デプロイする設定例です。 ミドルウェアとして、MySQL と Elasticsearch を使用しています。 2017/11/30 現在の情報となります。 .circleci/config.yml (インデントが 4 スペースの場合があるので注意) ruby_image: &rub…

「ふるふる」のスマホ版ができました

ふるさと納税の返礼品検索サイト「ふるふる」のスマートフォン版ができました。 ふるふる サービス開始から 1 年ほど経ち、使ってくださる方も増えました。 年末の利用が多いですね。 スマートフォン版は、スキマ時間などに使っていただければうれしいです。…

Git のコミット前に sass-lint を実行する

追記(2022/1/26): husky v7.0.4 と lint-staged v12.3.1 で動くように修正しました。 昨日の記事 の続きです。 sass-lint -v を手動で実行するのは大変なので、git commit 時に自動実行するようにします。 必要なツールのインストール。 yarn add lint-stage…

sass-lint を導入する

CSS は、Sass (*.sass) で書いているのですが、プロパティの順番をアルファベット順にしたくて sass-lint を導入してみました。 インストール npm install -g sass-lint .sass-lint.yml。便利そうな設定もいくつか追加。 必要最低限の設定にしたいので、merg…

法人本店移転の手順

一人で会社をやっていて、管轄法務局が変わる法人移転をする場合の方法メモです。 メインタスク 移転前の法務局に行く (相談窓口があります) 登記移転をする 「移転後」の法務局で、印鑑カードの交付申請をする 移転前の税務署に、異動届を出す 移転前の都税…

全角や空白を含む問い合わせ番号でも検索できる Elasticsearch の analyzer

elasticserach-rails での設定例です。 settings( analysis: { filter: { whitespace_remove: { type: 'pattern_replace', pattern: "\\p{javaWhitespace}", replacement: '' } }, analyzer: { my_code_analyzer: { type: 'custom', filter: [ 'icu_normaliz…

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。 そのような場合、seed_dump と activerecord-import を使ってうまく実現することができました。 Gemfile group :development do gem 'seed_dump' end group :t…

ふるさと納税の返礼品検索サイト「ふるふる」を作りました

ふるさと納税の返礼品を検索できる「ふるふる」というサービスを作りました。 ふるふる ふるさと納税のポータルサイトはいくつかありますが、 できるだけ多くの返礼品を検索できる ごちゃごちゃしていない 簡単に検索できる サイトがほしいと思い、開発に至…

elasticsearch-model で eager loading を行う

elasticsearch-model v0.1.9 で確認しました。 response = Article.search.tap { |r| r.records.options[:includes] = [:comments] } response.records.each do |article| article.comments # eager loaded end #records の引数で指定することもできます。 A…

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

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

新生銀行に自動ログインする Google Chrome の拡張機能を作りました

以前、新生銀行に自動ログインするユーザースクリプトというものを書いたのですが、Chrome のセキュリティレベルが上がり、動かなくなってしまいました。 そこで今回、拡張機能としてきちんと作りなおしてみました。 Shinsei Power Direct AutoFill - Chrome…