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å.

måndag, april 09, 2007

LOST - Lowly Old School Transfers

A simplified, old-fart-stupid-web-0.9-compliant-dumbed-down-rest-file-transfer-protocol

I publish this in English since my frustration is to be heard all over the world.

After having developed at least three clean, nice, and neat RESTful file and application servers in PHP (for plain vanilla Apache installations), when deploying it at my web hotels' (servers outside my control), I discovered a lot of problems:

First: the authorization headers. Stupid safe-mode schmafe-schmode that restricts my scripts from reading those headers.

Then: the firewall only let GET and POST through!

Gnash gnash!

RESTfulness is beautiful, but since the world doesn't understand the economic value of protocol beauty, we have to go ugly.

My former take on the problem, the BOX server, was competent but a bit too complex.

Need to restate the problem: never mind the full functionality, here's the BAG (Bare-bones All Good) server, implementing Lowly Old School Transfers.

Workings

The URL space of LOSTful servers only references one type of resource: the folder. LOSTfulness is about storing and getting chunks of octets in folders. Folders are named using a path. Octet chunks are named using a file name.

Only two HTTP verbs are used, the plain old comrades GET and POST.

The folder itself understands more verbs.

GET

LOSTfulness in its most primitive form only recognize GET to the folders.

GET /foo/bar?name=my_file.txt

...returns the octet chunk that has its name property called "my_file.txt".

This ensures the RESTfulness of LOST: GET is still a safe operation.

POST

POSTs are not safe (they change stuff on the server), but should be idempotent (POSTing the same message twice should not mean something else than POSTing it once or trice).

For putting octet chunks at the server, we use the file-upload mechanism (POSTing "multipart/form-data").

For other verbs, we have to resort to command message postings.

Delete: cmd=del&name=my_file.txt

Removes the my_file.txt at the folder.

Security: user=foo&pass=qwerty

Basic authentication is used.

For legacy support, POSTing or GETting user/pass pairs will result in a session id header.

The security domain is a folder and all its subfolders.

onsdag, april 04, 2007

Tailer i ny version!

Nu kan man dra och släppa filer på antingen adressfältet eller det stora fältet.

Vidare finns där en knapp för att bläddra i filsystemet. Pause/Play-knapp med symboler för att pausa det aktiva bevakandet av filer.

Återstår: Copy (från cut-copy-paste) samt möjlighet att öppna flera fönster. Det sistnämnda är kanske inte så viktigt, det är ju bara att öppna fler Tailers.

http://fundament.se/tailer.jnlp

