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。コミットメッセージもほとんど絵文字。
Ruby Weekly #404: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/404rubyweekly.com
Highlights
RVM、rbenv でインストールできるようになった TruffleRuby。
Sprockets の脆弱性が判明。production で Rails アセットのコンパイルを有効にしている場合は secrets や環境変数の内容が漏れる恐れがある。
テスト高速化対策 2 つ。
- RSpec プロファイリングで重いテストを特定し、Factory でのレコード作成を減らす。
- MongoDB クエリの自前ロギングで不要なクエリと発行箇所を特定・排除。
Rails の需要は未だにあるという、米国募集案件を基にした調査結果。サンフランシスコでは断トツ 1 位。
Articles & Tutorials
- Elixir への警戒が好奇心に変わった経緯。
- Elixir を覚えた資料。
- 1 ヵ月後の印象。
Code & Tools
Rails の DateTime フォーマットまとめ。
メール送信前のプレビュー用 Rails Engine。
機械学習フレームワーク TesnorFlow を Ruby で書き直した gem。
一括 INSERT 用 gem。
PostgreSQL の SQL 高速実行用 gem。
RSpec 分散実行用 RRRSpec が最近更新された。
Spreadsheet Architect: Create Spreadsheets from Ruby Objects
ActiveRecord オブジェクトや PORO を Excel や CSV スプレッドシートに変換してくれる gem。
Ruby Weekly #403: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/403rubyweekly.com
Highlights
Arel を書きやすくしてくれる超シンプルな Wharel gem を実装した経緯。API は Sequel に似ているが、ソースは 31 行しかない!
Rust に挑戦した Rubyist がシンタックス、パッケージマネージャ、ORM など比較した話。
Adding Automated Speech Recognition for Phone Calls to Rails
Rails + Twilio で音声認識サービスを実装する手順。<Gather>
の TwiML でユーザの声を文字列に変換し、指定エンドポイントに転送。
Tutorials
Bundler プラグイン開発・適用手順。プラグインでできることは:
Rubocop 活用戦略。
- オススメの初期設定
- エディター連携
- autocorrect 駆使
- pre-commit フック設置
筆者の便利な Bundler ショートカット集。
bundle info
- gem をエディターで開く
bundle open
- gem 内ソース検索
graphql gem で Rails 上の GraphQL API 実装。
Types::QueryType
でデータ取得用 API 定義Types::MutationType
でデータ書き込み用 API 定義- graphql-preload gem で N+1 撲滅
- 開発環境のブラウザー上 UI でクエリ検証
Quick Tip: Use Beginnings and Ends of Strings in Regular Expressions
正規表現の文頭・文末は ^
$
ではなく \A
\z
を使う理由。
Code & Tools
ディレクトリなどのフレームワーク規約に拘束されないビュー用ライブラリ。テンプレートへのマッピング定義用 DSL でビュー描画メソッドを生やす。
管理画面用 Rails Engine。
Ruby Weekly #402: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/402rubyweekly.com
Highlights
Ruby 2.6.0-preview2 リリース。
- JIT 一部最適化
RubyVM::AST
新規追加Kernel#yield_self
のthen
アライアス- 無限 Range
(1..)
- など
Stripe 社が RubyKaigi で発表した、開発中の型チェックツール Sorbet。
筆者お気に入りの HTTP クライアント http.rb の機能紹介、Net::HTTP との比較。
ActiveRecord のメモリ肥大化は、データ型変換の遅延評価でオブジェクト作り過ぎているのが原因。
Ruby 2.6.0-preview2 ベンチマーク。Ruby 2.5.0 より 17.7% 高速化。
Tutorials
知られざる Ruby 標準ライブラリ。
- CLI 引数パース用
GetoptLong
、OptionParser
- 簡易 KVS
DBM
,GDBM
、SDBM
- オブジェクト永続化用
PStore
Observable
DRb
TSort
Math
Abbrev
Zlib
Ryan Davis 先生が自作 graphics gem でモンドリアン絵画風画像を生成してみた話。
Sidekiq ワーカーを書くルール。
- ワーカー内にロジック書くな。
- 実行時間の長いワーカー書くな。マスター・スレーブのワーカーに分けよう。
- ワーカーをディレクトリ別で整理しよう。
- スケジューリングは計画的に。
- 定期的に実行時間を監視し、必要に応じてリファクター。
条件分岐をコールバックで書く DSL 案。
redo
retry
next
の紹介と比較。
Concurrent Ruby の Concurrent::Future
で並行処理を実装した経験談。スレッド内例外が気付きにくくてバグの原因になったが、ラッパーで対応した。
Rails 5.2 Adds allow_other_host Option to redirect_back Method
Rails の redirect_back
メソッドに追加された allow_other_host
オプションで、外部サイトへの遷移が制御できるようになった。
Code & Tools
メソッドを非同期化(別スレッド実行)するマクロを提供してくれる gem。
ネスとされたアソシエーションから一括 pluck
してハッシュ返してくれる ActiveRecord 拡張 gem。select
での自前より高速!
Ruby Weekly #401: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/401rubyweekly.com
Highlights
3 ヶ月もの議論の上で yield_self
のアライアス then
が Ruby 2.6 にマージされた。
Ruby 2.5 に対応した JRuby 9.2.0.0 リリース。
テスト最適化ツールキット TestProf gem で Factory 軽量化。
- EventProf で Factory 処理の思いテストを特定。
- FactoryProf で階層の深い Factory、使用率の高い Factory を特定。flame graph でも可視化可能。
- FactoryDefault で階層の深い Factory のアソシエーションを再利用。
- AnyFixture で使用率の高い Factory を fixture に。
夏の Ruby カンファレンスまとめ。
- ウクライナ・キエフの RubyC
- ロシア・サンクトペテルブルクの Saint P Rubyconf
- 米国ニューヨークの GORUCO
- ケニア・ナイロビの RuyConf Kenya
- フランス・パリの Paris.rb
- 英国ブライトンの Brighton Ruby Conference
- 米国ナッシュビルの Southeast Ruby
- ポーランド・ヴロツワフの GrillRB
- オーストリア・ウィーンの EuRuKo
Tutorials
dry-transaction gem で鉄道指向プログラミングを実現。
Rails 4 コントローラテストのリクエスト発行メソッドの引数を Rails 5 のキーワード引数に移行する方法。
- rails-forward_compatible_controller_tests gem でキーワード引数を Rails 4 にバックポート。
rubocop -a --only Rails/HttpPositionalArguments
でキーワード引数に変換。- rails5_xhr_update gem で
xhr
メソッドを変換。
Active Record's .first and .last May Not Mean What You Think
Active Record の .first
.last
は created_at
順ではなく id
順だよー、という注意書き。
Hash のキーを指定する Enumerable#index_by
の次に、Hash の値を指定する Enumerable#index_with
が ActiveSupport に追加された。
Running Chrome Headless, Selenium and Capybara Inside GitLab CI and Docker
Docker コンテナ内に動かなくなった Chrome Headless テストを --no-sandbox
オプションで実行することで動くようにした話。
重くなりがちな Ruby での JSON 生成を、PostgreSQL に委任することで軽量化。
Quick Tip: Content-Type application/json by Default in Rails 5
Rails API の Content-Type
をデフォで application/json
にしてくれるミドルウェア。
Enumerable
Enumerator
で連結リストを実装してみた話。
The Case for 'before_validation' Callback: Complex State Normalization
オブエクトの状態を正規化するなら before_validation
使っていいよ、という主張。
Code & Tools
irb の SQL 出力をフォーマット、シンタックス・ハイライトしてくれる gem。
CLI 開発用 gem まとめ。