Ruby Weekly #495: 日本語サマリー
Highlights
遠藤侑介さんの end
なしメソッド案。
Ruby のセキュリティパッチ。
中止となった RailsConf 登壇社の一部が録画した自分のトークが 5/5 公開。
Articles & Tutorials
TracePoint.trace
でデバッグする方法。大量の puts
を埋め込むより楽。
ページネーションのない API が叩かれて 560 万レコード返そうとした Puma プロセスがメモリ暴走で自滅した話。デバッグで学んだこと:
Code and Tools
Optimism: A Drop-in Solution for Realtime Remote Validation in Rails
リモート validation 用 gem。サーバ側で validation 実行してからエラーをウェブソケットで返してくれる。
Open-Sourcing Vessel: A Ruby Web Crawling Framework by Evrone
puma-status 1.0: Command-line Tool to Display Information About Puma Processes
Puma プロセス情報表示用 CLI ツール gem。
PostgreSQL クエリをパースしてくれる gem。
Rails モニタリングまとめ。
- パフォーマンス監視 (APM)
- エラー監視
- Sentry、Airbrake、Rollbar、Honeybadger など
- OSS の exception-track gem
- システム監視
- 死活監視
- セキュリティ監視
- CI で bundler-audit + brakeman or dawnscanner
- HTML ビューのヘッダーは Mozilla Observatory
- SSL 証明書は DigiCert
- ページスピード監視
- SEO 監視
Ruby Weekly #492: 日本語サマリー
Highlights
ActiveRecord や PORO の集合体で CLI 表を描画してくれる gem。
ダウンタイムを起こさない PostgreSQL 向け migration をコンパイルしてくれる Nandi gem。Nandi の DSL で書いた migration に対して rails generate nandi:compile
実行したら、ActiveRecord の migration が生成される。
コロナで RailsConf が中止となった。参加費は全額返金。
Articles & Tutorials
Timecop から ActiveSupport::Testing::TimeHelpers
に移行した話。
Timecop.return
してないTimecop.freeze
がいくつかあった。ちゃんとfreeze_time
ブロックに書き換えた。- 終始
freeze_time
したい spec はaround
フックでfreeze_time
用メタタグ定義することで DRY にした。
Elasticsearch 導入チュートリアル。
テストは必要条件・十分条件を両方満たすべきだという、故 Jim Weirich 先生の名言解説。
- 今後実装されるだろうという機能の YAGNI なテストや、実装コードで定義されてない分岐のテストがあれば、必要条件が満たされてない。
- テストが仕様を網羅できてなければ、十分条件が満たされてない。
- 満たしてない場合は、実装コードの設計に問題があるかもしれない。
Code and Tools
CLI 棒グラフ描画用 gem。
deprecated となった Paperclip gem をフォークして継続メンテされている kt-paperclip。
Rails 用 Kafka クライアント gem。
Version Cake 4.0: An Unobtrusive Way to Version APIs in Rails or Rack Apps
Rails API のバージョン指定用 gem。JBuilder などのビューは *.json.v1.jbuilder
といった拡張子で制御。
Ruby Weekly #491: 日本語サマリー
Highlights
gemspec の書き方。
項目 | 備考 |
---|---|
name |
gem 名 |
version |
ソース内定数で設定することが主流。他 gem が参照できるように。 |
summary |
簡易説明文。10 ワード以下がオススメ。 |
description |
長めな説明文。 |
author または authors |
作成者名 |
license |
何でも OK なら "MIT" 。迷ってたら https://choosealicense.com/ を参考に。 |
email |
問い合わせ用メアド |
homepage |
GitHub リポジトリの URL が主流。 |
metadata.bug_tracker_uri |
GitHub リポジトリの Issues URL など |
metadata.changelog_uri |
CHANGELOG.md への URL(あれば) |
metadata.documentation_uri |
rubydoc.info などの URL(あれば) |
metadata.homepage_uri |
spec.homepage |
metadata.mailing_list_uri |
メーリスへの URL(あれば) |
metadata.source_code_uri |
GitHub リポジトリの URL など |
metadata.wiki_uri |
GitHub リポジトリの Wiki URL など |
metadata.funding_uri |
クラウドファンディングサイトの URL など |
files |
テストファイルを外す gem が多い。gem のダウンロードを軽くするために。 |
test_files |
オワコン。スキップすることがオススメ。 |
require_paths |
%w[lib] が主流。 |
executables |
公開する CLI コマンド名 |
bindir |
公開する CLI コマンド保存先パス。exe がオススメ。bin だと開発環境用コマンドが紛れ込みがち。 |
extra_rdoc_files |
ソースないコメント以外の RDoc 生成用ファイル。普段は Dir["README.md", "CHANGELOG.md", "LICENSE.txt"] 。 |
rdoc_options |
RDoc 生成用オプション |
required_ruby_version |
互換性できてる最古 Ruby バージョン |
platform |
OS など制限する必要がなければ、スキップすることがオススメ。 |
add_dependency |
依存してる外部 gem。バージョンも指定しよう。 |
add_development_dependency |
依存してる開発環境用外部 gem。バージョンも指定しよう。 |
cert_chain |
公開鍵へのパス。certs フォルダー配下が主流。 |
signing_key |
秘密鍵へのパス |
Ruby 2.7 のパターンマッチの新しく公開されたドキュメンテーション。
コロナのせいで 9 月まで延期となった RubyKaigi。
EC サイト用 Rails エンジン。モバイル端末に最適化した UI をリリースした。
Articles & Tutorials
AWS Lambda で Hanami::API を稼働する方法。
- Lambda 関数が Rack 環境を用意するように書く。
- bundler で依存してる gem を vendor して、ソースと一緒に zip。
Rails アプリでサブドメ対応。
- routes は
constraints
ブロックのsubdomain
引数で指定。 - サブドメの階層が深い場合は
config.action_dispatch.tld_length
要指定。 - 全サブドメでセッションを共有する場合は
Rails.application.config.session_store
でdomain: :all
指定。 - テストは
host!
ヘルパーでサブドメ切り替え。 - 手元は /etc/hosts ファイル編集 or pow サーバ採用。
罠
- 開発環境から外部 API 叩いてる場合は、
.local
の TLD を許容しない API が多々ある。 - ロードバランサー用 healthcheck エンドポイントはサブドメ付けれない。
- サブドメのない
root
パスに依存してる gem がそこそこある。
Unix タイムスタンプを Time
オブジェクトに変換してくれる Time.at
。時間帯は in
引数で指定。
大量の ActiveJob が同時に retry されることを防ぐために、retry 間隔をランダム化する Rails 6 の jitter
機能。
Excel スプレッドシートのパース用 gem をベンチマークした結果。xsv gem が最速。
A Secret Weapon For Your Rails Apps? RPC with RabbitMQ and Hutch
マイクロサービス間 RPC を RabbitMQ と Hutch gem で実装してみた話。
- マイクロサービスは外部から叩かれる必要がなければ、それぞれの REST API や認証周りをわざわざ作る必要がない。
- バックグラウンドジョブ感覚で社内 RabbitMQ に投げるだけ。
- RabbitMQ 操作は Hutch が抽象化してくれる。
- Hutch 自体は RPC 機能がないが、ちょっと書くだけで実装できちゃった。
- RabbitMQ の
amq.rabbitmq.reply-to
擬似キューでレスポンスまで返せちゃう。
Code and Tools
ActiveRecord や PORO の集合体をスプレッドシートや CSV に変換してくれる gem。
Chaskiq: An Open Source Conversational Marketing Alternative
CS チャット用ウィジェット。管理画面は Rails アプリ。Intercom と違って OSS で自己ホスティングできる。
Redis をテストでスタブしてくれる gem。
ヨーロッパの VAT 番号 validation 用 gem。
Ruby Weekly #490: 日本語サマリー
Highlights
Hanami の API 用フレームワーク登場。パフォーマンスが速いらしい。
Ruby 2.7 も使えるようになった AWS Lambda。
4 月の RubyKaigi 2020 スケジュール発表。
Articles & Tutorials
Jekyll 静的サイトのリンクが全て遷移できるかどうかを、Capybara でテストした話。
ダウンタイムをうっかり起こしちゃう方法。
ActiveRecord::Base.transaction
乱用- 重い処理うっかり囲いがち
- 長時間の
RowExclusiveLock
がマルチスレッド環境でデッドロック起こしたりするから - rails-pg-extras gem で PostgreSQL のデッドロックを検知・強制終了
rails console --sandbox
- 終了までトランザクション張っちゃう
- 重い migration
- strong_migrations の README を参考にしよう
- DB コネクションプール不足
- puma、sidekiq などの設定が config/database.yml の
pool
を超えないように要注意 - PostgreSQL の
max_connections
は PGTune で調整
- puma、sidekiq などの設定が config/database.yml の
Rails Has Added a 'Strict Loading' Mode to Prevent Lazy Loading
N+1 防止用 Rails 6.1 の strict_loading
。includes
付け漏れたら ActiveRecord::StrictLoadingViolationError
を投げてくれる。
Rubocop の新規 cop の Enabled
フラグを明示的に設定するまでは警告を出力するようになった。
rackup
コマンドのコードリーディング。.ru ファイルは Rack::Builder
オブジェクトの binding で eval
される。
Heroku CI でテストを並列実行するように設定する手順。。
Code and Tools
エラー調査に役立つ画面を表示してくれる Rack ミドルウェア gem。
プッシュ通知用 gem。
will_paginate 3.3: A Pagination library for Rails, Sinatra, and More
ページネーション用 gem の Ruby 2.7・Rails 6 に対応したマイナーバージョン。
ActiveRecord 表示準操作用 gem。
Ruby Weekly #489: 日本語サマリー
Highlights
Chrome ブラウザー操作用 gem。headless も non-headless も対応してる。
rubygems.org
の typo で打ってしまいそう rubgems.org
ドメインを買ったエンジニアが、中間車攻撃してみた話。
gem install
の--source
オプションを typo してても攻撃できなかったのでセーフ。- Gemfile の
source
を typo したら攻撃できちゃった。 - 3 ヶ月で 101 人も
rubgems.org
叩いちゃった。 - rubygems、bundler などのメンテナーには報告済み。
HTTP クライアントまとめ。
HTTP クライアント | 備考 |
---|---|
Ruby コアの net/http | 使いづらい |
Faraday gem | ドキュメンテーション最高 |
http.rb gem | 速い |
rest-client gem | 直感的なインタフェース |
httparty gem | 人気者 |
excon gem | |
Typhoeus gem | 1 年以上更新されてない |
curb gem |
January 02, 2006
などの文字列を渡したら、strftime
フォーマットを返してくれる gem。
Articles & Tutorials
ウェブカメラで撮った写真を直接 ActiveStorage にアップロードした話。HTMLCanvasElement.toDataURL()
の base64 データを hidden_field
に設定することで。
配列の要素をグループ化したカウントは、Ruby 2.7 の Enumerable#tally
で集計できるようになった。
prawn gem で PDF を複数生成してる Honeybadger 社が、各 PDF の要素をまとめた概要 PDF を生成することになった。
- DRY にするために、
Prawn::Document
オブジェクトを依存性注入方式で注入することを検討したが、注入したオブジェクト経由で prawn の DSL を呼ぶというオーバーヘッドが発生した。 - 最終的に
SimpleDelegator
でPrawn::Document
の擬似継承することにした。
How to Build a WhatsApp Chatbot with Ruby, Sinatra and Twilio
Sinatra + Twilio で WhatsApp チャットボットを作るチュートリアル。
Django アプリのパスワードを Ruby 用に移行した話。Django の PBKDF2 アルゴリズム + SHA256 ハッシュの代替案として、pbkdf2 gem があったため、既存パスワードはそのまま使えた。
ActionMailer 用ビューが ActinController 用ビューと一緒に紛れ込んでるのが辛くて、prepend_view_path
で ActionMailer 用ビューを分けた話。
Code and Tools
XML・HTML パース用 gem。libxml に依存していないため、nokogiri よりインストールしやすい。
Fake API: A Faster Way to Prototype an API in Your Rails App
API プロトタイプ用 gem。
DATETIME などのカラムで GROUP BY できるようにしてくれる gem。
Ruby Weekly #487: 日本語サマリー
Highlights
O 記法の解説。
エラー処理の歴史と、モナドの実装例。
実装例は
- Dry::Monads のブロック表記で初期実装。
- do 表記にリファクター。
- ActiveRecord など外部リソースへの呼び出し箇所を
Try
でラッピング。
Articles & Tutorials
How to Pass Arguments to Methods in Ruby and How It Affects Their Arity
メソッド引数まとめ。
hoge(**args)
不特定多数の引数。hoge(*)
不特定多数だが使われない引数。hoge(**nil)
キーワード引数がない宣言(Ruby 2.7 以降)- 各種引数の arity を記事内で羅列
Heroku みたいなデプロイができる、セルフホスティングの Rails 6 アプリを Dokku で構築する手順。
破壊的な migration を 2 段階でデプロイすることを怠った失敗談。
rename_column
migration をコードレビューで見落としてしまった。- その上に、長時間の migration をマージしてしまった。
- デプロイ中に migration が走っている 10 分もの間に、rename されたカラムを参照しているコードがエラってしまい、数百人ものユーザがログインできなくなった。
今後の未然防止策
- migration があった場合はレビューを催促する CI スクリプト設置
db/**/**
の CODEOWNER をデータチームで設定。DB ファイルを触るコミットが入ったらデータチーム宛に通知が飛ぶように。- strong_migrations 検討中。
Ruby 2.7 の deprecation を Sentry に飛ばしてくれる、コア Ruby の Warning
モジュールのオーバーライド。
このオーバーライドを楽にしてくれる ruby-warning gem は 2 週間前の Ruby Weekly で紹介されている。
Rails with Jason ポッドキャストの Jason Swett 先生が基本的に書いているテストは
- モデルの単体テスト
- 受け入れテスト(feature spec)
書かないテストは
- controller spec、request spec。コントローラのコードは最低限に抑えるべきだから。
- view spec、routing spec。feature spec でカバーできてるから。
proc
よりも lambda
を使うべきだという主張。
- 引数間違えたら
lambda
がエラーを投げてくれる。 lambda
内のreturn
は外部ブロックをreturn
しない。lambda
の見た目はメソッドに似てて、誤解を招かない。
Active Admin の DSL のソースを潜った結果、instance_exec
と method_missing
を知り得たエンジニアの話。
Ombu Labs 社全プロダクトの UI を統一させるために、スタイルガイドと CSS を Rails engine として gem 化した話。
Code and Tools
クラスの依存関係グラフを描画してくれる gem。
読みやすい API で終了ステータスを返してくれる gem。
Counter Culture: 'Turbo-Charged' Counter Caches for Rails Apps
Rails の counter_cache
カラムを提供してくれる gem。Rails と違うのは
- アソシエーションを直接結んでるモデルだけでなく、そのさらに先のモデルのキャッシュカラムも作れる。
- レコード数だけでなく、任意の集計もキャッシュできる。
- など。
git コマンドを呼ぶ DSL を提供してくれる gem。
OctoLinker: Links Together What Belongs Together in GitHub Repos
GitHub 上コードの require
や include
文を該当ソースファイルへのリンクに変換してくれるブラウザー拡張。
ParallelTests: 2 CPUs = 2x Testing Speed for RSpec, Test::Unit and Cucumber
テスト並列実行用 gem。
Ruby Weekly #485: 日本語サマリー
Highlights
ActiveModel::Serializer より軽量・高速な SimpleAMS gem の紹介。
Rails ビュー軽量化戦略。
- SQL の N+1 解消。
- 不要なカラムなど DB からロードしない。
- ビューから直接 DB 叩いてるクエリをコントローラに移す。重複しているクエリに気づいきやすくなる。
- ページネーション。
- Turbolinks で HTML レンダリング減らす。
- AJAX で HTML レンダリング減らす。
- WebSocket で HTML レンダリング減らす。
- ビューをキャッシュ。
- SQL クエリをキャッシュ。
- DB インデックスを張る。
ReverseCoverage: Find Which Tests Execute Which Lines of Code
コードをカバーしているテスト特定用 ReverseCoverage gem 紹介。
Articles & Tutorials
obsolete となった URI.escape
URI.encode
の代替案。素 Ruby では、クエリパラメータのみ URI.encode_www_form_component
や URI.encode_www_form
でエスケープ。Rails は Hash#to_query
Hash#to_param
で。
Changing a UI Control and DB Schema on a Production Rails App
ゼロダウンタイムで belongs_to
or has_many
のプルダウンを HABTM のチェックボックスに移行する手順。
- HABTM 用テーブル作成。
- コールバック or DB トリガーデ HABTM 用テーブルに書き込む。
- 旧データを HABTM ようテーブルに書き込む。
- 新旧データ整合性確認。
has_and_belongs_to_many
アソシエーション、チェックボックスに切り替える。- 不要なカラム、コールバック、トリガー削除。
Ruby 2.7 Allows Placing of Comment Lines Between Fluent Dots
Class # コメント .method
Ruby 2.7 以降は、こういう行間コメントが書けるようになった。
Rails 3 以前の attr_accessible
attr_protected
をストロングパラメータに移行する作業を一部自動化してくれる rails_upgrader gem の紹介。
flaky テスト解消練習用 rails_flaky_spec_examples リポジトリーの紹介。
Code and Tools
指定した警告を無視 or カスタム処理定義できるようにしてくれる gem。
今週 Ruby 2.7 に対応するようになった、デバッグ用 gem。
crass: A Ruby CSS Parser Compliant with the CSS Syntax Level 3 Spec
CSS パース用 gem。
キャッシングを優先したシリアライザー gem。メンテ状態があやふやとなった ActiveModel::Serializer の代替案。
Quickbooks-Ruby: Use the Quickbooks Online REST API V3 from Ruby
Quickbooks Online API クライアント gem。
メアド validation 用 gem。
パンくず用 gem。