Kā nerakstīt objektorientētu programmu

Mūsu projektā ir viens modulis, kuru nevienam negribas aiztikt. Klīst leģendas, ka šo moduli esot sarakstījis indietis, kurš pastāvīgi esot bijis piedzēries. Tā nu sanāca, ka man nācās veikt izmaiņas augstākminētajā modulī un novērot praksē, kāds ir rezultāts, ja cilvēks programmē, absolūti nesaprotot objektorientēto programmēšanu. Šodien padalīšos ar vienu (no daudzajām) kļūdām ar kurām man nācās saskarties.

Šī moduļa funkcionalitāte ir samērā vienkārša – “tāfele”, kas ļauj lietotājam zīmēt koku no dažādiem biznesa elementiem. Aizmugurē tam visam ir hierarhija ar objektiem, kas apraksta biznesa elementus un tiem atbilstošajām figūrām. Figūru klašu diagramma izskatās aptuveni šādi:

ClassDiagram

Pirmajā acu uzmetienā nekas īpašs, diezgan ikdienišķa klašu struktūra. Bet ja mēs apskatam WhiteboardShape.DoSomeLogic() metodi…

public virtual void DoSomeLogic()
{
    if (DomainObject is DomainObjectAlpha)
    {
        // Do WhiteboardShapeAlpha specific logic
    }
    else if (DomainObject is DomainObjectBeta)
    {
        // Do WhiteboardShapeBeta specific logic
    }
    else if (DomainObject is DomainObjectGamma)
    {
        // Do WhiteboardShapeGamma specific logic
    }
}

Tad redzam, ka autoram ir bijis visai savdabīgs priekšstats par polimorfismu. Tā vietā, lai specifisko loģiku realizētu konkrētu klašu DoSomeLogic() metodēs (kuras jau ir izveidotas un tiek izsauktas!), autors izmanto klases property tipu, lai noteiktu no kuras mantotās klases metode ir izsaukta (!!!) un tad izpilda specifiskās darbības.

Pārnesot loģiku uz atbilstošajām klasēm mēs iegūstam mazāku koda apjomu, kurš ir vieglāk saprotams un uzturams, kas arī ir viens no mērķiem kādēļ tiek izmantota objektorientētā pieeja. Šajā gadījumā būtiski var samazināt “cyclomatic complexity” un “class coupling” metodes WhiteboardShape klasei.

Metrikas pirms koda izdalīšanas:

image

un pēc:

image

Šis piemērs gan bija ļoti vienkāršots un situācija pirms pārveidošanas bija pieciešama, bet oriģinālajā klasē jau bija izveidojusies nopietna “frankenmetode”. Tāpēc vienmēr iesaku uz savu kodu paskatīties un padomāt: “Ko šeit var vienkāršot?”, pirms uzskatīt, ka tas ir pabeigts.

Grāmatas apskats “Brownfield Application Development in .Net”

Ar katru dienu arvien vairāk pārliecinos, ka jebkura pietiekami sarežģīta lietotne ar laiku paliek… nu teiksim, nedaudz iebojāta. Tāpēc jau kādu laiku plānoju izlasīt grāmatu Brownfield Application Development in .Net.

Kas tad ir “Brownfield application”? Citējot Wikipēdijas ierakstu par brownfield land:

“In the United States urban planning jargon, a brownfield site (or simply a brownfield) is land previously used for industrial purposes or some commercial uses. The land may be contaminated by low concentrations of hazardous waste or pollution, and has the potential to be reused once it is cleaned up”

Tātad par brownfield kodu var uzskatīt jebkuru programmatūras sistēmu (vai izstrādes procesu), kas ir “piesārņota” ar dažādām problēmām, bet kuru ir iespējams glābt. Domāju, ka diezgan droši var apgalvot, ka lielākā daļa no programmatūras (projektiem) lielākā vai mazākā mērā ietilpst šajā kategorijā, tāpēc grāmata ir vēl jo interesantāka un noderīgāka.

