Ruby Weekly #496: 日本語サマリー
Highlights
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 外セキュリティ機能。
- devise でユーザ認証
- pundit or cancancan で認可
- API トークンは JWT が人気
- Rack::Attack gem でリクエスト数制御
- brakeman or(メンテされなくなった) dawnscanner で脆弱性検知
- bundler-audit で Gemfile の脆弱性検知
- セキュリティ系 SaaS
Test Double 社エンジニアが愛用している CLI ツール集。
- Homebrew
brew
- 簡略化した
man
ページを提示してくれるtldr
- 高速検索用 ripgrep
rp
または The Silver Searcherag
- 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
AppSignal 社の Citadel アーキテクチャー解説。
Articles & Tutorials
HEREDOC 使い方まとめ。
<<HEREDOC
<<-HEREDOC
<<~HEREDOC
<<-HEREDOC.strip_heredoc
<<~HEREDOC.squish
FastRuby 社の Rails バージョンアップ手順。
- production.log、test.log の deprecation 撲滅
- next_rails gem で dual boot 設置
- 各 gem バージョンアップ可否調査
- 新規 Rails バージョン用ブランチ・PR 切る
- 非互換性 PR は新規 Rails バージョン用ブランチに向ける。それ以外は master。
- QA・動作確認
- 新規 Rails バージョン用ブランチを master にマージ
PostgreSQL で位置情報を管理するだけなら、PostGIS は YAGNI。緯度・経度カラムだけで十分。距離も earth_distance
関数でできちゃう。
デプロイ時 Sidekiq 再起動手順。
- sidekiq.service ファイル作成・設定
- 必要な環境変数を sidekiq.service の
EnvironmentFile
で設定 systemctl enable sidekiq
でサービス登録。service sidekiq start
でサービス起動。
binding.pry
next
continue
Code and Tools
グラフ画像生成用 gem。
色付きでフォーマットされた Ruby オブジェクトを puts してくれる gem。
Slack ボット用フレームワーク。
Brutal: A Code-First Approach to Automate The Writing of Unit Tests
YAML を元にテストを生成せいてくれるテストフレームワーク。
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。