fredag, november 06, 2009

Seminarium om Visual Studio 2010

Idag körde Connecta och Addskills ett seminarium tillsammans om nyheterna i Visual Studio 2010. Jag höll en övergripande presentation om nyheterna i verktyget, ramverket och språken. Salong 1 på Sergel var platsen för dagen och de 512 platserna var fyllda till bredden. Fantastiskt kul att det var så många som kom!

Med mig från Connecta var också Hans Sterby och Daniel Karlsson som pratade om F# och Workflow Foundation.

Allt gick helt enligt planerna, inga demo som kraschade eller någon som tappade tråden.

Fick många frågor av vad den application launcher jag använde under presentationen heter. Det är RocketDock och finns att ladda ner på: http://rocketdock.com/

Om det är någon av er som läser det här så tar jag gärna feedback på min presentation. Något man hade velat se mer eller mindre av? Ris eller ros?

Vi kommer även att köra en repris den 22 januari och till den finns det fortfarande platser kvar. Anmäl dig här nu!

Mvh Björn

panorama

fredag, oktober 16, 2009

SortedSet<T> i Visual Studio 2010

En grymt bra nyhet i Base Class Library (BCL) i .NET Framework 4.0 är SortedSet<T>. Den ligger i System.Collections.Generic och implementerar funktionalitet som jag många gånger har implementerat själv. Precis som HashSet<T> som var en nyhet i .NET 3.5 erbjudet SortSet möjligheten att skapa en collection som bara innehåller unika element. Skillnaden är att SortedSet också returnerar elementen sorterade.

Det innebär att om man matar in följande i en SortedSet<String>:


static void Main(string[] args)
{
var s = new SortedSet<string>();
s.Add("Hello");
s.Add("Visual Studio 2010");
s.Add("Is");
s.Add("So");
s.Add("Cool");
s.Add("Cool");
s.Add("Cool");


foreach (var word in s)
{
Console.WriteLine(word);
}
}

Så blir output:
Cool
Hello
Is
So
Visual Studio 2010

Algoritmen som ligger bakom sorteringen i collectionen är en self-balancing red-black tree och det har jag inte tänkt ge mig in på att förklara hur det funkar. Det finns det redan någon som gjort så bra ;-)

Add-metoden på både SortetSet och HashSet returnerar true eller false beroende på om det det element som skickades in adderades till collectionen eller inte.

En annan metod som är intressant är GetViewBetween(T lowerValue, T upperValue). Om man exekverar den på ett SortedSet så får man ett subset som innehåller alla element från det som är specificerat som lowerValue till upperValue. Det som är dock inte som man skulle kunna med tanke på namnet att den returnerar alla element som ligger mellan de två värdena utan den tar även med de värden man har angett.


var s = new SortedSet<int>();
s.Add(1);
s.Add(5);
s.Add(5);
s.Add(3);
s.Add(2);
s.Add(9);
s.Add(4);
s.Add(11);


var s2 = s.GetViewBetween(4, 9);

foreach (var number in s2)
{
Console.WriteLine(number);
}


Get då output:
4
5
9

Om man försöker lägga till ett element till s2 som är utanför gränsvärdena får man ett ArgumentOutOfRangeException.

Jag ser väldigt många användningsområden för SortedSet och ser väldigt mycket fram emot att få börja använda .NET 4.0!

torsdag, oktober 15, 2009

Multi touch i VS2010

Touch och multi touch är något som har legat mig varmt om hjärtat senaste året. Det hela började med att vi på Connecta köpte ett Microsoft Surface-bord för snart ett år sedan. Redan då pratade Microsoft om vikten av att börja jobba med och lära sig multi touch och nu ser vi Windows 7 och WPF 4.0 komma med inbyggt stöd för multi touch.

I WPF 4.0 har man lagt till ett antal event till UIElement som rör muti touch. De berörda .NET API:er är baserar på native Win32 API som bara är tillgängliga i Windows 7. UIElement är den basklass som definierar kärnan för visuella kontroller för layout, input och events. De event som finns idag (beta 1 av VS2010) är: ManipulationStarted Event, ManipulationCompleted Event, ManipulationDelta Event, ManipulationInertiaStarting Event och ManipulationBoundaryFeedback Event. Som standard får ett UIElement aldrig händelser rörande Manipulation om inte ManipulationMode är satt till ett annat värde än None. Med hjälp av ManipulationMode kan man styra vilken typ av manipuleringar man ska kunna göra på ett objekt. Det kan t ex vara translatera på X och/eller Y-axeln, rotera, eller skala.

