Category Archives: .NET

Bagom Julekort 2011, Eksponent-style

Vi lavede i Eksponent et julekort i 2011.

Det gør alle udviklingshuse med respekt for sig selv.

Lidt fjollet, måske, men superlækkert HTML5 og det hele: uglekort.dk

Det var forhistorien.

Fra tid til anden mødes vi i Eksponent om aftenen til små hackathons – dvs, vi lader egentligt bare være med at gå hjem – hvor man spiser noget takeout og koder løs på ens egne ting i en rigtig rar atmosfære og sammen med folk, der altid er parate til at sparre.

På første hackathon efter julekortet var sendt ud, opstod ideen om at lave et custom julekort til Umbraco teamet.

@suneboeegh, @sniffdk og @mikkel_ovesen fandt på at lave en snake-klon ovenpå det eksisterende julekort, hvor de “frugter” man skal spise er billeder af medarbejderne i Umbraco. Og der skulle være en highscore table.

Det endte sådan her: uglekort.dk/h5yr (Prøv at slå highscoren!)

Når jeg overhovedet skriver det her, skyldes det ikke kun at jeg vil blære mig med mine seje kolleger, men at opgaven blev løst på en aften og måden det blev gjort på.

De skar opgaven op i tre komponenter: slange, frugt, score.

Så blev de enige om hvilke events, der optræder  i et snake-spil, og benyttede JQuerys bind/trigger hjælpere til at binde funktionaliteten sammen med. De tre komponenter hver især publicerer relevante events og reagerer på hændelser fra de andre dele af spillet.

Og med et simpelt publish/subscribe event api, kunne udviklingen køre parallelt og bidrage til et løst koblet julekort, bestående af tre javascript-filer, der inkluderes på det eksisterende julekort og vupti haves der en slange.

DISCLAIMER: det er gået stærkt, rigtigt stærkt. Og der har også være rødvin involveret. Så der er bugs i koden, og hvis du snuser i js-filerne, skal du have proof-of-concept brillerne på og vide, at det havde højeste prioritet at få noget ud af døren OG have det sjovt.

Robocode Christmas: And the winner is….

Med kun 5 deltagere var konkurrencen alligevel spændende.

Nå, men altså: Vinderen blev Rasmus Kromann-Larsen med en usædvanelig kløgtig robot, SteveTheCodeAbdomination, der på filmen ovenfor fremtræder i en giftiggrøn egnsdragt fra århusområdet. Bemærk Steves viljestyrke, evne til at undvige og hvordan han som en grævling ikke holder op med at gnaske i fjenden, før han hører det knase. Uden tvivl den rigtige vinder. Rasmus, der er en tank på vej mod din adresse….

En andenplads gik til Jakob Langeland, der som den eneste leverede en bot skruet sammen i F# og derfor fortjener en honorary mention.

En scoretable der viser den totale placering:
ScoreTable

Source til alle bots er smidt på bitbucket i en VS2010 solution: https://bitbucket.org/dalager/julebots

Og en bonusvideo: Se guld og sølv i en mano-a-mano match

Låge #8: It’s a RoboCode Christmas

Det er med stor stolthed jeg hoster lågen til 8. december i Microsofts udviklerkalender (se de andre låger hos Daniel Frost)

Ingen quiz her. Ingen valgmuligheder. Ikke så meget julehygge.

Du skal kode den ondeste RoboCode tank.

Din bot bliver vurderet dels på dens evner til at klare sig mod en enkelt modstander og dens evne til brutale masseslagssmål.

Alle regler gælder og det foregår på en 1000 x 800 bane.

Der er bunker af bots derude til at lade sig inspirere sig af, men jeg smider al sourcecode til alle bots på bitbucket efter konkurrencen, så hvis du gerne vil være stolt af din bot, så prøv at skriv det meste selv. ;)

Sidste frist for aflevering af din bot er 17. december kl 02:59.
Din bot skal sendes som kildekode til christian+robocode@dalager.com.

Vinderen kan køre hjem i en af dem her (og ja, det er den store af dem):

Og alle kan deltage. Også dig, far!

UPDATE: vinderen er fundet

Instruktioner. Med ske.

  1. Skaf dig noget java. Ja, du hørte rigtigt. Java.
  2. Hent robocode og .NET lib her: http://sourceforge.net/projects/robocode/files/robocode/1.7.2.2/
  3. Installer robocode-1.7.2.2-setup
  4. Installer robocode.dotnet-1.7.2.2-setup.jar
  5. Læs hvordan du skriver din første .NET bot og snus lidt til API’et
  6. Skriv din bot. Du har en bedre chance end du tror
  7. Spørgsmål i kommentarfeltet!