Par ko tad ir grāmata? Vienā teikumā – par to, kā no situācijas “pavisam slikti” nonākt līdz stāvoklim “nav jau nemaz tik slikti”. Autori tajā, soli pa solim, apskata kā uzlabot programmatūras izstrādes procesu un izstrādātā koda kvalitāti projektā, kurā viss notiek pēc “sliktākajām praksēm”. Pirmajā daļā tiek apskatītas problēmas procesā, piemēram, versiju kontroles trūkums, kļūdu pārvaldīšana. Protams, neiztiek arī bez automātisko testu pieminēšanas. Jāsaka, ka man ir paveicies un jau manā pirmajā darba vietā šie jautājumi bija samērā sakārtoti (paldies Dāvim un Valdim) un tāpēc daudzas šajā daļā minētās lietas vienmēr ir likušās pašsaprotamas.

Otrajā daļā jau tiekam pie koda un pieļauju, ka lielai daļai grāmatas lasītāju tā būs saistošāka par pirmo. Kas man šeit patika, ir tas, ka autori nevis vienkārši teoretizē par labajām praksēm un to cik forši ir izmantot dažādus principus koda rakstīšanai un strukturēšanai, bet parāda kā šos principus ieviest kodā, kurš tiem neatbilst (diemžēl, pārāk bieži nākas saskarties ar šādu kodu).

Jāsaka kā ir, grāmata ir diezgan apjomīga un ietilpīga, tāpēc tās izlasīšana, par spīti satura interesantumam man ilga gandrīz mēnesi. Tomēr es nenožēloju nevienu minūti no patērētā laika. Lai gan lielākā daļa no lietām ir “tas taču ir sen zināms”, tomēr pēc tās izlasīšanas es droši varu teikt: “Esmu kļuvis par (nedaudz) labāku izstrādātāju!”

Novērtējums: 10 <ievietojiet mērvienību> no 10

Nu un saldajam ēdienam daži citāti no šīs lieliskās grāmatas:

“Few people can withstand the psychological kick to the stomach that occurs when you first open a six-thousand line code-behind file.”

“Performance should not be ignored. But nor should it be addressed haphazardly. Your primary goal should be a working application. Once that's been achieved, it can be tuned based on actual performance testing. And remember, perceived performance is more important than actual performance.”

“Poor encapsulation will lead to the code changes requiring what is known as the Shotgun Effect. Instead of being able to make one change, the code will require you to make changes in a number of scattered places, similar to how the pellets of a shotgun hit a target.”

Source Code Pro šrifts

Sveiki, meitenes un zēni!

Ja vēl neesat to izdarījuši, tad iesaku Visual Studio izmēģināt šriftu Source Code Pro. Jau nedēļu to ikdienā lietoju un pagaidām iespaids ir: FANTASTISKI!

Lai runā bilde

Decimal.ToString(), reģionālie iestatījumi un Excel

Kāda ir atšķirība starp šiem diviem skaitļiem?

Teiksiet, nekāda? Nu un tad pamēģiniet nokopēt nākošās divas rindas un ielīmēt tās Excelī.

1 002 414 179,5
1 002 414 179,5

Hmm, vienu rindu pārveidoja par skaitli, bet otru nē? Kāpēc?

Tāpēc, ka pirmajā rindā esošajā skaitlī, ir nevis parastās atstarpes, bet gan "No-break space"  simbols. HTML zinātāji ("View source" izmantotāji) tagad māj ar galvu un saka, ka pamanīja &nbsp;

Izrādās, ka Latvijas reģionālajos iestatījumos (un pieļauju, ka ne tikai Latvijas) tūkstošu atdalītājs ir šis te simbols. Patiesībā tas arī ir loģiski, jo pārnesot tekstu jaunā rinda, mēs vēlamies, lai skaitlis netiktu sadalīts divās daļās. Problēma tikai tāda, ka Microsoft Excel simbolu virknēs par tūkstošu atdalītāju uzskata tikai atstarpes simbolu, tādējādi šādi skaitļus pēc ielīmēšanas tiek uzskatīti par tekstu un lai ar tiem varētu veikt matemātiskas darbības ir nepieciešams izpildīt papildus pietupienus.

