- Ruby / Rails関連
週刊Railsウォッチ: 責任あるモンキーパッチの当て方、gem脆弱性スキャンツール、Docker Desktop課金プラン改定ほか(20210907後編)
こんにちは、hachi8833です。来月出るんですね。
お知らせ: 来週の週刊Railsウォッチはお休みいたします🙇。
🔗Ruby
🔗 Twist: 出版原稿レビュープラットフォーム(Ruby Weeklyより)
つっつきボイス:「ややこしいですが、本を執筆している著者が出版前に原稿をレビューしてもらうためのプラットフォームを作ったのがこのTwistだそうです」「自分でこのアプリを作ってみたさまざまな知見を記事にした感じかな: よさそうな記事👍」
「twist-v2はバックエンドを切り離した今風の設計っぽい↓」「ディレクトリ構成はRailsっぽく見えるしZeitwerkもあるけど、RailsアプリでもSinatraアプリでもなくHanamiで、dry-rbやrom-rbyなどもいろいろ使って作ってみたらしい、へ〜」「フロントエンドはReactで、GraphQL経由でサーバーを呼び出しているのね」
DB <-> Backend Repositories <-> Backend GraphQL endpoint <-> Frontend <-> Browser
radar/twist-v2 READMEより
「そういえば作者のRyan Biggさんは以下の記事を書いた人でした↓」「CurrentAttributes
が有害というのはワカル」
🔗 責任あるモンキーパッチの当て方(Ruby Weeklyより)
link: Responsible Monkeypatching in Ruby | AppSignal Blog https://t.co/GihZbEcK4c
— Yukihiro Matz (@yukihiro_matz) September 1, 2021
つっつきボイス:「ちょっと長い記事です」「2011年にRuby 1.8.7で巨大Railsアプリをやっていた話がじわじわ来ますね」「え、そのときにString#%
にモンキーパッチを当てたのか!」「マジで?」「String#%
は文字列フォーマット用メソッドですね: こういうどこでも使われそうなメソッドにモンキーパッチを当てるのは怖い...」
# 同記事より: String#%にモンキーパッチを当てたときの挙動
replacements = {
horse_count: 3,
horses: {
one: "is 1 horse",
other: "are %{horse_count} horses"
}
}
# "there are 3 horses in the barn"が出力される
"there %{horse_count:horses} in the barn" % replacements
参考: String#%
(Ruby 3.0.0 リファレンスマニュアル)
「モンキーパッチが失敗する主な原因↓とかいろいろ面白そう」
- パッチそのものが壊れた場合: 上述のコードベースでは、同じメソッドで複数の実装が競合するのみならず、「勝った」メソッドも動いてくれなかった
- 仮定が正しくなかった場合: ホストコードが更新されてパッチが期待どおりに当たらなくなっていた
同記事より
「そういうときのためにRubyにはrefinementがあるのに、と思ったら、意外にもこの記事にはrefinementの話がまったくなかった」「あら、ホントだ」
「ざっと眺めた限りではRubyの経験が豊富な人という印象: ちゃんと読んだら学びがありそう👍」「翻訳してみたくなりました」
🔗 Snykのgem脆弱性スキャンツールとRails脆弱性データベース(Ruby Weeklyより)
つっつきボイス:「このSnykは自社でさまざまな言語を対象とする脆弱性スキャンCLIツールを出していて、それを使ってGemfileのセキュリティチェックを行う記事のようですね」「価格表を見た感じではこのツールでビジネスをやっているみたい」「今でもGitHubのDependabotとかを使えば脆弱性を通知できますけどね」「フリープランもあって自動テストでこういうツールを回せるならちょっと使ってみてもいいかも」
参考: Language support summary – Docs Library | Snyk
「Snykはこういうgemごとの脆弱性データベースも公開しているそうです↓」「お、これはなかなか便利そう」「npmやpipなどの脆弱性情報もあるんですね」
参考: rails vulnerabilities | Snyk
便利すぎる / 1件のコメント https://t.co/9eTshrrYJs “Vulnerability DB | Snyk” https://t.co/iQFuaj0bc0
— miki_bene (@benevolent0505) November 8, 2020
🔗 pnglitch: pngファイルを壊すgem(Ruby Weeklyより)
つっつきボイス:「以下のサイトにあるような感じでpngファイルをいい感じに壊すgemだそうです」「ああpngファイルってたしかにこういうふうに壊れますよね😆」「面白い😆」「pnglitchって文字どおりpngのglitch(故障)なのね」
「何のためのgemなんでしょうね?」「それがよくわからなくて、その割に★がたくさんあるのも謎です」「デスクトップやZoomの背景にしてビックリさせるとか?😆」「そういえば液晶に線が入ったような感じになるスクリーンセーバーもありましたね」
READMEによると、単に壊れたpngを眺めて楽しむためのgemのようです。後でart of pnglitchでググるとそれっぽいサイトがたくさん出てきました。
🔗 Unixのepoch時間をRubyオブジェクトに変換する(Ruby Weeklyより)
つっつきボイス:「Time#at
のin:
オプションのドキュメントがなかったので、記事書いた人がプルリクを投げたのね↓」「マージされてよかった🎉」
参考: Update docs for Time#at method by prathamesh-sonpatki · Pull Request #2929 · ruby/ruby
参考: class Time
(Ruby 3.0.0 リファレンスマニュアル)
「お、これは例のmilitary time zone」「『タイムゾーン呪いの書』にも載っていた、1文字で表すタイムゾーンですね(ウォッチ20210713)」
# 同記事より
>> Time.at(ts, in: "E")
#=> 2020-03-02 09:13:24 +0500
>> Time.at(ts, in: "Z")
#=> 2020-03-02 04:13:24 UTC
参考: List of military time zones - Wikipedia
「このエラーメッセージを見ると、military time zoneにはA〜IとK〜ZはあるけどJがないのが面白い↓」
# 同記事より
>> Time.at(ts, in: "IST")
Traceback (most recent call last):
2: from (irb):12
1: from (irb):12:in `at'
ArgumentError ("+HH:MM", "-HH:MM", "UTC" or "A".."I","K".."Z" expected for utc_offset)
🔗DB
🔗 UUIDとULID
つっつきボイス:「はてブで見つけました」「記事にもあるように、UUID(バージョン1)はランダム部が桁の上位にあるために、データベースのプライマリキーに使うとクラスタインデックスのデータ分布が散ってしまう点がパフォーマンス上不利ですね」
「このあたりはデータのlocality(局所性)の話題で、一般にlocalityが高いほどキャッシュヒットしやすくなるのでパフォーマンス上有利な代わりに、障害に弱くなる傾向があるというトレードオフの関係がありますが、RDBMSのインデックスの話であれば一部だけが破損するようなケースは想定しにくいのでlocalityが高い方が有利です」「なるほど」「逆に分散システムだと、パフォーマンスを少々犠牲にしてでもlocalityを下げることもあります」
「分散システムではデータが一様に分布する方が障害に強くなりますが、この記事のような単一のデータベースシステムの場合は基本的にlocalityが高い方がパフォーマンス上有利」「ふむふむ」「もともとUUIDの設計はパフォーマンスよりも分散システム上でIDが衝突しないことがメインなんですよ: RDBMSでlocalityが高い方が効率がよくなるならULIDを使うのがいいでしょうね」「なるほど!」
「元記事は図も含めて丁寧に書かれているので、UUID周りを知らなかった人にはおすすめ👍: このサイトは他のデータベース記事もよいです」
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Docker Desktopの課金プラン改定
つっつきボイス:「Docker Desktopの件は今だいぶ騒がれているので、そのうち方針が変わるんじゃないかなと思いたい」「乗り換えを考える記事もいろいろ出始めてますね」
参考: Docker Desktop有料化の影響 - Qiita
どれくらい実用的かはわかりませんが docker-machine は gitlab が fork してました https://t.co/RQkIQp7JOp
— Hiroshi SHIBATA (@hsbt) September 1, 2021
「今回発表された課金プランだとDocker Desktopがいろいろ使いにくくなってしまうのが残念」「ですよね」「課金されるかどうかは売上ベースか従業員数ベースで決まるんですが、Docker Desktopを使ってない他部署の売上も課金の閾値に影響することになりますし、大企業がこれからDocker Desktopを導入しようとしたときに売上が見込めないうちから課金対象になると話が通しにくくなりそう」「あ〜」「課金とは別の話ですが、アカウントを"人"に紐付けるのが必須なので、開発メンバーの引き継ぎとかがやりづらい」「誰か退職するとCIが止まりそうですよね」
Docker Desktopのサブスクリプション必須化がイケてないなーと思う大きな部分は、ほとんどのユーザーはローカル環境としてのDocker Desktopしか欲してないのに、特に使う気もないDockerHubのプライベートリポジトリ機能とかに金を払うところかなあ。納得感がないというか支出理由を説得できなさそう
— Masato Mori (@morimorihoge) August 31, 2021
「ツイートにも書きましたけど、自分たちはローカルでDocker Desktopをクライアントとして使えればよくて、それでいて有償のクラウド機能に欲しいものがないところに食い違いを感じるんですよ」「そこですよね」「課金そのものはあっていいと思うので、もっと有用感のある課金プランを検討して欲しい気持ち」「それこそお金を払ってでもPersonal版を使いたい企業もありそう」
参考: Docker Pricing & Monthly Plan Details | Docker
後編は以上です。
バックナンバー(2021年度第3四半期)
週刊Railsウォッチ: ActiveRecord::QueryLogs追加、spring gemがデフォルトから削除、fast_gettextほか(20210906前編)
- 20210901後編 TruffleRubyでdig_fetchを実装、ruby/debug gem、AWSハンズオン教材ほか
- 20210830前編 Rails 7でのimport maps導入、Steepで型を導入、KubernetesでRailsを動かすためのガイドほか
- 20210823後編 SorbetのRuby AOTコンパイラが公開、「Compiler Explorer」にRubyが追加、Ractorで非同期通信ほか
- 20210818前編 カウンタキャッシュをスレッドセーフに更新、Journey::Ast追加、GitLabをAWS Graviton2で動かすほか
- 20210810 システムテスト用headlessドライバにCupriteが追加、rails-mini-profiler、Jeremy Evansインタビューほか
- 20210804後編 Rubyの可変長アロケーションプロジェクト、サーキットブレーカーgem、EC2-Classicが終了へほか
- 20210803前編 SorbetでRailsアプリの型シグネチャを書く、activerecord-cte gemとanycable-client gem
- 20210720後編 ruby-gitでGit操作、最近のruby/debug、stdgems.org、Windows 365 Cloud PCほか
- 20210719前編 GitHubによるdisable_joins解説、MemoWise gemでメモ化、RailsのDDoS攻撃対策ほか
- 20210713後編 ruby-spacyで自然言語処理、Ruby製x86-64アセンブラ、『タイムゾーン呪いの書』ほか
- 20210712前編 AR::Relation#destroy_allがバッチ分割に変更、Active Record暗号化解説、sidekiq-unique-jobsほか
- 20210706後編 GitHub CopilotのAI補完、Pure Ruby実装のRuby JIT rhizome、PostgreSQLのPG-Strom拡張ほか
- 20210705前編 DI的な書き方が必要なとき、脆弱性学習用アプリRailsGoat、brakemanは優秀ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)