Bygg VS2010-projekt, men behåll TFS 2008

clock juni 16, 2010 21:22 by author Daniel Hognert

För oss som börjat migrera vissa projekt till Visual Studio 2010, men ännu inte fått klartecken (eller licens) till att uppdatera Team Foundation Server 2008 till nästa version, finns det några väldigt enkla steg att följa för att få igång dina automatiska byggen och tester (Continuous Integration). På egen risk förstås.

Följ bara instruktionerna på http://www.richard-banks.org/2009/11/how-to-build-vs2010-solutions-using.html



Swenug - Blixttal och mingel, 1 oktober 2009 i Göteborg

clock september 17, 2009 16:04 by author Daniel Hognert

Den 1 oktober mellan 17:00 och 20:00 kör vi ett Swenug-event med blixttal och mingel i IBS Konsults nya lokaler på Falkenbergsgatan 3 i Göteborg. Vi kommer hinna med ca 10 blixtdragningar (10-minuterssessioner), mingel och förtäring. Talare och sponsorer är välkomna att anmäla sig.

Läs mer på http://swenug.ning.com/events/swenug-goeteborg



Azurepriser offentliga

clock juli 15, 2009 08:59 by author Daniel Hognert

Igår offentliggjorde Microsoft sina priser för sin molntjänst, Azure. För en vanlig dödlig utvecklare kommer det att kosta strax under 1 krona per processor och timme, ca 1kr per Gigabyte dataöverföring och 75 öre för lagring av 10 000 transaktioner. För en mindre applikation utan alltför mycket datatrafik handlar det alltså om runt en tusenlapp i månaden. Vi får med andra ord se hur många Hello World-applikationer som finns kvar i slutet av året, och hur folk kommer börja ta betalt från sina användare.



Coding dojo/kata

clock maj 4, 2009 13:01 by author Klasson Ola

Den 11 maj kl 18.00 anordnar ALT.NET gbg en Coding dojo i våra (IBS) lokaler på Mölndalsvägen 77.

Coach är Emily Bache från IBS Java solutions, hon har erfarenhet från coding dojos inom Python/Ruby, men denna gång handlar det om Visual Studio och nUnit.

Platserna är begränsade till 12 så om du är intresserad anmäl dig på ALT.NET tråden.



Hur man kör WCF i IIS7 och Windows 2008

clock april 17, 2009 08:56 by author Janne Hasslöf

 

Hej,
har du problem med att få igång WCF på din Vista-installation med  IIS7? Det hade jag ända tills jag hittade denna fantastiska post om hur man lägger upp servicen i IIS7:an.

Host a WCF Service in IIS 7 & Windows 2008 - The right way

Lycka till
-Janne



HTTP 404 när du skall köra ASP.Net på en server

clock april 17, 2009 08:01 by author Janne Hasslöf

Igår råkade jag på en slamkrypare som man inte tänker på som utvecklare med en clientinstallation av windows.
Jag skulle sätta upp .net 3.5 på en Windows Server 2003 maskin. Efter att ha gjort en skolboksinstallation med SP2 för windows, .Net3.5 + .Net3.5 SP1 skulle jag köra igång IISen och accessa min WCF service. Pang! HTTP Error 404 - File or Directory not found.....bummer vad är detta. Testatde att regga om Asp.net, WCF & WF, kollade behörigheter och tom avinstallerade IIS och la på igen. Samma resultat. Så åter till google och där låg den KB315122!

Om du installerar.net på en windows server MÅSTE du aktivera att du får köra ASP.NET-kod i IIS:en manuellt. Från run-menyn kör "inetmgr", gå till "Web service extensions", markera "Active Server Pages" och välj "Allow" (Kör du windows server 2008 heter iconen "ISAPI and CGI restrictions").

Let it rock!
-Janne

 



SweNug-möte i Göteborg, 25 mars 17:00-21:00

clock februari 27, 2009 19:48 by author Daniel Hognert

Den 25 mars mellan 17:00 och 21:00 körs ett Open Event i samarbete med Swenug i anknytning till SDC2009 under ämnet "Tools and Technologies for .NET Developers". Kvällen kommer att bestå av 2 timmar blixtdragningar (på vardera 10 minuter) och sedan 2 timmar Open Space med förtäring, där deltagarna själva bestämmer vad vi ska prata om.

Läs mer på http://www.scandevconf.se/open-event/all/ eller http://www.swenug.com.



S.O.L.I.D. Design Principles – Separation Of Concerns

clock februari 5, 2009 17:54 by author Magnus Härlin

Separation Of Concerns är den första principen i SOLID och innebär att en klass bara ska göra en enda sak. I mitt exempel har vi en PriceCalculator klass som räknar ut hur mycket det kostar att hyra en film. Förutom att räkna ut priset kollar den vad det är för kundtyp och filmtyp. Switch och if satsen är inte helt otydligt men det går att få klassen betydligt tydligare. Nu har den fler ansvar och skulle man lägga till en kundtyp eller en filmtyp till skulle koden börja likna spagettikod och vara jobbig att underhålla.

 

Ett anrop till klassen ser ut såhär:

 

PriceCalculator priceCalculator = new PriceCalculator();

int price = priceCalculator.CalculatePrice(CustomerType.VIP, MovieType.Normal);

 

När CalculatePrice klassen anropas med VIP kund och Normal film kommer den att skicka tillbaks ett pris på 20 kr för att VIP kunden får 5 kr i rabatt. Här nedanför är koden för att komma fram till det.

 

public enum CustomerType

{

    Normal,

    VIP

}

 

public enum MovieType

{

    Normal,

    Transfer

}

 

