PerSalmi.NET

Swedish .Net software developer...
# Thursday den 13 June 2013

För ett par veckor sedan körde vi ett kurstillfälle med vår .NET-kurs på Combitech där vi bland annat inkluderar testdriven utveckling med Visual Studio och C#. Eftersom den Unit Test Wizard som fanns i tidigare versioner av Visual Studio har försvunnit från 2012 versionen där enhetstestdelarna har gjorts om rejält så innebär det en del merarbete att skapa testfall för hand. Det finns visserligen sätt att plocka fram den tidigare wizarden för att generera skal till testfall och projekt om man vill, den är bortkopplad från menysystemet men kan aktiveras igen.

Det har funnits indikationer på att en ny generator för testfall är på gång och att orsaken till att den gamla togs bort var att den inte kunde fås att fungera med alternativa testramverk som nu kan användas enkelt med hjälp av plugins till den nya test runnern. Det är då intressant att en första version av en ny Unit Test Generator extension nu finns tillgänglig i Visual Studio Gallery. I första läget stödjer den bara att generera testprojekt och testfall för metoder i existerande klasser och då bara för MS-Test, men målen är klara för att man ska kunna generera kod för andra testramverk när RTM versionen kommer.

Extensionen hittar man direkt i Tools –> Extensions and Updates… om man söker på “unit test generator” eller laddar ner från länken Unit Test Generator extension.

Det man får efter installationen är en context-meny (högerklick) i kodeditorn när man är i en metod med alternativet Generate Unit Test:

image

Resultatet är att testprojekt med korrekta referenser tillsammans med testfall för metoden skapas i din solution:

image

Testkoden som genereras i testklassen är enklast möjliga, inte fylld med regioner och bortkommenterade avancerade delar som den tidigare wizarden gav. Om man genererar testfall för fler av metoderna efter hand läggs dessa i samma testklass.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Threading.Tasks;
   6:  using Microsoft.VisualStudio.TestTools.UnitTesting;
   7:  using CalculatorClassLibrary;
   8:   
   9:  namespace CalculatorClassLibrary.Test
  10:  {
  11:      [TestClass()]
  12:      public class CalculatorTests
  13:      {
  14:          [TestMethod()]
  15:          public void AddTest()
  16:          {
  17:              Assert.Fail();
  18:          }
  19:      }
  20:  }

 

Testfallen är sedan direkt färdiga att köras i Test Explorer i studion:

image

För den som vill påverka hur den genererade testkoden ser ut och namnges så finns en del enkla inställningsmöjligheter i Test-menyn:

image

image

Det ska bli intressant att följa detta tillägg framöver. Jag hoppas att det inte dröjer alltför länge innan de planerade funktionerna med stöd för alternativa testramverk och möjlighet att göra egna anpassningar för nya ramverk kommer.

Thursday, June 13, 2013 1:01:59 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
Utveckling | Visual Studio
# Wednesday den 22 May 2013

Vi har brottats med dåliga prestanda i Visual Studios debugger under flera år i ett projekt jag arbetar med. Det handlar om att single-step debugging i riktigt stora solutions, här pratar vi om 120+ projekt i en solution, går segt och tär rejält på tålamodet. Flera sekunders fördröjning för varje steg man tar med step-into eller step-over när man sitter och letar efter fel är inte ovanligt trots mycket enkla operationer i varje steg.

Men alldeles nyss gjorde min projektkollega, Henrik Cooke, ett fenomenalt genombrott i frågan! Debuggingen blir riktigt rapp och responsiv om man stänger av Edit and Continue funktionen i Visual Studio debuggern.

Så om du inte använder eller i alla fall kan leva utan Edit and Continue stöd när du kodar och felsöker så gör så här:

  • Gå till menyn DEBUG -> Options and Settings…
  • Öppna fliken Debugging -> Edit and Continue
  • Se till att rutan Enable Edit and Continue är urkryssad och välj OK

Det ska se ut så här:

image

Steg-operationerna i debuggern flyger fram efter att man fixat detta!

