- Ruby / Rails関連
週刊Railsウォッチ: 書籍『The Rails and Hotwire Codex』、JavaScript Primer改訂2版ほか(20230622後編)
こんにちは、hachi8833です。
🔗Rails
🔗 書籍『The Rails and Hotwire Codex』
Finally ... the damn thing is out in the wild.
It was quite easy in the end, only cost my about 99% of my sanity.#ruby #rails
Buy now 👇 https://t.co/sdL7GoBZpn.
— Ayush (@ayushn21) December 15, 2022
つっつきボイス:「Ayushさんという方の技術ブログ↓の翻訳許可を最近いただいたんですが、その方が昨年末に出したRailsとHotwireの書籍です」「not by AIというバナーが貼ってある」「productionに耐える品質のコードが売りなんですね」「99ドルか〜」「Turbo Nativeでモバイルアプリも対象にしているのが新しそう」
参考: Binary Solo
目次
1. はじめに
2. Hotwireについて
3. ユーザーとサインアップ
4. 認証機能とナビゲーション
5. システムテスト、デバッグ、Turbo
6. ネイティブのスケルトン
7. Webとネイティブアプリをつなぐ橋
8. パスワードのリセット
9. 広告を作成する
10. ファイルアップロードとリッチテキスト
11. パンくずリスト、ドラフト、保存した広告
12. 認可機能とカスタムエラーページ
13. バックグラウンドジョブ
14. 全文検索
15. メッセージングシステム
16. 内部メッセージングとメールとの出会い
The Rails and Hotwire Codex: Build an app for web, iOS, and Androidより
🔗 ChatGPTでRailsアプリを最適化する方法(Ruby Weeklyより)
つっつきボイス:「ChatGPTでRailsのコードから以下のSQLを生成したのね↓」「ChatGPTが生成したコードを人間がレビューするのが大変だったりしますけどね」「記事でも質問の仕方によってはバグ入りのSQLが生成されたとありますね」「実際にやってみて確かめるのはいい👍」
-- 同記事より
SELECT
c1.id AS category_id,
c2.name AS category_name,
c1.name AS subcategory_name,
COUNT(DISTINCT p.id) FILTER (WHERE p.status = 'Complete') AS completed_projects_count,
COUNT(r.id) AS ratings_count,
COALESCE(AVG(r.rating), 0) AS ratings_average
FROM
services s
JOIN categories c1 ON s.category_id = c1.id
JOIN categories c2 ON c1.parent_id = c2.id
LEFT JOIN projects p ON s.user_id = p.vendor_id AND p.category_id = c1.id
LEFT JOIN ratings r ON s.user_id = r.reviewee_id AND p.id = r.project_id
WHERE
s.user_id = :user_id AND s.status = 'approved' AND s.active = true
GROUP BY
c1.id, c2.name, c1.name
ORDER BY
completed_projects_count DESC, c1.id ASC;
# 同記事より: オリジナルのRubyコード
projects_full = []
projects_empty = []
Service.where(user: user, status: "approved", active: true).order(category_id: :asc).each do |service|
ratings_average = 0
ratings_count = 0
ratings_total = 0
Rating.where(reviewee: user).each do |rating|
project = Project.find(rating.project_id)
if project.category_id == service.category_id
ratings_count += 1
ratings_total += rating.rating
end
end
ratings_average = (ratings_total / ratings_count.to_f).round(1).to_s if ratings_count != 0 && ratings_total != 0
completed_projects_count = Project.where(vendor: user, status: "Complete", category_id: service.category_id).size
service_hash = {
category_id: service.category_id,
category_name: Category.find(Category.find(service.category_id).parent_id).name,
subcategory_name: Category.find(service.category_id).name,
completed_projects_count: completed_projects_count,
ratings_count: ratings_count,
ratings_average: ratings_average,
}
resolved_hash = service_hash.transform_keys{ |k| k.to_s.camelize(:lower) }
if completed_projects_count > 0
projects_full.push(resolved_hash)
else
projects_empty.push(resolved_hash)
end
end
projects_full.sort_by!{ |k| -k["completedProjectsCount"] }
projects_full.push(*projects_empty)
projects_full
🔗 minitestスタイルガイド
- 元記事: Minitest Style Guide
つっつきボイス:「minitestスタイルガイドはこれまで取り上げたことがなかったので拾ってみました」「このあたりのスタイルはRuboCopのminitestで使われているものですね↓」
「minitestのrefute
って馴染みが薄いせいかassert
で書きがちだったかも」
# Minitest Style Guideより
# bad
assert("rubocop-minitest" != actual)
assert(!"rubocop-minitest" == (actual))
# good
refute_equal("rubocop-minitest", actual)
「minitestのassert_equal
では期待値を第1引数に渡すべきとある↓: 引数で期待値(expected)と実際の値(actual)の順序が不揃いだとテストの結果が読みにくくなるので、順序を揃えるのが大事」
# Minitest Style Guideより
# bad
assert_equal(actual, "rubocop-minitest")
# good
assert_equal("rubocop-minitest", actual)
「ところでminitestのassert_equal
はRSpecと順序が逆だと書かれていますね」「あ、ほんとだ」「RSpecだとexpect
構文だから、expect(実際の値).to equal(期待値)
のように書きますね」「英語の語順で自然な方に決まったのかも」
# rspec/rspec-expectationsより: Equivalence
expect(actual).to eq(expected) # actual == expectedならパス
expect(actual).to eql(expected) # actual.eql?(expected)ならパス
expect(actual).not_to eql(not_expected) # not(actual.eql?(expected))ならパス
🔗 Rails 7.1からカラムやenumで使えなくなる名前
つっつきボイス:「記事に記載されているdup
、freeze
、hash
、object_id
、class
、clone
、frozen
は元々Rubyレベルで定義されているメソッド名なので、被せた名前を使うと想定外の挙動になる恐れは確かにありそう」「そういえば以前Webチームのkonagaさんが以下の記事↓を書きましたけど、使えない名前がさらに増えたんですね」
🔗 ピクスタのtexta.fmポッドキャスト
つっつきボイス:「実はこれまでRails系ポッドキャストを聴いたことがあまりなかったんですが、@t_wadaさんも参加しているピクスタさんのポッドキャストで聴いたRailsのファットコントローラとファットモデル周りの話が良かったので取り上げました」「そういえば最近は外出することがめっきり減ったのでポッドキャストを聴く機会減ったな〜」「眼が疲れたときにポッドキャストはいいかも」
🔗Ruby
🔗 Rubyパーサーを書き直す話
つっつきボイス:「ブログのドメインはrailsscale.comですが、これはShopifyのブログだそうです」「Shopifyがやっている例のyarpの解説記事ですね(ウォッチ20230413): Language Server Protocolというものが登場してから、多くの言語がLSPを取り入れてるようになってきてVSCodeでもサポートされるようになってきたのはいい傾向だと思います👍」「LSPのおかげで現代のプログラマーは昔よりも随分やりやすくなりましたよね」
参考: Langserver.org
🔗 『メタプログラミングRuby 第2版』と問題集(Ruby Weeklyより)
つっつきボイス:「メタプログラミングRubyの第2版に対応した問題集がGitHubに上がっているんですね」「章番号も書籍に対応しているので、本を買って読みながらやるようにできているようですね👍」
🔗 langchainrb: RubyでLLMベースのアプリケーションを構築(Ruby Weeklyより)
- 元記事: Some blogging myths
つっつきボイス:「まだ開発途上らしいですが★が300超えていますね」「例のruby-openai(ウォッチ20230222)などを始めとするさまざまな大規模言語モデル(LLM)やツールを組み合わせてプロンプトとして使ったり検索したりできるんですね」「sequelと組み合わせてSQLクエリエージェントにもできるのか」「これは楽しそう」
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Google WorkspaceアカウントをAWS IAM Identity Centerに自動プロビジョニング可能に
ついに G-Workspace + AWS SSO の SCIM-based automatic provisioning (a.k.a. 人類の夢)が実現された〜👏
/ "AWS IAM Identity Center now supports automated user provisioning from Google Workspace" https://t.co/07GA6wFXPE
— Tori Hara (@toricls) June 13, 2023
つっつきボイス:「Google WorkspaceとIAMはどう連携するんでしょうか?」「まだ詳しく見ていないけど、Google Workspaceでアカウントを作るとAWS IAMの方に自動プロビジョニング可能になって、権限付与などを一元管理できるということのようですね」「あ、そういう機能なんですね」「Google Workspaceでアカウントを特定のユーザーグループに所属させるとIAMの方でも特定のユーザーグループに追加したりできるんじゃないかな」
Google Workspace をAWS IAM Identity Center(AWS Single Sign-On の後継サービス)に一度接続し、IAM Identity CenterでAWSアカウントとアプリケーションへのアクセスを一元管理できるようになりました。この統合により、エンドユーザーはGoogle Workspace IDでログインし、割り当てられたすべてのAWSアカウントとアプリケーションにアクセス可能になります。また、管理者は複数のアカウントにわたるAWSアクセス管理を簡素化し、エンドユーザーがサインインするときの使い慣れたGoogle Workspaceエクスペリエンスを維持できます。IAM Identity CenterとGoogle Workspaceは、Googleのオートプロビジョニングでユーザーを IAM Identity Centerに安全にプロビジョニングし、管理にかかる時間を節約できるようになります。
AWS IAM Identity Center now supports automated user provisioning from Google Workspaceより
「ドキュメント↓をざざっと見てみると、IAM Identity CenterのAPIキーをGoogle Workspace側に登録してIAMをコンフィグ可能にしたり、逆にIAM側からGoogle Workspaceのuser attributesにアクセスしたりできるようですね」「なるほど!昔やった案件もこの機能が当時使えたらすごく楽だったのにと思っちゃいました」「これまでも手動では可能だったけどめちゃくちゃ大変になるのでやろうと思わなかったな〜」
参考: Google Workspace - AWS IAM Identity Center (successor to AWS Single Sign-On)
🔗JavaScript
🔗 JavaScript Primer改訂2版
JavaScript Primer 改訂2版をリリースしました🎉🎉
JavaScriptの基礎を一から学べる入門書です。
ぜひ、購入してレビューお願いします!"JavaScript Primer 改訂2版をリリースしました!/JavaScript Primerはなぜ更新され続けるのか?"https://t.co/XrFr3w5Kbu pic.twitter.com/7dhIVtNLve
— azu (@azu_re) June 9, 2023
つっつきボイス:「先週取り上げようと思ってたのに見逃してました」「Webでも書籍でも読めて、何よりも内容が新しいJavaScript入門書は本当に助かる👍」「日本語で読めるのもいいですよね」「GitHubリポジトリでdiffもチェックできるのがすごい」
参考: Comparing 1.0.0...v4.0.0-publish · asciidwango/js-primer
「JavaScriptは仕様がものすごく大きくなっていて古い仕様も混じっていたりするんですが、この本は全部を網羅しようとせずに新しいトピックに専念しているのがいいですね」「サイトにも書かれているように、プログラミング経験者を対象にしていて初歩的な記述をスキップしているので、プログラミング自体が初めての人には不向きだと思います」「たしかに」
🔗CSS/HTML/フロントエンド/テスト/デザイン
🔗 セキュリティヘッダ警察
つっつきボイス:「はてブでバズってた記事です」
「たしかにX-Content-Type-Options nosniff
でおかしくなることはそうないと思う」「"比較的安全なセキュリティヘッダ"と説明されている部分は、安全なというより導入しても既存の仕様を壊さない可能性が高いという方が現状に近いかな」「X-XSS-Protection
はものすごく古いアプリでない限り不要」「Strict-Transport-Security
、いわゆるHSTSを間違えると後で元に戻すのが大変」「そうそう」
参考: HTTP Strict Transport Security - Wikipedia
「X-Frame-Options
も外部APIやウィジェット周りが動かなくなったりすることがあるので注意」「Content-Security-Policy
も雰囲気で有効にするとハマる」「Set-Cookie
のHttpOnly
属性やSameSite
属性はたしかに名前が紛らわしい」「以前から評判が悪いですよね」
「こういう情報は繰り返し啓蒙するのがいいと思います👍」
🔗 Chrome for Testing
つっつきボイス:「Chromeは自動アップデートなので、開発で特定バージョンのChromeを使って検証しようとしたりすると今まではいろいろ面倒でしたよね」「ほんとに」「弊社CTOのbabaさんが"Chromeはユーザーも開発者も強制アップデートなのに、Safariは開発者だけ事実上強制アップデートされるのがつらい"と言ってました」
後編は以上です。
バックナンバー(2023年度第2四半期)
週刊Railsウォッチ: RailsでApplication Layer Encryption、rubocop-factory_bot登場ほか(20230614後編)
- 20230613前編 Arel::Nodes::Cteが追加、html_escape_onceの修正ほか
- 20230608後編 Jets v4リリース、頑張らない型導入、Rust言語からCrabがforkほか
- 20230607前編 MessagePackがcookieシリアライザとメッセージシリアライザにも導入ほか
- 20230531後編Rubyで環境変数を扱う、Web標準に「Baseline」ステータス追加ほか
- 20230525後編 Ruby 3.3.0-preview1リリース、in_order_ofのバグ修正ほか
- 20230524前編 withで作成したリレーションをjoinsで指定可能に、キャッシュストアの例外処理を統一ほか
- 20230502 スライド『Rails 7.1をn倍速くした話』、Rails 7.1でMessagePackをサポートほか
- 20230427後編 第1回Rails Worldが10月に開催、『研鑽Rubyプログラミング』でRuby本体も高速化ほか
- 20230425前編 Rails 7.1の複合主キー対応が引き続き進む、exceptメソッドにwithoutエイリアスが追加ほか
- 20230413後編 ShopifyのRubyパーサーyarp、RJITを書いた理由ほか
- 20230412前編 複合主キーの実装が進む、Rails公式のバグ再現用テンプレートほか
- 20230406後編 Rubyオブジェクトモデルクイズの最難問ほか
- 20230405前編 Arel::Nodes::NodeにAPIドキュメントが追加、rubocop-mdほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)