public class PriceCalculator

{

    public int CalculatePrice(CustomerType customerType, MovieType movieType)

    {

        switch (customerType)

        {

            case CustomerType.Normal:

                if (movieType == MovieType.Normal)

                {

                    return 25 - 0;

                }

                else if (movieType == MovieType.Transfer)

                {

                    return 35 - 0;

                }

                break;

            case CustomerType.VIP:

                if (movieType == MovieType.Normal)

                {

                    return 25 - 5;

                }

                else if (movieType == MovieType.Transfer)

                {

                    return 35 - 5;

                }

                break;

        }

 

        return 0;

    }

}

 

 

Ett första steg för att få koden mer lättläst är att ta bort CalculatePrice klassens ansvar för att kolla kundtyp, filmtyp och vad det ska vara för rabatt. Vi delar upp det i två klasser. Kundtypen används bara för att ta reda på vad det ska vara för rabatt så vi skapar en kundklass med en property för rabatt. Filmtypen används för att bestämma vad det ska vara för pris på filmen så vi skapar en klass filmklass som har en property för pris. Genom att göra det här så blir det inte så mycket kvar att göra för PriceCalculator mer än att ta priset – rabatten och returnera värdet. Slutresultatet för PriceCalculatorklassen blir alltså:

 

    public class PriceCalculator

    {

        public int CalculatePrice(Customer customer, Movie movie)

        {

          return movie.Price - customer.Rebate;

        }

    }

 

Men hur ska vi göra för att på ett tydligt sätt visa att det finns olika filmtyper som har olika pris? Ett sätt är att skapa en basklass som heter film och har ett fast pris på 25 och sen göra en underklass som ärver den klassen och gör en override på priset.

 

    public class Movie

    {

        public virtual int Price { get { return 25; } }

    }

 

    public class TransferMovie : Movie

    {

        public override int Price { get { return 35; } }

    }

 

På precis samma sätt kan vi göra med kundklassen för att kunna sätta olika rabatt.

 

    public class Customer

    {

        public virtual int Rebate { get { return 0; } }

    }

 

    public class VIPCustomer : Customer

    {

        public override int Rebate { get { return 5; } }

    }

 

För att göra ett anrop för en VIP kund på en normal film nu så skiljer det inte så mycket från tidigare. Man byter ut Enum typerna till klasserna man skapat istället bara.

 

PriceCalculator priceCalculator = new PriceCalculator();

int price = priceCalculator.CalculatePrice(new VIPCustomer(), new Movie());

 

Returvärdet man får kommer att vara 20 kr precis som tidigare.

 

Separation Of Concerns är alltid bra att ha i bakhuvudet när man kodar och börjar få nestlade if satser eller switchsatser. Ibland går det att på ett smidigt sätt bryta isär det man gör och på så sätt få kod som är lättare att underhålla och tydligare att använda.



BOM - Byte-Order Mark i början av xml dokument

clock februari 4, 2009 07:48 by author Magnus Härlin

Byte-Order Mark (BOM) används för att tala om vad det är för UTF encoding på en fil och ligger alltid som dom första teckna i filen. Har man en texfil som är har UTF encoding är det tre tecken längst fram i filen som säger vilken UTF det är. Det här är inga problem så länge man jobbar i windowsmiljö. Öppnar man filen i notepad är dom tre första teckna osynliga men tittar man med en hexeditor eller något annat kan man se dom.

 

Den potentiella risken är om man exporterar filer till andra system som får fel vid inläsning om BOM teckna sitter i början av filen.

 

Här är ett exempel på en xml fil som kommer att sparas ner med BOM i början.

 

            XElement xmlDoc = XElement.Load("xmlDocumentToLoad.xml");

 

            //Make changes to the xml Document

 

            xmlDoc.Save("updatedXmlDocument.xml");

 

För att komma runt det här problemet kan man använda en xmlWriter för att spara istället för Save funktionen. På det här sättet får vi en chans att välja om vi vill skriva ut BOM i början av filen när vi initierar Encoding klassen. Det här fungerar förstås utmärkt om det är så att man behöver använda en annan encoding än UTF också.

 

            XElement xmlDoc = XElement.Load("xmlDocumentToLoad.xml");

 

            //Make changes to the xml Document

 

            XmlWriterSettings writerSettings = new XmlWriterSettings();

            writerSettings.Encoding = new System.Text.UTF8Encoding(false);

            writerSettings.CloseOutput = true;

            writerSettings.Indent = true;

 

            XmlWriter xmlWriter = XmlWriter.Create("updatedXmlDocument.xml", writerSettings);

            xmlDoc.Save(xmlWriter);

            xmlWriter.Flush();

            xmlWriter.Close();

 

 



Cacha mera i din webbsajt

clock januari 24, 2009 16:22 by author Daniel Hognert

Det kan vara många där ute som sitter med icke-optimerade webbsajter som gång på gång ställer samma fråga till databasen, trots att det egentligen inte skulle behövas. Genom att exempelvis använda System.Web.Caching.Cache kan man slippa många anrop till databasen, om det är så att data inte ändras väldigt ofta.

Exempelkod i VB.NET:

Public Function GetCachedDataView() As DataView
   Dim _dv As DataView = CType(Cache("myDataViewObject"), DataView)
   If _dv Is Nothing Then
      _dv = [...] 'Collect your dataview as usual here
      Cache.Insert("myDataViewObject", _dv, Nothing, Date.Today.AddDay(1), TimeSpan.Zero)
   End If
   Return _dv
End Function

Public Sub InvalidateCache()
  
Cache.Remove("myDataViewObject")
End Sub