Ruby Weekly #391: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/391rubyweekly.com
Highlights
Rails 5.2.0 RC2 新機能まとめ
- Active Storage
- Redis Cache Store
- HTTP/2 Early Hints
- Bootsnap
- CSP 用 DSL
- Credentials
Discourse がゼロダウンタイムで DB スキーム変更を実現できた秘密。
schema_migrations
テーブルにgit_version
などのカラム追加- カラム・テーブル削除は migration ではなく seed で
- migration でカラム・テーブル削除ができないように pg gem をパッチ
デプロイ手順は
ブラウザー検知 gem。
新規 Rails アプリ作成用テンプレート。
News
RailsConf 2018 スケジュール公開。
Tutorial
DB 内 i18n データ永続化用定番 gem Globalize では、各モデルに紐付いた モデル名_translations
テーブルで i18n データを保存。しかし取得時には、JOIN
する負荷がかかってしまう。
Mobility gem の JSON・JSONB ストラテジーだと、モデルと同一テーブルの JSON 型カラムに保存することで、JOIN
なしで取得できる。
なお Globalize 流ストラテジーなども完備している Mobility は多様性・拡張性抜群。
Pwned Passwords API を叩くことで、パスワードが流出しているかどうかの validation を実装する手順。
gem の中身を確認する方法 2 つ。
- リポジトリを
git clone
。 bundle show
のパスにcd
。
StringIO
を注入することで、ログ出力をテストする手順。
Story
6 年間の職歴を経て、Rails 2.3 → Clojure → Java 8 → Rails 4.2 で開発した経験談。
- Rails 2.3 のモノリスを 40% ぐらいリファクター・改善してから Clojure 屋さんに転職。
- Clojure は高速 + エンジニアの生産性が良かったが、エンジニアの採用が難しくて事業がなかなか成長できなかった。
- 意外とリーンな Java 屋さんに転職して、エンジニアの生産性も意外と良かった。何でもかんでも POJO 作るのがちょっとめんどくさかったのにもかかわらず。静的言語のおかげで大規模リファクターができた。
- Rails 4.2 は使い勝手が 2.3 とはそんなに変わらない割には、アップグレードが辛い。後方互換性の優れている Clojure・Java に比べて。
- いろんな言語の経験はエンジニアリング・マネージャには必須だが、シニア・エンジニア募集案件に応募するには特定言語の専門知識が足りない。
Code
Rails-DB-Interactive: Interactive Database Diagrams for Rails
Rails アプリのモデル図を生成する JavaScript アプリ。
Ruby Weekly #390: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/390rubyweekly.com
Highlights
bundle update
の謎メッセージ Bundler attempted to update 〇〇〇 but its version stayed the same
を調べて解消した話。gem の古いバージョンに依存している gem があることが原因だが、どの gem なのかは bundler だけでは知り得ない。bundler-stats gem で邪魔な gem を特定し、両 gem 一気に bundle update
することで解決。この機能はこれから bundle show
に入る可能性があるらしい。
Ruby に対応するように、AWS Lambda や Azure Functions などの FaaS への請願。
yield_self
を活かすことで、複雑な ActiveRecord クエリオブジェクトをリファクターした ThoughtBot。
25 年もの Ruby へのコミットを可視化した動画。
News
テストの並列実行を Rails 6.0 に追加したプルリクエスト。デフォールトでは、プロセスのフォークで実現しているが、スレッドでの実行も任意で選べる。
Coinbase OSS 基金は今月 Ruby 関連プロジェクトに献金することになった。補助対象プロジェクトは Ruby Together、RSpec、Rubocop。
Tutorial
Ruby 2.5 の Exception#full_message
でフォーマットされた例外とバックとレースを取得できるようになった。
プロキシデザパタは昔、Ruby では method_missing
で実装されていたが、デメリットとしては:
- プロキシオブジェクトを呼ぶ手間があった
- パフォーマンスのコストがかかった
- クラスメソッドまで対応するには別のプロキシオブジェクトが必要になった
- どんなメソッド呼び出しでも拾ってしまい、責務の範囲が広すぎた
Ruby 2.0 以降は prepend
で上記問題点解消。
Run Capybara Feature Specs with Selenium and Headless Chrome
CircleCI 2.0 で Chrome Headless + Selenium の Capybara feature spec を実行する手順。おまけに並列実行の CircleCI 設定。
TLSv1.0、v1.1 が非対応になったせいで、バージョンアップを迫られてきた Ruby 1.9 ユーザだが、それでもバージョンアップがまだできないというユーザ向け一時しのぎの手順。
Tools
Test Kitchen: An Integration Tool for Testing Infrastructure Code
インフラコードのテスト用のテストフレームワーク(ServerSpec など)や実行先(Vagrant、Docker、EC2、GCE、DigitalOcean など)を管理するツール。
Code
Rust で Pathname を高速化した FasterPath gem が最近更新されている。
OAuth 2 用 Rails Engine。
Ruby Weekly #389: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/389rubyweekly.com
Highlights
メソッドレベルのプロファイリング用 gem Timeasure を実装した経緯。
- NewRelic より柔軟なインタフェース提供
- ruby-prof gem より軽くて本番環境でも使える
Ruby 2.5 のバックトレース出力順のデモ。
絞り込み条件用 URL 引数を scope などにマッピングしてくれる gem。
News
プログラミング言語人気ランキング TIOBE で Ruby が 12 位から 9 位に上昇。
今年前半の Ruby カンファレンスまとめ。
Tutorial
Ruby のメモリ関連用語解説。
TensorFlow ライブラリの機械学習で CAPTCHA を突破した話。
Rails 4.2→5.0 バージョンアップ時の懸念点まとめ。
Opinion
Ryan Bigg 先生が Hanami を試した感想。
- Repository パターンのおかげで、モデル層関心の分離ができるのが良い
- Action 別クラスのおかげで、コントローラ層関心の分離ができるのが良い(params の validation とか)
- View クラスのおかげで、ヘルパーがグローバルで公開されないのが良い
Tools
依存している gem のライセンス管理用 gem。
Rails サーバ側パフォーマンス計測データをレスポンスのヘッダーに埋め込み、Chrome コンソールで確認できるようにしてくれる gem。
Code
高スループット・低レイテンシーのログ処理用 gem。NewRelic、Sentry、HoneyBadger、ElasticSearch などのログ出力先に対応。
honeypot 型 captcha 用 gem。非表示チェックボックスでボット排除。
フィーチャフラグ定番 gem の最新リリース。
Ruby Weekly #388: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
http://rubyweekly.com/issues/388rubyweekly.com
Highlights
# frozen_string_literal: true
でファイル内文字列を全て freeze
することで無駄な String
オブジェクト生成を減らす。
モデルデータの複製サービスクラス定義用 gem。polymorphic アソシーエションまで対応できてる。
セキュリティ脆弱性が発覚された TLSv1.0、v1.1 を deprecate、無効化した RubyGems。Bundler などはバージョンによって RubyGems サーバに接続できなくなる。バージョンアップが必要かどうかチェックしてくれるコマンドは curl -sL https://git.io/vQhWq | ruby
Tutorial
CLI オプションをパースしてくれる Ruby コアの OptionParser
。
ActiveRecord.no_touching
ブロックで touch
(updated_at
更新)しないように。バッチ処理などで DB を叩く回数が減らせる。
form_with
がデフォで Ajax となった Rails 5.1 の UJS。
Code
ActiveRecord データの i18n 用 gem。
10 数ユーティリティで画像ファイル最適化 gem。
Ruby Weekly #378: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
malloc のせいで Sidekiq プロセスが 1 GB にまで膨れ上がっちゃう問題。メモリのフラグメンテーションを起してるらしい。解決案は
ブロックの中でもブロック外変数を読み書きできるようにしてくれる binding
の解説。
筆者が class << self
でのクラスメソッド定義を好む理由。
- シングルトンクラスのスコープ内での定義だから。
def self.method
はスコープ外からの定義。 private
protected
領域が使える。def self.method
はprivate_class_method
しかない。
News
RubyMine 2017.3 リリース。
- パフォーマンス向上
- 外部キーワードに飛べるようになった
- Code Insight 改善
- ネストしたプロジェクトへのサポート改善
- WSL(Windows 上 Bash)対応
- メソッド抽出の
private
public
protected
指定可能 - エディター内
rubocop --auto-correct
- Puppet テンプレート同梱
- API テスト用エディター内 REST クライアント
- JavaScript、CSS、Vue.js コード補完改善
git rebase -i
- SQL 生成ツール
99 Bottles of OOP 本は来週まで 40% 割引!
Julia Evans Taking a Sabbatical to Work on Ruby Profiling Tools
Unix を題にした zine で有名な Julia Evans が Ruby プロファイリングツール開発のため 3 ヶ月休職。
Tutorial
- parser gem で Ruby コードを AST に変換。
- REXML または nokogiri で AST を XML に変換。AST 内オブジェクト ID を XML タグの属性として書き込む。
- XPath で書き換えたいコードを指定し、該当タグのオブジェクト ID で該当 AST ノードを取得。
- AST ノードを買い換える。
proc
・lambda
・ブロックいろいろ。
proc
・lambda
内return
の挙動proc
・lambda
引数の数チェック&
演算子でブロックをproc
に変換
Builder gem + Tilt で XML テンプレートエンジンを実装した話。
Rails アプリの elasticsearch 検索機能実装手順。elasticsearch 内インデックスは Kibana で確認。
Heroku 上での稼働中 Rails アプリのデプロイ時に、ワーカープロセスをグレースフルに切り替えるための Procfile 設定。
Opinion
細胞の再生のように、メソッドを小さいコンポーネント(純粋関数)として書き、変更が必要になったら修正ではなく一から書き直せば、長生きするシステムが生まれるのでは、と提案した Chad Fowler 先生の RubyConf 2017 トーク。このルールを守った開発は
- 再利用性にどんな影響を与える?
- 複雑さにどんな影響を与える?
- テストにどんな影響を与える?
- 命名にどんな影響を与える?
といった疑問を述べた記事。(答えは出してなく、あくまで質問を挙げているだけ)
半年前に Ruby を教えるのをやめた Coding Dojo で騒ぎになった Ruby コミュニティ。その一方で Ruby を教え続けている Flatiron School。学校にとって一番大事なのは、卒業生の雇用先の需要ではなく、いかに学生がプログラミングのことを好きにさせること。Ruby がそれに最適だと。
Code
Passwordless: Add Password-Free Authentication to a Rails App
メール本文内リンクでのログイン用 gem。
rack-contrib 2.0: Now Supports (Only) Rack 2.x and Ruby 2.2+
rack-contrib 2.0.0 リリース。
- Rack 1.x サポート終了
- Ruby 2.1 以前サポート終了
Ruby Weekly #377: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Rails 5.2.0 βリリース。
- ActiveStorage でファイルアップロード
- Redis Cache Store
- HTTP/2 Early Hints 対応
- Bootsnap でブート時間半減
- Content Security Policy 定義用 DSL
- secrets を deprecate、Credentials 新規追加
- Webpacker 3.0
Rails ヘルパー使わずに素 JavaScript でクライアント側 ActionCable を実装してみた Thoughtbot 社。
'String#delete_prefix' and 'delete_suffix' Methods in Ruby 2.5
文末文字削除用 String#chomp
は Ruby 2.5 から #delete_suffix
アライアス追加。さらに文頭の文字削除用 #delete_prefix
が新規追加。
Heroku 上 Rails アプリをゼロダウンタイムでドメイン移行。
- 複数ドメイン
- DNS ホストで ALIAS 設定
heroku domain:add
- 複数 SSL 証明書
- SAN 証明書発行
heroku certs:add
- rack-rewrite gem のミドルウェアで
- 外部 API コールバック用エンドポイント
- callbacks サブドメに移行
- 旧コールバックを rewrite
- Evil Martians 自家製 RackRewriteConfig で環境別設定(原文コード参照)
コントローラテストを deprecate した Rails 5 に備えて、ロジックをモデルなどのオブジェクトに抽出するメリット。例に挙げたのは、パラメータ有無で挙動が変わったコントローラのビジネスロジック。
RubyConf 2017 1 日目の振り返り。
- Matz のキーノート
- 初回参加者が意外と多くて Ruby の未来が有望的
- なるべく互換性を保ちながらリリースしていく
- コミュニティを交えて相談していきたい
- There Are No Rules in Ruby (Max Jacobson)
- Ruby の柔軟性のデメリット
- Finding Beauty in the Mundane (Megan Tiu)
- しんどい仕事でも接し方によって楽しめる方法
- Augmenting Human Decision Making with Data Science (Kelsey Pedersen)
- Stitch Fix 社が活用している機械学習
- Growing Old (Chad Fowler)
- レガシーだからって悪いとは限らない
News
RubyGems 2.7.3 リリース。
最もダウンロードされてる gem トップ 10。
- bundler
- multi_json
- rake
- rack
- json
- mime-types
- activesupport
- thor
- i18n
- diff-lcs
Rails は 22 位。
Tutorial
Heroku の無料 Dyno で Sidekiq を動かすための Puma 設定。
Rails API に OPTIONS の HTTP メソッド対応を追加した Kollegorna 社。結果的に rails_http_options gem も作った。
NewRelic などのメソッド計測コードが散らばらないように prepend
する方法。
- migration で DB コメント追加
- ドキュメンテーション生成などのために DB からコメントを読み込む
- コメントを取得する生 SQL
PostgreSQL の UUID を Rails アプリで採用する手順。
Rails アプリの Docker イメージに Yarn を追加する手順。
Bitcoin を解説した Fabio Akita 先生。
Code
ElasticNotifier: Send Error Notifications to an Elasticsearch Server
エラー通知を ElasticSearch サーバに送ってくれる ElasticNotifier gem。
Ruby Weekly #376: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Pathname
を Rust で書き換えて 3 割高速化した FasterPath gem 作成者が Rust に挑んだのを振り返った。
- 最初は FFI 経由で実装してみたが、メモリを解放するコストなどあって、結局ピュア Rust 実装のほうが効果的だった。
- Rust の Ruby 言語拡張 ruru と Helix はあるが、より安定な ruru にした。
- Rust はまだ日が浅くて、ruru も Helix も 1.0 になってないので要注意。
Amazon API Gateway では Ruby SDK(API クライアント gem)を生成できるようになった!AWS IAM 認証込み(カスタム認証も可)。
Rails のセッションデータをクッキーで保存している場合、ブラウザのサイズ上限を超えたら
- モダンなブラウザではクッキーがまるごと破棄され、ログイン状態を維持できないバグ発生。
- IE や iOS の Safari では Secure、HttpOnly、SameSite などのディレクティブが切り捨てられ、XSS 脆弱性にもなりかねない。
Rails、Rack はサイズをチェックしてくれるが、ディレクティブまでは考慮できてない。筆者が暫定対応として Rack::Protection::MaximumCookie gem 作成。
依存 gem と JavaScript ライブラリの脆弱性をアラートしてくれるようになった GitHub。
News
Rubyhack カンファレンスの CFP 開始。
Tutorial
.
..
を除外した ls -a
の結果を返してくれる Ruby 2.5 の Dir.children
Dir.each_child
。
リリース前の ActiveStorage で画像アップロード機能を実装する手順。
カスタムフォーム作成用 FormAPI は不特定多数のフィールドを PostgreSQL の jsonb カラムで保存。フィールド数が多いと重くなってたが、JSON Patch 標準で差分だけサーバに送るようにした。差分を当てるには hana gem 採用。
How to Receive & Respond to Text Messages with Hanami & Twilio
Hanami + Twilio で SMS 送受信アプリ実装手順。
Migrating 'has_and_belongs_to_many' Associations to Rails 4+
Rails 4 HABTM 移行した話。HABTM テーブルのデフォ命名が変わったため、join_table:
オプションで指定する必要があったりする。新規命名に従ってないテーブルを検知してくれるスクリプトも作った。
Docker + Rails + Headless Chrome システムテストを実装した話。
google_translate_diff: Using Google's Translate API More Efficiently
Google 翻訳 API 料金節約施策を google_translate_diff gem としてリリースした Evil Martians 社。原文をテキストと HTML マークアップに分解して、翻訳済みテキストをキャッシュすることで、Google 翻訳 API の二重呼び出しを塞ぐ。自社費用は 6 割減。
Story
RubyTapas 売上低迷と健康保険の負担で RubyConf 2017 に参加できなくなるところだった Avdi Grimm 先生。結局コミュニティからの寄付で参加した。感動と感謝の気持を記事で書き落とした。
Tools
dbmgr: CLI Tool to Back Up, Restore, and Provision Dev Databases
開発環境 DB バックアップ・復元用 CLI ツール。
Code
ActiveRecord スキーマ取得用 gem。