- Ruby / Rails関連
週刊Railsウォッチ: Jets v4リリース、頑張らない型導入、Rust言語からCrabがforkほか(20230608後編)
こんにちは、hachi8833です。
🔗Rails
🔗 Nokogiri 1.15.0リリース(Ruby Weeklyより)
つっつきボイス:「お、Nokogiri 1.15.0が出たんですね」「Nokogiri::XML::Node
の使い方でいくつか非推奨になったものがあるけど、しばらくは使えるのかな」「Schema.from_document
でlibxml2がsegfaultになることがあったので変更したとある: これは修正が必要ですね」「Nokogiriで使っているlibxml2でmalloc
に加えてruby_xmalloc
も使えるようになったとあるのが関係していそう」「ruby_xmalloc
はmalloc
よりメモリを管理しやすい代わりに少し遅いらしい」
参考: 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 Release: Ruby 3.2 Support even before AWS official release of it 😄 https://t.co/4Rt3O8vQJz pic.twitter.com/bnCF1nh7Kt
— Tung Nguyen (@tongueroo) May 27, 2023
つっつきボイス:「久しぶりのJets、ちゃんと更新されていてよかった」「v4がリリースされてRuby 3.2をサポートしたんですね」「最新のRubyをサポートしないとAWS側で古いRubyが使えなくなったときに詰んじゃいます」「アップグレードガイドも揃ってるの偉い↓」「Rails風に書いてAWS Lambda上で動かせるJetsは発想もシンプルだし、個人的にはかなり気に入ってます👍」
参考: Upgrading Guide - Jets Ruby Serverless Framework
🔗 rails_i18n_manager: 国際化の管理画面(Ruby Weeklyより)
つっつきボイス:「これは管理画面を見てもらえばすぐわかると思います↓」「お〜なるほど、多言語アプリの訳文をここで管理できるのね」「前からあってもよさそうなのに見たことなかったかも」「訳文を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でも発表されてました↓」「あ、自分も見そびれた😢」
I'd like to introduce this great gem KatakataIrb, known at #rubykaigi 2023, into the Awesome Ruby so that many people can have a better experience on IRB!!https://t.co/R5LNZ2TpF3
— Masafumi Koba 🇺🇦 (@ybiquitous) May 15, 2023
🔗Ruby
🔗 RJITでJITを体験しよう
“k0kubun/ruby-jit-challenge 完了報告 - Smoky God Express” https://t.co/qEi6FeFXRD
— Watson (@watson1978) May 26, 2023
つっつきボイス:「JITをRubyで書けるRJIT(ウォッチ20230322)でJITを体験をしてみようというk0kubunさんのRubyKaigi 2023の発表をWatsonさんが記事にしてくれました」「めちゃくちゃ濃くていい発表ですね」「完走した人を"自分以外で初めて見ました"ですって」
ありがとうございます。おもしろかったです。これをひたすら続けていくのつらそ〜〜〜ってなったのでJITの民にはなれなさそうです……
— はくどー (@HKDnet) May 25, 2023
🔗 ASDF: Rubyも扱えるバージョンマネージャ
つっつきボイス:「最近このASDFをときどき見かけるんですが、anyenvみたいにRubyやPythonなどいろんな言語のバージョンを単体ツールで管理できるんですね」「ところでASDFってどういう意味なんだろう」「単純にキーボードを左から4つ押しただけでは?」「それか!」
🔗 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
これがRubyのウラガワのまとめだ!「Rubyのウラガワ」 - 『研鑽Rubyプログラミング』 #Techmee https://t.co/aWPaxNEzQi
— Kakutani Shintaro (@kakutani) May 25, 2023
つっつきボイス:「WEB+DB PRESSに笹田耕一さんが連載していたRuby内部の解説記事見出しがまとめられています」「貴重な情報ですね👍」
AI時代のマインスイーパを作りました。頭を使ってマスを開くところはAIが勝手にやってくれるので、人間は勘でマスを開くところをやってください。
楽しい単純作業はAIに奪われて、人間の仕事は責任をとることだけです🙂https://t.co/R1uhg3PiJX pic.twitter.com/e0YDB6pkg3— Yusuke Endoh (@mametter) May 29, 2023
「これは笑った😆」「楽しいところはAIがやっちゃうという😆」
つっつき後に以下のツイートも見つけました。
マインスイーパーの逆をやるゲーム(最初から全部の数字が開示されていてそれに合うように地雷を配置していく)を作ってみた: https://t.co/wr3arM7dms pic.twitter.com/pb9KEE2HoE
— reduls (@reduls) June 4, 2023
🔗クラウド/コンテナ/インフラ/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
Rust has been forked to the Crab Language https://t.co/oStuxXYn9O
— Hacker News Bot (@newsycombinator) May 30, 2023
つっつきボイス:「Hacker Newsが、Rust言語からCrab言語がforkしたというニュースでもちきりでした」「ソフトウェアがこうやってforkすることはこれまでもありましたけど、forkした結果がよかったことってあまりなかったような気がするんですよね」「技術的な理由かと思ったら、コミュニティが分裂した理由は商標ポリシー周りについて意見の違いがあったようです」「政治や運営上の理由での分裂、あるあるですね」
Crab(または「CrabLang」)コミュニティフォークは、企業の影響や財団が提案した制限的な商標ポリシーについてコミュニティ内で高まる懸念に対して、迅速かつ慎重に対応するために作られました。これは、「膝蓋反射」的な反応でもなければ、恐怖を広めたりパニックを引き起こそうとしたりするものでもありません。財団が起草した文書がフォークにつながったとはいえ、既に存在していた問題に対する遅すぎた解決策であり、多くのコミュニティメンバーが以前から抱いていたいくつかの疑問に対処するものだと考えています。
第一に、そして何より重要な点は、CrabLangは、私たちの愛する言語に取って代わろうとするものではありません。今の状況に満足しているのであれば、あなたが選んだ言語を使い続けることをお勧めします。私たちの目標は、コミュニティを分裂させることではなく、私たちの懸念を共有し、商標権侵害に関連する訴訟を心配することなく、より自由に言語を利用・創造・促進することを望む人たちに代替手段を提供することです。
CrabLang冒頭より
後編は以上です。
バックナンバー(2023年度第2四半期)
週刊Railsウォッチ: Rubyで環境変数を扱う、Web標準に「Baseline」ステータス追加ほか(20230531後編)
- 20230530前編 キャッシュシリアライザに
:message_pack
が追加、ViewComponent 3リリースほか - 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ウォッチタグ)