Visar inlägg med etikett VIsual Studio 2010. Visa alla inlägg
Visar inlägg med etikett VIsual Studio 2010. Visa alla inlägg

fredag, februari 17, 2012

Flera webapplikationer i en Web Role i Azure

En vanlig fråga jag får är hur man kan köra flera webapplikationer i en web role i Windows Azure. Det finns flera olika anledningar till varför man vill göra det och det finns också olika anledningar till varför man inte ska göra det.

Tänk att man har en site: www.contoso.com och till den vill du skapa ett antal sub-siter som t ex:

www.contoso.com/privatperson
www.contoso.com/företag
www.contoso.com/cms

Dessa vill man också säkra alla med ett SSL-certifikat. Respektive site ska också kunna utvecklas och hanteras separat. En nackdel är att man måste deploya hela paketet till Windows Azure. I och med att allt driftas i samma web role så kan man inte heller skala applikationerna separat utan allt skalas som en enhet. Det innebär att om företagsdelen av siten kräver extra kräm så skalas alla tre applikationer lika mycket. Som vanligt så finns det fördelar och nackdelar med allt.

Skapa projekt

Vi börjar med File – New Project, skapar ett Azure-Projekt och lägger till en Web Role. Den webapplikationen kommer att svara på rooten för siten, alltså www.contoso.com. Vi kommer manuellt att lägga till webapplikationerna senare.

image

När Azure-projektet är skapa lägger vi till två webapplikationer till samma solution. I mitt exempel använder jag mig av ASP.NET MVC 3. Skapa sedan en ny folder i Windows Explorer på samma plats som din solution och döp den till Publish.

image

Katalogen Publish ska användas som mål för en Web Deploy som vi nu ska ge oss in på.

Web Deploy

Om man använder ASP.NET MVC och Web Deploy så måste man också se till att få med de assemblies som refereras av projektet. I VS2010 SP1 finns en ny feature som gör allt jobb åt dig. Högerklicka bara på projektet och välj “Add deployable Dependencies…”. Välj sedan ASP.NET MVC så kommer att dll:er att kopieras med vid en web deploy.

image

För att göra en Web Deploy av webapplikationen, högerklickar man på applikationen i Visual Studio och väljer Publish. I dialogen som dyker upp väljer man File System som Publish method och sätter Target Location till en ny katalog i den Publish-katalog vi skapade tidigare.

image

Gör sedan samma sak för den andra webapplikationen.

I katalogen Publish ska det nu finnas två kataloger, en för varje webapplikation.

image

ServiceDefinition.csdef

För att lägga till de två siterna i webrollen behöver vi manuellt lägga till några saker i filen ServiceDefinition.csdef. Den filen innehåller nu information om den web roll vi lade till när vi skapade Azure-projektet, hur många instanser den ska ha, vilken storlek den har samt information om endpoints.

Till Site-taggen ska vi nu lägga till en VirtualApplication för respektive mvc-applikation vi vill deploya. När den är klar ska det se ut något i stil med:

  <WebRole name="RootWebApplication" vmsize="Small">
<
Sites>
<
Site name="Web">
<
VirtualApplication name="MvcApplication1" physicalDirectory="C:\junk\MultipleWebApplications\Publish\MvcApplication1" />
<
VirtualApplication name="MvcApplication2" physicalDirectory="C:\junk\MultipleWebApplications\Publish\MvcApplication2" />
<
Bindings>
<
Binding name="Endpoint1" endpointName="Endpoint1" />
</
Bindings>
</
Site>
</
Sites>
<
Endpoints>
<
InputEndpoint name="Endpoint1" protocol="http" port="80" />
</
Endpoints>
</
WebRole>


En Site kan innehålla flera VirtualApplications och varje VirtualApplication pekar på en katalog på disk. Den katalog den ska peka på är den samma som vi tidigare gjorde en web deploy till.



