February 2009 - Posts

Citāda versiju kontrole

Interesanti, cik daudz sagadīšanās patiesībā ir likumsakarības? Piemēram, es vakar nolēmu, ka lokāli jāuzstāda kāda versiju kontroles sistēma. Jā, es esmu no tiem, kas uzskata, ka arī lokāli ir jāveic pirmkoda versionēšana, jo tad paveras daudz plašākas iespējas izdarīt dažādus eksperimentus, nebaidoties, ka tiks zaudēts sākotnējais, strādājošais kods. Nu un lokāli izmantot Team System man liekas pārspīlēti. Jautāsiet, kur sagadīšanās? Tur, ka šodien Valdis ir nopublicējis rakstu par SVN integrāciju ar Visual Studio, izmantojot AnkhSVN.

Lokāli uzstādīts SVN bija viens no variantiem, kurus es izskatīju, tomēr (gan bez spēcīgas argumentācijas) nolēmu izmantot Git. Vēl viena sagadīšanās, jo ja es būtu izmantojis SVN, tad diez vai vairs būtu par ko stāstīt :)

Kāda tad ir būtiskākā atšķirība, kāpēc izvēlējos Git? Tas, ka Git ļauj strādāt bez centralizēta servera, kas manā gadījumā ir vienkāršāk. Citu būtisku argumentu par labu vai sliktu Git man nebija.

Uzstādīšanas process ir vienkāršs, un būtiski neatšķiras no jebkuras citas programmas uzstādīšanas. Msysgit instalācijas pakotne ir atrodama viņu Google Code lapā. Integrācijai ar Visual Studio izmantoju GitExtensions papildinājumu, kurā iekļauts arī Visual Studio (2008 un 2005) spraudnis, pēc kura instalācijas studijā parādās jauna rīkjosla, no kuras ir pieejamas nepieciešamās darbības.

image

GitExtensions neintegrējas studijas versiju kontroles apakšsistēmā, galvenokārt tāpēc, ka šim rīkam ir savādāka filozofija. Šeit nav failu “izčekošanas” un “iečekošanas”, bet ir tikai atbilstošas versijas iegūšana un tai sekojoša izmaiņu sapludināšana (“merge”), līdz ar to visa darbība notiek ārējos rīkos. Kopumā tas ir ērtāk, nekā izklausās.

Pagaidām vēl šo to neesmu līdz galam izpratis, piemēram, kā pareizāk strukturēt koda repozitorijus, un kā piespiest Git ignorēt kompilācijas blakusproduktus, bet pirmie iespaidi ir vairāk pozitīvi nekā negatīvi. Redzēs, kādas domas man būs pēc tam, kad būšu šo rīku palietojis ilgāku laiku.

Interneta resursi, kuri man noderēja izvēloties un uzstādot Git:

Simbolu virkņu noformēšana WPF

Turpinot apgūt WPF noslēpumus, izdodas atklāta dažādas interesantas lietas. Piemēram, bieži gadās, ka jāizvada saraksts ar klienta vārdu, kas pie izvades ir jāsakombinē no diviem laukiem.

Ja būtu jāizvada pilnais vārds no šāda objekta

public class DataObject
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

Sākumā, visticamākais ienāktu prātā:

  1. izveidot atsevišķu īpašību, kas atgrieztu apvienotos laukus
  2. vai arī XAMLā definēt StackPanel, kas saturētu vairākus TextField, kuri būtu piesaistīti atbilstošajiem laukiem.

Lasot XAML špikeri (saiti var atrast mūsu wiki špikeru sadaļā), atradu, ka sākot ar .NET 3.5sp1 datu piesaistei ir iespējams izmantot StringFormat atribūtu, kas darbojas līdzīgi kā String.Format šabloni. Kombinācijā ar MultiBinding datu piesaisti, šis atribūts ļauj laukus sakombinēt datu piesaistes laikā:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0} {1}">
            <Binding Path="Name"/>
            <Binding Path="Surname"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
Var redzēt interesantu niansi gadījumā, kad StringFormat šablons sākas ar kādu no vietrāžiem. Šādi šabloni ir jāsāk ar “{}” simboliem, savādāk tas tiek uzskatīts par iezīmju paplašinājumu. Sīkāku informāciju par to var izlasīt MSDN tēmā par iezīmju paplašinājumiem.
Kolekciju salīdzināšana vienumtestos

