- Ruby / Rails関連
週刊Railsウォッチ: Shopifyのlanguage server ruby-lsp、PostgreSQL 15 Beta 1リリースほか(20220607後編)
こんにちは、hachi8833です。
🔗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より)
つっつきボイス:「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仕様を実装
つっつきボイス:「ruby/debugでおなじみのst0012さんからこのruby-lspを教わりました」「Rubyのlanguage serverか!」「これもShopifyがやってるとは」「Ruby 100%ですって」
「ruby-lspでは、少し前にも取り上げたsyntax_treeというパーサー(ウォッチ20220406)を使っているそうです↓」
「Ruby用のlanguage serverといえばsolargraph↓が昔からありますが、Shopifyにとってはsolargraphだと物足りないのかな?」「想像ですが、新しいsyntax_treeを使いたくてruby-lspを作ったのかもしれませんね」「language serverはパーサーと関係が深いので、新しい強力なパーサーをベースに作りたくなる気持ちはワカル」
ruby-lspにはVSCode拡張もあるそうです↓。
🔗 RubyMineのジャンプ機能は強力
「language serverといえば、こんなツイートを見つけました↓」「RubyMineの呼び出しジャンプ機能は神レベルで強力ですよ」
最近は Language Server を使うことで Vim でも JetBrains 製品の同等とまでは行かなくても、ちょっと見上げる位のレベルまでは到達できるのだけど、RubyMine に関しては到達不可能なレベル。代替できる OSS の Ruby Language Server が存在しない。 https://t.co/O7khgXk3eY
— mattn (@mattn_jp) May 31, 2022
RubyMine の品質良すぎるんよねー。あそこだけ OSS にしてくれー。
— mattn (@mattn_jp) May 31, 2022
「これまでVSCodeも含めていろんなエディタを使ってきましたけど、結局JetBrainsのIDEに戻ってくるんですよ: カスタマイズやプラグインのインストールをチマチマやらなくてもいきなり使えるし、メモリさえ潤沢に割り当てれば遅くないし」「JetBrainsやっぱり強い」
参考: RubyMine:JetBrainsによるRuby on Rails IDE
🔗 公式リファレンスの読み方
フィヨルドブートキャンプでメンターをやるまで「初心者さんは公式リファレンスの読み方がわからない」という視点が全然ありませんでした。「なんでネット記事ばっかり読むの?」って思ってたぐらい😅
人に教えてみて初めて「なるほど、そこが一番ネックだったのか!!」と僕自身も勉強になりました。— Junichi Ito (伊藤淳一) (@jnchito) June 2, 2022
つっつきボイス:「公式リファレンスの読み方ですか」「Rubyの記号の意味は、公式ドキュメントのここ↓にあることを知っておかないとハマりますよね」「Rubyに限らず、わからない用語をいかに的確に探すかという技術は大事👍」「野良記事より先に公式情報を探すのがポイントですね」
参考: Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 3.1 リファレンスマニュアル)
「え、公式のRuby用語集↓って存在を知らなかったかも!」「普通にググったときにあまり上位に出てこないからかもしれませんね」「最初は少数の利用者向けの手作り用語集だったのが大きく育ってきた感じがある」「ちなみにリスコフの置換原則も載っていますが、これはRubyに限定されない原則ですね」
参考: Ruby用語集 (Ruby 3.1 リファレンスマニュアル)
🔗 その他Ruby
link: Voicy 始めました - まつもと ゆきひろ https://t.co/DX5Ce6gDpo
#Voicy— Yukihiro Matz (@yukihiro_matz) June 2, 2022
つっつきボイス:「VoicyにMatzチャンネルできた🎉」「短いので聞きやすそう」「始まって間もないせいかまだ1件しかありませんね(注: その後早くも5件に増えています)」
同じ日にまつもとさんに直接質問できる、Ruby技術者認定試験合格者向けのイベントもあります https://t.co/G1lZdoexfb
— Shugo Maeda (@shugomaeda) May 30, 2022
「Ruby Association Activity Reportが7/12開催か」「開発助成事業の中間報告かなと思ったら成果報告会なんですね」
🔗DB
🔗 PostgreSQL 15 Beta 1リリース(Ruby Weeklyより)
PostgreSQL 15 is coming later this year, and "Practical SQL" is ready. This weekend, I tested all the book's code and data against the 15 beta (along with PostGIS 3.3 alpha) -- all works smoothly! https://t.co/AzJcbVqOWW
— Practical SQL (@practicalsql) June 6, 2022
つっつきボイス:「お、出た🎉」「今の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 逆引きリファレンスhttps://t.co/eLnOai3VoN pic.twitter.com/3yHIZUKxv0
— gakuji tamaki / gkzz (@gkzvoice) May 28, 2022
つっつきボイス:「この記事もよさそう👍」「この間の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アニメーション
たったこれだけのJavaScriptで、このアニメーション。にわかには信じられないが、試してみたら本当にこうなった。 https://t.co/GbLAkPR4uG
— 新山祐介 (Yusuke Shinyama) (@mootastic) May 26, 2022
つっつきボイス:「この短いJSコードで2Dレンダリング?」「<canvas>
タグなので取りあえずブラウザのHTMLに押し込んで動かしてみるか」「onclick
があるからクリックが必要そう...動いた!」「凄い」「さっぱりわからん」「自動生成っぽいかな」
「最近のゲームだとマップ生成などでこういう自動生成がよく行われていますね」「ゲーム業界はこういうのを極める人いろいろいそう」
「上のコードを作った人は、他にもこういうJSコードを以下のサイトに山ほどアップロードしているそうです↓」「これは極まってる🦾」「自然っぽく見せているのが技」「キャラクタアイコンの自動生成はどうやっているんだろう」「コードが一見文字化けしているものもあるけど、バイト圧縮したコードをeval
して実行しているのかな?」
🔗CSS/HTML/フロントエンド/テスト/デザイン
🔗 サイズ可変の<textarea>
これほんと天才すぎて感動したhttps://t.co/jcHfeHa9aN
— ダイチ (@kan_dai) June 1, 2022
つっつきボイス:「<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は、この間取り上げた記事↓の中で引用されていて知りました: 上はプログラミング自習サイトの記事ですが、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前編)
- 20220531 Railsコミュニティアンケート結果発表、書籍『Sustainable Web Development with Ruby on Rails』ほか
- 20220524後編 Railsコアチームとコミッターに新メンバー、ruby-buildでのRust YJITサポートほか
- 20220523前編 Hotwireの用途解説記事、RubyKaigi 2022プロポーザル募集開始ほか
- 20220517後編 rubygemsに「scoped gems」の提案、RSpecのブロック構文ほか
- 20220516前編 Active Modelで属性のパターンマッチをサポート、猫でもわかるHotwire入門ほか
- 20220511後編 Ruby 3.2.0devにRust版YJITがマージ、Docker Compose V2ほか
- 20220510前編 Active RecordにPromiseと非同期集計メソッドがマージ、climate_control gemほか
- 20220419後編 RubyのGCコンパクション改修、jemalloc、ReDoSの自動検出修正ほか
- 20220418前編 RailsConf 2022が5月17〜19日開催、認可機能解説記事ほか
- 20220412後編 HashieでRubyのハッシュを強化、最近のRubyコア解説記事ほ
- 20220411前編 Turbo Railsチュートリアル、Active Recordの「Leaky Abstraction」を削減ほか
- 20220406後編 RBS関連記事、Ruby formatterプロジェクト、Google Cloud Runほか
- 20220404前編 Ruby 3.2.0 Preview 1リリース、Rails向けDocker環境ジェネレータ、scientist gemほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)