Wednesday, May 22, 2013 1:56:54 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
.Net | Verktyg | Visual Studio
# Saturday den 20 February 2010

Kodkontrakt är en ny teknik som kommer i samband med Visual Studio 2010. Vad är då detta med konkontrakt? Lite förenklat kan man väl säga att det är ett sätt att kunna skriva kod som kontrollerar att inkommande och utgående parametrar och resultat är rimliga och håller sig inom förväntade gränser. Kan alltså vara riktigt bra för att se till att den som använder dina klassbibliotek inte skickar in dåliga parametervärden och ställler till det för sig.

Kodkontrakt har varit i fokus och diskuterats i min närhet vid flera tillfällen de senaste månaderna, dels vid ett frukostseminarie  i december och senare när jag själv presenterade nyheter kring .NET 4 på en konferens i Sälen för några veckor sedan. Först var vi lite besvikna eftersom det verkade som kodkontrakten inte skulle fungera ihop med Visual Studio 2010, de fanns inte med i installationen. Vi hörde rykten om att teamet på Microsoft Research inte hade levererat till Visual Studios byggteam, så kontrakten kom att saknas i betaversion 2.

imageEn del extra efterforskningar efter frukostseminariet visade dock att kontraktstödet faktiskt finns och fungerar, det kräver bara en liten extra nerladding och en separat installation. Både vi som lyssnade och killen som höll frukostföredraget var alltså besvikna i onödan. Det visade sig dessutom fungera bra med Visual Studio 2010 Beta 2 samt nu med den nya RC-versionen.

Det man behöver är antingen Code Contracts Standard eller Premium som finns att ladda ner från Code Contracts på Microsoft DevLabs. Teamet bakom kodkontrakten har mer material i form av publicerade forskningsrapporter och användarhandledning i PDF-form på sin sajt hos Microsoft Research, läs dem här: Contracts - Microsoft Research. Om man vill delta i diskussioner eller ställa frågor finns även ett forum specifikt om kodkontrakt på: Code Contracts MSDN Forum

Ok, det var lite allmän info. Hur kommer man då igång att använda kontrakt i sin dagliga kodning?

Efter att man installerat kontraktstödet så får man en ny panel i projektegenskaperna, Code Contracts:

image

Ovan ser man att jag aktiverat både runtime-kontroller och statiska kontroller som körs vid kompilering. På min labbmaskin har jag installerat premiumvarianten av kontraktstödet, därav har jag både runtime och statisk kontroll. Det är alltså denna projektinställning som behövs för att kontrakt som skrivits in i koden ska vara aktiva och kontrolleras antingen vid körning eller kompilering.

För att visa hur kontrakt för före- och eftervillkor fungerar har jag en mycket enkel metod i mitt C# projekt:

public int PositiveAdd(int a, int b) 
{
    Contract.Requires(a >= 0);
    Contract.Requires(b >= 0);
    Contract.Requires((a + b) > 0);
    Contract.Ensures(Contract.Result<int>() == (a + b));
    return (a + b);
}

Villkoren ovan är avsedda att kontrollera att båda inparametrarna är större än noll och att de tillsammans också ska vara större än noll. Kontrollen av slutresultatet verifierar att returvärdet är ett heltal som är summan av inparametrarna. Detta är ju som ni ser extremt förenklat bara för att visa just själva kontrakten. Requires-raderna ger alltså de “före”-villkor vi vill ha medan Ensures ger oss “efter”-kontroller.

Om man kör kod som utrustats med kontrakt för före- och eftervillkor i sin debugger kan man tydligt se att Contract.Requires(…) och Contract.Ensures(…) inte är kodrader som exekveras som vanligt. I denna sekvens av bilder från en debugger session visar det sig hur kontrakten kontrolleras vid exekvering av metoden.

Vi börjar med att först köra alla sk pre-conditions för att kontrollera utgångsläget när metodens kod påbörjas:

CropperCapture[4]

CropperCapture[5]

CropperCapture[6]

Nästa steg är mer överraskande, det är här man verkligen ser att Contract raderna inte är en vanlig del av metoden, debuggern visar nu att metodens kod kommer att exekvera från början av metodens kodblock:

