Põrkemäär vajab ühte bitti, mitte jälgijat
Sisust ja selle ülevaatamisest
Selles artiklis
Kuni 28. augustini ei näidanud see sait põrkemäära ja teabeleht ütles, et see on tahtlik: see nõuaks mitme lehevaatamise vältel jälgitavat seanssi ja see nõuaks nõusolekuriba.
Esimene pool oli tõsi. Teine pool lakkas tõesti olemast hetkel, kui hakkasime väljumislehti salvestama, ja keegi ei uuendanud lauset.
Miks seda ei saanud lihtsalt arvutada
On lehelt lehele üleminekute tabel. See näeb välja nagu kõik, mida põrkemäär vajab: külastus, mis läheb ühelt lehelt teisele, ei ole põrge, seega loe üleminekuteta külastused.
See ei tööta ja põhjus on salvestuskoodi kolmes reas. Üleminek jäetakse välja, kui kaks lehte on samad, kui nende vahel on möödunud üle kolmekümne minuti ja pärast kolmesadat uut paari ühe loenduri kohta ühe päeva jooksul. Iga reegel on õige selle jaoks, milleks tabel on – näidata, milline leht viib millisele –, ja iga reegel teeb päris teise lehe nähtamatuks.
Samal ajal kestab külastus selle loendamise eesmärgil tund: nii kaua püsib rida elavas tabelis. Seega kasutaks lugeja ühte külastuse määratlust ja nimetaja teist. Arv poleks olnud veidi vale, see oleks olnud ankurdamata.
Mida andmed tegelikult ütlesid
27. ja 28. augustil oli 8 669 külastust ja 2 817 üleminekut, ehk keskmiselt 1,32 lehte külastuse kohta. 572 loendurist 99 salvestas üldse ülemineku.
See ei ole lüliti väljas – teesalvestus on vaikimisi sees ja kõigil 166 453 loenduril on see lubatud. Need saidid on tõesti ühelehelised: profiililehed, ühelehelised saidid, pildigalerii kellegi teise platvormil. Enamiku nende põrkemäär näitab ligi sada protsenti ja see on õige.
Üks bitt ja mitte mingit uut kogumist
Külastusel on juba tunniks rida. Nüüd kannab see veel üht asja: kas see külastus nägi kunagi teist, erinevat lehte. Väärtus pannakse paika lauses, mis niikuinii käivitub, ilma lisapäringuta:
ON DUPLICATE KEY UPDATE mehr = mehr | (url <> VALUES(url)),
last_seen = UNIX_TIMESTAMP(), url = VALUES(url)
Nende omistuste järjekord on kogu trikk. Andmebaas hindab neid vasakult paremale, nii et url hoiab võrdluse käivitumisel veel eelmist aadressi. Pange url esimeseks ja rida võrdleb uut aadressi iseendaga, bitt jääb igaveseks nulliks ja põrkemäär näitab kõigile sada protsenti. See on viga, mis näeb välja täpselt nagu usutav tulemus, mistõttu tasus seda enne usaldamist ühekordsel real tõestada.
Kui tund on möödas, loeb öine puhastus aeguvad read kokku – mitu külastust, mitu neist mitmelehelist –, kirjutab ühe rea loenduri ja päeva kohta ning kustutab read. Bitt elab tunni. Ei mingit küpsist ega midagi, mis seda üle elaks.
Mida üldistada
Huvitav küsimus ei olnud kunagi, kuidas seanssi jälgida. See oli, milline asi, mida me juba üles kirjutame, juhtub vastama küsimusele, ja kas vastus on ankurdatud sama määratlusega kui küsimus.
Kaks allikat, mis mõlemad näevad välja nagu külastuste mõõtjad, üks kolmekümne- ja teine kuuekümneminutilise reegliga, annavad suhte, mis on arv ja ei tähenda midagi. Ühe biti lisamine reale, mis juba olemas on, on lihtsam kui hiljem selgitada, miks määr on selline, nagu on.