Ruby 3.2.2がリリースされました

Ruby 3.2.2がリリースされました

https://www.ruby-lang.org/en/news/2023/03/30/ruby-3-2-2-released/

あわせて旧バージョンも更新されています

リリースノートにある通り、更新内容はいずれも脆弱性対応のセキュリティパッチなので、速やかにアップデートするのを推奨。
今回修正された脆弱性は、ReDoSで、正規表現脆弱性をついて計算量を増大させ、計算リソースを枯渇させる攻撃となっている。

参考: 正規表現の脆弱性「ReDoS」徹底解説 ~原理と対策から、Perlでの最適化まで(1)

正規表現で文字列をパースする処理は一般的なので、具体的にどういった修正をしているのか見てみると、こんな感じ https://github.com/ruby/time/commit/3765d119ca03db067f9cd292752389983e2821eb

ちょっとよくわからないので夜にまた調べてみよう...

余談だが、Ruby 2.7.xは、

After this release, Ruby 2.7 reaches EOL. In other words, this is expected to be the last release of Ruby 2.7 series. We will not release Ruby 2.7.9 even if a security vulnerability is found (but could release if a severe regression is found).

とのこと。これでRuby 2.x系は絶えたことになる。お世話になりました。

Ruby浦島記 この5年でRubyに起こったアップデートまとめ

仕事で実に5年ぶりにRubyを触ることになったので、この5年でどんなアップデートがあったのかをキャッチアップついでにまとめてみようと思う。

TL,DR

  • 2.6.0から最新の3.2.0までリリースノートを読んでみた
  • 2.xは2.7.xで終わり、3系になった
  • JITを使った高速化や型の静的解析ができるようになった
  • 3系ではキーワード引数と普通の引数が分けられたのが大きなBreaking change
  • パターンマッチやハッシュの値の省略記法など他の言語に実装されている機能が取り入れられた

Rubyのバージョンアップについて

普段Rubyを使っている人にはわざわざ書くまでもない情報だが、Rubyは毎年クリスマスにアップデートがあり、新しいMINOR(MAJOR)バージョンがリリースされる。
ref: Ruby 2.1.0 以降のセマンティックバージョニングについて

また、ノーマルメンテナンス(不具合修正)が行われるのはほぼ直近2世代、セキュリティメンテナンス (脆弱性の修正)が行われるのは直近3世代までで、リリースから3年と3ヶ月強(リリース後3年経った翌3末)にEOLとなる。

直近のRuby Lifecycle Timelines
直近のRuby Lifecycle Timelines
Ruby ブランチごとのメンテナンス状況 より引用

つまり5年間経つと5世代の更新が発生していることになり、だいぶ差があるのではないかと予想される。
ちなみに筆者が最後にRubyを触っていた2018年は2.5.xが最新であった。

リリースノートを追ってみる

2018-12-25 Ruby 2.6.0

www.ruby-lang.org

2.6で取り上げられているアップデートは、

  • JIT [Experimental]
  • RubyVM::AbstractSyntaxTree [Experimental]
  • 主要な新機能
    • Kernel#yield_self の別名として then が追加
    • ASCII以外の大文字でも定数を定義出来るように
    • 終端なしRange
    • Enumerable#chain と Enumerator#+ が追加
    • Proc#<< 、Proc#>> が追加
    • Binding#source_location の追加
    • Kernel#system にexception: オプションを追加
    • Coverage の oneshot_lines モードの追加
    • FileUtils#cp_lr が追加
  • パフォーマンスの改善

となっている。
そういえばRubyJITを取り入れる話やASTを出せるようになる話を聞いていたなーと懐かしく思った。
2.6でExperimentalで導入されたあとJITがどうなったのか調べたい気持ちになった。
あと、 その他の注目すべき 2.5 からの変更点 の項目で記載されているけど、Bundlerが標準添付されるようになったとか、--ri と --rdoc オプションが変わったとかは以前からRubyを触っていた人にとっては結構印象深い変更ではないだろうか。
参考にさせていただいた記事

2019-12-25 Ruby 2.7.0

www.ruby-lang.org

2.7で取り上げられているアップデートは、

  • Pattern Matching [Experimental]
  • REPL improvement
  • Compaction GC
  • キーワード引数を通常の引数から分離
  • 主要な新機能
    • 番号指定パラメータ
    • Enumerable#tally が追加
    • レシーバをselfとしてprivateメソッドを呼び出すことが許容
    • Enumerator::Lazy#eager が追加
  • パフォーマンスの改善

