hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

DateとTimeの比較

たまたま、DateとTimeを意図せず比較している処理があったので調べてみた。 Date同士の比較であれば日付があっていれば 等しくなるので当たり前だけど

Date.new(2023, 1, 1) == Date.new(2023, 1, 1) # true

これが片方が Timeの場合

Date.new(2023, 1, 1) == Time.local(2023, 1, 1) # false

一致しないのだけど これはRailsirbで比較しているので zone が設定されていて

Time.local(2023, 1, 1) # 2023-01-01 00:00:00 +0900

になっている。 なので 同一であるためには Tokyoの場合は9時間ずれているので 9時で比較すると 同等とされる

Date.new(2023, 1, 1) == Time.local(2023, 1, 1, 9) # true

そして9時を境に大小比較されるので

Date.new(2023, 1, 1) < Time.local(2023, 1, 1, 10) # true
Date.new(2023, 1, 1) > Time.local(2023, 1, 1, 8) # true

日付だけを考えるとバグを埋め込んでしまう。 全然わかってなかったけどこういう挙動なんだという気づき。

rbenv で Ruby3.0.4のインストールで失敗する

新しいPCにrbenvでRubyのインストールを試みたのですが、エラーになってしまったのですが、 あまり他でみかけない解決方法で解決したのでブログに残しておこうかと思います。

エラーの内容

エラーの内容は以下の通りでopenssl の影響でエラーになってました。

installing bundled gem cache:       /Users/hotoolong/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/cache
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Configure options used:
  --prefix=/Users/hotoolong/.rbenv/versions/3.0.4
  --enable-shared
  --with-readline-dir=/opt/homebrew/opt/readline
  --with-libyaml-dir=/opt/homebrew/opt/libyaml
  --with-gmp-dir=/opt/homebrew/opt/gmp
  --with-openssl-dir=/opt/homebrew/opt/openssl@1.1
  CC=clang
  LDFLAGS=-L/Users/hotoolong/.rbenv/versions/3.0.4/lib
  CPPFLAGS=-I/Users/hotoolong/.rbenv/versions/3.0.4/include

環境変数

RUBY_CONFIGURE_OPTS を設定しているのでうまくいきそうなのですが、エラーになってました。

$ echo $RUBY_CONFIGURE_OPTS
--with-openssl-dir=/opt/homebrew/opt/openssl@1.1

openssl のバージョン

$ openssl version
OpenSSL 1.1.1u  30 May 2023

ちなみにマシンの チップ は Apple M1 Max OS が mac OS Ventura 13.4 M2でも同様のエラーが出ることを確認してるので Mac 以外でも同様の問題になりそうです。

GitHubのrbenv に似たような情報

github.com

調べていくとGitHubに解決できる情報がありそうかなと思ったのですが、 LDFLAGS と CPPFLAGS を設定すると解決したような内容になっていました。 私のケースでは駄目でした。 で以下で対処して解決するのですが、その場合もこれらの環境変数は不要でした。

brewでのインストールされているopenssl

$ brew list | grep openssl
openssl@1.1
openssl@3

openssl@1.1 と openssl@3 両方がインストールされている状態でした。 今回のケースでは駄目かもしれないと思い 一旦 openssl@3 をアンインストールしてみました。

依存関係があるケースもあるので、 brew uninstall --ignore-dependencies openssl@3 でアンインストールします。 私の環境では 3.1.1 が インストールされていましたが、 3系の他のバージョンもインストールされている場合は brew uninstall --force openssl@3 ですべてアンインストールしておくことをお薦めします。

brew でインストールされている opensslが1.1系だけになっていることを確認します。

$ brew list | grep openssl
openssl@1.1

再度 install

この状態で 再度 rbenv install 3.0.4 をするとインストールが完了しました!

ということで インストールしたい openssl 以外のバージョンが影響するケースがあるようなのでアンインストールしてからインストールするとインストールできるということでした。