Esiet uzmanīgi, ja skaitļu noformēšanai lietotāja saskarnē tiek izmantots tūkstošu atdalītājs no reģionālajiem iestatījumiem, jo lietotājiem kopējot datus uz ekseli var rasties problēmas, savukārt izstrādātājiem - mistiskas kļūdas.

Atkārtot šo problēmu var ar pavisam vienkāršu programmiņu:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args) {
            Console.WriteLine((1002414179.5m).ToString("C"));
            Console.WriteLine((1002414179.5m).ToString("C").Replace(' ', ' '));
        }
    }
}
DateTime.ToString() gotcha

Atruna: Esmu nolēmis izmēģināt rakstīšanu divās valodās un kādu laiku publicēt ierakstus gan latviski, gan angliski. Šis ieraksts ir anglisks tulkojums rakstam “DateTime.ToString() nianse”.

Disclaimer: I have decided to try dual language blogging and for some time post in both Latvian and English. This is English translation of “DateTime.ToString() nianse”.

Recently I got bitten by an interesting gotcha in DateTime.ToString() templates. It turned out that the slash character “/” specifies the date separator which is replaced with localized value from current or specified culture.

To demonstrate we can use this test:

  1.         [TestMethod]
  2.         public void FailingTest()
  3.         {
  4.             var date = new DateTime(2011, 11, 11);
  5.             var expected = "2011/11/11";
  6.             var actual = date.ToString("yyyy/MM/dd");
  7.             Assert.AreEqual(expected, actual);
  8.         }

If your computers regional settings have set date separator, other than “/”, test should fail. Otherwise you can specify culture explicitly to reproduce same behaviour.

What to do if you need date separated with slashes? It’s simple, you just need to escape the slash with an apostrophes.

Following test will pass:

  1.         [TestMethod]
  2.         public void SucessfulTest()
  3.         {
  4.             var date = new DateTime(2011, 11, 11);
  5.             var expected = "2011/11/11";
  6.             var actual = date.ToString("yyyy'/'MM'/'dd");
  7.             Assert.AreEqual(expected, actual);
  8.         }

For “works on my machine” proof, there is screenshot:

image_thumb3

DateTime.ToString() nianse

Nupat saskāros ar interesantu niansi, saistītu ar DateTime.ToString() formāta šablonu. Izrādās, ka slīpsvītra “/”, patiesībā ir speciālais šablona simbols, kurš tiek aizvietots ar datuma atdalītājsimbolu no reģionālajiem iestatījumiem.

Lai to pārbaudītu, var izmantot šādu testu:

  1.         [TestMethod]
  2.         public void FailingTest()
  3.         {
  4.             var date = new DateTime(2011, 11, 11);
  5.             var expected = "2011/11/11";
  6.             var actual = date.ToString("yyyy/MM/dd");
  7.             Assert.AreEqual(expected, actual);
  8.         }

Ja datorā ir LV reģionālie iestatījumi, tad šim testam vajadzētu izgāzties.

Ko darīt, ja vajag datumu noformēt ar slīpsvītru, kā atdalītāju? Pavisam vienkārši, slīpsvītru iekļaut apostrofos.

Šāds tests jau būs veiksmīgs:

  1.         [TestMethod]
  2.         public void SucessfulTest()
  3.         {
  4.             var date = new DateTime(2011, 11, 11);
  5.             var expected = "2011/11/11";
  6.             var actual = date.ToString("yyyy'/'MM'/'dd");
  7.             Assert.AreEqual(expected, actual);
  8.         }

Un pierādījumam, ka “works on my machine”, attēls ar testa rezultātiem:

image

Konfigurācijas failu labošana ar PowerShell

Pāris dienas atpakaļ, automatizējot dažādus sīkumus, radās vajadzība pamainīt web.config failu no skripta. Konkrētāk, vajadzēja pamainīt datubāzes konfigurāciju, kura glabājas atsevišķā konfigurācijas sekcijā.

