こんにちは、hachi8833です。
🔗Ruby
🔗 Bundler 2.4がリリース、Rust拡張サポートなど(Ruby Weeklyより)
- 元記事: Bundler: Bundler v2.4: new resolver, gems with Rust extensions, and more
- 元記事: Bundler: Generate gem skeleton with Rust extension
つっつきボイス:「新しいBundlerが出たんですね」「依存関係を解決するアルゴリズムがpub_grubに変わって高速化されたみたい」「Ruby 2.3〜2.5とRubyGems 2.5〜2.7のサポートも終了したのか」「時の経つのは早い...」「Ruby 2.1とか使ってた時代が懐かしい」「自分のプロジェクトもRubyとRailsをアップグレードしなきゃ」
「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インストール方法は以下の記事をどうぞ↓
🔗 dry-structはRuby 3.2のDataを用いて再実装を目指す
We will probably reimplement dry-struct using Data. Remember that dry-struct supports typed attributes.
— @solnic@ruby.social (@solnic29a) October 5, 2022
つっつきボイス:「以下の記事をドラフト翻訳していて上のツイートを知りました↓」
参考: 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でラップして使いやすくしたいでしょうね」
- Coverband gemで削除
- Debride gemで静的解析
- フィーチャーフラグで囲む
- todo_or_die gemをかけ、プルリクのスコープを絞り込んでデッドコードを消す
同記事で解説されている手順より
「todo_or_dieという名前すごい」「たぶんTODOコメントの撲滅を支援するgemなんでしょうね」「Perlでよく使われるor die
をちょっと思い出しました」
参考: Perlの組み込み関数 die の翻訳 - perldoc.jp
「プロジェクトが大きくなればなるほどデッドコードは増えがちなので、削減したときの効果が大きくなりますね: デッドコードをなくしていくのはマジ大事👍」「ですね」
🔗 ruby-glossary: Rubyコアの略語辞書(Ruby Weeklyより)
参考: ruby/glossary.md at master · ruby/ruby · GitHub
追記: つっつき時点では以下のリポジトリに置かれていましたが、つっつき後にRuby本体に取り込まれました↑ 🎉
つっつきボイス:「@tenderloveさんが作った用語集です」「どちらかというと略語の辞典という感じかな」「ivar
はインスタンス変数、svar
は特殊変数」「iseq
はインストラクションシーケンス」「pc
はプログラムカウンタで、sp
はスタックポインタ」「思ったほど大きな辞書ではないのですぐ読めそうですね: YARVのダンプとかを見るときに助かりそう👍」
🔗 Ronin gem 2.0.0がリリース(Ruby Weeklyより)
Ronin 2.0.0 has finally been released!https://t.co/IUSmkZrgkQ#ruby #security #infosec #securityresearch
— ronin-rb (@ronin_rb) February 1, 2023
つっつきボイス:「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のネステッドモジュール
- 元記事: Nested Modules in Ruby(Ruby Weeklyより)
つっつきボイス:「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 Z
をputs 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 registration is open now! Grab your ticket NOW with Super Early Bird pricing. https://t.co/pFVk7poKa9 🏯 ⛰️ 🎫 #rubykaigi
— RubyKaigi (@rubykaigi) January 25, 2023
「RubyKaigi 2023の参加募集が始まりました🎉」「去年は行けなかったけど今年は絶対松本市に行く!」「現地参加は今ならSuper Early Birdで15,000円、オンラインのみ参加だと10,000円なんですね」
🔗 設計・セキュリティ
🔗 OpenSSLのセキュリティ修正が公開
OpenSSL version 3.0.8 published https://t.co/rJAOxIePMp
— OpenSSL announce (@OpenSSLannounce) February 7, 2023
OpenSSL version 1.1.1t published https://t.co/oOajXV0hVQ
— OpenSSL announce (@OpenSSLannounce) February 7, 2023
つっつきボイス:「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前編)
- 20230202後編 ShopifyのYJIT記事、RubyGemsのgem execコマンドほか
- 20230201後編 Ruby 3.2のベンチマーク記事、dry-cliで高度なCLIを作るほか
- 20230131前編 Evil Martiansが使っているgem、JavaScriptガイドが更新ほか
- 20230125前編 2022年のRails振り返り記事、RailsにDocker関連ファイルが追加ほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)