@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Django: select_related と prefetch_related についてメモ

公式ドキュメント

両者の違い

prefetch_related について詳しく

Prefetch オブジェクトについて

ここ二、三年で、言葉の使い方に対するこだわりが強くなった。「裁量」は「大きい」のか「強い」のか「多い」のか「高い」のか、みたいなことが(他の言葉についても)気になって、正しい使い方を調べずに適当に書くことができない。なんでなんだろ?どれでも伝わりはするだろうに。

Go: golang.org/x/time/rate を利用したコードのテストの書き方

速度制限をかけているコードの実行に要した処理時間を計測すれば良い。

package main

import (
    "context"
    "fmt"
    "testing"
    "time"

    "golang.org/x/time/rate"
)

func TestWait(t *testing.T) {
    // rate = 10 req / sec
    // burst = 1
    // 0.1 秒ごとに token が 1 ずつ増える
    r := rate.Every(time.Second / 10)
    b := 1
    limiter := rate.NewLimiter(r, b)

    ctx := context.Background()

    tests := []struct {
        name    string
        n int
    }{
        {
            name: "n = 10",
            n: 10,
        },
        // ループの実行開始直後に token を 1 消費する (burst=1)
        // これを考慮に入れるため、 PASS するテストケースではループを 11 回実行している (n=11)
        {
            name: "n = 11",
            n: 11,
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            t0 := time.Now()
            for i := 0; i < tt.n; i++ {
                // token が増えるとすぐにループが実行され、 token を使い切る
                // token を使い切っていると limiter.Wait でブロックする
                // つまり、ループを 1 回実行するのに 0.1 秒かかる
                if err := limiter.Wait(ctx); err != nil {
                    // noop
                }
                // ここ (Wait() のあと) に速度制限をかけたい処理を書く
                // 例: resp, err := http.DefaultClient.Get("http://example.com/")
            }
            t1 := time.Now()
            elapsed := t1.Sub(t0).Seconds()
            // ループを 10 回実行する間に limiter.Wait でブロックする時間の合計は (10-1) * 0.1 = 0.9 秒
            // ループを 11 回実行する間に limiter.Wait でブロックする時間の合計は (11-1) * 0.1 = 1.0 秒
            // ループを 11 回実行するのに要した時間 (elapsed) が 1.0 秒以上であれば 10 req / sec の速度制限が効いているといえる
            if elapsed < 1.0 {
                t.Errorf("must take > 1.0 sec, but took %f sec", elapsed)
            }
            fmt.Printf("took %f sec\n", elapsed)
        })
    }
}

https://play.golang.org/p/lnrqdM3FI5c

EarPods 壊れてなかった

EarPods のマイクが壊れた - @kyanny's blog

イヤホンジャックの EarPods をセブンイレブンで買ってきて繋いだが、やはりマイク入力をほとんど拾わない。新品でもダメということはもしや本体側の問題か?とここで初めて思い当たり、別の MacBook で試すと新旧どちらの EarPods でも問題なくマイク入力を拾う。 MacBook のイヤホンジャックの接触不良らしい。 EarPods 買う必要なかった。三千円無駄にした。二択で外すってふざけんなという気持ち。通販で一日待つよりセブンイレブンで買ったほうが早いからそうしたのに、裏目に出た。Lightning 変換アダプタを使うにせよ接点回復剤を試すにせよ、いずれも通販で買わないといけない。だったら最初から通販でアダプタ買えば良かった。

最近、気分が落ち込みがちで、ブログに書きたいこともいくつかあるのに筆が進まない。

悲しいニュースが多いが、竹内結子が亡くなったのはけっこうショックを受けた。同い年(学年は一つ違い)で出身地も近いし、「いま、会いにゆきます」は映画館で観て泣いた(なぜわざわざ映画館で観ようと思ったのかは覚えていない)。

自宅勤務が続いていて、動かないせいで体重が増え、人生最高値を更新してしまっている。さすがにもう「クローン病患者が太れるなんて嬉しい話だ」などと言ってもいられない。コロナの感染者数もなかなか減らず、通勤再開に踏み切れない。ジムで運動する頻度を増やして、食事(特に間食)の量を減らさなければ。

おれには懐かず目があっただけでダッシュで逃げていた三毛猫が、大人になって性格が落ち着いてきたのか、最近はずいぶん人慣れしてきて撫でさせてくれるようになったり、粗相もしばらくしていないのが、最近の数少ない良かったことのひとつ。