Atbilstošais web.config fragments ir apmēram šāds:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3.     <connections>
  4.         <Main server="."
  5.               database="Main"
  6.               user="MainSite"
  7.               password="BEwTIDU">
  8.         </Main>
  9.         <Log server="."
  10.              database="Log"
  11.              user="AuditWriter"
  12.              password="TIDUaEAL1">
  13.         </Log>
  14.     </connections>
  15. </configuration>

Sportiskas intereses vadīts, nolēmu, ka šis varētu būt darbs, kuru lieliski varētu paveikt ar PowerShell. Pirmā doma bija to izdarīt ar regulārajām izteiksmēm. Nu, jūs jau ziniet…

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

Un tad man ienāca prātā doma, ka web.config taču ir tikai XML fails, kuru lieliski varētu arī kā tādu apstrādāt. Palaidu uzticamo PowerShell ISE un sāku eksperimentēt (t.i., meklēt internetā piemērus, ko pielāgot).

Gala rezultātā izrādījās, ka viss ģeniālais ir vienkāršs un recepte konfigurācijas faila labošanai ir pavisam vienkārša:

  1. Izveido XmlDocument instanci
  2. Ielasa failu
  3. Izmaina atbilstošā elementa vērtību
  4. Saglabā XmlDocument failā

Ja to uzraksta kā skriptu:

  1. param([string]$webConfig = '', [string]$server = '.\sql2008' )
  2. $xml = New-Object System.Xml.XmlDocument
  3. $xml.Load($webConfig)
  4. $doc = $xml.get_DocumentElement();
  5. $doc.connections.Main.server = $server
  6. $doc.connections.Log.server = $server
  7. $xml.Save($webConfig)

Visvairāk man šajā pieejā patīk tas, ka līdz atbilstošajam elementam var nokļūt izmantojot “strongly typed” sintaksi, kā tas ir redzams skripta 5. un 6. rindā.

Veiksmīgu skriptēšanu!

Webforms, MVC un WebMatrix salīdzinājums

Pēdējā laikā vairākas reizes esmu dzirdējis neizpratnes pilnus jautājumus par to, kādēļ Microsoft bija nepieciešams izstrādāt WebMatrix. Joe Stagner piedāvā ļoti labu un izsmeļošu atbildi uz šo jautājumu. Kā izrādās, ka es neesmu vienīgais, kuram nākas dzirdēt šo jautājumu.

Microsoft Web Application Configuration Analyzer

Microsoft ir publicējuši rīku, kurš ar pāris klikšķu palīdzību ļauj pārbaudīt vai Web applikāciju serveris atbilst ieteicamajām praksēm drošības jautājumos. Iegūtos rezultātus var eksportēt uz dažādiem datu formātiem un izveikt rezultātu salīdzināšanu.

Lai runā bildes:

2010-09-29_19152010-09-29_1915_0012010-09-29_1916

Dinamiski ielādējami lapas fragmenti ar ASP.NET MVC partial views + jQuery.ajax()

Sveiki šajpusē!

Sen neesmu neko rakstījis (slinkoju), bet nupat esmu nonācis līdz atklājumam, ar kuru vēlējos padalīties.

Nesen sanāca darboties ar ASP.NET MVC lapu, kurā vajadzēja kādu sarakstu pārvērst par divlīmeņu, t.i. lai uzklikšķinot uz kāda no ierakstiem, zem tā atvērtos vēl viens saraksts ar saistītiem ierakstiem.

Sākotnēji likās, ka jqGrid varētu būt problēmas risinājums, vēl jo vairāk tādēļ, ka tas jau “no kastītes” atbalsta daudzlīmeņu sarakstus un asinhronu datu ielādi izmantojot AJAX. Tomēr šim risinājumam pietrūka apakšbloka pielāgošanas un noformēšanas iespēju.

Nedaudz papētot problēmu izrādījās, ka šādu funkcionalitāti ir ļoti ērti panākt izmantojot partial views + jQuery .ajax() izsaukumus.

Lai nodemonstrētu šo paņēmienu darbībā, izveidošu nelielu web lapu, kas parāda reizināšanas tabulu. Galvenā skata kods ir pavisam vienkāršs – uzzīmēt 10x2 tabulu ar skaitļiem no 1 līdz 10:

