onsdag 30 januari 2008

Slumpad sortering i Ruby on Rails


Jag arbetar just nu med en webbplats där jag ska visa en slumpvis utvald medlem på varje sida. Enkelt, tänkte jag använde mig av följande kod:

@member = Member.find(:first, :order => "RAND()")

Jag fick direkt felet SQLite3::SQLException: no such function: RAND: SELECT * FROM members ORDER BY RAND() LIMIT 1. Visst ja. Nu när Rails 2 har kommit kör vi ju SQLite3 istället för MySQL på utvecklingsburken. En Google-sökning talar om att SQLite använder RANDOM() istället för RAND(). Lätt fixat med andra ord:

@member = Member.find(:first, :order => "RANDOM()")

Sedan började jag fundera. Varför finns det inte en inbyggd Rails-funktion för det här? Member.find(:random) hade ju suttit fint. Jag hittade en ticket på RailsTrac som förklarade att ORDER BY RAND() är ett dåligt sätt att hitta en slumpvis utvald rad på. Det hade jag ingen aning om. Jag måste säga att jag gillar när Rails gör mig till en bättre programmerare på det här sättet.

Anledningen till att det är dumt att köra ORDER BY RAND() är att databasen måste gå igenom varenda medlem i tabellen, generera ett slumptal för varje rad och sedan sortera efter detta slumptal. Det är helt enkelt krävande. Har du tio medlemmar i databasen kommer det inte spela någon större roll, men har du tiotusen blir det lite segare.

Dessutom vill jag ju ha en lösning som fungerar oavsett om jag använder MySQL eller SQLite3 eftersom jag ibland växlar mellan de två i utvecklingsläge och produktionsläge. Lösningen blev följande:

@member = Member.find(:first, :offset => (Member.count * rand ).to_i)

Visst, koden genererar två databasfrågor, men slutresultatet kommer antagligen att bli snabbare. Dessutom fungerar det på båda databaserna. Vill man ha det snyggt i sin controller kan man ju dessutom lägga en del av koden i modellen.

# member.rb
class Member < ActiveRecord::Base
def self.random
Member.find(:first,
:offset => ( Member.count * rand ).to_i)
end
end

# members_controller.rb
def random_member
@random_member = Member.random
end


Den nya koden blir betydligt snabbare. Jag tog en databas med omkring 34 000 användare, och RAND()-varianten tar cirka 0,55 sekunder medan de två frågorna som genereras av min nya kod sammanlagt tar cirka 0,04 sekunder.

Är det någon som har en smartare lösning?

Tre saker, sedan sova?

Vad sägs om att bara göra tre saker idag men ändå vara mer produktiv än resten av gänget? Nyckeln verkar vara att fokusera bara på det viktiga. Man kan ju givetvis argumentera att allt man gör är viktiga saker. Fast de gånger jag av någon anledning har varit förhindrad att arbeta så mycket som jag skulle vilja har jag märkt att det ordnar sig ändå. Jag har prioriterat fram de viktigaste sakerna och gjort dem först. Så visst fungerar det på kort sikt, frågan är om det håller i längden?

tisdag 29 januari 2008

Xss_terminate skyddar mot skadlig HTML-kod

Med tanke på den senaste tidens våg av hackade webbplatser kan det vara läge att se över säkerheten på sina rails-baserade webbplatser. Xss terminate är en enkel plugin som rensar all HTML-kod innan den visas på sidan eller sparas i databasen. Den skyddar dig inte mot all världens elände, men gör det bra mycket klurigare att försöka ta sig in via cross site scripting-metoder.

måndag 28 januari 2008

Instängd hos Bilprovningen


Den 1:e februari skulle bilen ha fått körförbud om jag inte besiktigade den innan dess. Jag hade egentligen en tid den 15:e januari. Eftersom jag bokade tiden i november och av någon anledning fick för mig att jag skulle komma ihåg det utan att skriva upp den så missade jag naturligtvis att åka dit. Insikten kom först i fredags i form av en faktura från Bilprovningen.

Så idag stod jag där strax efter klockan två. Jag knappade in mitt registreringsnummer och ställde mig som bil nummer två i kön. Efter bara någon minut dyker det upp fyra bilar. En ställer sig bakom mig. De andra ställer sig på var sin sida om mig. Efter ytterligare fem minuter står det tre bilar bakom mig.