Ctrl – Shift – B => Build succeeded och dags att publicera till Azure! Glöm inte att ändra osFamily="2" så att web rollen kör Windows Server 2008 R2. Observera att varje gång man gör en förändring i MvcApplication1 eller MvcApplication2 så kommer dessa förändringar inte med om man bygger och publicerar till Auzre. För att få med en förändring måste man först göra en Web Deploy för varje webapplikation.



I mitt exempel ligger alla tre webapplikationerna i samma Visual Studio Solution men det är så klart inte något krav. I och med att Azure-projektet pekar ut en lokal folder på disk, som den ska sätta upp som en ny applikation i IIS, kan respektive applikation hanteras helt separat.



I IIS i Windows Azure skapas det en site och i den skapas det två applikationer:



image









MSBuild för automatisering









Det sista steget är att lägga till en Target för MSBuild så att varje gång du bygger webapplikationerna görs en Web Deploy till Publish-biblioteket som vi skapade tidigare.



För att editera en csproj-fil i Visual Studio så högerklickar man på projektfilen och väljer Unload Project. Sedan högerklickar man igen på projektfilen och väljer Edit.



I den första <PropertyGroup> (som gäller för alla olika konfigurationer och plattformar) lägger vi till en variabel som heter PublishDestination som innehåller namnet på den katalog vi skapade tidigare som är målet för vår web deploy.



<PublishDestination>Publish</PublishDestination>



Sedan lägger vi till följande Target:


<Target Name="PublishToFileSystem" AfterTargets="AfterBuild" DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<
Error Condition="'$(PublishDestination)'==''" Text="The PublishDestination property must be set to the intended publishing destination." />
<
ItemGroup>
<
PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</
ItemGroup>
<
Copy SourceFiles="@(PublishFiles)" DestinationFiles="@(PublishFiles->'$(SolutionDir)$(PublishDestination)\$(TargetName)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True" />
<
Message Importance="high" Text="Deploying to: $(SolutionDir)$(PublishDestination)\$(TargetName)\"></Message>
</
Target>


Högerklicka på projektfilen igen och välj Reload Project.


Det här måste också göras för den andra webapplikationen.


That’s it! Varje gång vi bygger projektet kommer nu alla tre siter att byggas och de två siter som ska bli Virtuella Applikationer kommer att Web Deployas, med refererade filer, till rätt ställe på lokal disk så att Azure-projektet kan ta med dem i en deploy. 

onsdag, maj 11, 2011

Full screen out of browser (OOB) i SL4

För att skapa en applikation i Silverligt 4 som kör out of browser, i full screen, finns det en del saker att tänka på. Det första man måste göra är att högerklicka på projektfilen Silverlightprojektet och välja egenskaper. På fliken för Silverlight markerar man att man vill ha stöd för out of browser.

Dialog

När den checkboxen är markerad kan man klicka på knappen för Out-of-Browser Settings.

I den dialog som dyker upp kan man ställa in vad applikationen ska heta, hur stor den ska vara när den startar, beskrivningar samt sätta ikoner. Längst ner på den dialogrutan finns det också några viktiga checkboxar. Den sista av de tre markerar man om man vill att applikationen kan köra med eleveted trust. Detta är ett krav för att senare kunna sätta applikationen i full screen mode.

oob

Om en Silverlight-applikation inte kör under elevated trust kan man fortfarande sätta den i full screen men då är det bara om det är på uppmaning av användaren, t ex genom att hon eller han klickar på en knapp. Om man försöker sätta applikationen i full screen genom kod i t ex Application_Startup kommer den kodraden att ignoreras.

Men om man kör i elevated trust kan man, genom kod när applikationen startar, direkt sätta den i full screen. Observer att anropet till att förändra propertien IsFullScreen måste ske iett anrop till Dispatcher.BeginInvoke.

Code Snippet
  1. private void Application_Startup(object sender, StartupEventArgs e)
  2. {
  3.     Deployment.Current.Dispatcher.BeginInvoke(() => SetFullScreen());
  4.     this.RootVisual = new MainPage();
  5. }
