週刊Railsウォッチ(20170804)Rails 5.1.3と5.0.5が正式リリース、GitHubでローカライズ基盤サービス、正規表現で迷路を解くほか

こんにちは、hachi8833です。4年使ったMacbook Proのバッテリーがそろそろ天に召されそうです。 8月最初のウォッチ、行ってみましょう。 お知らせ: 来週は週刊Railsウォッチをお休みいたします。次回は8/18(金曜日)の予定です。 Rails 5.0.5と5.1.3が立て続けに正式リリース(Rails公式ニュースより) Rails 5.1.3 released Rails 5.0.5 and 5.1.3.rc3 released 月曜に先に5.0.5がリリースされ、今朝がた5.1.3もリリースされました。とりあえず5.1.3で記念写真↓。 Changelog v5.1.2…v5.1.3 v5.0.4…v5.0.5 Rails: 今週の改修(Rails公式ニュースより) 修正: クエリに巨大な数値がある場合に結果が正しくなかった問題を修正 PR: #30000 All of queries should return correct result even if including large number PRキリ番ゲットはkamipoさんでした。 # activerecord/test/cases/finder_test.rb より + def test_exists_with_large_number + assert_equal true, Topic.where(id: [1, 9223372036854775808]).exists? + assert_equal true, Topic.where(id: 1..9223372036854775808).exists? + assert_equal true, Topic.where(id: 1).or(Topic.where(id: 9223372036854775808)).exists? + assert_equal true, Topic.where.not(id: 9223372036854775808).exists? + end つっつきボイス: 「DBMSの限界値をこんなふうに超えるケースは扱ったことなかったけど、挙動は確かにバグ」「idをすごい勢いで消費するシステムとかだと踏むかも: そういうシステムではid生成そのものがボトルネックになるので自前でid発番することが多そう」 「TwitterのSnowFlakeを思い出したでござる」 「id生成がボトルネックというのは?」「id生成はアトミックだから必ずロックがかかるでしょ」 そこからサーバー間の同期の話題になりました。 「システムによっては、複数サーバー間でデータ生成や順序処理を一意にするなどの目的で、サーバーごとに原子時計持たせることがある」「おー、サーバー間の同期や通信のコストを下げられるのか」 おまけ 2014年に製造された世界初の原子腕時計は、60万円投資すると10個限定でもらえるそうですが、あっというまにはけたそうです。手作り感溢れてます。 リファクタリング: Arelでbindのparamsを扱えるよう修正 commit: 213796: Refactor Active Record to let Arel manage bind params かなり大規模にリファクタリングしてます。 # activerecord/lib/active_record/connection_adapters/abstract_adapter.rb def case_sensitive_comparison(table, attribute, column, value) # :nodoc: – table[attribute].eq(value) + table[attribute].eq(Arel::Nodes::BindParam.new(value)) end def case_insensitive_comparison(table, attribute, column, value) # :nodoc: if can_perform_case_insensitive_comparison_for?(column) – table[attribute].lower.eq(table.lower(value)) + table[attribute].lower.eq(table.lower(Arel::Nodes::BindParam.new(value))) else – table[attribute].eq(value) + table[attribute].eq(Arel::Nodes::BindParam.new(value)) end end つっつきボイス: 「変更量ハンパない」「テスト通ればOKとはいっても、コアにこれだけ手を入れるってスゴイナー」 「ASTってやっぱり抽象構文木(abstruct syntax tree)か」「parserとかprepared statementのSQL生成部分とかの設計し直しまでやってるのかな」「記事数多いので次いきましょう」 ActiveSupport::Durationの除算関連の変更 「除算の余り」と「除算」の2つのコミットをまとめました。moduloといえば数学用語の「剰余とか法」ですね。 新機能: ActiveSupport::Durationでmodulo操作をサポート commit: a54e13: Add missing support for modulo operations on durations # activesupport/CHANGELOG.md より # 変更前 5.minutes % 2.minutes #=> 60 # 変更後 5.minutes % 2.minutes #=> 1 minute テストコードを見ると、分母と分子の単位(単位なしを含む)に応じて余りの単位をよしなに設定してくれるようです。 # activesupport/test/core_ext/duration_test.rb より抜粋 + def test_modulo + assert_equal 1.minute, 5.minutes % 120 + assert_equal 1.minute, 5.minutes … Continue reading 週刊Railsウォッチ(20170804)Rails 5.1.3と5.0.5が正式リリース、GitHubでローカライズ基盤サービス、正規表現で迷路を解くほか