Side 1 af 6 i kategorien NET Næste side

21. februar 2009
Here we go again
For lidt over et år siden blev jeg træt af min hjemmelavede og lettere forældede blog og skiftede til
blogger.com. De havde et fint Out-Of-The-Box system, hvor man fik det hele forærende, men med meget begrænsede muligheder for at tilpasse det som man gerne ville have det. Derfor var jeg hurtig til at skifte tilbage til et site jeg selv kunne passe og pleje. Valget faldt på
DasBLOG, fordi det var OpenSouce, ASP.NET og nemt at tilpasse som man ville.
Desværre er der også nogel begrænsninger i DasBLOG, og som det ofte sker med OpenSource projekter, mistede projektet momentum hen over året. Dette betød at DasBLOG blev overhalet indenom af
BlogEngine.NET.
Jeg har i den seneste uges tid rodet lidt rundt med at sætte et teststite op med BlogEngine.NET, for først og fremmest at se om det er noget der duer, og i så fald at konvertere indlæg og endeligt skifte dette site ud med den nye version.
Testsitet blev oprettet, BlogEngine.NET blev uploaded direkte, uden at jeg pillede ved noget, og vupti.. 1 stk. Blog. Så bliver det dælme ikke nemmere

Så kastede jeg mig over at ændre design på sitet, så det kom til at ligne dette site så meget som muligt, dog med en række forbedringer jeg længe har haft planer om. Igen en positiv overraskelse. BlogEngine.NET kommer med en lang række themes, og finder man ikke lige et man kan lide, er det nemt at oprette et selv.
Mit nye theme er endnu ikke helt på plads, men det er allerede ret tæt på at være som jeg gerne vil have det.
Som ekstra bonus findes der tools til at importere eksisterende blogindlæg, inkl. billeder og andet hejs, fra DasBLOG. Rigtigt lækkert og det tog ikke mange minutter at få alt flyttet over på testsitet. Det eneste der ikke helt ser ud til at være helt iorden, er hvis jeg fra et blogindlæg linker til et andet. Det er der jo ikke rigtigt noget at sige til, da URL strukturen jo ikke er den samme i de to bog systemer.
Som tingene flasker sig lige i øjeblikket kan det ikke vare voldsomt lang tid før jeg er istand til at deploye en ny version her på sitet. Happy days

9. februar 2009
Predicate metoder på Generic Collections
Helt tilbage i .NET 2.0 fik man mulighed for at benytte de såkaldte Predicate metoder på (blandt andet) collections af typen
System.Collection.Generic.List<T>.
Blandt disse Predicate metoder er FindAll, som i overensstemmelse med navnet finder alle elementer i listen, der overholder det givne predicate. (
Se MSDN dokumentationen for FindAll)
FindAll giver altså mulighed for at have en liste over dinosaurer, og så finde alle dem der ender på "saurus". Meget nyttigt