Code Snippet
  1. private void SetFullScreen()
  2. {
  3.     Application.Current.Host.Content.IsFullScreen = true;
  4. }

onsdag, december 15, 2010

CommunicationObjectFaultedException i Azure 1.3

Igår uppdaterade jag ett Azure-projekt till SDK 1.3 och ett skumt fel dök upp. Jag fick följande exception:

Microsoft.WindowsAzure.ServiceRuntime Critical System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Konverteringen funkade bra och mina tester funkade bra så jag checkade gladeligen in. Skulle sedan lägga till ett projekt, labba lite med det och då när jag skulle testköra allt tillsammans: CommunicationObjectFaultedException!!!

Med SDK 1.3 så dyker det här felet upp om i Windows Azure compute emulator när en web.config för en Azure roll är markerad som read only. Felet kommer inte att dyka upp när man deployar till Windows Azure eftersom att attribut på filerna resettas när man gör en deployment.

För att komma runt problemet måste man antingen ta bort read only-flaggan på varje web.config eller checka ut filen.

Mer info finns här: http://msdn.microsoft.com/en-us/library/gg508669.aspx

fredag, augusti 20, 2010

Certifikat för utveckling i Windows Azure med SDK 1.2

I juni släpptes en ny version av Windows Azure SDK (version 1.2). Den innehöll många mycket bra nyheter som gör livet som Azure-utvecklare mycket enklare.

Fullt stöd för Visual Studio 2010 RTM samt stöd för .NET 4 var väntat (och efterlängtat!). En annan nyhet är två tillägg till Server Explorer. Dessa ger möjlighet att få en read only-vy av de tjänster man har i Azure Compute samt Azure Storage.

Numera är det möjligt att deploya direkt från Visual Studio. Tidigare kunde man bara bygga paket och fick själv ladda upp dessa genom portalen alternativt med hjälp av PowerShell. Det här är ett enormt lyft och gör hantering av deployment samt historik av deployade paket mycket enklare.

Alla externa verktyg som på något sätt ska komma åt Windows Azure Managements api måste använda sig av ett X.509-certifikat. Man kan använda ett existerande certifikat eller utfärda ett nytt eget. Enklaste sättet att utfärda ett eget certifikat är att använda Visual Studio.

  • Klicka på Windows Azure Compute i Server Explorer och välj Add Slot…

image

  • Högerklicka på den vita rutan och välj New…

image 

  • Skapa ett nytt certifikat genom att välja <Create…> i rullistan i steg 1.
  • Kopiera pathen till filen som representerar certifikatet genom att klicka på länken i steg 2.

Oavsett om man väljer ett existerande certifikat eller om man har utfärdat ett eget måste man ladda upp det till Azure Portalen.

  • Logga in på portalen och klicka på Account

image

  • Klicka på Manage My API Certificates och ladda där upp det certifikat som du precis kopierat pathen till.
  • Klicka på Account igen och kopiera ditt Subscription ID som finns längst ner på sidan.
  • Ge dina rättigheter ett vänligt namn.

image

Du kan nu lista de slots du har för din tjänst i Azure och lägga till respektive slot du vill kunna granska i Server Explorer.

 

Cerebrata Cloud Storage Studio

Samma certifikat som nu finns uppladdat i Windows Azure-portalen kan också med fördel användas av andra verktyg. Jag är ett fan av Cerebratas Cloud Storage Studio där det också finns möjlighet att övervaka tjänster i Azure, göra nya deployments, starta och stoppa tjänster samt byta mellan Staging och Produktion.

I Cloud Storage Studio är det bara att klicka på Connect to Hosted Service, klistra in sitt Subscription ID från Azure-portalen samt peka ut certifikatet.

image

Om det certifikat som ska användas är genererat av Visual Studio enligt ovan så hittar man det under:

  • Certifikate Store
    • Certificates – Current User
      • My