CropperCapture[7]

Här fortsätter sedan körningen med att utföra det verkliga jobbet i vår metod:

CropperCapture[8]

Den funktionella delen av metoden är nu klar, i normala fall är vi nu färdiga att returnera resultatet till den anropande kodsekvensen:

CropperCapture[9]

Men eftersom kontrakten är aktiverade så är det istället dags att gå igenom och verifiera alla “efter”-villkor:

CropperCapture[10]

Som sammanfattning är alltså Contract-raderna inte en del av metoden som körs procedurellt!

Detta var kontroller för enkla före- och eftervillkor, kontraktstödet innehåller fler varianter av kontroller, men de får vi ta upp en annan gång.

Saturday, February 20, 2010 12:14:08 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | Visual Studio
# Thursday den 11 February 2010

Sedan ett par dagar har Visual Studio 2010 Release Candidate funnits tillgänglig för MSDN-prenumeranter och nu har denna version även släppts för allmän nerladdning.

image

Eftersom jag höll ett föredrag om en del av nyheterna i Visual Studio 2010 och .NET Framework 4 på Combitechs Sälenkonferens 2010 nu i slutet av januari så kan det ju finnas en liten anledning att tipsa om nerladdningslänkarna till den nya RC versionen:

Det kan också vara värt att kolla in nya Team Foundation Server 2010 på Visual Studio Team Foundation Server eftersom den nu går utmärkt att installera på klientoperativsystem som Windows 7. Det är ett enkelt sätt att experimentera med versionshantering och work items mm för att lära sig hantera TFS. Jag håller som bäst på att kolla in TFS lokalt på min laptop, installationen gick på några få minuter och jag har redan ett par projekt importerade för fortsatta experiment. Om du är nyfiken på hur konfiguration av TFS går till på din lokala maskin så kan man se en video om det från Jim Lamb:

Thursday, February 11, 2010 12:18:17 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
TFS | Visual Studio
# Monday den 4 May 2009

Idag råkade vi på ett något märkligt problem på en utvecklingsdator där vi just hämtat ut ett projekt som innehåller en Linq To Sql modell. Vid kompilering av delprojektet med .dbml-filen fick man felmeddelandet "Could not retrieve the current project." utan vidare ledtrådar. Projektet byggde perfekt på andra datorer med identisk kod.

image

Någon exakt bakomliggande orsak har vi egentligen inte hittat men det finns massor med referenser till liknande felmeddelanden hos andra användare av Visual Studio 2008 SP1. Problemet är relaterat till modelldesignern eller hur verktyget som genererar koden bakom modellen fungerar.

Men vi fann en lösning!

  1. Stäng Visual Studio
  2. Öppna en Visual Studio Command Prompt från startmenyn, ligger under Visual Studio 2008 –> Visual Studio Tools.
  3. Kör kommandot:
    devenv /ResetSkipPkgs
  4. Öppna projektet igen och öppna även din databasmodell, dvs .dbml-filen, i designern
  5. Spara .dbml filen för att den ska generera om koden
  6. Kompilera hela projektet

Detta fungerade för oss och var enklare än det alternativa förslaget vi hittade, att ominstallera hela VS 2008 inkl SP1.

Monday, May 4, 2009 12:45:50 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
Linq | Visual Studio
# Wednesday den 22 April 2009

Ett problem som dyker upp som utvecklare när man uppgraderar Internet Explorer till version 8 är att en del projektwizards i Visual Studio 2008, och även i 2005 om man kör den, slutar fungera. Till exempel avslutas wizarden för att skapa ett nytt smart device projekt med felmeddelandet “Project creation failed.” nere i VS statusbar. Bakgrunden till problemen är att projektwizards i t ex MFC C++ och Smart Device / Mobile projekt i C++ är beroende av att använda delar av Internet Explorer och att kunna köra ActiveX kontroller, dessa körs av Internet Explorer inne i Visual Studio och med nya IE8 fungerar inte dessa wizards pga ändringar i säkerhetsmodellen i IE.

