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

週刊Railsウォッチ: Shopifyのlanguage server ruby-lsp、PostgreSQL 15 Beta 1リリースほか(20220607後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Rubyでスクレイピングを書いて中古ギターを買った(Ruby Weeklyより)


つっつきボイス:「Rubyによるスクレイピングを使って、良さそうな中古ギターが出たら通知するようにしたという短い記事です」「そうそう、こういうのよくやりますよね」「ワクチン予約枠の空きがあるかどうかをチェックしたりとか😆」「PS5が販売開始されたかどうかのチェックとか😆」

# 同記事より
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(URI.open("#{root_url}/collections/fflp-electric-guitars"))

guitars = doc.search("a").
  map { |a| a[:href] }.
  compact.
  select { |a| a.include?("/collections/fflp-electric-guitars/products") }.
  uniq.
  map{ |a| "#{root_url}#{a}" }.
  sort

puts guitars

「元記事ではGitHub Actionsを使ってますね」「GitHub Actionsには簡単なcron的機能があるので、1時間おきぐらいのスケジューリングなどもできると思います: ただしGitHub Actionsのようなところで実行するときは、利用規約を調べたうえで負荷などに問題がないかどうかも十分確認してからにすべき」「忘れたらいけませんね」

参考: §スケジュール -- ワークフローをトリガーするイベント - GitHub Docs
参考: GitHub 追加製品および機能の利用規約 - GitHub Docs

🔗 io_monitor: 潜在的なメモリ肥大化を検出(Ruby Weeklyより)

DmitryTsepelev/io_monitor - GitHub


つっつきボイス:「Evil Martiansがスポンサーになってます」「Active Recordとレスポンスのペイロードを表示したり、閾値を超えたらwarningを表示したりできる、なるほど↓」

# 同リポジトリより
Completed 200 OK in 349ms (Views: 2.1ms | ActiveRecord: 38.7ms | ActiveRecord Payload: 866.00 B | Response Payload: 25.00 B | Allocations: 72304)
# 同リポジトリより: warning
ActiveRecord I/O to response payload ratio is 0.1, while threshold is 0.8

「そういえば最近のRails 7のログはアロケーションも表示されるようになっていますね↓」「そうそう」

# 手元で出したRails 7ログより
Completed 200 OK in 119ms (Views: 54.4ms | ActiveRecord: 2.7ms | Allocations: 34892)

「こういう情報をCloudWatchなどで収集してチャート化すると調査に便利ですね: リクエスト単位でメトリクスを取れるのはいい👍」

🔗 ruby-lsp: Rubyのlanguage server仕様を実装

Shopify/ruby-lsp - GitHub


つっつきボイス:「ruby/debugでおなじみのst0012さんからこのruby-lspを教わりました」「Rubyのlanguage serverか!」「これもShopifyがやってるとは」「Ruby 100%ですって」

「ruby-lspでは、少し前にも取り上げたsyntax_treeというパーサー(ウォッチ20220406)を使っているそうです↓」

ruby-syntax-tree/syntax_tree - GitHub

「Ruby用のlanguage serverといえばsolargraph↓が昔からありますが、Shopifyにとってはsolargraphだと物足りないのかな?」「想像ですが、新しいsyntax_treeを使いたくてruby-lspを作ったのかもしれませんね」「language serverはパーサーと関係が深いので、新しい強力なパーサーをベースに作りたくなる気持ちはワカル」

castwide/solargraph - GitHub


ruby-lspにはVSCode拡張もあるそうです↓。

Shopify/vscode-ruby-lsp - GitHub

🔗 RubyMineのジャンプ機能は強力

「language serverといえば、こんなツイートを見つけました↓」「RubyMineの呼び出しジャンプ機能は神レベルで強力ですよ」

「これまでVSCodeも含めていろんなエディタを使ってきましたけど、結局JetBrainsのIDEに戻ってくるんですよ: カスタマイズやプラグインのインストールをチマチマやらなくてもいきなり使えるし、メモリさえ潤沢に割り当てれば遅くないし」「JetBrainsやっぱり強い」

参考: RubyMine:JetBrainsによるRuby on Rails IDE

🔗 公式リファレンスの読み方

つっつきボイス:「公式リファレンスの読み方ですか」「Rubyの記号の意味は、公式ドキュメントのここ↓にあることを知っておかないとハマりますよね」「Rubyに限らず、わからない用語をいかに的確に探すかという技術は大事👍」「野良記事より先に公式情報を探すのがポイントですね」

参考: Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 3.1 リファレンスマニュアル)

