ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

uuid v7 は単調増加に関するオプションに幅があって実装側で決めなきゃで大変

はじめに

一口メモシリーズ。表題通り。単調増加に関するオプションの幅がかなり広い。のでそれをざっとまとめます。

昨今OSSやらなんやらで uuid v7 に関する議論をある程度みかけますが、このオプションの幅の広さを知っていると、ある選択に対して「いいですね...」と思えて玄人っぽいのでおすすめです。

それではやっていきます

uuid v7 の説明

RFC9562 Section 5.7 にて定義されている uuid version

同 RFC Fig 11 から引用すると、レイアウトは次の通り:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           unix_ts_ms                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          unix_ts_ms           |  ver  |       rand_a          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

ようは uuid によって定められている version および variant 以外の部分について

  • 前半 48 bits を timestamp
  • 後半を 74bits を rand

にて埋めたレイアウトとなっています。これによってある程度のランダム空間による衝突耐性と、時系列によりソート可能な性質を持ちます。

これは uuid の利用先で B Tree およびその派生アルゴリズムでデータを保持するようなケースにおいて、局所性のあるデータの読み書きにメリットがあります。

ただ同一tick間に複数回採番があると、単調増加である保証はできません。後半が rand なのでそれはそうですね。この部分について、RFCでは単調性を保持するいくつかの手法を optional で紹介しています。

RFC にて提示されているオプションとその説明

RFCではこんな感じの説明がなされています:

https://www.rfc-editor.org/rfc/rfc9562.html#section-5.7-2

  1. An OPTIONAL sub-millisecond timestamp fraction (12 bits at maximum) as per Section 6.2 (Method 3).
  2. An OPTIONAL carefully seeded counter as per Section 6.2 (Method 1 or 2).
  3. Random data for each new UUIDv7 generated for any remaining space.

ざっくり流れで言うと、「OPTIONALで timestamp 12 bits 増やしてもいいよ。そのときは rand を削ってね」「さらに単調増加カウンタみたいなのを仕込んでもいいよ。これも rand 向け空間つかったりするよ」「のこりは rand で埋めてね」と言う感じです。

それぞれ詳細についてもさっくり紹介します。

rand_a を潰して timestamp 精度を最大 12 bits 上げる

Section 6.2 (Method 3) にて紹介されている手法。

ようは rand_a を左端から削っていき、その空間を timestamp の解像度を上げるために使っちゃおう!というやつです。

単調増加を念頭に入れているので、もちろん rand_a の 12 bits 全て使わない場合も左側から割り当てる必要があります。じゃないと順序通り並ばないため。

あとは単に時刻の解像度をあげてtickの衝突可能性を減らしてるだけなことにも注意が必要です。このアプローチは実用上は発生確率が大きく減るので意味がありますが、衝突自体はあり得る状態のままです。

RFCでは具体的な計算手法についても紹介していますが、それはここでは省略します。

rand_a の左端から、同一 timestamp 間のカウンタを固定bitで入れる

Section 6.2 (Method 1) で紹介されている。単調増加のカウンタを入れてしまう方法。

想定採番スピードによってどのくらいの空間を確保するかが実装者の裁量。カウンタをめっちゃ増やしたい時は rand_b 空間まで入っちゃってもいいよと MAY で言及されています。

In the event that more counter bits are required, the most significant (leftmost) bits of rand_b MAY be used as additional counter bits.

カウンタ系、パッと聞くといいじゃんな気持ちになりますが、厳密にやるにはロックが必要です。かつ分散システム上ならグローバルロックとかもしたくなるけど、そんなことしてる間にmsec経過しちゃいそうですね。ロックとるとしてもどこまでやるか?の論点があって地味に考えることが多いです。

同一tickなら rand 一度だけ振って、後続は値を単調増加カウンタとして扱う

Section 6.2 (Method 2) で紹介されてる。

tick衝突時に、さっき降った rand に適当に値を追加してしまう案。同じ空間を同一tickならカウンタとしても使っちゃう方法。

追加する値も通常ランダムに決定するが、予想されても困らないなら +1 とかに固定してもいいよ!とされていた。

