Čukča nav lasītājs! Čukča rakstnieks! Lidinators v0.7

Nu ko, labs laiciņš pagājis, kopš pēdējās Lidinatora sērijas. Pienācis laiks seriālu atdzīvināt un šodienas sērijas tēma – teksta izvadīšana uz ekrāna.

Teksta izvadīšanai XNA neizmanto vektoru šrifta tehnoloģijas (piem., OpenType), bet atgriežas pie rastra šriftiem. Nē, tas nenozīmē, ka izstrādātājam ir jāizzīmē katra rakstzīme, vienkārši XNA satura konveijers kompilācijas laikā nodrošina vektoru šrifta pārveidošanu par rastra šriftu, kuru atspoguļo SpriteFont klase.

Šajā vietā laikam jāievieto juridiskā atruna. Ir kāds fakts, kuru varbūt ne visi zina, bet šrifti, gluži kā programmatūra, tiek izplatīti ar kādu licenci. Un ne vienmēr šī licence pieļauj tālāku šrifta izplatīšanu. Tātad, lai nesanāktu juridiskas dabas problēmas ir ieteicams noskaidrot, kas izmantotā šrifta licencē ir minēts par tā tālāku izplatīšanu. Microsoft XNA Game Studio ir iekļāvis dažus šriftus, kuru izplatīšana ir atļauta (pieejami arī atsevišķai lejupielādei), tāpat, cik es saprotu, Open Font Library pieejamos šriftus var izplatīt.

Pēc tam, kad ir noskaidrots, kādu šriftu izmantot, nepieciešams to pievienot XNA projekta saturam, “Content” sadaļā izvēloties "Add” –> “New Item”. Dialoga logā izvēlamies tipu “Sprite Font” un ierakstam nosaukumu kāds šriftam tiks izmantots kodā.

lidinators_1

Atverot SpriteFont failu Visual Studio redaktorā, var redzēt, ka tas ir XML fails, kurā tiek definēts izmantotais šrifts un tā īpašības. Mainot FontName elementu, var nomainīt izmantoto šriftu:

<FontName>Miramonte</FontName>

Tālāk nedaudz jāpapildina resursu ielādēšanas kods:

        protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
baseFont = this.Content.Load<SpriteFont>("BaseFont");

base.LoadContent();
}

Un kadra zīmēšanas kods, izmantojot SpriteBatch.DrawString metodi:

        protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(backgroundColor);
base.Draw(gameTime);
this.spriteBatch.Begin();
for (int i = 0; i < this.ships.Count; i++)
{
string text = String.Concat(
"Ship ",
(
i + 1),
" HP: ",
this.ships[i].Health);

this.spriteBatch.DrawString(
this.baseFont,
text,
new Vector2(0, i * 50),
this.ships[i].Tint);
}

this.spriteBatch.End();
}

Rezultāts:

lidinators_2

Manuprāt, atstarpe starp teksta rindām ir pārāk liela, bet to var labot. Viens no variantiem būtu izmainīt maģisko konstanti 50 zīmēšanas metodes kodā, bet šāds risinājums nebūtu pārāk elastīgs. Piemēram, izmainot šrifta lielumu, izmainītos arī atstarpe starp rindām. Labāk būtu izmantot pārnešanu jaunā rindā, vai arī noteikt teksta izmēru ar SpriteFont.MeasureString metodi, un aprēķināt nākošās rindas pozīciju. Pirmais variants būs labāks gadījumos, kad teksts ir jāizvada vairākās rindās pēc kārtas, savukārt otrais ļauj daudz precīzāk pozicionēt tekstu gan pa horizontāli, gan vertikāli.

Izvēlējos otro variantu, jo tas nākotnē paver plašākas pozicionēšanas iespējas.

        protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(backgroundColor);
base.Draw(gameTime);
this.spriteBatch.Begin();
float textY = 0;
for (int i = 0; i < this.ships.Count; i++)
{
string text = String.Concat(
"Ship ",
(
i + 1),
" HP: ",
this.ships[i].Health);
this.spriteBatch.DrawString(
this.baseFont,
text,
new Vector2(0, textY),
this.ships[i].Tint);

textY += this.baseFont.MeasureString(text).Y;
}

this.spriteBatch.End();
}

Piekrītat, ka izskatās labāk?

lidinators_3

Līdz nākošajai sērijai!

pirmkods

Izmaiņas izņēmuma situāciju (exception) nosaukumos .NET 4.0 versijā.

