Ruby Weekly #507: 日本語サマリー
Highlights
Building GitHub-Style 'Hovercards' with Stimulus and HTML-Over-The-Wire
Stimulus で Hovercard 機能実装手順。
- ビューに
data
属性埋め込む - どんな Hovercard でも取得できる汎用化 Stimulus コントローラ実装。
- Rails コントローラ・ビュー実装。
- Hovercard 吹き出しの尻尾を CSS で実装。
Factory Bot 6.0: A Library for Setting Up Ruby Objects as Test Data
enum
用 traits_for_enum
機能が追加された Factory Bot。
Rails セキュリティパッチ。
静的ウェブページをクローリングする場合
SPA などの動的ウェブページは、Kimurai フレームワーク + Selenium Chrome。
AWS の SDK v2 は 2021 年 11 月サポート終了。
Articles & Tutorials
PostgreSQL での JOIN テーブル作成。
- HABTM、
create_join_table
migration は非推奨。PK なしの拡張しづらいテーブルを作ってしまうから。 - 複合インデックス 1 つだけで十分。
Enumerable#select
+ Enumerable#map
= Ruby 2.7 の Enumerable#filter_map
。
メンテされなくなった apartment gem から activerecord-multi-tenant に移行する手順。おまけに Carrierwave 添付画像の移行手順。
処理失敗時の再実行方法まとめ。
retry
キーワード- retriable gem
- Sidekiq や Resque の retry 設定
- 各ツールの独自エラー処理
CockroachDB の ActiveRecord アダプター。
7 つの CRUD アクション以外のアクションを生やすと、名詞_動詞
のキモいパスヘルパーができてしまう。ネストしたリソース切ろというヒントでもある。
Code and Tools
配列や ActiveRecord オブジェクトから CSV を生成してくれる gem。
EBNF パース用 gem。
Ruby Weekly #505: 日本語サマリー
Highlights
サーバに特化した Fullstaq Ruby に移行した mkdev 社。メモリ使用率はそんなに変わってないが、激しく変動してたのが安定になった。アラート閾値超えなくなった。
米黒人暴行死の騒動で RuboCop 改名案の issue が挙がった。ユーザへの影響と工数が見合わないなどの理由を挙げたメンテナーは issue を閉じたが、その後も炎上した挙句、issue をロックすることに余儀なくされた。
GitHub アカウントを持っているなら誰でも投稿できる Ruby コミュニティブログ。Ruby Weekly のネタもここから。
テスト並列実行用 gem。
Articles & Tutorials
メタプロの使い道まとめ。
- モンキーパッチ
- マクロ
- DSL
- シングルトンクラス
- 動的メソッド定義
Refinement 解説。
- モンキーパッチより影響範囲が限られてる
- スコープは同一ファイル内 or 同一モジュール内 or 同一クラス内
JavaScript をほとんど書いてない ActionCable アプリを CableReady で実装した話。チャンネル定義が唯一の JS ファイル。
Code and Tools
シンタックスを必要最低限に抑えたテストフレームワーク gem。
Rails + Sidekiq + Puma + PostgreSQL + nginx 用 Ansible プレイブック。
redis クライアント用 gem。
正規表現パース用 gem。
Active Record SQL Server Adapter 6.0: The SQL Server Adapter for Rails
ActiveRecord の SQL Server アダプター用 gem。
XML 生成用 gem。
Amazing Print 1.2: Pretty Print Your Ruby Objects with Style
インデント・色付き出力で puts してくれる gem。
タスクを依存順に実行してくれるワークフローエンジン gem。並列実行できるタスクは並列実行。
Ruby Weekly #503: 日本語サマリー
Highlights
Rubocop ユーザ調査結果。多くは
- シングルコーテーション使う
- 1 行 120 文字まで
- 配列・ハッシュ末尾に
,
付けない and
or
を一切使わない!!
を boolean 変換だけで使う- ハッシュ内にスペースを空ける
Kernel
系メソッドは()
を使わないCyclomaticComplexity
cop が役に立つ- Rubocop のデフォ設定がまあまあ満足
大量の ActiveRecord を高速削除してくれる gem。
Rust で gem を作る手順。
Articles & Tutorials
同一レコードの多重 SELECT を減らす方法解説。ActiveRecord::Associations::Association#target
を設定することで lazy load を阻止する。
From 25 Minutes to 7 Minutes: Improving the Performance of a Rails CI Pipeline
Gusto 社の CI 高速化戦略。
- flaky テストを skip して担当者に解消してもらった
- RSpec デフォに戻した(テスト順番ランダム化、Rails の autoloader 採用、テスト間依存断絶)
- 2 分以上かかるテストを skip して担当者に軽量化してもらった
- 各テストの実行時間を DB に保存して knapsack gem で均等に並列実行
JWT トークンなどとして使える、Rails 6.1 の signed_id
。
Rails バージョンアップの 2 戦略のメリデメ比較。
- 新規バージョン用ブランチ
- デュアルブート
筆者はデュアルブート推奨。
メモ化の解説。
マルチテナント実装方法 3 通りの比較。
- テナント識別用 FK
- テナントごとに専用テーブル作成
- テナントごとに専用 DB 作成
Code and Tools
pry-rescue: Start a Pry Session Whenever Something Goes Wrong
例外発生時に pry で入るための gem。
DynamoDB 用 ORM gem。
webmention-client-ruby: A Ruby Gem for Sending Webmention Notifications
ウェブメンション送信用 gem。
PostgreSQL 監視用ダッシュボード。
Ruby Weekly #501: 日本語サマリー
Highlights
RubyGems は TruffleRuby でもテストが全て通るようになった。他に全部通ってるのは MRI だけ。JRuby でもテストしてるが、一部スキップせざるを得ない。
Rails 6 が Webpacker になったのにもかかわらず Sprockets を維持してる理由。Webpacker が JS 経由で CSS・画像をインポートしてるのがキモイから。
Articles & Tutorials
RubyFann gem でニューラルネットワークを実装した話。
SHA-256 暗号化の各工程をアニメーションで表現する CLI。そして各工程の説明が README に載ってる。
- webdrivers gem はプラットフォームに合ったブラウザーの WebDriver を特定して用意してくれる。
- MiniTest から Capybara ヘルパーを呼ぶ。
- Capybara は selenium-webdriver を呼ぶ。
- selenium-webdriver は、webdrivers gem が特定したブラウザーの WebDriver を WebDriver プロトコールで呼ぶ。
- WebDriver がブラウザーを操作する。
ブラウザー | WebDriver |
---|---|
Chrome | chromedriver |
Firefox | geckodriver |
MS Edge | edgedriver |
Safari | safaridriver |
マルチスレッドで DB を叩いたら発生する ActiveRecord::ConnectionTimeoutError
の解消法。
- 終了したスレッドが connection を解放してくれないから、最後に
ActiveRecord::Base.clear_active_connections!
呼ぶこと。 - pool が足りるように
ワーカー数 * (スレッド数 + 1)
で設定。
docker コンテナ内のシステムテストをホストのブラウザで実行させる手順。筆者の Avdi Grimm 先生でも調べるのが大変だったらしい。
- webdrivers gem 削除。
- テストサーバノポート固定化。
- Capybara サーバ用環境変数を docker-compose.yml で設定。
- Capybara サーバ用環境変数を使うように test_helper.rb 設定。
ApplicationSystemTestCase
が remote ブラウザーを使うように設定。- ホストに chromedriver インストール・起動。
- docker コンテナ内でテスト実行。
Upgrading a Trivial Rails App from Ruby 2.3 to 2.7 and from Rails 4.2 to 6.0
簡易 Rails アプリを Ruby 2.3→2.7、Rails 4.2→6.0 にアップグレードした話。
- Ruby 2.3.1→2.3.8→2.4.10→2.5.8→2.6.3 のアップグレードは順調。
- Rails 4 から一気に 5.2 にアップグレードしたら痛い目に会った。4→5.0→5.1→5.2 のように、マイナーバージョンごとに deprecation 解消していくことがオススメ。
- Rails 6 へのアップグレードは、sqlite gem だけ追加する必要があった。
Code and Tools
暴走したシェルコマンドのせいで非同期ジョブのキューが停滞してしまった John Nunemaker 先生。posix-spawn gem に移行することでタイムアウトさせるようにできた。
Foreman だと pry への入力が見れない問題を解消してくれる pry-remote gem。
Ruby Weekly #500: 日本語サマリー
Highlights
別バージョンの Ruby にトランスパイルしてくれる Ruby Next gem の紹介。
- gem の Ruby バージョン間互換性を維持するために作った Vladimir Dementyev 先生
- メソッドだけなら refinements で簡単・安全にバックポートできるが、シンタックスはトランスパイルするしかない
- parser gem で生成した AST を unparser gem で対象 Ruby バージョンに書き出す
- アプリで使う場合は run-time モードで実行中にリアルタイムトランスパイル
- gem で使う場合は CLI でトランスパイルしたファイルを生成して .gem パッケージに組み込む
今年の Rails 利用者調査は 7/15 まで実施。
Articles & Tutorials
新規 Rails アプリに FactoryBot を導入する手順。
- factory_bot_rails gem インストール
- Factory 定義
- Faker gem インストール
- rails_helper.rb に
config.include FactoryBot::Syntax::Methods
追記
*
の使い道例。
- 配列を配列に挿入
[:foo, *middle, :qux]
- メソッドの全引数を配列で参照
def foo(*bar)
- 配列を最初・最後・その他の要素に分解
first, *, last = [1, 2, 3, 4, 5]
- 単一オブジェクトを配列に変換
*1
- 配列をハッシュに変換
Hash[*[:foo, 1, :bar, 2, :baz, 3]]
Webpacker のポート番号は webpacker.yml で設定できるが、環境変数や YAML 内 ERB では設定できない。
素 JavaScript の fetch()
メソッドで Rails の AJAX 機能を実装する話。レスポンスは partial の HTML で、そのまま DOM を置き換える。
AWS SimpleDB まとめ。
Code and Tools
Rodauth 2.0: Ruby's 'Most Advanced' Authentication Framework
どんな Rack アプリでも使える認証用 gem。
営業日数計算用 gem。祝日自由に定義可能。
ActiveRecord カラムを暗号化してくれる gem。
Rack アプリ向け AB テスト用 gem。
Ruby Weekly #498: 日本語サマリー
Highlights
gem 名 typo を狙ってる悪質 gem 760 個も検知した Reversing Labs 社。問題の gem は全部 RubyGems から削除済み。
悪質 gem の中で一番インストールされた gem は、Windows クリップボードにコピーされた仮想通貨ウォレットを攻撃者のウォレットで置き換えてる。
PostgreSQL 12 以上の全文検索機能解説と Rails での導入方法。
to_tsvector
関数で単語正規化to_tsquery
関数でクエリ正規化ts_rank
関数でランク付け- pg_search gem
- 正規化した単語をキャッシュするカラムを追加する migration
デメリットを伴うキャッシュを実装する前の代替案検討手順。
- rack-mini-profiler gem でネック特定。
- benchmark-ips gem で軽量化前後のパフォーマンス測定。
- ネックがビュー or DB or アプリコードのどれにあるか特定。それぞれ軽量化方法が違う。
Articles & Tutorials
rspec-given で feature spec 可読性向上。
gem build
コマンドが生成する .gem ファイルの中身解説。
- ソースコードが入ってる data.tar.gz
- gem メタデータの YAML が入ってる metadata.gz
- gem 改竄防止用 checksums.yaml.gz
- 暗号化した場合の .gz.sig ファイル
ビューへのロジック埋め込みを不可能にしてくれる mustache フレームワーク。
Code and Tools
Impressionist 2.0: A Plugin to Log Impressions in Rails Apps
インプレッション数を DB で保存してくれる gem。ボット無視してくれる。メンテナー募集中。
Action Cable クライアント用 CLI。
変更したコードの差分内の、テストされてないコードを検知してくれる gem。
JAMstack 方式の静的サイト用フレームワーク。Webpack に対応した Jekyll フォーク。
net-ssh 6.0: A Pure Ruby Implementation of the SSH2 Client Protocol
SSH クライアント用 gem。
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 を元にテストを生成せいてくれるテストフレームワーク。