image

onsdag, mars 24, 2010

TechDays 2010

Två intensiva dagar i Örebro är över för denna gång och jag måste säga att TechDays 2010 var ett klart lyft jämfört med 2009!


Lyckligtvis fick jag möjlighet att hålla min session, A Lap Around Visual Studio 2010 under dag 1 vilket gjorde att jag sedan kunde ta det lugnt och bara “vara” resten av tiden. Sessionen var relativt välbesökt men i en lokal som tar 1400 personer är det svårt att uppskatta hur många det var på plats. Allt flöt på bra och jag har fått mycket positiv feedback efteråt. Ska bli spännande att se utvärderingarna! Jag fokuserade på nyheterna i IDE’n, nyheterna i språken med en demo om Covariance, visa lite av parallell extensions och avslutade med lite nyheter i WPF 4. Det är så klart svårt att täcka speciellt mycket på bara en timme men det kändes ändå som att det blev en bra översikt över nyheterna.


Direkt efter min session hoppade jag in i en Taxi och åkte till Örebro Universitet för att köra min session igen på TechDays@Campus. Ett mycket bra initiativ från Microsoft och Örebro Universitet! Studenterna fick möjligheten att se keynote från dag 1 streamat och hade sedan valt ut fyra sessioner som de vill ha levererade på plats. Före mig hade Magnus Mårtensson pratat om Azure Storage, Tiberiu Covaci om parallell computing och Tess Ferrandez om ASP.NET debugging. Gruppen var lite sliten och något desarmerad när jag kom dit kl 15.00 och jag antar att Tess session kanske var lite väl komplex. Jag började med att fråga hur många som hade använt någon version av Visual Studio och såg tre händer… Det gjorde att jag fick ändra lite i min session, hoppa över några demos och prata mer om hur det har varit tidigare och visa tydligare visa på förändringar.


Connecta var med som utställare och vi hade även tagit dit vårt Surface bord. Som vanligt drog Sonicspree mycket folk!


TechDays - Surface


På kvällen var det underhållning med Henrik Schyffert som alltid är helt lysande!



imac




//Björn

fredag, februari 26, 2010

Visual Studio 2010 - IDE

Det finns en hel del nyheter i IDE’n i Visual Studio 2010. Den är numera byggd i WPF vilket kommer att möjliggöra tredjepartstillverkare att bygga mycket intressanta tillägg framöver!

New Project:
Precis som tidigare har man möjlighet att välja vilket ramverk man ska jobba med. Det innebär att man kan tidigt börja använda VS2010 även om man inte är redo att gå upp till .NET 4. Men i New Project är den mest välkomna nyheten att man nu kan söka bland installerade mallar. Sökrutan högst upp till höger filtrerar bland alla installerade mallar oavsett i vilken nod i trädet man står i när man startar sökningen. Jag hade önskat att man skulle ha gjort en större förändring och tydligare framhäva möjligheten att söka eftersom att det är så otroligt snabbt sätt att hitta den mall man behöver. Samma sökmöjlighet finns även när man väljer Add New Item. Som vanligt finns det också en hel del mallar att ladda ner i Visual Studio Gallery.

image

Extensions Manager:
Under Tools – Extension Manager hittar man en ny dialog som kan användas för att installera olika tillägg till Visual Studio. Det är relativt enkelt att skapa egna och det finns även många att ladda ner. Tillägg man kan hitta i det online gallery som är integrerat i Visual Studio kan vara små små förändringar eller större verktyg som t ex ReSharper. Det pratades tidigt i utvecklingen av VS2010 att man skulle kunna skinna IDE’n och med ett liten tillägg som heter Visual Studio Color Theme Editor är det i alla fall möjligt att enkelt ändra det färgschema som VS2010 använder. Nedan finns två exempel på teman som jag skapat. Ett som är lite mer nertonat a la Expression och det andra med lite mer klara färger.