Selenium, MSBuild og TeamCity

Jeg har i de sidste par dage arbejdet på at lave setup til at afvikle frontend tests på et webprojekt med Selenium.

De tests-makroer man optager med med Selenium IDE, et plugin til Firefox, er i en nogenlunde ok kvalitet, og kan efterfølgende justeres til at være helt fine.

Den løsning jeg skal teste er ASP.NET, så de tests, der bliver genereret er ikke mere stabile end de DOM-ids som ASP.NET leverer, men det er ikke mit ærinde her at løse det problem.

Udfordringen har været at lave et MSBuildbuildscript, der på en TeamCity build server kan afvikle disse tests.

Så det ville jeg lige dele med jer.

Det er et simpelt projekt, der kan køres med
>msbuild.exe build.xml

Og så søger den på “Eksponent” på henholdsvis Bing og Google. Testen fejler sikkert hvis søgeresultaterne ændrer sig, men det illustrerer helt fint.

Ideen er at man kan bruge projektet som udgangspunkt til at lave buildservervenlige frontendtests, og det er nemt at smide nogle hooks ind efter sine tests til at lave datacleanup og verifikation af f.eks. oprettede brugere i et signup flow.

Alt er i pakken, men der er et par forudsætninger for at det spiller

  • Visual Studio 2010
  • Java JRE – til at køre selenium serveren
  • Firefox – som styres af selenium serveren
  • Rettigheder til at afvikle WMIC-kommandoer – der dræber selenium-server processen efter endt test.
  • Og hvis du skal bruge den i en build server, vil jeg foreslå TeamCity, der er markant nemmere at sætte op end CruiseControl.Net. Og desuden har en ret generøs freemium udgave med op til 20 buildkonfigurationer og 5 distribuerede build agents.

Hent pakken her: SeleniumTests.zip (17mb)

Giv lyd, hvis du har noget feedback eller hvis det driller. Eller kom forbi mit bord. Eller stop mig på gaden. Eller hvad din desperation og skam kan drive dig til.

AppFabric m Velocity distribueret cache

På et site som Arena365, som jeg bruger en del tid på, er der så mange små datachunks hist og pist at caching er en nødvendighed.

I starten er det fint nok at bruge den indbyggede HttpRunTime.Cache der gemmer data i applikationens IIS process, men hvis man har brug for at skalere ud til flere webservere kan være en fordel at have en central cache.

Velocity er microsofts bud på en distribueret cache. Andre kendte alternativer er kommercielle NCache eller open source varianten Memcached.

Velocity er en del af det som bliver markedsført som Windows Server AppFabric, og det er endnu et codename, som iflg ScottGU bliver erstattet af noget lidt mere enterprise-venligt senere. Windows Server AppFabric skal forstås som et samling af services som ligger ovenpå IIS’en og der findes også en AppFabric variant på Azure, som tilbyder nogle andre lidt mere mesh-agtige services.

Nå, men det er altså den distribuerede cache jeg kigger på her.

Hvis du ikke gider læse mere, skal du se denne session fra PDC09: Scaling Your Data Tier with Windows Server AppFabric

Anvendelsesmuligheder

Velocity kan med en enkelt linje i web.config plugges ind som session store. Og når session storage er afkoblet fra webserver processen åbner det op for nogle interessante muligheder ift skalering. Det er ikke meget anderledes end at bruge den gode gamle Session State Service, vi nok allesammen har haft fingrene i.

Man kan i øjeblikket ikke på samme måde lave en one-liner replacement af den almindelige HttpRuntime.Cache, så hvis den skal skiftes ud, er det lettest, hvis man i forvejen har pakket den funktionalitet ind.

I mit tilfælde havde vi i forvejen pakket den ind i en WebCache klasse, der implementerer et ICache interface med et passende antal metoder, så jeg lavede blot endnu en ICache implementation, VelocityCache, på 15 minutter og var i luften med det samme.

Output Cache kan ikke skiftes ud i øjeblikket, men bliver i Visual Studio 2010/ .Net 4 skrevet om til en Output Cache Provider, som Velocity vil kunne hooke ind i på samme måde som Session Store Provideren.

Vi bruger NHibernate på Arena365 og NHibernates 2nd level cache er pluggable med en mindre hær af forskellige cache providers, herunder også en til Velocity. Som jeg i skrivende stund ikke har afprøvet endnu, men mine erfaringer vil snart erstatte denne sætning.