<table>
    <%for (int i = 1; i <= 10; i++)
      {%>
    <tr>
        <td><%:i%></td>
        <td></td>
    </tr>
    <%}%>
</table>

partial_1

Nākošais sols ir izveidot partial view, kurš zīmēs reizinājumu tabulu:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int>" %>
<ul>
<%for (int i = 1; i <= 10; i++)
  {%>
  <li> <%:Model%> x <%:i%> = <%:Model * i%></li>
  <%
  }%>
</ul>

Lai apskatītos, ka reizināšana strādā, varam papildināt sākotnējo tabulas skatu:

<table>
<%for (int i = 1; i <= 10; i++)
  {%>
  <tr>
    <td><%:i%></td>
    <td><% Html.RenderPartial("Table", i); %></td>
  </tr>
  <%
  }%>
</table>

Un papriecāties par rezultātu:

partial_2

Tālāk ir pienācis laiks melnajai maģijai. Lai uztaisītu smuku, dinamisku kādas daļas parādīšanos/slēpšanu (ar datu saņemšanu izmantojot AJAX, jo mūsu sistēmās būs milzīgi saraksti un mēs gribam ātru sākotnējo lapas ielādi) var izmantot jQuery ajax() funkcijas spēju izmantot datu avotu, kurš atgriež HTML formatētus datus. Savukārt par HTML formāta sagatavošanai var izmantot kontroliera prasmi ģenerēt partial view rezultātu.

Tātad, kontroliera darbība, kura atbildēs par paneļa ģenerēšanu:

        public ActionResult GetTable(int i)
        {
            return PartialView("Table", i);
        }

Kā redzams, šeit nav nekā sarežģīta. Nākošais solis ir šīs darbības izsaukšana no javascript. Šeit būs nedaudz jāpaburas, jo metodei ir jāspēj veikt vairāki uzdevumi:

  1. Pieprasīt un saņemt HTML formatētus datus no kontroliera
  2. Ielādēt saņemtos HTML datus panelī
  3. Parādīt/paslēpt paneli

Datu pieprasīšana izmantojot $.ajax() metodi ir sarežģītākā uzdevuma daļa

        $.ajax({
            type: "GET",
            url: actionUrl,
            data: {i: number},
            dataType: "html",
            success: function (result) {
                var domElement = $(result);
                $("#" + containerId).val(domElement);
            },
            error: function (request, error, exception) {
                alert(request.status + " " + error + " " + exception);
            }
        });

Parametru detaļās neiedziļināšos, jo par to var izlasīt $.ajax() dokumentācijā, vienīgais ir jāatceras, ka obligāti jānorāda , ka saņemto datu tips ir HTML.

Datu ielāde panelī un paneļa slēpšanu/parādāšanu ļoti atvieglo jQuery metodes  val() un toggle()

$("#" + containerId).val(domElement); 
$('#' + containerId).toggle();

Pēdējais punkts – salikt visu kopā un papriecāties par to, kā tas darbojas.

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Reizes rēķins</h2>
<table>
<%for (int i = 1; i <= 10; i++)
  {%>
  <tr><td  onclick="toggleTable(<%:i%>, 'div<%:i%>', '<%:ResolveUrl("/Home/GetTable") %>')"> <%:i%></td> <td><div id="div<%:i%>"></div></td> </tr>
  <%
  }%>
</table>

<script type="text/javascript">
    function toggleTable(number, containerId, actionUrl) {
        $('#' + containerId).toggle();
        $.ajax({
            type: "GET",
            url: actionUrl,
            data: {i: number},
            dataType: "html",
            success: function (result) {
                var domElement = $(result);
                $("#" + containerId).val(domElement);
            },
            error: function (request, error, exception) {
                alert(request.status + " " + error + " " + exception);
            }
        });
    }
</script>
</asp:Content>

Ticu, ka manis rakstītais kods nav pats optimālākais, bet ceru, ka ideju var saprast.

Č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!

More Posts Next page »