image image

Ett av mina favorit-tillägg är ItallicComments. Ett litet tillägg som gör så att kommentarer i kod blir kursiva.

image

IntelliSense:
Ända sedan jag testade Visual Assist från Whole Tomato för ett antal år sedan har jag önskat att få IntelliSense som är implementerad som “innehåller” istället för “börjar med” och nu kommer den nyheten till VS2010. Det finns också stöd för att göra sökningar med Pascal Casing men det är en funktion som jag har märkt att jag aldrig använder. Det känns som att det tar längre tid att komma på vad det är för Pascal Casing på AreAnyTouchesCapturedWithin än att skriva t ex Touch. Men med nya IntelliSense kan man alltså också skriva AATCW.

Call Hierarcy:
För att förenkla för utvecklare att förstå hur kod hänger ihop har man lagt till ett par intressanta nyheter. Ett sådant är Call Hierarcy som visar vad som anropar en metod samt vad den metoden i sin tur anropar. Ställ dig på en metod och tryck CTRL+K, T så kommer Call Hierarcy-fönstret fram. Calls to visar vilka anrop som kommer in till metoden och Calls From visar vad den i sin tur anropar. Mycket värdefull hjälp för att framför allt snabbt få koll på vem som anropar en metod som man ska ändra!

image

Pin:
Det finns många möjligheter att pinna saker i VS2010. Den mest uppenbara är att man t ex kan pinna sln-filer så att de alltid finns med i Recent Projects-listan. En lite mer dold feature är att man kan pinna inspektioner som man gör under debugging. När man gör en mouse over på en variabel under debugging får man som vanligt upp information om vilket värde den variabeln håller. Den visualiseringen har nu en liten nål så att man kan pinna den och behöver då inte längre hålla kvar musen där för att se dess värde. Efter det att man har pinnat visualiseringen kan man också expandera fram ett kommentarsfält. Hela den här visualiseringen går också att pinna så att även om man scrollar så ligger den kvar på samma ställ samt att man även enkelt kan flytta den.

image image

Det är var några av de nya features som finns i VS2010 som gör livet som utvecklare lite enklare och trevligare!

tisdag, februari 23, 2010

Problem med CSS i Azure

Förra veckan blev jag tvingad att installera om min dator från scratch. Det var strul med SQL Server Express, Visual Studio 2010 och Azure som föranledde det hela. Det hela gick som vanligt väldigt smidigt och snart var jag igång med Windows 7 Ultimate och Visual Studio 2010 Ultimate RC.

Ett problem som dock dök upp var att jag inte längre fick med mig CSS filen för den site jag jobbar med när jag startade projektet i Azure Development Fabric i Visual Studio. Det funkade bra att deploya till Windows Azure eller att enbart starta upp web projektet. Det visade sig att det var en Windows Feature som jag missat. Aktivera den och din css kommer att hänga med och allt funkar fin-fint igen.

StaticContent

söndag, januari 17, 2010

Azure Development Storage i SQL Server 2008 R2

Sista tiden har jag utvecklat en hel del mot Windows Azure i Visual Studio 2010 och om man som jag inte gillar SQL Express utan vill använda SQL Server 2008 R2 till Development Storage är det väldigt enkelt att fixa till det. När man startar ett Windows Azure projekt första gången skapas en lokal SQL Server Express-databas med tabeller för köer, blobbar och tabeller. För att istället skapa databasen i en icke-express-variant av SQL Server måste man först själv skapa databasen som behövs med hjälp av ett program i Windows Azure SDK.

I katalogen C:\Program Files\Windows Azure SDK\v1.0\bin\devstore finns filen dsinit.exe. Det är den som exekveras när man startat ett Azure projekt första gången och skapar upp databasen. Starta en command prompt och exekvera dsinit.exe enligt följande för att installera den på default-instasen:
dsinit.exe /sqlinstance:.

