Ruby Weekly #388: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/388rubyweekly.com
Highlights
# frozen_string_literal: true
でファイル内文字列を全て freeze
することで無駄な String
オブジェクト生成を減らす。
モデルデータの複製サービスクラス定義用 gem。polymorphic アソシーエションまで対応できてる。
セキュリティ脆弱性が発覚された TLSv1.0、v1.1 を deprecate、無効化した RubyGems。Bundler などはバージョンによって RubyGems サーバに接続できなくなる。バージョンアップが必要かどうかチェックしてくれるコマンドは curl -sL https://git.io/vQhWq | ruby
Tutorial
CLI オプションをパースしてくれる Ruby コアの OptionParser
。
ActiveRecord.no_touching
ブロックで touch
(updated_at
更新)しないように。バッチ処理などで DB を叩く回数が減らせる。
form_with
がデフォで Ajax となった Rails 5.1 の UJS。
Code
ActiveRecord データの i18n 用 gem。
10 数ユーティリティで画像ファイル最適化 gem。
Ruby Weekly #378: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
malloc のせいで Sidekiq プロセスが 1 GB にまで膨れ上がっちゃう問題。メモリのフラグメンテーションを起してるらしい。解決案は
ブロックの中でもブロック外変数を読み書きできるようにしてくれる binding
の解説。
筆者が class << self
でのクラスメソッド定義を好む理由。
- シングルトンクラスのスコープ内での定義だから。
def self.method
はスコープ外からの定義。 private
protected
領域が使える。def self.method
はprivate_class_method
しかない。
News
RubyMine 2017.3 リリース。
- パフォーマンス向上
- 外部キーワードに飛べるようになった
- Code Insight 改善
- ネストしたプロジェクトへのサポート改善
- WSL(Windows 上 Bash)対応
- メソッド抽出の
private
public
protected
指定可能 - エディター内
rubocop --auto-correct
- Puppet テンプレート同梱
- API テスト用エディター内 REST クライアント
- JavaScript、CSS、Vue.js コード補完改善
git rebase -i
- SQL 生成ツール
99 Bottles of OOP 本は来週まで 40% 割引!
Julia Evans Taking a Sabbatical to Work on Ruby Profiling Tools
Unix を題にした zine で有名な Julia Evans が Ruby プロファイリングツール開発のため 3 ヶ月休職。
Tutorial
- parser gem で Ruby コードを AST に変換。
- REXML または nokogiri で AST を XML に変換。AST 内オブジェクト ID を XML タグの属性として書き込む。
- XPath で書き換えたいコードを指定し、該当タグのオブジェクト ID で該当 AST ノードを取得。
- AST ノードを買い換える。
proc
・lambda
・ブロックいろいろ。
proc
・lambda
内return
の挙動proc
・lambda
引数の数チェック&
演算子でブロックをproc
に変換
Builder gem + Tilt で XML テンプレートエンジンを実装した話。
Rails アプリの elasticsearch 検索機能実装手順。elasticsearch 内インデックスは Kibana で確認。
Heroku 上での稼働中 Rails アプリのデプロイ時に、ワーカープロセスをグレースフルに切り替えるための Procfile 設定。
Opinion
細胞の再生のように、メソッドを小さいコンポーネント(純粋関数)として書き、変更が必要になったら修正ではなく一から書き直せば、長生きするシステムが生まれるのでは、と提案した Chad Fowler 先生の RubyConf 2017 トーク。このルールを守った開発は
- 再利用性にどんな影響を与える?
- 複雑さにどんな影響を与える?
- テストにどんな影響を与える?
- 命名にどんな影響を与える?
といった疑問を述べた記事。(答えは出してなく、あくまで質問を挙げているだけ)
半年前に Ruby を教えるのをやめた Coding Dojo で騒ぎになった Ruby コミュニティ。その一方で Ruby を教え続けている Flatiron School。学校にとって一番大事なのは、卒業生の雇用先の需要ではなく、いかに学生がプログラミングのことを好きにさせること。Ruby がそれに最適だと。
Code
Passwordless: Add Password-Free Authentication to a Rails App
メール本文内リンクでのログイン用 gem。
rack-contrib 2.0: Now Supports (Only) Rack 2.x and Ruby 2.2+
rack-contrib 2.0.0 リリース。
- Rack 1.x サポート終了
- Ruby 2.1 以前サポート終了
Ruby Weekly #377: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Rails 5.2.0 βリリース。
- ActiveStorage でファイルアップロード
- Redis Cache Store
- HTTP/2 Early Hints 対応
- Bootsnap でブート時間半減
- Content Security Policy 定義用 DSL
- secrets を deprecate、Credentials 新規追加
- Webpacker 3.0
Rails ヘルパー使わずに素 JavaScript でクライアント側 ActionCable を実装してみた Thoughtbot 社。
'String#delete_prefix' and 'delete_suffix' Methods in Ruby 2.5
文末文字削除用 String#chomp
は Ruby 2.5 から #delete_suffix
アライアス追加。さらに文頭の文字削除用 #delete_prefix
が新規追加。
Heroku 上 Rails アプリをゼロダウンタイムでドメイン移行。
- 複数ドメイン
- DNS ホストで ALIAS 設定
heroku domain:add
- 複数 SSL 証明書
- SAN 証明書発行
heroku certs:add
- rack-rewrite gem のミドルウェアで
- 外部 API コールバック用エンドポイント
- callbacks サブドメに移行
- 旧コールバックを rewrite
- Evil Martians 自家製 RackRewriteConfig で環境別設定(原文コード参照)
コントローラテストを deprecate した Rails 5 に備えて、ロジックをモデルなどのオブジェクトに抽出するメリット。例に挙げたのは、パラメータ有無で挙動が変わったコントローラのビジネスロジック。
RubyConf 2017 1 日目の振り返り。
- Matz のキーノート
- 初回参加者が意外と多くて Ruby の未来が有望的
- なるべく互換性を保ちながらリリースしていく
- コミュニティを交えて相談していきたい
- There Are No Rules in Ruby (Max Jacobson)
- Ruby の柔軟性のデメリット
- Finding Beauty in the Mundane (Megan Tiu)
- しんどい仕事でも接し方によって楽しめる方法
- Augmenting Human Decision Making with Data Science (Kelsey Pedersen)
- Stitch Fix 社が活用している機械学習
- Growing Old (Chad Fowler)
- レガシーだからって悪いとは限らない
News
RubyGems 2.7.3 リリース。
最もダウンロードされてる gem トップ 10。
- bundler
- multi_json
- rake
- rack
- json
- mime-types
- activesupport
- thor
- i18n
- diff-lcs
Rails は 22 位。
Tutorial
Heroku の無料 Dyno で Sidekiq を動かすための Puma 設定。
Rails API に OPTIONS の HTTP メソッド対応を追加した Kollegorna 社。結果的に rails_http_options gem も作った。
NewRelic などのメソッド計測コードが散らばらないように prepend
する方法。
- migration で DB コメント追加
- ドキュメンテーション生成などのために DB からコメントを読み込む
- コメントを取得する生 SQL
PostgreSQL の UUID を Rails アプリで採用する手順。
Rails アプリの Docker イメージに Yarn を追加する手順。
Bitcoin を解説した Fabio Akita 先生。
Code
ElasticNotifier: Send Error Notifications to an Elasticsearch Server
エラー通知を ElasticSearch サーバに送ってくれる ElasticNotifier gem。
Ruby Weekly #376: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Pathname
を Rust で書き換えて 3 割高速化した FasterPath gem 作成者が Rust に挑んだのを振り返った。
- 最初は FFI 経由で実装してみたが、メモリを解放するコストなどあって、結局ピュア Rust 実装のほうが効果的だった。
- Rust の Ruby 言語拡張 ruru と Helix はあるが、より安定な ruru にした。
- Rust はまだ日が浅くて、ruru も Helix も 1.0 になってないので要注意。
Amazon API Gateway では Ruby SDK(API クライアント gem)を生成できるようになった!AWS IAM 認証込み(カスタム認証も可)。
Rails のセッションデータをクッキーで保存している場合、ブラウザのサイズ上限を超えたら
- モダンなブラウザではクッキーがまるごと破棄され、ログイン状態を維持できないバグ発生。
- IE や iOS の Safari では Secure、HttpOnly、SameSite などのディレクティブが切り捨てられ、XSS 脆弱性にもなりかねない。
Rails、Rack はサイズをチェックしてくれるが、ディレクティブまでは考慮できてない。筆者が暫定対応として Rack::Protection::MaximumCookie gem 作成。
依存 gem と JavaScript ライブラリの脆弱性をアラートしてくれるようになった GitHub。
News
Rubyhack カンファレンスの CFP 開始。
Tutorial
.
..
を除外した ls -a
の結果を返してくれる Ruby 2.5 の Dir.children
Dir.each_child
。
リリース前の ActiveStorage で画像アップロード機能を実装する手順。
カスタムフォーム作成用 FormAPI は不特定多数のフィールドを PostgreSQL の jsonb カラムで保存。フィールド数が多いと重くなってたが、JSON Patch 標準で差分だけサーバに送るようにした。差分を当てるには hana gem 採用。
How to Receive & Respond to Text Messages with Hanami & Twilio
Hanami + Twilio で SMS 送受信アプリ実装手順。
Migrating 'has_and_belongs_to_many' Associations to Rails 4+
Rails 4 HABTM 移行した話。HABTM テーブルのデフォ命名が変わったため、join_table:
オプションで指定する必要があったりする。新規命名に従ってないテーブルを検知してくれるスクリプトも作った。
Docker + Rails + Headless Chrome システムテストを実装した話。
google_translate_diff: Using Google's Translate API More Efficiently
Google 翻訳 API 料金節約施策を google_translate_diff gem としてリリースした Evil Martians 社。原文をテキストと HTML マークアップに分解して、翻訳済みテキストをキャッシュすることで、Google 翻訳 API の二重呼び出しを塞ぐ。自社費用は 6 割減。
Story
RubyTapas 売上低迷と健康保険の負担で RubyConf 2017 に参加できなくなるところだった Avdi Grimm 先生。結局コミュニティからの寄付で参加した。感動と感謝の気持を記事で書き落とした。
Tools
dbmgr: CLI Tool to Back Up, Restore, and Provision Dev Databases
開発環境 DB バックアップ・復元用 CLI ツール。
Code
ActiveRecord スキーマ取得用 gem。
Ruby Weekly #375: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Net::HTTP、Typhoeus などの HTTP リクエストを JSON でロギングしてくれる gem。
DHH いろいろ。
- 元々はプログラミングに興味がなかった。
- 高校で運営していたゲームレビューサイトが数千もの読者がいた。
- サイトの機能追加で PHP 覚えた。
- ブログ上の PHP 相談で Jason Fried と知り合い、37Signals 入社。
- 好きなエディターは TextMate。
- 趣味は写真、機械式腕時計、自動車競技、旅行。
- 時間節約の裏技は、依頼をほとんど断ること。
- 仕事は 4〜5 時間集中して、それ以上仕事しない。
Celluloid、Concurrent Ruby のような Worker Pool パターンを TDD で一から実装してみた話。
- ワーカー数上限が指定できる
WorkerPool
- メモリパンク防止用のジョブ数上限が指定できる
SizedQueue
WorkerPool
に注入できるスケジューリングアルゴリズム
Gemfile 内 gem の定期アップグレードを SaaS として提供してる depfu。各 gem のバージョンを上げる試行錯誤を繰り返し、互換性を検証する仕組み。ある日 ActiveSupport のバージョンアップでメモリパンクしちゃった。原因は bundler が依存関係を Array#combination
で掛け合わせてるところ。配列の重複してる様子を排除する PR 出して緩和。
Waterfall gem でコントローラのサービスオブジェクトをロールバック可能なチェーンで連携する活用例 2つ。
コメントは必ずしもコードスメルだとは限らない、という主張。コメントは2種類ある:
Tutorial
プロキシパターン(別名サロゲートパターン)解説。
- 重い処理をラッピングして遅延評価などで時間稼いでくれる活用例。
- 認可層の活用例。
- RPC での活用例。
- メモ化用の活用例。
Octopus gem で Heroku の PostgreSQL 上レプリケーション実装手順。
PostgreSQL の Advisory Lock 解説。テーブルロック・行ロックと違って、DB 層ではなくアプリ層で管理。例えば、バックグラウンドジョブのワーカーだけでロックをかけても、UI からの CRUD 操作ではロックがかからない。
フィーチャーフラグ用 Flipper gem の新機能。
- 初期設定のデフォ
Flipper
クラスメソッドからシングルトンのインスタンスへデリゲートget_all
preload_all
で全フィーチャーフラグ取得- フィーチャーフラグ
import
機能 - redis、ActiveSupport キャッシュ用アダプター追加
- flipper-api gem でフィーチャーフラグを HTTP API に
Hash の デフォ値設定方法。
Hash.new
Hash#default
Hash#default_proc
case
文を Hash でリファクターすることも提案してる。
Rubyist 向け Atom パッケージ、キーボードショートカット、スニペットなど。
3 週間前にリリースされた Faktory バックグラウンドジョブシステムのインストール手順。
Opinion
ちゃんと書かれた describe
文を推薦する RSpec コアチーム方針への反論。メンテされなくなると。なぜならプログラマーがメンテしたいのは書くのが楽しい、カスタムマッチャーを活かした、テストコードを読むだけでもわかる spec。
出力が読みづらいという指摘を覆す例も挙げた。
Code
Rails、Sinatra などから静的コピーを生成してくれる Rack ミドルウェア。
SVG チャート生成ライブラリー Frappé Charts をラップした gem。
Karafka 1.1: Work with the Kafka Streaming Platform from Ruby
Ruby Weekly #374: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
下記理由で Sprockets から Webpack に移行した LearnZillion 社。
- Sprockets が重い。
- ES6 欲しさ(Sprockets にもあるが、未だに experimental)。
- Sprockets が提供してくれない機能欲しさ。
- Webpack が Rails Way となった。
移行計画
- 準備フェーズ
- Webpacker 追加
- 環境構築
- Nginx、capistrano 設定
- デプロイ
- 移行フェーズ
- Rails asset 用 gem を NPM パッケージで置換
- アピリコードを Webpack に移行
- 必要に応じて Webpack 設定修正
- クリーンアップフェーズ
- Rails asset 用 gem 削除
- Sprockets 設定削除
- Webpack バンドル最適化
問題点
- JavaScript 単体テストの二重メンテ
- 依存していたグローバル変数の維持が大変(ライブラリなど)
- Sprockets バンドルから Webpack バンドルに移行するのが安易ではなかった
コード豊富なので原文参照。
9 年ものレガシー Rails アプリを Rails 5 にバージョンアップした Kickstarter 社。
- 段階的アップグレード
- リリースノートに従った修正
- gem を v5 にアップグレード
- Rails 5 専用ブランチで
- 依存問題で落ちる他 gem をまず修正(Ready4Rails 超便利)
- Rails アップグレードスクリプト実行
- Rails 4.2 にマージできる修正を master ブランチにマージ
- Rails 5 専用ブランチを CI グリーンに
- Rails 5 専用ブランチの deprecation 忠告撲滅
- Rails 5 専用ブランチを手動で動かす
- テストでカバーできてない問題特定のため
- master ブランチで今までの修正をバックポート
- 各機能の開発チームに自分の機能をテストしてもらう
- staging 環境にデプロイ
- 本番デプロイ
- カスタマーサポートからのバグチケ消化
- 振り返り
結果
- 見積もりどおりの 3 ヶ月で完了
- 大規模ダウンタイムなし
- カスタマーサポートのバグチケ対応計画たてとけばよかった
- いろいろ学習できた
- 影響範囲の最も広かった変更点は
HashWithIndifferentAccess
を継承しなくなったActionController::Parameters
。Hash
を継承していることを前提にしたコードがいっぱいあったから。 - モバイルアプリへの影響は少なかったが、予想しなかった。ネイティヴチームのエンジニア巻き込んどけばよかった。
API の重いリクエストで悩まされた Kollegorna 社は、フレイムグラフ見てもネックが特定できなかった。そこでクラス単位でメソッドをベンチマークしてくれる ClassProfiler gem を作ることに。%の最も高いメソッドの中で呼ばれるクラスを次々とベンチマークすることで、やっと犯人に辿り着いた。
先週サービスオブジェクトの使いすぎを否定した Avdi Grimm 先生への反論。
- モジュールメソッドだとどんどん増えていき、結局 junk drawer になる。
- 筆者の経験では、サービスオブジェクトが統一したコードへと繋がった。
- サービスオブジェクトを支える ActiveInteraction gem まで作った。
Rails アプリの多数データベース用 gem。
News
Semaphore CI ユーザが採用している Ruby バージョン別分布。
JRuby 9.1.14.0 リリース。
RubyGems 2.7.2 リリース。
bundle gem
コマンドで新規 gem 生成できなくなっていたバグ解消。- git がインストールされていない環境でエラっていたバグ解消。
Tutorial
インタラクターデザパタ用 interactor gem の紹介。
- Fat Controller の各工程をそれぞれサービスオブジェクトに抽出して、
Interactor
モジュールをinclude
。 Interactor::Organizer
をinclude
したオブジェクトでサービスオブジェクトの呼び出し順番を定義。Interactor
が提供してくれるbefore
around
after
フックでトランザクションを張ったりする。- gem は非常に計量(ソースが小さい)。
Interactor::Organizer
に並べたサービスオブジェクトは Context オブジェクトを共有するのがちょっとグローバル変数っぽくて要注意。- gem は validation 仕組みを提供してくれないので、筆者が validation 用
Interactor
を提案した。
$LOAD_PATH
に載っていないのに gem を require
できるようにしてくれる RubyGems コードリーディング。Kernel#require
のモンキーパッチで、LoadError
発生時の rescue
ブロックで、インストール済み gem の中から探す。見つけた場合、$LOAD_PATH
に追加し、require
再挑戦。
Rack::Deflate
ミドルウェアで Rails レスポンスを gzip 圧縮してサイズを 80% 減らした Richard Schneeman 先生。
&.
演算子の罠。<
などの評価順番が変わっちゃうから要注意。(原文コード参照)
数百万行もの PostgreSQL テーブルをパーティション分割した Evil Martians 社。
- 親テーブルをクローン。
- 子テーブル + 親テーブルの PK をマッピングするビュー作成。
- 子テーブルを作成・更新するストアドプロシージャ作成。
- ストアドプロシージャを呼ぶトリガーをビューに張る。
- ActiveRecord モデルがビューを見るように設定。
- 既存データはビューに
INSERT
することで移行。
Array#transpose
いろいろ。
- 二次元配列で行と列を入れ替えてくれる。
- 三目並べゲームの勝利判定ロジックを例に挙げた。
Rails 3.2 アプリを 4.0 にアップグレードするための豆知識。移行してない人がまだまだいるから。
- Ruby 1.8.7 を使っていれば、1.9.3 にアップグレード。
- rails4_upgrade gem を Gemfile に追加して、アップグレードの必要な gem を特定。
rails:update
Rake タスクで不要な設定・モンキーパッチを削除。- RailsDiff で予想された差分を確認。
- activerecord-deprecated_finders gem で
.find_by_hoge
メソッドを洗い出し・撲滅。 - scope は全部 lambda 表記に。
protected_attributes
撲滅。あるいは protected_attributes gem 導入。Strong Parameters に移行することがベスト。ActiveRecord::Observer
撲滅。あるいは rails-observers gem 導入。wisper gem または Rails Concerns に移行するのがベスト。ActiveResource
は active_resource gem に移行。caches_page
caches_action
は actionpack-action_caching gem に移行。Test::Unit
は test-unit gem に移行。match
式 route は HTTP メソッド要指定。- プラグインを使っていれば gem に移行。
Code
Alpha Vantage API を叩く両替 gem。Alpha Vantage 以外でも拡張可能。キャッシュ期限設定可能。他 gem への依存が一切ない。
ActionCable など WebSocket サーバテスト用 CLI ツール gem。データ送受信スクリプトを YAML で定義してから wsdirector
コマンドで実行。ApplicationCable::Channel
の単体テストと思えば良さそう。(RSpec・MiniTest・Test::Unit とは別物)
Ruby Weekly #373: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
どんな Fat Controller でもサービスオブジェクト抽出で片付けちゃうのを否定する Avdi Grimm 先生。
- 多くの場合はプロシージャー型モジュールメソッドのほうが適切だと
- 間違ったオブジェクトを抽出よりも、オブジェクトを抽出しないほうがマシ
- サービスオブジェクトは依存し合いがち
- サービスオブジェクトはビジネスドメインよりも、インフラ層に相応しい(DDD 本もこう書いてある)
- ビジネスドメインのサービスオブジェクトがあったとしても、インフラ層のサービスオブジェクトから分離すべき
Bundler 1.16 リリース。
- 依存関係解決の新規アルゴリズムに切り替えたことでパフォーマンス向上・バグ解消。
bundle install
のeval
回数を減らしたことでパフォーマンス向上。
次のリリースは Bundler 2!
- master がすでに Bundler 2 となった。
- Bundler 2 機能は 1.16 にも入ってて、feature flag で無効となっている。Bundler 2 を試したい方は、ぜひ有効化を。
ランダムフォレストアルゴリズムで手書き数字の OCR を実装する手順。PyCall gem で Python の scikit-learn ライブラリーに投げてる。
メモリを意識した Ruby。
nil
true
false
はメモリを確保しないため、考慮しなくてもいい。-2^62
〜2^62-1
の整数もメモリを確保しないため、考慮しなくてもいい。Array
Struct
は要素 3 つまでは最低メモリの 40 バイトで収まる。- 空っぽの
Hash
は最低メモリの 40 バイトで収まる。 String
は 23 バイトまで最低メモリの 40 バイトで収まる。- オブジェクトはインスタンス変数 3 つまでは最低メモリの 40 バイトで収まる。
メモリ最適化の工夫:
- 上記ルールと
ObjectSpace.memsize_of
でメモリ計測していき、最も効率の良いデータ構造を選択。 - オブジェクトをできるだけ再利用する。
Array#map!
など破壊的メソッドでオブジェクトのインスタンス化を避ける。- allocation_tracer、memory_profiler などの gem でメモリ計測。
Rails トランザクションの罠いろいろ。全文日本語訳あり!
gem update --system
でバージョンアップしようぜ!
- 同梱 bundler を 1.16.0 にバージョンアップ。
- Bundler が
Gem.use_gemdeps
を使うように。 gem
CLI にsignin
コマンド追加。gem
CLI にログアウト機能追加。
News
Ruby 2.5 パフォーマンス向上。
- 文字列 interpolation が 72% 速く!
String#prepend
が 42% 速く!Enumerable#sort_by
Enumerable#min_by
Enumerable#max_by
が 50% 速く!String#scan
の文字列パターンは 50%、正規表現パターンは 10% 速く!Range#min
Range#max
が 60% 速く!
Tutorial
AWS 上の Sidekiq を自動スケーリングしている Honeybadger.io 社。
- Sidekiq 作業量が増えたら、CloudWatch アラームで新しいインスタンスを起動。
- 作業量が元に戻ったら、インスタンスを殺す。
実行中ジョブが完了するまで、インスタンスを殺すのを遅らせる、という要件を、原文のスクリプトで実装した。
よくある before_validate
コールバック悪用パターンと代替案。
- データフォーマット・正規化。
attr_writer
をオーバーライドしよう。
- データ設定。
- 例えばアソシエーションから取得した値をカラムに設定して非正規化。
- コールバックなしで普通に設定しよう。
linter で JSON API の RSpec テストを綺麗に。リクエストとレスポンスの
Content-Type
チェック- スキーマチェック
を JsonApiLint
オブジェクトに抽出して、
request spec の #app
を置き換えることで、
spec に残るのは
- HTTP ステータスチェック
- JSON 内容チェック
のみになった。
1 it
1 expect
ルールを厳守する Victor Shepelev さんの、引数パターン別メソッドの戻り値をテストする裏技。
subject
はObject#method
で取得したMethod
オブジェクト。its([引数])
で引数パターンを指定。
WEBrick・Rack・Sinatra のそれぞれの役割を分かりやすく描いた図。
Stripe で決済処理を行っている Rails アプリのテストを支える stripe-ruby-mock gem。StripeEvent gem で実装した Stripe Webhook の受信までテストできちゃう。
simplecov gem でテストのカバー率を測る手順。
Story
"".split("-")
は Ruby と Python で挙動が異なっている。
Python は
[""]
を返す。- Java、JavaScript、Elixir、Go、Haskell、PHP、Scala 同様。
Ruby は
25.hours.from_now
で日付が変わることを期待していたテストが落ちた話。実行したのは夏時間に切り替えた日。
Code
関数型 HTTP クライアント gem。
Rack::Session::SmartCookie: Smarter Session Cookies for Rack 2 Apps
Rack 2 セッションクッキーの問題点を解消してデフォにした gem。
Kaminari: A Powerful, Customizable Paginator for Ruby Webapps
松田明先生のアノ有名なページング用 gem。
SNS 投稿を一本化した gem。