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

みたいなの書く

トランプを使ったボードゲームを考えた

プレイヤー:2人
必要なもの:日本で一般的に売られているトランプ(各スート13枚+ジョーカー2枚の計54枚。ただし、ジョーカーは一枚だけ使用する)

  1. 各プレイヤーにスペード&クローバーかハート&ダイヤの組み合わせの26枚のカードを配る
  2. ジョーカーを1枚フィールドに置く
  3. スペード&クローバーを持っているプレイヤーを先行とし、互いのプレイヤーはフィールドに置かれているカードに接するように1枚づつ手札をお互いに置いていく。このとき、接するカードのスートは問わない
  4. 置き方は、フィールドのカード1枚の上下どちらか、もしくは上下に半分だけずらすように左右どちらかに置く。つまり、1枚のカードの周囲には最大で6枚のカードが置かれることになる
  5. 上・右下・左下もしくは下・右上・左上の三方に敵カードが1枚づつ以上置かれたカードはゲームから除外される
  6. 互いの手札を置き終わったときゲーム終了とし、それぞれのプレイヤーは自分のカード3枚を選択し、その三点で構成される三角形の面積の大きい方を勝者とする。ただし、3枚のカードはすべて自分のカードのみで接続されていなければならない
  7. ジョーカーはワイルドカードとし、自分のカードとして扱って良い

どこかに穴があったり、明らかにどちらかが有利だったりするかな?

Capistranoで独自Taskを作る時はnamespaceをrakeにしてはいけない

Capistranoでデプロイ環境のrakeタスクを実行しようとして、
ruby - How do I run a rake task from Capistrano? - Stack Overflow
これとか参照して独自タスクを作ってみた。

続きを読む