ブックマーク / blog.kamipo.net (17)

  • Rails 6.1で `created_at > ?` みたいなクエリをいい感じに生成する - かみぽわーる

    Rails 6.1の目玉機能として以下のように書けるwhere拡張を入れてたんですが、いろいろあって6.1からはrevertされてしまいました🥲 posts = Post.order(:id) posts.where("id >": 9).pluck(:id) # => [10, 11] posts.where("id >=": 9).pluck(:id) # => [9, 10, 11] posts.where("id <": 3).pluck(:id) # => [1, 2] posts.where("id <=": 3).pluck(:id) # => [1, 2, 3] github.com github.com なんですが、そんなことで引き下がる僕ではないので、6.1ではpredicate生成に干渉できる拡張ポイントを用意しており、以下のようなコードを適当に読み込まれるところに

    Rails 6.1で `created_at > ?` みたいなクエリをいい感じに生成する - かみぽわーる
  • ISUCON10予選ふりかえり - かみぽわーる

    ISUCON10予選おつかれさまでした。ISUUMOいい問題でしたね。過去出題側を担当したこともある身でも、参加者の完全攻略に対する怖れもあって仕様が肥大化するなか今回これだけコンパクトな仕様のアプリケーションでこれだけ楽しめる出題をしたのマジですごいと思いました。 今回の問題はMySQLかつ検索ヘヴィな問題で僕のバックグラウンドに向いてる問題にも関わらず、ずっと手を動かしていたわりに効果の高い施策に取り組めず、あらためてISUCONの難しさを痛感したしこれぞISUCONなのだなあと思います。 僕の文章読解が遅く仕様理解にとても時間を要するという性質から、これまでのISUCONでは常にアプリケーションの仕様や性質を理解できる前に時間的制約からあらゆる決断を迫られるという状況にあり、この状況で仕様や性質を理解できていたとしたらできた正しい決断をしていくのは当に難しいと思っていて、今回ずっと

    ISUCON10予選ふりかえり - かみぽわーる
  • Rails 6.0の複数DBでリードレプリカのテストするのたぶん大変 - かみぽわーる

    Rails 6.0の複数DBのレビューしてるときに気づいたことなんですけど、たぶんリードレプリカからデータを読むテストをするのたぶん大変だと思われます。 うちの業務のアプリでActive Recordが更新を検知できない方法でデータが更新されるとテストがコケるという問題が以前にあり、これと同じ構造の問題がマスターのコネクションで更新したときマスターのコネクションのクエリキャッシュはクリアされるけどリードレプリカのコネクションのクエリキャッシュは残ったままというのがあるよね、というのをテストコードで示そうと思ったときのことである。 github.com 通常RailsアプリでDBつかったテストをするとき、テストの中で変更されたデータを毎回初期状態に戻すのにフィクスチャーをロードし直すのは時間がかかって効率がわるいので、テストケースに入る前にトランザクションを開始しといてテストケース終わったら

    Rails 6.0の複数DBでリードレプリカのテストするのたぶん大変 - かみぽわーる
  • ActiveRecordでINの中が一万個とかにならないようにする - かみぽわーる

    この記事は MySQL Casual Advent Calendar 2017 の23日目の記事です。 みなさんORマッパーは使っていますか? 僕は仕事とか趣味でActiveRecordというORマッパーを使っているんですけど、こいつ例えば Team.preload(players: :high_score).to_a みたいなことをするとすぐ SELECT `scores`.* FROM `scores` FROM `scores`.`id` IN (a, b, c, ...数千個続く...) みたいなクエリを生成しよるんですけど、MySQL 5.7に上げたときに range_optimizer_max_mem_size の制限で実行計画がテーブルスキャンに落ちてえらい目にあったことがありました。MySQL側で range_optimizer_max_mem_size = 0 することで

    ActiveRecordでINの中が一万個とかにならないようにする - かみぽわーる
  • MySQL 8.0ではデフォルトで濁点半濁点を区別しなくなる - かみぽわーる

    4月にMySQL 8.0のUnicodeと日語対応についてManyi Luさんとディスカッションする会があって、かなりいろいろ話してとてもよい会だった。その後いろいろ考えて感じてる懸念を端的に書き記しておく。 デフォルトのcollationがutf8mb4_0900_ai_ciになった これに関して僕は強い懸念を持っている。MySQL 8.0以前において、ふつうのWebアプリケーションなどで日語を扱う場合、実用上デフォルトのutf8mb4_general_ciかutf8mb4_binの2択であったと思う。デフォルトがutf8mb4_general_ciなので新しく作られるアプリケーションは通常は濁点半濁点が区別される状態で世に出てくることになる。けどMySQL 8.0.1のデフォルトのutf8mb4_0900_ai_ciは濁点半濁点を区別しないので、将来ユーザー名を登録するところでバイ

    MySQL 8.0ではデフォルトで濁点半濁点を区別しなくなる - かみぽわーる
  • MySQLでORDER BYをつけないときの並び順 - かみぽわーる

    メリークリスマス!🎅🎄 このエントリはMySQL Casual Advent Calendar 2016の24日目です。 今日はこれの話です! @eagletmt 実装と実行計画依存です(たとえばInnoDBで単一カラムのインデックスが使われた場合のsort orderはprimary keyになるはずです)— Ryuta Kamizono (@kamipo) December 4, 2016 @eagletmt すいません、すこし間違いがありました。もし hoge_id = ? のような絞り込みで単一カラムのインデックスが採用された場合はsort orderはprimary keyになるはずです。InnoDB前提なら基的に実行計画依存です。— Ryuta Kamizono (@kamipo) December 4, 2016 @eagletmt MySQLでorder by無しのと

    MySQLでORDER BYをつけないときの並び順 - かみぽわーる
  • Treasure Dataに入社しました - かみぽわーる

    近況などをブログに書いたことはなかったんですが、4月からTreasure Dataで働くことになりました。 3月に新しい仕事を探してたタイミングでちょうど声をかけてもらって、他に誘ってくれてるところもあっていろいろ考えたんですけど、今まで自分がやってたWeb屋さんとは結構ちがう専門的なプロダクトが面白そうだったこと、話してみてエンジニアリング上の解決したい課題についてすごく具体的にいろいろ話してくれたので、畑違いな気もするけどやれることは結構ありそうだなとイメージできたので入社することにしました。 あとは声をかけてくれるのが2週間遅かったら他のところに決めちゃってたので、お互いのタイミングが合ってたことで自分が想像していなかった選択肢が生まれたことにも面白さを感じて、まあこれも自分の中のひとつのチャレンジだと思って返事をしたという感じです。 HadoopもFluentdもよく分からんしSl

    Treasure Dataに入社しました - かみぽわーる
  • MySQL と寿司ビール問題 - かみぽわーる

    MySQL と Unicode Collation Algorithm (UCA) - かみぽわーる に関連するトピックで、 MySQL には寿司ビール問題というのがある。 寿司ビール問題どっかで詳しくお話を聞くべきだよなぁ。。。— RKajiyama (@RKajiyama) March 18, 2015 これはどういう問題かというと、 MySQL の Unicode では binary collation にしてコードポイントで比較しないと🍣と🍺に限らず絵文字が同値判定されるという問題です。 あれ? MySQL の utf8mb4 charset って、4バイト文字同士を比較すると同じ文字扱いされる? SELECT '🍣'='🍺' → 1 MySQL的には寿司とビールは同じ扱い。— とみたまさひろ (@tmtms) December 22, 2014 MySQLで select

    MySQL と寿司ビール問題 - かみぽわーる
  • MySQLユーザーのためのPostgreSQL対応表 - かみぽわーる

    毎回わからなくなってググってるから今度からここに追記していく。 MySQL PostgreSQL SHOW DATABASES; \l USE dbname \c dbname SHOW TABLES; \dt SELECT * FROM tblname\G \x on SELECT * FROM tblname; SELECT * FROM information_schema.processlist; SELECT * FROM pg_stat_activity; KILL <pid>; SELECT pg_terminate_backend(pid); KILL QUERY <pid>; SELECT pg_cancel_backend(pid); table / column の情報 MySQL PostgreSQL SHOW TABLE STATUS FROM dbname; わ

    MySQLユーザーのためのPostgreSQL対応表 - かみぽわーる
  • MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる

    仕事やらなんやらでMySQLのクエリの良し悪しを判断する必要があるとき、EXPLAINの内容だけだとどのぐらい良くなったり悪くなったのか分からないので SET long_query_time = 0; してrows_examined (そのクエリでrows_sent行の結果を返すために何行に触ったのか)も一緒に提示するようにしている(少なくともMySQL 5.7時点ではrows_examinedはslow_query_logでしか確認できないはずperformance_schemaが有効ならevents_statements_historyやその仲間たちで確認できるとのこと*1 MySQL :: MySQL 5.6 リファレンスマニュアル :: 22.9.6 パフォーマンススキーマステートメントイベントテーブル)。 例: 上の例のBeforeは、もともとDBAが書いた温かみのあるSQLでO

    MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる
  • Rubyで安全な文字列リテラルかどうかを判別したい - かみぽわーる

    Rails 5.2からRails SQL Injection ExamplesにあるようなSQLインジェクションを防ぐ仕組みが導入されて、Post.order(params[:order])みたいなコードは心温まる正規表現によるチェックをパスしないと危険とみなされるようになって、お前が安全やと思うんやったらPost.order(Arel.sql(params[:order]))しろってことになった(rails/rails#27947)。 これはRails 5.0のときにparamsがHashのサブクラスじゃなくなったときに比べればマシだけど、明らか安全やと思ってるリテラルもRailsに危険とみなされて既存のアプリケーションによったら非常にわずらわしい。たとえばDiscourseというRailsアプリは5.2に上げるときにこれの影響をモロに受けるんやけどっていうお気持ちを表明しています(ra

    Rubyで安全な文字列リテラルかどうかを判別したい - かみぽわーる
  • Rails 6.0でDeprecatedになるActive Recordの振る舞い3つ - かみぽわーる

    Deprecatedにした経緯というか背景が伝わってるのかどうかアレだと思ったので、ここに日語にて書き記しておく。 Deprecate mismatched collation comparison for uniquness validator by kamipo · Pull Request #35350 · rails/rails · GitHub Active Recordのuniqueness validatorはデフォルトでcase sensitiveな比較をするんですが、これが、文字列のデフォルトのcollationがcase insensitiveなMySQLと相性が悪く、DB上のUNIQUE制約と一致しない振る舞いだったりINDEXが効率よく使えずDBが死ぬみたいな問題を引き起こしていました。 例: 当にあったRailsの怖い話 僕も主に仕事コードレビューで過去に何

    Rails 6.0でDeprecatedになるActive Recordの振る舞い3つ - かみぽわーる
  • 165万払って全身脱毛をはじめた - かみぽわーる

    全身脱毛を11月からはじめてみた。 前職のハイパーサポートエンジニアの同僚が尻の毛を脱毛したエントリを見て、たしかに尻の毛いらんな!と頭の片隅に残っていて、YouTubeでちょいちょいローランドのチャンネルを観ているのでそういえば新宿の新店舗ってどのへんなんやろって調べたらおもいのほか家の近所すぎてテンションあがったのでその日のうちに電話して翌日に全身脱毛の契約をしてしまった。 はてなブログに投稿しました #はてなブログ 医療脱毛で全身脱毛に行ってみた - Secret Ninja Bloghttps://t.co/7bIyi20FgG— Toru Takahashi (@nora96o) September 6, 2020 その後、カンジャンケジャンをいながら今日全身脱毛契約してきてんって話をしたら「医療?美容?」って聞かれて、なるほどそういえばそういうの全然考えてなかったなと思って、

    165万払って全身脱毛をはじめた - かみぽわーる
  • 無職になってからやったこと(保険と給付金) - かみぽわーる

    無職になってからのこと書こうと思ったら保険と給付金だけで力尽きました。 ハローワークで求職者登録 だいたいの会社員は雇用主によって雇用保険に加入しており、失業中にはいわゆる失業手当を受給できる。 せっかく保険料払っとるねんから一回ぐらい失業手当もらっとかなあかんなということでハローワーク(公共職業安定所)に通ってる。 ちなみに、ハローワークでいうところの "失業" とは、離職中のひとが "就職しようとする意思といつでも就職できる能力があるにもかかわらず職業に就けず、積極的に求職活動を行っている状態にある" ことをいうそうです。 ところで、失業手当がいくらもらえるのかざっと検索するとだいたい賃金の50~80%ぐらいって出てくるんで、え、そんなもらえたら無職のまま豪遊できてしまうで、と思ったけどそんなうまい話はなかった、基手当日額には上限が存在していて、僕の場合は基手当日額7,605円であ

    無職になってからやったこと(保険と給付金) - かみぽわーる
  • 新宿うまいカレー屋多すぎん? - かみぽわーる

    いろいろあって自由な時間を活用してなんか人生が充実するようなことしたいなということで、ランチのおいしいお店を開拓しようというのをやっていた。その中でも新宿うまいカレー屋多すぎん?と思ったので行ったことのある新宿のカレー屋さんを紹介します。 草枕 三丁目と御苑前のあいだぐらいでちょっと遠いんだけど新宿でいちばん好きなカレー。🍆🍅🐔がうますぎるので🍆🍅🐔ばっかりってる。 🍆🍅🐔🍛🍺 pic.twitter.com/8li8u6AgGL— Ryuta Kamizono (@kamipo) October 30, 2020 東京ドミニカ 草枕うますぎるけど遠いので、近場でうまいスープカレーいたいときによく行く。 京鴨のスープカレー🦆🍛 pic.twitter.com/3fvtqKhyGE— Ryuta Kamizono (@kamipo) September 18,

    新宿うまいカレー屋多すぎん? - かみぽわーる
  • Treasure Dataを退職します - かみぽわーる

    急なお知らせですが、8月31日をもってTreasure Dataを退職することになりました。 今後の活動についてはいまのところなにも決まっていないので、自分になにができるのか、どんなニーズがあるのか、いろいろ相談に乗ってもらえるとうれしいです。 きっかけはというと、長年Railsコントリビューター/メンテナーとして並々ならぬ思いで活動してきたんですが。 どのぐらいがんばっていたかというと、たとえば2020年8月時点のコミット数ベースの今年のアクティビティでいうと、上位10人のアクティビティを母数にするとその半数が僕になります。 rails/rails contributors 2020-01-01 - 2020-08-26 Rails 5.0以降のも置いておきます。 rails/rails contributors 2019-01-01 - 2019-12-31 rails/rails c

    Treasure Dataを退職します - かみぽわーる
  • SELECT ... FOR UPDATE同士でデッドロックさせる - かみぽわーる

    最近SELECT ... FOR UPDATEでデッドロックする話を何度かしたので。 前職のときにUPDATE同士がデッドロックしてたときに、SELECT ... FOR UPDATEで排他ロックを取ってからUPDATEしてデッドロックを防ぎますってPRをレビューしてたときのことで、複数レコードの排他ロックは一瞬ですべてのレコードのロックを取れるわけではなく、ロックを取る順番が揃っていないと簡単にデッドロックしますよという話です。 https://gist.github.com/kamipo/0bb4e37d58ba18a8cefb8aa02f778231 # frozen_string_literal: true require "mysql2" def client Mysql2::Client.new( host: "localhost", username: "root", dat

    SELECT ... FOR UPDATE同士でデッドロックさせる - かみぽわーる
  • 1