I beta 1 av .NET Framework 4.0 finns eventen för manipulering med men det finns inte några WPF-kontroller som använder sig av dem. I kommande versioner kommer det att man enkelt bara slå på touch-kontroller på t ex sliders eller scrollviewers direkt i XAML.

När man fångar ManipulationDelta på ett Window får man ManipulationDeltaEventArgs. Den kan man sedan använda för att ta reda på vilken förändring som har inträffat. Med metoden GetDeltaManipulation får man ut en System.Windows.Input.Manipulation som innehåller all transformationsdata som fanns när eventet inträffade. Den informationen kan man sedan använda för att utföra translateringar på objektet. Lite komplext men ett kodexempel gör det nog enklare att förstå!

Observera att ManipulationDelta aldrig kommer att exekveras med en vanlig mus utan det måste vara något slags touch device. Med hjälp av ett projekt på CodePlex som heter Multi-Touch Vista kan man simulera användandet av flera touchpunkter med vanlig mus eller touch pad.

I xaml-filen lägger jag till en bild i en canvas. Till den kopplar jag en MatrixTransform så att jag sedan kan komma åt den från kod. Jag lägger också till en event handler för ManipulationDelta.

<Window   x:Class="WpfApplication13.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
WindowState="Maximized" ManipulationDelta="Window_ManipulationDelta">
<Window.Resources>
<MatrixTransform x:Key="InitialMatrixTransform">
<MatrixTransform.Matrix>
<Matrix OffsetX="200" OffsetY="200"></Matrix>
</MatrixTransform.Matrix>
</MatrixTransform>
</Window.Resources>
<Canvas>
<Image Width="100" Source="/WpfApplication13;component/Images/Sonicspree.jpg" ManipulationMode="All" RenderTransform="{StaticResource InitialMatrixTransform}" ></Image>
</Canvas>
</Window>

I code behind använder jag ManipulationDelta för att flytta bilden baserat på input:

private void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
var delta = e.GetDeltaManipulation(this);
var image = e.OriginalSource as Image;
var matrix = ((MatrixTransform)image.RenderTransform).Matrix;
var originalCenter = new Point(image.ActualWidth / 2, image.ActualHeight / 2);

//Translate on the x and y-axis
matrix.Translate(delta.Translation.X, delta.Translation.Y);

//Get the new center point and rotate around that based on the delta
var center = matrix.Transform(originalCenter);
matrix.RotateAt(delta.Rotation, center.X, center.Y);
center = matrix.Transform(originalCenter);

//Scale the matrix based on the delta
matrix.ScaleAt(delta.Scale, delta.Scale, center.X, center.Y);

//Apply the new MatrixTransform
image.RenderTransform = new MatrixTransform(matrix);

e.Handled = true;

}
 

Notera de två röda prickarna som symboliserar de två möss jag har koppad till den här datorn. Koden i exemplet är baserat på en video på You Tube som också visar applikationen in action.

MultiTouchVS2010 
 

måndag, september 07, 2009

Historical debugging

En ny feature i Visual Studio 2010 är Historical Debugging. Den funktionen erbjuder oss möjligheten att debugga applikationer som redan har kört. Det vanliga sättet att felsöka en applikation idag är att man sätter ett antal breakpoints och kör sedan sin app för att se om man fastnar eller om det smäller. Det är en procedur som ofta är väldigt tidskrävande.

Man kan jämföra Historical Debuggin med svarta lådan i ett flygplan. Med Historical Debugging påslaget information om viktiga händelser som har inträffat i applikationer under exekvering. Därifrån kan man sedan gå tillbaka till ett tillstånd när t ex ett exception inträffade eller en LINQ-fråga exekverades mot databasen och återskapa vad som hände vid just den tidpunkten.

Historical Debugging slås på under Options och man kan där också välja hur mycket information som ska sparas. Antingen bara events eller så väljer man att få hela kakan med events, metoder och parametrar. De tre knapparna under som är disablade i beta 1 visar att man kommer att kunna importera och exportera insamlat data. Det kommer att innebära att man kan exporera en debugginghistorik och dela med sig av den till en annan användare!



Tyvärr ser det ut som att Historical Debugging bara kommer att finnas med som en feature i Developer och Test-versionerna av Visual Studio Team System 2010. Det är tråkigt men förståeligt för att utöka användandet av Team System.