Lösningen som finns består i att man lättar på begränsningarna i den speciella säkerhetszon som finns just för dessa Visual Studio wizards. Vad som behöver göras är:

  • Starta Regedit (Obs! om du använder 64-bitars operativsystem ska du köra 32-bitars Regedit)
  • Gå till registersökvägen HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ Zones
  • Skapa en ny nyckel och döp den till 1000 om det inte finns en sådan nyckel redan
  • Under denna nya nyckel skapar du ett DWORD-värde med namnet 1207, typ REG_DWORD och datavärdet 0x00000000

 image

Nu ska wizards för att lägga till funktioner, lägga till variabler, nya smart device projekt i C++ och att lägga till klasser i smart device projekt fungera igen!

Wednesday, April 22, 2009 7:42:39 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
C++ | Internet Explorer | Visual Studio
# Thursday den 19 March 2009

imageEtt tips till den som ska vidareutveckla eller underhålla C# applikationer som bygger på Linq To Sql modeller!

Ta en titt på https://www.huagati.com/dbmltools/, det är en plugin till Visual Studio 2008 som ger bra möjligheter att fixa vanliga underhållsuppgifter i .dbml filer.

Exempel på vad man kan åstadkomma snabbt och enkelt utan att generera om hela modellen med SQLMetal eller behöva ta till utvägen med ta-bort-och-lägg-till-igen-och-gör-om-alla-mappningar i O/R Designern är:

  • Lägga till klasser för nya tabeller/vyer
  • Uppdatera namn på kolumner
  • Byte av typer på kolumner
  • Använda regler för att snygga till namnen på klasser och properties i modellen automatiskt

Ändringarna som pluginen gör är inte raketforskning när man analyserar dem, det går mycket väl att använda samma teknik som man använder vid handskrivna entitetsklasser, men det är väldigt smidigt att kunna göra ändringarna med ett verktyg.

Thursday, March 19, 2009 3:22:06 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Entity Framework | Linq | Visual Studio
# Saturday den 14 March 2009

image Gänget bakom MSDN Managed Newsgroup Support har startat upp ett projekt för att bygga upp en Visual Studio Solution med kodexempel för C#, VB och C++. Nu är det ju inte unikt att det publiceras exempelkod, men att ha en enda källa som tar ett samlat grepp på ett antal grundläggande teknikområden och låter de ingående exempelprojekten samspela och kombineras i alla tänkbara varianter känns fräscht. Det är ofta man hittar exempel som går i en riktning tex interop från C# klient till C++ server medan det man egentligen letar efter är det omvända. Här vrider man och vänder på de flesta kombinationer!