Šodien K. Scott. Alen savā blogā mūs iepazīstina ar izņēmuma situāciju nosaukumu izmaiņām .NET 4.0. Galvenais iemesls šādām izmaiņām esot Microsoft veiktie psiholoģiskie pētījumi.

Materiāli no prezentācijas par XNA3

Pagājušajā nedēļā notikušajā .NET lietotāju grupas pasākumā stāstīju par XNA 3, parādot šīs platformas pamatiespējas. Par prieku tiem, kuri nevarēja piedalīties piedāvāju prezentāciju un demo spēlīti, kuru rādīju.

Click here to play this video

(skatīt prezentāciju slideshare.net)

Lai varētu spēlēt sakompilēto spēli, nepieciešams uzstādīt XNA 3.0 komponentus

Kā savienot StyleCop ar ReSharper

Vienkārši. Nepieciešams lejuplādēt un uzstādīt StyleCop for ReSharper papildinājumu. Pēc tam Visual Studio uzreiz būs redzamas visas konstrukcijas, kuras pārkāpj StyleCop noteikumus, kā arī tiks piedāvātas ātrās labošanas iespējas, kur tas būs izdarāms.

Kā sajūgt Excel 2007 ar SQL serveri

Nezinu, kā jums, bet man reizēm gadās, kad dati no Excel tabulām ir jāiedabū SQL datubāzē. Reizēm vienkārši jāievieto, reizēm nākas izveikt arī dažādas transformācijas. Bieži šiem mērķiem izmantoju Excel funkciju CONCATENATE, ar kuras palīdzību saģenerēju INSERTus, kurus pēc tam izpildu SQL Server Management Studio.

Nesen radās vajadzība izmantot datus no tabulas ar apmēram 30 stabiņiem, no kuriem daudzi bija jāpielāgo atbilstoši vērtībām kādās datubāzes tabulās. Šajā gadījumā rakstīt milzīgo INSERTu, kuri ievietos datus pagaidu tabulā,  konkatenāciju likās neprātīgi, tāpēc nolēmu izmēģināt alternatīvu – piesaistīt Excel failu kā saistīto serveri (linked server) SQL serverim un izmantot SQL teikumus, lai darbotos ar šīs tabulas datiem.

Lai varētu SQL serverim piesaistīt Excel 2007 failu kā saistīto serveri, uz datora, kur darbojas SQLs, nepieciešams uzstādīt Office 2007 Data Connectivity Components un izveidot savienojumu. Savienojumu var izveidot izmantojot grafiskos rīkus, bet es dodu priekšroku skriptam, kas izsauc sistēmas procedūru, jo šādu skriptu ir iespējams saglabāt un izmantot atkārtoti.

EXEC sp_addLinkedServer
    @server= 'services',
    @srvproduct = 'ACE 12.0',
    @provider = 'Microsoft.ACE.OLEDB.12.0',
    @datasrc = 'C:\temp\services.xlsx',
    @provstr = 'Excel 12.0; HDR=No'

Tālāk jau var vienkārši izpildīt parastus SQL vaicājumus, kā piemēram:

SELECT * FROM services...sheet1$

vai

SELECT * FROM services...sheet1$ WHERE F2 = 'ddd'

Ja apskatam pievienošanas procedūras parametrus, tad tie īpašus komentārus neprasa. Vienīgais, kas varētu interesēt ir @provstr parametrs, kurā ir iespējams norādīt vai tabula satur stabiņu nosaukumus (HDR=Yes), vai arī tie nav norādīti (HDR=No). Otrajā gadījumā stabiņi būs numurēti, t.i. nosaukti nosaukumos F1, F2, u.t.t.

Ceru, ka kādam noderēs!

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.

Špikeru saraksts

dotnet.lv wiki sadaļā izveidoju lapu, kurā sāku apkopot špikerus, kas saistīti ar .NET platformu. Pagaidām gan sarakstiņš ir īss, bet ceru, ka nākotnē tas papildināsies, jo šad un tad gadās kādu materiālu atrast, kuru tur varētu pievienot.

Reģistrēti lietotāji var paši pievienot jaunus resursus wiki lapā, pārējie – ieteikt resursus šī ieraksta komentāros.

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)