単位時間あたりの採番数が多いバッチみたいなシナリオなら、rand_b も使うといいよみたいな言及がある。

UUIDv7's rand_b section SHOULD be utilized with this method to handle batch UUID generation during a single timestamp tick.

オプションの幅が広く実装者の選択の余地が大きい

先ほど説明したオプションを、実装者が求める性質に合わせて選択して実装する形になります。

柔軟に作るなら複数オプションサポートして選択可能にしたいだとか、とにかく競合したくないのでカウンタを選ぶだとか、何かしらの意思決定をする必要があります。

それぞれ解決できる課題、解決できない課題、実装コスト、などが異なる。例えばカウンタとかはパッと聞くと便利そうに見えますが、ちゃんとやるならロックが必要で複雑化します。厳密にやるならグローバルロックなど必要ですがそんなことやってる間にmsecくらい経過しちゃうよ...などあり、ロックのとり方にもグラデーションがありそうです。timestamp精度向上は簡素だし機能しますが、発生確率が下がるだけで問題自体は発生しうる状態のままです。

uuid v7 を実装するということは、この取捨選択を理解し、得たい性質や捨ててもよい性質を見極めて RFC で言及されているそれぞれのオプションの一部もしくは複数を実装する意思決定をする、ということに他なりません。

uuid v7 は単調増加に関するオプションがかなり幅が広い定義になっていて、実装者にその意思決定の負担があります。実装自体はコンパクトになりがちですが、この何かを捨てる意思決定をしっかりやって方針を揃えて実装するのは簡単ではないです!

最後に

uuid v7 は実装者の裁量がかなり大きく、得たい性質に合わせて意思決定する必要があることを説明しました。

これはまあ、実運用上ありえる様々な要求にそれぞれのバランスで応えられるようにしているよ!ということなのでそれ自体には特に異論はないです。が、それをメンテしているソフトウェアでしっかり意思決定するのは利用文脈などにもよるので結構むずかしいです。

このあたりふんわり把握しておくと uuid v7 実装を見かけたとき「そうじゃよな」「わかるよ」「いいじゃん...」などの感想が持てるようになり便利だと思います。

バイブスお料理 虎の巻

はじめに

日頃わりとバイブスお料理をするんですが、最近バイブスの核心を掴んだ気がするので放流

初めて作る料理や、うまそうなレシピを見かけて料理するときはちゃんとレシピに合わせるんですが、日頃の料理はほぼレシピ見ずバイブスでやっています。一回作ったレシピも次やる時は好みに合わせてちょっといじります。

こういうのとか

こんなのとか

こんなのも

そこそこうまくいってるので、ぼくが掴んだバイブスの核心をシェアします。

もっとも大事なこと

いい感じのうまみと塩気があれば、適当に作ってもまあまあうまい。これがバイブスガイドラインです。

塩気をミスると料理は全て崩壊して食えなくなりますが、うまみはわりと無限にあっても味壊れません。

これ罠なんですが味の素は普通に塩分入ってるので無限に入れると壊れます。鰹節とかトマトとかそういう塩少なめのうまみ素材はおおむね無限でもOKという意味。

塩気たりなかったら後工程で継ぎ足しすれば成立はするので、バイブス料理ではちまちま塩分調整することをおすすめします。

うすく下味つけた上であとで全体に軽く塩分つけて、いくつかのステップで塩分ちょっとずつ調整するイメージ。

このへんやっとけばだいぶ雑にやっても「まあ食ってやってもいいな」くらいのものが生成できます。これが全ての基礎。バイブスはここからはじまる。基礎にして奥義なのじゃ。

マジで適当にやっても、これだけ意識すればわりとうまくいくので各位やってみてください。

うまみコンボ

便利情報として、うまみにはコンボの概念があります。複数のうまみ成分が合わさるとより強くうまみを感じるらしいです。なにそれ怖

なすの肉味噌はうまいとか、チキンのトマト煮はうまいとか、なんかそういう系です。

それぞれ素材ごとにグルタミン酸だのイノシン酸だのコハク酸だのあって要は2種類以上でコンボすることを目指せばいいです。

