söndagen den 27:e april 2008

TinyMCE och medium trust i ASP.NET

Det är alltid lite spännande när man laddar upp en ASP.NET-applikation man utvecklat lokalt till en webbhotellsserver. Kanske har man refererat till något användbart bibliotek som inte finns installerat på webbhotellet, kanske försöker applikationen göra något den inte får. Det senare fick jag smaka lite på nyligen.

Bakgrund: TinyMCE är en gratiskomponent för "rich text editing" utvecklad av ett svenskt företag. Den används för att förvandla vanliga textinmatningsrutor till mer Word-lika fält där användaren kan formatera texten lite som han eller hon vill. Mycket smidigt! Om man till exempel gör ett kommentarsformulär för en blogg kan det vara kul att låta sina besökare enkelt skapa länkar eller göra delar av texten fet, kursiv eller understruken, för att ta ett simpelt exempel. WordPress använder det i sitt adminsystem. Det är en bra komponent.

Eftersom TinyMCE i grunden är 100 % Javascript så konfigureras den också genom Javascriptkod. Det kan lätt bli lite kladdigt, och som ASP.NET-utvecklare tycker jag det är trevligt om man kan samla all konfiguration på ett ställe - i Web.config. Detta har såklart Moxiecode (som utvecklar TinyMCE) tänkt på, och har därför tagit fram en .NET-anpassad version av TinyMCE, som bland annat lägger till en configSection i Web.config där man kan göra alla möjliga inställningar för komponenten. Bra initiativ!

När jag senast, och för första gången i ett ASP.NET-sammanhang, skulle använda TinyMCE (version 3.0.7) laddade jag glatt ner .NET-versionen och konfigurerade den enligt de exempel som fanns tillgänliga. Allt fungerade som en dröm lokalt, men när jag laddade upp min lilla applikation till utrymmet jag hyr av Loopia så smällde det direkt:

Required permissions cannot be aquired.

Whaa? Vad har jag gjort för fel? Inget! Det visar sig att TinyMCE-assemblyn i min bin-katalog kräver "full trust" för att kunna kompileras och köras. Vilket är något som Loopia inte tillåter - i likhet med många andra webbhotell så kör de sin hostingmiljö i "medium trust", vilket innebär att de hostade applikationerna inte kan ta sig vilka friheter som helst. Jag förstår dem till fullo - jag skulle göra likadant.

Låt oss då ta ett steg tillbaka och fråga oss vilken del av TinyMCE det är som gör att komponenten som helhet skulle behöva "full trust". Det är ju en Javascriptkomponent (så står det till och med på utvecklarens hemsida - "100 % Javascript"). Javascript = klientsideteknik. Varför kräver den en massa rättigheter på serversidan?

Min gissning är att det beror på att de bakat in sin så kallade "GZIP Compressor", hädanefter kallad "Ulf", i .NET-versionen av komponenten. Ulf bygger i sin tur på SharpZipLib som enligt uppgift ska kräva "full trust". Ulf är förvisso användbar och ska enligt utvecklaren minska den överförda storleken på TinyMCE med cirka 75 % vilket ju är bra.

Lösning: Jag Googlade som en tok för att hitta någon form av lösning på det här problemet, men hittade inget vettigt. Verkar helt sjukt att ingen stött på det tidigare (alternativt så suger jag obeskrivligt mycket som inte direkt ser hur man fixar det). Vad jag dock av en händelse testade var att ladda hem källkoden till .NET-komponenten, kompilera om den och referera till den istället för till den färdigbyggda assemblyn som jag tidigare använt. Poff - "full trust"-kravet var som bortblåst.

Alltså:
  1. Ladda ned det utvecklaren kallar ".NET Package".
  2. Öppna solution-filen och bygg den med Release-konfigurationen.
  3. Kopiera den resulterande Moxiecode.TinyMCE.dll-filen till din webbapplikations bin-katalog (eller var du nu föredrar att lägga den) och referera till den.
  4. Ladda upp din applikation till ditt webbhotell och kör så det ryker!
