- Ruby / Rails関連
週刊Railsウォッチ: RubyのGCが高速化、RuboCopのストレスを減らす4つの方法、Defensive CSSほか(20220712後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 Ruby 3.2.0-devのRust版YJIT
ISUCONのために真面目に調べた / “Ruby 3.1.2 with YJIT vs Ruby 3.2.0-dev with YJIT - くりにっき” https://t.co/dacwwjBhND
— sue445 (@sue445) July 3, 2022
つっつきボイス:「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で取り上げそうな話題ですね」「きっとやると思います」
↓RubyKaigi 2022は9月8〜10日に三重県津市の総合文化センターで開催されます https://t.co/N48VDvTrUc
— Haruhiko Okumura (@h_okumura) July 5, 2022
🔗 ShopifyのRubyスタイルガイドが更新(Ruby Weeklyより)
Shopify's Updated Ruby Style Guide: https://t.co/NUJi8PbIfa
— Ruby Inside (@RubyInside) July 2, 2022
つっつきボイス:「ShopifyのRubyスタイルガイドは相当前から定番として知られていて、たぶん今も更新されているんじゃないかな」「以前ウォッチ20200908で紹介したときはドメインがshopify.github.ioでしたけど、今見るとこの新しいruby-style-guide.shopify.devドメインにリダイレクトされるようになっていますね」
後で探すと、昨年の時点で文字列に二重引用符""
を使うスタイルに切り替えたそうです↓。
We've revamped @ShopifyEng's Ruby Style guide! A brand new look, and we finally decided on using double-quoted Strings. Yay consistency! 🎉 https://t.co/XlYrertFDv
— Volmer Campos Soares (@volmerius) March 29, 2021
🔗 RuboCopのストレスを減らす4つの方法(Ruby Weeklyより)
- 元記事: Rubocop - 4 ways to reduce your frustration! | Hanami Mastery - a knowledge base to hanami framework
つっつきボイス:「イラッとしない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なんかを走らせるヤツですね」「ローカルでチェックが重くなるとやりにくいんですよ」
「変更されたファイルにだけ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
Link: Shopify and Open Source: A Mutually Beneficial Relationship — Development (2022)
https://t.co/N2kGBqKerG— Yukihiro Matz (@yukihiro_matz) July 7, 2022
I ❤️ how we, at @ShopifyEng, are able to support open-source communities not just financially but also by staffing folks on our teams who contribute with projects, proposals, code and maintenance. It's as important to *do* the work as it is to *support* the work others are doing. https://t.co/kld3Ts0red
— Ufuk Kayserilioglu (@paracycle) July 6, 2022
つっつきボイス:「1つ目のツイートは、Shopifyがオープンソースにどのように投資・貢献しているかという記事で、2つ目はその一環としてRuby Centralという非営利団体がShopifyと組んでRuby Shieldというセキュリティ対策プロジェクトを立ち上げたというお知らせです」「Shopifyはほんといろいろ頑張っている」「Shopifyが大きな収益を上げているおかげでこういう取り組みができますね」
参考: Ruby Shield | Ruby Central
🔗DB
🔗 SQLite3ネタ3つ
つっつきボイス:「SQLite3関連のツイートを3つ見かけたので取り上げてみました」
🔗 sqlite3-ruby
💎Rubyists, v1.5.0.rc1 of the sqlite3 gem ships precompiled libraries including sqlite 3.39.0!🚀
💬We'd love some feedback on it.🤞
It's a prerelease, so remember to run
gem install sqlite3 --pre
or lock to the specific version in your Gemfile.
— mike dalessio (@flavorjones) July 5, 2022
「sqlite3-rubyが各種プラットフォーム向けのコンパイル済みgemをrc1としてリリースしたんですね」「主要なアーキテクチャはだいたいカバーされているみたい」「これまでSQLite3がrequireされているときはlibsqlite3-devをインストールしないといけなかったけど、正式にsqlite3-ruby 1.5.0がリリースされたら不要になるということか」
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が入っているだろうからどちらも使わないんじゃないかな」
参考: V8 (JavaScriptエンジン) - Wikipedia
🔗 sqlite-utils
教えてもらったコレ、超便利。jq を勉強しなくても、使い慣れたSQL複雑な集計が自在にできる。
sqlite-utils memory - 'select sum(credit) from (select max("off"+"len") as credit from stdin where "type"="stream-send" and "stream-id">=0 group by "stream-id") as t1' -t < quic-log
— Kazuho Oku (@kazuho) July 6, 2022
「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に入れてやることが多いかな」
参考: DataGrip:データベースおよびSQL用のJetBrains製クロスプラットフォームIDE
🔗 .expert
モードのインデックスおすすめ機能
SQLiteに実験的に実装された「インデックスおすすめ機能」。.expertモードを有効にしたあとでSELECTを実行すると、おすすめの CREATE INDEX文が表示される。同様の機能はPostgreSQL用のpganalyzeにもある。https://t.co/i4qy3HVoYP
— 新山祐介 (Yusuke Shinyama) (@mootastic) July 6, 2022
「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にもこの対策を入れようという流れになるといいんですけどね」
Firefoxのトータルクッキー保護有効化に伴い、徳丸本サンプルVMの動作に影響が出ています。Firefoxの設定変更で対応可能です / “Firefoxのトータルクッキー保護導入に伴う設定変更の方法 - 安全なWebアプリケーションの作り方 第2版 サポートサイト” https://t.co/qs7BLIglFk
— 徳丸 浩 (@ockeghem) July 7, 2022
参考: Mozilla、アンチトラッキング技術の集大成「包括的 Cookie 保護」をデスクトップ版「Firefox」で全面有効化 - 窓の杜
🔗 セキュリティエンジニアのための English Reading
現実的かつ実践的で良い資料だと思います / “セキュリティエンジニアのための English Reading:IPA 独立行政法人 情報処理推進機構” https://t.co/mMOUei3LvR
— 徳丸 浩 (@ockeghem) June 30, 2022
つっつきボイス:「IPAがこの間公開していた資料ですね: この中ではセキュリティ英単語集がよかった」「こうして見ると普通の英文になさそうな使い方多いですね」「高校英語で学ばなそうな単語」「自分のような人にはありがたいです〜」「セキュリティに限らず、よく使われるIT業界特有の英単語をおさらいするのに便利ですし、IT業界に入るならひととおり知っておくのがおすすめ👍」
🔗クラウド/コンテナ/インフラ/Serverless
🔗 00000JAPAN: 大規模災害用無料WiFi
ひとまず個人的に今回のau障害で学んだことは「デュアルSIMで冗長性確保できる時代だからやっておかないとね」ということと「サービス利用でSMS認証がSPoFになりうる」ということ。考えればその通りだけど問題起こるまで後回しにしたりすっかり忘れたりしてしまう。
— masa寿司 (@masa_iwasaki) July 3, 2022
つっつきボイス:「リモートワーク以来スマホを触ることがほとんどなくなったので、今回のKDDIの通信障害の影響をほとんど受けなかった」「スマホを使うのは2要素認証のときぐらいかも」「株式情報見るときぐらいかも」「自宅だとWiFi経由なのでモバイルデータ通信をほとんど使ってませんね〜」
「通信障害に関連して、この00000JAPANという大規模災害用の無料WiFiというものがあることを知りました↓」「へ〜こんなのあるんだ」「知ってたけどゼロが5つって今知りました」「Wikipediaを見ると、認証不要で暗号化なしとあって、運営するための要件なんかも定められているんですね」「偽のアクセスポイントの懸念があるって書かれてますけど」「それ真っ先に同じこと思った😆」
au通信障害の件。
3大キャリアの1つが使えなくなったんだから、大規模災害用無料WiFi「00000japan」解放すればよかったのに。
自分はBCP関連の本で知ったけど、このWiFiの存在を知らない人は多いと思う。認知度アップ、必要よ— 十谷りく (@RX3_temp) July 3, 2022
🔗 DevOpsは失敗する
- 元記事: ブログ: DevOpsは失敗する
つっつきボイス:「はてブで見かけた記事です」「この1文はそのとおりだと思う↓」
DevOpsは、運用側の人間が開発者に自分たちのやり方を納得させようとするものだ
同記事より
「DevOpsは、ソフトウェアの価値をどうやって回収するかという原点に立ち返った話という気がしますね: たとえば伝統的な開発会社がソフトウェアを開発して納品すると開発会社にお金が入りますけど、本来は発注側にしてみれば開発それ自体は価値を生むものではなくて、運用に成功して初めて価値が生まれるわけじゃないですか」「そうなんですよね」「従来型の開発会社が開発だけやって運用にタッチしてこなかったのは、その意味では怠慢だったとも言えるわけで、DevOpsという考え方が生まれたのにはそういう流れもあったんだろうなという気持ちはあります」
「ちなみに自分が大学の授業で使っているスライドでもこのあたりを説明しています↓」「あ〜なるほど」「開発と運用のどちらも大事で、少なくとも開発だけ考えるのはおかしい」「細かくは企業文化によっても違うでしょうけど」「ちなみにBPSの場合は開発と運用でチーム(エンジニア職種)が分かれていません」
🔗CSS/HTML/フロントエンド/テスト/デザイン
🔗 Defensive CSS
防御性CSS
Defensive CSS
HN讨论地址: https://t.co/nKPkIuYfE2
原文地址: https://t.co/oTtYADKCVx
— Hacker News 中文精选 (@HackerNewsZh) July 6, 2022
つっつきボイス:「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前編)
- 20220705後編 6月のRubyコア動向、Stack Overflowアンケート結果ほか
- 20220704前編 マイグレーションをStrategyパターンで拡張可能にほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)