Eller om man vill installera den på en namngiven instans:
dsinit.exe /sqlinstance:myLocalInstance

Updatera sedan DSService.exe.config och lägg till attributet dbServer enligt nedan:

<service name="Blob" url="http://127.0.0.1:10000/" dbServer="ComputerName\NamedInstance"/>
<service name="Queue" url="http://127.0.0.1:10001/" dbServer=" ComputerName\NamedInstance "/>
<service name="Table" url="http://127.0.0.1:10002/" dbServer=" ComputerName\NamedInstance "/>

Man kan också använda dsinit.exe om man vill rensa allt innehåll i databasen, dvs tömma köer, blobbar och tabeller med:
dsinit.exe /sqlinstance:myLocalInstance /forceCreate

Det finns en del forum, blogger och liknande som hänvisar till att man ska göra ändringarna i DevelopmentStorage.exe.config men det var det gamla namnet och numera heter den DSService.exe.

torsdag, november 19, 2009

PDC 2009 – Pre conference workshop

Första dagen spenderade jag på en workshop med kille från Nya Zeeland (Chris Auld) som pratade om Windows Azure. Architecting and Developing for Windows Azure och där och då bestämde jag mig för att mitt fokus skulle helt och hållet ligga på Windows Azure under veckan. Det har inte riktigt gått att hålla fullt ut eftersom att en del sessioner har visat sig för tråkiga eller för att andra har varit för intressanta för att missa.

Förra veckan släpptes Nov SDK för Windows Azure med flera nyheter. B la så går det nu att använda Visual Studio 2010 för att bygga applikationer för Azure men än så länge är det bara .NET Framework 3.5 SP1 som stöds. .NET 4 kommer så klart inom kort. En annan nyhet är att Worker Roles nu också kan ta emot externa anrop. Tidigare har det bara varit Web Role som kunnat göra det men nu alltså även Worker Role. Vad innebär då det? Vad är det för skillnad då på en Web och en Worker? En skillnad är att en Web Role är hostad i IIS vilket en Worker Role inte är. Det skulle då t ex kunna innebära att du skulle kunna bygga din egen web server och hosta den i en Worker Role.

En annan nyhet i Nov SDK är att det nu också finns stöd för scale up, dvs olika storlekar av virtuella maskiner.

Under Chris dragning blev det också tydligt att det är applikationer som kräver möjlighet till elasticitet eller extrem ökning av krav på resurser som lämpar sig bäst för Azure. Detta är för att den största anledningen till att flytta eller bygga en applikation på en molnplattform är en ekonomisk och inte en teknisk. Det pratas dock om att det kan komma en annan prismodell för applikationer som inte kräver lika stor flexibilitet eller last där man kanske betalar en fast månadskostnad och då inte har samma möjligheter att skala upp men mer om det när det närmar sig årsskiftet.

Windows Azure är tillgängligt idag, den 1 januari kommer det att börja synas hur mycket en körande applikation kostar och from den 1 feb så startar faktureringen.

Chris tog också upp en del patterns för utveckling av applikationer mot Windows Azure och hur de kan påverka den totala prisbilden av en applikation eftersom att delar av plattformen betalas per transaktion. Värt att tänka på är att ibland de-normalisera och duplicera data beroende på om den totala kostnaden för lagring blir billigare än kostnaden för transaktioner. Det dyker alltså upp helt nya faktorer för att fatta beslut för hur arkitekturen ska se ut för en applikation. En refactoring som inte är genomtänkt skulle t ex kunna innebära att man ökar den totala kostnaden för applikationen.

