rastam on rails

東京在住のマレーシア人 Rubyist

Ruby Weekly #496: 日本語サマリー

rubyweekly.com

Highlights

Super Bombinhas: An In-Development Platform Game in Ruby

Ruby で実装されたプラットフォーム・ゲーム。

70+ Ruby and Rails Security Best Practices and Vulnerabilities

Rails が提供してくれるセキュリティ機能。

  • X-Frame-Options ヘッダー
  • X-XSS-Protection ヘッダー
  • X-Content-Type-Options ヘッダー
  • X-Download-Options ヘッダー
  • X-Permitted-Cross-Domain-Policies ヘッダー
  • Referrer-Policy ヘッダー
  • Content-Security-Policy ヘッダー
  • Feature-Policy ヘッダー
  • SQL インジェクション防止
  • データサニタイズ
  • CSRF
  • セッション周りセキュリティ
  • SSL 制御

Rails 外セキュリティ機能。

A Few of My Favorite Things

Test Double 社エンジニアが愛用している CLI ツール集。

  • Homebrew brew
  • 簡略化した man ページを提示してくれる tldr
  • 高速検索用 ripgrep rp または The Silver Searcher ag
  • GitHub 操作用 hub または gh
  • localhost の URL 化用 ngrok
  • コピペ用 pbcopy (MacOS) または xclip (Linux)
  • ファジー検索用 fzf
  • ls 代替用 exa
  • cat 代替用 bat
  • 色付きログ出力用 grc
  • curl +αの httpie または curlie
  • JSON フォーマット・フィルター用 jq
  • git ログ閲覧用 tig
  • ポート調査用 lsof
  • xargs

The 'Citadel' Architecture?

AppSignal 社の Citadel アーキテクチャー解説。

  • 本体は Rails モノリス + React フロントエンド。
  • 監視データ収集がネックになるため別アプリ。元々は Sinatra だったが、今は Rust + Kafka。

Articles & Tutorials

Heredocs and How to Use Them

HEREDOC 使い方まとめ。

  • <<HEREDOC
  • <<-HEREDOC
  • <<~HEREDOC
  • <<-HEREDOC.strip_heredoc
  • <<~HEREDOC.squish

Our Rails Upgrade Process: How to Bundle Update Rails

FastRuby 社の Rails バージョンアップ手順。

  1. production.log、test.log の deprecation 撲滅
  2. next_rails gem で dual boot 設置
  3. 各 gem バージョンアップ可否調査
  4. 新規 Rails バージョン用ブランチ・PR 切る
  5. 非互換性 PR は新規 Rails バージョン用ブランチに向ける。それ以外は master。
  6. QA・動作確認
  7. 新規 Rails バージョン用ブランチを master にマージ

Why You (Probably) Don't Need PostGIS

PostgreSQL で位置情報を管理するだけなら、PostGISYAGNI。緯度・経度カラムだけで十分。距離も earth_distance 関数でできちゃう。

How to Restart Sidekiq Automatically for Each Deployment

デプロイ時 Sidekiq 再起動手順。

  1. sidekiq.service ファイル作成・設定
  2. 必要な環境変数を sidekiq.service の EnvironmentFile で設定
  3. systemctl enable sidekiq でサービス登録。
  4. service sidekiq start でサービス起動。

A Hands-On Tutorial to Debugging Your Code with pry-byebug

pry-byebug でデバッグするチュートリアル

  • binding.pry
  • next
  • continue

Code and Tools

Gruff Graphs: A Graphing Library for Ruby

グラフ画像生成用 gem。

amazing_print: Pretty Print Your Ruby Objects with Style

色付きでフォーマットされた Ruby オブジェクトを puts してくれる gem。

Slack-Ruby-Bot: A Generic Slack Bot Framework

Slack ボット用フレームワーク

Brutal: A Code-First Approach to Automate The Writing of Unit Tests

YAML を元にテストを生成せいてくれるテストフレームワーク

CSV Shaper: A DSL for Creating CSV Output

CSV 生成用 DSL を提供してくれる gem。

Chatwoot: Simple, Open Source Live Chat Software

OSS のチャット用 Rails アプリ。

Ruby Weekly #495: 日本語サマリー

rubyweekly.com

Highlights

A Proposal for 'Endless' Method Definitions?

遠藤侑介さんの end なしメソッド案。

Ruby 2.7.1 Released (And 2.6.6, 2.5.8 and 2.4.10..)

Ruby のセキュリティパッチ。

Why Is Rails Boot Slow on macOS?

macOS 上の重い Rails ブート相談スレ。

RailsConf 2020.2: It's RailsConf, But From Your Couch

中止となった RailsConf 登壇社の一部が録画した自分のトークが 5/5 公開。

Articles & Tutorials

