Vad händer nu och snart

Nu har det varit ganska lugnt här ett tag,men här kommer en liten uppdatering om vad som händer med Senatåg.se mm.

Jag har inte bara tagit det lugnt och laddat batterierna de senaste veckorna (även om det varit en viktig del). Jag har även varit runt och hälsat på diverse entreprenörer,bland annat på Stockholm Nightowls,och pratat med familj och vänner för att få inspiration om vad jag vill göra med Senatåg.se och mina andra siter i framtiden. Planerna har nu tagit ganska solid form,även om jag inte vill avslöja allt än innan det är helt spikat. Så mycket kan jag avslöja att det är en ganska stor livsändring som är på väg,och jag ser fram emot den med spänning!

Om du inte märkt det så lanserade jag även den nyaste versionen av siten för ett tag sedan. Det är några småbuggar kvar som snart är fixade,men den funkar och ser i stort sett ut som jag tänkt mig. Den närmaste tiden kommer fokus att ligga på dels statistik,nya funktioner i GovCrawler,samt Restidsgaranti.se. Hoppa förresten gärna över dit och signa upp dig för att få en inbjudning när nya funktioner lanseras.

Den allra närmaste tiden ligger dock ett litet inhopp hos Sveriges Radio som gästbloggare! Mer information kommer snart,men det känns som det kommer bli väldigt kul. Jag kommer främst att rapportera från en tågpendlares frustrerade vardag,men vi får se exakt vad det blir om. Du har väl förresten inte heller missat att jag för några veckor sen rapporterade LIVE från Centralstationen i fredagskaoset som uppstod när det kom lite snö i Stockholm,i programmet Haffa i P4 Sörmland?

Vill också passa på att pusha lite för Andreas Nilssons blogg där han skriver om den olycka som hände på Centralstationen för några veckor sedan,där en kvinna ramlade ner under tåget. Det var tåget till Eskilstuna,så det ligger lite extra nära kan man säga. Halkiga perronger och sista minuten påstigningar har nog dessutom hänt oss alla,åtminstone mig.

Share

Tekniken bakom Senatåg

Fick en förfrågan på twitter om att skriva lite om vad som driver Senatåg.se och vår indexeringsmotor GovCrawler,så jag tänkte jag kan passa på nu när jag har några minuter ledigt över nyårshelgen och beskriva hur det funkar lite i detalj.

Många journalister jag pratat med har frågat hur jag egentligen ”får in alla tågen i datat”typ ;) Jag har försökt svara någorlunda enkelt,men jag har inte sett det kommit med i så många artiklar. Kanske har det ändå blivit för komplicerad förklaring. Nåja,nu tänkte jag göra det extremt komplicerat,så det här är nog bara för de som har intresse av utveckling.

Grunderna

Senatåg.se och GovCrawler är byggda helt på Microsofts ”.NET-Stack”. Programmeringspråket är .NET 4.0 (ASP.NET och C#). Indexeringsmotorn körs på en Windows 7 maskin,och webbplatsen hostas på en Windows Server maskin med IIS7. Kommunikation med databasen,som ligger på en SQL Server,görs med hjälp av LINQ till Entity Framework. Jag har gjort vissa försök att köra databasen på MySQL istället för SQL Server av kostnadskäl,men det har inte funkat så bra som jag vill så tills vidare gäller SQL Server. I GovCrawler används även en NoSQL-databas vid namn Db4objects för att lagra en del data lokalt.

Under hösten har jag byggt om stora delar av webbplatsen för att den ska bli snabbare och mer lättanvänd. Med tanke på det ökade besökarantalet så måste jag ha gjort något rätt :) men man blir aldrig helt nöjd. Webbplatsen är som sagt byggd med ASP.NET,till större delen med WebForms just nu men tanken är att den framöver ska använda sig av ASP.NET MVC (när v3 är redo för produktion). Det mesta av gränssnittet använder sig av jQuery och jQuery UI,med diverse plugins,och kommunikation med servern vid sökningar m.m sker med AJAX-anrop och json-objekt. Vi använder också jTemplates flitigt.