Anledningen att jag fastnade för projektet direkt jag såg det är att vi under ganska lång tid jobbat med ett brownfield (C++) system där olika delar bytts ut och strukturerats om och därmed har nya delar gjorts i managedkod (C#), jag tror knappt det är någon variant av interop som inte varit inblandad i det hela. Hade detta funnits och våra google-master-skills hade låtit oss hitta det förra sommaren så hade det varit perfekt.

I dagsläget finns följande tekniker med i projektet:

  • COM & ActiveX
  • Dataaccess
  • Office-anpassning
  • Klassbibliotek
  • RPC & IPC

Kolla in All-In-One Code Framework på CodePlex. Förhoppningsvis kommer det att växa med massor av exempel, tekniker och kombinationer ganska snart. Förresten, det vore inte dumt att blanda in Windows Mobile i leken också för att öka på antalet möjliga kombinationer i de fall det är teknik som är tillämpbar på telefoner och handenheter.

Saturday, March 14, 2009 12:57:07 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | C++ | VB | Visual Studio
# Friday den 8 August 2008

Jag vet att jag kommer att sitta och leta efter lösningen på det här problemet fler gånger framöver när teflonminnet slagit till. Det lika bra att posta lösningen här nu direkt medan jag minns även om ingen annan någonsin kommer att behöva den.

Problemet:

Scenariot är att jag har lagt till kontroller på en dialog i ett MFC-baserat C++ projekt för Windows Mobile i Visual Studio 2008 och nu ska koppla kod till events på dessa kontroller. T. ex. en OnBnClick-handler för en knapp. Vanligtvis är det bara att högerklicka på knappkontrollen och välja Add Event Handler… för att få upp Event Handler Wizarden. Men inte denna gång! Istället fick jag ett felmeddelande: “Add/Remove operation is impossible, because the code element C… is read only". Kollade massor av grejer, inga filer var låsta av nån process, omstart av Visual Studio hjälpte inte heller, hittade referenser till att det varit en bugg med detta symptom i VS2005 men att det fixats i SP1 för 2005. Nu var jag ju uppe på VS2008 så det borde inte vara samma.

image

Lösningen:

Det var enkelt när jag väl kom på det! Stäng Visual Studio och gå till Utforskaren och radera sedan projektets .ncb-fil (i denna finns IntelliSense information) som vanligen ligger på solution-nivån på disken samt .aps-filen i projektmappen.

Starta om Visual Studio och ladda projektet, vips så fungerar verktygsstödet för att generera kod utifrån dialogeditorn och alla Wizards startar som de ska igen! Filerna som togs bort skapas om automatiskt när man laddar projektet.

image

Friday, August 8, 2008 2:06:53 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
MFC | Windows Mobile | Visual Studio
# Thursday den 3 April 2008

image

Jag började precis jobba med ett nytt uppdrag, en del av utvecklingsprojekten källkodshanteras med Visual SourceSafe 2005. Det visade sig väldigt snabbt att SourceSafe kräver en rejäl patch för att fungera som det var tänkt om man använder Windows Vista och Visual Studio 2008 som utvecklingsplattform.

Ett av problemen är att integrationen i Visual Studio inte fungerar på samma sätt som i äldre versioner, främst beroende på att VS2008 använder Vistas standarddialog för att öppna filer och projekt. Nu behöver man inte deppa ihop helt eftersom det finns en uppdatering att plocka hem och installera.

Ladda ner uppdateringen för Visual SourceSafe 2005 här!

Thursday, April 3, 2008 9:33:51 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
Windows Vista | Visual Studio
# Monday den 17 March 2008

Frågan dök upp under dagens kurstillfälle när vi presenterade TDD i Visual Studio Team Suite. Svaret är: Ja, det finns grejer som inte kostar något, bland andra PartCover och CLR Profiler. Det är kanske lite jobbigare att använda än de kommersiella verktygen men betydligt billigare och därmed tillgängligt även för mindre utvecklingsteam som kanske inte har så stor budget.

Monday, March 17, 2008 11:01:02 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Visual Studio
# Tuesday den 20 November 2007
Framåt kvällen igår när jag satt och pratade med några kollegor efter månadens konsultmöte så frågade min kollega Mats om jag hade hört något närmare när Visual Studio 2008 skulle släppas i RTM version. Jag gjorde en något humoristiskt menad ansats att titta på klockan... Inte för att jag hade en aning om det just i det ögonblicket men det verkar inte ha varit helt galet att försöka uppskatta Visual Studio 2008 nedkomsten genom att kolla klockan istället för att ge sig på almanackan. Nerladdningen pågår för fullt just nu.

VS2008 download screenshot

Om ett par timmar är det väl läge att kolla hur det står till med de sista ändringarna sedan senaste beta-versionen och titta till statusen för en del plugin-moduler man kan komma att behöva.
Tuesday, November 20, 2007 10:01:05 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | Visual Studio
# Friday den 27 July 2007

Det gick relativt snabbt att tanka ner VS 2008 och dess tillhörande MSDN Library igår, mycket snabbare än de tidigare CTP releaserna av Orcas. Jag antar att Microsoft lagt lite mer resurser på bra distribution av nya betaversionen än de gjort tidigare med tanke på att det troligen blir ganska hårt tryck på nerladdningen av denna release som sägs vara funktionsmässigt komplett.

Installationen på min Vista laptop (Dell Latitude D820) gick på ca 1,5 timme, jag körde med Virtual Clone Drive direkt från en ISO image på samma hårddisk så det kanske inte var optimalt ur prestandahänseende.

VS2008 Beta 2  install 1

Installationen gick igenom helt utan problem och några få minuters test visade att det går utmärkt att skapa och bygga både Winforms och ASP.NET applikationer. Det blir intressant att se hur väl den hanterar att bygga applikationer med olika målplattformar i fråga om .NET versioner. Jag ska ge den ett rejält test med en större webbapplikation för att se om det fungerar bra att bygga ASP.NET 2.0 applikationer som driftas på servrar utan .NET Framework 3.5.

Friday, July 27, 2007 5:32:48 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
.Net | ASP.NET | Visual Studio
# Saturday den 10 March 2007

Nu är det dags att ladda ner och installera den kompletta Vista-anpassningen för Visual Studio 2005. Obs! Man måste avinstallera betaversionen av SP1 uppdateringen för Vista om man haft den installerad. 

Ladda ner uppdateringen här: VS2005 SP1 Uppdatering för Vista

Saturday, March 10, 2007 2:20:50 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
Windows Vista | Visual Studio
# Thursday den 11 May 2006

Idag var det dags att uppdatera en äldre rapportdefinition som designats i Visual Studio.Net 2003 och publiceras på SQL Server 2000 med tillägg för Reporting Services. Eftersom jag för tillfället har vissa problem med VS 2003 installationen på min dator så bestämde jag mig för att göra ett försök i Visual Studio 2005.

Tyvärr kan man inte använda VS 2005 för att designa rapporter som är fullständigt kompatibla med RDL-formatet i SQL 2000 versionen av Reporting Services, vissa begränsningar och viss handpåläggning måste till för att publicera rapporterna. Rapportdesignern i VS 2005 har utökad syntax för det nyare RDL-format som stöds av SQL Server 2005, så Report Manager applikationen i SQL2K gillar inte RDL-filerna som produceras av VS 2005. Därför fungerar inte t. ex. inte "Deploy" direkt från Visual Studio.

En del tricks finns dock att ta till för att komma runt dessa begränsningar.

  • Använd bara funktioner som fanns i Reporting Services på SQL2K, använder man nyare funktioner kommer det garanterat inte att fungera.
  • Använd inte VS2005 funktionen "Deploy" för att publicera rapporten, spara den istället som RDL-fil.
  • Öppna rapporten (RDL-filen) antingen som Xml kod i VS eller med en annan textredigerare och ändra Xml namnrymdreferensen i <Report>-taggen enligt detta:

<Report xmlns="https://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"
xmlns:rd="https://schemas.microsoft.com/SQLServer/reporting/reportdesigner">

Ändra till:

<Report xmlns="https://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefinition"
xmlns:rd="https://schemas.microsoft.com/SQLServer/reporting/reportdesigner">

  • Ta bort rader som innehåller taggarna <InteractiveWidth> och <InteractiveHeight>, de är inte kompatibla med RS 2000 men genereras av VS2005. Såg ut så här i mitt fall:

...
<InteractiveWidth>8.5in</InteractiveWidth>
...
<InteractiveHeight>11in</InteractiveHeight>
...

Publicera rapporten från Report Manager applikationen genom att ladda upp RDL-filen.

Report Manager-applikationen är relativt väluppfostrad och talar om vilka taggar den inte har stöd för så om du kan ladda upp rapporten utan felmeddelanden kommer den med största sannolikhet att fungera korrekt.

Thursday, May 11, 2006 1:50:11 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
SQL Server | Visual Studio
Blog & Contact
Per Salmi
Per Salmi
Min LinkedIn Profil

Jag arbetar på Combitech AB i Linköping med konsultuppdrag och utbildning inom Microsoft .NET området. Kontakta mig gärna om ni har frågor, behov av konsulttjänster eller är intresserade av utbildning inom .NET.

Copyright © 2019 Per Salmi

Bloggmotor: newtelligence dasBlog 2.3.12105.0

Sign In
Statistics
Total Posts: 73
This Year: 0
This Month: 0
This Week: 0
Comments: 0

Datorer
All Content Copyright © 2019, Per Salmi