Changing the Approach to Debugging in Ruby with TracePoint

TracePoint.traceデバッグする方法。大量の puts を埋め込むより楽。

How an Index Route Without Pagination Could Hurt Your App

ページネーションのない API が叩かれて 560 万レコード返そうとした Puma プロセスがメモリ暴走で自滅した話。デバッグで学んだこと:

  • メトリックスがなければそもそもデバッグできなかった
  • サーバのログを追うには bashvim の基礎知識が必要
  • ページネーション実装しとこう
  • 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。

pg_query: Use Postgres's SQL Parser from Ruby

PostgreSQL クエリをパースしてくれる gem。

40+ Ruby on Rails Application Monitoring Tools

Rails モニタリングまとめ。

Ruby Weekly #492: 日本語サマリー

rubyweekly.com

Highlights

TableSmith: A Simple Terminal Table Renderer

ActiveRecord や PORO の集合体で CLI 表を描画してくれる gem。

'Fear-Free' Postgres Migrations for Rails

ダウンタイムを起こさない PostgreSQL 向け migration をコンパイルしてくれる Nandi gem。Nandi の DSL で書いた migration に対して rails generate nandi:compile 実行したら、ActiveRecord の migration が生成される。

RailsConf 2020 Cancelled

コロナで RailsConf が中止となった。参加費は全額返金。

Articles & Tutorials

How We Migrated From Timecop to Rails 5.2's Time Helpers

Timecop から ActiveSupport::Testing::TimeHelpers に移行した話。

  • Timecop.return してない Timecop.freeze がいくつかあった。ちゃんと freeze_time ブロックに書き換えた。
  • 終始 freeze_time したい spec は around フックで freeze_time 用メタタグ定義することで DRY にした。

Getting Started with Elasticsearch and Ruby

Elasticsearch 導入チュートリアル

(Make Your Tests) Necessary and Sufficient

テストは必要条件・十分条件を両方満たすべきだという、故 Jim Weirich 先生の名言解説。

  • 今後実装されるだろうという機能の YAGNI なテストや、実装コードで定義されてない分岐のテストがあれば、必要条件が満たされてない。
  • テストが仕様を網羅できてなければ、十分条件が満たされてない。
  • 満たしてない場合は、実装コードの設計に問題があるかもしれない。

Code and Tools

Barcharts: Simple Terminal Barchart Rendering

CLI 棒グラフ描画用 gem。

kt-paperclip: A Maintained Fork of Paperclip

deprecated となった Paperclip gem をフォークして継続メンテされている kt-paperclip

Delivery Boy: A Simple Way to Publish Messages to Kafka

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: 日本語サマリー

rubyweekly.com

Highlights

The Art of Writing a Good Ruby Gem Specification

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 秘密鍵へのパス

Official Docs for Ruby 2.7's Pattern Matching

Ruby 2.7 のパターンマッチの新しく公開されたドキュメンテーション

RubyKaigi 2020 Postponed Due to Coronavirus

コロナのせいで 9 月まで延期となった RubyKaigi。

Spree 4.1: The Rails 6 Based Ecommerce Platform

EC サイト用 Rails エンジン。モバイル端末に最適化した UI をリリースした。

Articles & Tutorials

Using Hanami::API on Amazon AWS Lambda

AWS Lambda で Hanami::API を稼働する方法。

  • Lambda 関数が Rack 環境を用意するように書く。
  • bundler で依存してる gem を vendor して、ソースと一緒に zip。

Building a Rails App That Uses Multiple Subdomains

Rails アプリでサブドメ対応。

  • routes は constraints ブロックの subdomain 引数で指定。
  • サブドメの階層が深い場合は config.action_dispatch.tld_length 要指定。
  • 全サブドメでセッションを共有する場合は Rails.application.config.session_storedomain: :all 指定。
  • テストは host! ヘルパーでサブドメ切り替え。
  • 手元は /etc/hosts ファイル編集 or pow サーバ採用。

  • 開発環境から外部 API 叩いてる場合は、.localTLD を許容しない API が多々ある。
  • ロードバランサー用 healthcheck エンドポイントはサブドメ付けれない。
  • サブドメのない root パスに依存してる gem がそこそこある。

Converting Unix Epoch Timestamps to Ruby Objects

Unix タイムスタンプを Time オブジェクトに変換してくれる Time.at。時間帯は in 引数で指定。

Rails 6 Added 'Jitter' to ActiveJob::Exceptions.retry_on

大量の ActiveJob が同時に retry されることを防ぐために、retry 間隔をランダム化する Rails 6 の jitter 機能。

Faster Excel Parsing in Ruby

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

Spreadsheet Architect v4.0.0 Released

ActiveRecord や PORO の集合体をスプレッドシートCSV に変換してくれる gem。

