Pluckのあるクエリでexplainをどうやって出力するか

idが1000より大きいユーザの地域一覧を取りたかった User.distinct.where('id > 1000').pluck(:city) というコードを書いて、「distinct意味ないじゃん」みたいなことを言われた 実はクエリの遅延評価によってpluckまでクエリに含まれるのだが、それを以下のコードを見せて証明しようとした

User.distinct.where('id > 1000').pluck(:city).explain

エラーが起きた。そりゃそうだ、pluckが返すのはArrayで、 Array#explain はないのだから

これうまくやりたい。pluckしたあとでもexplainでクエリ見たい

解1

pluckはクエリを発行するが、explainに必要な情報は Activerecord#Relation ? 特殊変数に入れておく。で、explainで使う

解2

pluck_explain(:city) というメソッドを生やす

解2はハックしてる感がないので1点。

心の科学と脳の科学の関係に関する考察

2012年に書いたレポートを発掘したので公表する。論文と呼ぶには体裁が整ってない上に、チェックもろくにしてないけどそのまま載っけることにする。
高校生のころ考えてたことをまとめて授業のレポートで提出したもの。

BigQueryで相関サブクエリがうまく動かなかった話

相関サブクエリ自体よくないやり方ではあるけれど、それを使ってみたらわかりにくい挙動をしていた


例えばこんな感じのクエリ

SELECT
  (
    SELECT
      1
    FROM
      rdb.users
    WHERE
      users.total_pay  < payments.pay
  )
FROM
  rdb.payments

payments.payに応じてusersを絞り込んでごねごねしたくて書くと、
invalidQuery: LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.
というエラーがでる

どうも、BigQueryでは効率をあげるために、サブクエリはJOINに変換されるらしく、相関サブクエリ内のWHEREが不等号だとエラー起きるっぽい
BigQuery Subqueries Efficient Join - Stack Overflow

バグじゃないかと思うけど、とりあえずの対処としては、相関サブクエリを書かないようにすること(CROSS JOINなどして条件絞り込みする)、そのためにサブクエリを書くときはWITHで分離できるときは分離してしまうこと、かな

RailsでDevise使った上でAPI作ろうとした話

Devise(GitHub - plataformatec/devise: Flexible authentication solution for Rails with Warden.)はユーザ登録・ログイン関係をよしなにやってくれるけど、フロントエンド用のAPI作ろうと思うと苦労する
ちょっと調べた感じだと色々書かないといけないっぽくて、それは嫌なので雑にハックした

続きを読む

macOS Sierra で brew updateできなかった話

brew update しようとすると

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

と言われた。秘密鍵は正しいのに。

問題はこれ
macOS Sierra のSSH接続で、秘密鍵へのパスを覚えてくれない問題 - Qiita
秘密鍵のパスワードを毎回求められるようになったけど、brew updateの際には途中でパスの入力を求めずにエラーを吐いてしまう

解決策はリンク先にあるように.ssh/config

Host *
    UseKeychain yes
    AddKeysToAgent yes

みたいなの書く