Databasen

Databasen är inte så märkvärdig i sig,det är en ”vanlig”relationsdatabas med ett antal tabeller för statistik,stationer,företag,tåg m.m. Det som kräver mest jobb är egentligen att få in allt data på rätt sätt,det kommer från flera olika källor och måste tvättas och putsas innan det läggs in. Ett ständigt work in progress kan vi väl säga,även om det för det mesta är ganska stabilt. Databasen växer ganska mycket varje dag,just nu med mellan ca 10 000 och 20 000 rader per dag (mindre på helgerna då det körs färre tåg). Det är ju ingen facebook eller twitter men ganska spännande datamängder blir det!

Mina webbplatser hostas hos webbhosten Binero,som trots en del downtime,ssh-problem,och buggar i sin dashboard (den gillade verkligen inte IDN domäner,med t ex åäö,men det fixades nu i december) på det hela taget har varit en ganska stabil host. Villkoren är generösa tycker jag,och när man kör .NET 4.0 slipper man till och med det fruktade Medium Trust. Deras support har också varit väldigt tålmodig trots mina många klagomål ;)

GovCrawler

Det var då webbdelarna,men hur är det med indexeringsmotorn? Jag kallar den då för ”GovCrawler”,som i ”Myndighetsskrapare”ungefär. Den är inne på 4:e generationen (de tidigare hette andra saker,men viss kod har följt med) och ett antal versioner,och namnet är lite inspirerat från OpenGov-rörelsen som jag är väldigt fascinerad av. Jag har länge varit intresserad av öppna myndigheter och offentlighetsprincipen,och det var faktiskt efter fruktlösa försök att få Trafikverket att lämna ut det data som finns här på Senatåg.se som jag byggde GovCrawler. Det får däremot bli en egen bloggpost.

GovCrawler fungerar i grunden som en automatiserad webbläsare,den läser vissa webbsidor på en viss webbadress (främst hos banverket.se just nu) och sparar ner dessa på hårddisken. Sen läser den igenom sidorna efter intressant information,i det här fallet efter försenade och inställda tåg. Den är modulärt uppbygd,så det är relativt enkelt att lägga till moduler som hämtar information från andra myndigheter eller liknande,men i dagsläget så läser den främst information från Trafikverket. Efter att sidorna är hämtade så läses de som sagt in i en lokal databas,och den försöker sedan lagra datat även i databasen på nätet genom ett API. De intressantaste sidorna är de sidor som visar hela sträckan för ett visst tåg,med information om varje station,men även stationsinformationssidorna är bra att ha. Vi lagrar det mesta.

Tågen

Det var den förenklade versionen kan man säga,i realiteten är det lite svårare än så. Till exempel så vet man inte riktigt vilka tåg man ska hämta,det finns nämligen ingen öppen tidtabell där alla tåg visas. Eller rättare sagt,det finns en del men de är inte så exakta kan man säga,och kan variera över dagen. Bland annat finns Trafikverkets Tågplan,som sällan stämmer överens helt med verkligheten då tågoperatörerna gör egna ändringar efter den är spikad,och en del andra dokument från TrV med olika grader av detaljrikedom. För att veta vilka tåg som ska hämtas så använder vi oss därför av flera olika källor,dels tittar vi på Tågplanen för att få en överblick,sen tittar vi på vilka tåg som gick samma dag för en vecka sedan (om det var en normal dag,inte över t ex julhelgen) samt läser stationssidorna för dagen och ser vilka tåg som körs då (fast där visas inte alla). Vi läser in tågsidorna några dagar i efterhand för att vara säkra på att få med all information även vid långa förseningar,så det är viss fördröjning. När det som nu är många tåg som är osäkra tittar vi dessutom även runt lite efter nyinsatta tåg som normalt inte skulle ha gått. När en tidtabell är helt ny tittar vi runt extra mycket för att vara säkra på att få med alla tåg,och för att bygga upp vår lista på tåg som går.