「え、公式のRuby用語集↓って存在を知らなかったかも!」「普通にググったときにあまり上位に出てこないからかもしれませんね」「最初は少数の利用者向けの手作り用語集だったのが大きく育ってきた感じがある」「ちなみにリスコフの置換原則も載っていますが、これはRubyに限定されない原則ですね」

参考: Ruby用語集 (Ruby 3.1 リファレンスマニュアル)

参考: リスコフの置換原則 - Wikipedia

🔗 その他Ruby

つっつきボイス:「VoicyにMatzチャンネルできた🎉」「短いので聞きやすそう」「始まって間もないせいかまだ1件しかありませんね(注: その後早くも5件に増えています)」


「Ruby Association Activity Reportが7/12開催か」「開発助成事業の中間報告かなと思ったら成果報告会なんですね」

🔗DB

🔗 PostgreSQL 15 Beta 1リリース(Ruby Weeklyより)


つっつきボイス:「お、出た🎉」「今のPostgreSQLのメジャーアップデートは年に1回だから早く感じますね」

「15ではMERGEが導入される: INSERT ... ON CONFLICT的なこともできるみたい」「MERGEは標準SQLにあるらしい: ちなみに現実のメジャーなRDBMSは何らかの形で標準SQLに準拠できてない部分があったりしますよね」

参考: PostgreSQL: Documentation: 15: MERGE
参考: MERGE (SQL) - Wikipedia
参考: 標準SQLとは | 標準SQL徹底入門

「正規表現も強化されるのはありがたい」「JSON関数も増えてるんですね」

参考: PostgreSQL: Documentation: 15: 9.7. Pattern Matching
参考: PostgreSQL: Documentation: 15: 9.16. JSON Functions and Operators

range型にmultirange型が追加された」

参考: PostgreSQL: Documentation: 15: 8.17. Range Types

「パフォーマンスは、SELECT DISTINCTが並列化されたり、window関数が強化されている」「FDW (Foreign Data Wrapper)postgres_fdwのトランザクションをparallel_commitで並列コミットできるようになったのか」

参考: PostgreSQL: Documentation: 15: 7.3. Select Lists
参考: PostgreSQL: Documentation: 15: 9.22. Window Functions
参考: PostgreSQL: Documentation: 15: F.38. postgres_fdw

「psqlの\copyコマンドが高速化されたのも地味に嬉しい」「\copyを使うときは速度が欲しいですよね」

「行やカラムを指定して論理レプリケーションできる: テーブル全体は要らないけど特定のカラムだけレプリケーションしたいときとかによさそう」「いろいろ強くなってますね」

参考: PostgreSQL: Documentation: 15: 31.3. Row Filters

「最近PostgreSQLを使うときはRDSやAuroraでサーバーを立てておしまいにすることも多いので、こういう新機能でギンギンにチューニングする機会は昔ほど多くはないかもしれないけど、それでもできることが増えたのはいいですね👍」

参考: Amazon RDS(マネージドリレーショナルデータベース)| AWS
参考: Amazon Aurora(高性能マネージドリレーショナルデータベース)| AWS

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

🔗 GitHub Actions 逆引きリファレンス


つっつきボイス:「この記事もよさそう👍」「この間のGitHub Actions設計記事↓(ウォッチ20220524)と合わせて使えそうですね」

参考: GitHub ActionsにおけるStep/Job/Workflow設計論

