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

週刊Railsウォッチ: RailsとPostgreSQLで列挙型を作成する6つの方法、Ubuntu Proほか(20221012後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 RailsとPostgreSQLで列挙型を作成する6つの方法(Ruby Weeklyより)


つっつきボイス:「enumのさまざまな書き方は定期的に記事が出ますね」「Rails 7の前後でPostgreSQLのENUM型を使えるようになっていましたね」

  1. 手作りする
  2. RailsのenumでInteger値を指定する
  3. RailsのenumでString値を指定する
  4. RailsのenumでPostgreSQLのENUM型を指定する(Rails 7より前)
  5. RailsのenumでPostgreSQLのENUM型を指定する(Rails 7以後)
  6. 列挙型用のテーブルを使う

Rails 7: PostgreSQLのカスタムenum型が使いやすくなった(翻訳)

参考: 8.7. 列挙型 -- PostgreSQL 14.5ドキュメント

「ちなみに1〜6の中では、SQLクエリの結果が読みやすい3.が個人的に好きです↓」「enumが数字のままだとクエリ結果が読みづらくなると以前もお話していましたね」「データベースビューでenumを変換したりすれば回避できるので好みの範疇だと思いますけどね」

# 同記事より: その3
class Order < ApplicationRecord
  enum :status, {
    initializing: "initializing",
    open: "open",
    closed: "closed",
    canceled: "canceled"
  }
end

「3.は一見ストレージを余分に食いそうに見えるけど、Google並の巨大データセットを使うのでもない限りまず影響はないだろうと記事にも書かれていますね」「Google並はそうそうないでしょうね😆」

「ところでRailsのデフォルトは2ですけど、2だとenum要素のソート順序も定まるというメリットはありますね」「そうそう」「後で要素を追加削除するときに困らないよう10,20,30...みたいに間を開けたりしますよね」

「そういうわけで自分は3が好みで、4や5にはあまりしたくない方なんですが、もうひとつの理由は、4や5だと型を追加・削除するときにALTER TABLEしないといけないからなんですよ」「あ〜」「本番データベースのレコード数が多いテーブルでALTER TABLEすると長時間ロックされるリスクがあります」「たしかに!」「4や5はPostgreSQLの機能を使うので、おそらくPostgreSQL的には推奨される方法だろうとは思うんですが、一見大丈夫そうに見えてもそういう怖さがあることを実際に体験しました」

「6のように専用のテーブルを作って外部キーを設定するのは業務システムで見かけますね: ステータスを取るだけでもJOINが必要なのはどうかなという気持ちはありますが」

「全般によくまとまった記事👍」

🔗 Rubyオブジェクトのソート条件指定方法を改良してみた(Ruby Weeklyより)

testdouble/put - GitHub


つっつきボイス:「Rubyのソート方法を拡張するputというgemを作ってみたそうです」「お、以下のようにsort_byに複数の条件をフィルタ的にブロック内の配列に書くということのようですね↓」「putという名前はちょっと気になるかな〜」

# 同リポジトリより
people.sort_by { |person|
  [
    (Put.first if person.rubyist?),
    Put.desc(person.age),
    Put.asc(person.name)
  ]
} # => Zoe, Qin, Axe, Zak, Tam

nils_firstnils_lastがあるんですね↓」

# 同リポジトリより
[:fun, :stuff, nil, :here].sort_by { |val|
  [Put.nils_first(val)]
} # => [nil, :fun, :stuff, :here]

「このgemがなくてもsort_byで複数条件を書く方法は記事の方法↓も含めていろいろあります」「nilの可能性がある場合はnilチェックが必要なのか」

# 同記事より
people.sort_by { |person|
  [
    person.age.nil? ? 0 : -1 * person.age,
    person.name || "zzz"
  ]
}

「ソート条件を複数渡したいことはたしかにありますね」「gemを入れて使おうとまでは思わないけど、Rubyにこの機能が標準で入ったら使ってみてもいいかも」

参考: Enumerable#sort_by (Ruby 3.1 リファレンスマニュアル)
参考: 複数キーのソート Enumerable#sort (昇順・降順のみ、昇順・降順混在) - 別館 子子子子子子(ねこのここねこ)はてブロ部

🔗 RBSでRubyの型を書いてみた感想

つっつきボイス:「joker1007さんの記事です」「neovimにプラグインを入れてRBSを書く、なるほど」「steepでLanguage Serverプロトコルが実装されているって知りませんでした」「RBSを積極的に使う機会がなかなかなかったけど、RBSはもう使っていい時期になったと思います👍」

soutaro/steep - GitHub

🔗 その他Ruby

以下はつっつき後に見つけたツイートです。Fukuoka mruby Kaigi、10周年おめでとうございます🎉

🔗DB

🔗 WebAssemblyでPostgreSQLが動く(Publickeyより)

snaplet/postgres-wasm - GitHub

つっつきボイス:「Wasmでx86仮想マシンを動かして、その上でぽすぐれを動かすんですね、その方が動かしやすそう」「サイズは30MBぐらいですって」「ブラウザ環境がリッチになってメモリやストレージも豊富になってきたことを考えると、現代はWasmの形にするのがポータビリティが高いのかも🤔」

🔗 設計・セキュリティ

🔗 レガシーシステムをDockerコンテナ化する場合に直面した4つの壁


つっつきボイス:「"OSコマンドを利用している部分がある"」「素のコンテナだと欲しいコマンドが入っていないことはよくあるけど、自分なら普通にコンテナにインストールするかな」「自分もそうですね」「Docker的には余分なものを極力入れない方が望ましいというのはよく言われるし、基本的にその通りですが、どこまでやるかは程度の問題かなと思います」

「"ミドルウェアとの密結合"」「smrshコマンドなどでメール受信トリガーにしてスクリプトを実行する、みたいな状況が考えられそうだけど、ミドルウェアをどうしても分離しなければならない事情がなければ自分はそこまで気にしないかも」

参考: smrsh - システム管理コマンドの説明 - Linux コマンド集 一覧表

「"オンライン系とバッチ系の密結合"」「これはRailsもそうなっているし、ある程度の密結合は仕方がないとは思いますね」「オンライン系のソースを修正するとバッチ用のコンテナイメージも更新が必要になる、たしかに」

「プロジェクトの規模や状況にもよるけど、これらの問題を解決しないとコンテナ化ができないというものでもなさそうですね」「いい意味で諦めがあってもいいかも」「むしろ、たとえばCapistranoに依存しているプロジェクトの方がコンテナ化を阻まれそうですよね」「この記事のように徹底的に分離するかどうかは別として、理想のコンテナセットアップとの差を意識しておくというのはいいと思います👍」

capistrano/capistrano - GitHub

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

🔗 Ubuntu Pro(Publickeyより)


つっつきボイス:「Ubuntu Proがどこまで本腰を入れてサポートするのか知りたいところ」「10年サポートって大変そうですよね」「たとえばRed Hat Enterprise Linuxはパッケージで脆弱性が見つかったらRed Hat Enterpriseのチームが中心になって作ったパッチを当ててリリースしたりするんですよ」「お〜」「Ubuntu Proがそれに匹敵するレベルのサービスを提供するのかどうかは今の時点ではわからないけど、そこまでやるとしたらかなり大掛かりになりそう🤔」

参考: Red Hat Enterprise Linux オペレーティングシステム

「元記事を見るとパッケージを限定した形でサポートするんですね↓: サポート対象を絞り込むのはわかる」

Ubuntu Proはサーバ向けとデスクトップ向けを含むすべてのUbuntuのディストリビューションに対応するのに加えて、Apache Tomcat, Apache Zookeeper, Docker, Drupal, Nagios, Node.js, phpMyAdmin, Puppet, WordPressなどの主要なLinuxアプリケーションもメンテナンスの対象として含まれています。
Ubuntuが10年間のメンテナンスを約束「Ubuntu Pro」を発表。個人には5台まで無料提供 - Publickeyより

「お?公式サイトを見るとRailsもサポートパッケージに入ってる!」「ホントだ」「調べてみたらUbuntuにRailsパッケージがありますね」「使ったことなかった〜」「18.04LTS用のRailsのバージョンが4.2.10!」「逆に言えは公式のサポートが終了した古いRailsを使いたいときはUbuntu Proにする手があるかも」「Railsを10年サポートするとしたらスゴい」「リストに載っていないgemまではサポートされないと思いますけどね」

参考: Ruby on Rails | endoflife.date

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

🔗 XMLHttpRequest


つっつきボイス:「これはとてもいい記事👍: XMLHttpRequestやAjaxについての歴史をみっちり網羅している」「これ面白い〜」「XMLに限った話ではないのにXMLHttpRequestという名前になった経緯もありますね」「Ajaxが洗剤の名前から命名されたとは知りませんでした↓」「Ajaxというアーケードゲームもありましたね」「し、知らなかった」

参考: Dish Soap & Powder Kitchen Cleaning Products | Ajax®

「SOAP、JSONP、Fetch API、いろいろ懐かしい」「こういう歴史を他の人が記事にするとまた少し視点が変わるかもしれないと思いました」「ありそうですね」「Winter CGって何だろうと思ったらW3C傘下の団体なんですね↓」

参考: WinterCG
参考: Web-interoperable Runtimes Community Group

🔗 CSS コンテナクエリ


つっつきボイス:「コンテナクエリ?」「記事によると、直近の親要素を指定して子要素のスタイルを定義できる機能のようですね」

参考: CSS Container Queries - CSS: Cascading Style Sheets | MDN

「CSSのセレクタは基本的にグローバルですが、コンテナクエリはそのコンテナがどこに置かれているか、つまりどの要素の子要素であるかによってスタイルを変えられるということですね」「お〜!」「コンテナクエリを"理想的に"使えれば、CSSのコンポーネント化がやりやすくなるはずだと思います」「コンポーネント化は今だとReactでやる人が多いですよね」「コンテナクエリが普及すれば真の意味でCSSが現代化されるだろうという感触はありました」

「コンテナクエリすごいじゃないですか: この機能が5年早く登場していればという気持ちにしかならない」「同じく」「もしもの世界ですけど、ReactやTailwindが普及する前にコンテナクエリが登場していたら主流になっていたかもしれませんね」

🔗言語/ツール/OS/CPU

🔗 AI Programmer

つっつきボイス:「最近バズっているAI Programmerです」「コードの量より入力する日本語の方が多くなったりして」「似たような試みは以前からいろいろあったと思うけど、手軽に使えて精度が向上したならよさそう」

「この種のコード生成って、生成されたコードをユーザーが正しく評価できないと結局使えなかったりしますよね」「おっしゃるとおり」「機械翻訳なんかもそうですよね」「ちょっとした使い捨てのコードなら気軽に使えそう」「"君ならどう書く?"みたいにセカンドオピニオンを尋ねてもいいかも」


後編は以上です。

バックナンバー(2022年度第4四半期)

週刊Railsウォッチ: Turbo 7.2.0リリース、GitLabのDevSecOpsサーベイ結果ほか(20221011前編)

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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