Blog: Et Mozartøjeblik

Jeg sidder og skal have skrevet noget hobbykode.

Ude i datamuseum.dk har vi brug for et “bitarkiv” hvor vi kan arkivere historiske bits — for evigt.

Det er denne lille tilføjelse der gør at det ikke bare bliver et par shell-scripts eller noget andet hurtigt klamp.

Selve lagringen kommer til at foregå i “WARC” fil-format, som er ved at blive defacto standarden i digital bevaring og efter at have tænkt lidt over tingene er jeg kommet frem til hvordan det skal hænge sammen for os.

Vi skal have en rå storage-service, hvor man kan tilføje et objekt eller hente det igen givet dets unikke “WARC-Record-ID”.

Servicen leveres via HTTP/1.1 med POST, GET og HEAD requests og er utroligt simpel, hvilket naturligvis er med vilje.

Fordi WARC formatet er et “append only” format (et af grundene til at vi valgte det) skal alle POST requests serialiseres for ikke at have race-conditions og det gør også nogle boundary-conditions når en WARC fil når den ønskede størrelse nemmere at håndtere.

I teorien kunne man godt nøjes med at åbne WARC-filen i append mode og skrive hele records i en writev(2) operation, men da vi kan finde på at lagre hele diskimages kan det blive endog meget store write-operationer og det løser i særdeleshed ikke den race-condition der er når filen er ved at være fyldt.

Men alt i alt er det hele sådan set klar, jeg mangler bare lige at taste sourcekoden ind.

Hvilket fik mig til at tænke på en sætning Mozart skrev i et brev til sin far Leopold:

“Nun muß ich schließen, denn ich muß über Hals und Kopf schreiben; componirt ist schon alles, aber geschrieben noch nicht.”

(For dem der ikke er helt stærke i tysk mere: “Nu må jeg slutte og skrive over hals og hoved; Alt er komponeret, men ikke nedskrevet.”)

Vel er jeg ikke Mozart og dette ikke Idomeneo, men jeg må erkende at jeg lider af skriveblokering.

Ikke fordi jeg ikke kan, eller ikke vil, men jeg ledes ved at skulle skrive det samme kode endnu en gang.

Der skal bruges en tråd der accept(2)’er på en socket, der skal bruges en thread-pool, der skal bruges en HTTP/1.1 modtager/parser osv. osv.

Jeg har ikke tal på hvor mange gange jeg har skrevet den kode tidligere, og det er forsvindende få gange i forhold til hvor mange gange alle mulige andre har gjort det og det udstiller hvor antikt og ærligt talt utidssvarende UNIX API’et er.

Det er 30 år siden BSD4.2 blev releaset med socket(2) API’et, burde vi ikke i mellemtiden have kunnet blive enige om at bygge lidt bekvemme biblioteksrutiner ovenpå ?

F.eks:

Så vi ikke alle skal igennem hele socket(2), getaddrinfo(3), bind(2), listen(2) rutinen hver gang vi skal skrive en server ?

Og hvad med en:

Nu hvor vi er igang, så vi ikke alle skal sidde og lede efter [CR]?NL[CR]?NL og skille linierne og kigge efter ‘:’ mens vi husker på HTTP’s hjernelamme “continuation lines” og alt det der ?

Ja, jeg har kigget igennem /usr/ports for at se om der var noget jeg kunne bruge, men enten får jeg kvalme af kodekvaliteten, eller også trækker autocrap alt fra OpenSSL til g77 ind for at bygge noget der kalder sig noget i stil med “en simpel lille HTTP server.”

Hele ideen i systembiblioteker er at de indeholder veldesignede implementeringer af standard funktionalitet som har et velgennemtænkt API og som er testet helt ud i hjørnerne, så man bare uden videre kan bruge dem, uden at skulle bekymre sig om de nu også gør tingene rigtigt.

Det er f.eks derfor vi ikke sidder og skriver vores egne kvadratrodsrutine eller Quicksort hver gang vi skal bruge dem.

Men UNIX API’et forstenede i slutningen af 1980erne og bortset fra IPv6′s kvaksalverisk plastikkirugi er der intet sket siden og derfor ender vi med tusindevis af implementeringer af HTTP, XML, krypto-algoritmer og andre helt fundamentale ting.

Jeg er så træt af det pis, at jeg seriøst har siddet og kigget på om jeg skulle starte fra en kopi af Varnish kildeteksten, bare for at komme uden om min lede ved at skrive den N’te version af kode der burde have været en del af systembibliotekerne i mindst 15 år.

Det kommer til at vare lang tid før fremskridtet går for vidt.

phk

Posted in computer.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>