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

週刊Railsウォッチ: Jets v4リリース、頑張らない型導入、Rust言語からCrabがforkほか(20230608後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Rails

🔗 Nokogiri 1.15.0リリース(Ruby Weeklyより)

sparklemotion/nokogiri - GitHub


つっつきボイス:「お、Nokogiri 1.15.0が出たんですね」「Nokogiri::XML::Nodeの使い方でいくつか非推奨になったものがあるけど、しばらくは使えるのかな」「Schema.from_documentでlibxml2がsegfaultになることがあったので変更したとある: これは修正が必要ですね」「Nokogiriで使っているlibxml2でmallocに加えてruby_xmallocも使えるようになったとあるのが関係していそう」「ruby_xmallocmallocよりメモリを管理しやすい代わりに少し遅いらしい」

参考: function ruby_xmalloc (Ruby 3.2 リファレンスマニュアル)
参考: libxml2 - Wikipedia
参考: セグメンテーション違反 - Wikipedia -- segfault

なお、現時点の最新バージョンは1.15.2です。

参考: Release 1.15.2 / 2023-05-24 · sparklemotion/nokogiri

🔗 Gatewayパターン


つっつきボイス:「Gatewayパターンって初めて見ました」「どこかで聞いたことある」「割りと普通にあるパターンだと思います」「記事ではMartin Fowlerのサイトを引用してますね↓」

参考: Gateway -- martinfowler.com

ゲートウェイの重要な目的は、ホストコードを複雑にするような外部のボキャブラリーを変換(translate)することである。
Gateway -- martinfowler.comより

「この図↓の中央がゲートウェイになっていて、ここでドメイン間の違いを吸収するようになっている」


同記事より

「Gatewayがあると、それぞれのドメインが相手のドメインの知識を持たずに済むのでテストしやすい」「記事だとGatewayパターンが違う名前で呼ばれていることもあると書かれていますね↓」「記事後半にはRailsでのサンプルもある」

注意したいのは、Gatewayパターンを適用するときにゲートウェイという言葉を使わないこともよくあります。また、Serviceという言葉もよく使われます。たとえば、PaymentServiceは、外部の支払いプロセッサを扱うロジックをカプセル化できます。
同記事より

🔗 Jets v4がリリース


つっつきボイス:「久しぶりのJets、ちゃんと更新されていてよかった」「v4がリリースされてRuby 3.2をサポートしたんですね」「最新のRubyをサポートしないとAWS側で古いRubyが使えなくなったときに詰んじゃいます」「アップグレードガイドも揃ってるの偉い↓」「Rails風に書いてAWS Lambda上で動かせるJetsは発想もシンプルだし、個人的にはかなり気に入ってます👍」

参考: Upgrading Guide - Jets Ruby Serverless Framework

boltops-tools/jets - GitHub

🔗 rails_i18n_manager: 国際化の管理画面(Ruby Weeklyより)

westonganger/rails_i18n_manager - GitHub


つっつきボイス:「これは管理画面を見てもらえばすぐわかると思います↓」「お〜なるほど、多言語アプリの訳文をここで管理できるのね」「前からあってもよさそうなのに見たことなかったかも」「訳文をyamlやJSONやDBにインポート/エクスポートできて、Google翻訳とも連携させられるのね」「多言語アプリだと似たようなものを独自に作りがちだけど、こういうのがあると喜ばれそう👍」


同リポジトリより

🔗 「頑張らない型導入」


つっつきボイス:「ruby.jp Slackのtypeチャンネルで話題になってたメドピアさんの記事です」「この記事ではなるべく既にあるものを使って型を導入しようという趣旨ですね: こういうのは比較的導入しやすいと思います👍」

「使いたいgemの型定義をこのrbs collectionで取得できるかどうか、どのぐらい型定義が揃っているか分かれ目」「型定義が充実するには貢献する人をもっと増やさないといけないんですよね」「ruby.jp Slackのtypeチャンネルでも型についての議論や質問が頻繁にやりとりされていますね」

# 同記事より
$ rbs collection init # https://github.com/ruby/gem_rbs_collection に登録されているgemの型定義を利用するための初期設定
$ rbs collection install # gem_rbs_collectionの型定義を取得

「ところで自分は見られませんでしたが、記事にあるkatakatairbは今年のRubyKaigi 2023でも発表されてました↓」「あ、自分も見そびれた😢」

tompng/katakata_irb - GitHub

🔗Ruby

🔗 RJITでJITを体験しよう

k0kubun/ruby-jit-challenge - GitHub


つっつきボイス:「JITをRubyで書けるRJIT(ウォッチ20230322)でJITを体験をしてみようというk0kubunさんのRubyKaigi 2023の発表をWatsonさんが記事にしてくれました」「めちゃくちゃ濃くていい発表ですね」「完走した人を"自分以外で初めて見ました"ですって」

🔗 ASDF: Rubyも扱えるバージョンマネージャ

asdf-vm/asdf - GitHub


つっつきボイス:「最近このASDFをときどき見かけるんですが、anyenvみたいにRubyやPythonなどいろんな言語のバージョンを単体ツールで管理できるんですね」「ところでASDFってどういう意味なんだろう」「単純にキーボードを左から4つ押しただけでは?」「それか!」

anyenv/anyenv - GitHub

🔗 mapのブロックにロジックを書くのは避けよう


つっつきボイス:「thoughtbotの記事です」「↓こういうふうにmapのブロックにロジックを書かないようにということ?」

# 同記事より
class ShoppingCart
  # 他のメソッド

  # 臭う
  def sub_totals
    items.map do |item|
      item.base_cost + item.bonus_cost
    end
  end
end

「ロジックを単にprivateメソッドに切り出すだけだと、mapのブロックがまだ残っている↓」

# 同記事より
class ShoppingCart
  # 他のメソッド

  # まだ臭う
  def sub_totals
    items.map { |item| sub_total_for(item) }
  end

  private

  def sub_total_for(item)
    if coupon.applies_to_id == item.id
      (item.base_cost + item.bonus_cost) * coupon.percent_off
    else
      item.base_cost + item.bonus_cost
    end
  end
end

「こういうふうに&:items.map(&:total_cost)のように呼び出すのが望ましいと書かれてますね↓」「コードだけ見て話してますが、mapのブロックが複雑になってくると後で厄介なことになりがちではあるし、&:total_costのように書く方がシンプルなうえに、ブロックが外側の変数にアクセスしなくなるので副作用の心配も減るという効用はあるでしょうね」「なるほど」

# 同記事より
class Item
  # 他のメソッド

  def total_cost
    base_cost + bonus_cost
  end
end
# 同記事より
def sub_totals
  items.map(&:total_cost)
end

🔗 その他Ruby

つっつきボイス:「WEB+DB PRESSに笹田耕一さんが連載していたRuby内部の解説記事見出しがまとめられています」「貴重な情報ですね👍」


「これは笑った😆」「楽しいところはAIがやっちゃうという😆」

つっつき後に以下のツイートも見つけました。

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

🔗 Cookie規制のIIJによる解説


つっつきボイス:「これはBPS社内Slackでも話題になっていましたね」「Websサイトのcookie利用について"通知・公表"、"事前同意取得"、"オプトアウト機会提供"のいずれかを行わないといけなくなるということなんですか」「記事によると日本の場合はGDPRのような罰金とかがあるわけではないようですが、業務改善命令や違反した事業者名の公表があるようですね」「Google Analytics的なものも該当するようなので、割りと多くのWebサイトが該当することになるんじゃないかな🤔」

参考: 講演レポート「改正電気通信事業法における外部送信規律とは」(森・濱田松本法律事務所 呂 佳叡氏)|一般財団法人 日本情報経済社会推進協会(JIPDEC: 一般財団法人日本情報経済社会推進協会)

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

🔗 ログインやフォームのHTMLベストプラクティス11 (Ruby Weeklyより)


つっつきボイス:「Evil Martiansのフロントエンド記事です」「Railsに限らない内容のようですね」

「可能ならパスワードレス方式を検討しよう、たしかに」「パスワードレスにする方法の中に、いわゆる"Remember password"("パスワードを忘れた場合")機能を通常のフローにして、毎回メールでログインURLを送信して認証するというのがありますね」「これわかる」「その代わり毎回メールが届くのがうざくなるし、メールが読める端末とログインする端末が別だとログインが面倒になりますけどね」

「Passkeyの話も出てますね: Passkeyがどのぐらい使われるかだけど、スマホが対応するなら案外普及は早いかも」

参考: Passkeyとはなにか、組織のIT管理者はどう向き合うか

「で本編ですが、"autocompleteを使うこと"や、"type="email"を使うこと"は基本」「"<button><a>でない要素をクリッカブルにしないこと"も、フォームに限らず基本ですね」「"<button><form>の内側に置くこと"もそう」

「"placeholderを入力項目のラベル表示代わりに使わないこと"、そうそう、これをやると使いにくくなる」「入力を開始するとラベルが見えなくなっちゃうヤツですね」「入力項目が1個だけならありかも🤔」

- <input placeholder="E-mail" type="email" autocomplete="username">
+ <label>
+   E-mail:
+   <input type="email" autocomplete="username">
+ </label>

「"チェックボックスは<label>の内側に置くこと"、そうしないとチェックボックスそのものしか反応しなくなって、チェックボックス横の文字列がクリックに反応しなくなって使いにくくなる」

- <input type="checkbox"> I agree with the privacy policy
+ <label>
+   <input type="checkbox"> I agree with the privacy policy
+ </label>

「"入力中のバリデーションは避けること"、これもそうで、メールアドレスの入力中にバリデーションが走ると入力できなくなってしまったりすることがありますね」「"フォームの二重送信を避けること"や、"Ajaxではネットワークレイテンシやサーバーエラーも考慮すること"なども基本」「どれもログインやフォームで押さえておくべき基本的な点ですが、こうやってまとめたのがいいですね👍」

🔗言語/ツール/OS/CPU

🔗 Rust言語からCrab言語がfork

crablang/crab - GitHub


つっつきボイス:「Hacker Newsが、Rust言語からCrab言語がforkしたというニュースでもちきりでした」「ソフトウェアがこうやってforkすることはこれまでもありましたけど、forkした結果がよかったことってあまりなかったような気がするんですよね」「技術的な理由かと思ったら、コミュニティが分裂した理由は商標ポリシー周りについて意見の違いがあったようです」「政治や運営上の理由での分裂、あるあるですね」

Crab(または「CrabLang」)コミュニティフォークは、企業の影響や財団が提案した制限的な商標ポリシーについてコミュニティ内で高まる懸念に対して、迅速かつ慎重に対応するために作られました。これは、「膝蓋反射」的な反応でもなければ、恐怖を広めたりパニックを引き起こそうとしたりするものでもありません。財団が起草した文書がフォークにつながったとはいえ、既に存在していた問題に対する遅すぎた解決策であり、多くのコミュニティメンバーが以前から抱いていたいくつかの疑問に対処するものだと考えています。
第一に、そして何より重要な点は、CrabLangは、私たちの愛する言語に取って代わろうとするものではありません。今の状況に満足しているのであれば、あなたが選んだ言語を使い続けることをお勧めします。私たちの目標は、コミュニティを分裂させることではなく、私たちの懸念を共有し、商標権侵害に関連する訴訟を心配することなく、より自由に言語を利用・創造・促進することを望む人たちに代替手段を提供することです。
CrabLang冒頭より


後編は以上です。

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

週刊Railsウォッチ: Rubyで環境変数を扱う、Web標準に「Baseline」ステータス追加ほか(20230531後編)

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

Rails公式ニュース

Ruby Weekly


CONTACT

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