Just nu bygger jag om GovCrawler lite för att kunna visa lite mer aktuell information,men fokus ligger fortfarande på historiska förseningar. Trafikverket plockar bort sina tågsidor efter 2-3 dagar,så det gäller att hinna läsa alla ca 3000 sidorna innan det är försent (och utan att banka på servrarna onödigt mycket). Det ställer alltså höga krav på uptime,indexeringen får inte ligga nere någon längre tid (läs:max några timmar). Som tur var kan man köra den från flera olika datorer på olika nät utifall någon av dem skulle gå ner.

Inläsning

Sedan kommer analysfasen,där använder vi oss av det utmärkta HtmlAgilityPack för att skrapa sidorna på ett enkelt sätt. När vi har plockat ut datat måste det skrubbas,vilket sker med ett antal regular expressions och många många specialfall. Det är ingen rolig process,och kommer mycket från att det data som TrV visar upp ofta är bristfälligt,inte är konsekvent,och ibland helt saknas. Jag hoppas bara att deras interna system innehåller bättre data.. :) Hursomhelst,det är här magin händer kan man säga,det kräver en hel del tid och lite erfarenhet att få det rätt,och ibland blir det ändå fel. Vi kör därför stora batchuppdateringar,som fixar fel i det sparade datat genom att indexera om datat med bättre algoritmer,lite då och då.

Efter allt detta så behöver vi bara spara datat i databasen,så det blir sökbart på Senatåg.se. Om du undrar hur datat ser ut så kan du titta in på vårt API. Det är visserligen lite wrappat,i.e vi skippar att visa en del data som inte är intressant och lägger till annat,men ger ändå en bra ide på hur vår interna strukturer är uppbyggda.

Om något fortfarande är oklart eller du vill ha fler detaljer så ställ gärna frågor i kommentarerna.

Share

Uppdaterade siffror till artikel

Expressen har en artikel i dagens tidning (tror jag,har inte hunnit köpa den än) om kaoset på spåren igår som också ligger ute på nätet.

I artikeln så finns en del siffror om vilka sträckor som var värst drabbade under gårdagen,23 december. Jag plockade ut dessa siffror åt Expressen sent igår kväll,efter en specialkörning. Normalt sätt brukar vi inte hålla på med realtidssiffror (även om det kommer att ändras delvis i framtiden),då de ofta är väldigt osäkra (många tåg har inte kommit fram än t ex),och det tar tid att indexera och läsa in alla tågen. De siffror som Expressen fick med var alltså väldigt preliminära och osäkra,och jag försökte vara tydlig på detta,men jag är inte säker på att det framgår i artikeln. Hursomhelst,efter att ha fortsatt crunchat siffror under kvällen efter artikeln blev klar så kommer här en lite mer uppdaterad version av listan,men den är fortfarande på inget sätt helt komplett (disclaimer!) och datat kommer inte att vara sökbart förrän om några dagar. Observera att listan bara visar tågens kompletta sträcka,inte delsträckor som du kan plocka fram när du söker.

Nu ska jag njuta av julhelgen,ha en riktigt god jul du också!

Försenade tåg (anlänt minst 15 minuter sena någonstans på sträckan) tur och retur

Göteborg C <–>Stockholm C:38 stycken
Malmö C <–>Stockholm C:33 stycken
Hyllie <–>Göteborg C:29 stycken
Hyllie <–>Karlskrona C:22 stycken
Märsta <–>Södertälje centrum:19 stycken
Norrköping C <–>Jönköping C:19 stycken
Hyllie <–>Kalmar C:17 stycken
Kristianstad C <–>Hyllie:17 stycken
Sundsvall C <–>Stockholm C:14 stycken
Helsingborg C <–>Kristianstad C:14 stycken
Göteborg C <–>Alingsås:14 stycken
Gävle C <–>Ljusdal:14 stycken
Göteborg C <–>Malmö C:13 stycken
Stockholm C <–>Eskilstuna C:11 stycken
Ängelholm <–>Hyllie:11 stycken
Växjö <–>Hyllie:10 stycken
Hyllie <–>Helsingborg C:9 stycken
Helsingborg C <–>Åstorp:9 stycken
Hallsberg <–>Stockholm C:8 stycken
Stockholm C <–>Karlstad C:8 stycken

