Hopp til innhold

Metadata

data som beskriver andre data, så de kan finnes

Hva det er

Metadata er data som handler om andre data: tittelen, datoen, språket, forfatteren, formatet og størrelsen som følger med et dokument, slik at mennesker og programmer kan sortere det, stole på det og handle ut fra det før de har lest det. Eldre standarder skriver ordet med bindestrek, meta-data, og i det daglige går metadataene under smalere navn: headerfelt i HTTP, egenskaper i en kontorfil, tagger i et bilde og front matter øverst i en Markdown-side.

Det er vanlig å dele dem i tre slag. Beskrivende metadata forteller hva noe handler om: tittel, opphav, emne og sammendrag. Strukturelle metadata forteller hvordan delene henger sammen: kapitler, sider og leserekkefølge. Administrative metadata forteller hvor noe kommer fra og hva det er lov å gjøre med det: når det ble laget og endret, av hvem, under hvilken lisens og i hvilket format. Dublin Core, femten elementer som ble standarden ISO 15836 i 2003, er den best kjente felles listen over beskrivende felt, og tittel, opphavsperson, dato, språk og rettigheter derfra dukker opp igjen under andre navn i nesten hvert format som har kommet siden.

En nettside bærer metadata i flere lag. Først kommer HTTP-svaret. RFC 9110 sier at et headerfelt kan endre eller utvide betydningen av meldingen, beskrive avsenderen, definere innholdet eller gi mer kontekst, og Content-Type, Content-Language og Last-Modified beskriver siden før en eneste byte av den er kommet fram. Inne i HTML-en ligger <title>, lang-attributtet og <meta>-elementer med navn som HTML-standarden definerer, f.eks. description, author og generator. Over dem igjen ligger vokabularer som andre parter leser: Open Graph-egenskaper til lenkeforhåndsvisninger og strukturerte sidedata for søkemotorer og assistenter.

Hva skiller så metadata fra data? Mer leseren enn bytene. En katalogpost er metadata om en bok, men for katalogen er postene selve datagrunnlaget. Tidspunktet et bilde ble tatt, er en detalj for den som ser på bildet, og råmateriale for den som kartlegger hvor bilder blir tatt. Metadata mot strukturerte data er det smalere spørsmålet, og svaret er at strukturerte data er metadata skrevet i et felles vokabular, slik at et program kan lese et felt uten å gjette hva det betyr.

Hvorfor det er viktig

Hvert felt er et lite løfte, og beslutningen som teller, er hvor hvert felt henter verdien sin fra: en person som skriver den inn, versjonshistorikken, en kolonne i en database eller det filsystemet tilfeldigvis melder. Programmer handler på disse løftene uten å kontrollere dem. Det er hele poenget med metadata, og samtidig risikoen.

Cacher og søkeroboter fordeler innsatsen sin etter dem. En nettleser som har en kopi av en side, sender tilbake Last-Modified-datoen den fikk, og når ingenting er endret, får den et kort 304 Not Modified i stedet for hele siden på nytt. RFC 9110 ber en server sende den datoen for enhver representasjon der den siste endringen kan fastslås på en rimelig og konsekvent måte, og vilkåret skjærer begge veier: der det ikke finnes noen konsekvent dato, ber standarden heller ikke om en. Endringsdatoen i et sitemap gjør den samme jobben for en søkerobot som skal velge hva den henter på nytt.

Mennesker og hjelpemidler er også avhengige av metadata. lang-attributtet forteller en skjermleser hvilke uttaleregler den skal bruke, og tittelen er det en fane, et bokmerke og et søkeresultat viser. Rettigheter reiser på samme måte: en pakkebehandler kjenner lisensen til en avhengighet bare fordi avhengigheten selv har deklarert den, så en lisensgjennomgang bygget på den listen er nøyaktig så god som deklarasjonene under.

Hvert felt må holde seg sant, så en side med førti felt har førti sjanser til å ta feil. Noen felt leser ingen: HTML-standarden påpeker at mange søkemotorer ser bort fra navnet keywords, fordi det ble misbrukt til å fylle søkeresultater med spam. Og metadata lekker, for posisjonen i et bilde eller revisjonshistorikken i et dokument kan si mer enn innholdet. Færre felt, hvert fylt fra en kilde som ikke kan drive av gårde, slår som regel mange.

Slik ser det ut i praksis

Metadata dukker opp i tre prosjekter på dette nettstedet, hver gang i en annen type fil: et sitemap, et sett PDF-er og en avhengighetsgraf.