Efter det att exekveringen av applikationen är klar och data är insamlat kan man välja var i listan man vill ”gå in i” applikationen igen. Därifrån kan man sedan enkelt steppa vidare i koden och se exakt vad som händer. Med Historical Debugging påslaget kommer det också att vara möjligt att stega bakåt vid vanlig debugging.

Förutom att det finns stöd i Visual Studio kommer det även att finnas stöd i Camano som är en ny test case management-klient. Det innebär att en testare kan köra applikationen i Camano och, direkt från det verktyget, leverera en felrapport till Team Foundation Server. Utvecklaren kan sedan plocka upp den rapporterade buggen, använda data från Historical Debugging och pdb-filer med källkod för att se exakt vad det var testaren såg när felet inträffade.

måndag, augusti 24, 2009

Dags att använda nUnit igen...

För ett par dagar sedan började jag jobba med NUnit igen. Sista tiden har jag använt mig av Visual Studios unit testing men nu ska vi använda oss av NUnit i projektet som jag sitter i. Det första jag gjorde var att lägga till tangentbordsgenvägar för att kunna köra respektive debugga det test som är i fokus (CTRL +R, T och CTRL + R + T) samt genväg för att köra alla test i en solution (CTRL + R, A). Can’t live without them! Som tur var så använder jag mig av ReSharper som också har en integrerad test runner i Visual Studio.

Sedan skapade jag ett nytt class library och la till referens till nunit.framework och konverterade ett par test som var skrivna med Visual Studios testramverk till NUnit.

En sak som jag alltid har gillat med NUnit är deras Asserts som är mycket mer avancerade än Visual Studios. Det är kanske inte alltid man behöver det men det ökar läsbarheten att kunna skriva:

Assert.That(expected, Is.EqualTo(actual));

Istället för:

Assert.AreEqual(expected, actual);

Så efter att ha copy/paste:at in mina tester och bara uppdaterat attributen till classen och testmetoderna var det bara att köra.

Alla test fungerade bra i NUnits egna testrunner men ett av testen misslyckades i ReSharpers integrerade testrunner i Visual Studio. Det test som rapporterades som misslyckat var ett test som hade attributet [ExpectedException]. Det visade sig att ReSharper inte kan hantera det attributet. Istället för att använda ett attribut för att markera att man förväntar sig ett fel från en metod får man använda sig av en annan assert från NUnit:

var ex = Assert.Throws(() => target.MethodThatWillReturnException());

tisdag, juni 16, 2009

Nyheterna i Visual Studio 2010 Redux

Jag skrev ett inlägg om Visual Studio 2010 i samband med att första CTP släpptes i november 2008. Nu när beta 1 funnits tillgänglig ett tag tänkte jag ta upp det igen.

Initialt tänkte jag fokusera på nyheterna i Visual Studio 2010 och Team Foundation Server 2010 medan nyheterna C# 4.0 får vänta lite…

Mellan varje release av Visual Studio släpps det ett antal tillägg som varje användare får ladda ner och installera själv. Vi har sett det med tidigare med t ex tilläggen till .NET Framework 3.0 och ASP.NET Ajax. Det är funktioner eller utökningar som först har släppts separat för att sedan inkluderas i nästa release av Visual Studio. Det fortsätter även för Visual Studio 2010 som t ex kommer att inkludera ASP.NET MVC, Windows Azure Tools, F#, P-LINQ och JQuery.

Parallell utvecklings kommer att bli mycket enklare i Visual Studio 2010. Det inte bara genom nyheter i språken som P-LINQ utan även en hel del nyheter i IDE´n som ska ge ett bättre stöd. Felsökning och analyser med parallell exekvering ska bli också bli enklare.

Det har länge varit känt att Visual Studio 2010 är omgjord och numera utvecklad i WPF. Detta gör att vi kommer att få se många add-ins till Visual Studio 2010 som antagligen kommer att vara väldigt kreativa. Det kommer också att finnas en hel del nyheter direkt i Visual Studio 2010 där man kommer att använda IDE´n för att göra utvecklare mer produktiva.

Förutom en hel del nyheter och uppdateringar av Team Foundation Server 2010 så kommer även efterlängtade uppdateringar av Visual Studio Team System 2010 Architecture Edition samt Test Edition. Dessa två roller har varit i fokus för nya funktioner och bland nyheterna finns stöd för UML, nya arkitekturdiagram och ett helt nytt verktyg för att köra tester som ser mycket intressant ut.

Det här är delar av det som jag tänkte blogga om framöver som rör Visual Studio 2010!

tisdag, maj 26, 2009

Hur spenderar jag min tid online?

