diary

I like Hatena Star with a text selection.

2024-03-16

github.com

github.com

activerecord-originatorベンチマークスクリプトを追加した。

これを追加したことによって、どの程度パフォーマンスが劣化しているかが分かった。単純に#to_sqlを呼び出す場合で3倍ぐらい、実際にselectクエリを発行する場合でも2倍ぐらいの速度差が出ていた。クエリを発行しているのはメモリ上のsqliteだし、レコードも100件しか作っていないからあまり現実的な比較ではない。


github.com

activerecord-originatorの速度改善をした。今まではすべてのNodeを拡張してinitialize時にcallerを保存していたのだけど、これをクエリに位置情報を差し込みたいNodeだけ拡張するようにした。

これによって、#to_sqlは71~78%程度、クエリの実行は84~86%程度の速度劣化に抑えられた。

これだけ速度劣化が小さく出ていれば、実アプリケーションに入れたときの速度差は気にならないぐらいになっていそう(たぶん)。単純なクエリ実行の例だと、1回あたり0.02ミリ秒しかオーバーヘッドが乗ってない計算になりそう。

この変更を入れたのでv0.2.0をリリースした


github.com

そういえばIS NULLとかを考えていなかったな、と思ってテストを書いてみたら、特に何もせず通って便利だった。 すでに実装は済んでいたけど、テストがあったほうが後々嬉しくなる可能性がありそうなのでテストだけ追加した。


where("title LIKE ?", "%#{title}%") みたいなやつの対応を考えていたのだけど、むずそう。

これはSqlLiteral nodeとして扱われるのだけど、このNodeが特殊で、どうやら作られるタイミングは#whereが呼ばれるタイミングではなく#to_sqlが呼ばれるタイミングっぽい。それだとこのnodeのinitializeにhookしてもほしい位置情報が取れなくて困る。

いい解決方法あるかなあ。あんまり思いつかない。whereメソッドを上書きして…とかやればできるだろうけどやりたくないよねえ

2024-03-13

activerecord-originator という gem を作った。

github.com

pocke.hatenablog.com

dev.to

めっちゃArelの内部構造に依存しているのだけど、デバッグのヒントを得るツールとしては便利なのではないかと思っている。

ただ常時出しておくと鬱陶しい気もしていて、使いたいときだけピンポイントでインストールするような使い方が良いのかなあと思ったりする。でもそれだと存在を忘れるんだよなあ。

1,2時間ぐらいで仕様や実装方法を検討して最低限コメントが出るプロトタイプまで作った。 その時のコードがこれ https://gist.github.com/pocke/9167bcdb8c13f7550da4ab322b99c229

そのあとちまちまコードを書いてgemとして公開した。思い立ってから2日でリリースまでこぎつけた。

default_scopeで追加された条件が分かりづらい、というところからスタートしていたので、最初は「default_scopeで追加された条件があればそれを分かりやすくする」という仕様を考えていた。しかしそれならより汎用的に対応したほうがいいよなあと思って今の形にした。一応deafult_scopeを条件にコメントとかを差し込めないかもコードを眺めてはいたけれど、それを見つける前に方針転換してしまった。

実際流行るかというと、どうだろうねえ。わりと"発明"なんじゃないかと思っているし、ハマるケースでは確実にめちゃくちゃ便利だとは確信している。とはいえ結構ログがデカくなるのうざいし、正直真に理解が難しいようなクエリがどの程度あるのかは微妙なところだなあと思っている。クソデカ検索条件クラスとかと戦うときには便利そうだけど、シンプルなRailsアプリのふつーなCRUDアクションとかだと無駄にクエリが読みづらくなるだけかもしれない。

これがデバッグに有用な情報であるという点には100%の自信があるのだけど、今の見せ方が最適かというと全然そうは思っていない。もっとnoisyじゃなく見やすくて役立てやすい見せ方が実現したほうが嬉しいと思うけれど、あんまりアイディアはない。

ちなみに実アプリでは(動作確認で一通り動くことは見ているけど)導入はまだしてないです。導入してみるかなあ

お野菜とかによくある「私が作りました」をイメージして作っていた。そんな感じの名前にしたかったけど、いい名前が思いつかず、GPTにいくつか候補を聞いた中からいい感じだなと思ったoriginateという単語を使ってみた。

Twitter(現X)とか英語版記事とかに書いたのだけど、こういう「SQLの各部分に対するデバッグ情報を出す」ツールって今まであったのかなあっていうのが気になっている。なんか知っている人がいたら教えてください。

思いついたコンセプトを、自分ではめっちゃいいと思いこんで興奮しながら、シュッと実装するという行為を久々にできて楽しかった。こういうの大好き


github.com

irb に issue を立てた。ダークサイドに落ちた人しかハマらなさそうな問題を踏んでいた。


久しぶりにこの日記を書いた。引っ越しで環境が変わったりしたのもあって、日記を書く習慣が途切れていた。本来日記のpublishはラズパイで自動化されているのだけど、そのラズパイをまだセットアップしていないから手動でのpublishになってしまっている。

2023-06-26

twitter.com

FF16の体験版をプレイしていた。

ストーリーはちょっと気になるけど、ゲームシステム的にはあまり面白さを感じれなくて、「すぐに本編買うぞ!」という気持ちにはどうにもなれなかった。 セールで安くなってたら買ってもいいかなあ……

2023-06-22

ここ最近は引っ越しを考えて色々動いていたのだけど、ついに賃貸の審査が通って引っ越しが確定した。

引き続き県内ではあるけど、少し離れた地域に移る。

これから待っている山のような手続きを考えると心が死んでいく。

2023-06-02

しばらく前に東京に行っていた。

泊まった宿の家具の配置が少し不思議だった。

不思議な配置の部屋

ベッド脇の机に埋め込まれたラジオが古めかしくて良かった。音量つまみを最大にしても音がかすかにしか流れなかったのだけど、しばらく試した結果音量つまみをうまく接触がいい位置に合わせるとちゃんと音が出るということに気がついて無事ラジオを聞くことができた。

年季の入ったラジオ