ちなみに

エラーになる状態で 3.0.4の次のバージョンの3.0.5 をインストールすると エラーは出ずに インストールできました。 手元で 3.1.4 も大丈だったので 3.0.5 以降で何かしらの変更があり今回のエラーが出ている模様です。

過去のバージョン(3.0.0, 3.0.1, 3.0.2, 3.0.3) を確認したところエラー内容は違っていますが、同様にインストールできなかったので、 opensslが 1.1 と 3 をインストールしてしまっていると3.0.4 以前のバージョンはダメそうでした。 (2系は確認してないです。) インストール失敗している場合は opensslの1.1系と3系が入っていないか確認しておくといいかもしれないです。

RubyKaigi2023の動画が公開

RubyKaigiから早くも1ヶ月経ってしまった。 その間に クックパッドが今年3回目の人員削減。110名を対象 を発表していた。

gamebiz.jp

業界ではかなりの衝撃があり、以前の2回ではエンジニア、デザイナは対象になっていなかったが、 今回は対象になっている。

ここ数年のIRの情報も芳しくなかったこともあり、主力事業の低迷、新規事業もまだそこまで伸びてない中 クックパッドほどの会社でもそうなっていくのかという駄目なのかもしれないとは思ったのものショックも大きいnewsになった。

ところで、昨年のRubyKaigiは動画の公開がかなり遅かったけど今年は1ヶ月で公開されていて、 これは見なければと唸っている。

www.youtube.com

現地にいると見たいセクションが重なってしまって参加してなかったセッションが賑わっているとそっちを見るべきだったかと思う場面もあったので こんなに早く見れるようにしてくれて大変感謝している。

RubyKaigi 2023 Day3 の感想

感想

Day3 最後日になってしまった。 今まで参加したRubyKaigiで一番良かったように思うし、 今回のRubyKaigiで知り合えた人が過去1だったように思う。

前日の続きのスタンプラリーの残りのブースには結局行かず、 聞きたいセッションと話したかった人を探してお話することをメインで過ごした一日だった。

お会いして話ができる場があるということはかなり貴重な機会であるし、 励みにもなるなと改めて実感できる。

ランチでは昔の職場の同僚と過ごす機会もあり、懐かしいメンツの活躍を感じられて同窓会のようでもあり本当にRubyKaigiすごいなとしみじみと感じた。 スタッフの皆さんや運営している方々には感謝しかない。 Rubyに支えられてRubyのおかげでなんとか生きている。

それをRubyKaigiでRubyの文化を感じてみんなで醸成させている。 すごいぜRuby

来年は沖縄ということなので来年も参加してみたいしもう少しRubyに貢献したいな感じた。

Kaigiが終わって After partyに参加して ぼっちになりそうなところを igaigaさんに助けてもらい。 いつもお世話になってばかりで本当にありがたかったです。

参加セッションのまとめ

あとは参加したセッションを簡単にまとめておく

Ruby Committers and The World

思った以上に英語で聞き取れないこともおおく動画が公開されたら見てみたい Shopify のメンバーが存在感がすごいという印象で yjitがここまで性能改善できてきているのが本当にすごいという思った

Gradual typing for Ruby: comparing RBS and RBI/Sorbet

SorbetはSteepに比べると性能がいいので開発者体験が高いのはわかりつつも RBSからRBIを生成して管理していくのはかなり辛いなという印象

Ruby + ADBC - A single API between Ruby and DBs

FlightSQLがPostgleSQLで使えるようにしたので active_recordのアダプターを作れば実際に使う人が増えそうな感じはしつつ MySQLであれば嬉しいなとどこかで感じてしまっている。MySQLのアダプターとしてTrilogyが公開されたしアダプター作り直しって本当にすごいこと

Ruby JIT Hacking Guide

