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

週刊Railsウォッチ: 責任あるモンキーパッチの当て方、gem脆弱性スキャンツール、Docker Desktop課金プラン改定ほか(20210907後編)

こんにちは、hachi8833です。来月出るんですね。

週刊Railsウォッチについて

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

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

お知らせ: 来週の週刊Railsウォッチはお休みいたします🙇。

🔗Ruby

🔗 Twist: 出版原稿レビュープラットフォーム(Ruby Weeklyより)

radar/twist-v2 - GitHub


つっつきボイス:「ややこしいですが、本を執筆している著者が出版前に原稿をレビューしてもらうためのプラットフォームを作ったのがこのTwistだそうです」「自分でこのアプリを作ってみたさまざまな知見を記事にした感じかな: よさそうな記事👍」

「twist-v2はバックエンドを切り離した今風の設計っぽい↓」「ディレクトリ構成はRailsっぽく見えるしZeitwerkもあるけど、RailsアプリでもSinatraアプリでもなくHanamiで、dry-rbrom-rbyなどもいろいろ使って作ってみたらしい、へ〜」「フロントエンドはReactで、GraphQL経由でサーバーを呼び出しているのね」

DB <-> Backend Repositories <-> Backend GraphQL endpoint <-> Frontend <-> Browser
radar/twist-v2 READMEより

「そういえば作者のRyan Biggさんは以下の記事を書いた人でした↓」「CurrentAttributesが有害というのはワカル」

Railsの`CurrentAttributes`は有害である(翻訳)

🔗 責任あるモンキーパッチの当て方(Ruby Weeklyより)


つっつきボイス:「ちょっと長い記事です」「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のRefinement(翻訳: 公式ドキュメントより)

「ざっと眺めた限りではRubyの経験が豊富な人という印象: ちゃんと読んだら学びがありそう👍」「翻訳してみたくなりました」

🔗 Snykのgem脆弱性スキャンツールとRails脆弱性データベース(Ruby Weeklyより)


つっつきボイス:「このSnykは自社でさまざまな言語を対象とする脆弱性スキャンCLIツールを出していて、それを使ってGemfileのセキュリティチェックを行う記事のようですね」「価格表を見た感じではこのツールでビジネスをやっているみたい」「今でもGitHubのDependabotとかを使えば脆弱性を通知できますけどね」「フリープランもあって自動テストでこういうツールを回せるならちょっと使ってみてもいいかも」

snyk/snyk - GitHub

dependabot/dependabot-core - GitHub

参考: Language support summary – Docs Library | Snyk

「Snykはこういうgemごとの脆弱性データベースも公開しているそうです↓」「お、これはなかなか便利そう」「npmやpipなどの脆弱性情報もあるんですね」

参考: rails vulnerabilities | Snyk

🔗 pnglitch: pngファイルを壊すgem(Ruby Weeklyより)

ucnv/pnglitch - GitHub


つっつきボイス:「以下のサイトにあるような感じでpngファイルをいい感じに壊すgemだそうです」「ああpngファイルってたしかにこういうふうに壊れますよね😆」「面白い😆」「pnglitchって文字どおりpngのglitch(故障)なのね」

参考: The Art of PNG Glitch


ucnv.github.ioより

「何のためのgemなんでしょうね?」「それがよくわからなくて、その割に★がたくさんあるのも謎です」「デスクトップやZoomの背景にしてビックリさせるとか?😆」「そういえば液晶に線が入ったような感じになるスクリーンセーバーもありましたね」

READMEによると、単に壊れたpngを眺めて楽しむためのgemのようです。後でart of pnglitchでググるとそれっぽいサイトがたくさん出てきました。

🔗 Unixのepoch時間をRubyオブジェクトに変換する(Ruby Weeklyより)

参考: UNIX時間 - Wikipedia


つっつきボイス:「Time#atin:オプションのドキュメントがなかったので、記事書いた人がプルリクを投げたのね↓」「マージされてよかった🎉」

参考: 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を下げることもあります」

参考: 参照の局所性 - Wikipedia

「分散システムではデータが一様に分布する方が障害に強くなりますが、この記事のような単一のデータベースシステムの場合は基本的にlocalityが高い方がパフォーマンス上有利」「ふむふむ」「もともとUUIDの設計はパフォーマンスよりも分散システム上でIDが衝突しないことがメインなんですよ: RDBMSでlocalityが高い方が効率がよくなるならULIDを使うのがいいでしょうね」「なるほど!」

参考: ULID - shimojubox

「元記事は図も含めて丁寧に書かれているので、UUID周りを知らなかった人にはおすすめ👍: このサイトは他のデータベース記事もよいです」

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

🔗 Docker Desktopの課金プラン改定


つっつきボイス:「Docker Desktopの件は今だいぶ騒がれているので、そのうち方針が変わるんじゃないかなと思いたい」「乗り換えを考える記事もいろいろ出始めてますね」

参考: Docker Desktop有料化の影響 - Qiita

「今回発表された課金プランだとDocker Desktopがいろいろ使いにくくなってしまうのが残念」「ですよね」「課金されるかどうかは売上ベースか従業員数ベースで決まるんですが、Docker Desktopを使ってない他部署の売上も課金の閾値に影響することになりますし、大企業がこれからDocker Desktopを導入しようとしたときに売上が見込めないうちから課金対象になると話が通しにくくなりそう」「あ〜」「課金とは別の話ですが、アカウントを"人"に紐付けるのが必須なので、開発メンバーの引き継ぎとかがやりづらい」「誰か退職するとCIが止まりそうですよね」

「ツイートにも書きましたけど、自分たちはローカルでDocker Desktopをクライアントとして使えればよくて、それでいて有償のクラウド機能に欲しいものがないところに食い違いを感じるんですよ」「そこですよね」「課金そのものはあっていいと思うので、もっと有用感のある課金プランを検討して欲しい気持ち」「それこそお金を払ってでもPersonal版を使いたい企業もありそう」

参考: Docker Pricing & Monthly Plan Details | Docker


後編は以上です。

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

週刊Railsウォッチ: ActiveRecord::QueryLogs追加、spring gemがデフォルトから削除、fast_gettextほか(20210906前編)

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

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

Ruby Weekly


CONTACT

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