Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20210525後編)Rubyのオブジェクトアロケーション改善、RubyKaigi Takeout 2021開催日発表、AWS App Runnerほか

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗Ruby

🔗 Rubyのオブジェクトアロケーションを改善する方法


つっつきボイス:「翻訳記事でお世話になっているSchneemsさんの昨年の記事が面白そうなので拾ってみました」「ライフチェンジング!」

  • オブジェクトアロケーションの片付けについて
  • 片付け例1: Active Recordのrespond_to?ロジック
  • パフォーマンスと統計的有意性
  • 片付け例2: stringからtimeへの変換は時間がかかる
  • 片付け例3: 極めて高速なキャッシュキー
    同記事見出しより

「memory_profilerや自作のderailed_benchmarksを使って丁寧に測定しながらアロケーションを改善してるようですね」

SamSaffron/memory_profiler - GitHub

schneems/derailed_benchmarks - GitHub

# 同記事より
$ 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のバックトレース書式提案

ruby/debug - GitHub


つっつきボイス:「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も上がっていました↓」

「解決方法は『別のデバッガを使う』だそうです」「何と…」

deivid-rodriguez/byebug - GitHub

参考: 定数の自動読み込みと再読み込み (Zeitwerk) - Railsガイド

「byebugは最近使ってないな〜」「byebugはコードの任意の場所にアタッチできるのが長所」

🔗 RubyKaigi Takeout 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↓のリポジトリも使えるんですね」

参考: ECR Public Gallery

「これは便利そうですね」「もちろん現在でもECSやFargateなどを自分で組み合わせれば同じことができますけど、CI連携のパイプラインなども自分で書かないといけないとか、IAMアカウントの作成やらポリシーの設定やら、要するにAWSエンジニアが必要なんですよ」「あ、たしかに」「一度構築が完了すれば後は楽なんですけど、最初の構築が大変」

「App Runnerはそういう面倒な初期構築を詰め合わせにして楽にやれるようにしたということですね」「おそらくAWSに詳しくない人でもAWSエンジニアの手を煩わせずに構築できる方針で作っているんじゃないかな: 眺めた感じではRailsも普通に動かせそうに見えるので、今度使ってみよう」「お〜」「もしかするとApp Runnerは、自分でやる場合に比べて細かいコンフィグがやりにくいということはあるかもしれませんけどね」

🔗 GitHubで動画アップロード


つっつきボイス:「動画を貼れるのはありがたい」「GitHubも地道に改良を重ねてますね」「そういえばGitHubは、たしかCSVファイルをissueに添付できなかったんですよ」「え、知りませんでした」「Excelファイルなども以前貼れなかった覚えがあるので、おそらく情報漏えいにつながりそうな一部のファイル形式はアップロードできないようにしているんじゃないかなと想像してます」

参考: Issue およびプルリクエストのファイル添付 - GitHub Docs

🔗JavaScript

🔗 domevents.dev


つっつきボイス:「はてブでバズってました」「サイト上のDispatchをクリックすると、DOMイベントが伝搬する様子をビジュアル表示してくれるのね」「多少カスタマイズもできるみたい」「こういう動作はこれまで自分の頭の中にはありましたけど、ここまで作り込んだのは凄い」「こんなふうにしくみをビジュアライズするのは貴重ですね👍」

参考: Document Object Model - Wikipedia

🔗CSS/HTML/フロントエンド/テスト/デザイン

🔗 IEサポート終了の足音


つっつきボイス:「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のスケジューラ


つっつきボイス:「この記事見た見た: macOSのスケジューラは前から優秀でしたけど、M1 Macではそれをチップレベルで制御している、スケジューラが優秀だと処理速度の体感が違ってくる、という話」「へ〜、知らなかった」「ちなみにQoSはもともとネットワーク方面の用語ですけど、この記事では操作上の応答性能のような感じで使われてますね」

参考: QoS(Quality of Service)とは

「M1チップのマルチコアはヘテロジニアスな構成になっていて↓、図上半分のIcestormコア(Efficiency)は遅いけど消費電力が少ない、下半分のFirestormコア(Performance)は消費電力は多いけど高パフォーマンス、というように分かれています」「お〜」「タスクをどのコアに振り分けるかについてもスケジューラがチップレベルでさらに有効活用するようになった感じですね」


How M1 Macs feel faster than Intel models: it’s about QoS – The Eclectic Light Companyより

参考: ヘテロジニアスマルチコア - Wikipedia

「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年度第2四半期)

週刊Railsウォッチ(20210524前編)Active Supportの知られてなさそうな機能5つ、RSpecの歴史、書籍『Practicing Rails』ほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Ruby Weekly

Hacklines

Hacklines

StatusCode Weekly

statuscode_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。