MySQL でクエリ単位のタイムアウトを仕込む #mysql
やりたいこと
MySQL で重い可能性があるクエリを投げるときに、一定時間以上かかったら、タイムアウトとしてキャンセル用にしたい。
解決策
MySQL のシステム変数でタイムアウト関連の設定をいじるという手もあるが、max_execution_time
をオプティマイザヒント句に埋め込むことで簡単にクエリ単位で動作させられる。
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM hoge_table;
max_execution_time
はミリ秒単位の数字で設定できる。
実行時間が超えてしまった場合には下記のようなエラーが返ってくる。
Error running query: Query execution was interrupted, maximum statement execution time exceeded
手軽に使えるので、とりあえず検証用とかでクエリを流したい場合なんかに活用できそう。
参考
Rails + MySQL で半角全角区別なく検索したい #rails #mysql
問題
文字列のあるカラムに対して、半角全角や大文字小文字を区別なく検索したい場合がある。
(例) ABC
で検索した場合に、ABC
や abc
もヒットしてほしい
COLLATION を使う
MySQL の場合、照合順序(COLLATION)の設定で実現できる。
charset が utf8mb4 の場合、utf8mb4_unicode_ci
を使う。
COLLATION | 大文字小文字 | 半角全角 |
---|---|---|
utf8mb4_general_ci | 区別しない | 区別する |
utf8mb4_unicode_ci | 区別しない | 区別しない |
utf8mb4_bin | 区別する | 区別する |
COLLATE 句を使う
テーブルやカラムに対しても設定できるが、 COLLATE 句を使うことで、SQL レベルで照合順序を上書きすることが可能。
これにより影響範囲を局所的にできる。
SELECT * FROM sample WHERE -- WHERE で COLLATE を指定する name LIKE '%Alice%' COLLATE utf8mb4_unicode_ci;
Rails で使う
Ruby On Rails で使う場合、 scope を用意してあげればよさそう。
scope :fuzzy_matching_by_name, ->(name:) { where('name LIKE ? COLLATE utf8mb4_unicode_ci', "%#{sanitize_sql_like(name)}%") }
参考
「ゼロから始めるプロダクトマネジメント」を読んだ
プロダクト開発がどんなものなのかを分かりやすく説明していた。
自分はプロダクトマネージャーではなくプログラマの仕事だけれど、プロダクトマネジメントには意識的であれ無意識的であれ関わっているわけで、「自分たちがどういう仕事をしているのか」というのを再確認することができたかもしれない。
プログラマという職種的にはよりテクノロジーの具体や詳細、あるいはチーム運営みたいなものも重要な変数としては存在するんだけれども、シンプルな骨格を改めて認識するいい機会になったと思う。
new_framework_defaults_7_1.rb で NameError が発生する #rails
問題
Rails 7.0 から 7.1 にアップグレードしたので、7.1 のデフォルト設定を有効化しようとしていたら new_framework_defaults_7_1.rb
でエラーが発生した。
エラー内容
action_view.sanitizer_vendor
や action_text.sanitizer_vendor
で使用している Rails::HTML
が uninitialized constant
になってしまう。
NameError: uninitialized constant Rails::HTML (NameError) Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
原因
Rails の Issue になってた。
sprockets-rails
を使用していない場合、 rails-html-sanitizer
を require する必要が発生していた。
対応
すでに修正 PR がマージ済なので、対応版のリリースを待つ。
「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」を読んだ
少し話題になっていて気にはなっていたのだが、社内で輪読会が開催されることをきっかけに読んでみた。
GitLabという実例
GitLabという実例を元に、背景にある考え方を大事にしながら制度や仕組みを紹介している。
個性的な仕組みや制度も多く、興味深かった。
もう少し詳しく知りたいな〜、と思うところがちょこちょこあったけれど、あくまで一企業の例でしかないことを考えると、抽象と具体のバランスがよかったといえるのかもしれない。
本を読みながら改めて感じたけれど、リモート制度に限らず真似すればうまくいくというものではないと思うので。
印象に残った点
良し悪しはおいておくと、GitLab は仕事のパフォーマンスに一人ひとりのプライベートや内部的な価値観が大きく影響するという考え方があると感じた。
今の自分の環境
自分は基本リモート勤務しており、この一年間でも数回程度しか出社していない。 ただ全社的には出社を前提とする職種もある。
とはいえ、実は今のところリモート環境下における強い課題を自分自身は感じていない。 (より優先順位の高い課題に隠されている可能性はある)
なので、この本がめちゃくちゃ刺さったかというとそうではないんだけれど、難しいなと思うのは、状況が変わると働き方の課題の大きさや優先順位は随時変わっていくだろうなということ。
変数としては組織の拡大・縮小(人数の増減)が大きいだろうけど、体制やプロダクト・事業のフェーズも影響してくると思う。
そんなときにこの本を読んだことがヒントになるかもしれない。
おまけ
ちょうど輪読会の時期にタイムリーに、元GitLabの人の記事が話題になっていた。
ZIPCODA API を使って、郵便番号の逆引きをした
概要
住所の一覧から郵便番号をまとめて逆引きしたかったので、 ZIPCODA API を使って実現してみた。
CSV ファイルから住所を読み込んで、結果も同じく CSV ファイルに書き込むだけ。
ZIPCODA を使った理由
たぶんサービス等で定常的に利用するなら ケンオール あたりを使うのがいいんだろうけど、一時的な利用だとオーバースペック感があったので、別のを探していたら見つけた。
API はシンプルで使いやすいと思う。
補足
最初は GAS で雑に済ませようと思ったけれど、 GAS からのアクセスは制限されているようだったので、プログラムを書いた。
API の過剰な呼び出しを防ぐように wait するようにしているおり、結果として処理は全部同期的に行うような形になった。
API の結果を住所単位でキャッシュするようにはしているけど、実際に役立つのは繰り返し実行したりするときくらいだと思う。
「プロを目指す人のためのRuby入門」を読んだ #ruby #チェリー本
今の会社に出戻ってから Ruby On Rails をやることになり、まずは Ruby について学びたいなと思って手に取った本。
実際に読み終わったのは少し前なのだけれど、備忘のために書いておく。
改訂版だと Ruby 3.0 に対応してくれている。
実践的な入門書
網羅性が高くかつある程度深く解説してくれるので、まさに実務で使う人のための入門書という感じ。
そのためそれなりの分厚さではあるけれど、著者がかなり読み手に寄り添った形で書いていてくれて、読み進めるモチベーションを保てる。
テストと一緒のハンズオン
ただ読むだけでなく、ハンズオン的に手を動かせるようにもなっているので、その意味でも実践的だった。
入門書の類はどうしてもテストに関する事項が薄かったり省かれたりしがちだけど、ハンズオンがテストとセットで進める形になっているところに非常に好感を持った。
まとめ
Ruby は自分が今までメインで慣れ親しんできた言語と毛色の異なる書き方が結構あるけど、この本のお陰で脳内にインデックスを作れたので、コードを読み解く土台になってくれたと思う。
この充実度の書籍が存在してくれるのは Ruby 初心者として非常に助かった。