Det kan være en enorm fordel på en udviklermaskine at have en cache-provider, der overlever builds og IIS restarts, og det kan over tid spare en for en del fingertrommen.

Installation/Opsætning

Denne post beskriver opsætningen af betaudgaven af Microsoft Distributed Cache, aka Velocity, som er en del af Microsoft AppFabric. (få den her)

Jeg oplevede et enkelt problem under installationen:

Problem 1: “Failed to apply Distributed Cache Configuration ”
Løsning 1: Opret en tom database i sqlserver og sørg for at brugeren NT AuthoritySystem er db_owner. Når du vælger at lægge konfigurationen i sql server under installationen, så tryk på “edit” og vælg derefter den tomme database.

Administrationen af Velocity gøres gennem en powershell console, så den starter man op (genvej i programs menuen)

Brug dette cheat sheet. Det dækker en CTP3-releasen, men virker også til Beta-versionen. Du kan også få hjælp indefra PowerShell med denne kommando:

PS>Get-CacheHelp

Nå, men start Velocity:

PS> Start-CacheCluster

Derefter kan du verificere at der er hul igennem med
PS> Get-Cache
- denne returnerer en enkelt række, cachen “default”

Og få en liste over cache hosts i dit cluster med
PS> Get-CacheHost

Så, nu er Velocity oppe at køre, vores cache server er i luften.
Det var første halvdel.

Når der er puttet items i din cache, kan du trække stats fra din “default” cache sådan her:

PS> Get-CacheStatistics default

Cache klienten

Start evt. med at downloade kode-samples.

Den nemmeste måde at konfigurere sin cache client på i et ASP.NET website (webforms eller MVC) er at smide et par linjer i sin web.config:

<!-- Velocity Cache Configuration -->

<section name="dataCacheClient" type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" allowLocation="true" allowDefinition="Everywhere"/>

<datacacheclient deployment="simple" timeout="150000">

<localcache isEnabled="true" sync="TTLBased" ttlValue="300" />

<hosts>

<host name="localhost" cachePort="22233" cacheHostName="DistributedCacheService"/>

</hosts>

</datacacheclient>

Nu kan du inde i din cache klasse initialisere cachen med

var cacheFac = new DataCacheFactory();
var cache = cacheFac.GetCache("default");
cache.CreateRegion("myregion", true);

Udfordringer

Et par ting jeg er stødt på.

Indtil videre understøtter Velocity ikke sliding expiration på cache items. Det skyldes at man ved hver cache access vil være nødt til at updatere timeouten på samme item i hele clusteret. Og det er ikke just definitionen af high performance. Det kan lade sig gøre at updatere timeout, men det er ret tydeligt for udvikleren, at det ikke er en gratis operation.

Cache Servicen kan ikke overleve sleep og hibernate på min windows 7 laptop. Det er lidt irriterende at man ikke bare kan have den kørende uden at skulle nurse den flere gange dagligt.

Links

AppFabric

Windows Server AppFabric Beta 1 Samples

PowerShell cheat sheet til CTP3

Session fra PDC09: Scaling Your Data Tier with Windows Server AppFabric

Podcastet om Arena365 tech

For et par uger siden blev jeg interviewet af Daniel Mellgaard Frost, Developer Evangelist hos Microsoft, om de mere tekniske aspekter ved Arena365.com.

Jeg har ikke den store erfaring med at blive interviewet, og min øh-koefficient er noget højere end jeg bryder mig om. Og så kan jeg konstatere at “Man kan sige at” for mig er en fast vending når jeg prøver at forklare noget teknisk.

Vi taler om arkitekturen - Asp.Net MVC + NHibernate, valideringsframeworket xVal, valg af jQuery fremfor MS AjaxHelpers og meget andet, herunder udvikling af sportsligt talent og min mangel på samme.

Der er en enkelt passage hvor jeg forsøger at overtage Brian Rasmussens StackOVerflow identitet i en bisætning. Det var den digitale vaneforbryder, der viste sit ækle ansigt. Undskyld Brian. Men du har bare så meget EXP og jeg har kun 509

Stilen er let omend teknisk, lydkvaliteten er lidt ussel og du kan finde det hele her:

Frosts’ Podcast Show #2 – Arena365.com med Christian Dalager

Opgraderet til Windows 7 x64

Jeg brugte det meste af fredag aften på at installere Windows 7 på min arbejdsmaskine mens jeg så lidt slamtv henover (cowboy jack anyone?).

