Tidszoner, radbrytningar och annat ofog

Postat 2009-04-21 00:09      Skrivet av lasso

Att programmera webbapplikationer är roligt för det mesta, men ibland blir jag helt galen på alla de små detaljer man måste få till innan det fungerar precis som man vill.

Ta till exempel det här med tidszoner. Jag ville visa svensk tid på alla inlägg och kommentarer i bloggen, men servern står nånstans i USA, så man måste räkna om tiden varje gång. Borde vara enkelt, eller hur? Bara att köra GMT plus en timme…

Problemet är dock att vi här i Sverige inte alltid ligger på GMT+1. Nu under sommartiden ligger vi på GMT+2. Visserligen skulle jag kunna gå in och ändra tidsstämpelns “förskjutning” vid varje skifte mellan vinter- och sommartid, men jag ogillar starkt att behöva gå in och peta på kod som borde fungera likadant året om.

Det hela slutade med att jag fick tänka om lite och skriva om all tidszonsrelaterad kod till att använda GMT-tid istället. På så sätt blir bloggen inte beroende av var servern står eller vilken tid på året det är. Själva grundproblemet (att visa svensk tid) löste jag sedan genom att skapa en funktion som kollar av om ett datum ligger inom intervallet för sommartid (sista söndagen i mars till sista söndagen i oktober) eller ej. Ligger datumet för inlägget eller kommentaren i detta intervall så visas tiden med GMT+2, annars används GMT+1. På så sätt syns alltid rätt “svensk” tid, oavsett serverns placering eller tid på året. Problem solved!

En annan sak det är lätt att glömma bort är radbrytningar. För den som skriver ett inlägg eller en kommentar är det naturligtvis okomplicerat, men det finns klurigheter som lurar i bakgrunden…

Lustigt nog har det med skrivmaskiner att göra. Man kan ju tycka att datorer borde ha gjort dem överflödiga för länge sedan, men faktum är att datorns tangenter ärvt förvånansvärt mycket från dessa forntida manicker.

På en skrivmaskin (av den riktigt gamla sorten) så var man tvungen att göra två saker för att kunna börja skriva på en ny rad. Dels var man tvungen att “hoppa ner” en rad (Line Feed) och dels var man tvungen att flytta skrivmaskinsvalsen i sidled för hamna längst ute till vänster igen (Carriage Return).

När de första datorerna sedan kom och tangentbordet övergick från att vara mekaniskt till att skicka elektriska impulser så fanns det ju egentligen inga skäl till att användaren skulle behöva utföra flera moment för en sådan enkel operation. Vad man gjorde var att man helt enkelt “slog ihop” momenten och kopplade dem till en enda knapp, den mäktiga returtangenten.

Men vad händer egentligen när man trycker på denna tangent? Ja du kära läsare, det är här problemen börjar…

I Windows så genererar ett tryck på returtangenten faktiskt två signaler till datorn. Dels skickas en signal om att markören skall återvända så långt vänsterut den kan (Carriage Return, CR), dels en signal om att markören skall hoppa ner en rad (Line Feed, LF). Windows fungerar med andra ord precis som en skrivmaskin (även om man slipper att flytta valsen själv).

Sitter man däremot på en Mac och jobbar så händer det andra saker då man trycker på returtangenten. Då skickas nämligen bara en CR! På Mac används alltså bara en signal, vilket brukade ställa till problem förr i tiden när Mac- och Windowsanvändare skickade dokument till varandra. Nu för tiden är dock detta problem mindre då de flesta textbehandlingsprogram är smarta nog att hantera detta.

För att komplicera saken ytterligare så finns det givetvis ett tredje alternativ. På Linux (och andra UNIX-baserade system) så används istället LF för att signalera en ny rad. Detta innebär alltså att det finns inte mindre än tre sätt att skapa en ny rad, men varför är detta då över huvud taget ett problem?

I “vanliga” fall brukar man inte se någon skillnad på de olika varianterna, men man stöter på problem när man försöker utföra beräkningar på texten. Jag har till exempel en funktion som plockar ut det första stycket i varje inlägg och använder det som sammanfattning i min feed. Var slutar då första stycket? Ja, det är svårt att veta om man inte vet vems returtangent som avslutade det! Om man inte kan veta om texten skrevs på en Windowsburk, en Mac eller en Linuxmaskin så får man problem med att utföra denna typ av beräkningar.

Lösningen är (precis som i fallet med tidszoner) att hålla sig till en standard och inte tillåta avvikelser. Eftersom bloggen körs på en Linuxmaskin så kändes det mest naturligt att använda Linux sätt att hantera radbrytningar. Varje gång det skrivs ett inlägg eller en kommentar så konverteras helt enkelt texten till att använda LF för att representera radbrytningar. På så sätt blir det samma resultat oavsett vilken dator som avsändaren har. Ytterligare ett problem ur världen.

Jag inser att det här inlägget blev betydligt längre än vad jag ursprungligen tänkt, men det är lätt att babbla på om nördiga detaljer som programmerare. Jag lovar att bli lite mer politisk (och kortare) i mitt nästa inlägg!

God natt, gott folk!

Inga kommentarer      Taggar:


Pingbacks

Det finns inga pingbacks

Kommentarer

Det finns inga kommentarer