Heldigvis kan FindAll bruges til meget mere end det.
Det er nemlig også muligt at andvende en Delegate som Predicate, og så bliver FindAll for alvor interessant.
I forbindelse med en opgave på mit arbejde har jeg haft behov for at lave nogle Collections der nedarver fra
System.Collection.Generic.List og der på har jeg lavet nogle metoder med lidt ekstra funktionalitet. Nu kan jeg naturligvis ikke diske op med koden jeg har lavet, men principperne og scenariet kan vi godt lige vende her: Sagen er at jeg har en meget MEGET stor collection af elementer, hvert element kan være af en given type, defineret ved en Enum. Jeg har nu brug for at kunne bede listen om at give mig alle elementer af en given type (GetTypeSubCollection) og antallet af elementer af en given type (CountByType).
Koden så nogenlunde således ud for hhv. GetTypeSubCollection og CountByType (Objekttyper og variable navne er frit opdigtet, og overholder ikke de retningslinier jeg normalt benytter

:
public MyCollection GetTypeSubCollection(MyTypeEnum type)
{
var matchingElementCollection = new MyCollection();
foreach(MyCollectionElement element in this)
{
if ( element.Type == type)
{
matchingElementCollection.add(element);
}
}
return matchingElementCollection;
}
public int CountByType(MyTypeEnum type)
{
int count = 0;
foreach(MyCollectionElement element in this)
{
if ( element.Type == type)
{
count++;
}
}
return count;
}
Da jeg jo godt kan lide at udforske mulighederne i .NET Frameworket tænkte jeg at jeg ville prøve at se om der var noget fidus i at benytte FindAll, da det jo burde være en oplagt måde at opnå samme resultater som ovenstående, men med mindre kode.
Jeg endte med med følgende:
public MyCollection GetTypeSubCollection(MyTypeEnum type)
{
var matchingElementCollection = new MyCollection();
matchingElementCollection.AddRange(
this.FindAll(delegate(MyCollectionElement element){
return element.Type == type;
})
);
return matchingElementCollection;
}
public int CountByType(MyTypeEnum type)
{
return this.FindAll(delegate(MyCollectionElement element){
return element.Type == type;
}).Count;
}Metoderne gør det samme. Unit tests viser også at resultaterne stemmer overens. Der er en anonym delegate der klarer det predicate vi skal bruge. Og da vi benytter alle de nye smarte fiksfakserier burde det jo bare være topklasse. Men i eksperimentets hellige navn (og da der som sagt er MANGE elementer i min collection) lavede jeg lige en hurtig sammenligning af de forskellige implementationer. Resultatet overraskede mig faktisk en smule:
Der var 282664 elementer i min collection under testen.
GetTypeSubCollectionFør refaktorering: 13ms. Fandt 271081 matches.
Efter refaktorering: 24ms. Fandt 271081 matches.
CountByTypeFør refaktorering: 10ms. Fandt 271081 matches.
Efter refaktorering: 18ms. Fandt 271081 matches.
Ikke lige det resultat jeg havde forventet. Mit bud er at instantieringen af den anonyme delegate er skyld i at de refaktorerede metoder er næsten dobbelt så lang tid om at eksekvere som de originale implementationer. Det er lidt overraskende at der er så stor forskel, og jeg havde faktisk forventet at ListAll havde været hurtigere end foreach.
Tidstagningen taler dog sit klare sprog, og jeg endte med at vende tilbage til de oprindelige implementationer.

Derudover viser det også at det ind imellem godt kan betale sig at måle på sine optimeringer. Måske er der også andre steder hvor ens optimeringer virker modsat det forventede. Steve Mcconnell skriver i
Code Complete 2 (totalt yndlingsbog) at tidsmålinger bør indgå som et testparameter, især ved tidskritiske operationer. Det må det her nævnte eksempel da siges at være et tydeligt eksempel på

29. juli 2008
Opdatering
Siden her kører jo som bekendt DasBlog, og da jeg ikke havde opdateret i lang tid mente jeg det nok var et fint tidspunkt at gøre det nu. Jeg havde desuden en række egne tilføjelser til koden som nu også kører her på siden. Forhåbentligt er det ikke noget man vil lægge mærke til når man besøger siden..
..ikke før man kommer ind for at skrive kommentarer ihverfald.
Yup.. Nu på dansk 
Jeg er i øjeblikket ved at koordinere med DasBlog-teamet om at få den danske oversættelse med som en del af næste release
..og så har jeg allerede opdaget at en af de bugs jeg havde håbet ville være løst i nyeste version stadig eksisterer 

22. maj 2008
RockScroll -Scroll der rocker
Jeg er normalt ikke så meget for at kaste rundt med alt for mange Add-Ins i mit Visual Studio, men når der nu kommer et nyt Add-In der ser rigtigt spændende ud er jeg bare nødt til at prøve det.
RockScroll startede sit liv som et internt Add-In i Microsoft mørke kælder, men nu har den så endeligt set dagens lys. Jeg har prøvet den og an kun sige: "It really Rocks!!"
RockScroll er et lille Thumbnail af hele koden til den class du sidder og arbejder på. Dette thumbnail er placeret således at det er en erstatning for de eksisterende scrollbars. Samme funktionalitet kender vi allerede fra WinMerge. Det skal dog siges at RockScroll ikke helt kan gennemskue når der er regions der er klappet sammen. Nu bruger jeg ikke så tit regions, så for mig er problemet ikke så stort, men det er nu alligevel en fejl der burde gøres noget ved.
Læs mere om RockScroll og download her

21. maj 2008
Indtryk fra Mix Essentials 2008
Jeg var til Microsofts "light" udgave af MIX idag. MIX Essentials er et forsøg på at fange de essentielle emner fra MIX og præsentere på blot een dag. Alt i alt synes jeg at det gik ganske godt, selv om det hele blev en kende overfladisk og der var lige lovlig lidt kode i præsentationerne.
Arrangementet var delt op i et spor for webudviklere og et for webdesign, dog med en fælles opstart. Jeg havde valgt at følge sporet for webudviklere og her kommer mine indtryk fra arrangementet.
Keynote - August de los Reyes:
Vi startede hårdt ud men en meget grafisk og meget spændende optakt til hvordan Microsoft havde tænkt sig at fremtiden skulle komme til at se ud, og hvordan Surface idéen var kommet frem.
Det blev til en spændende tur gennem User Interface'ets (UI) historie, fra CLI (Command Line Interface), over GUI (Graphical User Interface) og videre til NUI (Natural User Interface). Længere ude venter så XUI (Organic User Interface).
Reyes forklarede lidt om hvordan den overflod af funktionalitet og regnekraft nutidens maskiner er udstyret med, gør at vi ønsker andet og mere end blot funktionalitet. Vi vil også have funktionaliteten til at være lækker og indbydende. Hans filosofi var at når system output mødtes med brugernes input ville magien opstå.
Der blev indraget eksempler fra spilverdenen (Nintendo og Halo) og diverse store tænkeres idéer, og det gav et godt indblik i hvilke kræfter der driver den udvikling Microsoft mener vi skal bevæge os hen imod.
Et rigtigt spændende indlæg, der dog var noget abstrakt.
Expression Blend - Christian Schorman:
Her fik vi en hurtig gennemgang af de nye features i Expression Blend. Det ser spændende ud, og jeg glæder mig til at prøve at bruge de forskellige værktøjer i brug. Schorman kalder Expression Blend for "Tools for better user experiences". Om det så holder må jo komme an på en prøve.
Vi fik en kort demo af hvad DeepZoom går ud på, men på grund af de tekniske problemer der skulle plage resten af dagen blev gennemgangen en smule importeret. DeepZoom er dog rigtigt fedt, men jeg frygter at det vil blive en teknologi som snart vil komme til at hænge alle langt ud af halsen fordi alle bare skal have DeepZoom.
Vi fik også en introduktion af begrebet RIA (Rich Internet Applications). Dette begreb dækker over nogle spændende muligheder og jeg ser frem til at se nogle gode og gennemtænkte eksempler på RIA i praksis.
RIA til Video-On-Demand - Erik Westermann
Der var ikke meget Video-On-Demand i dette indlæg. Igen drillede teknikken og Westermann havde valgt at genskabe en Panel reklame fra Microsofts eget website i Silverlight.
Det var et spændende lille projekt, men gennemgangen var på grund af den begrænsede tid lige lovligt overfladisk og det virker bare lidt for "lusket" at sige at det bare lige er 1-2-3 at lave sådan et sliding panel reklame, når man derefter kopierer store klumper kode man har lavet i forvejen ind, og siger "Så.. nu fungerer det". Lidt synd, for det virker ellers som om Westermann ved hvad han laver og hvad han snakker om. Men han kan jo heller ikke klandres at han får 45 minutter til at vise os alle de vigtige ting i et projekt han har arbejdet på i 2 dage.
Windows Live Platform - Neil Roodyn
I dette indlæg blev vi præsenteret for de mange nye features i Windows Live platformen. Det er en service som man kan tilmelde sig og som giver adgang til en lang række af Microsofts Live funktioner.
Disse funktioner var delt op i 5 Live Blocks:
- Find & Locate
(Live Search og Virtual Earth)
- Identity
(Live Id, det tidligere Passport)
- User Data
(Brugernes kontakter og personlige oplysninger)
- Notifications & Messaging
(Messenger selvfølgeligt
)
- Infrastructure
(Logging og Silverlight Streamserver)
Det var nogle ret spændende muligheder disse Live Block bød på. For eksempel ville man med Live Id kunne benytte Single Signon (SSO) på tværs af domæner, og man ville med metadata med geokoder let kunne vise steder på Virtual Earth (Som er Microsofts svar på Google Maps). På tegnebrædtet er en Virtual Earth ASP.NET kontrol, som er lige til at smække ind på sine ASP.NET sider.. Det bliver funky tider
Silverlight 2.0 - Tor Kristensen
Denne gennemgang var ret skuffende.
Vi så mere DeepZoom. Denne gang med sko, detaljer fra sko og modeller med sko på. Der var ikke ret meget kød på dette indlæg og jeg fik desværre ikke ret meget ud af det.
Tor Kristensen viste dog hvor relativt simpelt det var at tilrette DeepZoom funktionaliteten og skiftede i et snuptag skoene ud med nogle af de mange fede tegninger han tegner i sin fritid. De var virkeligt gode og gav faktisk en bedre oplevelse af mulighederne i DeepZoom end skoene gjorde. Men alt i alt et indlæg jeg godt kunne have undværet.
Love Your XAML - Rich Griffin
Sidste mand på podiet var Griffin der havde det simple budskab at vi udviklere lige så godt kunne lære at elske XAML først som sidst. Han ville starte en bevægelse i udviklerkredse: Investering i XAML er en investering i fremtiden og en investering i Surface.
Han kom godt ud i krogene og kom med gode argumenter for hvorfor XAML er så genialt. Hvordan UI blev adskilt fra logikken og hvordan designere og udviklere kan arbejde mere direkte sammen.
Vi fik også Griffins bud på hvordan XAML udviklernes toolbox burde se ud:
Griffin sluttede af med et rigtigt godt eksempel på hvad KAXAML kan, og jeg har allerede bestemt mig for at jeg skal bide mig godt fast i dette program i nærmeste fremtid.
Til sidst fik vi en lille opfordring til at tage godt imod de designere der nu skulle til at vænne sig til at arbejde mere tæt på den måde vi udviklere arbejder (lige som vi skulle lære noget mere fra designerne). Han nævnte som eksempel at source control ikke er noget designere gør så meget i.
Alt i alt var Mix Essentials et ganske fint arrangement, men jeg kunne nu godt have brugt LIDT mere kode. Det hele blev lige lovligt overfladisk.