Veco gadu aizvadot
Nākas atzīt, ka iepriekšējā ierakstā esmu samelojies un tas nebija pēdejais šā gada ieraksts. Sakarā ar vispārējo jaungada apņemšanos psihozi esmu nolēmis, ka arī man ir kas jāapsola saviem lasītājiem, vienlaikus nedaudz iepazīstinot ar nākošā gada plāniem.
  • Galvenais, ko es esmu apņēmies, ir tas, ka nākošgad jums nodošu vismaz 100 ierakstus, t.i., ceru, ka varēšu uzrakstīt vismaz divus ierakstus nedēļā. Vai iznāks, neesmu pārliecināts, bet centīšos.
  • Šobrīd karstākā no manām tēmām ir draugiem.lv pastnieks. Nākošā gada sākumā taisos nodot jūsu rīcībā nedaudz uzlabotu versiju, kurā būs ņemti vērā pēdējie jūsu ieteikumi. Tāpat grasos nodot atklātībā arī pastnieka pirmkodu, bet tas varētu būt kaut kad februārī, kad būšu pietiekami sakopis XAML kodu.
  • Arī lidinatora seriāls netiks aizmirsts, jo katram gribās kādu atslodzi no ikdienas un pelēko biznesa aplikāciju rakstīšanas. Galu galā mēs visi kaut nedaudz esam bērni un spēlēties mums patīk.
  • Noteikti, nākošgad mēģināšu apgūt ko jaunu. Un tikpat noteikti dalīšos ar jums, par jaunuzzinātajām lietām.
  • Varbūt beidzot saņemšos un nopietni pieiešu TDD (bet bez reliģiska fanātisma). Tad jūs sagaida raksti par testiem un testējamu kodu :)
  • Vēl vēlos pastāstīt šādas tādas lietas par atvērtā koda produktu izmantošanu .NET bāzētos risinājumos. Reizēm ir vērts zināt par alternatīvām un prast tās izmantot.
Šim gadam solījumi pietiks, tiksimies jaunajā gadā.


Laimīgo Jauno gadu!
Draugiem.lv pastnieks 1.5

Visticamākais, šis ar mans pēdējais raksts, nu jau strauji aizejošajā 2008. gadā. Lai gan šajā laikā lielākā daļa “interneta tautas” savu uzmanību velta Īstās Dzīves™ plašumiem, esmu nolēmis neturēt sveci zem pūra un piedāvāt jums jaunu versiju draugiem.lv pastniekam.

Tā kā gandrīz visas sūdzības, ko saņēmu iepriekšējā raksta komentāros bija dēļ neesošas nepieciešamās .NET platformas versijas , tad lietotāju ērtībai ir izveidots instalācijas fails, kurš pārbauda vai ir datorā ir nepieciešamā .NET versija. Vajadzības gadījumā instalācija to lejupielādē un instalē.

Lielākais uzlabojums ir klāt nākušās sadaļas, kas informē par lietotāja un viņu draugu aktivitātēm

draugiem_pastnieks_7

Tiem, kas šo programmu lieto (vai lietos) bieži, vajadzētu patikt “autopieteikšanās” iespējai, t.i., programma spēj atcerēties iepriekšējo lietotāju. Lietotāja dati ir pietiekami droši saglabāti, lai par to drošumu nevajadzētu uztraukties, vismaz tik ilgi, kamēr kāds cits nevar lietot datoru ar Jūsu Windows lietotāja kontu.

draugiem_pastnieks_6

Vēl ir daudzi sīki uzlabojumi (kurus jau esmu paspējis piemirst), un, droši vien, arī jaunas kļūdas :)

Lai gan vēl neesmu gatavs dalīties ar pastnieka pirmkodu (galvenokārt dēļ tā drausmīgās kvalitātes), izstrādātājiem varētu noderēt manis sarakstītais draugiem.lv API “iesaiņojums”, kuru izmanto arī šī programma.

Un beidzot pats galvenais - instalācija

Draugiem.lv API .net wrapper jauna versija

Esmu sagatavojis noslīpētāku versiju draugiem.lv .NET API “iesaiņojumam”. Sīkāka informācija un lejupielādes ir atrodamas wrappera info lapā.

Ceru, ka noderēs!

Draugiem.lv API .NET iesaiņojums (wrapper)
Šajā lapā ir informācija par draugiem.lv API “iesaiņojumu” (wrapper) .NET valodām. Lai gan bibliotēka ir sarakstīta C#, to ir iespējams izmantot arī ar citām .NET platformas valodām. Draugiem.lv .NET API versija 1.1 Izmaiņas: Visa bibliotēka...
More Posts Next page »