(+ en massa sträckor som hade 7 eller mindre förseningar)

Inställda tåg (blivit inställda någonstans på sträckan) tur och retur

Hyllie <–>Helsingborg C:44
Ängelholm <–>Hyllie:39
Helsingborg C <–>Kristianstad C:38
Göteborg C <–>Kungsbacka:30
Göteborg C <–>Alingsås:27
Malmö C <–>Ystad:24
Malmö C <–>Simrishamn:20
Hyllie <–>Höör:19
Stockholm C <–>Malmö C:16
Stockholm C <–>Uppsala C:16
Hyllie <–>Karlskrona C:15
Hallsberg <–>Stockholm C:14
Helsingborg C <–>Åstorp:13
Eskilstuna C <–>Arboga:13
Hyllie <–>Kalmar C:11
Hyllie <–>Kristianstad C:10
Stockholm C <–>Eskilstuna C:9
Malmö C <–>Göteborg C:8
Västerås C <–>Stockholm C:7

(+ en massa sträckor som hade 6 eller mindre inställda tåg)

Share

Det börjar lugna ner sig lite

Tack och lov! Har inte haft mycket fritid över för att bygga på siten den här veckan utan den har gått åt till att göra intervjuer och vara med i radio/tv. Jättekul på alla sätt,och definitivt klar omväxling från vardagen men man kan trots allt bara svara på samma frågor så många gånger innan . . . →Read More:Det börjar lugna ner sig lite

Share

Mer ska det bli

Veckan fortsätter nästan lika galet som den började. Igår fortsatte telefonen ringa,det var tidningar hit,radio dit,och sen kom en kamerakille från Rapport och filmade lite. Skulle egentligen visas i Östnytt bara men kördes till slut även i vanliga Rapport som jag förstår det. Någon som inte satt fast på tåg och hann . . . →Read More:Mer ska det bli

Share

Det är mycket nu

De senaste dagarna har varit helt galna. Det började egentligen med att Göteborgs-Posten mailade mig i förra veckan och ville ha lite siffror över förseningar,som jag var glad att plocka ut. Att visa statistik är en funktion som tänkt bygga till siten,jag har bara inte haft tid. Well,nu fick jag slänga ihop en enkel . . . →Read More:Det är mycket nu

Share

Statistiken visar läget

Det här blir ett ganska kort inlägg i brist av tid men jag kan rekommendera att läsa en artikel i Göteborgs-Posten idag där reportern bakom har tagit hjälp av statistik från Senatåg.se för att skriva artikeln. SJ och Trafikverket lämnar nämligen inte ut statistik över hur många förseningar/inställda tåg som varit eller hur lång tid . . . →Read More:Statistiken visar läget

Share

Vad väntar 2011

Här kommer lite information om vad som väntar under slutet av 2010 och vad vi planerar att lansera under 2011 här på Senatåg.se och på andra ställen. . . . →Read More:Vad väntar 2011

Share

Senatåg 2.0 –vad är nytt &hur funkar det

Nu i veckan lanserade vi senaste versionen av Senatåg.se,här kommer lite information om vad som är nytt och ändrat.

För dig som har använt Senatåg.se förut kommer det mesta att se ganska bekant ut,Utseendet du möter när du kommer in på sidan är ungefär som det varit tidigare,bara lite mer kompakt och . . . →Read More:Senatåg 2.0 –vad är nytt &hur funkar det

Share

Fräscht data och API

Nu är vi äntligen ifatt med indexeringen av allt data från i sommar!

För att göra en lång historia kort så ändrade vår databasprovider sina säkerhetsinställningar hux flux vilket innebar att vi inte kunde komma åt databasen från vår indexeringsmotor. Detta hände dessutom dagarna innan hela vårt utvecklarteam (dvs jag) skulle åka utomlands på semester . . . →Read More:Fräscht data och API

Share