こんにちは、hachi8833です。
Ruby
Rubyのオブジェクトアロケーションを改善する方法
つっつきボイス:「翻訳記事でお世話になっているSchneemsさんの昨年の記事が面白そうなので拾ってみました」「ライフチェンジング!」
- オブジェクトアロケーションの片付けについて
- 片付け例1: Active Recordの
respond_to?
ロジック- パフォーマンスと統計的有意性
- 片付け例2: stringからtimeへの変換は時間がかかる
- 片付け例3: 極めて高速なキャッシュキー
同記事見出しより
「memory_profilerや自作のderailed_benchmarksを使って丁寧に測定しながらアロケーションを改善してるようですね」
# 同記事より
$ bundle exec derailed exec perf:objects
allocated memory by gem
-----------------------------------
227058 activesupport/lib
134366 codetriage/app
# ...
allocated memory by file
-----------------------------------
126489 …/code/rails/activesupport/lib/active_support/core_ext/string/output_safety.rb
49448 …/code/codetriage/app/views/layouts/_app.html.slim
49328 …/code/codetriage/app/views/layouts/application.html.slim
36097 …/code/rails/activemodel/lib/active_model/type/helpers/time_value.rb
25096 …/code/codetriage/app/views/pages/_repos_with_pagination.html.slim
24432 …/code/rails/activesupport/lib/active_support/core_ext/object/to_query.rb
23526 …/code/codetriage/.gem/ruby/2.5.3/gems/rack-mini-profiler-1.0.0/lib/patches/db/pg.rb
21912 …/code/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
18000 …/code/rails/activemodel/lib/active_model/attribute_set/builder.rb
15888 …/code/rails/activerecord/lib/active_record/result.rb
14610 …/code/rails/activesupport/lib/active_support/cache.rb
11109 …/code/codetriage/.gem/ruby/2.5.3/gems/rack-mini-profiler-1.0.0/lib/mini_profiler/storage/file_store.rb
9824 …/code/rails/actionpack/lib/abstract_controller/caching/fragments.rb
9360 …/.rubies/ruby-2.5.3/lib/ruby/2.5.0/logger.rb
8440 …/code/rails/activerecord/lib/active_record/attribute_methods.rb
8304 …/code/rails/activemodel/lib/active_model/attribute.rb
8160 …/code/rails/actionview/lib/action_view/renderer/partial_renderer.rb
8000 …/code/rails/activerecord/lib/active_record/integration.rb
7880 …/code/rails/actionview/lib/action_view/log_subscriber.rb
7478 …/code/rails/actionview/lib/action_view/helpers/tag_helper.rb
7096 …/code/rails/actionview/lib/action_view/renderer/partial_renderer/collection_caching.rb
# ...
「上のような大量の出力から以下のような行をいかに見つけて調べるかが腕の見せどころですね」「経験がものを言いそう」「この記事の改善でかなり速くなったものもあるみたいですね」
8440 …/code/rails/activerecord/lib/active_record/attribute_methods.rb
「アロケーション改善をステップバイステップで解説してくれているのがいい」「Rubyのbenchmarkライブラリは業務ロジックのようなコードをメインで書いていると普段は使わないけど、年に数回ぐらいは使わなければならなくなることもあります」「改善結果をRailsにプルリク投げたのかなと思ったけど、記事には見当たらないみたい…」
参考: library benchmark (Ruby 3.0.0 リファレンスマニュアル)
ruby/debugのバックトレース書式提案
つっつきボイス:「ko1さんのruby/debugに、st0012さんがバックトレースの書式案をいくつか提案していました」「こういうリッチな出力のデバッガーが標準で入ったらすごいかも」「入って欲しいですね」
# 同issueより: |でアラインする案
=>#0 foo.rb:21 | Foo#forth_call(num1=20, num2=10) #=> true
#1 foo.rb:8 | block{|ten=10|} in second_call
#2 foo.rb:15 | Foo#third_call_with_block(block=#<Proc:0x00007fc645174d10 foo.rb:7>)
#3 foo.rb:7 | Foo#second_call(num=20)
#4 foo.rb:3 | first_call
#5 foo.rb:24 | <main>
# 同issueより: 2行ずつ出力する案
| Foo#forth_call(num1=20, num2=10) #=> true
#1 foo.rb:8
| block{|ten=10|} in second_call
#2 foo.rb:15
| Foo#third_call_with_block(block=#<Proc:0x00007fc645174d10 foo.rb:7>)
#3 foo.rb:7
| Foo#second_call(num=20)
#4 foo.rb:3
| first_call
#5 foo.rb:24
| <main>
その後、ターミナルの幅に応じて書式を変えるかどうかも議論されています。
byebugとzeitwerkで問題(Hacklinesより)
つっつきボイス:「byebug gemがRailsのzeitwerkでうまく動かない問題が起きているのか」「issueも上がっていました↓」
「解決方法は『別のデバッガを使う』だそうです」「何と…」
参考: 定数の自動読み込みと再読み込み (Zeitwerk) - Railsガイド
「byebugは最近使ってないな〜」「byebugはコードの任意の場所にアタッチできるのが長所」
RubyKaigi Takeout 2021の開催日が決定
Save the date: RubyKaigi Takeout 2021 will happen on September 9..11. https://t.co/Fv1PlvmUHh #rubykaigi
— RubyKaigi (@rubykaigi) May 19, 2021
つっつきボイス:「今年のRubyKaigiはTakeoutと銘打って9/9(木)〜9/11(土)開催とサイトに掲載されました」「今年は参加するためにチケットを買う必要があるそうです」
「今回はオンライン参加のみでしょうか?」「オンライン開催はサイトにも書かれていますが、詳しくは今後の更新待ちですね」「プロポーザルの募集もこれからみたい」「チケットを買えば動画を後から視聴できるかどうかとか、そのあたりが知りたいですね」
「現地開催イベントに参加しなくなって久しいですけど、やっぱり一抹の寂しさがありますよね」「旅行の楽しさとか、会場でもらえるグッズとか」「地元の料理やお酒とか」「出かけたいな〜」
クラウド/コンテナ/インフラ/Serverless
AWS App Runner(StatusCode Weeklyより)
つっつきボイス:「新しく出たAWS App Runnerはまだ詳しく見てませんが、既存のサービスを組み合わせてテンプレート化した新サービスでしょうね: AWSのサービスはこういう形になっているものがよくあります」「AWSあるあるですね」
「App Runnerは、ロードバランサーやTLS証明書のような、コンテナでのサービス構築に必要なものがひととおり揃っている感じなのはよさそう」「GitHubリポジトリとApp Runnerを接続してgit push
で自動デプロイできるのか」「ECR Public↓のリポジトリも使えるんですね」
「これは便利そうですね」「もちろん現在でもECSやFargateなどを自分で組み合わせれば同じことができますけど、CI連携のパイプラインなども自分で書かないといけないとか、IAMアカウントの作成やらポリシーの設定やら、要するにAWSエンジニアが必要なんですよ」「あ、たしかに」「一度構築が完了すれば後は楽なんですけど、最初の構築が大変」
「App Runnerはそういう面倒な初期構築を詰め合わせにして楽にやれるようにしたということですね」「おそらくAWSに詳しくない人でもAWSエンジニアの手を煩わせずに構築できる方針で作っているんじゃないかな: 眺めた感じではRailsも普通に動かせそうに見えるので、今度使ってみよう」「お〜」「もしかするとApp Runnerは、自分でやる場合に比べて細かいコンフィグがやりにくいということはあるかもしれませんけどね」
GitHubで動画アップロード
つっつきボイス:「動画を貼れるのはありがたい」「GitHubも地道に改良を重ねてますね」「そういえばGitHubは、たしかCSVファイルをissueに添付できなかったんですよ」「え、知りませんでした」「Excelファイルなども以前貼れなかった覚えがあるので、おそらく情報漏えいにつながりそうな一部のファイル形式はアップロードできないようにしているんじゃないかなと想像してます」
参考: Issue およびプルリクエストのファイル添付 - GitHub Docs
JavaScript
domevents.dev
Introducing https://t.co/IKdFuccPhn
A visualiser to help people learn about the DOM Event system through exploration pic.twitter.com/eCrKhFwHkU
— Alex Reardon (@alexandereardon) May 17, 2021
つっつきボイス:「はてブでバズってました」「サイト上のDispatchをクリックすると、DOMイベントが伝搬する様子をビジュアル表示してくれるのね」「多少カスタマイズもできるみたい」「こういう動作はこれまで自分の頭の中にはありましたけど、ここまで作り込んだのは凄い」「こんなふうにしくみをビジュアライズするのは貴重ですね」
参考: Document Object Model - Wikipedia
CSS/HTML/フロントエンド/テスト/デザイン
IEサポート終了の足音
- 元記事: Internet Explorer は Microsoft Edge へ – Windows 10 の Internet Explorer 11 デスクトップアプリは 2022 年 6 月 15 日にサポート終了 - Windows Blog for Japan
- 元記事: News – Dropping support for Internet Explorer 11 – WordPress.org
つっつきボイス:「IEもついに終了に向かうか」「長かったですね」「上の記事はMicrosoft公式のもので、下はWordPressでのIEサポート打ち切り宣言でした」
「上の記事を見ると、EdgeブラウザにIEモードというのがあるんですって↓」「やっぱり欲しい人はいるんですね」
参考: Microsoft Edge の Internet Explorer モード - Office サポート
「実際IEを使うことが本当になくなった」「いいことです!」「大昔はMacにもIEがあったのに」「Mac版IE、覚えてます」
参考: Internet Explorer for Mac - Wikipedia
言語/ツール/OS/CPU
M1 Macのスケジューラ
動画や楽曲再生でMacのほうがWindowsより快適に再生されやすいというのはこのQoSのおかげでOS Xの頃から知っていたけど、それをチップレベルでやってるってことね。
AppleのM1チップはタスクの処理方法を工夫することでユーザーに「処理が速い」と思わせている – GIGAZINE https://t.co/D3VUx9FWN8
— masa寿司 (@masa_iwasaki) May 20, 2021
つっつきボイス:「この記事見た見た: macOSのスケジューラは前から優秀でしたけど、M1 Macではそれをチップレベルで制御している、スケジューラが優秀だと処理速度の体感が違ってくる、という話」「へ〜、知らなかった」「ちなみにQoSはもともとネットワーク方面の用語ですけど、この記事では操作上の応答性能のような感じで使われてますね」
「M1チップのマルチコアはヘテロジニアスな構成になっていて↓、図上半分のIcestormコア(Efficiency)は遅いけど消費電力が少ない、下半分のFirestormコア(Performance)は消費電力は多いけど高パフォーマンス、というように分かれています」「お〜」「タスクをどのコアに振り分けるかについてもスケジューラがチップレベルでさらに有効活用するようになった感じですね」
How M1 Macs feel faster than Intel models: it’s about QoS – The Eclectic Light Companyより
「macOSは前からスケジューラにそういう機能がちゃんとあるんですよ: それもあってmacOSはWindowsと比べるとトラブル時に完全にグリッチすることが少ないですね」「それ実感してます」「大昔のMac OS 9までは爆弾アイコンが頻発してましたけど」「そうそう、OS 9はひどかった」「NeXTSTEPベースのOS Xになってからはグリッチすることがめったになくなりましたね」
参考: What do we call the CPU or the process scheduling algorithm used in macOS? - Quora
参考: グリッチ - Wikipedia
参考: Mac OS 9 - Wikipedia
参考: NEXTSTEP - Wikipedia
「ヘテロジニアスな構成は、特定のタスクに特化したASICなんかで割と見かけるんですが、M1のような汎用CPUで使われるのはちょっと珍しく思えました」「なるほど」「ヘテロジニアスなASICだと命令セットに互換性がないのが普通ですが、M1のIcestormコアとFirestormコアはどちらも汎用プロセスを動かす命令を持っているんだろうと思いました」
中古PC価格
「実はおとといIntelチップのMacを買っちゃいまして」「ありゃ、M1にしなかったんですか?」「今のMacだとマイグレーションとかが遅すぎたので買い換えないとつらくって」
「ちなみに今は中古PCが高いので、今買うならむしろ新品の方がいいかもしれませんね」「おぉ?」「今はGPUの値段がすごく高いので、最近メルカリを見ていると中古コンピュータの値段がびっくりするぐらい上がっていますよ」「マジですか?」「自分が持ってる数世代前のGTX1070 16GB i7 6700あたりでメルカリを検索しただけで、自分が買ったときの半額ぐらいの7万円とか9万円とかで出てますよ」「ホントだ」「すげ〜」「いいGPUを積んでるPCなら中古でも高値で売れます」
後編は以上です。
バックナンバー(2021年度第1四半期)
週刊Railsウォッチ(20210524前編)Active Supportの知られてなさそうな機能5つ、RSpecの歴史、書籍『Practicing Rails』ほか
- 20210518後編 RubyのGCを深掘りする、Psych gemのbreaking change、11月のRubyConf 2021ほか
- 20210517前編 Bootstrap 5リリース、productionでSQLiteがwarning表示、rails-ujsの舞台裏ほか
- 20210511後編 AWS Lambda関数ハンドラをDSLで書けるyake gem、VPC Peeringが同一AZ転送量無料化ほか
- 20210511後編 AWS Lambda関数ハンドラをDSLで書けるyake gem、VPC Peeringが同一AZ転送量無料化ほか
- 20210510前編 属性メソッドをキャッシュして最適化、Railsのガバナンスに関する声明、bundle install高速化ほか
- 20210427後編 RactorでUDPサーバーを作る、JSONシリアライザalba gem、AppleのAirTagほか
- 20210420後編 ShopifyのJITコンパイラYJIT、PicoRuby、DynamoDBの3つの制約ほか
- 20210419前編 RailsのN+1クエリを定番以外の方法で修正する、GitLabのセキュリティ修正リリースほか
- 20210413後編 RubyMineのRBSサポートとCode With Me、GitHub ActionとDockerレイヤキャッシュほか
- 20210412前編 Active Record属性暗号化機能がRails 7にマージ、RailsNew.ioでrails newオプションを生成ほか
- 20210407後編 エイプリルフールのRuby構文プロポーザル、AWSのVPC Reachability Analyzerほか
- 20210406前編 GitHubが修正したRailsセッションハンドリングの競合、erb/haml/slimの速度比較ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
Ruby Weekly
Hacklines
StatusCode Weekly
The post 週刊Railsウォッチ(20210525後編)Rubyのオブジェクトアロケーション改善、RubyKaigi Takeout 2021開催日発表、AWS App Runnerほか first appeared on TechRacho.
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)