となっている。
界隈の反応を見るに、パターンマッチングが取り入れられたというのが目玉と見て良さそう。
あと3.0に向けてキーワード引数の取り扱いに手を入れられたようだ。
リリースノートでは取り上げられていないが、個人的には全ての引数を受け取る ... 引数が追加されたのは便利そうだなぁと感じた。(ref)

def foo(...)
  bar(...)
end

Rubyで親クラスのメソッドをオーバーライドして処理を追加してsuperを呼びたいときに、superがどういう引数の受け取り方をしているかいちいち調べないといけなかったが、 ... 引数を使えばそれを考えるのを省略できそう。
ちなみにRuby 2.7.0はちょうど今月(2023/03)末でEOLとなるので、今後は3系しか使えなくなる。

参考にさせていただいた記事

2020-12-25 Ruby 3.0.0

www.ruby-lang.org

3.0で取り上げられているアップデートは、

  • パフォーマンスの改善
    • MJIT
  • Concurrency / Parallel
    • Ractor (experimental)
    • Fiber Scheduler
  • 静的解析
  • その他の主要な新機能
    • 1行パターンマッチが再設計された (experimental)
    • findパターンが追加 (experimental)
    • 一行メソッド定義が書けるようになった
    • Hash#except が組み込みに

となっている。
Ruby2.0.0-pのリリースが2013/02/24だったので、実に7年以上ぶりのメジャーアップデートとなった。
自分がRubyを使い始めた2013年がちょうど1.9.3から2.0.0への過度期だったなぁと懐かしい気持ちになった。
5年前時点ではRuby 3.0では型推論が入るとか型が入るとか *1もろもろ騒がれていたけど、最終的に静的解析に落ち着いたのかな(もしくは自分がキャッチアップできていなかっただけで最初から静的解析の話しかなかった?)
メジャーバージョンがあがってbreakingな変更はキーワード引数と通常引数の分離がよく挙げられている印象。
2.xでは雑にhashをメソッドに渡せばよかれに色々やれてたのが便利ではあったけど、正されたのね。

参考にさせていただいた記事 - Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート - サンプルコードでわかる!Ruby 3.0の主な新機能と変更点 Part 2 - 新機能と変更点の総まとめ - jnchitoさんの記事がQiitaからZennに移行されましたね - アプリケーションをRuby3にあげるときにやること

2021-12-25 Ruby 3.1.0

www.ruby-lang.org

3.1で取り上げられているアップデートは、

  • YJIT: New experimental in-process JIT compiler
  • debug gem: 新しいデバッガ
  • error_highlight: バックトレース中の詳細なエラー位置表示
  • IRB のオートコンプリートとドキュメント表示
  • その他の主要な新機能
    • ハッシュリテラルやキーワード引数の値が省略可能に
    • パターンマッチ中のピン演算子に任意の式を書けるように
    • 一行パターンマッチで括弧が省略できるように
    • RBS、TypeProfのアップデート

となっている。
2.6でJITが取り入れられて以来Ruby 3×3として高速化が試みられてきたけど、Railsのようなアプリケーションの高速化は達成できていなかったのがここに来て改善できたということらしい。
ここに来て急にデバッグ周りの改善が入ったのも浦島的には謎。何があったんだろう?
個人的には ハッシュリテラルやキーワード引数の値が省略可能に なったのがとんでもない変更だと思う。Rubyistたちはこの無駄な文字列の繰り返しを無限に書き続けてきたのではなかろうか。

x = 1
y = 2
z = {x:, y:} # {x: x, y: y}

def foo(x:, y:) # foo(x: x, y: y) 
end

ただ、バージョンによって動かなくなっちゃうと思うので各種Gemではまだこの書き方は浸透させられない気もする。

2022-12-25 Ruby 3.2.0

www.ruby-lang.org

ここでようやく直近のアップデートまで来た。
3.2で取り上げられているアップデートは、

  • WASIベースのWebAssemblyサポート
  • 実用段階になったYJIT
  • ReDoSに対するRegexpの改善
  • その他の主要な新機能
    • SyntaxSuggest
    • ErrorHighlight
    • 匿名の可変長引数と可変長キーワード引数が引数としても使えるように
  • 新たなコアクラス Data が追加

ここにきてWebAssemblyかーと思ったけど、WebAssemblyをマルチプラットフォームな実行環境として使うっていう試みはRubyじゃないどこかで確かに見た気がする。

新しいコアクラスのDataは今までActiveModelを使って実装してた値を持つだけのクラスを簡単に用意できそうだなっていう印象。今までもStructでできたと思うけどimmutableだったりするらしいので、環境変数やらどこかやらからロードした設定値を持っとくだけのクラスとかを作るのに使えそう。

