Ruby Weekly #411: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/411rubyweekly.com
Highlights
Ruby コードのロジックをフロー図に変換してくれる VisualizeRuby gem。
.new
メソッドをオーバーライドしてみた話。
#initialize
前にシングルトンクラスに対してモジュールをinclude
。#allocate
で子クラスにもinclude
されるように。
Discourse デバッグ中の Sam Saffron 先生が STDERR
モンキーパッチでエラー発生元を出力させた話。
Rails 5.2.1 リリース!
require 'bundler/inline'
と gemfile
ブロックだけで、単独ファイルの Ruby スクリプトでも Bundler 使えちゃう。
Hanami v1.3.0.beta1 リリース。v1.3.0 は 10 月リリース予定。
- RSpec がデフォになった
Articles & Tutorials
dry-rb でサービスクラス実装。
Dry::Initializer
で注入する依存性定義。Dry::Validation
で注入した依存性のルール定義。Dry::Monads
でSuccess
Failure
オブジェクトを返す。
Ruby 2.5 の Dir.each_child
Dir.children
に該当する Dir#each_child
Dir#children
インスタンスメソッドが Ruby 2.6 で登場。
partial パフォーマンス向上方法 2 つ。
JIT の紹介。
- JIT とは、Ruby 稼働中によく呼ばれるメソッドの特定・コンパイル
- メモリが倍ぐらいかかっちゃう
- コンパイル完了までは重い
- 今までの JIT 実装
- 許容範囲内の保守性・起動速度・メモリを誇る MJIT は、いよいよ Ruby 2.6 で登場。
テストの期待値は、ヘルパーなどの戻り値ではなく、プリミティブにしようという主張。
Code & Tools
RSpec テスト並列実行用 gem。ファイル単位だけではなく spec 単位でも分散できる。
ActiveRecord や Enumerable を年、月、日付、曜日、時間などでグループしてくれる gem。
Xcode::Install: A Ruby Tool to Install and Update Xcode Versions
XCode 最新バージョンをインストールしてくれる CLI 用 gem。
ターミナルのサイズを検知してくれる gem。
capybara-screenshot: Automatically Save Screen Shots When a Capybara Scenario Fails
Capybara テストが落ちたらスクショを保存してくれる gem。
Ruby Weekly #410: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/410rubyweekly.com
Highlights
指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる undercover gem の機能紹介。
乱数生成いろいろ。
Scala で新規アプリ開発してみた REA 社が最終的に関数型 Ruby にした話。
- 生産性向上を期待していたが、そこまで変わらなかった
- パフォーマンスは確かに Scala 圧勝
- 関数型プログラミングで保守性の改善を期待していたが、、ボイラープレートが多くて可読性暴落
Rails 5.2.1.rc1 リリース。Rails 5.2.1 は今日中にリリース予定。
Articles & Tutorials
Rails 5.2 Credentials 備忘録。
- config/credentials.yml.enc はコミットしても OK
- config/master.key はコミットするな!.gitignore、.dockerignore に入れること!
- CI ログには
RAILS_MASTER_KEY
環境変数を出すな! - キー変更手順
Ruby 2.6 で Exception#full_message
に追加されたオプション引数まとめ。
highlight
でエスケープ文字を消すorder
HTML メールの CSS をインライン style
属性として当ててくれる gem まとめ。
- roadie gem
- premailer-rails gem
- actionmailer_inline_css gem
- inline_styles_mailer gem
Ruby 2.6 Adds Option to Not Raise Exception for Integer and Float Methods
変換できない文字列を渡されたら ArgumentError
を投げる Integer()
、Float()
メソッドは、Ruby 2.6 以降、exception
オプション引数で例外を抑えれるようになる。
Docker で Rails Credentials を使う方法。
- 開発用コンテナ上で
rails credentials:edit
が実行できるための設定 - マスタキーの渡し方
Code & Tools
指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる gem。
簡易 i18n 用 gem。
Ruby Weekly #409: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/409rubyweekly.com
Highlights
認可用 Pundit gem は v2.0 リリース!
グローバルメソッドキャッシュいろいろ。
- メソッドの定義元クラス・モジュールをマッピングするキャッシュ。定義元を毎回評価するのにコストがかかるから。
RUBY_GLOBAL_METHOD_CACHE_SIZE
環境変数でキャッシュするメソッドの数を指定(デフォ 2048)。- メソッド数増やしても高速化は 2%〜3% しかない。
ダミーデータ生成用 gem。
Articles & Tutorials
fie フレームワークで ActiveJob の進捗をプログレスバーとして表示。
Sinatra アプリで pundit gem を使う手順。
ファイル名、行番号を返してくれる、Ruby 2.6 の Binding#source_location
。
コミット対象の .gemrc の中の認証トークンなどを隠す方法。
コアメソッドに可読性向上の拡張をしてくれた pretty_ruby gem。拡張はモンキーパッチではなく、安心安全な refinement で。
.map { |x| x.join('-') }
を.map(:join, '-')
に.map { |x| x.next.upcase }
を.map(:next >> :upcase)
に.reduce(['']) { |m, x| m << m.last + x }.drop(1)
を.scan
に#take
#drop
のマイナス引数対応
Rails 開発者必読の書籍 11 冊。
- Clean Code (和訳あり)
- 達人プログラマー (和訳あり)
- Ruby のしくみ (和訳あり)
- Eloquent Ruby (英語のみ)
- オブジェクト指向設計実践ガイド (和訳あり)
- リファクタリング:Rubyエディション (和訳あり)
- The Rails Way (英語のみ)
- Rebuilding Rails (英語のみ)
- Crafting Rails 4 Applications (英語のみ)
- Confident Ruby (英語のみ)
Code & Tools
CLI で四角い枠を描画してくれる gem。
FastJsonapi: A Super-Fast JSON:API Serializer for Ruby Objects
v1.3 がリリースされた高速 JSON:API シリアライズ用 gem。
カバー率測定で、修正したファイルの関連 RSpec テストを特定してくれる gem。
OpenStreetMap API クライアント gem。
Terraforming: Export Existing AWS Resources to Terraform Style
既存の AWS リソースを元に Terraform 用 .tf、.tfstate 設定を生成してくれる gem。
Ruby Weekly #408: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/408rubyweekly.com
Highlights
Rake タスク群の DRY 化は、メソッド抽出ではなく、Rake::DSL
のクラスを抽出しよう。
TruffleRuby Now Easily Installable via RVM, rbenv, and ruby-install
TruffleRuby は rvm、ruby-build、ruby-install でインストールしやすくなった。
Ruby 2.6 の String#split
にブロック引数を渡せるようになった。"hoge".split { }
と "hoge".split.each { }
は挙動的に変わらないが、ブロック引数のほうは Array
オブジェクトを作らないためパフォーマンス最適化に使える。
HTML → PDF 変換用 CLI ツール wkhtmltopdf の問題点と別案まとめ。
フラグメントキャッシュを活かしたビューを、turbolinks:load
イベント内 Ajax でユーザ毎にカスタマイズした話。
Articles & Tutorials
Forwardable
の #def_delegator
、#def_delegators
、#delegate
メソッド解説。
Rails 5.1 の ActionMailer::Base#params
ハッシュで Mailer をリファクターした話。default
、before_action
から params
ハッシュが呼べるようになったおかげで、アクションメソッドの中身をインスタンス変数の代入と #mail
呼び出しのみに減らせた。
case
文の使い方。
Code & Tools
メソッドが生やせる enum 定義用 gem。enum のダックタイプまでチェックしてくれる。(未安定)
10 ヶ国語対応のセンテンス単位セグメンテーション用 gem。
XmlMatchers: Validate Your XML API Responses against XSD XML Schemas
XML レスポンスを XSD で検証するための RSpec Matcher を提供してくれる gem。
graphql-ruby gem のフィールド別キャッシュ用プラグイン。
InSpec: An Auditing and Testing Framework for Infrastructure
Ruby Weekly #407: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/407rubyweekly.com
Highlights
Sonic Pi で音楽生成。
Cucumber が Capybara に一切勝らないという主張。
IO.read
、IO.foreach
の内部処理の解説。
Tutorials
Pry とその便利機能の紹介。
ls -G
またはfind-method
でメソッド検索show-source
show-doc
- .pryrc でお気に入りエディター設定
play -l
で指定行のコード実行show-models
show-routes
ActiveRecord メソッド紹介。
#pluck
#sum
#uniq
#update_all
bash でも zsh でも動くタブ補完スクリプトを Ruby で実装する方法。
Ruby 2.6 Raises an Exception if 'else' Is Used Inside 'begin..end' Block Without 'rescue'
rescue
を書かなかった下記ブロックは
begin else end
Ruby 2.6 以降、例外を投げるようになった。
ActiveRecord と Arel のメソッド紹介。
#where
連結でAND
#or
#find_by
#limit
#not
#order
#group
#includes
#joins
- Arel の
#matches
Code & Tools
システム稼動ステータス告知用 Rails アプリ。
PostgreSQL パフォーマンス監視ダッシュボード用 Rails engine。
Down: For Flexible Streaming and Downloading of Remote Files over HTTP
ファイルダウンロード用 gem。ストリーミングにも対応。
ActionController のレスポンスをキャッシュしてくれる gem。
Spreadsheet Architect: Create Excel, OpenDocument or CSV Spreadsheets from Ruby Objects
Ruby Weekly #406: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/406rubyweekly.com
Highlights
Graal JIT 上に JRuby を動かす手順とパフォーマンスの比較。
Ruby メモリ制御用環境変数の解説。おまけにアプリの最適な環境変数設定を記録してくれる EnvMem gem の紹介。
OSS Rails アプリ 12 個のパフォーマンスを調査した論文。ORM、DB 設計、アプリ設計などの問題点種別で集計。
条件達成判定メソッドをルールオブジェクトとして抽出しようと提案した Avdi Grimm 先生。
Shopify を支えているインフラの進化。
- 社内各システムの稼働率、SSL 証明書有効性、脆弱性有無など一望できる ServicesDB という Rails アプリ
- 巨大 MySQL DB → 出店者別シャード → 出店者別ポッド(個別 MySQL DB + Redis + Memcache + cron)
- jQuery + prototype.js → Batman.js の SPA → 生 JS → React + TypeScript
- GraphQL
- Buildkite で 10 万テスト並列実行
- ShipIt で継続的デプロイ
- オンラインメンテで 100 以上ものシャードを非同期で
db:migrate
Covered: An Experimental Coverage Tool Using Ruby 2.6 Features
カバー率計算用 gem。Ruby 2.6 の RubyVM::AST.parse
を駆使することで、今まで計算できなかったテンプレートまで計算できるようになった。
Articles & Tutorials
Rails API のドキュメンテーションを API Blueprint 形式で作成、実際の API との整合性を Dredd でテスト。
Ruby 2.6 の無限 Range
0..
。0..nil
でも書ける。
パフォーマンス的には、Fast JSON API + Oj が最も速い組み合わせ。
Visualizing and Optimizing JS Bundle Size in Rails/Webpacker Apps
webpack-bundle-analyzer で webpack の bundler の構成を可視化し、不要なものを webpack 設定から外す方法。
筆者のサービスオブジェクト関連ルール。
- public メソッドは 1 個のみ。SRP 守るように。
.new
は明示的に呼ぶこと。引数は DI のみ。- インスタンス変数を設定するのは
#initialize
のみ。 - private メソッドから他の private メソッドを呼ぶな。深い階層は読みづらい。
- ローカル変数は遠慮せず。
- ループではサービスオブジェクトのインスタンスを再利用しよう。
- 戻り値はバリューオブジェクト。
- モナド使おう。
- 必要に応じて、上記ルール破って良い。
カスタム例外の使いこなし方。
モダン Rails (Turbolinks + Stimulus + SJR)で脱 SPA。SPA の複雑さなどの問題点とそれぞれを解決するモダン Rails 機能。
Rails 5.2 の ActiveSupport::Cache::Store#write_multi
のおかげで複数キーを一括で書き込めるようになった。
非同期でメールを送信している Reflektive 社。メールの数が多くなると発送が遅くなってしまった DelayedJob から、高速かつ監視しやすい Sidekiq に移行した話。
Code & Tools
線形回帰用 gem。
Sym: A CLI and Ruby API to Encrypt and Decrypt Sensitive Data
secret などの暗号化・復号化 CLI 用 gem。
WIP: Promote Webpacker to the Default JavaScript Compiler for Rails 6
Webpacker をデフォにしようとしている DHH のプルリクエスト。
プロジェクト管理ツール Rails アプリ。
cache_with_locale: Automatically Add Locale to Your Cache Keys
Ruby Weekly #405: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/405rubyweekly.com
Highlights
Ruby 2.2 サポート終了。
Fie: A Rails-Centric Frontend Framework Running over WebSockets
ビューの状態を Rails のサーバ側で管理できるようにしてくれるフロントエンドフレームワーク。
Ruby でのパターンマッチングのデザイン・実装案。
Paperclip から Active Storage への移行をテストで保証した話。
- データ移行のテスト
- ファイルのローカル保存でのテスト
- S3 でのテスト
- データ移行 + ファイルのローカル保存でのテスト
- 本番データ移行のテスト
- staging 環境で外部 API 込みテスト
Ruby's Powerful Method Arguments and How To Use Them Correctly
通常引数、デフォルト引数、キーワード引数、可変引数の使い分け。
Articles & Tutorials
利用規約承諾 validation の実装案 5 つ(DB に承諾フラグを保存しないパターン)
- モデルに virtual attribute 追加
- 作成時のみモデルに virtual attribute 追加
- 特定 context のみモデルに virtual attribute 追加
- フォームオブジェクト
- モデルオブジェクトを
extend
Rails アプリの Stripe 定期支払い実装手順。
Rack::Attack で PHP 狙いボットを弾く方法。
Rails 開発用 Docker コンテナ作成手順。
Forwardable
の使い方と、delegate
マクロの自前実装方法。
Rails フラグメントキャッシング周りのコードリーディング。
Code & Tools
RecentRuby: CLI Tool to Check For A Recent and Secure Ruby Version
使用中 Ruby バージョンには最新セキュリティパッチが入っていないか検知してくれる CLI ツール gem。
dry-monads は安定したバージョン 1.0 がリリースされた。
Ruby で Rust が使える、そして Rust で Ruby が使えるようにしてくれる gem。ruru をフォークした次世代拡張。
BreezyPDFLite: A Ruby Client for a Self Hosted HTML to PDF Converter
Headless Chrome で HTML を PDF に変換してくれるマイクロサービス gem。
Redux らしき状態管理機能を実装した gem。
Ruby コアのメソッドを絵文字でアライアスを定義した gem。コミットメッセージもほとんど絵文字。