人類の歴史では既知のコンボが数多く知られており、鰹と昆布の合わせ出汁だの、肉とトマト挟んだハンバーガーだの、なんかさまざまあります。

既知のコンボはさまざまあるので各位開拓を進めましょう。

とはいえバイブス界においては特定料理のためだけに買い出しするなんてことはほぼなく、適当に買い溜めして家にある適当な素材で料理することになります。買い出しのときに事前に具体的なコンボを思い浮かべたりはあんまりしません。なぜならバイブスなので。

ここでおすすめなのが「とりあえず動物っぽいのと植物っぽいのをコンボ、不安ならもう一個足す」ムーブです。

これは大抵うまく行くし、残り物に合わせて食材をいい感じに消化できるのでおすすめです。

ここで問題なのが、人類がまだ出会ってない未知のパターンを引き当て、風味がめっちゃケンカして終了するリスクです。ケンカしてしまった場合はリカバリが必要ですが、ごま油とかニンニク、ネギなどのバカつよ香り軍団を突っ込めば食える程度にはなります。

ぼくの過去の失敗でいくと、めかぶ、豆腐、納豆、卵を混ぜて米にかけて食べたら、全ての良くないところが鬼の噛み合いして終了したことがあります。マイナスのシナジーを引いた。そのときはごま油とニンニクで炒め直してチャーハンにしてことなきを得ました。

さてみなさん、ここまで読めばおおむねバイブス料理はできそうですよね。ぼくもそんな感じで日々やっています。

既知のうまみコンボの学習を進めれば、余った食材とかでもなんやかやうまく使えるようになっていきます。既知のコンボはめっちゃ優秀で、相性やら風味やらがいい感じに噛み合うように考えられてるので雑にやればうまいです。めっちゃ助かる。

既知コンボへの理解を深めれば晴れてあなたもバイブスお料理ニストの仲間入りです。

便利!おすすめうまみ食材

バイブスお料理ニストとして、ぼくが学習した便利うまみ食材のリストを載せておきます。このへんは入手性もいいのでおすすめ。

最強のもの:

  • 白だし、かけだし、めんつゆなどの出汁系製品。うますぎるし何も考えなくていいが使いすぎると飽きる。大体は昆布とカツオみたいなコンボが内部でされてて、気にせず使えば1コンボ成立してる

植物ぽいもの:

  • トマト
  • ナス
  • たまねぎ
  • (塩昆布 海藻の風味あるし塩分も結構あるので量気をつけて)
  • (豆乳 噛み合うとうまいけどこれもクセ強)
  • 醤油
  • 味噌

動物ぽいもの:

  • かつお節
  • 魚。ものによってはクセ強いので注意
  • えび。アレルギーには注意

きのこ:

  • なんでも。ものによってはクセ強いので注意

貝:

  • なんでも。クセ強いので注意

ようはこの中から適当に素材選んでバイブスで調理すればそこそこうまくなるということ。

例えばエビとトマトなりをごま油で適当に炒めて、酒醤油みりんあたりで味付けして、卵とじとかしたらうまそうじゃない?ニラとかあってもいいね。味付けはナンプラーとかでもうまそうか。ニンニク生姜つけてもいいけど家にあったっけ?みたいな。なんかそういう感じ。

その際は適度な塩気をつけることと、ちゃんとうまみがあることに気をかけること。これがバイブスの屋台骨なので。

一歩進んだうま料理への道 下処理

さてバイブス料理でそこそこ食えるものを雑に生成できるようになったところで、せっかくならもうちょいうまいもん食いたいなーとなる方もいるかもしれません。

そうすると急に世界のレシピ本に襲われると思っている方!大丈夫です、まだもうちょい雑にやれます。

次のバイブスステップは下処理です。わかるよ!ごめんね!急にバイブスの国に存在しない言葉使って!ほんとごめん!石を投げないで!

バイブス料理を進めると加熱が必要な食べ物あるじゃん。肉は焼くとか。玉ねぎは火を通さないと辛いとか。

下処理、めちゃめちゃ雑にいうとそういうのをたくさん知っておくと便利っていうだけです。