Det är högst troligt att denna manuella manöver inte kommer att vara nödvändig länge till - Moxiecode fixar nog det där snart. Men nu vet du hur jag fick göra!

lördagen den 26:e april 2008

Morot för motivation



April och maj är sjukt stressiga för min del. Dels har jag ett jobbuppdrag på sidan av mitt dagjobb som tar upp i princip all ledig tid, och dels har jag det sista certifieringsprovet för min MCPD att plugga till - båda har deadline i slutet av maj.

Hur hanterar man en sådan situation? I mitt fall väljer jag att bara bita ihop och ta i lite extra. Det är trots allt inte så ofta jag har så här stor arbetsbelastning, och snart är det dessutom sommar och semester, så jag räknar med att kunna återhämta mig ganska snabbt efteråt.

Sedan har jag en liten morot som höjer motivatinsgraden: härom dagen fick jag ett exemplar av spelet Call of Duty 4 av Annas arbetsgivare, som tack för att jag hjälpte till att vektorisera en logotyp åt dem för några månader sedan. Jag räknade verkligen inte med att få något för det, gjorde det för att vara lite schysst bara, men det är klart att jag blev glad när jag plötsligt satt med ett av fjolårets mest hyllade FPS i knät!

Jag väntar med att sprätta förpackningsplasten tills jag passerat någon betydande milstolpe i arbetet. Så nu är det bara att konvertera ASP.NET-kod till speltid...

tisdagen den 22:e april 2008

Budgetspel is the shit!

Jag bläddrade nyss igenom lite "budgetspel" hos ett par nätbutiker och insåg att det finns en hel del schyssta grejer som ger mycket värde för pengarna. Här kommer några tips på PC-spel under 150 kr:

  • Supreme Commander, 69 kr. Ett strategispel som jag själv bara testat betan av, men som verkade lovande och fick bra kritik när det släpptes. Förhållandevis hårdvarukrävande.
  • Battlefield 1942 (Deluxe), 49 kr. Ah, nostalgin. Så många linjär algebra-föreläsningar som fick stryka på foten...
  • GTA San Andreas, 129 kr. Stort, underhållande, soft. Ett äkta idlarspel.
  • Dark Age of Camelot, 19 kr. Okej, HÄR har vi MMORPG-nostalgin. Jag kanske inte på allvar kan råda någon att verkligen köpa det men samtidigt...19 kr? Kostar pengar per månad dock.
  • Rome - Total War (Gold), 109 kr. Fantastiskt bra strategispel.
  • Warcraft 3, 99 kr. Detta RTS håller fortfarande, med en bra story och mysiga miljöer. Inget för folk med WoW-abstinens.
  • Company of Heroes, 69 kr. Förra årets bästa RTS, utan tvekan.

måndagen den 21:e april 2008

CSS-nöt: Dynamisk "talande" webbplatsnavigering

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.

tisdagen den 15:e april 2008

Glöm inte: billigare SL maj-augusti

Jag tänkte bara påminna om att SL:s säsongskort för maj-augusti som vanligt ger ungefär en månads rabatt, så att man får fyra månadskort till priset av tre. Typ. Kan vara bra att tänka på om man vill spara lite pengar! Kanske går de till ett Playstation 3?

Här finns alla biljettpriser.

fredagen den 4:e april 2008

Samsung, känn dig som hemma!



Jag har aldrig ägt någon TV. När jag flyttade till Norrköping lånade jag en under det första halvåret ungefär, sedan var jag helt TV-fri tills jag flyttade in i Sankt Pers Salonger, och där fanns det tillg¥ng genom...Jonas? Johan? Jag minns inte. Hursomhelst! Sedan jag flyttade ihop med Anna i Stockholm har vi använt hennes pjäs, som inte är helt olik Fuglesangs rymdhjälm. Nu har vi uppgraderat och för första gången äger jag åtminstone en halv TV.

40-tums Samsung med full HD-upplösning, jag välkomnar dig! Nu fattas bara en Playstation 3...

torsdagen den 3:e april 2008

MCTS gånger tre