Chaskiq: An Open Source Conversational Marketing Alternative

CS チャット用ウィジェット。管理画面は Rails アプリ。Intercom と違って OSS で自己ホスティングできる。

FakeRedis: An In-Memory Driver for redis-rb

Redis をテストでスタブしてくれる gem。

Valvat 0.9: Validates European VAT Numbers

ヨーロッパの VAT 番号 validation 用 gem。

Ruby Weekly #490: 日本語サマリー

rubyweekly.com

Highlights

Introducing Hanami::API

Hanami の APIフレームワーク登場。パフォーマンスが速いらしい。

AWS Lambda Now Supports Ruby 2.7

Ruby 2.7 も使えるようになった AWS Lambda。

RubyKaigi 2020 Schedule Revealed

4 月の RubyKaigi 2020 スケジュール発表。

Articles & Tutorials

How to Test Static Sites with RSpec, Capybara, and Webkit

Jekyll 静的サイトのリンクが全て遷移できるかどうかを、Capybara でテストした話。

Rails Mistakes That Could Break Your Production Servers

ダウンタイムをうっかり起こしちゃう方法。

  • ActiveRecord::Base.transaction 乱用
  • rails console --sandbox
  • 重い migration
  • DB コネクションプール不足
    • puma、sidekiq などの設定が config/database.yml の pool を超えないように要注意
    • PostgreSQLmax_connectionsPGTune で調整

Rails Has Added a 'Strict Loading' Mode to Prevent Lazy Loading

N+1 防止用 Rails 6.1 の strict_loadingincludes 付け漏れたら ActiveRecord::StrictLoadingViolationError を投げてくれる。

Using 'Pending' Cops in Rubocop to Make Upgrades Easier

Rubocop の新規 cop の Enabled フラグを明示的に設定するまでは警告を出力するようになった。

Deep Dive Into rackup

rackup コマンドのコードリーディング。.ru ファイルは Rack::Builder オブジェクトの binding で eval される。

Partitioning Parallel Tests On Heroku CI

Heroku CI でテストを並列実行するように設定する手順。。

Code and Tools

Better Errors: A 'Better Error Page' for Rack Apps

エラー調査に役立つ画面を表示してくれる Rack ミドルウェア gem。

Rpush 5.0: A Push Notification Service for Ruby

プッシュ通知用 gem。

will_paginate 3.3: A Pagination library for Rails, Sinatra, and More

ページネーション用 gem の Ruby 2.7・Rails 6 に対応したマイナーバージョン。

acts_as_list 1.0: An ActiveRecord Plugin for Managing Lists

ActiveRecord 表示準操作用 gem。

Ruby Weekly #489: 日本語サマリー

rubyweekly.com

Highlights

Ferrum: A High Level Ruby API to Control Chrome

Chrome ブラウザー操作用 gem。headless も non-headless も対応してる。

How I MITM'd RubyGems.org... Kinda

rubygems.orgtypo で打ってしまいそう rubgems.org ドメインを買ったエンジニアが、中間車攻撃してみた話。

  • gem install--source オプションを typo してても攻撃できなかったのでセーフ。
  • Gemfile の sourcetypo したら攻撃できちゃった。
  • 3 ヶ月で 101 人も rubgems.org 叩いちゃった。
  • rubygems、bundler などのメンテナーには報告済み。

The Top Ruby HTTP Clients for 2020

HTTP クライアントまとめ。

HTTP クライアント 備考
Ruby コアの net/http 使いづらい
Faraday gem ドキュメンテーション最高
http.rb gem 速い
rest-client gem 直感的なインタフェース
httparty gem 人気者
excon gem
Typhoeus gem 1 年以上更新されてない
curb gem

date-formatter: Format Dates by Example

January 02, 2006 などの文字列を渡したら、strftime フォーマットを返してくれる gem。

Articles & Tutorials

Linking a Webcam Directly to Rails' ActiveStorage

ウェブカメラで撮った写真を直接 ActiveStorage にアップロードした話。HTMLCanvasElement.toDataURL()base64 データを hidden_field に設定することで。

Ruby 2.7 Adds Enumerable#tally

配列の要素をグループ化したカウントは、Ruby 2.7 の Enumerable#tally で集計できるようになった。

Decoupling Ruby: Delegation vs Dependency Injection

prawn gem で PDF を複数生成してる Honeybadger 社が、各 PDF の要素をまとめた概要 PDF を生成することになった。

  • DRY にするために、Prawn::Document オブジェクトを依存性注入方式で注入することを検討したが、注入したオブジェクト経由で prawnDSL を呼ぶというオーバーヘッドが発生した。
  • 最終的に SimpleDelegatorPrawn::Document の擬似継承することにした。

How to Build a WhatsApp Chatbot with Ruby, Sinatra and Twilio

