Wooohoo! Efter ganska precis ett års periodiskt slit är jag äntligen Microsoft Certified Professional Developer inom Enterprise Applications (.NET 2.0)! I praktiken betyder detta att jag är en av de knappt 4.500 i världen som har orkat släpa sig igenom de fem proven och att Avanades certifieringskrav är uppfyllda för min del. FREEEEDOOOOOM!
fredagen den 30:e maj 2008
tisdagen den 27:e maj 2008
Dator stor som ett eluttag
Okej, detta var kanske det coolaste och bisarraste jag sett under hela förmiddagen: en dator (tunn klient) som är ungefär lika stor som ett eluttag. Det är kanske framtiden, att ha datorn i källaren och sådana här uttag lite här och var där det passar? Undrar hur det skulle funka med CoD4...
Läs mer och se bilder på produktens hemsida.
Skattjakt som programmeringskurs på universitetet
Jag tyckte att de rena programmeringskurserna under min civilingenjörsutbildning i medieteknik ofta var ganska fantasilösa. Visst, man behöver gå igenom teorin ordentligt och det blir lätt lite torrt, men det kan man ta. Sedan finns det nästan alltid en labbserie, och där har läraren alla möjligheter att ta ut svängarna och hitta på något som inte är torrt. Men det gör hon eller han mycket sällan.
Jag minns ett undantag, och det var inte i en programmeringskurs. I kursen "Kompression av ljud och bild" fanns det en labb som gick ut på att på valfritt sätt komprimera (duh) en ljudfil så att storleksminskningen blev så stor som möjligt medan kvaliteten skulle hålla sig över en viss nivå. Sedan när man kände sig klar så skickade man in sina resultat och sin Matlabkod och läraren uppdaterade en topplista över alla labbgruppers prestationer. I och med att man kunde se topplistan hela tiden så var det lätt att bara sitta en liiiten stund till och tweaka för att klättra några placeringar. Kom man på en smartare lösning i efterhand gick det bra att skicka in nya resultat.
Nyckelorden här tycker jag är "valfritt" och "topplista". Eftersom det hela var en (vänskaplig) tävling så var det roligt att försöka förstå vad det var man faktiskt gjorde och lägga ner energi och tid. Och visst, en del var säkert helt ointresserade och bara skickade in första bästa godkända resultat, och det är ju såklart helt okej. Men jag tror många gottade sig utmaningen.
Utmaningen är det som saknas i många programmeringslabbkurser tycker jag. Visst, ibland är uppgifterna svåra, men det finns oftast ett sätt att lösa dem som är det bästa eller det som läraren tänkt sig (och det som labbassistenten kommer att peka dig mot om du frågar). Om uppgifterna istället var lite friare och lockade till kreativt tänkande så tror jag många skulle få ut mer av hela kursen.
Anledningen till att jag överhuvudtaget kom att tänka på detta nu är att jag för några veckor sedan fick nys om Google Treasure Hunt. Detta är en skattjakt för programmeringsintresserade, skulle man kunna säga. Deltagaren ställs inför miniuppgifter av stigande svårighetsgrad - det kan handla om att dekryptera en ledtråd eller att räkna ihop tal som gömmer sig i filer med särskilda namn i en stor struktur, eller något helt annat. Det hela är etappbaserat, så nya utmaningar publiceras efter hand. Man kan se det som en tävling (Google delar ut pris till de som är snabbast) eller bara gotta sig åt att klura på problemen i sin egen takt.
Jag har själv inte genomfört Googles skattjakt, men jag tilltalas verkligen av konceptet. Skulle man inte kunna ha något liknande som en slags labbserie som löper under kanske en hel termin, med nya utmaningar typ varje eller varannan vecka? Man lägger den kanske andra eller tredje året på utbildningen så att studenterna har hunnit lära sig grunderna och har de verktyg som behövs. Kan det funka?
lördagen den 24:e maj 2008
Stored procedures, MySQL, ASP.NET och Loopia
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.
Buffertkontot uppgraderat
Det är enkelt att byta, så varför inte? Kontot är tillgängligt via en internettjänst vars första intryck var bra. Jag gottar mig.
onsdagen den 21:e maj 2008
Skriv ut markering - en jävligt ny funktion
Okej, ibland tänker man helt snett. Scenario: Jag sitter på jobbet och har tid över, så jag tänker att jag ska läsa en bloggartikelserie om dynamiska serverkontroller som jag länge velat ta en närmare titt på. Jag bestämmer mig för att skriva ut artiklarna för att låta ögonen vila från datorskärmen. Artiklarna är populära och har många kommentarer längst ned och jag är intre intresserad av att läsa dem, så jag markerar själva artikeltexten och högerklickar, övertygad om att hitta en "Print selection"-funktion i Firefox' contextmeny. Ingen sådan existerar. Jag blir irriterad. Det är ju helt uppenbart att folk vill skriva ut delar av texter och inte bara hela sidor! Börjar googla efter ett addon som fixar biffen, men hittar inget. Helt otroligt. Jag hittar dock en artikel som skriver om varför IE7 har bättre utskriftsfunktioner än Firefox och där nämner de just denna saknade funktion.
Vad göra? Jag testar funktionen, gottar mig och skriver till och med ett blogginlägg som steg för steg beskriver hur man använder denna fantastiska nyhet. Jag publicerar mitt blogginlägg och känner mig nöjd över att ha skrivit två inlägg innan klockan 1030 en arbetsdag.
Sedan kommer insikten. I utskriftsdialigen, ni vet den där som finns i alla program och alltid har funnits där - kan man oftast välja mellan "All pages", "Pages from X to Y" och "Selection". Selection! Dags att vakna kanske? Jag har faktiskt aldrig använt det utskriftsalternativet tidigare och därför tänker jag inte på det, men jag har så klart sett det och det är lite skrämmande att jag inte kan komma ihåg det när jag verkligen aktivt försöker hitta en lösning.
Parentes: följden blev att jag tog bort min fina tutorial om hur man skriver ut markerad text i IE7 (ungefär 30 sekunder efter att jag publicerat den). Men sedan skrev jag detta inlägg istället, så jag har i slutändan trots allt varit blogg-duktig!
Idlar du? Desktop Tower Defense till undsättning!
Desktop Tower Defense finns exempelvis här.
Uppdatering: Ett annat liknande idlarspel är Onslaught, som du hittar här.
måndagen den 12:e maj 2008
Call of Duty 4 - ett riktigt bra spel
Som jag nämnt tidigare så har jag haft Call of Duty 4 - Modern Warfare (CoD4) liggande på mitt skrivbord, inplastat och fint, i väntan på tid att spela det. Nu har jag haft det - förra helgen bröt jag förpackningen och tog mig an singelplayerkampanjen. Jag tänkte dela med mig lite av mina intryck från spelet.
Till skillnad från de tidigare Call of Duty-spelen utspelar sig fyran som namnet antyder i nutiden (istället för andra världskriget). Handlingen kretsar kring jakten på en grupp terrorister som tycks ha kommit över kärnvapen, och spelaren intar (främst) rollen som soldat i SAS eller USAs marinkår.
I likhet med tidigare spel i serien är man fortfarande "en i mängden" - man springer inte omkring som en enmansarmé och härjar, utan oftast (beroende på uppdrag och situation) tillsammans med ett team, vilket är något jag uppskattar storligen. I kombination med riktigt realistisk grafik och bra ljud bidrar det till en stark upplevelse där man (åtminstone jag) har svårt att inte leva mig in i spelet. Tempot är ofta högt, striderna ibland kaosartade och man vill liksom inte titta upp från bakom muren där man sitter och trycker när kulorna viner över huvudet.
En annan sak som Infinity Ward (som gjort spelet) har lyckats mycket bra med är de olika filmiska inslagen - mellansekvenser där man fortfarande är en del av scenen men inte kan göra riktigt vad som helst. En mycket bra lösning där man driver handlingen framåt utan att tvinga spelaren att sitta helt passiv. Istället för att knyta spelaren till en enda karaktär får man känslan av att betrakta händelseförloppet från ögonen på flera olika personer, ett läckert grepp.
Något jag upplevde som negativt var känslan av att striderna var ganska hårt styrda - man avancerar en bit, sedan kommer man till ett område där det plötsligt väller fram fiender och där blir man kvar ett tag tills någon ropar "All clear!" över radion och då går man vidare till nästa område där fienderna sitter och lurar. Det följer liksom ett mönster som man ganska snabbt ser, vilket är lite tråkigt. Så tänkte jag i alla fall i början, och det stämmer väl hyfsat bra. Men vad jag upptäckte mot slutet av spelet är att striderna ändå är dynamiska till en viss grad - om jag till exempel struntar i att ta skydd och sitta och skjuta på nissarna från långt håll, där det "är tänkt", och istället chargar fram eller flankerar dem, då kan man dels komma vidare snabbare och dels få dem att dyka upp i en annan ordning.
Exempel: teamet kommer in på en gårdsplan och plötsligt ropar någon över radion att det sitter fiender på taket till ett fyravåningshus rakt fram. Efter att vi klarat av dem och tagit oss några steg längre fram dyker det upp terrorister på andra våningen i ett hus till höger, och vi fastnar igen med att hantera situationen. Om jag istället direkt sprungit in till höger och upp för en brandstege till övervåningen så ser jag med en gång att där sitter fiender, och då upptäcker resten av teamet dem också. Först efteråt när jag kommer ner igen får vi syn på killarna på taket rakt fram - en annan ordning av händelserna, som tidigare kändes så hårt scriptade. Jag kan fortfarande tycka att det är lite väl statiska strider, men jag kommer samtidigt inte på något annat spel som löst det snyggare. Det är ett linjärt spel, men känns väldigt levande ändå.
Allt som allt är jag hur nöjd och imponerad som helst - och då har jag i princip bara kört singleplayerkampanjen. Metacritics ger PC-versionen 93 av 100 i totalbetyg - jag kan till fullo ställa mig bakom den siffran. Gravt snygg grafik, fantastiskt realistiska karaktärsanimationer och en atmosfär som får en att uppleva händelserna snarare än att bara spela igenom dem. Rekommenderas!
onsdagen den 7:e maj 2008
Flashversion av Portal
Denna är nog rätt gammal, men jag som är lite långsam av mig hittade den precis. Det är en 2D-version av spelet Portal, gjort i Flash. Kanske är kul som tidsfördriv när det är downtime på jobbet? (Parentes: finns det någon annan än jag som har downtime på jobbet?)
fredagen den 2:e maj 2008
Google Maps laddar långsamt i Firefox - boven hittad
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.