Startsidan

Prenumerera på mina inlägg:
RSS-flöde

Kontakta mig gärna via e-post:
anders.fjeldstad@gmail.com

Följ mig via Twitter:
twitter.com/Hihaj

Sök bland alla inlägg:

Inlägg i kategorin "Webbutveckling"

Mataffären.se får liv i Google Chrome

onsdag 17 september 2008 | Kategorier: Allmänt, Javascript, Webbutveckling | 5 kommentarer

Jag och Anna brukar använda Mataffären.se för våra veckohandlingar. Tjänsten är bra, men själva webbplatsen är stundtals ohyggligt frustrerande att navigera runt på. Framförallt är den långsam, vilket beror på att den överanvänder och missbrukar funktionerna i MS AJAX – när man exempelvis ändrar antalet för en vara (innan man lagt den i varukorgen) görs ett anrop till servern för att beräkna totalsumman för raden (!). Och inte nog med att den måste vänta på servern för att utföra triviala beräkningar, den skickar samtliga varor i det aktuella sökresultatet (kan vara många) till servern, även om den bara ska behandla en av dem.

Hursomhelst – eftersom sidan har mycket Javascript kopplade till rader i sökresultat och liknande så är den lite av ett lidande för de flesta webbläsare att rendera (särskilt IE6). På kul testade jag att göra vår senaste storhandling i Google Chrome istället för Firefox, och det var en ruskig skillnad! Istället för frustration gick allt faktiskt smidigt. Nästan så att jag glömde bort hur dumt de implementerat sin lösning…

Ett mycket hett tips till alla som använder Mataffären.se alltså.

Firefox 3 släpps ikväll

tisdag 17 juni 2008 | Kategorier: Allmänt, Webbutveckling | 1 kommentar

Download Day - English

Ikväll klockan 19 släpps den skarpa versionen av webbläsaren Mozilla Firefox 3. Som ett PR-stunt har Mozilla offentliggjort ambitionen att slå världsrekord i flest nedladdningar av en specifik mjukvara under ett dygn. Vill du delta eller veta mer så finns information här.

Shit alltså, jag är verkligen inte uppdaterad när det gäller sådant här inser jag. Spelnyheter har jag koll på, men MFF3-släppet hade jag aldrig känt till om inte Peter tipsat mig. Bättring!

Stored procedures, MySQL, ASP.NET och Loopia

lördag 24 maj 2008 | Kategorier: Webbutveckling | 7 kommentarer

Jag har under den senaste månaden jobbat på en webbsajt som ska ligga på ett konto på webbhotellet Loopia. Jag gillar verkligen Loopia, de har bra support, schyssta priser/tjänster och är trevliga att ha att göra med. Tidigare har jag mest kodat webb i PHP, men eftersom jag numera enbart sysslar med .NET i mitt vanliga jobb tänkte jag att det är lika bra att jag kör på med en teknik även på min egna tid. Man lär sig ju grejer hela tiden, och det känns effektivast att koncentrera sig på ett spår i taget.

Hursomhelst! Från och med version 5 finns det stöd för stored procedures i MySQL. Och MySQL har till och med varit så vänliga att de utvecklat en ADO.NET-provider som är specialanpassad för kommunikation just mellan .NET-applikationer och MySQL-databaser. Loopia tillhandahåller den senaste versionen av denna komponent på sina servrar. Bra förutsättningar för att utveckla seriösa webbapplikationer av medelstorlek alltså.

När jag utvecklat den här webbplatsen har jag kört den lokalt och låtit den gå mot min egen Loopia-databas. Det har funkat mycket bra och har fördelen att jag kunnat sätta upp en testsajt på mitt Loopia-konto också, med samma databas, som jag kunnat låta valda personer ha tillgång till.

Nu inför lanseringen av webbplatsen laddade jag upp den till det Loopia-konto där den ska ligga, satte upp databastabeller och stored procedures i kontots databas och tänkte att det borde funka smärtfritt från början just eftersom det är samma webbhotell och funkat så bra innan. Där bedrog jag mig!