RJITということで YJITだけでなく Rubyでバイナリコードを変換していくアプローチを取っている。 なるほどというのもそうだけでYJITでのノウハウをRubyで再現して持っていっている国分さんがすごいな

Let's write RBS!

自動生成のRBSと手動作成のRBSをマージする手段を提供しているアプローチがとてもよく感じだ。 でもも簡潔でRBSでの開発の助けになりそうだった

Parsing RBS

RubyのParserだけはなく RBSのParserの話 こちらは Rubyで実装されているのでコードも読める。 いろんなアプローチがあってRubyよりは複雑ではないけど、Parserの大変さが伝わった。 LSPつくるのは大変だ

見ることができなかったセッションの動画いつ出るのだろう楽しみにしておこう

RubyKaigi 2023 Day2 の感想

感想

今日はDocker Tシャツを来て参加。 中の人ではないのですが、紛らわしかったのか.. ブースで中の人ではないですよね? と聞かれてしまい。。ややこしくてすみませんという感じだった。

スタンプラリーが始まったので、回っていたが残り6箇所は明日に行ってみて見ようかと思う。 M3さんがRubyの問題を出していたのがかなりいい問題だったので為になるな〜と ?の後ろに文字列を設定すると文字列にしてくれる。 普段コード書いているシーンでは使い所がほぼ無いのか全く知らなかった。 ?\は無理なようで ?\u0041 みたいに UTF-8 を設定できるので \ を?で文字列にする場合は ?\u005c で文字列にできそうな この仕組を使って ?|||?| みたいな記号をつなげて 何が返却されるかというような問題を出題していた。 すごい。

MedPeerさんはアルコールパッチテストができるシールを配布してくれていたので、 自分のお酒の弱さを再認識できましたw

Wantedlyさんは TECHBOOKが配布されており、面白い取り組みをしているな〜と ブースもRubyKaigiの醍醐味ですね。

参加セッションのまとめ

参加したセッションを簡単にまとめておく

Learn Ractor

制約が強いので利用シーンが限定される 計算処理などで並列化することで処理速度を上げる使い方は有益そう

Implementing "++" operator, stepping into parse.y

++を実装するのに どのようなアプローチで parse.y へ実装していったかの try and error に関して発表してくれていて 貴重な話だった しおいさんと話をする機会があればと思っていたがまだ、、明日タイミングが合えば話をしたいなと..

RubyGems on the watch

cdnを使った巧妙な脆弱性アタックに対応していた話。 これはなかなか見抜けないな

Revisiting TypeProf - IDE support as a primary feature

今回一番聞きたかったセッションで TypeProf v2 となり パフォーマンスがかなり改善されている話 dataflow graph に型情報を流し込んで使うという 導入されるのが楽しみな機能

Multiverse Ruby

namespaceにmoduleのtemporary領域を使って実装するという話。 以前から気になっていた namespace問題がこれによって解決できるかもしれない! まだまだ実験的で rbsなどの他の機能に影響がありそうなので今後どうなるか見ておきたい。

Hacking and profiling Ruby for performance

ISCONなどでパフォーマンス測定したり改善するにはどのようなアプローチをしていくかという話 スレッド待ちのPRを送っていたりしてISCONでもRubyを使う人が今後増えるかもしれない

The Second Oldest Bug

Sizeの大きな Hashを展開して 大量の引数としてメソッドに渡されると落ちるという問題 改善へのアプローチ方法を説明してくれた途中よくわからない箇所が多かったが楽しめて聞けた Secondということは もっと古いのもいるってことなのか。。 Fiberのensure問題なのかな? Bug #595: Fiber ignores ensure clause - Ruby master - Ruby Issue Tracking System

Optimizing YJIT’s Performance, from Inception to Production

YJITのパフォーマンス・チューニングのベンチマークを取りながらやってきた取り組みと データに基づいた意思決定を行い、原因追求していった経緯を説明してくれました。 3.3で更にパフォーマンスがよくなるそうです。 実際につかってパフォーマンスが上がらないケースは教えてほしいという話でした。 今後の展開は見逃せないです。

