måndag, november 22, 2010

Processorer

En central funktion i Fundament är möjligheten att länka samman flera resurser, så att resurs A ingår i resurs B, som tas om hand av resurs C. En sådan länkning kallas för en kedja:
/path/to/resourceA/path/to/resourceB/path/to/resourceC
Ovanstående länkning kan bara fungera om resurserna A och B faktiskt har förmågan att hantera andra resurser. Att resurserna A och B är processorer. Vissa filtyper har processorer knutna till sig. Till exempel kan varje XSLT-fil generera en XSLT-processor:
/path/to/file.xsl/!proc/
Subresursen /!proc är namnet på själva processorn, både för XSL-processorer och andra. På så sätt kan man uttrycka att en viss XML-fil ska processas av en viss XSL-fil:
/path/to/file.xsl/!proc/path/to/file.xml

måndag, november 08, 2010

Informationsmodellen

Fundament är en kollektion av resurser, ordnade i ett träd, precis som i ett filsystem. Resurserna kan vara filer, eller databastabeller, eller enskilda värden, eller vad som helst:

http://viggo.nu/examples/
http://viggo.nu/examples/some.txt
http://viggo.nu/examples/some.txt/!lines/
http://viggo.nu/examples/some.txt/!lines/23
http://viggo.nu/db/Persons/
http://viggo.nu/db/Persons/Ola
http://viggo.nu/db/Persons/Ola/!attrs/
http://viggo.nu/db/Persons/Ola/!attrs/shoeSize

Men antingen resursen är en mapp eller fil eller ett enskilt värde, så är resursen i Fundaments ögon ett exempel på basinformationsmodellen. Enligt basinformationsmodellen är varje resurs i stort sett en databasrad: en lista med attributvärden.

Vilka attribut som en resurs har är beroende av resursens typ. För en tabellrad i en databas är attributen förstås detsamma som tabellens kolumner. För en fil är det filattributen.

Precis som en databastabell definierar resurstypen en sekvens med attribut som utgör resursens primärnyckel. För en fil är det attributet name. För en tabellrad är det tabellens primärnyckel, antingen den är singulär (t ex Person.id) eller sammansatt (t ex kombinationen Dog.name och Dog.ownerId).

Dessutom kan resursen ha barn, om resurstypen är en sk kollektion. En mapp i ett filsystem är en kollektion, medan en vanlig fil inte är det. En tabell i en databas är en kollektion, medan en rad i tabellen inte är det.

Kollektioner:

http://viggo.nu/examples/
http://viggo.nu/db/Persons/
Inte kollektioner:
http://viggo.nu/examples/some.txt
http://viggo.nu/examples/some.txt/!lines/23
http://viggo.nu/examples/db/Persons/Ola
http://viggo.nu/examples/db/Persons/Ola/!attrs/shoeSize
Splitters är kollektioner, det är ett sätt att aktivt omvandla singulära element till sök- och traverserbara kollektioner:
http://viggo.nu/examples/some.txt/!lines/
http://viggo.nu/db/Persons/Ola/!attrs/
Vid traversering genom trädet krävs det att varje föräldrakollektion kan leverera ett barn givet ett id-uttryck. Varje mapp- och filnamn i kedjan är ett id-uttryck.
http://viggo.nu/examples/
http://viggo.nu/examples/aFolder/
http://viggo.nu/examples/aFolder/aFile.txt
Id-uttrycket är helt enkelt primärnyckeln (i fallet filer och mappar: värdet av attributet name). När det rör sig om sammansatta nycklar blir id-uttrycket detsamma som de två nyckelvärdena med ett komma emellan:
http://viggo.nu/examples/db/Dogs/Ola,Fido
http://viggo.nu/examples/db/Dogs/Ola,Laban
http://viggo.nu/examples/db/Dogs/Arne,Fido

Förutom attribut (där vissa ingår i primärnyckeln), och eventuella barn, har varje resurs en binär representation, dvs en serie bytes (enligt en viss MIME-typ) som returneras när man surfar till resursen.

Vad denna binära representation består av bestäms av resurstypen. För en fil är det naturligtvis filinnehållet. För en mapp är det innehållet i indexfilen precis som på en vanlig webbserver.

Innehållet är i alla hänseenden ett automatiskt attribut, alltså ett resursattribut som du inte utan vidare kan sätta direkt, utan som bestäms av värdet av andra attribut.

Innehållsattributet har ett särskilt namn: !content.

Adresserbarhet

En av de saker som internet har lärt oss är finessen med att allt data är adresserbart. Det är URL:en (Uniform Resource Locator) som är själva grejen. På webben, i sitt originalutförande, är varje dokument adresserbart:
http://example.com/some/file.txt
http://foo.bar/baz/garply.gif
REST-api:er försöker göra varje dataelement till en adresserbar resurs:
http://data.com/Persons/Ola
http://shop.com/Articles/135
I Fundament är varje dokument, varje dataelement, och varje del av ett dokument adresserbara. Dokumentdelarna görs adresserbara genom att man låter olika splitters dela upp dokumentet. En splitter är t ex !lines som kan dela upp textrepresentationen av en resurs i dess rader, där varje rad blir adresserbar med dess radnummer:
http://viggo.nu/example/some.txt/!lines/32
En annan splitter är !attrs som gör attributen för varje resurs adresserbara individuellt. Notera att de två förstnämnda exemplen pekar på samma datamängd:
http://viggo.nu/example/some.data
http://viggo.nu/example/some.data/!attrs/content
http://viggo.nu/example/db/Persons/Ola/!attrs/shoeSize
http://viggo.nu/example/some.txt/!attrs/lastModified
En väldigt dynamisk splitter är !split som splittar på ett regex:
http://viggo.nu/example/some.txt/!split/%25;/
Notera att varje splitter är en kollektion. Det gör att det går att söka i kollektionen, loopa igenom den, osv. Men allt sådant tar vi en annan gång.

söndag, november 07, 2010

Tillbaks i världen

Tjo. Det har gått tre år sedan jag skrev här sist, och mycket har hänt. Den gamla BOX-servern har utvecklats till att bli Fundament, en vänlig webbserver där folk som utformar gränssnitt till webbapplikationer lätt kan knyta samman funktionerna som finns förprogrammerade i servern. Samma serverprogramvara till många olika applikationer alltså.