onsdag 12 september 2012

Visual Studio Tips & Trix vol 3

Fyller på med några till :)

1. TODO

Hör du till skaran utvecklare som använder sig av notationen:
//TODO: Fix this blabla

Hör du dessutom till den stackars skara utvecklare som fått i uppdrag att gå igenom alla TODOS?
Vad inte alla vet är att det finns ett inbyggt stöd för att navigera bland dessa kommentarer.

I Visual Studio, välj "View" -> "Task List". Välj "Comments" i dropdown-menyn, 
och där är alla TODOS i din solution. Navigera genom att välja en todo och dubbelklicka på den.











Gött!

2. Using alias

Ibland råkar man ut för att olika namespaces krockar namnsättningsmässigt, en vanlig lösning är då att man använder hela namespaces för ena eller båda. Men det går att sätta alias på sina using direktiv så att man kan särskilja dem utan att ange hela namespacen. Vilket jag tycker förbättrar läsbarheten.

Låt oss säga att vi har två klasser med namnet "Helper.cs", den ena under namespacet: MyLib.SharePoint och den andra under MyLib.EPiServer.

Då är det smidigt att ge den ena eller båda ett alias, t.ex.:
using EPi = MyLib.EPiServer;
using SP = MyLib.SharePoint;

Sen anropas respektive klass med aliaset som prefix/namespace EPi.Helper & SP.Helper


3. Bättre prestanda

Det finns många saker man kan göra som snabbar upp VS2010 betänkligt.

Nöjer mig med att plocka med en:

Stäng av HTML designern. 
Görs via Tools -> Options -> HTML Designer och se till att "Enable HTML designer" är urbockad. Jag använder aldrig denna funktion ändå (av principskäl sedan jag råkade ut för automatgenererad markup från helvetet).

Tänk bara på att inte plocka bort  features som du behöver/har nytta av :)

Länktips:
http://stackoverflow.com/questions/4325630/ways-to-speedup-visual-studio-2010
http://lennybacon.com/post/2010/10/18/UltimateGuideToSpeedUpVisualStudio

fredag 7 september 2012

Utveckla för Sharepoint 2010 utan att ha Sharepoint 2010 installerat

Hej å hå!

Idag fortsätter jag med lite mer Sharepoint. När man utvecklar för SharePoint är det gött att använda en virtuell maskin för att slippa lusa ner sitt host-OS med massa dret.

Tyvärr är det en pre-requisite för SharePoint 2010-utveckling i Visual Studio 2010 att man har just Sharepoint installerat.










Visst finns det stora fördelar med att ha en SharePoint installerad lokalt i utvecklingsmiljön (enkelt att debugga, automatisk deploy av solution etc.), men också gigantiska nackdelar i form av prestandatappet som kommer med prestandakraven för en Windows Server med SP 2010 installerat. Sitter man inte på en Rolls Royce till dator så kommer du garanterat att få möe tid över till att lägga patiens medan det står och tuggar.

Nåväl efter lite googlande hittade jag följande forum-tråd:
http://social.technet.microsoft.com/Forums/en/sharepoint2010programming/thread/cda807f6-4edf-4efc-8e9b-4d446356c8ae

Det intressanta är inlägget:
"Hmm .. just tried something .. exported the following hive from the SP2010 server: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0]
and installed it on my host. I can now create SP2010 projects in VS2010."

Nåväl, det testar vi!

1. Visual Studio 2010 SharePoint Power Tools

Först och främst behöver vi installera Visual Studio 2010 SharePoint Power Tools i vår utvecklingsmiljö, som återfinns här:

Det innehåller olika Sharepoint-templates som tar hand om allt tråkigt som man förr fick göra manuellt (wsp-builder, manifesthantering och annat zzzz).

Om man försöker använda någon SharePoint-template direkt efter installation av ovanstående så får man det felmeddelande som bilden överst visar. Så vi går vidare till register-hacket.

2. Regedit 

Leta upp nån maskin med SharePoint 2010 installerat och hoppa in i den.
In i regedit (kör -> regedit), leta upp noden 14.0 (hela sökvägen återfinns i citatet ovan). Högerklicka och välj export.



