Då blinkar informationstavlan till. Mitt registreringsnummer dyker upp, och jag är helt instängd bland bilar. Eftersom det bara står en bil framför och tre bakom knatar jag fram till killen i den röda, knappt ihophängande Mazda 626:an framför. Jag knackar på rutan och frågar om han kan tänka sig att släppa förbi mig. Det kan han inte. Han har en tid 15.25, det vill säga om en timme. Då händer dagens lilla mini-mirakel. Samtliga tre bilar bakom mig börjar backa som på en given signal. De såg antagligen min uppgivna min och bestämde sig för att vara schyssta. Jag klämmer in bilen i port nummer 9, medan Bilprovningssnubben skrockar glatt "Du var inte den förste som blev instängd idag. Den där röde har stått där sedan klockan tolv. Han är inte registrerad heller."

Bilen blev godkänd utan anmärkningar, så nu dröjer det två år till nästa gång det är dags. Bilprovningen borde verkligen hitta något slags parkeringssystem där man antingen vet vilken port man ska in i eller där man står så att vilken bil som helst i ordningen kan köra in. Å andra sidan kanske det fungerar bättre om alla kom sådär svenskt lagom i tid.

lördag 26 januari 2008

Förkylt

Johanna har varit duktigt förkyld i ett par dagar. Jag antar att det är en av läraryrkets nackdelar att man ofta drar med sjukdomar hem. Antagligen ligger jag om någon dag ynklig i sängen med smågodis och serietidningar. Det är ju som bekant den bästa kuren mot vilken förkylning som helst, näst efter whisky. Om du har alldeles för mycket fritid kan jag rekommendera listan över 15 otroliga sammanträffanden. Missa inte historian om mannen som blir dödad av kulan i trädet.

onsdag 23 januari 2008

Försvinnande fakturor


IIS, de som sköter de svenska domännamnen, började för ett tag sedan skicka ut sina fakturor via e-post istället för via vanlig post. Det har lett till en hel del problem, inte minst för att folk inte förväntar sig att få sina fakturor via e-post när de tidigare brukade komma i brevlådan. I dag var det dags för några kommuner som skulle få sina domännamn avstängda på grund av obetalda fakturor.

IIS verkar vända på klacken och går tillbaka till pappersfakturor. I det här fallet är det bra. Vi har själva gått ifrån fakturor via e-post om inte kunden speciellt efterfrågar sådana. Anledningen är att betalningarna oftast inte inkommer i tid om man skickar fakturan via e-post. Det verkar som om folk inte har bra rutiner för att behandla inkommande mail, eller så tar man inte lika seriöst på PDF-fakturor.

Ett annat problem vi hade med IIS-fakturorna var att de plötsligt började komma till oss istället för kunden. Det berodde på att vi registrerade oss med vår kontaktadress när domännamnet beställdes i de fall kunden inte hade en egen adress. Kunden var dock givetvis ägare till domänen och fick fakturorna till sin vanliga fakturaadress ända till ändringen till PDF-fakturor slog igenom.

Så nu hoppas vi att vi blir av med problemen.

fredag 18 januari 2008

Programmerare med lite för tjocka fingrar

Jag läste om Dreamhosts blunder häromdagen. De är ett amerikanskt webbhotell som på grund av en liten programmerarmiss i samband med årsskiftet lyckades ta för mycket betalt av sina kunder. Nästan femtio miljoner kronor för mycket betalt. Programmeraren hade ingen bra dag, helt enkelt. Läs historien om hur det gick till, den är underhållande.

onsdag 16 januari 2008

Digitala inbrottsförsök

Det här året har börjat med flera intrång på stora sajter där databaser med lösenord har publicerats på nätet. Nu senast var det Efterfesten.com, men tidigare har Bilddagboken, TV3 och Aftonbladet fått sina inloggningsuppgifter spridda. Ett stort problem är att vissa sidor lagrar lösenorden i klartext. Ett annat är att folk ofta använder samma lösenord på flera olika sidor. Gör inte det. Vad som händer är att du kanske registrerar dig som medlem på Efterfesten.com med ditt vanliga lösenord 'bluttan29' och e-postadressen 'bluttansmail@hotmail.com'. När Efterfesten.com blir hackat kan folk läsa ditt lösenord. Om du då använder samma lösenord till din hotmail-adress kan folk enkelt logga in och läsa din e-post med hjälp av lösenordet från den hackade sidan. Hur kan du avgöra om en sida lagrar sina lösenord i klartext? Enkelt: prova att beställa ditt lösenord. Om du kan få ditt ursprungliga lösenord skickat till dig lagrar sidan det i klartext. Om ditt lösenord är sparat som en hash måste sidan istället skicka ut ett helt nytt lösenord till dig. Alla nya sidor vi på Standout programmerar lagrar lösenorden som hash + salt istället för klartext om inte kunden uttryckligen har begärt något annat. Det minskar inte risken att bli hackad, men det tar betydligt längre tid att knäcka användarnas lösenord. Jag gick igenom gamla sidor som jag har gjort och hittade ett par som lagrar inloggningsuppgifter i klartext. Dessa har jag nu ändrat så att de använder md5-hash plus ett unikt salt för varje användare. Än så länge är dock problemen med spammare betydligt större än problemen med hackare.