明日は最終日です。楽しんで行きたいと思います。

RubyKaigi 2023 Day1 の感想

感想

久しぶりに現地参加してみて、やっぱり実際に人とあって参加するのは楽しい。 一方的に私は知っているけど相手は私のことを知らないCommiterの方々が近くにいたりして私からは話しかけられなかったりするのだが、それはそれで楽しめる。

何よりいいのは久しぶりに一緒に仕事をした人たちと会えるのが、同窓会のようで楽しかったり、そこから紹介してもらった人と知り合いになれたりするのも醍醐味の一つだなと。 よく考えるとリモートで仕事はしてたけど実際に会うのは初めてだった人がいたりするのもいい。 リモートはリモートの良さがあるけど、現地で楽しめるので毎年でなくても数年に一度は参加したいなと。

言い訳のようにカンファレンスのタイミングで英語勉強せねばなということは付いて回るものの、Rubyで仕事できていることを考えると何かしら貢献できるようにしておく必要があるなと今回は特にしみじみと感じてしまう。

3並行で実施されているので今回参加できなかった話も聞いてみたいけど、公開されるのは随分先になるのかな運営さんが大変なんだろうと思いつつ楽しみにしておこうかと思う。

参加セッションのまとめ

参加したセッションを簡単にまとめておく

Matz Keynote

Rubyの歴史の話から型定義の未来に付いて 型宣言を書くことをしなくても型チェックをするという未来を作りたいという話はとてもよかった

The future vision of Ruby Parser

新しいParserへの置き換えで大変だったポイントをまとめてくれた。 かなり難しいと感じるないようだったけど今後LSPにも活かされそうで楽しみ。

Make Regexp#match much faster

memo化を導入することによってReDoSを回避する話 memo化を適当できないシーンもあるので今後改善を考えているという話

"Ractor" reconsidered

複数のRactorの管理下で大幅にSpeed upしている。 これは久しぶりにどこかに適応してみたい。

Power up your REPL life with types

irbで型情報を使った補完を実現している。Parserの話と被っているところもあってなかなかおもしろかった。 普通にエディターで使えると嬉しいなー

Lightning Talks

いろいろ為になる話もあったけど、ドラムで時間がなくなって焦っている感じるがRubyKaigiだなーという。 demoなどをLTでやると動かないとかあったりで大変w

明日もあるのでRubyKaigiを楽しんできます。

Neovimの設定ファイルを init.lua に置き換えた

以前から少しずつ luaに置き換えていたのですが、やっと概ね動くところまで置き換えれました。

なんとなく書いていた vimscript や プラグインの設定も見直すことができて理解度はかなり向上したのかなと まだ思うように動作しなくて納得いかないところもあるので設定を見ながら改善できるところは見直して行きたいかなと思いつつ変更したものを以下にまとめておきます。

主な変更点としては

Plugin manager

  • vim-plug → plugfolke/lazy.nvim

Fuzzy Finder

  • coc-fzf-preview.nvim →

    • telescope.nvim
    • telescope-live-grep-args.nvim

LSP

  • coc →

    • nvim-lspconfig
    • mason.nvim
    • mason-lspconfig.nvim

補完

  • nvim-cmp

diagnostics

  • ale.vim
    • null-ls.vim
    • jay-babu/mason-null-ls.nvim

statusbar

  • lightline -> lualine

snipet

  • SirVer/ultisnips → hrsh7th/vim-vsnip

tagbar

etc

などなどいろいろダイナミックに変更してしまったので、気に入らなくなってなにか別のものを探すかもしれないけどしばらくこれでやっていこうかなと、 また個別に発見したことなどはブログに書ければいいかな。 明日からRubyKaigiで、今年はリアルに松本で参加しているので楽しんで来ます〜その内容も書ければ書いていきます〜