När man gick in på en sida som anropar en stored procedure möttes man av följande glada meddelande från MySQL Connector/NET:

Unable to retrieve stored procedure metadata. Either grant SELECT privilege to mysql.proc for this user or use ”use procedure bodies=false” with your connection string.

Vad var nu detta? Jag hade ju skapat en databasanvändare speciellt för webbapplikationen, med precis de rättigheter som ska behövas. Och det kunde inte vara något fel på applikations- eller stored procedure-koden, för det hade ju funkat fint i utvecklingsmiljön, som är mycket lik produktionsmiljön.

Efter att ha bankat huvudet i väggen en stund gick jag in och tittade på ROUTINES-tabellen i information_schema-databasen som hör till varje MySQL-databas. Där kunde jag se att mina stored procedures fanns upplagda korrekt, att det var ett särskilt administrationskonto som skapat dem – ett konto som jag själv lagt upp just för detta – och även att något som heter SECURITY_TYPE var satt till ”DEFINER” på samtliga stored procedures. Det sistnämnda verkade intressant! Efter ett par snabba tester kunde jag konstatera följande:

I Loopias MySQL-konfiguration är det endast den databasanvändare som skapade stored procedure:n som kan exekvera den.

Är det smart eller bara irriterande? Jag är nog inte rätt person att bedöma det, men jag vet att det tog en stund för mig att lista ut det.

Uppdatering: Felmeddelandet jag fick ovan antydde att man kunde lösa det genom att ge SELECT-rättigheter för tabellen mysql.proc till aktuell användare, alternativt använda parametern use procedure bodies=false i sin connectionstring. Eftersom man sällan har möjlighet att dela ut godtyckliga rättigheter till höger och vänster om man använder ett webbhotell så testade jag det andra alternativet. Och det funkade! Det man måste tänka på då är att alla parametrar man skickar in till sina stored procedures måste anges i rätt ordning (alltså den ordning som stored procedure:n förväntar sig dem) och med rätt datatyp. Detta eftersom man helt går förbi den kontroll av parametrarna som annars görs av MySQL med hjälp av tabellen mysql.proc.

En annan lurig grej med Loopia har att göra med omstarter av ASP.NET-applikationer. I normala fall håller ASP.NET koll på om de filer som ingår i en webbapplikation ändras, varpå applikationen startas om så att ändringarna blir verksamma. Det kan handla om allt ifrån en ny version av källkoden till en enkel justering av ett parametervärde i en konfigurationsfil. Att hela denna apparat är nödvändig har att göra med att en ASP.NET-sajt faktiskt är kompilerad kod, till skillnad från exempelvis en PHP-lösning, där det rör sig om script som parsas när de efterfrågas. I normala fall fungerar det hursomhelst bra, även om själva omstarten/kompileringen av applikationen oftast innebär att besökaren/användaren får sitta och vänta några extra sekunder vid just det anropet.

Men på Loopia fungerar det inte så här. Enligt dem själva använder de en stor NAS där allt kundmaterial ligger – alltså alla webbapplikationer. Tydligen är den filstrukturen för omfattande för att ASP.NET ska kunna övervaka alla ändringar som görs (låter inte helt ologiskt), vilket rent funktionellt inneb¤r att den här omladdningsfunktionen helt är satt ur spel. Som ett alternativ finns det en automatiskt recycle-process som körs ungefär var 26:e timme, då applikationerna laddas om oavsett om det egentligen behövs eller inte.

Men det duger ju inte om man sitter och utvecklar eller testar en sajt! Vadå, ska man ladda upp filerna, konstatera att man råkat missa en inställning i Web.config och sedan vänta i upp till 26 timmar på att en korrigerad version ska börja användas av sajten? Det är naturligtvis helt ohållbart.