あと Dir.exists?File.exists? が削除されたってマジ?と思ったらだいぶ前からDir.exist?File.exist? 使えっていうことになってたのね。
チケット見たら3.0.0で消したら?って提案されていたのに3.2になったぽい。多分それくらい忘れられてたってことなのかな。

浦島的まとめ

  • キーワード引数の取り扱いについては認識を改める必要がある
  • JITで高速化されて、実用的なレベルに達した
  • 型については静的解析ができるようになった

ということで思ったより大きな変化は正直なかったのかなと思う。
もろもろ全然変わっていて以前の知識じゃついていけないということはなさそう。
このあたりはPython2 -> 3 が人類にもたらした後方互換性を諦めると色々終わるという知見がエンジニアの脳裏に刻まれているんだろうなって気がする 笑

*1:もともとRubyには最初から全てのオブジェクトに型(クラス)があるのだが

Homebrewからpostgresqlがなくなった?

タイトルは釣り気味

TL,DR

経緯

PCを新調したのでHomebrewでPostgreSQLを入れようと思ったところ

$ brew install postgresql
Warning: No available formula with the name "postgresql". Did you mean postgresql@13, postgresql@12, postgresql@11, postgresql@15, postgresql@10, postgresql@14, postgresql@9.5, postgresql@9.4, postgrest or qt-postgresql?
postgresql breaks existing databases on upgrade without human intervention.

See a more specific version to install with:
  brew formulae | grep postgresql@

No available formula with the name "postgresql" ってそんな馬鹿な。
何度もtypoを確認したけど間違っていない。
よくよく見ると、

postgresql breaks existing databases on upgrade without human intervention.

See a more specific version to install with:

brew formulae | grep postgresql@

どうやらバージョン指定しろってことらしい。

Homebrew本家を確認してみる

試しに https://github.com/Homebrew/homebrew-core/tree/master/Formula を見てみたけど本当にない*1。 もう少し経緯を知りたくてリポジトリを探してみたらそれっぽいPRを見つけた。

github.com

どうもpostgreを(バージョンを指定していないがために)メジャーバージョンアップする度にぶっ壊れていたらしい。

PostgreSQLはメジャーバージョンアップの度に壊れるのか?

ちょっとググるだけで、

qiita.com

carefree-se.hatenablog.com

amateur-engineer.com

こんな話がゴロゴロ出てくる。
どうやらPostgreSQLはメジャーバージョンアップのたびにマイグレが必要なものらしく、本家からツールも提供されている。

www.postgresql.org

まとめ

  • PostgreSQLをhomebrewで入れるときはバージョンを指定して、 brew update で環境が壊れないようにすべき
  • というか、今ならDockerで動かすべき

余談

なぜか原因は追えていないが、お古のPCのHomebrewでは自動的に最新版*2が入る... 🤔

$ brew install postgresql
Warning: Use postgresql@14 instead of deprecated postgresql
==> Fetching dependencies for postgresql@14: krb5
==> Fetching krb5
(以下略)

一応Homebrewのバージョンは同じなのだが、最新のHomebrewをインストールしたものとアップデートして最新になっているHomebrewとで何かが違うのかもしれない

*1:巨大すぎてGIthub上では全てのファイルが表示されないので、ローカルにcloneしないと探せない

*2:本当は現在の最新は15のハズだが入るのは14

TechFeed Experts Night#14まとめ

TechFeed Experts Night#14 〜 絶対役立つ!最先端のCSS総ざらい

techfeed.io 久々にCSSを触らなきゃいけなくなったんだけど、CSSを自分が触らなくなって5年近く経っていて界隈なにか変わったのかなーと思っていたところで、ちょうどいいイベントがあったのでオンラインで参加してみた。

記事投稿時点ではまだのようだが、配信アーカイブが公開される予定とのこと。
見つけられた公開資料についてはリンクを記載しているのでぜひご覧ください。

以下、各セッションコメント

今までああ書いてたアレ、これからはこう書けそう @yoshiko_pg

諸事情によりビデオセッションとなったとのこと
記事投稿現在資料見当たらず

新しいcssプロパティや書き方の紹介。
個人的にはメディアクエリの @media(max-width: xxxpx)@media(width <= xxxpx) みたいな式で書けるようになったのは使うかも、と思った。
フロントエンドエンジニアだと慣れてて気にならないのかもしれないが、使うたびにminとmaxどっちだっけ、ってなってた。

他にも実用的なものをたくさん紹介されていたので、セッションのアーカイブ公開が待たれる。

Custom propertiesのセレクタの省略と詳細度の分離 @kojika17

twitter.com