Jag finns med på en del olika sociala nätverk där mitt mått av agerande skiljer sig lite. Jag skriver på två egna bloggar. Dels den här, där jag skriver lite allmänt som rör min profession, och dels en blogg om utveckling på Microsoft Surface. Om det är inlägg som handlar om agil systemutveckling så hamnar det istället på Projektbloggen på Projectplace. Sedan finns jag med på LinkedIn, Twitter och Facebook. Jag har under en tid funderat på vad man ska använda alla dessa kanaler till och känner kanske att det inte ger så mycket att agera på alla. Så när Johan Lindfors twittrade och bloggade samma fråga så började jag fundera lite mer på allvar

Mina bloggar är inte så mycket att fundera på. De har alla olika syften och det känns rätt att separera dem. På surfacedeveloper valde jag t ex att skriva alla inlägg på engelska eftersom att jag där ser en potentiellt större skara läsare medan mina inlägg som rör agile hamnar på projektplatsen. Övriga diverse inlägg som det här hamnar på min mer allmänna blogg. Det är ett upplägg som fungerar bra!


När det sedan gäller de andra tre, LinkedIn, Twitter och Facebook så tänker jag mig att jag har en idé frågan är bara om jag kan genomföra den...

LinkedIn.
Här är jag inte någon speciellt aktiv användare. Jag skickar sällan meddelanden till andra men svarar om jag får ett skickat till mig. Mitt primära användningsområde för LinkedIn är att hitta kontaktpersoner till nya kontakter. Ett exempel är när jag får en ny rekryteringsansökan så kollar jag gärna upp personen på LinkedIn för att se om det finns någon i mitt kontaktnät som känner personen. Där hittar man också ofta länkar till bloggar eller en mer utförlig anställningshistorik. Jag har inte kommit upp till 100% på min profil och det känns som vanligt att det var ganska enkelt att komma upp till 80% men de sista 20% kostar så mycket extra så vi får se om jag någon gång når 100%.

Facebook
Jag kommer inte riktigt ihåg när jag gick med på Facebook eller vem som bjöd in mig men jag har i alla fall varit med ett längre tag. Facebook var kul i början. Jag var aktiv med att göra statusuppdateringar, spela bilspel, svara på quizar osv osv. Dvs sånt som man gör på Facebook. Det hela började med att jag hade några kompisar på min lista men snart så blev mitt nätverk bredare och bredare och nu finns det personer på min lista som jag bara har träffat en gång. Efter ett tag lessnade jag totalt och kan inte längre säga att jag är en aktiv Facebookare. (Update: Sedan jag köpte en IPhone 3GS har jag kommit igång med Facebookandet igen!)


Twitter
Länge var jag mot Twitter. Jag såg ingen som helst mening med att skriva meddelande på 120 tecken eller heller att det skulle ge mig något att läsa så korta meddelanden som andra skrivit. Vad skulle det ha för nytta? Känslan var samma som när SMS kom i mitten av 90-talet. Jag hade väldigt svårt att se hur någon skulle vilja sitta och skriva ett meddelande på en mobiltelefon. Detta trots att jag brukar vara en early adopter! Jag kunde se nyttan i att twittra runt en konferens eller liknande och hade läst twitter feeds både från TechDays och TechEd. Men efter att ha kommit igång så är jag nu fast. Grymt kul helt enklet! Twitter är det jag gillar bäst med Facebook – statusuppdateringar.


Men det är också i och med att jag börjat använda Twitter som de olika nätverkens roll börjar visa sig och här är min grand plan.

Bloggar – Låt står. Som sagt så tycker jag att det fungerar bra som det är nu.
LinkedIn – Låt stå. Inga planer på förändring.
Facebook – Bara personliga vänner och inga jobbkontakter. (Update: Bara personer jag träffat i verkliga livet. Jobbkontakter är alltså helt okej på min Facebook.)
Twitter – Bara jobbkontakter och inte kompisar eller folk som blir för personliga. Ska jag vara helt ärlig så är jag inte intresserad av att följa folk som Twittrar om vad de ska shoppa på vägen hem eller annat privat. Här är jag beredd att göra undantag om det också är undantag att sådana inlägg kommer och personen har något yrkesrelaterat som är intressant att följa. Jag har redan tagit bort personer från min Twitter som jag inte tycker är intressanta.

För att leva som jag nu lär så måste jag alltså börja rensa i min friends list på Facebook och bland de jag följer på Twitter. Eller egentligen bara Facebook eftersom att min Twitter-lista är ganska kort och redan rensad från någon enstaka som jag la till som jag sedan tyckte var för privat.