肉もロースなど油分ない部位は片栗粉なりまぶして焼くとしっとり仕上がるとか、玉ねぎもめっちゃ炒めると飴色になって甘くていい感じとか、そういう小技集あるじゃん。その引き出し増やすだけ。どうでもいいけど飴色っていい言葉ですよね、とろーりした質感がある。

日常の料理でよく使うエース食材ってそんなにないから、エース食材のよくあるパターンに限れば覚えることは限定的。食材と料理の方向に合わせていい感じの下処理を選択できるようになれば、わりと雑にやっても「普通にうまい」くらいの飯が出力されます。

しかも下処理には「まあこの処理すればハズレはないな」みたいな王道なやつもあるんで、最低限それだけ覚えとけば成立します。ここで言ってるハズレない処理というのは、玉ねぎでいうなら生は辛いのでちゃんと火を通すとか、そんなレベルの話。難しくないでしょ

この下処理ライブラリを充実させていくと「適当に飯食いたいけど、家にある食材がこれだから、こんな感じで処理して組み合わせればなんとかなるだろ」みたいなのが普通にやれます。しかもほどほどにうまいものができます。(たまに失敗します)

ここまではあんまり努力せんでもシュッと到達する気がします。上で話してる通りバイブスガイドラインであるうまみや塩気を守って、うまみコンボをいくつか入手して、それにあった下処理デッキを育てればいけるため。

みんなでおいしくバイブス料理をやっていこう

もっと飛びたいひとむけ うまみのない食材をうまく使う

ここからは発展。このへんからバイブスの領域を抜けてきます。

うまみはないけど味やら風味がチョベリグで特定の組み合わせに入れるとバカうまくなるやつありますよね。

例えばきゅうりとか。ウリっぽい風味が良くて、冷やし中華とかに入ってる。あと大葉とかと合わせると青魚なんかにも合いますね。そういうやつ。このへんをまとめて味や風味を変える食材と考えます。

このへんの食材はバイブス理論からすると、言ってしまえばなくても料理は成立するけど、うまく使えるともっと飛べるタイプのやつです。このへん使いこなしたらめちゃうまパラダイスな日々が待っていそうじゃないですか??

なんだけどこのへんは僕を含むバイブスお料理ニストにとっては完全に覚えゲーなんすよね。なぜなら組み合わせの引き出しが十分溜まってないと未知の組み合わせについて想像できないため。世界には「既知のうまみコンボリスト」のように「既知の風味コンボリスト」もあって、それを見知った範囲で覚えてくのが一番手っ取り早いと思います。

個人的にはこの「風味コンボ」が料理でめちゃめちゃ独創性出る部分だと思ってます。「え!?そんなコンボでこの味が!?」みたいな驚きがたまにある。

使いやすくてうまみが強い食材、はある程度限られてますが、風味やなんらかの味をもたらす食材ってのはマジでめっちゃあるんで、その組み合わせはマジでハチャメチャある。

スーパーお料理クリエイターたちは、食材の組み合わせの空間を一生いろんな組で探索して「うまい」を探し求めているってことだと思う、多分。大変じゃん。いつもありがとうございます。

あとは焼き方で風味変わるみたいな概念も出てくるんで素人が探索するのは正直無理ゲーすぎる。おとなしくスーパーお料理クリエイターが出してくれてる風味や調理のコンボ集を学習しよう。これがレシピってことだと思う。

レシピやってバイブスお料理で使える引き出しどんどん増やせば経験溜まっていって、つくったことない食材の組み合わせでも多少味の想像働くようになるんだと思う。そうすると未知の組の探索ができるようになってくる。でもそこまでいくと「バイブス料理」じゃなくて「料理」じゃん...というか「料理研究家」じゃん...となってしまうけど。

あと余談だけど焼き方はむずすぎる。炒めるだけでかなりグラデーションあったり素材との相性とかあるのに、煮る、オーブンで焼く、蒸す、とか七色の加熱方法がある。それぞれ出力される結果が違う。炒めたらうまいけど煮たらうまくないとかもある。助けてくれよな。閑話休題。