Custom propertiesを使うと記述が減るよ、という話。
みんなが気になったのは既存のscssをCSS変数化するときはChatGPTを使ってたところだと思われるw
テンプレートを与えて特定の文書を別な文書に書き換えるみたいなことはChatGPTが得意で、今後はAIに任せるのが主流になるだろうとのこと
自分はエクセルにcsv貼ったらよかれに列分割して可視化するとこまでやってくれるみたいなイメージ湧いた。今後マーケターの仕事は"考えること"に注力されていきそう。
話を戻すと、セッションで紹介されていた通り、!import祭りを回避できるのは非常に有用だなと思った。

更にどうでもいい話しちゃうとプレゼンに使っているライブラリ?これいいなぁと思った。

全ブラウザ対応したcontainer queryは何がスゴイのか?@tonkotsuboy_com

twitter.com

新しく追加されたcontainer queryについて。
従来のmediaクエリは画面全体(ウィンドウサイズ)を基準点としていたが、任意の要素(コンテナー)を基準にmediaクエリのようなものを書ける機能。
従来のmediaクエリだけだと簡潔なクエリで記述できないときに使える。
直近FIrefoxでサポートされて全ブラウザで使えるようになったとのこと。
正直デモと記事をみないと何を言っているのかわからないと思うので資料を見て欲しい 🤣
より詳細な解説がzennの記事にもなっているので、そちらも合わせて参照されたし。

昨今のコンポーネント単位で管理していく指向にも合致していて大々的に使われるようになっていきそうと思った。

State of CSS 2022に見るアクセシビリティ関連機能 @kazuhito

twitter.com アクセシビリティを考慮するプロパティがこんなにあることに驚いた。
が、ここまで考慮したサイトを最初から作るってかなり特殊なケースだろうし、実際あまり知られていないのよな。
ダークモードに関するもの以外はまだしばらくは使うことはないだろうなと思った。

CSS Animation パフォーマンスを考える原理 @tetracalibers

※記事投稿現在資料見当たらず

CSS Animationタグの描画処理方法を元にどういう風に書くと重くなってしまうかといった解説とその対処法の発表。
自分はサーバーサイドのエンジニアなので、読み込みパフォーマンスの観点はあっても、描画パフォーマンスの観点でcssを考えたことがなかったので非常に勉強になった。

個人感想まとめ

あまり変化がないのではと思っていたcss界隈だったけど全く違って進化は続いていた...
こういうアップデートってどこから情報仕入れるのか調べないとな

フリーランスとして独立した

ご無沙汰してます。
自分は2012年4月に新卒で社会人デビューを果たしたので、今が10年目になるわけですが、
この機に、10年間続けてきた正社員という立場に別れを告げフリーランスとして独立することにしました。
前回の転職が2018/09(※1)だったので実に4年半で歴代最長記録。前職では大変お世話になりました。

TL;DR

  • 現職を退職しました
  • 今後は当面フリーランスをやります
  • 良さそうなビジネスアイデアが見つかり次第、新しいビジネスをやっていきたい
  • このブログの更新を再開します
なぜフリーランスなのか

色々な観点があるが起業に向けた準備をしたいという理由が最も端的かなと思う。
スタートアップ界隈に長く籍を置く中で、自分ならああしたいこうしたいという理想が年々強くなり、
それを全て実現するには自分で会社を作るしかないというところまで考えるようになってしまっていた。

フリーランスで起業と言っても開発の業務委託なら正社員と変わらないのでは

できることなら新しいビジネスを始めたかったが、肝心な事業の具体的なアイデアが今あるわけではなく、
取り急ぎ独立して事業のアイデアを見つける時間が欲しかったというのが正直なところ。
自分は、(全く意図していないのだが)とある業界(※2)に関わることが非常に多かったので、
今までとは違った業界を見ることができるところに関わって、ビジネスのアイデアを探す糸口になればと考えている。(※3)

今後どうするの?

フリーランスとして独立と言っても、当面は業務委託契約でアプリケーション開発に携わっていくので実作業はそんなに変わらない予定です。
起業と言ってもVCから資金調達してEXITを目指すような事業ではなく、技術的もしくはユーザー体験的に面白そうな案件の受託やそのノウハウのビジネス化を考えていきたいなと思っているので、
今後1,2年をかけて法人化とアイデア探しをじっくりやっていきたいと思っています。
このブログについても2017年から更新が止まっていましたが、更新を再開していこうと思うので引き続きよろしくお願いします!



※1 正確には8末入社
※2 FinTech、またお前か
※3 関わったところの競合を作りたいわけではない。とある業界にこういう悩みがあるなら隣の業界にはこういう悩みがあるはず、といった観点