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

週刊Railsウォッチ: Bundler 2.4リリース、RubyKaigi 2023参加募集開始ほか(20230215後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Bundler 2.4がリリース、Rust拡張サポートなど(Ruby Weeklyより)


つっつきボイス:「新しいBundlerが出たんですね」「依存関係を解決するアルゴリズムがpub_grubに変わって高速化されたみたい」「Ruby 2.3〜2.5とRubyGems 2.5〜2.7のサポートも終了したのか」「時の経つのは早い...」「Ruby 2.1とか使ってた時代が懐かしい」「自分のプロジェクトもRubyとRailsをアップグレードしなきゃ」

jhawthorn/pub_grub - GitHub

bundle gem--ext=rustオプションを付けるとRust拡張付きのgemを作成できるようになったんですね↓」「今後はRustを環境にインストールしておかないと使えないgemがだんだん増えてくるかも」「まだRustインストールしてないんです...」

# https://bundler.io/blog/2023/01/31/rust-gem-skeleton.htmlより
$ bundle gem --ext=rust hello_rust
Creating gem 'hello_rust'...
MIT License enabled in config
Initializing git repo in /home/retro/code/hello_rust
      create  hello_rust/Gemfile
      create  hello_rust/lib/hello_rust.rb
      create  hello_rust/lib/hello_rust/version.rb
      create  hello_rust/sig/hello_rust.rbs
      create  hello_rust/hello_rust.gemspec
      create  hello_rust/Rakefile
      create  hello_rust/README.md
      create  hello_rust/bin/console
      create  hello_rust/bin/setup
      create  hello_rust/.gitignore
      create  hello_rust/test/test_helper.rb
      create  hello_rust/test/test_hello_rust.rb
      create  hello_rust/LICENSE.txt
      create  hello_rust/Cargo.toml
      create  hello_rust/ext/hello_rust/Cargo.toml
      create  hello_rust/ext/hello_rust/extconf.rb
      create  hello_rust/ext/hello_rust/src/lib.rs
Gem 'hello_rust' was successfully created. For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html

Rubyビルド用のRustインストール方法は以下の記事をどうぞ↓

Ruby 3.2.0-devをM1 Macbook Pro(Ventura)でビルドする

🔗 dry-structはRuby 3.2のDataを用いて再実装を目指す


つっつきボイス:「以下の記事をドラフト翻訳していて上のツイートを知りました↓」

参考: New in Ruby 3.2 - Data.define - DEV Community 👩‍💻👨‍💻

「dry-rbシリーズのdry-structがRuby 3.2のDataを使って再実装、これは正しい方向性👍」「dry-structはDataがリリースされてもメンテされるんですね」「dry-structにはtyped attributesのようなDataにはない優位性もあります」

参考: class Data - Documentation for Ruby 3.3
参考: dry-rb - dry-struct v1.0 - Introduction

🔗 Rubyアプリからデッドコードを消し去る4つの戦略


つっつきボイス:「Rubyアプリからデッドコードを削除する記事、なるほど」「先週話題になったRubyのoneshot coverage(ウォッチ20230208)という言葉は記事に見当たらなかったけど、Coverband gemの内部で使われていそう」「oneshot coverageも使えるみたいですね」「Ruby本体に搭載されているoneshot coverageは割とプリミティブなので、そのまま使うよりは別のgemでラップして使いやすくしたいでしょうね」

  1. Coverband gemで削除
  2. Debride gemで静的解析
  3. フィーチャーフラグで囲む
  4. todo_or_die gemをかけ、プルリクのスコープを絞り込んでデッドコードを消す
    同記事で解説されている手順より

danmayer/coverband - GitHub
seattlerb/debride - GitHub

「todo_or_dieという名前すごい」「たぶんTODOコメントの撲滅を支援するgemなんでしょうね」「Perlでよく使われるor dieをちょっと思い出しました」

searls/todo_or_die - GitHub

参考: Perlの組み込み関数 die の翻訳 - perldoc.jp

「プロジェクトが大きくなればなるほどデッドコードは増えがちなので、削減したときの効果が大きくなりますね: デッドコードをなくしていくのはマジ大事👍」「ですね」

🔗 ruby-glossary: Rubyコアの略語辞書(Ruby Weeklyより)

参考: ruby/glossary.md at master · ruby/ruby · GitHub

追記: つっつき時点では以下のリポジトリに置かれていましたが、つっつき後にRuby本体に取り込まれました↑ 🎉

tenderlove/ruby-glossary - GitHub


つっつきボイス:「@tenderloveさんが作った用語集です」「どちらかというと略語の辞典という感じかな」「ivarはインスタンス変数、svarは特殊変数」「iseqはインストラクションシーケンス」「pcはプログラムカウンタで、spはスタックポインタ」「思ったほど大きな辞書ではないのですぐ読めそうですね: YARVのダンプとかを見るときに助かりそう👍」

🔗 Ronin gem 2.0.0がリリース(Ruby Weeklyより)

ronin-rb/ronin - GitHub


つっつきボイス:「Roninという名前が謎」「リリースノートに動画がありますね」「nmap的な脆弱性検査ツールなのかなと思ったけど、どちらかというとDevToysみたいなネットワーク/セキュリティエンジニア向けのスイスアーミーナイフ的な便利ツール集のようですね」

参考: Nmap: the Network Mapper - Free Security Scanner
参考: DevToys - A Swiss Army knife for developers

「CLIでも使えるし、以下のようにライブラリとして使ってカスタマイズもできるのね↓」「お〜」「こういうツールをbashでカスタマイズしようとするとつらくなりがちなので、Rubyで書けるのはよさそう👍」

# 同記事より
#!/usr/bin/env ruby
require 'ronin/support'
require 'wordlist'

domain   = Ronin::Support::Network::Domain.new('github.com')
wordlist = Wordlist.open('subdomains-10000.txt')

wordlist.each do |word|
  host = domain.subdomain(word)

  if !host.cname && host.has_addresses?
    print_success "found subdomain: #{host}"
  end
rescue Interrupt
  break
end

🔗 Rubyのネステッドモジュール


つっつきボイス:「Rubyのネステッドモジュールの使い方の記事のようですね: 以下のようにモジュールをネストして書くこともあれば、Rails::Engineのようにネストを書くこともある」

# 同記事画像を転記

# バージョン1
module Rails

end

module Rails
  module Engine
    # Railsモジュールが未定義の場合は作成される
  end
end

# バージョン2
module Rails::Engine
  # Railsモジュールは事前に定義済みでなければならない
end

「以下のTaggableは機能リストとして作ったモジュールで、Blog以下は名前空間として作られたモジュールなので、それぞれ役割が違いますね↓」「こういう使い方はよくありますよね」

# 同記事より
# このモジュールにはタグ付けアイテム関連の
# コードをすべて含む
module Taggable

end

# モジュールを名前空間として使う
module Blog
  class Post
    include Taggable  # モジュールをミックスインとして使う
  end

  class Comment
    include Taggable  # モジュールをミックスインとして使う
  end
end

「記事にもあるけど、A::Bという記法でモジュールを定義する場合はその時点より前にAが定義済みでないといけない」「そうそう、たまに忘れちゃうんですよ」

「ネステッドモジュール内の定数へのアクセスの話も面白そう」「以下の書き方だとZにアクセスできないけど、puts Zputs A::Zのように名前空間のトップから指定するとアクセスできる↓」「なるほど」「自分はputs A::Zで書く派かな」

# 同記事より
module A
  Z = 10
end

module A::B
  puts Z
end

# output
uninitialized constant A::B::Z (NameError)

「以下はinclude A::Bが解決されるかどうかという話か」「ちょっとややこしそう」「以下のアサーションはパスするけど、モジュールBをネストの外に出してmodule A::Bで定義するとエラーになる」「Ruby技術者認定試験に出そう」

module A
  PI = 3.14

  module B
    def get_pi = PI  # ワンライナーメソッドのショートハンド
  end
end

class C
  include A::B
end

assert_equal 3.14, C.new.get_pi  # パスする!

参考: Ruby技術者認定試験

Module.nestingでモジュールのネストを調べられるのね」「これ知りませんでした」「Rubyならあってもおかしくない機能ですね」

参考: Module.nesting (Ruby 3.2 リファレンスマニュアル)

「いい記事👍」

🔗 その他Ruby

「RubyKaigi 2023の参加募集が始まりました🎉」「去年は行けなかったけど今年は絶対松本市に行く!」「現地参加は今ならSuper Early Birdで15,000円、オンラインのみ参加だと10,000円なんですね」

🔗 設計・セキュリティ

🔗 OpenSSLのセキュリティ修正が公開


つっつきボイス:「OpenSSLのセキュリティ修正が公開されたのをruby-jp Slackで知りました」「3.0.*系と1.1.*系それぞれリリースされたんですね」

「この記事の最後に"プレミアムサポートの契約者のみ"ってあるのが気になったんですけど↓」「古い1.0.2系を今でも使っているユーザーはお金を払ってパッチを入手する必要があるということですね: 3.0.*系や1.1.*系を使っているならオープンソース」「なるほど、よかった〜😂」

参考: 「OpenSSL 3.0.8」が公開 ~8件の脆弱性を修正 - 窓の杜

なお、CVE-2023-0286、CVE-2022-4304、CVE-2023-0215、CVE-2022-4450に関しては旧バージョンである「OpenSSL 1.1.1」系統にも影響するとのこと。修正版の「OpenSSL 1.1.1t」が同時にリリースされている。「OpenSSL 1.0.2」系統に影響する脆弱性もあるが、パッチが提供されるのはプレミアムサポートの契約者のみなので注意したい。
「OpenSSL 3.0.8」が公開 ~8件の脆弱性を修正 - 窓の杜より

参考: Ruby が利用している OpenSSL のバージョン - AR ホームベーカリー -- RubyのOpenSSLバージョンを確認する方法が掲載されています

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

🔗 『次世代 CSS 仕様が与えるコンポーネント時代の Web への影響』


つっつきボイス:「@Jxck_さんの記事です」「ここ最近のCSS仕様とフロントエンドのコンポーネントとの関連についてみっちり解説していますね」「CSSの仕様がどんどん増えていく...」

「"コンポーネントはそこまでカスケードを求めていない"↓、このあたりの気持ちわかる」「昔はコンポーネントとかなかったからしょうがないのかな...」

今目立っているフロントエンドフレームワークにおいて、 CSS はコンポーネントに付随するおまけフラグメントとして扱われるか、 Tailwind/Bootstrap か MUI/Chakra のように外で解決される何かになっていた。どう扱っても扱いにくいため、なんとなく妥当に見える形で扱い、手厚くプロセスを通してなんとか吐き出す困った何かだ。
問題の 1 つは、 CSS という名前には皮肉なことだが、コンポーネントはそこまでカスケードを求めていない点にあるのだと思う。あるとすれば、共通するテーマカラーなどはコンテナから降ってきても良いかもしれないが、それも別にカスタムプロパティに吐いたカラーパレットを共有できていれば足りる場合が多いだろう。
同記事より

「CSSのコンポーネント向け対応が進めば間違いなくアプリケーションを書きやすくなるでしょうね: 従来のままだと特にデザインシステムとの相性がいろいろつらい」「まとめ部分↓を見ると、その分書き方も大きく変わるのか...」

しかし、今回挙げたような機能は、今ある CSS のプラクティスや、ライブラリ/フレームワークの設計、それを解説している書籍などのコンテンツが全て過去のものになり、書き方も、管理の仕方も、セレクタパフォーマンスの考え方も、デバッグの仕方も、再度手懐け直す必要がある程度の転換を迎えているのだ。
同記事より


後編は以上です。

バックナンバー(2023年度第1四半期)

週刊Railsウォッチ: AssumeSSLミドルウェア追加、Fly.ioとRails 7.1のDocker対応ほか(20230214前編)

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h


CONTACT

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