地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

Cache-Control: max-age=Xがない時のブラウザキャッシュ

レスポンスにCache-Control: max-ageがない場合って何も考えずにクライアントにキャッシュされないと思っていたがどうやらそうではないらしい。この挙動自体はRFCでも定義されている。HTTP は可能な限りキャッシュするように設計されているので、Cache-Control が指定されていなくても、条件さえ揃えばキャッシュが可能となっている。これをheuristic cacheと呼ぶらしい。以下の記事でも書いてあるがRFCで計算方法は定義されておらずブラウザごとの実装になるとのこと

zenn.dev

Chroniumのソースを見てみる

以下のあたり。max-ageやExpiresがあったらそっちを優先する。最終修正時間に基づくヒューリスティックな値とあるが現在時刻が1月1日0:00でlast-modifiedが1月1日10:00ならその10%は更新されてないと想定してその時間をキャッシュするようになっている。

https://source.chromium.org/chromium/chromium/src/+/main:net/http/http_response_headers.cc;l=1141-1163

具体的にはこの辺

  if ((response_code_ == net::HTTP_OK ||
       response_code_ == net::HTTP_NON_AUTHORITATIVE_INFORMATION ||
       response_code_ == net::HTTP_PARTIAL_CONTENT) &&
      !must_revalidate) {
    // TODO(darin): Implement a smarter heuristic.
    Time last_modified_value;
    if (GetLastModifiedValue(&last_modified_value)) {
      // The last-modified value can be a date in the future!
      if (last_modified_value <= date_value) {
        lifetimes.freshness = (date_value - last_modified_value) / 10;
        return lifetimes;
      }
    }
  }

ちょっと気になったのは以下のコメント。stale-while-revalidateがあればstaleになった場合もそっちを優先するらしい。見慣れないので調べてみたらstale-while-revalidateキャッシュから表示するが裏で非同期にキャッシュを更新しておくためのヘッダーらしい。ヒューリスティックな値がクライアント次第で決まる一方でこのヘッダーを設定しておけばstaleになった際のクライアントの挙動をある程度コントロールすることができそうである。便利そう。とはいえcache-controlをあえてつけないことでブラウザのこれまでの経験則的に設定された計算式から外れたキャッシュを使うくらいなら任せてしまうというのも手なのではないだろうか。

// If the stale-while-revalidate directive is present, then it is used to set
// the |staleness| time, unless it overridden by another directive.

感想

Cache-Control?そんなのいらんブラウザに全部お任せじゃ!で済む世界なら楽なんだろうなぁと思った。

【ポエム】アウトプットへのネガティブコメントはどう受け取るのが良いのか

前職時代の後輩と久々に飲みにいってブログ書くと炎上とかまさかりが怖くて〜みたいな話をしていて色々考えがまとまってなかったので書いてみる。「この考えは間違っている」や「こんなのも知らないのか」とか「こんなのやってる暇あるなら仕事しろ」とか今なら「参考になります!」って即レスできるようなコメントもアウトプット仕立ての頃は確かに怖かった気がする。こういうコメントがつく記事は9割くらいは嬉しいコメントだったり指摘があっても「こうしたらもっと良いのでは?」といった内容のものであったりもする。

どう受け取ると良いのか

個人的には「何が何故」怖いのかを自分なりに考えてみるのが大事だなと思っている。出た結論としては「知らない人からの淡々とした感じで鋭い指摘が来ると怖い」というのがわかった。指摘が正しいのであればその内容を受け止めれるようにしていくのが良いと思っている。それが難しいのはとてもあるのでこの部分は数をこなすしかないんかなぁという感じ。

あとは知らない人かつ淡々としたというのはコメントする人次第でこっちではどうにもならないので鋭い指摘がこないようなアウトプットをするように検証とかをきちんとするしかないのかなと思っている。会社のテックブログとかであればレビュー体制があったりするだろうから積極的に使っていくとかコミュニティとかで出してみるとかそういうのが大事。

とりあえず慣れるしかないと思っているのでネガティブコメントが怖いからアウトプットできないだと永遠にできないと思っているので数をこなそう

その他

マサカリの起源

qiita.com

2006年から出ているらしい。モヒカンって言葉もあるのか。

【MySQL】slaveでもbinlogを更新するにはlog-slave-updatesが必要

dev.mysql.com

リードレプリカでbinlogが更新されないなぁと思っていたらlog-slave-updatesがオフになっていて更新されていなかった。これはレプリケーションソースサーバーから受信した更新を、レプリカ独自のバイナリログに記録するかどうかを決めるためのパラメータである。ちなみに昔書いたmy.cnfをコピペして使いまわしてたのでlog-slave-updatesがオフになっていただけでデフォルトは有効になっている。多段レプリカ組もうとしてた時にちょっとハマったのだった。。。

php-fpmのセッションの保存先

[Session]
session.save_handler = memcache

こんな感じで定義することでファイル以外のハンドラを設定することができる。

www.php.net

上記のサンプルだと以下のライブラリを使うように設定してある

PECL :: Package :: memcache

ちなみにmemcacheとmemcachedはそれぞれ違うライブラリらしい。memcacheの方はメンテされていないって書かれている記事があったけどPHP8系まで対応してるらしく半年前くらいに最新版が出ているしで新しいものも出ていそう?むしろmemcachedの方が止まっていそうに見えるがどうなのだろう。

https://pecl.php.net/package/memcached

ちなみにそれぞれで互換性はないらしい

ackintosh.github.io