torsdag 10 januari 2008

Värmekänslig tapet


Värmekänsliga tapeter, hur kommer man på något sådant? Vansinnigt men snyggt. Och antagligen svindyrt.

(via I am rice)

Apropå inredningsdetaljer fick vi äntligen vår TV-bänk, så nu ser vardagsrummet nästan normalt ut. Dessutom fick vi undan en massa sladdar som vi tidigare snubblade över. Lägenheten blir långsamt bättre. :)

söndag 6 januari 2008

Hala vägar och kupévärmare


Äntligen blev det lite snö den här vintern också. Jag skriver äntligen eftersom jag sedan tidigare har skaffat nya vinterdäck, fått hyresvärden att fixa elstolpar till motorvärmaren och numera också har köpt en liten fin kupévärmare. Givetvis kommer Johanna att behöva ta bilen till Jobbet med start från och med i morgon, så jag får själv ingen större nytta av den.

I helgen var vi och firade en försenad julafton hos Mamma i Falkenberg. Det var snorhalt på vägarna. Jag och Tobbe lyckades dessutom med bedriften att köra en omväg på fem mil i halkan, vi hade alldeles för intressanta konversationer på väg förbi avfarten mot Halmstad. Hur som helst kom vi både dit och tillbaka samma kväll, trots att det rapporterades om trafikolyckor på i stort sett samtliga vägar i södra Sverige.

Vi har spenderat söndagen med att spela Settlers of Catan, och Johanna försöker sysselsätta sig med en massa andra saker än att oroa sig för första dagen på jobbet.

Internet Explorer 8 klarar Acid2


Likt en blåbärsnation i långskidåkning passerar Microsoft mållinjen långt efter de andra deltagarna i loppet. Omkring tre år efter, närmare bestämt. Trots fördröjningen är det goda nyheter att Internet Explorer 8 klarar det kluriga Acid 2-testet som Safari, Firefox och grabbarna började ge sig på 2005. Eftersom hälften av webbsurfarna idag använder Internet Explorer innebär det här förhoppningsvis att omkring 2010 kommer det att bli enklare att skriva webbsidor som fungerar hyfsat bra i alla webbläsare.

torsdag 3 januari 2008

Hoppa av din IT-utbildning om du får jobb

Peter Larsson skriver i IDG om hur glappet mellan näringsliv och lärosätena i landet ökar. Inom IT-branschen är det definitivt en sanning. Samtidigt skriver Computer Sweden om att allt fler hoppar av IT-utbildningarna. Jag tycker att det är helt rätt och bra. Det jag har sett av IT-utbildningarna i Sverige blir jag inte imponerad av. Universiteten säger att man inte ska hoppa av innan man har fått examen eftersom man då riskerar att bli av med jobbet i lågkonjunktur. Det är knappast troligt. Är du en tillgång för det företag du jobbar på lär du kunna behålla ditt jobb eller få ett nytt utan några större problem. Har du däremot bara en utbildning utan någon arbetserfarenhet ligger du mer pyrt till. Dan skriver om kassa utbildningar, fast på sitt egna vis:
I dagens samhälle finns det ett enormt dilemma. Det är följande: 1. Man har stor fördel i arbetslivet med en examen. 2. Det är slöseri att plugga för man lär sig inget vettigt.
Själv såg jag studerande som ett alternativ till att få starta eget-bidrag (som för övrigt endast verkar ges till långtidsarbetslösa nuförtiden). Man pluggar en utbildning man lätt kan glida igenom utan större ansträngning, får sitt studiemedel och har därmed pengar att leva på medan man startar sitt företag. Har man dessutom tur stöter man på en och annan intressant kurs på vägen - i mitt fall en kurs i bokföring och ett par i projektledning. Ett annat problem med IT-utbildningarna är att de verkar hålla rätt låg kvalitet, eller rättare sagt att de släpar efter. Branschen rör sig snabbt, och det duger inte att det dyker upp kurser i ämnen som var aktuella för två år sedan. Speciellt inte om utbildningen i sin tur tar tre år att genomföra. Jag har plockat in ett antal studenter på praktikplatser till mitt företag från utbildningar vid Växjö universitet, och deras lärare verkar inte ha en susning om hur det går till ute i verkligheten. Lite sorgligt kan jag tycka. Speciellt för studenterna som tror att deras kunskap är användbar.