Spara filen på nåt klurigt ställe och kopiera över den till din utvecklingsmiljö utan SharePoint.

3. Utvecklingsmiljön

Inne i ditt utvecklingsmiljö, högerklicka återigen på filen och välj "Merge".










Svara ja på säkerhetsvarningen som dyker upp och nu ska det vara klart.

4. Visual Studio 2010

Nu testar jag att skapa ett nytt projekt, t.ex. ett "Visual Web Part Project".

Jajamen, det funka fint! Peka ut nån dummy-url som din SharePoint-path.

Dock kommer olika SharePoint-dll-referenser inte att fungera, så du får kopiera över dessa (återfinns på en Sharepoint-server i mappen <sökväg till hive>\ISAPI\) och lägga t.ex. i en "Dependencies"-folder och peka ut dem därifrån för att kunna kompilera. Typ nåt sånt här:
















Sen är det bara att använda "Package"-funktionen så skapas .wsp-solutions filen i projektets \bin\<debug/release>. Sedan är det bara att flytta .wsp-filen till en SharePoint-server och installera den med stsadm el. dylikt.
Ps. för den som vill prova remote debugging så nämns även det i samma tråd.

måndag 27 augusti 2012

Programmatiskt skapa ett timestamp field i en sharepointlista

Då var det dags för lite Sharepoint. Inte min favorit-kopp té. Men ibland får man offra sig.

Fick i uppdrag att skapa en lista programmatiskt som innehåller bl.a. ett timestamp-fält. 

Eftersom jag hittat ytterst sparsamt med dokumentation och exempel kring hur man gör detta med kod så bestämde jag mig för att göra det omvända, dvs. skapa upp allt via GUI och sedan debugga och accessa fältet för att vad Sharepoint gjorde.

Det visar sig att man gör som här:
  • Sharepoint tillhandahåller alltid ett dolt fält "Created". Vill man lösa det snabbt kan man bara ändra egenskaper på detta fält så att det visas (toggla SPField-egenskapen ShowInDisplayForm), alt. lägga till det i önskad vy.
  • Det går att skapa ett s.k. "SPFieldCalculated" som läser upp innehållet från "Created" och formatterar det som ett datum.
För det senare fallet så gör man nåt i stil med:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(siteUrl))
    {
        using (SPWeb web = site.RootWeb)
        {
            SPList list = web.Lists["test"];
            string fieldName = list.Fields.Add("Timestamptest", SPFieldType.Calculated, false);
            SPFieldCalculated field = list.Fields[fieldName] as SPFieldCalculated;
            field.Formula = "=Created";
            field.OutputType = SPFieldType.DateTime;
            field.ShowInEditForm = false;
            field.Update();
            list.Update();
            SPView defaultView = list.DefaultView;
            defaultView.ViewFields.Add(field);
            defaultView.Update();

        }
    }
});

Testar:







Et voila! En timestamp kolumn som pekar på "Created". Gött!

tisdag 21 augusti 2012

Ändra tabeller i SQL Server Management Studio



När man utvecklar en databas och initialt behöver göra stora ändringar som medför att t.ex. tabellen behöver scriptas om, kan det vara riktigt irriterande att mötas av följande meddelande:







Vän av ordning kanske tycker att en dialog, "vill du göra detta?", beroende på användarens privilegier hade varit på sin plats, men det får vi alltså inte nu.

Istället är det läge att ta sig till Tools -> Options -> Designers -> Table and Database Designers och se till att checkboxen "Prevent saving changes that require table re-creation" är urkryssad.

















Och nu kan jag rodda bäst jag vill! Obs. tänk på att du kan förlora data i din tabell och att detta arbetssätt inte lämpar sig i prod-miljöer :)

torsdag 16 augusti 2012

Visual Studio Tips & Trix vol 2

Ytterligare lite smågrejjer som underlättar min vardag :)

1. Track Active Item in Solution Explorer

När man har en fil öppen och jobbar i ett namespace och kanske behöver komma åt en närliggande fil i samma projekt el. dylikt så är denna inställning ett måste.