「この間も話しましたけど、GitHub Actionsの"Step"は他のCIと比べて少し独自な感じがありますね: プラグインをStepごとに指定するとか、GitHubのトークン取得のようなGitHub固有の機能を使う部分とか」「GitHubでやれることはたいていGitHub Actionsでやれる感じですね」「GitHubがさまざまなAPIを公開しているので、GitHub ActionsからGitHub APIを呼ぶのがベストプラクティスに含まれているのも特徴的かなと思います」

🔗JavaScript

🔗 JavaScriptの3Dアニメーション


つっつきボイス:「この短いJSコードで2Dレンダリング?」「<canvas>タグなので取りあえずブラウザのHTMLに押し込んで動かしてみるか」「onclickがあるからクリックが必要そう...動いた!」「凄い」「さっぱりわからん」「自動生成っぽいかな」

参考: キャンバス API - Web API | MDN

「最近のゲームだとマップ生成などでこういう自動生成がよく行われていますね」「ゲーム業界はこういうのを極める人いろいろいそう」

「上のコードを作った人は、他にもこういうJSコードを以下のサイトに山ほどアップロードしているそうです↓」「これは極まってる🦾」「自然っぽく見せているのが技」「キャラクタアイコンの自動生成はどうやっているんだろう」「コードが一見文字化けしているものもあるけど、バイト圧縮したコードをevalして実行しているのかな?」

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

🔗 サイズ可変の<textarea>


つっつきボイス:「<textarea>の縦幅が自動的に伸び縮みしてくれない問題は昔からありますね: <textarea>自体にrows属性を指定しないといけなくて、デフォルトでは中身の量に応じて縦幅が変わってくれない」

参考: <textarea> - HTML: HyperText Markup Language | MDN

See the Pen
FlexTextarea
by Takayuki Shimada (@tsmd)
on CodePen.

「お〜、たしかに自動伸び縮みしてますね」「なるほど、ダミーの要素を<textarea>に重ねて連動させることで実現している: ハック的なことをあんまりしていないのがよさそう👍」「本当はブラウザがデフォルトでやってくれれば一番うれしいんですけどね」

See the Pen
FlexTextarea Explainer
by Takayuki Shimada (@tsmd)
on CodePen.

🔗 その他

🔗 Spaced Repetition


つっつきボイス:「Spaced Repetitionは、この間取り上げた記事↓の中で引用されていて知りました: 上はプログラミング自習サイトの記事ですが、Spaced Repetitionはどうやら学習法の一種だそうです」

参考: How to fake time in a Postgres database: And an example Ruby on Rails app, too!

「あぁ、単語の学習などで時間の間隔を空けて復習して、間隔をだんだん広げていくことで記憶の定着をよくする学習法ですね」「最初は1日1回表示して、2日に1回...1週間に1回みたいに逓減していく感じ」

「こういう忘却曲線↓は英単語の学習でもよく引き合いに出されてますね」「そうそう」「英単語学習アプリで、正解した英単語はその後出題されないけど、間違えた英単語は時間を空けて後日また出題するというのを見たことがあります: ちなみにそのアプリはHTMLソースを見たら答えがわかっちゃいましたけど😆」「あかんアプリ😆」


同記事より

「ところでspacedという言葉がちょっと不思議ですね」「たしかに時間というより空間的なスペースのことかと思われそう」「そんなに違和感はないけど英語的にはどうなんだろう?」「時間だったらintervalみたいに言いそうですけどね(intervalは形容詞ではないのでちょっと苦しいですが)」「その方がそれっぽいかも」「用語だったらそれで覚えるしかないかな」


後で調べたら「間隔反復」や「分散学習(Spaced Learning)」などと呼ばれているようです↓。

参考: 間隔反復 - Wikipedia


後編は以上です。

バックナンバー(2022年度第2四半期)

週刊Railsウォッチ: BasecampのHotwireページネーション、Query Object、Lograge gemほか(20220606前編)

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

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

Ruby Weekly


CONTACT

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