Sāku iemēģināt vienumtestu rakstīšanu. Jāatzīst, ka viegli nenākas, jo visi materiāli, kurus var atrast tīmeklī, stāsta par to, cik forši ir testēt un rāda triviālus piemērus, bet trūkst materiālu par to, kā tiešām iesākt testēšanu.

Šobrīd esmu pārvarējis sākotnējās problēmas, un uzrakstījis pirmos testus draugiem.lv iesaiņojumam, kā arī atklājis vairākas interesantas lietas. Ar vienu no tām tūlīt padalīšos.

Vienā no testiem man nākas pārbaudīt vai metode atgriež pareizu sarakstu. Sākumā pārbaudi uzrakstīju kā:

Assert.AreEqual(expected.Count, actual.Count);
foreach (var item in expected)
{
Assert.IsTrue(actual.ContainsKey(item.Key));
Assert.AreEqual(item.Value, actual[item.Key]);
}

Vēlāk atklāju, ka ir speciāla klase CollectionAssert, kuru var izmantot kolekciju pārbaudei testos un mana ūberpārbaude vienkāršojas līdz vienai rindiņai:

CollectionAssert.AreEquivalent(expected, actual);

Sīkums, bet patīkami.

Kas ir “Unable to build project output group ‘Content files from Web (Active)’”

Šodien saskāros ar “mistisku” problēmu, jo pēc kāda koda zara sapludināšanas ar pamatzaru vairs nebūvējās instalācija (msi bāzēta) tīmekļa aplikācijai, izdodot virsrakstā minēto kļūdas paziņojumu.

Pameklējot tīmeklī, atradu, ka problēma ir dēļ tā, ka sapludināšanas rezultātā projektā ir norādes uz failiem, kuri vairs nav projektā, un kuriem “build type” ir norādīts kā “Content”. Ņemot vērā, ka minētais projekts ir diezgan apjomīgs, tad tā pārskatīšana “Solution Explorer”  neko nedeva, tādēļ uzrakstīju nelielu komandrindas aplikāciju, kas pārbauda visus projektā esošos satura failus un izvada sarakstu ar tiem failiem, kuri nav atrodami.

using System;
using System.Data;
using System.IO;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            var projFile = new DataSet();
            projFile.ReadXml(@"c:\webprojekts\web.csproj");
            var table = projFile.Tables["Content"];
            var basePath = @"c:\webprojekts";
            foreach (DataRow row in table.Rows)
            {
                string fileName = row["Include"] as string;
                if (!string.IsNullOrEmpty(fileName) 
                    && !File.Exists(Path.Combine(basePath, fileName)))
                {
                        Console.WriteLine(fileName);
                }
            }
        }
    }
}
Tālāk jau vienkārši bija jāizņem liekās atsauces un instalāciju varēju veiksmīgi sapakot.
Jauns gads, jauna draugiem.lv pastnieka versija

Pēc ilgākas klusēšanas, esmu atpakaļ, lai ar jaunu spēku Jums stāstītu par dažādām jaunām lietām. Daļa varbūt mani redzēja Microsoft tehnoloģiju dienā, kurā es stāstīju par WPF piedāvāto iespēju izmantošanu. Tad es arī minēju, ka ir prezentācija, kurā var redzēt lielisku WPF pielietojumu biznesa lietojumos. Tātad, varat pamielot savas acis dnrTV šovā nr. 115 ar Billiju Holisu.

No savas puses esmu jums sagatavojis jaunu versiju draugiem.lv pastniekam. Šajā versijā ir izlabotas vairākas kļūdas un ieviesti daži papildinājumi, kurus jūs esat ieteikuši komentāros pie iepriekšējām versijām. Lielākais jaunums ir iespēja atslēgt paziņojumus atsevišķām jaunumu grupām. Lietojiet un ziņojiet par saviem iespaidiem.

Obligātie ekrānšāviņi:

image

image

 Instalācijas fails

Pirms instalēšanas nepieciešams noņemt iepriekšējo versiju (ja tāda ir uzlikta)