第94話のlogout receiptが、lab奥のstate encoderへ入った。
cookie present 0
session active 0
account exists 1
draft count 2
イトは最初の三stateを、三枚のbit cardへ移した。
dark、dark、light。
残ったdraft count 2にも、同じ一枚を置く。
「下書きがあるなら、1でいいよね」
one-bit count leverを倒すと、restore previewが止まった。
actual server drafts 2
encoded draft count 1
restore slots requested 1
unlisted draft 1
一件ある状態と、二件ある状態が、同じlightへ押し込まれていた。
下書きは消えていない。
でも二件目を運ぶslotが、previewに出てこない。
「1は“ある”だけで、“一件”とは限らないんだ」
イトはleverを戻した。
bitは、0か1を表す一桁
bitはbinary digit。
一つのbitが表すvalueは、0または1だ。
one bit
0
1
だから一bitのpatternは二通りしかない。
0 = 下書きなし、1 = 下書きありと決めれば、presence fieldには使える。
でもdraft countとして0件、1件、2件を区別したいなら、二patternでは足りない。
イト
同じ1でも、“ある”と“一件”はfieldの意味が違うんだ
ユイ
valueだけでなく、何を表す欄なのかも必要なんですね
マコト
一枚の札へ意味を詰め替えたら、受け取る側にも同じschemaが要る
Picoは答えを作らない。
has_draftsのone-bit holderと、draft_countのempty railを別々のinspection lightで照らした。
0と1は、物理的な電源off / onだけではない
labでは、darkを0、lightを1として見せている。
実際のdigital circuitでは、voltageなどのphysical signalをvalid low / valid highとして区別する設計がある。
lowとhighの間を、いつでも安全な第三のlogical valueとして使うわけではない。
input thresholdとnoise marginを設け、多少のnoiseがあってもlow / highを取り違えにくくする。
ただしphysical implementationは一種類ではない。
charge、magnetic state、optical stateなど、何を二状態へ対応させるかはsystemによって違う。
0が必ず「電気なし」、1が必ず「電気あり」という意味でもない。
bitはlogical value。
lampは、その関係を見るためのmodelだ。
二bitなら、四patternを区別できる
イトはempty railへ、bit holderを二枚並べた。
一枚目は二pattern。
二枚目も二pattern。
組み合わせると、四patternになる。
00
01
10
11
一般に、n bitならpattern数は2^n。
二bitなら2^2 = 4だ。
今回のclosed fixtureでは、left bitの重みを2、right bitの重みを1と決める。
bits count
00 0
01 1
10 2
11 3
10が自然界で最初から2という意味を持つわけではない。
二進数の位取りを使い、leftを2の位、rightを1の位として読むから2になる。
width、bit position、unsigned countという解釈が揃って、初めて受け取り側も同じvalueへ戻せる。
よくある誤解:0は「ない」、1は「ある」と決まっている
0と1の意味は、fieldの約束で変わる。
has_draftsなら、0をfalse、1をtrueとしてよい。
draft_countの二bit fieldなら、10をcount 2としてよい。
別のformatでは、同じ10が色、文字の一部、命令の一部かもしれない。
bit列だけを見て、意味を一つに決めない。
さらに、bit orderやfield widthを失うと、区切り方まで分からなくなる。
value only 10
needed schema width 2 / left weight 2 / unsigned draft count
この話ではunsigned countだけを扱う。
negative number、fraction、character encodingの読み方は、それぞれ別の約束だ。
restore rehearsalまで残り24秒
二件のserver draftを、二つのtest slotへ戻すrehearsalが始まる。
残り二十四秒。
元のdraftはread-onlyに保つ。
0件、1件、2件を区別する。
今後のtest用に3件まで表せるようにする。
decoded countと実際のslot数が違えば、restoreを開始しない。
イトはone-bit leverの前へ三枚のroute cardを置いた。
イト
A。一bitの1をcount 1として使い、二件目は見なかったことにする
イト
B。half-lightを第三のvalueにして、一枚のlampへ0・1・2を入れる
イト
C。count fieldを二bitへ広げ、位取りとwidthを固定して2を10へencodeする
Aは、presenceとcountを同じschema名で扱う。
Bは、今回のbinary decoderがvalid 0 / 1として読めない中間状態を、説明なしに第三のvalueへ変える。
Cなら、四patternのうち10を使い、二件を二件のまま戻せる。
イトがone-bit pressを閉じ、two-bit railを開いた
イトは左手で、one-bit count pressのred lidを閉じた。
half-light dialにもdark lockを掛ける。
右手で、exactly two holdersのrestore-count railを開いた。
left holderをlightへ、right holderをdarkへ切り替える。

10でdraft二件を区別する。イトはschema cardをrailのreaderへ差し込んだ。
field draft_count
width 2 bits
interpretation unsigned count
left weight 2
right weight 1
encoded 10
Picoはtwo-bit holdersとschema readerの境界だけを照らす。
holder、draft、slot、readerへ触れない。
10をdecodeすると、二つのslotが開いた
readerはleft lightを2、right darkを0として足した。
decoded draft count 2
actual server drafts 2
restore slots requested 2
count / slot mismatch 0
二つのtest slotが開いた。
イトはdraft一件目をslot oneへ、二件目をslot twoへ送った。
draft one restored 1
draft two restored 1
source drafts changed 0
unlisted draft 0
一bit previewで隠れた二件目が、今度は別のslotへ着地した。
イトは二つのdraft coverを順に開き、内容が違うことを確かめた。
「“ある”じゃなくて、“二件ある”まで戻せた」
ただしfieldは一bitから二bitへ増えた。
保存や送信に必要なbit数も、そのfieldだけ一bit増える。
そして二bit unsigned countの最大は3だ。
四件目を表すには、三bit以上へ広げるか、別のencodingが要る。
bit数を決める確認順
最初に、区別したいvalueを数える。
yes / noの二valueなら、一bitで足りる。
0 / 1 / 2 / 3の四valueなら、二bitで足りる。
0から4までの五valueなら、二bitでは足りず、最低三bitが要る。
次にschemaを固定する。
field name。
width。
bit orderとposition weight。
unsigned / signedなどのinterpretation。
不足valueや範囲外valueを受けたときの扱い。
最後にboundaryをtestする。
今回なら0、1、2、3をencode / decodeし、4をsilentに0へ戻したり切り捨てたりしない。
表示されたbit列だけで終わらず、decoded valueと実物の件数を比べる。
presence fieldをcount fieldへ変えるなら、名前を変えずに意味だけ差し替えない。
古いreaderが残る場合はschema versionやmigrationも必要になる。
二bitは正しかったのに、draftが動かない
restore rehearsalは成功した。
イトは本番用のdata railへ、10とschema cardを置いた。
decoderは二件と読んだ。
でもdraft carrierは、一ミリも動かなかった。
data decoded 2
operation selected none
instruction started 0
「二件って分かったのに、どうして運ばないの?」
Picoは答えず、labの先にある新しいdoorを照らした。
doorの向こうで、細いbelt conveyorが動き始める。
data cardの隣を、別のinstruction cardが通り過ぎた。
valueを表すbitsと、何をするかを指示するbitsは、同じ役ではない。
イトはdata railのstart leverへ伸ばした手を止め、instruction slotを開いた。
次回、ピコルート第96話。
イトは、二件と数えられたのに一件も運べない?|CPUと命令の工房

