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

週刊Railsウォッチ: 書籍『The Rails and Hotwire Codex』、JavaScript Primer改訂2版ほか(20230622後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Rails

🔗 書籍『The Rails and Hotwire Codex』


つっつきボイス:「Ayushさんという方の技術ブログ↓の翻訳許可を最近いただいたんですが、その方が昨年末に出したRailsとHotwireの書籍です」「not by AIというバナーが貼ってある」「productionに耐える品質のコードが売りなんですね」「99ドルか〜」「Turbo Nativeでモバイルアプリも対象にしているのが新しそう」

参考: Binary Solo

hotwired/turbo-ios - GitHub

hotwired/turbo-android - GitHub

目次
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スタイルガイド

rubocop/minitest-style-guide - GitHub


つっつきボイス:「minitestスタイルガイドはこれまで取り上げたことがなかったので拾ってみました」「このあたりのスタイルはRuboCopのminitestで使われているものですね↓」

rubocop/rubocop-minitest - GitHub

「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 - GitHub

# 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で使えなくなる名前


つっつきボイス:「記事に記載されているdupfreezehashobject_idclassclonefrozenは元々Rubyレベルで定義されているメソッド名なので、被せた名前を使うと想定外の挙動になる恐れは確かにありそう」「そういえば以前Webチームのkonagaさんが以下の記事↓を書きましたけど、使えない名前がさらに増えたんですね」

Rails: enumに定義できない、ActiveRecord::Relationと競合する文字列の一覧

🔗 ピクスタのtexta.fmポッドキャスト


つっつきボイス:「実はこれまでRails系ポッドキャストを聴いたことがあまりなかったんですが、@t_wadaさんも参加しているピクスタさんのポッドキャストで聴いたRailsのファットコントローラとファットモデル周りの話が良かったので取り上げました」「そういえば最近は外出することがめっきり減ったのでポッドキャストを聴く機会減ったな〜」「眼が疲れたときにポッドキャストはいいかも」

🔗Ruby

🔗 Rubyパーサーを書き直す話


つっつきボイス:「ブログのドメインはrailsscale.comですが、これはShopifyのブログだそうです」「Shopifyがやっている例のyarpの解説記事ですね(ウォッチ20230413): Language Server Protocolというものが登場してから、多くの言語がLSPを取り入れてるようになってきてVSCodeでもサポートされるようになってきたのはいい傾向だと思います👍」「LSPのおかげで現代のプログラマーは昔よりも随分やりやすくなりましたよね」

ruby/yarp - GitHub

参考: Langserver.org

🔗 『メタプログラミングRuby 第2版』と問題集(Ruby Weeklyより)

kinoppyd/reading-metaprogramming-ruby - GitHub


つっつきボイス:「メタプログラミングRubyの第2版に対応した問題集がGitHubに上がっているんですね」「章番号も書籍に対応しているので、本を買って読みながらやるようにできているようですね👍」

🔗 langchainrb: RubyでLLMベースのアプリケーションを構築(Ruby Weeklyより)

andreibondarev/langchainrb - GitHub


つっつきボイス:「まだ開発途上らしいですが★が300超えていますね」「例のruby-openai(ウォッチ20230222)などを始めとするさまざまな大規模言語モデル(LLM)やツールを組み合わせてプロンプトとして使ったり検索したりできるんですね」「sequelと組み合わせてSQLクエリエージェントにもできるのか」「これは楽しそう」

参考: 大規模言語モデル - Wikipedia

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

🔗 Google WorkspaceアカウントをAWS IAM Identity Centerに自動プロビジョニング可能に


つっつきボイス:「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版


つっつきボイス:「先週取り上げようと思ってたのに見逃してました」「Webでも書籍でも読めて、何よりも内容が新しいJavaScript入門書は本当に助かる👍」「日本語で読めるのもいいですよね」「GitHubリポジトリでdiffもチェックできるのがすごい」

参考: Comparing 1.0.0...v4.0.0-publish · asciidwango/js-primer

「JavaScriptは仕様がものすごく大きくなっていて古い仕様も混じっていたりするんですが、この本は全部を網羅しようとせずに新しいトピックに専念しているのがいいですね」「サイトにも書かれているように、プログラミング経験者を対象にしていて初歩的な記述をスキップしているので、プログラミング自体が初めての人には不向きだと思います」「たしかに」

asciidwango/js-primer - GitHub

🔗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-CookieHttpOnly属性やSameSite属性はたしかに名前が紛らわしい」「以前から評判が悪いですよね」

「こういう情報は繰り返し啓蒙するのがいいと思います👍」

参考: HTTP ヘッダー - HTTP | MDN

🔗 Chrome for Testing


つっつきボイス:「Chromeは自動アップデートなので、開発で特定バージョンのChromeを使って検証しようとしたりすると今まではいろいろ面倒でしたよね」「ほんとに」「弊社CTOのbabaさんが"Chromeはユーザーも開発者も強制アップデートなのに、Safariは開発者だけ事実上強制アップデートされるのがつらい"と言ってました」


後編は以上です。

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

週刊Railsウォッチ: RailsでApplication Layer Encryption、rubocop-factory_bot登場ほか(20230614後編)

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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