好きなコンボの一部を拝借して自分の他のバイブス料理にくっつけるとかできるので、一度知った風味や調理のコンボはめちゃめちゃ応用が効く。料理って無限やねんな〜はえ〜すっごい

そのさいレシピを逸脱した適当なコンボするときでも、十分なうまみと適度な塩気さえ保てば、めっちゃクセ強い素材使ってない限りはおおむね崩壊しない。うまみと塩気はバイブスの屋台骨なんじゃ

引き算

そんなこんなでバイブスやってると、適当に作った料理が「うまいけどなんかゴチャゴチャする」的な状態になることがある。僕はよくなる。

なんかマジうめーレシピ試してみたりすると、たまに素材や調味料の種類少ない回あるんですよね。意味のあるものしかなくてシンプルに成立してるもの。

種類が少ないとそれぞれの素材が強く出るので特性を活かせて、それをうまく使っておいしく落とし込んでるとすげーいい感じになる。こういうレシピはすげーなーという気分になる。

成立してうまいラインまで引いてくのがお料理奥義なのかもしれん。究極的にはステーキとか肉にソースつけて食うだけでうまいしな。

ぼくは引き算までは辿り着いていません。

最後に

バイブス料理の虎の巻を紹介しました。日々こんな感じでやっています。これを見るとバイブスの範囲ならマジでテキトーにやってもいいことがわかると思います。なので僕も日頃適当にやっています。

自分が食べたいものをその時の気分に合わせて、たいして手間なく作れると嬉しくて便利です。マジですぐできるものは10分とかでできるし。適当に人が家に来たときにシュッと出せると便利じゃんになっていいです。人に出す料理は冒険しないようしようね。

これでみんなもバイブスゲットじゃぞ〜となるといいな、そこそこ楽しくて便利なので。近くに沖縄料理屋がなくても普通にうめーゴーヤチャンプルーが食えるぞ!

やりたいことリスト100

やりたいことリストめも、随時更新!まだ100こないけどふやしたい

直近一年くらいでやりたいなー

たべもの系

  • 生のカカオからチョコを作る
  • アンチョビ作る
  • からすみ作る
  • 高知でカツオを食べる
  • モンステラの実をたべる
  • 完熟パイナップルを食べる、普段食ってるあいつには向こう側があるらしい
  • ハーブそだててモヒートやる
  • ピザ釜かってぴざをやる ピザスクリーンもいる
  • 同僚に銀座亭奢ってもらう
  • さわやかいく
  • ドリアンくう
  • ホヤくう
  • マロリーポークステーキいく
  • ウルフギャングいく
  • 豊洲で魚買って手巻き寿司パーティー
  • 低温調理器具かう、ローストポークとかやろうぜ
  • 弱辛を認識する
  • なんか燻製やる
  • キューバサンドのお店 PAN at蒲田 いく
  • ダイキュリーアイスくう
  • パスタマシンもらったので生パスタをやる

いきもの系

  • 野生のオオサンショウウオみる
  • ぞうに触る
  • 名古屋港水族館
  • 鴨川シーワールド
  • 生きためんだこを見る
  • スナメリみる
  • かはく いきもの超ワールド展 https://ikimonoworld.jp

アクティビティ

  • めっちゃ酔っ払ってるときにコーヒーを飲んで相殺できるか試す
  • 高知でヌオー電車に乗る
  • 人のゲームカセットをちゃんとやる
  • 夢の島植物館いく
  • 北海道いく
  • ヘリ飛ばす
  • やかたぶねのる
  • オタマトーン演奏会やる

暮らし

  • ねこを飼う
  • ねこのオリジナルグッズを作る
  • 小説をよむ
  • ジムかようおとこになりたい
  • ライム育てる、秋に植える
  • 映画を毎月みる
  • パジャマを着る暮らしやる
  • ポテトバック
  • 知らない駅で降りてチェーン店以外で3店舗入る
  • 歯医者行く
  • チャリかう
  • Go本体に貢献
  • 恋愛
  • 月1くらいで休みの日午前中から予定入れる

コンテンツ

  • しろばこみる
  • コードギアスみる
  • おーいお茶俳句コンテストだす
  • ハンターライセンスかう
  • なんかコンテンツ生成