Sitemapet til ett nettsted påsto en gang at 172 av de 176 sidene var endret i samme øyeblikk. Datoene kom fra filenes endringstidspunkt, et stykke metadata filsystemet fører selv, og innholdseksporten flytter det for alle filene samtidig, siden den skriver hver av dem på nytt ved hver kjøring. Rettelsen går gjennom en reservekjede, først et eksplisitt felt, så historikken i git, så filen, og den dokumenterer fellen i sin egen konfigurasjon: det bokstavelige feltnavnet må stå i listen, ellers leser generatoren aldri feltet. Postene bak sidene holder nå dagen hver oppføring ble skrevet og revidert, atskilt fra årene selve arbeidet foregikk, og en dato ingen kjenner, blir stående tom, ut fra prinsippet om at «et presist, feil tall er verre enn et fraværende». En ny synkronisering etter en måned med endringer berører 8 filer av 186.

For ni genererte PDF-dokumenter målt mot standarden for universell utforming krevde det å bestå alle 106 reglene et deklarert dokumentspråk og en reell tittel i metadataene, ved siden av tagget struktur, alternativ tekst og en eksplisitt leserekkefølge. De samme dokumentene feiler på nøyaktig én regel av 146 i arkivprofilen. Siden kaller det et nesten-treff og navngir regelen som feiler, fordi 145 beståtte regler ikke er samsvar.

Og da lisensene til 644 Rust-crates ble kontrollert ved hvert bygg, var den oppgitte grensen for revisjonen en grense i metadataene. Kontrollen leser lisensen hver crate har deklarert, deklarasjoner kan være feil eller ufullstendige, og kontrollen beviser ingenting om en crate som deklarerer seg selv feil. Den ble provosert til å feile med vilje to ganger, og det viser at kontrollen virker. Ingenting en kontroll gjør, kan vise at deklarasjonene den leser, er ærlige.

Hvor det går galt

Feilene nedenfor har ett trekk felles: alle kontroller som ikke leter etter dem, består.

Hver side ser endret ut etter hver produksjonssetting. En webserver som sender endringstidspunktet til en statisk fil som Last-Modified, eller en generator som daterer et sitemap på samme måte, oppgir øyeblikket filen ble kopiert, og en checkout, en eksport eller et containerbygg kopierer alle sammen. Cacher validerer alt på nytt, og søkerobotene lærer ingenting. Hent datoer fra versjonshistorikken eller fra et felt en person har skrevet, og la en dato ingen kjenner, forbli tom. I Hugo er kildene en liste som leses i rekkefølge, og feltets eget navn må stå i den:

enableGitInfo = true

[frontmatter]
date = ["date", ":git", ":fileModTime"]
lastmod = ["lastmod", ":git", ":fileModTime"]

Tittelen eller lenkeforhåndsvisningen viser ødelagte tegn. Tegnkodingen er metadata om hver eneste annen byte, og en parser som møter tekst før deklarasjonen, må gjette. HTML-standarden krever at elementet som deklarerer kodingen, får plass i sin helhet innenfor de første 1 024 bytene, og legger du det først i <head>, blir det ingenting å gjette på. På dette nettstedet leste URL-inspeksjonen i Bing (URL Inspection) en gang tittelen og begge Open Graph-strengene som Latin-1, fordi en lang tankestrek i tittelen kom før charset. HTTP-headeren oppga også UTF-8, men et verktøy som leser bytene uten headeren, har bare siden å gå etter. charset er nå det første elementet, og en kontroll bekrefter rekkefølgen på hver bygde side.

Den samme opplysningen står tre steder og stemmer ikke lenger. Tittelen på en side bor i <title>, i og:title, i de strukturerte sidedataene og, for en PDF, i dokumentegenskapene. Språket bor i lang, i Content-Language og i og:locale. Skrevet inn hver for seg glir de fra hverandre, og hver mottaker tror på sin versjon. Regn ut hver verdi én gang, i én mal eller funksjon, og la hvert sted som skriver den ut, lese akkurat den verdien.

Et dokument røper mer enn forfatteren mente å publisere. Bilder har med seg kameraet, tidspunktet og ofte posisjonen. Kontordokumenter har med seg forfatternavn, redigeringshistorikk og stier til maler, og en generator-tag navngir programvaren som bygde siden. Fjern ved eksport alt ingen har valgt å publisere, og behandle hvert felt som tekst en fremmed kommer til å lese.

Les mer

Ordliste