Om någon nu märker att jag plockar bort dem som ”vän” så är det inget personligt utan bara en anledning till att jag behöver fokusera och hantera mitt liv online!

lördag, maj 09, 2009

Domännamn och Windows Azure

När man skapar och deployar ett projekt till Windows Azure får man två olika miljöer, Staging och Production. Bägge dessa är tillgängliga via en url. Till Staging är det en relativt krånglig url enligt mallen http://{GUID}.cloudapp.net medan i produktion blir urlen enligt den något enklare mallen http://{projectname}.cloudapp.net. Bägge är åtkomliga så snart den virtuella servern har startat igång och du har fått status Started. Observera första gången man skapar ett nytt projekt kan det fortfarande ta lite tid att komma åt den trots att status är Started.

Men om man istället vill ha en cool webadress till sin molnapplikation, hur gör man då? Det har den Steve Marx en lösning för på sin blog Hello my name is Smarx. Efter ikväll kan jag också garantera att hans exempel fungerar perfekt. Så för ca 80 SEK har jag nu ett coolt namn till min kommande killer-cloud-application.

Man registrerar helt enkelt ett domännamn och gör sedan en CNAME-pekning och en Forward från den nya domänen till http://{projectname}.cloudapp.net. Funkar hur bra som helst! Steve Marx visar i sin blogg exakt hur man går tillväga och tipsar om att registrera domänen genom godaddy.com. Det funkar bra men det är otroligt många steg där de försöker sälja på dig alla möjliga varianter av domännamn och tjänster innan man är klar. Men bestäm dig innan och behåll fokus så kommer du till slut till Final Checkout!

torsdag, maj 07, 2009

Windows Azure Geo-Location

För två veckos sedan hade jag ett seminarium tillsammans med Addskills som handlade om Windows Azure. Allt flöt på mycket bra och jag tror att deltagarna var nöjda. Under två 75-minuters pass pratade jag om Azure Services, Windows Azure, .NET Services, SQL Services och Live Services.

En sak som jag nämde var att det kommer att finnas möjlighet att styra var i världen ens applikation eller data finns. Att kunna styra geografisk placering är ett krav för många organisationer som t ex har lagliga krav på sig att deras data inte får lämna en viss region. VI kommer antagligen inte att få se datacenter ner på landsnivå men det finns ett planerat på Irland vilket kommer att möjliggöra att behålla data inom EU.

Möjligheten att styra geografisk placering på WIndows Azure presenterades på MIX09 och förra veckan dök möjligheten upp även för oss användare. Varje applikation placeras i en Affinity Group som sedan knyts till en geografisk placering. I dagsläget finns bara USA Anyware, USA Northwest och USA Northeast.

Om man redan har en tjänst på Windows Azure hamnar den på USA Anyware och får det härliga namnet Unaffinitized. Ett ord som jag inte lyckas hitta någon översättning på. Det finns dock inte någon möjlighet att editera en existerande applikation. Jag testade att stänga ner mina tjänster för att få ändra min Geo-location men det finns ingen länk att göra det. När man laddar sidan så visas under en kort tid en Edit-länk men den försvinner sedan och om man klickar på den innan den försvinner får man ett System.InvalidOperationException.

Allt eftersom att nya datacenter kommer online så kommer det att finnas fler möjligheter att placera sina applikationer.

måndag, mars 16, 2009

Dags för TechDays!

Imorgon är det dags för Microsofts konferens TechDays i Västerås. Jag och Pelle Johansson kommer att köra en session imorgon som heter ”Rundra gränssnitt i en fyrkantig värld” som handlar om hur man kan använda WPF när man bygger addins till Office. Ikväll var vi på tech-check i hörsalen som vi blivit tilldelade. Inget var klart men det är några sessioner innan oss imorgon så det löser sig nog. Hörsalen för övrigt den näst största salen på konferensen och jag tror att den tar ca 150 personer. Vi har hård konkurrens av andra intressanta sessioner som behandlar nyheterna i VS2010 Team System med Magnus Juvas, Modelling in Oslo med Johan Lindfors och Alan Smith, ASP.NET 4.0 med Scott Galloway från ASP.NET teamet i Redmond plus några till. Men med 1300 deltagare så finns det några att dela på.


Just nu sitter vi på Pelles hotellrum i Västerås och slipar på presentationen. Ska bli skönt att köra under första dagen så att man får möjlighet att ta det lugnt och skönt imorgonkväll!