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 まとめ。
Ruby Weekly #400: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/400rubyweekly.com
Highlights
Rails ウェブパフォーマンス向上まとめ。
- フラグメントキャッシュ
- カウンターキャッシュ
- ページキャッシュ
etag
、last_modified
HTTP ヘッダー- ActiveStorage
- HTTP/2、HTTP/2 PUSH
- gzip ではなく brotli で圧縮
- Heroku ではなく独自サーバ
dns-prefetch
、prefetch
、prerender
、preconnect
kaminari、will_paginate より遥かに軽いページネーション gem。
ビルダーパターンでチェーン可能・イミュータブルな API クライアントを実装した話。
Aaron Patterson 先生が Github の OOBGC を外したことで CPU 時間を 10% 短縮できた。
minitest、sexp_processor、ruby_parser、hoe、flay、flog の作成者 Ryan Davis が Patreon 支援者募集中。
RubyGems 2.7.7 リリース。
依存性の注入のメリットをうまく言葉にできなかった筆者が Test Double 社員の意見を集めた。
- 依存関係が明確になる
- モックだとテストが Arrange・Assert・Act パターンから外れちゃう
- モックはデバッグしづらい
- Sandi Metz の本読め
Tutorials
Ruby 2.4 以前では、メソッドのブロック引数を内部メソッドに渡すたびに Proc
オブジェクトに変換していた。
Ruby 2.5 では、Proc
オブジェクトへの変換が遅延評価になり、高速化に繋がった。
Root 社の、極端に状態を持たせていない、準関数型に近い Rails アプリの話。
ActiveStorage をサポートするようになった Heroku の FFmpeg セキュリティ対策。
- FFmpeg は脆弱性が頻繁に報告されるが、メンテナーが迅速に対応してくれている。
- Ubuntu のパッケージマネージャは FFmpeg の最新版に追いついていないため、Heroku 独自バイナリーをコンパイルすることに。
- ActiveStorage に使われていない機能をコンパイルから外すことで、バイナリー軽量化できた。
Code & Tools
Introducing Stealth, a Framework for Conversational Voice and Chatbots
RoleCore: A Rails Engine Providing Role-Based Access Control
Ruby Weekly #399: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/399rubyweekly.com
Highlights
Ruby 2.6 の exception
キーワード引数で例外を投げるかどうか指定できるようになる。
deprecated ソースコードを parser gem で AST に変換して書き換える話。
ActiveStorage がリリースされたため、Paperclip gem が deprecated になった。
Gotham Ruby Conf 2018: A One Day Ruby Event in NYC on June 16
ニューヨークの GORUCO がいよいよ。
Passenger の development モードのエラー画面のデザインを改善した話。
Tutorials
Rack::Attack ミドルウェアで DDoS 防止。
筆者自慢の初期 CI/CD パイプライン。
push するたびに
- test 環境コンテナにデプロイされる
- staging 環境で migration が実行される
- テストが実行される
テストが通ったコミットを master ブランチに push するたびに
- staging 環境コンテナにデプロイされる
- production 環境 DB がバックアップされ、staging 環境でダンプされる
- staging 環境で migration が実行される
テストが通ったタグを push するたびに
- production 環境コンテナにデプロイされる
- production 環境 DB がバックアップされる
- production 環境で migration が実行される
attr_encrypted gem で DB 内メアドを暗号化し、blind_index gem で検索可能に。
Rails アプリ、ブログの GDPR 対策。
- Nginx ログロテ、IP 匿名化
- Rails ログ匿名化
- Google Analytics IP 匿名化
- 利用規約、承諾チェックボックス追加
- 既存ユーザに利用規約承諾メール送信
How to Create Charts in a Rails App with Just One Line of Code
chartable gem で .analytics
取得用メソッドを ActiveRecord モデルに生やし、chartkick gem で可視化。
Code & Tools
paranoia gem のメンテナーが新しく作った ActiveRecord 論理削除用 gem。
acts_as_paranoid、paranoia gem よりは魔術が少ない:
default_scope
を生やさない#delete
#destroy
を上書きせず、新しいインタフェースを生やすdependent: :destroy
で関連レコードを削除しない
aws_public_ips: Fetch All Public IP Addresses Tied to Your AWS Account
Ruby Weekly #396: 日本語サマリー
職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/396rubyweekly.com
Highlights
Top 10 Errors From 1000+ Rails Projects (and How to Avoid Them)
Rails アプリのよくあるエラーと解消方法まとめ。
上限無限 Range
(例:3..Float::INFINITY
)は Ruby 2.6 以降、3..
で書けるようになる。
配列の最後までの #slice
でも使える: array[3..]
RailsConf で発表された Rails 6 方針スライド。
- スケーリング
- テスト並列実行
- 複数 DB
Articles & Tutorials
Direct, Secure Rails Client-Side File Uploads to AWS S3 Buckets
Fog gem で AWS S3 にファイルをアップロードする手順。
nil
などのデフォ引数をシングルトンにする話。
Rails の Cache Store まとめ。
Kickstarter 社の投資者宛てコンテンツ配信プラットフォーム Drip を Event Sourcing で実装してみた話。
Jekyll 記事内コードをテストしてくれる jekyll-include_snippet プラグイン紹介。
Rails 5.2 の Date#prev_occurring
、Date#next_occurring
で前後の指定した曜日の日付取得。
Code & Tools
HTML・XML パース用 Nokogiri gem の API をまとめたチートシート。
Rails 5.2 対応になった dotenv gem。
バリューオブジェクト ⇄ ActiveRecord マッピング用 gem。ActiveRecord の composed_of
の冗長な configuration を convention で省いてくれたのが売り。
テスト DB をまっさらにしてくれる gem がここ数週間整理されてきた。