(http://fundament.se/tailer.jnlp, http://fundament.se/scrap.jnlp, http://fundament.se/sock.jnlp)

tisdag, mars 27, 2007

Liten idé

Idé som jag kanske kommer att implementera någon dag, eller också inte:

För att lösa brandväggsproblemet med instant messaging brukar man ibland låta meddelandena läggas på en server som man sedan pollar. Detsamma gäller P2P-applikationer.

Nå, inte ska väl en så enkel operation behöva olika implementationer? Visst är det där bara en instans av fall där en REST-filserver skulle göra susen. Tjipp-tjopp-skriv till URL. Tjipp-tjopp-hämta data vid URL.

HTTP for the win.

söndag, mars 25, 2007

Vi har spelat in musik

Jag och min vän Paul har, som vissa av er vet, en liten duo där vi spelar lite musik och sjunger ihop. Nu har vi gett oss till att spela in lite (tack vår musikaliska klippa P för all hjälp och begåvat dobro-spel):

Lyssna på! No Admittance har Paul skrivit, Hurt har jag skrivit, och One by One har vi skrivit tillsammans.

Update

Kanske ska byta namn på bandet. "EK" är tydligen även mexikansk dödsmetall (tack Tomas för påpekandet): EK.

torsdag, mars 15, 2007

Fundament Tailer ute!

Det tog en kväll att svänga ihop en första Tailer-implementation.

http://fundament.se/tailer.jnlp

Peka ut den fil du vill "taila" (skriv sökvägen i fältet). Pausa om du tycker att den behöver lugna sig.

Ska försöka få till ett multifönster också där man kan taila flera filer samtidigt, och som kommer ihåg vilka filer man tailade... En "Bläddra"-knapp bredvid fältet, bokmärken, refresh-knapp, symboler för "Paused" och "Running"... listan kan göras lång.

Men först måste jag försöka få ut RedNote.

EDIT: En vän saknade även möjligheten att dra och släppa filer på textarean/adressfältet. En god idé.

onsdag, mars 14, 2007

Mina två populäraste inlägg

Det mest efterfrågade på denna blogg, om man ser till statistiken, är mina två hurmangör-dokument om Apache 2.2 på Windows, samt PHP till densamma.

Nu fick jag reda på igår att det är lite svårt att söka fram dessa två, alltså repriserar jag deras URL:er här.

Varsågoda, Installera Apache 2.2 och PHP 5 på Windows:

PDF Scrap, trädräddaren i nöden.

Heh... Jag ska hålla en kurs i IBMs Message Broker. Kursen är skriven av IBM själva och innehåller en lärarhandledning på ...780 sidor !!!!

Mitt inre öga ser hur skogen mals ner och massafabrikerna tjänar multum.

Nå, mitt yttre öga är ganska gott och klarar att läsa liten text. Därför utökade jag Scrap PDF igårkväll med "Arrange 2x2".

  1. Se till att din infil är stående A4, genom att skala till det (drag och släpp den på "Scale to A4").
  2. Drag och släpp din fil på "Arrange 2x2". Sidorna arrangeras 4 och 4 på stora ark.
  3. Skala ner till stående A4 igen (drag och släpp).

Sådär, nu är sidorna förminskade fyra gånger och monterade fyra och fyra på A4 ark. Sparar skog, sparar bläck.

http://fundament.se/scrap.jnlp

tisdag, mars 13, 2007

jsolutions.se

Har dessutom en text på G om REST. Fast den får komma upp på firmabloggen istället.

Lite nya ideer och progressrapporter...

För det första saknar jag tail så att jag kan dö. Tail tillhör definitivt ett av de fundamentala verktygen, och sålunda bör fundament ha en implementation. Jag funderar på att göra den url-baserad dock, det är ju ändå 2000-tal. Men det kan bli lite lurigt, eftersom tail bygger på att läsa filer bakifrån, medan url:er handlar om att suga i sig resurser framifrån.

Jag drömmer fortfarande om det goda databasverktyget. En vacker dag kommer det, jag lovar.

Min gamla ide om en texteditor som minns allting tidsmässigt börjar så smått bli färdig. Den heter RedNote och funkar som ett superviktigt anteckningsblock.

Kommer förmodligen efter Tailer. Och Zap. Zap är en komprimerare/dekomprimerare. Drag och släpp mappar på komprimeringsikonerna, och det blir en komprimerad fil. Drag och släpp en komprimerad fil, och den kommer att bli en avkomprimerad mapp. Alltid mapp. Man ska aldrig behöva tveka om filerna packas upp hej vilt, eller om de packas upp i en snygg mapp.

Födda: Fundament Scrap

Nuså. Undertecknad proudly presents PDF-mojängen från garaget: Fundament Scrap. Gör så här:
  1. Se till att du har Java 6 installerat på din burk.
  2. Klicka på länken http://fundament.se/scrap.jnlp
  3. Drag och släpp dina PDF:er på någon av ikonerna. En ny PDF skapas i samma mapp som den gamla.
Jag gjorde den här för att jag gillar hemgjorda häften. Gör så här:
  1. se till att originalet är en PDF med jämnt antal A4-sidor (vid behov: skala till A4).
  2. Skapa häfte (Create PDF Folder).
  3. Skala till liggande A4 (A4 Landscape).
Nu har du fått en PDF som är sådan att om du skriver ut den dubbelsidigt, så är det bara att vika och häfta i ryggen (som en serietidning). Och jo: du måste lita på mig. Jag tänker inte skaffa ett certifikat, för allvarligt talat, om jag skaffar ett certifikat, hurpass mycket säkrare blir du då egentligen?

lördag, mars 03, 2007

Aforism

Himlen och helvetet är samma plats för systemutvecklare, en plats där man i evighet tvingas använda de system man själv utvecklat.

lördag, januari 27, 2007

Virtuella kontanter

En idé till: virtuella kontanter.

Tanken är inte ny, men har aldrig riktigt lyft. Här är mitt förslag:

Var och en kan ge ut sin egen valuta. Det som krävs är en hemlis. Genom att ange min egen hemlis, så kan jag ge ut min egen valuta.

Låt oss säga att jag skapar en egen peng: 100 Flunk. Pengen har ett sedelnummer som är skapat av min hemlis.

Nu ger jag pengen till min vän. För att pengen ska få sitt värde även för vännen, så måste vännen växla in pengen till en ny peng på 100 Flunk. Då invalideras min gamla peng, så att jag inte kan använda den flera gånger.

fredag, januari 19, 2007

Men överraska mig då!

Marknadsfolk. Lyssna nu riktigt riktigt grisnoga:

Hemligheten är inte att ge folk vad de vill ha. Hemligheten är att ge dem vad de till sin överraskning upptäcker att de vill ha!

Jag är professionell datanörd. Jag surfar på många nördsidor. Därför är jag tydligen dömd att nås av nördreklam. Prenumeration på internetworld, osv osv.

Dessa reklamskript som försöker ge oss annonser som liknar de siter vi redan besöker, de missar en viktig sak: folk vill bredda sig!

Alltså: tror ni inte att jag inte redan har läst senaste internet world? Finns det i era hjärnor att jag surfar för att försöka hitta sånt jag inte redan känner till?

Internet är till för att bredda vyerna, inte för att snäva till dem ytterligare.

Dumskallar.

fredag, januari 12, 2007

Två ideer till

För det första: en liten krypterad fil, för folks alla lösenord och hemlisar. Man kan välja att ha den på fundament-servern, eller i hemkatalogen, eller på den lilla USB-pinnen.

För det andra: en liten synkkatalog på den lokala datorn och servern. Enkel upp/nedladdning, som väljer den senaste versionen av alla filer, som ser till att inget körs över.

En bra bok

En bra bok: läs.

söndag, januari 07, 2007

Skapa PDF från blogginlägg

Jag har ju slutat bry mig om att vara förtegen med alla mina idéer. Istället gäller mitt nyårslöfte: kommunicera dem!

Min senaste idé jag jobbar med är en PDF-generator från blogginlägg. Jupps. Givet ett blogginlägg (eller vilken RSS/Atom-post som helst), så skapas en PDF.

Kan vara käckt. Vissa människor är ju så hopplöst utskriftsdokumentiga. Lättdistribuerat bland kostymnissarna.

Salut!

Songs.xsl, för gitarrnörden

Idag har jag suttit och tagit ut One med U2 på gitarren.

Resultatet kan beskådas här: www.fundament.se/songs/one.xml

Lägg märke till att låten är en XML-fil. Självklart är det XSL som står för presentationen! XSL-filen finns här: http://www.fundament.se/songs/songs.xsl

Leve XML! Leve U2! Leve nörderiet!

onsdag, november 22, 2006

BOX server är ute

Nu är BOX Server i drift på http://www.fundament.se/box.php.

Ta gärna en titt. Logga in med användarnamn: test, lösenord: test, och lägg upp lite filer och så.

BOX Server är alltså just nu en hanterare för "box"-objekt. Ett "box"-objekt är en filkatalog som lagras på en webbserver, men där filerna inte kan kommas åt om man inte är inloggad som rätt person.

onsdag, november 15, 2006

Uppdatering

Sådärja! Nu har jag börjat installera mig på nya jobbet.

Jag har alltså krupit in under konsultkepsen ännu en gång, nu som konsult på IBS Konsult, närmare bestämt på den del av IBS Konsult som går under namnet JavaSolutions.

Och vad gör då vi?

Jo, till att börja med så är ju IBS en tillverkare och leverantör av affärssystem. Konsultbenet opererar dock oberoende av affärssystemet (även om vi naturligtvis kan det) med att leverera expertis till våra kunder, såsom:

  • Objektorienterad analys, design, och implementation.
  • Teknisk projektledning och arkitektroller.
  • Javalösningar. Vi har kompetens och erfarenhet inom allt ifrån små inbyggda system till stora verksamhetsinformationssystem (Enterprise Information).
  • AS400. Jäpp, plattformen lever och frodas. En väldigt bra plattform för många tillämpningar.
  • Och självklart är vi duktiga på att integrera Java och AS400. Har du en gammal viktig grönskärmsapplikation i din verksamhet, samtidigt som du vill gradera upp din miljö (tjänsteorienterat, distribuerade objekt, mm)?
  • Utbildning. Eftersom IBS Konsult är ett företag som VetHurManGör, så är det bara naturligt att vi utbildar en massa.

det gör jag just nu. Kodar java. Objektorienterar. Utbildar i UML, RUP och agila metoder. Utforskar AS400/Java-integration.

Och har precis hur kul som helst!