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

週刊Railsウォッチ: Kaigi on Rails 2023関連イベント情報公開、複合主キーのlocality解説記事ほか(20231018後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗 Rails

🔗 nokolexbor: nokogiri互換のHTML5パーサー(Ruby Weeklyより)

serpapi/nokolexbor - GitHub


つっつきボイス:「Rubyで広く使われているnokogiri gemとAPI互換の高速HTML5パーサーだそうです」「Nokogiriの5.2倍高速で、CSSセレクタが最大997倍とある」「nokolexborという名前はどこから来たんだろうと思ったら、Readmeによるとlexborという別プロジェクトがあって、それをベースにしているようです」「新しいgemなので評価するには使ってみないとですね」

参考: Nokogiri -- nokogiri.org

lexbor/lexbor - GitHub

# 同リポジトリより
require 'nokolexbor'
require 'open-uri'

# Parse HTML document
doc = Nokolexbor::HTML(URI.open('https://github.com/serpapi/nokolexbor'))

# Search for nodes by css
doc.css('#readme h1', 'article h2', 'p[dir=auto]').each do |node|
  puts node.content
end

# Search for text nodes by css
doc.css('#readme p > ::text').each do |text|
  puts text.content
end

# Search for nodes by xpath
doc.xpath('//div[@id="readme"]//h1', '//article//h2').each do |node|
  puts node.content
end

🔗 logster: DiscourseのRackログ表示(Ruby Weeklyより)

discourse/logster - GitHub


つっつきボイス:「Rackのログを表示できるgemだそうです」「routes.rbでmountしてやると、ブラウザ画面でRailsのログを可視化・フィルタできるんですね」「リポジトリはDiscourseなのね」「デモサイトを開いて左下のdebugとかinfoのチェックボックスをオンにするとログが見えた」「Rackで何かあったときに大量のデバッグログを生で見るのはつらいので、こういうツールをdevelopmentに入れて使ってみてもよさそう👍」

デモサイト: Logs -- logster.info


同リポジトリより

🔗Railsに複合主キーを導入する


つっつきボイス:「2020年のShopifyの記事ですが、7.1に入った以下のプルリクのコメントで知りました」「見たことあるような気がする記事」

参考: Infer primary_key: :id on associations with composite primary key models by adrianna-chang-shopify · Pull Request #49113 · rails/rails

「Rails 7.1に複合主キーをどうやって導入した話かなと思ったけど、データのlocality(局所性)の話が中心のようですね」「あ、そちらの方なんですね」

参考: 参照の局所性 - Wikipedia

「一応、複合主キーの話ではあるけど、どのようにidを採番すればデータのlocalityを維持できるかといった話も含んだ最適化の話でしょうね: こういう図↓も複合主キーというよりは最適化に関連していますし」「なるほど」「マルチテナントを扱うときなどは、同じテナントのデータ同士はidがなるべく近い方がlocalityを高めるうえで有利なんですよ」「たしかに記事でもマルチテナントのことに触れていますね」


同記事より

🔗 Rails 7.1へのアップグレード記事


つっつきボイス:「TechRachoのリリース記事を引用いただいたので、はてなブックマークで見つけました」「お、早くもRailsを7.1にアップグレードしたんですね: この人はスムーズにアップデートできたみたいでよかった」「他にも7.1へのアップグレード記事を見かけたんですが、今見つからないので探しておきます」

見つけました↓。

参考: Rails 7.1 リリース後 1.5 時間での移行と今後 - stmn tech blog

Rails 7.1.0 がリリースされました

🔗 その他Rails


つっつきボイス:「1件目は、deviseが4.9.3でRails 7.1に対応したそうです」「お、今回は早いですね」「地味にありがたいアップデート」

「2件目は来週のKaigi on Rails 2023の関連イベントリストです」「ドリンクアップや音楽イベントなどの現地開催イベントが戻ってきた感ありますね🎉」「ご予約はお早めに」


「小ネタですが、Rails 7.1でRails.env.local?が入ってきたのでRuboCopのコンフィグでも対応が必要だったそうです(#46786)」


The Rails Foundationが主催した第1回Rails Worldのキーノートスピーチです」「お〜、そういえば先週開催されてましたね」「Rails 7.1リリースもこれとタイミング合わせたんでしょうね」「他の動画は準備中だそうです↓」

参考: Rails World - 2023

🔗Ruby

🔗 オブジェクトシェイプに優しいRubyコードを書く(Ruby Weeklyより)


つっつきボイス:「Rubyのオブジェクトシェイプを活かす書き方だそうです」「インスタンス変数周りの書き方にコツがあるみたい」「今はRubyの内部実装がいろいろ変わりつつあるので、以前速かった書き方が今後そうでなくなったり、その逆のことが起きたりしそうですね」

# 同記事より
# Bad: Object Shape unfriendly
class GroceryStore
  def fruit
    @fruit = "apple"
  end

  def vegetable
    @vegetable = "broccoli"
  end
end

# The "Application"
alpha_store = GroceryStore.new
alpha_store.fruit # defines @fruit first
alpha_store.vegetable # defines @vegetable second

beta_store = GroceryStore.new
beta_store.vegetable # defines @vegetable first
beta_store.fruit # defines #fruit second

Rubyオブジェクトの未来をつくる「シェイプ」とは(翻訳)

🔗 ruby-units: Rubyで単位を扱う(Ruby Weeklyより)

olbrich/ruby-units - GitHub


つっつきボイス:「名前の通りRubyで単位を換算するgemです」「フィートの換算やはりあった」「同じようなgem、きっと他にもあるはず」「私もそんな気がします」

# 同リポジトリより
unit = Unit.new("1")                 # constant only
unit = Unit.new("mm")                # unit only (defaults to a scalar of 1)
unit = Unit.new("1 mm")              # create a simple unit
unit = Unit.new("1 mm/s")            # a compound unit
unit = Unit.new("1 mm s^-1")         # in exponent notation
unit = Unit.new("1 kg*m^2/s^2")      # complex unit
unit = Unit.new("1 kg m^2 s^-2")     # complex unit
unit = Unit.new("1 mm")              # shorthand
unit = "1 mm".to_unit                # convert string object
unit = object.to_unit                # convert any object using object.to_s
unit = Unit.new('1/4 cup')           # Rational number
unit = Unit.new('1+1i mm')           # Complex Number

後で探してみましたが、意外にもこれしか見当たりませんでした↓。

mhuggins/ruby-measurement - GitHub

🔗言語/ツール/OS/CPU

🔗 Linux from scratch


つっつきボイス:「Linux from scratchって、文字通りLinuxをゼロからビルドするんですね」「現在もさかんにアップデートされていてすごい」「今年の9月もアップデートしてる!」「ダウンロードページがわかりにくかったけどここにありました」「ついでに日本語版も見つけたんですが↓、こっちも同じぐらい積極的に更新されていますね」

参考: Project Web of LFSブック日本語版 on SourceForge.JP Web space

🔗 Fetch APIのPATCH


つっつきボイス:「Fetch APIのうち、PATCHメソッドだけが大文字でないと動作しない理由を調べた記事です」「実装のせいでそうなっているのかと思いきや、仕様レベルでそうだったとは: ここまで調べ上げたのはすごい👍」

参考: フェッチ API - Web API | MDN


後編は以上です。

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

週刊Railsウォッチ: Active Storageのしくみを詳しく解説するDiscussion投稿ほか(20231017前編)

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

Ruby Weekly


CONTACT

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