かみぽわーる

kamipo's blog

MySQL 8.0のクライアントでMySQL 5.7のサーバーに接続するとcharsetが設定されないかもしれない

mysql_options(mysql, MYSQL_SET_CHARSET_NAME, cs_name) だけして mysql_real_connect(mysql, ...) した後SHOW VARIABLESしてみたら接続のcharsetが設定済みの挙動をするんやけどmysql_real_connectからの一連のコード読んでもどこでそれが起きるのかわから…

新宿うまいカレー屋多すぎん?

いろいろあって自由な時間を活用してなんか人生が充実するようなことしたいなということで、ランチのおいしいお店を開拓しようというのをやっていた。その中でも新宿うまいカレー屋多すぎん?と思ったので行ったことのある新宿のカレー屋さんを紹介します。 …

2021年はブログを書くのをがんばろうという話

5ヶ月前に退職エントリを出してから、いろんな会社さんだったり個人的にだったり、いろんな人と話させてもらった。 blog.kamipo.net みーみちゃん転職(前)祝いだよ pic.twitter.com/0kdy47mOiw— Ryuta Kamizono (@kamipo) August 28, 2020 みーみちゃん毎日…

165万払って全身脱毛をはじめた

全身脱毛を11月からはじめてみた。 前職のハイパーサポートエンジニアの同僚が尻の毛を脱毛したエントリを見て、たしかに尻の毛いらんな!と頭の片隅に残っていて、YouTubeでちょいちょいローランドのチャンネルを観ているのでそういえば新宿の新店舗ってど…

無職になってからやったこと(保険と給付金)

無職になってからのこと書こうと思ったら保険と給付金だけで力尽きました。 ハローワークで求職者登録 だいたいの会社員は雇用主によって雇用保険に加入しており、失業中にはいわゆる失業手当を受給できる。 せっかく保険料払っとるねんから一回ぐらい失業手…

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,…

activerecord-importを利用して無効なデータを無理やりINSERTする

activerecord-importと:on_duplicate_key_ignoreオプションを組み合わせるとカラム定義の範囲外の値であっても無理やりINSERTすることができます。 # frozen_string_literal: true require "bundler/inline" gemfile(true) do source "https://rubygems.org"…

create_or_find_byでcreateもfind_byも失敗させる

