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

週刊Railsウォッチ: RubyのGCが高速化、RuboCopのストレスを減らす4つの方法、Defensive CSSほか(20220712後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Ruby 3.2.0-devのRust版YJIT


つっつきボイス:「sue445さんの記事です」「Ruby 3.2.0にマージされたRust版YJITのパフォーマンスを現行の3.1.2のYJITと比較してみたんですね」

「pumaで動かしたときにも有意差が出ているのが凄いな〜」「スコア1割弱上がっているとは」「メモリ使用量が改善されているの嬉しい」「YJITはRailsのようなものと相性がいい👍」

🔗 RubyのGC改善がマージ(Ruby Weeklyより)


つっつきボイス:「tenderloveことAaron PattersonさんはこのところGC(ガベージコレクション)の改良に手を付けていましたけど、ついにマージされた🎉」「GCでのISeqマーキング周りを高速化したようですね」

メジャーGCに要する時間の大半がインストラクションシーケンス(ISeq)オブジェクトのマーキングに費やされている。このプルリクは、ISeqオブジェクトのマーキングを高速化することでメジャーGCを高速化することを意図している。
同PRより

# 同記事より: masterの場合
$ RAILS_ENV=production gel exec bin/rails r test.rb
ruby 3.2.0dev (2022-06-22T12:30:39Z master 744d17ff6c) [arm64-darwin21]
Warming up --------------------------------------
            major GC     4.000  i/100ms
Calculating -------------------------------------
            major GC     47.748  (± 2.1%) i/s -    240.000  in   5.028520s
# 同記事より: GC改善後
$ RAILS_ENV=production gel exec bin/rails r test.rb
ruby 3.2.0dev (2022-06-22T20:52:13Z iseq-bitmap 2ba736a7f9) [arm64-darwin21]
Warming up --------------------------------------
            major GC     7.000  i/100ms
Calculating -------------------------------------
            major GC     77.208  (± 1.3%) i/s -    392.000  in   5.079023s

「今度のRubyKaigi 2022で取り上げそうな話題ですね」「きっとやると思います」

🔗 ShopifyのRubyスタイルガイドが更新(Ruby Weeklyより)


つっつきボイス:「ShopifyのRubyスタイルガイドは相当前から定番として知られていて、たぶん今も更新されているんじゃないかな」「以前ウォッチ20200908で紹介したときはドメインがshopify.github.ioでしたけど、今見るとこの新しいruby-style-guide.shopify.devドメインにリダイレクトされるようになっていますね」

Shopify/ruby-style-guide - GitHub

後で探すと、昨年の時点で文字列に二重引用符""を使うスタイルに切り替えたそうです↓。

🔗 RuboCopのストレスを減らす4つの方法(Ruby Weeklyより)


つっつきボイス:「イラッとしない4つの方法😆」「みんなイラッとしちゃうんでしょうね」「rubocop --auto-gen-configは導入時の面倒を軽減する方法のひとつですね」

「RuboCopのオートコレクトは、互換性を壊さない-aと破壊的な-Aという2種類が用意されているのがいいですよね」「たしかに」「明示的に互換性を壊さない安全な-aオプションとそうでないアグレッシブな-Aオプションが両方用意されているおかげで、安全な方は気軽に実行しつつ、アグレッシブな方は新規で書くコードに利用するといった使い分けができるのがありがたい」「この安心感は大きいですね」

# rubocop --helpより
Autocorrection:
    -a, --autocorrect                Autocorrect offenses (only when it's safe).
        --auto-correct               (same, deprecated)
        --safe-auto-correct          (same, deprecated)
    -A, --autocorrect-all            Autocorrect offenses (safe and unsafe).
        --auto-correct-all           (same, deprecated)
        --disable-uncorrectable      Used with --autocorrect to annotate any
                                     offenses that do not support autocorrect
                                     with `rubocop:todo` comments.

「ローカルで実行するgitフックは個人的にあまり好きになれないかも」「overcommitとかを使って、gitにコミットしたときにRuboCopなんかを走らせるヤツですね」「ローカルでチェックが重くなるとやりにくいんですよ」

sds/overcommit - GitHub

「変更されたファイルにだけRuboCopをかける方法↓」「RuboCopの遅さはあまり気にならないかな」「RSpecの方がよほど遅いですよね」「そうそう」

参考: Running Rubocop Only On Modified Files | by Anita Sharma | Devnetwork | Medium

「RuboCopのカスタムフォーマットの指定はやっておきたい↓」

# 同記事より
rubocop --format offenses

「issue 4の"RuboCopバージョンアップでルールが古くなる"、これは結構大事で、GitHubのDependabotを使うなどして普段からこまめにルール更新に対応しておくのが重要」「そうそう、アップデートを半年ためたりすると大量にエラーが出たりしますよね」

参考: Check! GitHub Dependabot について知る

「記事はRuboCopの導入も含めて親切に書かれていていいですね👍」

🔗 その他Ruby


つっつきボイス:「1つ目のツイートは、Shopifyがオープンソースにどのように投資・貢献しているかという記事で、2つ目はその一環としてRuby Centralという非営利団体がShopifyと組んでRuby Shieldというセキュリティ対策プロジェクトを立ち上げたというお知らせです」「Shopifyはほんといろいろ頑張っている」「Shopifyが大きな収益を上げているおかげでこういう取り組みができますね」

参考: Ruby Shield | Ruby Central

🔗DB

🔗 SQLite3ネタ3つ

つっつきボイス:「SQLite3関連のツイートを3つ見かけたので取り上げてみました」

🔗 sqlite3-ruby

「sqlite3-rubyが各種プラットフォーム向けのコンパイル済みgemをrc1としてリリースしたんですね」「主要なアーキテクチャはだいたいカバーされているみたい」「これまでSQLite3がrequireされているときはlibsqlite3-devをインストールしないといけなかったけど、正式にsqlite3-ruby 1.5.0がリリースされたら不要になるということか」

sparklemotion/sqlite3-ruby - GitHub

READMEによると、sqlite3-ruby 1.5.0以降は、以下のプラットフォームでネイティブgemの利用が推奨されています。なお現時点では1.5.0 rc1なので、gem install sqlite-ruby--preを付けないと従来のgemがインストールされます。

  • aarch64-linux
  • arm-linux
  • arm64-darwin
  • x64-mingw32 and x64-mingw-ucrt
  • x86-linux
  • x86_64-darwin
  • x86_64-linux

参考: Debian -- sid の libsqlite3-dev パッケージに関する詳細


「ところで、tailwindcss-cliやdartsass-railsなどもプラットフォームごとのバイナリ版を配布していますね↓」「もう誰も覚えていないだろうけど、therubyracerもまさにそういうgemだった↓」「therubyracerにはいろいろ泣かされましたね」「今はmini_racerを使うんでしたっけ?」「最近は環境にV8が入っているだろうからどちらも使わないんじゃないかな」

rubyjs/therubyracer - GitHub

rubyjs/mini_racer - GitHub

参考: V8 (JavaScriptエンジン) - Wikipedia

Rails 7: dartsass-rails gemはNode.jsなしで使える

Rails 7: importmap-rails + tailwindcss-railsでnode.jsが不要な理由

🔗 sqlite-utils

sqlite-utils memoryを使うと、CSVやJSONをインメモリSQLiteデータベースに展開して普通にSELECTとかできるようになる、なるほど」「あ、そういうことですか」「JSONにSQLでクエリできるツールは他にもあった気がする」

参考: Joining CSV and JSON data with an in-memory SQLite database

「こういうときにはjqがよく使われますけど↓、jqは使いこなしに慣れが必要なんですよ」「そうそう、対話型のインターフェイスを使って試行錯誤しながらクエリを組み立てられるのがSQLのよさですけど、jqは既にクエリと欲しい結果が頭の中でできあがっているのが前提みたいなところがありますよね」「jqは速いけど対話向きじゃない感じですね」「データをRDBに一度入れれば後はSQLでどうにでもできるので、自分はそういうときにJetBrainsのDataGripに入れてやることが多いかな」

stedolan/jq - GitHub

参考: DataGrip:データベースおよびSQL用のJetBrains製クロスプラットフォームIDE

🔗 .expertモードのインデックスおすすめ機能

「SQLiteを.expertモードにするとインデックスをおすすめする実験的機能が使えるそうです」「カーディナリティなどがわかっていればデータやスキーマからこういう自動推測をできそう」

-- sqlite.orgより
sqlite> CREATE TABLE x1(a, b, c);                  -- Create table in database
sqlite> .expert
sqlite> SELECT * FROM x1 WHERE a=? AND b>?;        -- Analyze this SELECT
CREATE INDEX x1_idx_000123a7 ON x1(a, b);

0|0|0|SEARCH TABLE x1 USING INDEX x1_idx_000123a7 (a=? AND b>?)

sqlite> CREATE INDEX x1ab ON x1(a, b);             -- Create the recommended index
sqlite> .expert
sqlite> SELECT * FROM x1 WHERE a=? AND b>?;        -- Re-analyze the same SELECT
(no new indexes)

0|0|0|SEARCH TABLE x1 USING INDEX x1ab (a=? AND b>?)

「スキーマを考える時点でインデックスのことは頭にあるので自分は使わないと思うけど、遅いSELECTがあるときにおすすめしてくれるのはちょっといいかも」

🔗 設計・セキュリティ・ドキュメント

🔗 スライド『ウェブセキュリティのありがちな誤解を解説する』


つっつきボイス:「徳丸先生がPHPカンファレンス2020で講演したときのスライドだそうです」「こういう情報を徳丸さんが定期的にまとめてくれるのは本当にありがたい」

「"高価な証明書ほど暗号強度が高い"という誤解、笑える」「Let's Encryptの暗号強度が弱いなんてことはありませんよね」「セキュリティ記事を剽窃された話も面白い」「それで言うとセキュリティベンダーの記事が信用できないこともあるんですよ」「あるある」


「以下はこのスライドと別に見つけた徳丸本(安全なWebアプリケーションの作り方 第2版)のサポート情報です↓」「Firefoxのデフォルトが変更された話ですね」「包括的Cookie保護ですか」「Firefoxのユーザー数はそれなりに多いので、Firefoxがこういう対策を入れたことでChromeにもこの対策を入れようという流れになるといいんですけどね」

参考: Mozilla、アンチトラッキング技術の集大成「包括的 Cookie 保護」をデスクトップ版「Firefox」で全面有効化 - 窓の杜

🔗 セキュリティエンジニアのための English Reading


つっつきボイス:「IPAがこの間公開していた資料ですね: この中ではセキュリティ英単語集がよかった」「こうして見ると普通の英文になさそうな使い方多いですね」「高校英語で学ばなそうな単語」「自分のような人にはありがたいです〜」「セキュリティに限らず、よく使われるIT業界特有の英単語をおさらいするのに便利ですし、IT業界に入るならひととおり知っておくのがおすすめ👍」

🔗クラウド/コンテナ/インフラ/Serverless

🔗 00000JAPAN: 大規模災害用無料WiFi


つっつきボイス:「リモートワーク以来スマホを触ることがほとんどなくなったので、今回のKDDIの通信障害の影響をほとんど受けなかった」「スマホを使うのは2要素認証のときぐらいかも」「株式情報見るときぐらいかも」「自宅だとWiFi経由なのでモバイルデータ通信をほとんど使ってませんね〜」

参考: 多要素認証 - Wikipedia

「通信障害に関連して、この00000JAPANという大規模災害用の無料WiFiというものがあることを知りました↓」「へ〜こんなのあるんだ」「知ってたけどゼロが5つって今知りました」「Wikipediaを見ると、認証不要で暗号化なしとあって、運営するための要件なんかも定められているんですね」「偽のアクセスポイントの懸念があるって書かれてますけど」「それ真っ先に同じこと思った😆」

参考: 00000JAPAN - Wikipedia

🔗 DevOpsは失敗する

参考: DevOps - Wikipedia


つっつきボイス:「はてブで見かけた記事です」「この1文はそのとおりだと思う↓」

DevOpsは、運用側の人間が開発者に自分たちのやり方を納得させようとするものだ
同記事より


「DevOpsは、ソフトウェアの価値をどうやって回収するかという原点に立ち返った話という気がしますね: たとえば伝統的な開発会社がソフトウェアを開発して納品すると開発会社にお金が入りますけど、本来は発注側にしてみれば開発それ自体は価値を生むものではなくて、運用に成功して初めて価値が生まれるわけじゃないですか」「そうなんですよね」「従来型の開発会社が開発だけやって運用にタッチしてこなかったのは、その意味では怠慢だったとも言えるわけで、DevOpsという考え方が生まれたのにはそういう流れもあったんだろうなという気持ちはあります」

「ちなみに自分が大学の授業で使っているスライドでもこのあたりを説明しています↓」「あ〜なるほど」「開発と運用のどちらも大事で、少なくとも開発だけ考えるのはおかしい」「細かくは企業文化によっても違うでしょうけど」「ちなみにBPSの場合は開発と運用でチーム(エンジニア職種)が分かれていません」

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

🔗 Defensive CSS

つっつきボイス:「defensiveとは?」「後で泣かないために予防的に壊れにくいCSSを書こうみたいな感じかも」

「たとえばComponent Spacingは、タイトルにmargin-right: 1rem;を指定することで文字数が増えたときに備えるあたりがdefensiveなんでしょうね↓」「文字数が少ないと気づかないヤツだ」「他の項目もいろいろ役に立ちそう」「記事の図にあるToggle Defensiveチェックボックスで表示を切り替えられるのもありがたい」


同サイトより

「主に文字数やスペーシングなどの変動するものを対象にしている感じで、デザイナー向けというよりプログラマー向けのコンテンツとしてよさそう👍」「有能な記事」「これ翻訳したいです」

🔗言語/ツール/OS/CPU

🔗 今どきのLinux事情


つっつきボイス:「このスライドはとてもよかった👍」「おじさん向け豆知識いろいろありがたい🙏」

「最近のデスクトップLinux環境のディレクトリ事情もこんなふうになっている↓」

「Linuxのゲーム事情も随分変わりましたね↓」「OpenGLから説明してくれているところが嬉し泣き😂」(以下延々)


後編は以上です。

バックナンバー(2022年度第3四半期)

週刊Railsウォッチ: AR::RelationにCTEを利用できるwithメソッドが追加、Propshaftアップグレードガイドほか(20220711前編)

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

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

Ruby Weekly


CONTACT

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