Gå till Tools -> Options -> Projects & Solutions -> General, och du bör se följande vy:

Visual Studio 2010















Medför helt enkelt att när du öppnar en fil i din solution. Så kommer solutionexplorern att automatiskt hilighta denna fil och positionera trädvyn så att filen är synlig. Max perry!

2. Cmd i Windows Explorers adressfält för att öppna aktuell folder i kommandoprompten

Detta tips tog jag nyligen del av när jag såg en webcast om Orchard av Kevin Keubler. Är egentligen inte relaterat till Visual Studio, snarare Windows. Men ändå göttigt.

Säg att du jobbar i Visual Studio med en konsolapp, och du vill köra den genom cmd.exe. Det snabbaste sättet att få upp bin-foldern för att hitta den är att antingen:

1. visa dolda filer, högerklicka i solution explorer och välja "Open Folder in Windows Explorer".
2. högerklicka i projekt-foldern, välja "Open Folder in Windows Explorer" och därifrån navigera sig till exe-filen (\bin\<release/debug>\).
















Nästa steg är själva knepet, skriv in cmd i explorer-fönstrets adressfält och tryck enter. Å vips så öppnas kommandoprompten i korrekt katalog. Gött!

3. Utnyttja snippets

Snippets är ett bra sätt för oss lata .NET-programmerare att få saker gjorda med en hand så vi kan koncentrera oss på annat viktigt (att dricka kaffe med andra).

En snippet är en fördefinierad mall över en kodsekvens som du accessar genom att börja skriva snippetens namn, den dyker då upp i intellisensen. Välj den genom att trycka ENTER följt av TAB.

Några ex.:

  • ctor
  • for
  • foreach


4. Skriva egen snippet

Nu är det ju så att de flesta inbyggda snippets är väldigt basic och enbart sparar oss några futtiga knapptryckningar. Därför kan man med fördel skapa egna. Ett bra exempel är ju om man vill behålla en viss struktur/kodstandard på olika klasser med standardiserat användande av #region osv.

Jag t.ex. använder singleton-klasser flitigt i olika webbprojekt och lyckas ofta glömma bort syntaxen (har outsourcat min hjärna till Google).

Nåväl, här är ett ex. på hur det går till:
1. Skapa en ny tom xml-fil i Visual Studio, döp den till <snippetnamn>.snippet.
2. Töm filen på xml-headern, högerklicka i editorfönstret, välj "Insert snippet" och sedan "snippet" i menyn som dyker upp.
3. Deklarera din snippet. Här är mitt "singleton"-exempel:


<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>Singleton snippet</Title>
    <Author>Maets</Author>
    <Shortcut>singleton</Shortcut>
    <Description>Inserts a class as a singleton</Description>
    <SnippetTypes>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>SingletonName</ID>
        <ToolTip>Replace with the name of your singleton class</ToolTip>
        <Default>SingletonName</Default>
      </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[
        /// <summary>
        ///
        /// </summary>
        public class $SingletonName$
        {
          #region Singleton definition
       
          private static $SingletonName$ _instance;
         
          public static $SingletonName$ Instance
          {
            get
            {
              if (_instance == null)
                _instance = new $SingletonName$();
              return _instance;
            }
          }
         
          public $SingletonName$() { }
       
          #endregion
       
          #region Public methods
          #endregion
         
          #region Private methods
          #endregion
        }
      ]]>
    </Code>
  </Snippet>
</CodeSnippet>



4. Spara filen och gå till Tools -> Code Snippets Manager. Välj "import" i dialogen som dyker upp. Leta fram din snippet fil, välj vart du vill importera din snippet och klicka "Finish".
5. Dags att testa! Skapa en ny klass i Visual studio, töm den på innehåll (behåll using-statements &  namespace). Ställ dig inuti namespace definitionen och skriv singleton.











Dunka in TAB och koden dyker upp. Notera att klassens namn är markerat och highlightat. Skriv in namnet på din singletonklass och tryck ENTER så utförs replace på samtliga ställen där platshållaren definierats.


























Gött mos! :)