Active Recordの話です。 create_or_find_byの実装はcreateしてみてユニーク制約に引っかかったらfind_byしてみるなので、ふつうに考えるとfind_byは成功しそうに見えます。 def create_or_find_by(attributes, &block) transaction(requires_new: true) { c…

SELECT ... FOR UPDATE同士でデッドロックさせる

最近SELECT ... FOR UPDATEでデッドロックする話を何度かしたので。 前職のときにUPDATE同士がデッドロックしてたときに、SELECT ... FOR UPDATEで排他ロックを取ってからUPDATEしてデッドロックを防ぎますってPRをレビューしてたときのことで、複数レコード…

ツイッターで見つけて直したActiveRecordの問題さらに3つ

ツイッターで見つけて直したActiveRecordの問題3つ - かみぽわーるの続き。 where(id: ..1) ("id" <= 1)をnotしたら"id" > 1になってほしい 今のmasterで試してみたのですが、SELECT "users".* FROM "users" WHERE NOT ("users"."id" <= 1) になるようです。…

ツイッターで見つけて直したActiveRecordの問題3つ

Rails Advent Calendar 2020の3日目です。 時間がないのでとりいそぎ3つだけ。 enum state: {active: 0, inactive: 1}とかした時に、typecast前の0とか1を取りたい ActiveRecord::Enumってstate: {active: 0, inactive: 1}とかした時に、typecast前の0とか1…

ISUCON10予選ふりかえり

ISUCON10予選おつかれさまでした。ISUUMOいい問題でしたね。過去出題側を担当したこともある身でも、参加者の完全攻略に対する怖れもあって仕様が肥大化するなか今回これだけコンパクトな仕様のアプリケーションでこれだけ楽しめる出題をしたのマジですごい…

Treasure Dataを退職します

急なお知らせですが、8月31日をもってTreasure Dataを退職することになりました。 今後の活動についてはいまのところなにも決まっていないので、自分になにができるのか、どんなニーズがあるのか、いろいろ相談に乗ってもらえるとうれしいです。 きっかけは…

Ruby 2.7.0でキーワード引数として渡された引数なのかどうかフラグを確かめる方法

class Hash class << self def ruby2_keywords_hash?(hash) !new(*[hash]).default.equal?(hash) end def ruby2_keywords_hash(hash) _ruby2_keywords_hash(**hash) end private def _ruby2_keywords_hash(*args) args.last end ruby2_keywords(:_ruby2_keyw…

ISUCON9予選ふりかえり

なにもできなかったし書くことないわーって思ってたけど、チームのふりかえりをGitHubのissueに書いてたらふつうにこれ外に書けばいいなってなったのでここに記す。 アクセスログから得られる情報の解像度が相対的に低くなってきたと感じた。ざっくりどのエ…

Rails 6.0の複数DBでリードレプリカのテストするのたぶん大変

Rails 6.0の複数DBのレビューしてるときに気づいたことなんですけど、たぶんリードレプリカからデータを読むテストをするのたぶん大変だと思われます。 うちの業務のアプリでActive Recordが更新を検知できない方法でデータが更新されるとテストがコケるとい…

Rails 6.0でDeprecatedになるActive Recordの振る舞い3つ

Deprecatedにした経緯というか背景が伝わってるのかどうかアレだと思ったので、ここに日本語にて書き記しておく。 Deprecate mismatched collation comparison for uniquness validator by kamipo · Pull Request #35350 · rails/rails · GitHub Active Reco…

Rubyで安全な文字列リテラルかどうかを判別したい

Rails 5.2からRails SQL Injection ExamplesにあるようなSQLインジェクションを防ぐ仕組みが導入されて、Post.order(params[:order])みたいなコードは心温まる正規表現によるチェックをパスしないと危険とみなされるようになって、お前が安全やと思うんやっ…

MySQLのクエリの良し悪しはrows_examinedで判断する

仕事やらなんやらでMySQLのクエリの良し悪しを判断する必要があるとき、EXPLAINの内容だけだとどのぐらい良くなったり悪くなったのか分からないので SET long_query_time = 0; してrows_examined (そのクエリでrows_sent行の結果を返すために何行に触ったの…

ActiveRecordでINの中が一万個とかにならないようにする

この記事は MySQL Casual Advent Calendar 2017 の23日目の記事です。 みなさんORマッパーは使っていますか? 僕は仕事とか趣味でActiveRecordというORマッパーを使っているんですけど、こいつ例えば Team.preload(players: :high_score).to_a みたいなこと…

MySQL 8.0ではデフォルトで濁点半濁点を区別しなくなる

4月にMySQL 8.0のUnicodeと日本語対応についてManyi Luさんとディスカッションする会があって、かなりいろいろ話してとてもよい会だった。その後いろいろ考えて感じてる懸念を端的に書き記しておく。 デフォルトのcollationがutf8mb4_0900_ai_ciになった こ…

MySQLでORDER BYをつけないときの並び順

メリークリスマス! このエントリはMySQL Casual Advent Calendar 2016の24日目です。 今日はこれの話です! @eagletmt 実装と実行計画依存です(たとえばInnoDBで単一カラムのインデックスが使われた場合のsort orderはprimary keyになるはずです)— Ryuta Ka…

ISUCON6予選にチーム「それぞれの椅子」で参加した

ISUCON6予選1日目にチーム「それぞれの椅子(kamipo, Yappo, kan)」で参加した(kanさんは予定があってリモートからの友情出演)。 結果からいうとスコア15万ぐらいで安定したとこでもう時間ないから触るのやめて再起動チェックだけやって終わろうって再起動し…

MySQL 5.7のONLY_FULL_GROUP_BYはちょっと進化してた

このエントリはMySQL Casual Advent Calendar 2015の14日目です。 TL;DR MySQL 5.7ではデフォルトONLY_FULL_GROUP_BYが有効である。MySQL 5.7.5からONLY_FULL_GROUP_BYが有効のとき GROUP BY句のカラムと関数従属性のあるカラムはSELECT句に書けるようになっ…

MySQL 5.7のoptimizer_switch、derived_mergeとは何ぞや

このエントリはMySQL Casual Advent Calendar 2015の8日目です。 MySQL 5.7.6からoptimizer_switchにderived_mergeが追加されデフォルトで有効になっている。基本的にこれはほっといたらだいたいサブクエリが速くなるやつなので気にしなくてもいいんですが、…

HomebrewのMySQL 5.7.9でSSL接続するとコケるので気をつけよう

このエントリはMySQL Casual Advent Calendar 2015の3日目です。 で、これです。 github.com ざっと調べた感じだと、openssl 1.0.1eあたりからDiffie-Hellman (DH) key length 1024bit以上を要求するようになったかなんかで、MySQLが512bitとかいうかなり短…

Treasure Dataに入社しました

近況などをブログに書いたことはなかったんですが、4月からTreasure Dataで働くことになりました。 3月に新しい仕事を探してたタイミングでちょうど声をかけてもらって、他に誘ってくれてるところもあっていろいろ考えたんですけど、今まで自分がやってたWeb…

MySQL と寿司ビール問題

MySQL と Unicode Collation Algorithm (UCA) - かみぽわーる に関連するトピックで、 MySQL には寿司ビール問題というのがある。 寿司ビール問題どっかで詳しくお話を聞くべきだよなぁ。。。— RKajiyama (@RKajiyama) March 18, 2015 これはどういう問題か…

MySQL と Unicode Collation Algorithm (UCA)

utf8_unicode_ci に対する日本の開発者の見解 - かみぽわーる で、日本語が分かる人には utf8_unicode_ci のヤバさを感じてもらえたと思うんですけど、この挙動はドキュメントによると UCA というアルゴリズムによるものらしい。 MySQL implements the xxx_u…

utf8_unicode_ci に対する日本の開発者の見解

RailsがMySQLのcollationをサーバー側のデフォルトのutf8_general_ciからutf8_unicode_ciにわざわざ変えてるのどうせ大した理由じゃないだろと思って掘ってみたらやっぱり大した理由じゃなかった… https://t.co/6NeetGhTF0— Ryuta Kamizono (@kamipo) April …