Da jeg har en deadline, der hastigt nærmer mig, og da min nuværende installation er under et år gammel, tog jeg chancen og gik efter en opgradering i stedet for en ren installation, der alt andet lige tager en rum tid.

Bortset fra at jeg skulle afinstallere Sql Server 2008 først, så gik opgraderingen strålende, selvom jeg var lidt bekymret for hvad der ville ske med mit .NET udviklingsmiljø og alle de øvrige programmer og indstillinger som gør at jeg kan arbejde nogenlunde effektivt.

Alt spiller tilsyneladende, og jeg skal ikke bruge de næste 3 uger på at installere glemte småprogrammer og skrue på environment variable.

Et par noter:

  1. Sql Server 2008 skal have en SP1 for at køre
  2. Man skal lige vænne sig til docken, tror jeg. Men den virker nice
  3. Der er blevet brugt en del energi på at forbedre app-switching og window layout, lidt inspireret af OS X, men faktisk lidt federe ikke mindst fordi der er 100% tastatursupport
  4. hvis man trykker på windowstasten og begynder at skrive, så har man faktisk en velfungerende app-launcher, der også kan gætte mappenavne.

Resten opdager jeg nok hen ad vejen.

PS: Jeg tog en fuld backup af mit system inden. Og det skal du også gøre, hvis du ikke vil risikere at blive fanget i det Swedenborgske rum.

PPS: jeg prøvede at lave en ironisk-sjaw tweet i aftes om at Win7 er overmeget federe end os x. (inspireret af et joco tweet)Tror ikke ironien kom igennem. Nåmenaltså: Win7 er et udmærket operativsystem. OS X er også et udmærket operativsystem. Jeg arbejder på begge to og er ikke religiøs, men var jeg ikke .net udvikler, ville jeg stensikkert køre fulltime OS X.

Community Day 09

CommunityDay09D. 28. maj er der Community Day 09, et gratis 9-22 arrangement for udviklere, arrangeret af eksperten.dk, udvikleren.dk og activedeveloper.dk.

Jeg har sagt ja til at holde et oplæg om min oplevelse af skiftet fra Rails til ASP.Net MVC.
Det bliver 2 x lynintro + sammenligning af teknik og “developer experience” og sådan.

Det er et blandet-teknologi-arrangement med bl.a. Android, Drupal, Silverlight, Ruby, LINQ og Flex/Air.

Så hvis du har lyst til at hænge lidt ud med andre folk med koderester på skåneærmerne, så tilmeld dig og så kan det være vi ses?

Update, 5/4: Daniel har fixet tilmeldingsdimsen, så nu kan man registrere sig igen!

Anbefaling: ANUG podcasts med Umbraco-Niels

Har lige hørt et rigtigt fint interview med Niels Hartvig fra Umbraco (Et open source web Content Management System, eller CMS).

Den er lavet af ANUG‘s Søren Spelling Lund som en del af ANUGs podcast (ANUG står for Århus .Net User Group, og er nok den mest velkørende .net user group i landet.)

De tre dele sætter fokus på historien om Umbraco (som er rigtig rigtig god), forretningen og produktet.

De tekniske forudsætninger for at lytte med er lave, da det mest er historien om tilblivelsen af et succesfuldt open source CMS, herunder organiseringen, de personlige faktorer og forretningsudvikling.

Find det her: Del 1, Del 2, Del 3.

Hvis man interesserer sig lidt for open source eller godt kunne tænke sig at finde ud af, hvordan i alverden man kan tjene penge på noget der er gratis, så er det et godt lyt.

Månedens what?

Er netop landet fra raaaar ferie i der-hvor-solen-næsten-altid-skinner (på en måde det modsatte af der-hvor-solen-aldrig-skinner, men ikke helt alligevel).

Har så fået et par tillykker fordi jeg er blevet månedens blogger i MSDNs danske news flash. Det er rettet mod det danske .Net udviklercommunity og jeg er vældig stolt omend en smule overrasket.

Problemet er nu at jeg ikke har været superskarp til at tech-blogge på det seneste, og selvom jeg har et par små nørdede indlæg i ærmet så har det aldrig været meningen at min blog skulle være en 100% tech zone — jeg vil jo nødigt gøre det helt ulæseligt for non-techies som trods alt stadig fylder mest i mit “publikum”, min “læserskare” eller bare dem der ikke lige orker at arbejde at se tv og derfor kigger forbi…

Nå, men jeg skal nok techblogge igen. Snart. Om en bog måske endda. Eller et oplæg jeg skal holde. Eller om den tabernar der har implementeret taxakøen i lufthavnen.

Enough with the cliff hangers!