En viktig sak att tänka på när man jobbar med köer är Idempontency. För mig som inte är så mattematiskt bevandrad var det ett nytt begrepp som innebär att f(x) = f(f(x). Dvs att ett anrop till en funktion ska alltid ge samma resultat oavsett om den anropas flera gånger. Windows Azure garanterar att meddelanden i en kö blir hanterade minst en gång. Så även om den VM som just nu hanterar ett meddelande går ner så kommer någon annan att hantera det meddelandet senare. Dock så kan det hända att ett meddelande blir hanterat flera gånger och vi måste hantera det i våra applikationer.

Hela konferensen är väldigt bra organiserad. Det är stora rum och aldrig något problem att få plats på en session. Enda nackdelen är att LA Convention Center är gigantiskt och det är fem – tio minuters promenad från en sal längst bort i hörnan till andra sidan. Det gör att det ibland blir svårt att hinna med alla roliga saker som Ask the Experts och Hands on Labs. Att det varje dag är lunch-sessioner gör inte direkt att man får mer tid!

Nu är det dags för en session av en av mina favorittalare: Clemens Vasters som ska prata om “Building Hybrid Cloud Applications With the Service Bus”. Senare ska jag skriva ett inlägg med länkar till de videor jag kan rekommendera.

 

Panorama från pre conference workshop

preconf

Container från ett datacenter till Windows Azure 

azure

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.

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, november 11, 2008

Nyheter i Visual Studio 2010

Idag efter Keynote på TechEd blev jag lite nyfiken på att labba lite med Visual Studio 2010. Jason Zander visa på lite nyheter som jag tänkte kolla in. Så ikväll när jag kom till hotellrummet laddade jag in den CTP av Visual Studio 2010 som finns att ladda ner och här är lite grejer som jag hittade:



  • När man ska skapa ett nytt projekt i VS2008 så ligger alla templates för Visual Basic på den lite undanskymda platsen Other Languages. Nu har den flyttats upp och ligger bredvid C#. En liten förändring men ack så viktigt för att VB-utvecklarna ska känna sig lika viktiga.


  • Implicit Line Continuation. Jason visade lite vb-kod idag och visade då hur man kunde plocka bort Line Continuation-tecknet. När man läser på så visar det sig att man inte längre behöver använda sig av det för många, vanligen förekommande, fraser. Dvs det går inte alltid att ta bort det. Ett exempel när man inte längre behöver det är i LINQ. Så när man tidigare fick skriva:

    Dim procs = From p In Process.GetProcesses() _
    Where p.ProcessName.StartsWith("s") _
    Select p

    kan man nu helt enkelt ta bort de tecknet på varje rad.

    Dim procs = From p In Process.GetProcesses()
    Where p.ProcessName.StartsWith("s")
    Select p


  • VB får nu också en del som kom i C# 3.0 som Auto Implemented Properties och Collection Initializers.


  • Den stora nyheten i C# är ju så klart möjligheten att hantera dynamiska typer men mer om det en annan gång.


  • En nyhet i Visual Studio är att man kan generera klasser, metoder och properties direkt från kod. Det innebär att man först kan skapa ett unit test och där skapa en instans av ett objekt som inte finns (ännu). Sedan använda sig av den smart tag som dyker upp och väljer att generera den klassen. Man får då upp en dialogruta där man får välja i vilket projekt den ska skapas och vilken synlighet den ska ha. En bug här är dock att om man har sitt testprojekt och sin klass som testas i olika namespace så kommer det genererade klassen att hamna i fel namespace. För er som använder er av ReSharper så är det här så klart ingen nyhet ;-)


  • En annan nyhet i Visual Studio är de verktyg som finns för att lätta få en överblick över ett projekt. T ex finns det en funktion som kallas Architecture Explorer. Med hjälp av den får man en överblick över hela sitt projekt med alla referenser och kan använda det diagrammet för att navigera i sin lösning. Bilden nedan visar ett AssemblyDiagram. De olika pilarna visar på var det finns beroenden och bredare pilar betyder ett större beroende.







Jag tror att den här typen av diagram kommer att bli väldigt bra verktyg framöver just för att få en bättre överblick över ett projekt. Jag skulle kunna tänka mig att ladda in ett existerande projekt bara för att få ut ett sådant diagram för att t ex använda i en dokumentation.