För att försöka lindra frustrationen har Loopia utvecklat en funktion i den kontrollpanel som man som kund har tillgång till där man manuellt kan begära en omladdning. En enkel knapptryckning så läses de aktuella versionerna av filerna in i minnet. På Loopias supportforum står det:

”…i Loopia Kundzon kan du själv begära att ASP.NET-applikationen ska laddas om, exempelvis efter att du gjort en ändring.”

Då är ju allt bra! Eller är det? När jag har använt funktionen har jag ofta upplevt ett märkligt beteende hos applikationen. Ibland laddas den verkligen om och får de senaste uppdateringarna, men om man sedan startar om den igen så kan den gå tillbaka till en gammal version. Och ibland verkar ingenting alls hända. Trots att det mycket tydligt står i kontrollpanelen att ”applikationen startades om med ett lyckat resultat”.

Efter korrespondens med Loopia har de bekräftat att funktionen inte alls fungerar som det står på supportsidorna. I verkligheten fungerar den bara en gång per recycle-intervall, vilket alltså betyder att man kan använda den en gång var 26:e timme. Jag kan alltså som mest uppdatera mina webbapplikationer två gånger per dygn, ungefär. Vilken lyx!

Loopia hävdar att de jobbar på att få fram en mer hållbar lösning på detta problem, men att det inte finns något datum för när det ska vara klart. Vilket betyder att de lika gärna kunde säga att man får leva med det system som finns idag.

Google Maps laddar långsamt i Firefox – boven hittad

fredag 02 maj 2008 | Kategorier: Webbutveckling | 3 kommentarer

Jag satt nyligen och prototypade lite med Google Maps API för första gången, och gottade mig rätt mycket. Förutom en sak – sidan jag arbetade med laddades in fruktansvärt långsamt i Firefox, det tog säkert tre-fyra sekunder. I Internet Explorer laddade den nästan ögonblickligen. Vadan detta? Det brukar ju vara tvärt om…

Jag misstänkte ganska snart att det hela hade med Firebug att göra, så jag inaktiverade det via dess egna inställningsmenyer. Ingen skillnad. Jag sov på saken. Dagen därpå (idag) tänkte jag att det måste ha med något Firefox-addon att göra, eftersom jag inte kunde hitta någon officiell information om att detta skulle vara ett känt fel eller liknande.

Jag testade att inaktivera samtliga addons via Firefox addon-meny, och vips så gick det mycket snabbt att ladda kartan! Efter att ha slagit på dem ett efter ett igen så insåg jag att det verkligen var Firebug som var boven – det räcker inte med att välja ”Disable Firebug” i dess egna menyer, man måste på riktigt inaktivera hela addonet.

Kanske kan spara någon lite tid.

CSS-nöt: Dynamisk "talande" webbplatsnavigering

måndag 21 april 2008 | Kategorier: Webbutveckling | 11 kommentarer

Jag håller nu på med att utveckla en webbplats där jag vill ha en ”talande” meny (se till exempel denna artikel i Smashing Magazine). Det innebär i princip att varje menyelement ska bestå av själva länknamnet plus en kortfattad beskrivning. Menyn ska vara horisontell och består bara av en nivå. Vidare vill jag att den presentationsmässigt ska vara helt dynamisk, så att jag kan generera den utifrån någon datakälla utan att jag manuellt behöver göra några inställningar för de olika menyelementen.

Det luriga är elementens bredd. Jag vill att varje menyelement (länk) ska vara precis så brett att länknamnet ryms på en rad – varken mer eller mindre. Beskrivningstexten ska anpassa sig till detta. Se exempel nedan:

Exempel på "talande" meny

Så vad är problemet? Strukturmässigt rör det sig om en länk som innehåller dels en rubrik och dels en beskrivning. Hur får man då länkens bredd att styras av rubriken, men inte av beskrivningstexten? Det har jag klurat lite på, men ännu inte hittat någon bra lösning. Dags för alla stylesheet-ninjor där ute att vakna ur slummern!

Några förslag? Jag kommer att uppdatera det här inlägget med den bästa lösningen som dyker upp.