Kom precis hem från hemkammandet av min tredje MCTS-certifiering, "Microsoft Certified Technology Specialist: .NET Framework 2.0 Distributed Applications". Grymt! Nu har jag "bara" kvar att skriva ett prov, sedan (om jag klarar det) är jag MCPD: Enterprise Applications Developer. Innan sommaren ska det ske!

.NET-API för Postens kollisökning

Jag önskar att det fanns ett litet program som låg i bakgrunden och övervakade uppdateringar för en försändelse hos Posten. Jag vill liksom veta när paketets status har uppdaterats, utan att själv med jämna mellanrum behöva gå in på Postens webbplats och göra en manuell kollisökning.

Man hade kunnat lösa det genom att ha kollisökningen uppe i ett fönster som uppdateras automatiskt förstås. Jag tittade lite på formulären som används för kollisökning. Det som de flesta säkert använder utnyttjar POST för att skicka kollinumret till själva spårningssidan, vilket omöjliggör att man t.ex. lägger till ett bokmärke för snabb åtkomst. Men det finns ett till formulär som av någon anledning använder GET. Såhär ser en URL ut som kan användas för direkt kollisökning:

http://www.posten.se/tracktrace/TrackConsignments_do.jsp?
trackntraceAction=saveSearch&lang=SE&consignmentId=83689516055SE


Det sista i adressen är variabeln consignmentId och innehåller själva kollinumret. Adressen skulle kunna användas för att skriva ett minimalistiskt API för kollisökning, vilket i sin tur hade varit smidigt om man skulle ta sig för att faktiskt utveckla exempelvis en widget/gadget eller motsvarande.

Undrar om det finns fler än jag som skulle vilja ha något i den stilen?

Uppdatering: Jag har skrivit ett mycket simpelt .NET-API för hämtning av statusinformation för en försändelse givet ett kollinummer. Du får använda det till vad du vill. Jag testade det nyss och då funkade det fint, men det kan mycket väl hända att Posten ändrar på strukturen på sin sida och då kommer det med all sannolikhet att sluta fungera. Jag tar inget ansvar för följder av eventuellt användande, etc.

Ladda ned filen här: PostenAPI.dll

onsdagen den 2:e april 2008

Fix för whitespace-bugg i ASP.NETs UpdatePanel

Idag satt jag i kanske tre timmar med en ruskigt irriterande IE-visningsbugg som jag trodde skulle driva mig till vansinne. MEN jag hittade till slut en fix, eller workaround i alla fall.

Felscenario: Om man har en UpdatePanel utan innehåll (eller med osynligt innehåll) så kommer den, när den uppdateras, att renderas som en div-tagg, förutsatt att dess RenderMode är satt till Block, vilket är default. Taggen kommer, vare sig man vill eller ej, att innehålla en massa whitespace - som i sin tur triggar en visningsbugg i Internet Explorer 6. En vettig webbläsare förstår att en div som bara innehåller whitespace inte har något innehåll och därför inte ska ta upp plats på sidan. Så är inte fallet för IE6 - där kommer nämligen div:en att få samma höjd som den aktuella fontstorleken.

Sjukt frustrerande! Om det hade varit en vanlig statisk div så hade man kunnat komma runt det hela genom att manuellt ta bort allt whitespace mellan taggarna, men det kan man inte på något enkelt sätt med en standardkontroll, om man inte vill skriva om hela renderingen för kontrollen. Det vill inte jag, i alla fall.

Fix: Efter mycket lidande kom jag på en lösning. Lägg helt enkelt till ett absolutpositionerat element inuti UpdatePanel:en, till exempel s¥här:

<asp:UpdatePanel ID="upTest" runat="server">
  <ContentTemplate>
    <div style="position: absolute; width: 0; height: 0;"></div>
  </ContentTemplate>
</asp:UpdatePanel>

Problemet löst! Visst, jag tycker inte om att lägga in markup som inte gör något, men om det krävs för att lösa en bugg som annars får sidan att se helt muppig ut s¥ implementerar jag den utan att blinka.