Sinatra + Twilio で WhatsApp チャットボットを作るチュートリアル

Migrating User Passwords From Django to Ruby

Django アプリのパスワードを Ruby 用に移行した話。Django の PBKDF2 アルゴリズム + SHA256 ハッシュの代替案として、pbkdf2 gem があったため、既存パスワードはそのまま使えた。

Putting All Your Mailer Views in One Place

ActionMailer 用ビューが ActinController 用ビューと一緒に紛れ込んでるのが辛くて、prepend_view_path で ActionMailer 用ビューを分けた話。

Code and Tools

Oga: An XML/HTML Parser Written in Pure Ruby

XML・HTML パース用 gem。libxml に依存していないため、nokogiri よりインストールしやすい。

Fake API: A Faster Way to Prototype an API in Your Rails App

API プロトタイプ用 gem。

Groupdate 5.0: A Simple Way to Group Temporal Data

DATETIME などのカラムで GROUP BY できるようにしてくれる gem。

Ruby Weekly #487: 日本語サマリー

rubyweekly.com

Highlights

Exploring Big-O Notation with Ruby

O 記法の解説。

Error Handling with Monads in Ruby

エラー処理の歴史と、モナドの実装例。

  1. 最初は GOTO で。
  2. GOTO が追いづらくなってたから、エラーを表す戻り値を返す関数や、エラー状態を表すグローバル変数に。
  3. 例外誕生。
  4. 例外は制御構造として悪用されるようになり、モナド誕生

実装例は

  1. Dry::Monads のブロック表記で初期実装。
  2. do 表記にリファクター。
  3. 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 を記事内で羅列

Deploying a Rails 6 App with Dokku

Heroku みたいなデプロイができる、セルフホスティングRails 6 アプリを Dokku で構築する手順。

Backward-Compatible Database Migrations

破壊的な migration を 2 段階でデプロイすることを怠った失敗談。

  1. rename_column migration をコードレビューで見落としてしまった。
  2. その上に、長時間の migration をマージしてしまった。
  3. デプロイ中に migration が走っている 10 分もの間に、rename されたカラムを参照しているコードがエラってしまい、数百人ものユーザがログインできなくなった。

今後の未然防止策

  • migration があった場合はレビューを催促する CI スクリプト設置
  • db/**/**CODEOWNER をデータチームで設定。DB ファイルを触るコミットが入ったらデータチーム宛に通知が飛ぶように。
  • strong_migrations 検討中。

Handling and Customizing Ruby 2.7 Deprecation Warnings

Ruby 2.7 の deprecation を Sentry に飛ばしてくれる、コア RubyWarning モジュールのオーバーライド。

このオーバーライドを楽にしてくれる ruby-warning gem は 2 週間前の Ruby Weekly で紹介されている。

What Kinds of Rails Tests I Write and What Kinds I Don't

Rails with Jason ポッドキャストの Jason Swett 先生が基本的に書いているテストは

書かないテストは

  • controller spec、request spec。コントローラのコードは最低限に抑えるべきだから。
  • view spec、routing spec。feature spec でカバーできてるから。

Lambdas Are Better Than Procs

proc よりも lambda を使うべきだという主張。

  • 引数間違えたら lambda がエラーを投げてくれる。
  • lambda 内の return は外部ブロックを return しない。
  • lambda の見た目はメソッドに似てて、誤解を招かない。

Pay No Attention: Behind the Magic of Ruby DSLs

Active AdminDSL のソースを潜った結果、instance_execmethod_missing を知り得たエンジニアの話。

Gemifying Your Style Guide to DRY Your CSS

Ombu Labs 社全プロダクトの UI を統一させるために、スタイルガイドと CSSRails engine として gem 化した話。

Code and Tools

ruby_detective: Investigating Your Ruby Code Dependencies

クラスの依存関係グラフを描画してくれる gem。

tty-exit: Human-Friendly Terminal Exit Codes

読みやすい API で終了ステータスを返してくれる gem。

Counter Culture: 'Turbo-Charged' Counter Caches for Rails Apps

Railscounter_cache カラムを提供してくれる gem。Rails と違うのは

  • アソシエーションを直接結んでるモデルだけでなく、そのさらに先のモデルのキャッシュカラムも作れる。
  • レコード数だけでなく、任意の集計もキャッシュできる。
  • など。

Ruby/Git: A git Wrapper for Use from Ruby

git コマンドを呼ぶ DSL を提供してくれる gem。

OctoLinker: Links Together What Belongs Together in GitHub Repos

GitHub 上コードの requireinclude 文を該当ソースファイルへのリンクに変換してくれるブラウザー拡張。

ParallelTests: 2 CPUs = 2x Testing Speed for RSpec, Test::Unit and Cucumber

テスト並列実行用 gem。