<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnet.lv/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>Zināšanu bāze</title><link>http://dotnet.lv/blogs/</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Windows 8  (HTML 5 + JavaScript) izstrādātāju seminārs</title><link>http://dotnet.lv/blogs/dz/archive/2013/01/16/windows-8-html5-javascript-izstr-d-t-ju-semin-rs.aspx</link><pubDate>Wed, 16 Jan 2013 18:46:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:698809</guid><dc:creator>dace.zarina</dc:creator><slash:comments>57</slash:comments><description>&lt;p&gt;&amp;Scaron;odien Microsoft Latvija telpās notika Windows 8 izstrādātāju seminārs, kura laikā izstrādātāji atlocīja piedurknes un sasmērēja rokas, un veica dažus laboratorijas darbus. Seminārā tika izstrādāta testa programma - Contoso Cookbook jeb metro stila programma - pavārgrāmata Windows 8. Visus, kam ir interese, &amp;scaron;odienas laikā pildītie laboratorijas darbi ir brīvi pieejami internetā lejuplādējami&amp;nbsp;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=265118"&gt;&amp;scaron;eit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs dienas laikā mazliet guvu vairāk priek&amp;scaron;statu, kā varētu notikt izstrāde Windows 8 metro stila programmām ar HTML 5 un JavaScript. Ja HTML 5 un JavaScript ir tava mīļākā valoda un tehnoloģija, tad &amp;scaron;is noteikti ir tavs Windows 8 metro programmu izstrādes veids, ja tā tomēr nav Microsoft atstāj vēl pāris izvēles iespējas, piem., C# un XAML. Izņēmums vienīgi ir, ja tiek izstrādāta kāda spēle un ir nepiecie&amp;scaron;ams DirectX, tad gan ieteicamās izstrādes valodas ir XAML un C ++.&lt;/p&gt;
&lt;p&gt;Viena no lietām, kas man patika, bija iespēja izmantot jau eso&amp;scaron;ās JavaScript bibliotēkas Windows 8 programmu izstrādē, piem., jQuery un jQuery UI, kas var atvieglot programmas izstrādi, jo nav jāatsakās no izstrādātājam pierastām lietām.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs dienas semināra laboratorijas darbos galvenais uzsvars bija, kā izveidot &amp;scaron;īs jaunās lietas, piem., saintegrēties ar meklē&amp;scaron;anu, kas pieejama Start ekrānā, vai kopīgot (angļu val. share) informāciju ar citām programmām. Ja nu gadījumā kāds no semināra apmeklētājiem bija cerējis uzlabot savas HTML 5 un JavaScript zinā&amp;scaron;anas, tad &amp;scaron;ī nebija tā vieta, kur to izdarīt, jo &amp;scaron;ajā gadījumā tika pieņemts, ka visi jau sen to zin.&lt;/p&gt;
&lt;p&gt;Principā secinājums pēc &amp;scaron;īs dienas ir - Windows 8 metro stila izstrāde var būt kaut kas līdzīgs, kā izstrāde tīmeklim tik grūta vai viegla, cik ir labas vai sliktas ir jūsu HTML 5 un JavaScript zinā&amp;scaron;anas, tikai ir nepiecie&amp;scaron;ams apgūt specifiskās lietas Windows 8 līdzīgi, kā izmantojot jaunu bibliotēku tīmekļa izstrādē. Sākotnēji daudzas lietas var likties nepierastas un dīvainas, taču jo vairāk tiks rakstīts un lasīts kods, jo viss kļūs pierastāks un pazīstamāks. Protams, ka viena diena, lai apgūtu izstrādi Windows 8 metro programmām ir par maz, un ja ir doma kaut ko iztrādāt, noteikti ir nepiecie&amp;scaron;ams mazliet vairāk laika, lai apūtu visas nepiecie&amp;scaron;amās lietas. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dažas lietas, kas ir jāņem vērā, ja vēlaties izstrādāt metro stila programmas Windows 8:&lt;/p&gt;
&lt;p&gt;- Lai izstrādātu metro stila programmas ir nepiecie&amp;scaron;ama Windows 8 operētājsistēma (Windows 7 vai Windows Vista vai vecāka Windows operētājsistēma nederēs) + Visual Studio Express 2012 for Windows 8 vai arī jebkura Visual Studio 2012 versija, piem., Professional, Ultimate, utt. un Windows 8 SDK.&lt;/p&gt;
&lt;p&gt;- Tāpat, lai uz sava datora ar Windows 8 nokompilētu un &amp;quot;palaistu&amp;quot; savas metro programmas ir nepiecie&amp;scaron;ama izstrādātāja licence, kas ir derīga tikai vienu mēnesi (Tā ir iegūstama bez maksas un to viegli pēc mēne&amp;scaron;a var atjaunot. Sīkāka informācija, kā to var izdarīt ir pieejama &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh974578.aspx"&gt;&amp;scaron;eit&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;- Lai publicētu savas programmas Windows Store ir arī nepiecie&amp;scaron;ams speciāls konts, bet tas gan ir par maksu (laikam ka bija kādi 13 LVL privātpersonai un 19 LVL kompānijai), taču priecē, ka gada abonē&amp;scaron;anas maksa ir daudz mazāka kā&amp;nbsp;&lt;span&gt;Windows Phone Dev.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Pagaidām Windows Store ir tikai divas no programmas, kuras ir izstrādāju&amp;scaron;i Latvijas izstrādātāji, viena no &amp;scaron;īm programmām ir ATM finder, bet otra ir kāda Latvijā radīta spēle, kurai nosaukumu diemžēl neatceros. Tā kā ir vērts sasparoties un mēģināt uzrakstīt savu programmu Windows 8.&lt;/p&gt;
&lt;p&gt;P.S.&lt;/p&gt;
&lt;p&gt;Katrs semināra dalībnieks tika pie Windows 8 krekla, kā arī man palaimējas tikt pie bezvadu klaviatūras (Arc Keyboard).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=698809" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/dz/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://dotnet.lv/blogs/dz/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://dotnet.lv/blogs/dz/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>Jauns gads, jaunas idejas</title><link>http://dotnet.lv/blogs/vi/archive/2013/01/08/jauns-gads-jaunas-idejas.aspx</link><pubDate>Mon, 07 Jan 2013 22:19:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:694994</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Vēl viens gads ir pagājis.&lt;/p&gt;
&lt;p&gt;Aizvadītais gads ir bijis ražens netikai man, bet arī dotnet.lv grupai kopumā. Ir lasītas neskaitāms lekcijas gan grupas ietvaros, gan arī ir notiku&amp;scaron;i intensīvi universitātes apmeklējumi visā Latvijā visa gada garumā. Atsauces un iespaidi ir biju&amp;scaron;i lieliski un to noteikti arī atkārto&amp;scaron;u &amp;scaron;ajā gadā.&lt;/p&gt;
&lt;p&gt;Aizvadītajā gadā cītīgi stradāju un dienas gaismu ieraudzīja ATM Finder aplikācija Microsoft platformām &amp;ndash; &lt;a target="_blank" href="http://bit.ly/atmfinder"&gt;Windows Phone&lt;/a&gt; un &lt;a target="_blank" href="http://bit.ly/AtmFinderW8"&gt;&lt;strong&gt;Windows 8&lt;/strong&gt;&lt;/a&gt;. Gada laikā ATM Finder aplikācija sasniegusi gandrīz 10k lejupielādes. Saņemts ir daudz atsauksmes no Jums. Paldies!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Darbi arī norit pie nākamajām interesantajām aplikācijām gan mobilajai platformai, gan ari Windows 8 darba virsmai.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tomēr..&lt;/p&gt;
&lt;p&gt;Sekojot &lt;a target="_blank" href="http://gettingresults.com/wiki/Main_Page"&gt;&lt;strong&gt;Agile Results&lt;/strong&gt;&lt;/a&gt; ietvaram jauns gads ir jauns sākums un iespēja ko mainīt, izvirzīt jaunus mērķus un intensīvi strādāt pie tā lai tos sasniegtu.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;ajā gadā ir izvirzīti augstāki mērķi un idejas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;Scaron;is gads iesākas ar personisko ikubācijas projektu laboratoriju, kas pla&amp;scaron;āk pazīstama kā &lt;a target="_blank" href="http://www.tech-fellow.lv/"&gt;&lt;strong&gt;Tech Fellow Consulting&lt;/strong&gt;&lt;/a&gt;. Tā ir apvienība, kurā darbojas pieredzēju&amp;scaron;i problēmu domaina eksperti, nolūkā palīdzēt klientiem programmatūras izstrādes procesu sakārto&amp;scaron;anā, arhitektūras definē&amp;scaron;anā un modelē&amp;scaron;anā, kopējās tehniskās vīzijas skicē&amp;scaron;anā un citās interesantās lietās.&lt;/p&gt;
&lt;p&gt;Bet galvenokārt, tā ir apvienība, kuras pamatā ir ideja &amp;ndash; fun &amp;amp; passion &amp;ndash; par lietām, ar kurām nodarbojamies &amp;ndash; Software Development.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.tech-fellow.lv/" title="http://www.tech-fellow.lv/"&gt;http://www.tech-fellow.lv/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/tech_fellow" title="https://twitter.com/tech_fellow"&gt;https://twitter.com/tech_fellow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Keep coding!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[x]&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=694994" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category></item><item><title>Kā nerakstīt objektorientētu programmu</title><link>http://dotnet.lv/blogs/ia/archive/2012/11/06/k-nerakst-t-objektorient-tu-programmu.aspx</link><pubDate>Tue, 06 Nov 2012 08:21:35 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:633534</guid><dc:creator>ivars.arins</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;Šī 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:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/ClassDiagram_5F00_575AB95A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="ClassDiagram" border="0" alt="ClassDiagram" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/ClassDiagram_5F00_thumb_5F00_69374D27.png" width="660" height="479" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pirmajā acu uzmetienā nekas īpašs, diezgan ikdienišķa klašu struktūra. Bet ja mēs apskatam &lt;font face="Consolas"&gt;WhiteboardShape.DoSomeLogic()&lt;/font&gt; metodi…&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Consolas&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#10100d;padding-left:5px;padding-right:5px;height:289px;max-height:300px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#d6d694;"&gt;public&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;virtual&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;void&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; DoSomeLogic()&lt;/span&gt;       &lt;br /&gt;&lt;span style="color:#e8e8e8;"&gt;{&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#d6d694;"&gt;if&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; (DomainObject &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;is&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#009b00;"&gt;DomainObjectAlpha&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt;)&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;{&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#756f51;"&gt;// Do WhiteboardShapeAlpha specific logic&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;}&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#d6d694;"&gt;else&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;if&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; (DomainObject &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;is&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#009b00;"&gt;DomainObjectBeta&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt;)&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;{&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#756f51;"&gt;// Do WhiteboardShapeBeta specific logic&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;}&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#d6d694;"&gt;else&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;if&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; (DomainObject &lt;/span&gt;&lt;span style="color:#d6d694;"&gt;is&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt; &lt;/span&gt;&lt;span style="color:#009b00;"&gt;DomainObjectGamma&lt;/span&gt;&lt;span style="color:#e8e8e8;"&gt;)&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;{&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;&lt;/span&gt;&lt;span style="color:#756f51;"&gt;// Do WhiteboardShapeGamma specific logic&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#e8e8e8;"&gt;}&lt;/span&gt;       &lt;br /&gt;&lt;span style="color:#e8e8e8;"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;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 &lt;font face="Consolas"&gt;DoSomeLogic()&lt;/font&gt; 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.&lt;/p&gt;  &lt;p&gt;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 “&lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;cyclomatic complexity&lt;/a&gt;” un “&lt;a href="http://en.wikipedia.org/wiki/Coupling_%28computer_programming%29"&gt;class coupling&lt;/a&gt;” metodes &lt;font face="Consolas"&gt;WhiteboardShape&lt;/font&gt; klasei.&lt;/p&gt;  &lt;p&gt;Metrikas pirms koda izdalīšanas:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/image_5F00_10056368.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/image_5F00_thumb_5F00_04DBD91E.png" width="724" height="43" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;un pēc:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/image_5F00_64C0CC60.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/image_5F00_thumb_5F00_16B86CEB.png" width="724" height="37" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Š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.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=633534" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/OOP/default.aspx">OOP</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Grāmatas apskats “Brownfield Application Development in .Net”</title><link>http://dotnet.lv/blogs/ia/archive/2012/10/23/gr-matas-apskats-brownfield-application-development-in-net.aspx</link><pubDate>Tue, 23 Oct 2012 05:08:46 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:625435</guid><dc:creator>ivars.arins</dc:creator><slash:comments>0</slash:comments><description>&lt;a href="http://www.amazon.com/gp/product/1933988711/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1933988711&amp;amp;linkCode=as2&amp;amp;tag=ivarablogs-20"&gt;&lt;img style="margin:5px;float:left;" border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=1933988711&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ivarablogs-20" alt="" /&gt;&lt;/a&gt;&lt;img style="margin:0px;float:left;" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=ivarablogs-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1933988711" width="1" height="1" /&gt;   &lt;p&gt;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 &lt;a href="http://www.amazon.com/gp/product/1933988711/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1933988711&amp;amp;linkCode=as2&amp;amp;tag=ivarablogs-20"&gt;Brownfield Application Development in .Net&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Kas tad ir “Brownfield application”? Citējot Wikipēdijas ierakstu par &lt;a href="http://en.wikipedia.org/wiki/Brownfield"&gt;brownfield land&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“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”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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 &lt;a href="https://twitter.com/daviskulis"&gt;Dāvim&lt;/a&gt; un &lt;a href="https://twitter.com/tech_fellow"&gt;Valdim&lt;/a&gt;) un tāpēc daudzas šajā daļā minētās lietas vienmēr ir likušās pašsaprotamas.&lt;/p&gt;  &lt;p&gt;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).&lt;/p&gt;  &lt;p&gt;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!”&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Novērtējums: 10 &amp;lt;ievietojiet mērvienību&amp;gt; no 10&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Nu un saldajam ēdienam daži citāti no šīs lieliskās grāmatas:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Few people can withstand the psychological kick to the stomach that occurs when you first open a six-thousand line code-behind file.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;“Performance should not be ignored. But nor should it be addressed haphazardly. Your primary goal should be a working application. Once that&amp;#39;s been achieved, it can be tuned based on actual performance testing. And remember, perceived performance is more important than actual performance.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;“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.”&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=625435" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/Gr_0101_matas/default.aspx">Grāmatas</category></item><item><title>Source Code Pro šrifts</title><link>http://dotnet.lv/blogs/ia/archive/2012/10/09/source-code-pro-rifts.aspx</link><pubDate>Tue, 09 Oct 2012 06:39:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:616449</guid><dc:creator>ivars.arins</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;Sveiki, meitenes un zēni!&lt;/p&gt;
&lt;p&gt;Ja vēl neesat to izdarīju&amp;scaron;i, tad iesaku Visual Studio izmēģināt &amp;scaron;riftu &lt;a href="http://blogs.adobe.com/typblography/2012/09/source-code-pro.html"&gt;Source Code Pro&lt;/a&gt;. Jau nedēļu to ikdienā lietoju un pagaidām iespaids ir: &lt;b&gt;FANTASTISKI&lt;/b&gt;!&lt;/p&gt;
&lt;p&gt;Lai runā bilde&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/Font-demo.PNG" alt="" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=616449" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/_6101_rifti/default.aspx">šrifti</category></item><item><title>‘ATM Finder’ privacy policy</title><link>http://dotnet.lv/blogs/vi/archive/2012/10/04/atm-finder-privacy-policy.aspx</link><pubDate>Thu, 04 Oct 2012 07:09:35 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:613623</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;table cellspacing="0" cellpadding="0"&gt;       &lt;tr&gt;         &lt;td align="center"&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/150x150_5F00_22D9077A.png" rel="lightbox"&gt;&lt;img style="float:none;margin:50px auto;display:block;" border="0" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/150x150_5F00_thumb_5F00_6DCC7849.png" width="154" height="154" alt="" /&gt;&lt;/a&gt;             &lt;p align="center"&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;&lt;font size="4"&gt;Privacy:&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font style="line-height:200%;" size="4"&gt;ATM Finder respects user privacy and therefore no user information is collected nor stored. ATM Finder uses location services to detect device location to provide information about closest ATM machine or bank office. Data collected from location service are not stored or forwarded. User always is able to turn off permissions for ATM Finder application to use location services.&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font size="4"&gt;If you would like to report any violations of this policy, please contact us at &lt;a href="mailto:valdis.iljuconoks@dotnet.lv" target="_blank"&gt;valdis.iljuconoks@dotnet.lv&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&amp;#160;&lt;/p&gt;            &lt;p&gt;&amp;#160;&lt;/p&gt;            &lt;p&gt;&amp;#160;&lt;/p&gt;            &lt;p&gt;&lt;font size="4"&gt;Author:&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font size="4"&gt;Valdis Iljuconoks, Microsoft MVP&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font size="4"&gt;&lt;a href="http://www.dotnet.lv/blogs/vi/"&gt;http://www.dotnet.lv/blogs/vi/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;            &lt;p&gt;&lt;font size="4"&gt;Copyright © Valdis Iljuconoks, 2012&lt;/font&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=613623" width="1" height="1"&gt;</description></item><item><title>Delete Team Project from TFS hosted service (tfspreview.com)</title><link>http://dotnet.lv/blogs/vi/archive/2012/10/01/delete-team-project-from-tfs-hosted-service-tfspreview-com.aspx</link><pubDate>Mon, 01 Oct 2012 18:53:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:612329</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;While making some demos and playing around with TFS in the cloud (tfspreview.com) I noticed that it&amp;rsquo;s not actually possible to permanently delete the team project from user interface. This particular &amp;ldquo;red cross&amp;rdquo; besides team project name actually just removes project from MRU (&lt;em&gt;Most Recently Used&lt;/em&gt;) list.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_61A802FB.png"&gt;&lt;img height="151" width="232" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_36636BF4.png" alt="image" border="0" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;What you need to to is to use &lt;strong&gt;tfsdeleteproject.exe &lt;/strong&gt;from Command Line tool.&lt;/p&gt;
&lt;p&gt;First of all you need to have permission to &lt;strong&gt;Delete team project&lt;/strong&gt;. That one you can easily set in Administration page in your TFS account. Just click on &amp;ldquo;gear&amp;rdquo; icon in the right-upper corner. You can set this permission either on team project or team project collection level, for the user or for the group to which user is member of.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_0156DCC4.png"&gt;&lt;img height="490" width="773" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_613BD006.png" alt="image" border="0" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Open Visual Studio Command prompt. And type:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="background-color:#f2f2f2;"&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;tfsdeleteproject /collection:https://&lt;strong&gt;{your-subscription-name}&lt;/strong&gt;.tfspreview.com/defaultcollection &lt;strong&gt;{project-name}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_561245BC.png"&gt;&lt;img height="335" width="837" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_35F738FF.png" alt="image" border="0" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sometimes you may see some error messages while deleting team project.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="background-color:#f2f2f2;"&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Deleting from ProjectServer ... &lt;br /&gt;TF294000: Access denied. Windows Live ID\valdis.iljuconoks@dotnet.lv needs the A &lt;br /&gt;dminister Project Server Integration privilege to perform this action. For more &lt;br /&gt;information, contact your administrator for Team Foundation Server. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This could be ignored for the moment &amp;ndash; team project gets deleted regardless of errors.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_15DC2C42.png"&gt;&lt;img height="559" width="837" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_75C11F84.png" alt="image" border="0" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Remember that you have to use VS 2012 Command Line tools instead of 2010. Because later does not have forward compatibility with tfspreview.com services.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_55A612C7.png"&gt;&lt;img height="431" width="837" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_358B060A.png" alt="image" border="0" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Hope this helps!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=612329" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Team+Foundation+Services/default.aspx">Team Foundation Services</category></item><item><title>Story behind ‘ATM Finder’ v2.0</title><link>http://dotnet.lv/blogs/vi/archive/2012/09/24/story-behind-atm-finder-v2-0.aspx</link><pubDate>Mon, 24 Sep 2012 19:09:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:608983</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/200_5F00_723360F3.png" rel="lightbox"&gt;&lt;img title="200" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:left;padding-top:0px;padding-left:0px;margin:40px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="200" align="left" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/200_5F00_thumb_5F00_19017734.png" width="92" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;After a while I’m pleased to announce that “ATM Finder” application has been finally pushed out and published on &lt;a href="http://www.windowsphone.com/en-us/store/app/atm-finder/e0ff546f-b723-4fea-8c38-badfe3495b05" target="_blank"&gt;Windows Phone Store&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;This has been incredible learning and exploring period to get things done and up and working. So I think this is good time to share some story behind the scene of “ATM Finder v2.0”.&lt;/p&gt;    &lt;p&gt;User interface hasn’t been changed so much. Some small enhancements and polishing.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div align="center"&gt;     &lt;table cellspacing="0" cellpadding="5" align="center"&gt;         &lt;tr&gt;           &lt;td&gt;             &lt;p align="center"&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;ATM Finder 1.*&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td&gt;             &lt;p align="center"&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;ATM Finder 2.0&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/5.1_5F00_0DD7ECEA.png" rel="lightbox"&gt;&lt;img title="5.1" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="5.1" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/5.1_5F00_thumb_5F00_06B8B072.png" width="374" height="623" /&gt;&lt;/a&gt;&lt;/td&gt;            &lt;td&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/5.2_5F00_148AF66D.png" rel="lightbox"&gt;&lt;img title="5.2" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="5.2" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/5.2_5F00_thumb_5F00_0D6BB9F5.png" width="375" height="625" /&gt;&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;       &lt;/table&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;So what are the new cool features for the new version? Here goes the list:&lt;/p&gt;    &lt;p&gt;1. As more settings switches were coming, I decided to split up “Settings” page into multiple pages grouped in single pivot.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/4_5F00_6D50AD37.png" rel="lightbox"&gt;&lt;img title="4" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="4" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/4_5F00_thumb_5F00_291045EB.png" width="271" height="452" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;2. Now you can turn on to show map immediately after application start. This mode is usually used when you need to navigate directly to nearest ATM and want to look where it is exactly on the map.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/1_5F00_08F5392E.png" rel="lightbox"&gt;&lt;img title="1" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="1" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/1_5F00_thumb_5F00_16C77F29.png" width="277" height="462" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;3. Now you can see GPS coordinates on main screen. Some feedback received on this – this could sometimes pretty useful because there is rarely any application that is exposing GPS coordinates to the user.&lt;/p&gt;    &lt;p&gt;4. For those guys who are traveling and roaming is generating some expenses – offline (local data stored driven) mode is also still available. Local storage will be a bit out-dated. I’m considering to offer offline-download mode – which would provide a way to download data to local storage for particular area when on WiFi.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/2_5F00_5DB0A226.png" rel="lightbox"&gt;&lt;img title="2" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="2" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/2_5F00_thumb_5F00_3D959569.png" width="285" height="475" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;5. Now you can select multiple “My home bank”. The feature request was pretty obvious as nowadays in modern world we are having more than one bank and credit card.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/3_5F00_6F8D35F3.png" rel="lightbox"&gt;&lt;img title="3" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="3" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/3_5F00_thumb_5F00_7D5F7BEE.png" width="290" height="483" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;6. If there unfortunately some misleading data or location for the ATM is invalid then user has possibility to report this issue to the author and data will be fixed.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/6_5F00_0B31C1EA.png" rel="lightbox"&gt;&lt;img title="6" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="6" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/6_5F00_thumb_5F00_6B16B52C.png" width="298" height="497" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;And of course feature still remains unchanged – you can still get directions to ATM of your choice using Bing Maps directions services.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/7_5F00_1D0E55B7.png" rel="lightbox"&gt;&lt;img title="7" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="7" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/7_5F00_thumb_5F00_1FB71168.png" width="303" height="505" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;A bit longer story goes for the backend.&lt;/p&gt;    &lt;p&gt;In previous version “ATM Finder” was driven by local data storage. All the ATMs were stored in local storage, loaded up asynchronously and “some-how in parallel” (are you kidding – that’s a single core phone!, for this I’ll share more details in upcoming posts). The change is that data now in v2.0 is retrieve from &lt;a href="http://www.windowsazure.com/" target="_blank"&gt;Windows Azure&lt;/a&gt; cloud service. This change was driven by idea that uploading new ATMs or removing some obsolete ones should not trigger client application update. Now any changes made to the list of the ATMs are done on server side and immediately distributed to the clients on-demand. Data also is cached on the server side not to hit SQL server and generate additional costs. For this in more details – another post is pending.&lt;/p&gt;    &lt;p&gt;So in honor to ATM Finder application I though that it’s a good time to share some more details on each of the aspect which I faced during design and development phases in following series of blog posts:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Overall design and planning phase (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Source code and project layout and source control system (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Screen layout and application navigation schema (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Binding and Model-View-View/Model approach (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Reactive Extensions and asynchronous programming on that small device (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Location services (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Working with Bing Maps (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Application state, settings and isolated storage (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Consuming Windows Azure cloud services (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Performance and asynchronous operation model. &lt;/li&gt;      &lt;li&gt;Unit testing and UI testing (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;      &lt;li&gt;Packaging, marketplace certification and publishing (&lt;em&gt;&lt;strong&gt;planning&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Also I wanted to give a big thanks to my beta testers for invaluable feedback on early versions of ATM Finder app. Thanks goes to (alphabetical order)&lt;/p&gt;    &lt;p&gt;1. Āriņš Ivars (&lt;a href="https://twitter.com/PiRXlv" target="_blank"&gt;@PiRXlv&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;2. Bicāns Jānis (&lt;a href="https://twitter.com/janisbic" target="_blank"&gt;@janisbic&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;3. Linkēvičš Gusts (&lt;a href="https://twitter.com/gstgusts" target="_blank"&gt;@gstgusts&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;4. Maciņš Aigars (&lt;a href="https://twitter.com/Owandir" target="_blank"&gt;@Owandir&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;5. Andres Sirel (&lt;a href="http://twitter.com/asirel" target="_blank"&gt;@asirel&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cheers! Hope this helps. Take a look at &lt;a href="http://bit.ly/atmfinder"&gt;http://bit.ly/atmfinder&lt;/a&gt; and waiting always for feedback how cash finding process could be improved and enhanced :)&lt;/p&gt;     &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=608983" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Phone/default.aspx">Windows Phone</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Azure+Storage/default.aspx">Azure Storage</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/English/default.aspx">English</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Team+Foundation+Services/default.aspx">Team Foundation Services</category></item><item><title>Product Backlog ātrais pievienošanas panelis</title><link>http://dotnet.lv/blogs/vi/archive/2012/09/18/product-backlog-trais-pievieno-anas-panelis.aspx</link><pubDate>Tue, 18 Sep 2012 12:02:40 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:605721</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt; &lt;p&gt;Jaunais Team Foundation Server 2012 (kā arī Services – &lt;a href="http://tfspreview.com/"&gt;tfspreview.com&lt;/a&gt;) nāk kopā ar ļoti daudz svarīgām un noderīgām iespējām tieši produkta master To-do saraksta (angl. &lt;em&gt;product backlog&lt;/em&gt;) pārlūkošanai un plānošanas. Principā TFS piedāvā diezgan plašu klāstu ar lietām, kas nākušas klāt tieši šajā sfērā, bet tas ir atsevišķs stāsts.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Viena no jaukā &lt;em&gt;feature &lt;/em&gt;klāsta ir iespēja &lt;em&gt;on-fly &lt;/em&gt;pievienot jaunu &lt;em&gt;Product Backlog Item &lt;/em&gt;(PBI). Zemāk redzams ātrās pievienošanas panelis, kas dod iespēju ātri un ērti pievienot jaunu lietotāja scenāriju (&lt;em&gt;user story&lt;/em&gt;) sarakstam.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_7AEABE50.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_21B8D491.png" width="947" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Sekojot labākajām Agile praksēm, pārsvarā pietiek tikai nosaukumu, kurā tiek minēti visi nepieciešamie un svarīgākie atslēgas vārdi, kas apraksta šo &lt;em&gt;user story&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Tomēr brīžiem šķiet arī, ka aptuvenais novērtējums ir pietiekami svarīgs, lai to ievadītu uzreiz pie jauna PBI ievades.&lt;/p&gt;  &lt;p&gt;Lai nodrošinātu šādu iespēju, jāķeras pie procesa šablona mainīšanas (&lt;strong&gt;Process Template Customization&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;Lai ķertos klāt pie šablona izmaiņām pastāv divi varianti, kā to darīt:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Lejupielādēt visu procesa šablonu. Šis gadījums noder situācijās, kad grib mainīt iebūvētā šablona uzvedību un iegūt šīs veiktās izmaiņas projektos, kas tiks veidoti TFS serverī, izmantojot šo modificēto šablonu. &lt;/li&gt;    &lt;li&gt;Lejupielādēt tikai nepieciešamo definīciju failu. Šis variants noder situācijās, kad nepieciešams mainīt jau esoša projekta uzvedību un izskatu. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Tātad ķersimies pie 2. varianta, jo projekts jau eksistē un vēlamies veikt izmaiņas esošā projektā.&lt;/p&gt;  &lt;p&gt;Vispirms nepieciešams atvērt Visual Studio Command Prompt (&lt;strong&gt;NB! &lt;/strong&gt;atceramies, ja ir instalēta arī VS 2010, tad jālaiž ir 2012 komandrinda, jo 2010 šīs jaunās iespējas nebūs un izpildot komandas atpakaļ saņemsim tikai kļūdas paziņojumus).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_53B0751B.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_1A999819.png" width="502" height="278" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Visas darbības ar TFS serveri, lai modificēt procesa šablonu, tiek veiktas izmantojot &lt;strong&gt;&lt;font size="2" face="Courier New"&gt;witadmin.exe&lt;/font&gt; &lt;/strong&gt;komandrindinas programmu.&lt;/p&gt;  &lt;p&gt;Procesa šablona fails, kas mums nepieciešams, lai modificētu ātrās pievienošanas paneli, iegūstams ar &lt;strong&gt;&lt;font size="2" face="Courier New"&gt;exportagileprocessconfig&lt;/font&gt; &lt;/strong&gt;programmas operācijas parametru.&lt;/p&gt;  &lt;p&gt;Jāizpilda sekojoša komanda:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;&lt;font size="2" face="Courier New"&gt;witadmin exportagileprocessconfig /collection:http://&lt;strong&gt;{server}&lt;/strong&gt;:8080/tfs/&lt;strong&gt;{collection}&lt;/strong&gt; /p:&lt;strong&gt;{project}&lt;/strong&gt; /f:agile.xml       &lt;br /&gt;&lt;/font&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Šajā gadījumā jāizpilda bija sekojoša komanda:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;witadmin exportagileprocessconfig /collection:http://localhost:8080/tfs/defaultcollection /p:ScrumTest2 /f:agile.xml&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_0F700DCF.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_4167AE59.png" width="837" height="287" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Kā rezultātā iegūstam &lt;font size="2" face="Courier New"&gt;agile.xml &lt;/font&gt;failu, kas ir jaunievedums TFS 2012 versijā, lai nodrošinātu šīs jaunās &lt;em&gt;Agile planning&lt;/em&gt; iespējas jebkuram procesa šablonam.     &lt;br /&gt;Failā jāmeklē ir sekojoša hierarhija:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;AgileProjectConfiguration&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProductBacklog&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AddPanel&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Fields&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Šajā kolekcijā atrodas lauki, kuriem jāparādās ātrās pievienošanas panelī.&lt;/p&gt;  &lt;p&gt;Sarakstu ar pieejamajiem laukiem ir iespējams iegūt eksportējot PBI definīcijas failu.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;witadmin exportwitd /collection:http://localhost:8080/tfs/defaultcollection /p:ScrumTest2 /n:&amp;quot;Product Backlog Item&amp;quot; /f:pbi.xml&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Un meklējot sadaļu:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;witd&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;WORKITEMTYPE&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;FIELDS&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ....         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;FIELD name=&amp;quot;Effort&amp;quot; &lt;strong&gt;refname&lt;/strong&gt;=&amp;quot;Microsoft.VSTS.Scheduling.Effort&amp;quot; type=&amp;quot;Double&amp;quot; reportable=&amp;quot;measure&amp;quot; formula=&amp;quot;sum&amp;quot; /&amp;gt;         &lt;br /&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Jāizmanto ir lauka refname atribūta vērtība, lai pievienotu lauku ātrās pievienošanas panelim.&lt;/p&gt;  &lt;p&gt;Effort lauks slēpjas zem refname “&lt;font size="2" face="Courier New"&gt;Microsoft.VSTS.Scheduling.Effort&lt;/font&gt;”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;AddPanel&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Fields&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Field refname=&amp;quot;System.Title&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Field refname=&amp;quot;Microsoft.VSTS.Scheduling.Effort&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Fields&amp;gt;         &lt;br /&gt;&amp;lt;/AddPanel&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lai augšielādētu izmaiņas un mainītu esoša projekta izskatu un uzvedību, jāizmanto tā pati &lt;font size="2" face="Courier New"&gt;witadmin&lt;/font&gt; komanda tikai ar &lt;font size="2" face="Courier New"&gt;importagileprocessconfig&lt;/font&gt; komandas operācijas parametru.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="background-color:#f2f2f2;"&gt;   &lt;p&gt;&lt;font size="2" face="Courier New"&gt;witadmin importagileprocessconfig /collection:http://localhost:8080/tfs/defaultcollection /p:ScrumTest2 /f:agile.xml&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_363E240F.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_6835C499.png" width="837" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ja komanda izpildās bez kļūdas paziņojumiem, tad jaunās izmaiņas ir stājušās spēkā. Pārbāudīt tās ir iespējams vienkārši ejot uz ātrās pievienošanas paneli.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_5D0C3A4F.png" rel="lightbox"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_3CF12D92.png" width="858" height="378" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Jāpiemin gan, ka šāda veida izmaiņas nav iespējams Team Foundation Services risinājumā, jo Microsoft neļauj procesa šablonu izmaiņas mākoņrisinājumā.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=605721" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Process+Templates/default.aspx">Process Templates</category></item><item><title>Decimal.ToString(), reģionālie iestatījumi un Excel</title><link>http://dotnet.lv/blogs/ia/archive/2012/07/11/decimal-tostring-re-ion-lie-iestat-jumi-un-excel.aspx</link><pubDate>Wed, 11 Jul 2012 10:11:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:532436</guid><dc:creator>ivars.arins</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Kāda ir at&amp;scaron;ķirība starp &amp;scaron;iem diviem skaitļiem?&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/Capture_5F00_1.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Teiksiet, nekāda? Nu un tad pamēģiniet nokopēt nāko&amp;scaron;ās divas rindas un ielīmēt tās Excelī.&lt;/p&gt;
&lt;p&gt;1&amp;nbsp;002&amp;nbsp;414&amp;nbsp;179,5&lt;br /&gt;1 002 414 179,5&lt;/p&gt;
&lt;p&gt;Hmm, vienu rindu pārveidoja par skaitli, bet otru nē? Kāpēc?&lt;/p&gt;
&lt;p&gt;Tāpēc, ka pirmajā rindā eso&amp;scaron;ajā skaitlī, ir nevis parastās atstarpes, bet gan &amp;quot;&lt;a href="http://www.fileformat.info/info/unicode/char/a0/index.htm"&gt;No-break space&lt;/a&gt;&amp;quot;&amp;nbsp; simbols. HTML zinātāji (&amp;quot;View source&amp;quot; izmantotāji) tagad māj ar galvu un saka, ka pamanīja &amp;amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ia/Capture_5F00_s.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Izrādās, ka Latvijas reģionālajos iestatījumos (un pieļauju, ka ne tikai Latvijas) tūksto&amp;scaron;u atdalītājs ir &amp;scaron;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&amp;scaron;u atdalītāju uzskata tikai atstarpes simbolu, tādējādi &amp;scaron;ādi skaitļus pēc ielīmē&amp;scaron;anas tiek uzskatīti par tekstu un lai ar tiem varētu veikt matemātiskas darbības ir nepiecie&amp;scaron;ams izpildīt papildus pietupienus.&lt;/p&gt;
&lt;p&gt;Esiet uzmanīgi, ja skaitļu noformē&amp;scaron;anai lietotāja saskarnē tiek izmantots tūksto&amp;scaron;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. &lt;/p&gt;
&lt;p&gt;Atkārtot &amp;scaron;o problēmu var ar pavisam vienkār&amp;scaron;u programmiņu:&lt;/p&gt;
&lt;pre&gt;using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args) {
            Console.WriteLine((1002414179.5m).ToString(&amp;quot;C&amp;quot;));
            Console.WriteLine((1002414179.5m).ToString(&amp;quot;C&amp;quot;).Replace(&amp;#39;&amp;nbsp;&amp;#39;, &amp;#39; &amp;#39;));
        }
    }
}
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=532436" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/.NET/default.aspx">.NET</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/gotcha/default.aspx">gotcha</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/Excel/default.aspx">Excel</category></item><item><title>TechEd konference Amsterdamā 2. diena</title><link>http://dotnet.lv/blogs/dz/archive/2012/06/28/teched-konference-amsterdam-2-diena.aspx</link><pubDate>Thu, 28 Jun 2012 20:53:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:500487</guid><dc:creator>dace.zarina</dc:creator><slash:comments>163</slash:comments><description>&lt;p&gt;&lt;a href="http://www.dotnet.lv/blogs/dz/archive/2012/06/26/teched-konference-amsterdama-1-diena.aspx"&gt;TechEd konference 1. diena&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TechEd konferences 2. diena iesākās līdzīgi kā pirmā ar ievadsesiju, ko vadīja Antonie Leblond (Microsoft vice prezidents).&lt;/p&gt;
&lt;p&gt;&lt;img height="210" width="360" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd2/DSC_5F00_0078.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs dienas ievadsesijas galvenā tēma bija Windows 8 un viss, kas ir saistīts ar to. Sesija iesākās ar to, kādi principi tika ņemti vērā izstrādājot Windows 8:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;portatīvie datori ir vairāk kā &amp;quot;galda datori&amp;quot;;&lt;/li&gt;
&lt;li&gt;datori ar skārienjūtīgajiem ekrāniem kļūst arvien vairāk un vairāk.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;img src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd2/DSC_5F00_0072.JPG" width="360" height="210" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;Kā ievadsesijā tika reklamēts, tad viss labais, kas bija Windows 7, tika pārnests uz Windows 8.&amp;nbsp;izstrādājot Windows 8,&amp;nbsp;tika rūpīgi pārdomāta lietotāja pieredze. Windows 8 vienlīdz labi strādā gan ar peli un klaviatūru, gan ar skārienjūtūgu ekrānu. Viena no lietām, kas man likās interesanta bija bildes parole (&lt;i&gt;angļu val. picture password&lt;/i&gt;), kad lai atbloķētu ekrānu ir nepiecie&amp;scaron;ams, noklik&amp;scaron;ķināt uz bildes konrētās vietās. Bildes paroli ir ērti lietot ar ierīcēm, kam ir skārienjūtīgs ekrāns, taču tas nenozīmē, ka &amp;quot;vecais veids&amp;quot; kā atbloķēt ekrānu ir kaut kur pazudis, tas strādā un neviens no tā netaisās atteikties :)&lt;/p&gt;
&lt;p&gt; Principā visas lietas, ko var izdarīt ar skārienjūtīgo ekrānu un pieskārieniem var arī var izdarīt ar peli un klaviatūru. Viena no lietām, pie kā būs jāpierod ir tas, ka nav starta pogas, kad pārslēdzās no starta ekrāna ar &amp;quot;flīzītēm&amp;quot;. Tā vietā apak&amp;scaron;ējā kreisajā stūrī noklik&amp;scaron;ķinot ar peli ir iespējams iegūt izvēlni, no kuras var izvēlēties programmas. Ja runājam par Windows 8, tad visādas interesantas lietas ir paslēptas stūros un stūri ir mūsu &amp;quot;draugi&amp;quot;, kad mēs strādājam ar Windows 8.&lt;/p&gt;
&lt;p&gt; Viena no lietā, kas man likās interesanta bija - Windows 8 palai&amp;scaron;ana no 32 GB zibatmiņas. Jūs dro&amp;scaron;i vien teiksiet, tas nav nekas īpa&amp;scaron;s un citas operētājsistēmas jau sen var palaist no zibatmiņas, taču ir kāds āķis. Mēs palaižam Windows 8 no zibatmiņas un pēc tam izraujam zibatmiņu ārā, ja mēs paspējam zibatmiņu 60 sekunžu laikā iespraust atpakaļ, tad viss strādā tā it kā zibatmiņa nebūtu izrauta ārā. For&amp;scaron;i :) Sesijā, kuru es apmeklēju vēlāk tika paskaidrots, ka 60 sekundes, ir izvēlētas dro&amp;scaron;ības iemeslu dēļ.&lt;/p&gt;
&lt;p&gt;&lt;img height="210" width="360" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd2/DSC_5F00_0068.JPG" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Izstrādātājus dro&amp;scaron;i vien iepriecinās ziņa, ka programmas, kas strādāja uz Windows 7 strādās arī uz Windows 8.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;img height="210" width="360" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd2/DSC_5F00_0082-_2D00_-Copy.JPG" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;Ievadsesiju ir iespējams noskatīties&amp;nbsp;&lt;a href="http://channel9.msdn.com/Events/TechEd/Europe/2012/KEY02"&gt;&amp;scaron;eit&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;2. dienas laikā es apmeklēju &amp;scaron;ādas sesijas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introducing the New Visual Studio 2012 Unit Testing Experience;&lt;/li&gt;
&lt;li&gt;Using Windows Runtime and SDK to build Metro style apps;&lt;/li&gt;
&lt;li&gt;Windows Phone: Security Deep Dive;&lt;/li&gt;
&lt;li&gt;Taking Control of Visual Studio through Extensions and Extensibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Varbūt sāk&amp;scaron;u ar to, kas man patika vislabāk un tā bija sesija -&amp;nbsp;Taking Control of Visual Studio through Extensions and Extensibility. Viena no lietām, ko Microsoft ir izdarījis ļoti labi ir uztaisījis jauno Visual Studio 2012 papla&amp;scaron;ināmu un līdz ar to salīdzinot ar iepriek&amp;scaron;ējām Visual Studio versijām, lai uzrakstītu savu papla&amp;scaron;inājumu Visual Studio nav nepiecie&amp;scaron;amas ļoti dziļas zinā&amp;scaron;anas par to, kā ir uzbūvēta Visual Studio, kā arī &amp;nbsp;to izdarīt ir kļuvis daudz vienkār&amp;scaron;āk. Tātad varbūt ķersimies vērsim pie ragiem un apskatīsimies uz trim lietām, kas ir nepiecie&amp;scaron;ams, lai rakstītu papla&amp;scaron;inājumus Visual Studio 2012:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vajag lejuplādēt Visual Studio SDK;&lt;/li&gt;
&lt;li&gt;Ir jāzina MEF (&lt;span&gt;Managed Extensibility Framework&lt;/span&gt;);&lt;/li&gt;
&lt;li&gt;VSIX ir arhīvs (VSIX ir faila papla&amp;scaron;inājums, kas ir specifisks Visual Studio papla&amp;scaron;inājumiem), un līdz ar to mēs varam lejuplādēt jau kādu eso&amp;scaron;u papla&amp;scaron;inājumu un paskatīties, kas tur ir iek&amp;scaron;ā un kā tas viss ir uzbūvēts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;Scaron;īs sesijas laikā tik uzrakstīts papla&amp;scaron;inājums Visual Studio 2012, kas meklē piemērus koda galerijā atkarībā no tā kādu vārdu mē esam iezīmēju&amp;scaron;i.&lt;/p&gt;
&lt;p&gt;Sesijas laikā arī tika parādīts &amp;scaron;āds interesants slaids - kādos veidos ir iespējams papla&amp;scaron;ināt Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;img height="210" width="360" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd2/DSC_5F00_0119.JPG" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;p&gt;Ja arī kādam citam tas arī liekas interesanti, ir iespējams noskatīties &amp;scaron;o sesiju &lt;a href="http://channel9.msdn.com/Events/TechEd/Europe/2012/DEV311"&gt;&amp;scaron;eit&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=500487" width="1" height="1"&gt;</description></item><item><title>TechEd konference Amsterdamā 1. diena</title><link>http://dotnet.lv/blogs/dz/archive/2012/06/26/teched-konference-amsterdama-1-diena.aspx</link><pubDate>Tue, 26 Jun 2012 18:29:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:495733</guid><dc:creator>dace.zarina</dc:creator><slash:comments>118</slash:comments><description>&lt;p&gt;&amp;Scaron;ogad TechEd konference svin savu divdesmito dzim&amp;scaron;anas dienu.&lt;/p&gt;
&lt;p&gt;&lt;img height="260" width="310" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd/WP_5F00_20120626-1.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;TechEd konference iesākās ar divu robotu dueli ringā. &amp;nbsp;Uzvar tas spēlētājs, kas trāpa pretinieka robotam trīs reizes pa krūtīm. Zilais robots pret sarkano robotu... Iespējams, ka kādam robotu duelis var nelikties nekas īpa&amp;scaron;s, taču roboti tiek vadīti Kinect palīdzību. Robotu vadī&amp;scaron;anai iepriek&amp;scaron; bija izvēlēti četri apmeklētāji no TechEd konferences - divi stiprā dzimuma pārstāvji un divi daiļā dzimuma pārstāvji, kas sacentās savā starpā.&lt;/p&gt;
&lt;p&gt;&lt;img height="260" width="310" src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd/WP_5F00_20120626-3.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.TechEd/WP_5F00_20120626-1-_2800_1_2900_.jpg" width="310" height="260" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Diezgan dīvaini atrasties tikai dažu metru attālumā no cilvēkiem, piem., Scott Guthrie, Brad Anderson, Jason Zander u.c., par kuriem ir tik daudz ir lasīts internetā un kuru emuāri ir &amp;scaron;ad tad apmeklēti, meklējot sev vajadzīgo informāciju.&lt;/p&gt;
&lt;p&gt;Ievadsesijas viena no galvenajām&amp;nbsp;domām bija kā tuvināt divas pasaules - izstrādātājus un administratorus. Tas nenozīmē, ka tagad visi izstrādātāji kļūs par administratoriem un otrādi. Ar tuvinā&amp;scaron;anos ir domāts, ka ir pieejami jauni rīki un iespējas, kas &amp;quot;satuvina&amp;quot; &amp;scaron;īs abas profesijas, piem., iespēja no administratoru vides palaist vienībtestus vai arī no izstrādātāju puses ar Visual Studio palīdzību savu programmu &amp;quot;ielikt mākonī&amp;quot;.&lt;/p&gt;
&lt;p&gt;Protams, ka ievadsesijā netika aizmirsts mākonis un Windows Azure. Jau ievadsesijas laikā tika parādīts piemērs, cik viegli un vienkār&amp;scaron;i ir ar to darboties. Ievadsesijas principā tika apskatīti visas lielās tēmas, ap kurām grozās visa konference - Windows 8, Windows Phone, Azure, Visual Studio 2012, kā arī daudzas citas lietas.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tas tā dažos vārdos par &amp;scaron;īs dienas ievadsesiju, taču tas ir tikai sākums.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs dienas laikā es apmeklēju &amp;scaron;ādas sesijas:&lt;/p&gt;
&lt;p&gt;Windows Azure Today &amp;amp; Tomorrow;&lt;/p&gt;
&lt;p&gt;Visual Studio Tips &amp;amp; Tricks;&lt;/p&gt;
&lt;p&gt;What&amp;#39;s New in Visual Studio 2012;&lt;/p&gt;
&lt;p&gt;LINQ, Take Two - Realizing the LINQ to Everything Dream.&lt;/p&gt;
&lt;p&gt;Visual Studio Tips &amp;amp; Tricks sesijas laikā prezentētāji rādīja daudzas taustiņu kombinācijas, ar kurām ātrāk var veikt dažādas lietas, piem., meklē&amp;scaron;anu. &amp;Scaron;īs sesijas laikā tika rādītas ne tikai Visual Studio 2012 jaunās iespējas un Visual Studio 2012 īsās komandas, bet arī lietas, ko var izmantot ar Visual Studio 2010, Visual Studio 2005. Dažas no lietām, kas ir pieejamas Visual Studio 2012, bet nav pieejamas Visual Studio 2010, ir iespējams iegūt uzinstalējot Power Tools prek&amp;scaron; Visual Studio 2010. Viena no lietām, ko viņi parādīja, ir kā tikt galā ar Intellisense, kad tā darbojas pret tevi. Tas noteikti iepriecinās uz TDD piekritējus :)&lt;/p&gt;
&lt;p&gt;What&amp;#39;s New in Visual Studio 2012 sesijas ietvaros tika parādīts lapas inspektos (&lt;i&gt;angļu val. page inspector&lt;/i&gt;), kas ievērojami var atvieglot iztrādātāja dzīvi. Tas kļūst aktuāli un noderīgi, kad mūsu tīmekļa lapa sastāv no daudziem maziem gabaliņiem vai sastāvdaļām, kas ģenerē HTML &amp;nbsp;mūsu lapai. Tad izmantojot lapas inspektoru ir iespējams izsekot, kuru daļu no lapas, ir ģenerējusi, kura &amp;quot;kontrole&amp;quot;. Sesijas laikā tika parādīta arī Task Parallel bibliotēka un await un async atslēgas vārdi. Sesijas laikā ir tika parādīti arī jaunie logi, kas ir pieejami Visual Studio 2012.&lt;/p&gt;
&lt;p&gt;Viena no sesijām, kas man patika vislabāk bija par LINQ, kuru prezentēja Bart de Smet. Sesijas tika iesākta ar Monad struktūras apskatī&amp;scaron;anu (Apraksts, kas ir Monad &amp;scaron;eit:&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)"&gt;http://en.wikipedia.org/wiki/Monad_(functional_programming)&lt;/a&gt;) un, cik LINQ ir līdzīgs Monad un otrādi. Jāatzīstas godīgi par Monad dzirdēju pirmo reizi. Sesija bija interesanta ar to, ka tika parādīts, kā realizēt IQueryable interfeisu, un kāda tad īsti ir at&amp;scaron;ķirība, kad izmanto IEnumerable vai IQueryable, kā ari kuros gadījumos, kur&amp;scaron; jāizmanto. Sesijas laikā tika demostrēti dažādi neparasti demo... Diezgan sarežģītas lietas notika galvu reibino&amp;scaron;ā ātrumā, ka dažu brīdi bija grūti sekot līdzi. Man ļoti patika prezentētāja atraktīvais informācijas pasnieg&amp;scaron;anas veids.&amp;nbsp;&amp;Scaron;īs sesijas video es dro&amp;scaron;i vien noskatī&amp;scaron;os vēlreiz.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;P.S. Ievadsesijas, kā ari citas &amp;scaron;is dienas sesijas ir pieejamas globālajā tīmeklī &amp;scaron;eit:&amp;nbsp;&lt;a href="http://channel9.msdn.com/Events/TechEd/Europe/2012"&gt;http://channel9.msdn.com/Events/TechEd/Europe/2012&lt;/a&gt;.&amp;nbsp; Tik daudz izstrādātāju un administratoru, kam nav sve&amp;scaron;i Microsoft rīki un tehnoloģijas nebiju redzējusi&amp;nbsp;vienā telpā.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=495733" width="1" height="1"&gt;</description></item><item><title>Calling a service from Windows Phone application reactively</title><link>http://dotnet.lv/blogs/vi/archive/2012/06/20/calling-a-service-from-windows-phone-application-reactively.aspx</link><pubDate>Wed, 20 Jun 2012 06:36:59 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:483446</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;&lt;p&gt;If you are creating connected Windows Phone application then most probably have noticed that mostly interface what Visual Studio (VS) generates for you in client proxy class is event-based async pattern.&lt;/p&gt;  &lt;p&gt;For instance we have defined service (usually this is WCF implementation) method:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AtmFinderService&lt;/span&gt; : IAtmFinderService       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ServiceResponse FindNearby(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; latitude, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; longitude)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#000000"&gt;...&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Generating the client proxy class we can see that VS generated event based approach, when we do have an incredible opportunity to use &lt;font face="Courier New"&gt;DoSomethingAsync()&lt;/font&gt; method in our favor and then try to catch event which is raised immediately after operation has been completed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_25D4B9EA.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_054D7A38.png" width="221" height="194" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Using this method and event code does look pretty much readable (we will touch body of the event handler later on as well).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted += (sender, args) =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Suppose if you are sharing the proxy class (for instance, as &lt;font face="Courier New"&gt;static &lt;/font&gt;member of your service façade). Then for sure you will need a mechanism how you can unsubscribe from the event after method has been executed successfully. More info on subscribing and unsubscribing to the events here - &lt;a title="http://msdn.microsoft.com/en-us/library/ms366768.aspx" href="http://msdn.microsoft.com/en-us/library/ms366768.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms366768.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So, what we can do is to define event handler and store the reference to the body in class field or member. We can define variable as delegate:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt; delg = &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt; args)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;or we can define to store as &lt;font face="Courier New"&gt;EventHandler&lt;/font&gt;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then I figured out that the most easiest way to subscribe only once per call is to unsubscribe first and then subscribe:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted -= delg;      &lt;br /&gt;proxy.FindNearbyCompleted += delg;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;When next time method will be executed event handler added from previous call will be removed first, and then added new one.&lt;/p&gt;  &lt;p&gt;Then we can proceed with the actual service method call. So the complete code is:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyCompleted -= delg;       &lt;br /&gt;proxy.FindNearbyCompleted += delg;       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This is more or less everything you need to call service method from Windows Phone in async event-based pattern.&lt;/p&gt;  &lt;p&gt;One more note about event handler body. Usually there is requirement to execute event handler on the &lt;font face="Courier New"&gt;Dispatcher &lt;/font&gt;if that updates something in user interface from another thread (that may happen if event handler is called later on).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.CheckAccess())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.BeginInvoke(&lt;span style="color:#808080;"&gt;/* method */&lt;/span&gt;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here comes another problem that we need to call the same event handler body only within the &lt;font face="Courier New"&gt;Dispatcher &lt;/font&gt;context.&lt;/p&gt;  &lt;p&gt;Easiest way to implement this requirement would be to implement additional method as event handler and then perform dispatcher check there and if call requires dispatcher context, invoke the same method once more within dispatcher context.&lt;/p&gt;  &lt;p&gt;So we are implementing the event handler method first.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ProxyOnFindNearbyCompleted(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt; args)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.CheckAccess())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.BeginInvoke(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(ProxyOnFindNearbyCompleted),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sender,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; args);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And then the original code that attaches the event handler and calls the method remains almost the same:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted -= ProxyOnFindNearbyCompleted;      &lt;br /&gt;proxy.FindNearbyCompleted += ProxyOnFindNearbyCompleted;       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;However for me this all seems already converting into unreadable spagetti-like code set.&lt;/p&gt;  &lt;p&gt;There is a more elegant way to accomplish this. I’m going to use Reactive Extensions for Windows Phone – &lt;font face="Courier New"&gt;Microsoft.Phone.Reactive&lt;/font&gt;. Library is coming with Windows Phone SDK.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_0475144E.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_08132F2B.png" width="800" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;At first we are defining observable from the event-based async pattern.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; completedObservable = Microsoft.Phone.Reactive.&lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted += ev,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted -= ev);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Those two arguments for &lt;font face="Courier New"&gt;FromEvent()&lt;/font&gt; method is used to add event handler and to remove event handler for &lt;font face="Courier New"&gt;FindNearbyCompleted&lt;/font&gt; event. This is also an elegant way how to write code that subscribes to the event only once.&lt;/p&gt;  &lt;p&gt;When observable has been created we are able to subscribe to to the event and provide handler to execute when event is raised.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;completedObservable.Subscribe(result =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The complete code looks like following:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; completedObservable = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted += ev,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted -= ev);      &lt;br /&gt;      &lt;br /&gt;completedObservable.Subscribe(result =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });      &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pretty straight forward and what’s important – code is readable and understandable.&lt;/p&gt;  &lt;p&gt;One more thing, if you require to run event handler on &lt;font face="Courier New"&gt;Dispatcher&lt;/font&gt; thread, than that’s far more easier than previous implementation with direct checking dispatcher access. You just have to tell reactive extensions that you need to observe events on dispatcher thread rather than on current context.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;completedObservable.ObserveOnDispatcher().Subscribe(result =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In summary, code gets reduced, more readable and understandable.&lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=483446" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Atsauksmes par grāmatu Mark Pilgrim "HTML5: Up and running"</title><link>http://dotnet.lv/blogs/dz/archive/2012/06/10/atsauksmes-par-gr-matu-quot-quot.aspx</link><pubDate>Sun, 10 Jun 2012 16:29:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:466114</guid><dc:creator>dace.zarina</dc:creator><slash:comments>109</slash:comments><description>&lt;p&gt;Nesen pabeidzu lasīt grāmatu par &amp;quot;HTML 5: Up and Running&amp;quot;. Var teikt, ka grāmatu bija vērts lasīt, jo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apskatīja jaunos HTML 5 elementus, piem., canvas, video, audio, u.c elementus, kā arī jaunos ievades elementus fomām - date, color, email, search, u.c.;&lt;/li&gt;
&lt;li&gt;apskatīja tādas lietas kā vietējo glabātuvi (angļu val. local storage), offline web applications (nezinu, kā to pareizi latviski pārtulkot), ģeolokāciju (angļu val. geolocation);&lt;/li&gt;
&lt;li&gt;parādīja vienu no HTML 5 problēmām, ka ir audio un video elementi, taču &amp;quot;kompānijas&amp;quot; nespēj vienoties par vienu kodeku, kur&amp;scaron; tiks izmantots, kas rada problēmas, ja mājas lapai ar video un audio elementiem ir jāatbalsta visus pārlūkus. &amp;Scaron;ajā sakarā arī tika apskatīts arī citas problēmas ar kodekiem - autortiesības un maksa par to lieto&amp;scaron;anu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kopumā man patika, kā gramata bija uzrakstīta, īpa&amp;scaron;i man patika autora rakstī&amp;scaron;anas stils, kad grāmata tika veidota, kā dialogs ar lasītāju, un bija sajūta, ka autors ir tepat kaut kur blakus. Piem., aptuvens tulkojums no grāmatas - &amp;quot;Jūs nezināt, kas ir X un Y? Man prieks, ka Jūs pajautājāt. Tas ir...&amp;quot;. Varēja just, ka HTML 5 ir tuvs grāmatas autoram.&lt;/p&gt;
&lt;p&gt;Viena no labām lietām ir katras nodaļas beigās saraksts ar literatūras avotiem (pārsvarā mājas lapu adreses), kas satur vairāk informāciju par konkrēto tēmu, nekā tika pastāstīts kādā grāmatas nodaļā.&lt;/p&gt;
&lt;p&gt;Viena no lietām, kas man bija pilnīgi jauna bija mikro dati (angļu val. microdata). Pirms grāmatas lasī&amp;scaron;anas nebiju vispār neko dzirdējusi par tiem. Mikro dati piedāvā iespēju HTML mājas lapā &amp;quot;paslēpt&amp;quot; informāciju, ko var izmantot meklē&amp;scaron;anas dziņi, piem., Google (pa&amp;scaron;laik laikam Google ir vienīgais meklē&amp;scaron;anas dzinis, kas to atbalsta), kas apraksta, HTML mājas lapā atpsoguļoto informāciju. Mikro dati ir vārdnīcas &amp;quot;struktūra&amp;quot;, kas satur ierakstus, kam atslēga un vērtība. &amp;Scaron;ajā gadījumā atslēga ir atribūts, ko mēs piekabinam HTML elementam, piem., span, p vai jebkuram citam HTML elementam, bet vērtība ir var būt teksts, kas atrodas iek&amp;scaron;ā &amp;scaron;aja elementā, piem., ir elements &amp;lt;span&amp;nbsp;&lt;code class="plain"&gt;itemprop=&lt;/code&gt;&lt;code class="string"&gt;&amp;quot;name&amp;quot;&lt;/code&gt;&amp;gt;Dace&amp;lt;/span&amp;gt;, &amp;scaron;ajā gadījumā atslēga ir name un vērtība ir Dace. Tipiskākais gadījums Micro datu lieto&amp;scaron;anai būtu - mums ir vienkār&amp;scaron;a mājas lapa, kas satur kontaktinformāciju par mani vai manu kompāniju, tad izmantojot mikro datus, es meklē&amp;scaron;anas dzinim pasaku, ka informācija, kas ir HTML elementos ir mana kontaktinformācija. Protams, ka nekur nav garantijas, ka meklē&amp;scaron;anas dzininis to izmantos, taču ir iespējamība, ka meklē&amp;scaron;anas dzinim parādot meklē&amp;scaron;anas rezultātus &amp;scaron;ī informācija tiks izmantota (protams, ja meklē&amp;scaron;anas rezultāti atradīs manu mājas lapu) . Vismaz kaut kā tā es to visu sapratu, kas tas ir :)&lt;/p&gt;
&lt;p&gt;Autors varbūt varēja pievērst mazliet vairāk uzmanības HTML 5 jaunajiem elementiem, piem., article, footer, u.c. Lai gan grāmatā tie tika minēti un bija informācija, man tomēr gribējas vēl mazliet vairāk informācijas par &amp;scaron;iem elementiem.&lt;/p&gt;
&lt;p&gt;Tāpat man patika ievads par HTML vēsturi, kad tika atspoguļota laikam img elementa izveido&amp;scaron;anās. Kopumā interesanti ielūkoties HTML &amp;quot;tap&amp;scaron;anas virtuvē&amp;quot;. :)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kopumā ir vēl viena laba lieta - &amp;scaron;ī grāmata ir pieejama tīmeklī bez maksas &amp;scaron;ajā mājas lapas adresē:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://diveintohtml5.info/"&gt;http://diveintohtml5.info/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=466114" width="1" height="1"&gt;</description></item><item><title>When you need something stronger..</title><link>http://dotnet.lv/blogs/vi/archive/2012/06/05/when-you-need-something-stronger.aspx</link><pubDate>Mon, 04 Jun 2012 22:22:51 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:457871</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Have you seen code fragment like this? I mean there are lot of interfaces that provide &lt;a href="http://www.globalnerdy.com/2010/05/09/new-programming-jargon/"&gt;&lt;strong&gt;stringly-typed&lt;/strong&gt;&lt;/a&gt; access to some of the internals of the entity. This particular code fragment could be seen a lot in EPiServer Relate+ product code samples.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; instance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleType&lt;/span&gt;();         &lt;br /&gt;instance.SetAttributeValue(&lt;span style="color:#a31515;"&gt;&amp;quot;ThisIsTheAttribute&amp;quot;&lt;/span&gt;, value);&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Accessing something that’s not pretty strong enough could be very easy and fast. Not a big deal – just type in attribute name and value.&lt;/p&gt;    &lt;p&gt;Here goes why I don’t like interfaces like these:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;When you will margin for a grammar error when typing attribute name – that could be discovered only during runtime. &lt;/li&gt;      &lt;li&gt;You cannot use static code analysis tools. Like to search for all attribute usages. &lt;/li&gt;      &lt;li&gt;You cannot use some of the refactoring tools –&amp;gt; like rename attribute name. &lt;/li&gt;      &lt;li&gt;You can easily change type of the attribute and forget about code that uses that, effect –&amp;gt; runtime error. &lt;/li&gt;      &lt;li&gt;Use cannot leverage all the power of Visual Studio (for instance to provide Intellisense over available attributes) &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;So as we see – there a lot more troubles around stringly-typed interfaces than benefit you gain.&lt;/p&gt;    &lt;p&gt;We are going to change this in this blog post.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;First of all we would need to define client API – that’s how we are going to use our strongly-typed interface to talk to your stringly friend.&lt;/p&gt;    &lt;p&gt;I would like to see following things in client API:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;There should be an object that would describe structure of the stringly-typed object. Like enumerating all the properties that we would like to have access to. I would call it – a metadata object. &lt;/li&gt;      &lt;li&gt;There should be an easy way to convert stringly-typed object into this metadata object. &lt;/li&gt;      &lt;li&gt;Metadata object will be used to talk to stringly-typed object via strongly-typed metadata object. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;I would see client API and some code snippets as following:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; instance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleType&lt;/span&gt;();         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; metadata = instance.AsAttributeExtendable&amp;lt;&lt;span style="color:#2b91af;"&gt;SampleAttributeMetadata&lt;/span&gt;&amp;gt;();         &lt;br /&gt;metadata.SampleAttribute = value;&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Metadata class could be described like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleAttributeMetadata&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; SampleAttribute { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This metadata object is just an object that will provide us strongly-typed access later on.&lt;/p&gt;    &lt;p&gt;First things first.&lt;/p&gt;    &lt;p&gt;To convert stringly-typed object into some more meaningful instance we would need something “attachable” to original object. Extension methods will come to rescue today.&lt;/p&gt;    &lt;p&gt;So we are able to write static method that will attach to original object and behave as instance method for that object. No matter which is your original object (for sake of integrity I’ll use EPiServer Relate+ ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface).&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This means that we are defining extension method for objects that implement ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface (those are almost all entities in EPiServer Relate+). This ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface provides stringly-typed access to attributes that you can set or get.&lt;/p&gt;    &lt;p&gt;Generic type parameter &lt;font face="Courier New"&gt;T&lt;/font&gt; – that will be our metadata object class.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Next –&amp;gt; we need to somehow take a control over the metadata object that as given away to the caller of the extension method defined earlier.&lt;/p&gt;    &lt;p&gt;For this reason one of the most easiest way to accomplish this is to use some sort of interceptor infrastructure. What interceptor does? Idea behind the interceptor is that client who got back the metadata object thinks (an result object really looks alike) that object that was given back is of defined metadata object type. And so do all code analysis tools (therefore Intellisense is available) and compiler as well.&lt;/p&gt;    &lt;p&gt;Actually using interceptors we are giving back fake metadata object that has lot of injections in it in order to for us to gain control over the further client’s interaction with the object.&lt;/p&gt;    &lt;p&gt;One of my favorite library to accomplish this is &lt;a href="http://nuget.org/packages/Castle.Core"&gt;&lt;strong&gt;‘Castle project’&lt;/strong&gt;&lt;/a&gt;. Pretty easy to use and straightforward.&lt;/p&gt;    &lt;p&gt;So what we need is to create a fake metadata object with our injections to control what’s going after we return the object. In order to get this done we need to define our interceptor and return a class proxy created using this interceptor.&lt;/p&gt;    &lt;p&gt;So the code for &lt;font face="Courier New"&gt;AsAttributeExtendable() &lt;/font&gt;method is like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;strike&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()           &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entity == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; interceptor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt;(entity);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; gen = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt;();           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; proxy = gen.CreateClassProxy&amp;lt;T&amp;gt;(options, interceptor);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; proxy;           &lt;br /&gt;}&lt;/strike&gt;&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;UPDATE:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;NB! &lt;/strong&gt;Lessons learned! Actually it’s not quite a good idea to create proxy generator, generation hook and class proxy on each request. Just got through support ticket on memory leak and huge memory consumption. Which ended-up with lot of dynamically generated assemblies loaded into application domain and lot other stuff.&lt;/p&gt;    &lt;p&gt;A better solution is reuse &lt;font face="Courier New"&gt;‘ProxyGenerator’&lt;/font&gt; class instance and cache generated class proxies for particular types.&lt;/p&gt;    &lt;p&gt;First of all need to define static instance of the proxy generator class and store where cached class proxy instances will be stored.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt; gen = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt;();         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConditionalWeakTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt; table =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConditionalWeakTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;();&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Then we can implement updated method to generate class proxy for particular class of particular type:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entity == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; classProxyCached;        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// try to find already created class proxy from the cache&lt;/span&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// this is required to increase speed a bit and not to create new class proxy for the same class more than once&lt;/span&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; table.TryGetValue(entity, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; classProxyCached);        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (classProxyCached == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; classProxyCached = GenerateClassProxy&amp;lt;T&amp;gt;(entity);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; table.Add(entity, classProxyCached);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; classProxyCached &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; T;        &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;And proxy generation method remains almost unchanged:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T GenerateClassProxy&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; interceptor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt;(entity);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; proxy = gen.CreateClassProxy&amp;lt;T&amp;gt;(options, interceptor);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; proxy;         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s spilt them up into smaller pieces:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;DefaultInterceptor&lt;/strong&gt; – this is the class that will contain the logic that will be called if client code will try to access something that we marked as interceptable in class &lt;strong&gt;ProxyGenerationHook&lt;/strong&gt; class. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;ProxyGenerationHook&lt;/strong&gt; – class that describes what is going to be intercepted and what should be passed to the underlying intercepted object. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s look at hook class (it should implement &lt;font face="Courier New"&gt;‘IProxyGenerationHook’&lt;/font&gt; interface):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IProxyGenerationHook&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MethodsInspected()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; NonProxyableMemberNotification(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type, &lt;span style="color:#2b91af;"&gt;MemberInfo&lt;/span&gt; memberInfo)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;Property named &amp;#39;{&lt;/span&gt;&lt;span style="color:#3cb371;"&gt;0}&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;#39; for type &amp;#39;{&lt;/span&gt;&lt;span style="color:#3cb371;"&gt;1}&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;#39; is not marked as virtual.&amp;quot;&lt;/span&gt;,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memberInfo.GetProperty().Name,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ShouldInterceptMethod(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type, &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; methodInfo)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008000;"&gt;// we are interested only in properties for now&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; methodInfo.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;get_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.Ordinal)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; || methodInfo.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.Ordinal);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This hook is instructing Castle dynamic proxy generation engine that interceptor will intercept &lt;strong&gt;*only*&lt;/strong&gt; properties (setters and getters). Btw, properties are compiled into methods anyway. This particular hook logic of course can be modified and adjusted to meet precise requirements.&lt;/p&gt;    &lt;p&gt;Otherwise (method &lt;font face="Courier New"&gt;NonProxyableMemberNotification()&lt;/font&gt;) will be called if some of the metadata object members could not be intercepted. This is particular useful for error checking. &lt;strong&gt;NB! &lt;/strong&gt;What Castle actually does is that behind the scene another object is created that &lt;strong&gt;*inherits*&lt;/strong&gt; from our defined metadata object. Therefore members (in this case only properties) must be marked as virtual – because Castle tries to override those with its own logic. If that fails - &lt;font face="Courier New"&gt;NonProxyableMemberNotification()&lt;/font&gt; method is called.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s look into &lt;font face="Courier New"&gt;DefaultInterceptor&lt;/font&gt; code (it must implement ‘&lt;font face="Courier New"&gt;IInterceptor&lt;/font&gt;’ interface):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IInterceptor&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Intercept(&lt;span style="color:#2b91af;"&gt;IInvocation&lt;/span&gt; invocation)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;It only has single method – &lt;font face="Courier New"&gt;Intercept()&lt;/font&gt;. The most interesting part of interception is parameter – &lt;font face="Courier New"&gt;invocation&lt;/font&gt;, that gives us lot of info about method client code is calling.&lt;/p&gt;    &lt;p&gt;Usually code within Intercept method starts with checking what kind of method client is calling, like:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (invocation.Method.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;get_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.InvariantCultureIgnoreCase))         &lt;br /&gt;{&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;or&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (invocation.Method.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.InvariantCultureIgnoreCase))         &lt;br /&gt;{&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Just to check either user is getting value from the property or setting value for the property.&lt;/p&gt;    &lt;p&gt;Actual interception code really depends on situation and requirements but usually some of the properties of &lt;font face="Courier New"&gt;IInvocation&lt;/font&gt; class are used:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;font face="Courier New"&gt;invocation.Method&lt;/font&gt; – is the method that is going to be called. &lt;/li&gt;      &lt;li&gt;&lt;font face="Courier New"&gt;invocation.Arguments&lt;/font&gt; – is list of arguments passed the call of the method. &lt;/li&gt;      &lt;li&gt;&lt;font face="Courier New"&gt;invocation.ReturnValue &lt;/font&gt;– set the result of the interception. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Trick for interceptors – if you want to interrupt interception and return immediately to the caller – just return from the method. Otherwise you’ll need to call &lt;font face="Courier New"&gt;invocation.Proceed()&lt;/font&gt; method that will call next interception or ultimately will call target object’s method.&lt;/p&gt;    &lt;p&gt;And within the interception code you can convert called method (getter or setter for properties) into call to stringly-typed object (&lt;font face="Courier New"&gt;Substring(4)&lt;/font&gt; will remove ‘get_’ or ‘set_’ from the name of the called method):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;Entity.SetAttributeValue(invocation.Method.Name.Substring(4), invocation.Arguments[0]);&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;or for retrieving something and return that value to the caller’s code:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; methodInfo = Entity.GetType().GetMethod(&lt;span style="color:#a31515;"&gt;&amp;quot;GetAttributeValue&amp;quot;&lt;/span&gt;);         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; genericMethod = methodInfo.MakeGenericMethod(invocation.Method.ReturnType);         &lt;br /&gt;invocation.ReturnValue = genericMethod.Invoke(Entity, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { invocation.Method.Name.Substring(4) });&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Sequence diagram of final call stack could look something like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_5D58DBB0.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_1D22C236.png" width="827" height="752" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Sample project where Castle interceptors are used to provide strongly-typed access over EPiServer Relate+ entities can be found &lt;a href="https://github.com/Geta/opensource/tree/master/Geta.Community.EntityAttributeBuilder"&gt;&lt;strong&gt;there&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Hope this helps!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=457871" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Languages/default.aspx">Languages</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Idioms/default.aspx">Idioms</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Kad darbs mijas ar hobiju..</title><link>http://dotnet.lv/blogs/vi/archive/2012/06/02/kad-darbs-mijas-ar-hobiju.aspx</link><pubDate>Fri, 01 Jun 2012 22:47:20 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:454215</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_54873D38.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:20px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="" border="0" alt="" align="right" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_7F5FA14A.png" width="480" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Ikdienas gaitas šobrīd aizņem vairāk vai mazāk ļoti interesanta platforma ar nosaukumu EPiServer, kas ir balstīta pārsvarā uz Microsoft produktiem. Par cik rakstus publicēju &lt;strong&gt;dotnet.lv &lt;/strong&gt;mājas lapā un negribas uzturēt vairākus emuāru kontus, tad iespējams, ka ir pa laikam varētu parādīties, kāds ziņojums ar tagu ‘EPiServer’.&lt;/p&gt;    &lt;p&gt;Mēģināšu šīs sērijas rakstos likt informāciju, kas varētu būt ari saistoša cilvēkiem, kas tieši vai netieši nav saistīti ar šo sistēmu. Rakstus plānots veidot, atklājot kādas interesantas nianses sistēmā, daloties ar personisko pieredzi un filozofiju.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Sistēma ir pietiekami liela un sarežģīta, lai tajā nebūtu interesanti atklājumi gan no iedoloģiskā viedokļa, gan no praktiskā. Daudz laika sanāk pārlūkojot dekompilētu kodu un ir pērles, ko var atrast arī nopietnā produktā.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka netraucēs nevienam! :)&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=454215" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category></item><item><title>HTML5 iespēju noteikšana, izmantojot Modernizr bibliotēku </title><link>http://dotnet.lv/blogs/dz/archive/2012/05/28/html5-iesp-ju-noteik-ana-izmantojot-modernizr-bibliot-ku.aspx</link><pubDate>Mon, 28 May 2012 10:43:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:446744</guid><dc:creator>dace.zarina</dc:creator><slash:comments>163</slash:comments><description>Dro&amp;scaron;i vien visi jau &amp;scaron;o iespēju aktīvi izmanto, bet tomēr gribēju dalīties savā pieredzē. Runa ir par Modernizr JavaScript bibliotēku, kas ir pieejama Visual Studio 2010 kop&amp;scaron; MVC 3 atjauninājuma pagāju&amp;scaron;o gad. Modernizr ir JavaScript bibliotēka, ar kuras palīdzibu var noteikt, vai konkrētais pārlūks atbalsta kādu HTML 5 iespēju, kura, piem., tiek izmantota mūsu izstrādājamā lietojumā. Modernizr mājas lapā tiek raksturots &amp;scaron;ādi: &amp;quot;Modernizr ir maza JavaScript bibliotēka...(&lt;a href="http://dotnet.lv/blogs/dz/archive/2012/05/28/html5-iesp-ju-noteik-ana-izmantojot-modernizr-bibliot-ku.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=446744" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/dz/archive/tags/Modernizr/default.aspx">Modernizr</category><category domain="http://dotnet.lv/blogs/dz/archive/tags/HTML+5/default.aspx">HTML 5</category></item><item><title>Team build un Windows SDK kļūda</title><link>http://dotnet.lv/blogs/vi/archive/2012/05/23/team-build-un-windows-sdk-k-da.aspx</link><pubDate>Wed, 23 May 2012 12:54:39 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:436813</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Ja kādreiz sanāk ieraudzīt šādu kļūdu savā build log failā (parasti tas mēdz gadīties, kad notiek build serveru migrācijas), tad ir zināmas zāles pret šo.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2249, 9): error MSB3086: Task could not find &amp;quot;sgen.exe&amp;quot; using the SdkToolsPath &amp;quot;&amp;quot; or the registry key &amp;quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A&amp;quot;. Make sure the SdkToolsPath is set and the tool exists in the correct processor specific location under the SdkToolsPath and that the Microsoft Windows SDK is installed&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Tas ko izdarīju es, lai atbrīvotos no šīs kļūdas (kaut gan Windows SDK bija instalēts jaunajā build serverī), bija:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Eksportēt ‘&lt;font face="Courier New"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A&lt;/font&gt;’ reģistru uzstādījumus. &lt;/li&gt;      &lt;li&gt;Importēt tos jaunajā build serverī. Drošības pēc es importēju arī visu to pašu zem ‘&lt;font face="Courier New"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node&lt;/font&gt;’ atslēgas. Lai to izdarītu nākas nodublēt visus uzstādījumus un samainīt reģistra atslēgas ceļus .reg failā. It kā ir izdarāmas arī ar ‘regedit32.exe’, bet risinājums nebija pa rokai.&lt;/li&gt;      &lt;li&gt;Pārkopēt ‘&lt;font face="Courier New"&gt;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A&lt;/font&gt;’ (parasti ceļš ir šāds, ja build serveris ir x64) direktoriju no vecā build servera uz jauno. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Augstāk minētā kļūda pazuda pēc šīm darbībām.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=436813" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>Debugging locally, testing in the cloud..</title><link>http://dotnet.lv/blogs/vi/archive/2012/05/16/debugging-locally-testing-in-the-cloud.aspx</link><pubDate>Tue, 15 May 2012 21:01:12 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:423864</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;&lt;p&gt;Dažreiz sanāk kaut ko pameistarot Windows Phone 7 platformai (piemēram, &lt;a href="http://bit.ly/atmfinder"&gt;http://bit.ly/atmfinder&lt;/a&gt;) un nesen saskāros ar interesantu problēmu. Izmantot spraudni SlowCheetah (lejupielādēt var &lt;a href="http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5"&gt;&lt;strong&gt;šeit&lt;/strong&gt;&lt;/a&gt;), tīmekļa projektos var ērti veikt Xml failu transformācijas, ja tādas ir nepieciešamas. Transformācija var būt katrai projekta konfigurācijai sava – piemēram, lokālā izstrādes vide izmanto vienus uzstādījumus, bet savukārt kopējā testēšanas un skaņošanas instalācijai nepieciešami pavisam citi uzstādījumu. Šo uzstādījumu regulācija un kontrole notiek izmantojot risinājuma uzstādījumus (&lt;em&gt;Configuration Settings&lt;/em&gt;).&lt;/p&gt;  &lt;p&gt;Izmantojot šo lielisko iespēja, nodomāju, ka varētu ieviest vairākas konfigurācijas arī manai aplikācijai: piemēram, ar vienas konfigurācijas palīdzību (pārsvarā tiek izmantots emulatorā) es varētu testēt un skaņot sistēmu, izmantojot lokālos tīmekļa pakalpojumus (WCF servisa adrese būtu &lt;strong&gt;&lt;u&gt;http://localhost/..&lt;/u&gt;&lt;/strong&gt;), savukārt ar citu uzstādījumu palīdzību, varētu regulēt konfigurāciju, ka tīmekļa pakalpojumu atrodas kaut kur – ārā (WCF servisa adrese sāktos ar &lt;strong&gt;&lt;u&gt;http://&amp;lt;kaut kāds mistisks id, kas laikam domāts Azure instances identificēšanai&amp;gt;/..&lt;/u&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;Šim nolūkam WCF klienta bibliotēka jau savu konfigurācijas fragmentus saglabā &lt;strong&gt;ServiceReferences.ClientConfig&lt;/strong&gt; failā, kas ir parasts Xml fails. Šāda veida Xml faili ir ļoti labs kandidāts Xml transformācijai dažādās konfigurācijās dažādām vajadzībām.&lt;/p&gt;  &lt;p&gt;Konfigurācijas faili izskatās šādi:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Oriģinālais fails:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt;     &lt;ol style="padding-bottom:0px;margin:0px 0px 0px 2.5em;padding-left:5px;padding-right:0px;background:#ffffff;padding-top:0px;"&gt;       &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;CustomBinding_IAtmFinderService&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;httpTransport&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;maxBufferSize&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://localhost:81/AtmFinderService.svc&lt;/span&gt;&amp;quot; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;customBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;CustomBinding_IAtmFinderService&lt;/span&gt;&amp;quot; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;CloudServiceReference.IAtmFinderService&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;CustomBinding_IAtmFinderService&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Viens no transformācijas failiem, kas uzstāda servisa adresi uz to mākoņa pakalpojumu:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt;     &lt;ol style="padding-bottom:0px;margin:0px 0px 0px 2.5em;padding-left:5px;padding-right:0px;background:#ffffff;padding-top:0px;"&gt;       &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns:xdt&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://schemas.microsoft.com/XML-Document-Transform&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;http://azure-instances-id.cloudapp.net/AtmFinderService.svc&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;CustomBinding_IAtmFinderService&lt;/span&gt;&amp;quot; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xdt:Transform&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;SetAttributes(address)&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xdt:Locator&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Match(name)&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Sākotnēji likās iespēja tiešām lieliska un eleganta, bet pēc neilgiem eksperimentiem atklājās, ka SlowCheetah tiek izpildīts sekmīgi, bet XAP failā aiziet oriģinālais Xml / .config fails no source direktorijas (direktorijas, kurā atrodas projekta sakne), savukārt spraudnis transformē oriģinālo failu no source direktorijas pārveidojot to kopē vietā, kur tiek novietoti arī pārējie projekta izejas artefakti.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Šis fakts traucē Xap failā iekļauj pareizo jau &lt;strong&gt;*transformēto*&lt;/strong&gt; failu.&lt;/p&gt;  &lt;p&gt;Izstaigājot Silverlight MSBuild konfigurācijas definīcijas failus, sapratu, ka labāk nemēģināt pārtaisīt, bet gan pielāgoties Xap faila pakošanas procesam.&lt;/p&gt;  &lt;p&gt;Beigu beigās sanāca .targets fails, kas domāts tieši priekš šādam situācijām, kad nepieciešams WCF klienta konfigurācijas failus transformēt un rezultātu iekļaut Xap failā.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="background:#ddd;overflow:auto;"&gt;     &lt;ol style="padding-bottom:0px;margin:0px 0px 0px 2em;padding-left:5px;padding-right:0px;background:#ffffff;padding-top:0px;"&gt;       &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;4.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;BeforeBuild&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CallTarget&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;TransformAllFiles&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;attrib -r ServiceReferences.ClientConfig&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;$(MSBuildProjectDirectory)&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;xcopy &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$(OutDir)ServiceReferences.ClientConfig&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; ServiceReferences.ClientConfig /y&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;$(MSBuildProjectDirectory)&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li style="background:#f3f3f3;"&gt;&amp;#160; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Šo .targets failu var iekļaut savā projektā:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt;     &lt;ol style="padding-bottom:0px;margin:0px 0px 0px 2em;padding-left:5px;padding-right:0px;background:#ffffff;padding-top:0px;"&gt;       &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Import&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;ServiceReferences.Transform.targets&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ja slinkums pārrakstīt faila saturu, tad fails pilnā saturā pieejams &lt;a href="https://skydrive.live.com/redir.aspx?cid=38746a08ebe72be7&amp;amp;resid=38746A08EBE72BE7!810&amp;amp;parid=38746A08EBE72BE7!521"&gt;&lt;strong&gt;šeit&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Šim paņēmienam ir gan viena neliela problēmiņa, kuru man nav izdevies vēl atrisināt –&amp;gt; pēc sekmīga būvējuma, oriģinālais fails satur transformētā faila saturu. Jāatdzīst, ka man neizdevās sameklēt notikumu, kas tiktu izsaukts pašās build procesa beigās (&lt;strong&gt;AfterEndToEndIteration&lt;/strong&gt; notikums nestrādā). Savukārt, ja transformācijas ir rakstītas pareizi, tad šai niansei nevajadzētu sagādāt nekādas problēmas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=423864" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Xml/default.aspx">Xml</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Phone/default.aspx">Windows Phone</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Xap/default.aspx">Xap</category></item><item><title>TPL (Task Parallel Library) prezentācijas source code.</title><link>http://dotnet.lv/blogs/vi/archive/2012/05/07/tpl-task-parallel-library-prezent-cijas-source-code.aspx</link><pubDate>Mon, 07 May 2012 19:54:36 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:399523</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Pēc Latvijas Universitātes auditorijas lūgumu izvietoju prezentācijas demo source code. Pieejams &lt;a href="https://skydrive.live.com/redir.aspx?cid=38746a08ebe72be7&amp;amp;resid=38746A08EBE72BE7!785&amp;amp;parid=38746A08EBE72BE7!521"&gt;&lt;strong&gt;šeit&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Ja rodas kādi jautājumi, iebildumi vai filozofiskas pārdomas – noteikti gaidu jūsu feedback: valdis punkts iljuconoks at dotnet punkts lv.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_33C280F8.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:20px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="" border="0" alt="" align="right" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_738C677D.png" width="573" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Happy parallelisming!&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=399523" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Parallel+FX/default.aspx">Parallel FX</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/TPL/default.aspx">TPL</category></item><item><title>Schedule</title><link>http://dotnet.lv/blogs/vi/archive/2012/04/19/schedule.aspx</link><pubDate>Wed, 18 Apr 2012 21:09:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:355406</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Kā izrādās, tad aprīļa pa&amp;scaron;as beigas un maija mēnesis izvērties par diezgan aizņemtu laika posmu. Katrā ziņā, var noķert mani kaut kur tur&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="352" width="469" src="http://i.i.com.com/cnwk.1d/i/tim/2010/10/13/businessman-running-4x3_540x405.jpg" align="right" border="0" style="background-image:none;border-right-width:0px;margin:20px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:large;"&gt;Aprīlis 2012:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.04.26&lt;/span&gt;: Transporta un Sakaru Institūts:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;18:15 &amp;ndash; 19:15 &amp;ldquo;MSF &amp;amp; Agile&amp;rdquo; &lt;/p&gt;
&lt;p&gt;19:15 &amp;ndash; 19:45 &amp;ldquo;TFS 2012 Overview (Dev &amp;lsquo;11)&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:large;"&gt;Maijs 2012:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.07&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Parallel Computing in Visual Studio 2010&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.08&lt;/span&gt;: Vidzemes Augstskola:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:00&lt;/strong&gt; &amp;ndash; 10:55 &amp;ldquo;Asp.Net MVC&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:00&lt;/strong&gt; &amp;ndash; 11:55 &amp;ldquo;Funkcionālā programmē&amp;scaron;ana - F#&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:00&lt;/strong&gt; &amp;ndash; 12:55 &amp;ldquo;Visual Studio 2012 - What&amp;#39;s new?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13:00&lt;/strong&gt; &amp;ndash; 13:55 &amp;ldquo;Requirements Management in TFS&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.14&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Funkcionālā programmē&amp;scaron;ana - F#&amp;ldquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.17&lt;/span&gt;: Ventspils Augstskola:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:00&lt;/strong&gt; &amp;ndash; 11:45 &amp;ldquo;Designing Software Architecture in VS 2010&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:45&lt;/strong&gt; &amp;ndash; 13:30 &amp;ldquo;C# 3.0 &amp;amp; C# 4.0&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13:40&lt;/strong&gt; &amp;ndash; 14:25 &amp;ldquo;MSF &amp;amp; Agile&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14:35&lt;/strong&gt; &amp;ndash; 15:20 &amp;ldquo;Requirements Management in TFS&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.21&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;C# 5.0 &amp;ndash; async&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.28&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Ievads jQuery&amp;ldquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=355406" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Parallel+FX/default.aspx">Parallel FX</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/TFS+11/default.aspx">TFS 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+Dev+11/default.aspx">Visual Studio Dev 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Agile/default.aspx">Agile</category></item><item><title>`Fakes’ iekš VS Dev ‘11</title><link>http://dotnet.lv/blogs/vi/archive/2012/04/06/fakes.aspx</link><pubDate>Fri, 06 Apr 2012 19:45:35 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:338131</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Interesanta lieta, kas varbūt nav tik bieži un daudz apskatīta lasot par jaunās versijas iespējām un jaunajām “fīčām” – Fakes Framework.&lt;/p&gt;    &lt;p&gt;Šī platforma paredzēta tieši vienumu testu efektīvākai un vieglākai rakstīšanai.&lt;/p&gt;    &lt;p&gt;Dažkārt vienumu testu veidošanas laikā ir nepieciešams simulēt kādas izmantotas komponentes uzvedību vai funkcionalitāti. Ja programma, kuru vēlas notestēt un pārējās komponentes ir veidotas ar ņemot vērā vienumu testu īpatnības (piemēram, komponentes paļaujas un izmanto funkcionalitāti, kas slēpjas aiz klašu interfeisiem, kurus “saņem” no ārpuses), tad lielas grūtības pareizu vienumu testu uzrakstīt parasti nesagādā problēmas.&lt;/p&gt;    &lt;p&gt;Problēmas parasti rodas situācijās, kad nepieciešams simulēt uzvedību kādai no komponentēm, kurai nav pieejams izejas kods, kurai nav iespējams pārrakstīt uzvedību (virtuālās metodes) vai arī kuras paļaujas uz kādu konkrētu iekodētu implementāciju, kuru izmainīt parasti sagādā problēmas.&lt;/p&gt;    &lt;p&gt;Pieņemsim, ir neliela metode, kas pārbauda entity “derīguma termiņu” un nosaka, vai šo entity var dzēst no sistēmas. Pieņemsim, ka entity no sistēma var tikai tad, kad tā tur pabijusi vairāk par 5 dienām, t.i., entity pievienošanas datums ir par 5 dienām mazāks nekā &lt;font face="Consolas"&gt;{sistēmas pašreizējais}&lt;/font&gt; datums. Un šajā vietā sākas interesantākais. &lt;font face="Consolas"&gt;{Pašreizējais datums}&lt;/font&gt; ir lieta, kuru parasti implementē ar &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now&lt;/font&gt;.&lt;/p&gt;    &lt;p&gt;Viss ir kārtībā un sistēma visticamāk arī uzvedīsies pareizi run-time laikā, bet jautājums: kā, lai pārbauda šāda veida kodu no vienumu testiem. Un vienumu testi noteikti gribēs pārbaudīt abus loģiskos zarus – kad entity pievienošanas laiks ir mazāks un kad ir lielāks par definētajām 5 dienām, tādā veidā tiešām pārliecinoties, ka abi loģikas zari nostrādā pareizi.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:84f3c5d6-d24e-4fcb-b4fb-2bf7907f9256" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityRemove(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Entity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; entity)&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (entity == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; delta = entity.Added.Subtract(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Now);&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; delta.Days &amp;gt; 5;&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Viens no variantiem, būtu definēt pašiem savu datuma piegādātāja klasi, kas varētu atgriezt virtuālo laiku, ar kuru varētu veikt nepieciešamās manipulācijas pirms atgriešanas. Bet jautājums, ko darīt, ja vēlamies pārbaudīt &lt;strong&gt;*tieši*&lt;/strong&gt; šādu kodu? Talkā nāk Fakes Framework, kas pieejams Visual Studio Dev ’11 versijā.&lt;/p&gt;    &lt;p&gt;Lai aizvietotu &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības vērtības, nepieciešams vispirms vienumu testa projektam uz nepieciešamo references bibliotēku, kur definēta klase &lt;font face="Consolas"&gt;DateTime&lt;/font&gt;, izpildīt komandu “Add Fakes Assembly”.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_5FD0B393.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_069EC9D4.png" width="596" height="362" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šī komanda ģenerēs jaunu bibliotēku &lt;font face="Consolas"&gt;{OriginalName} + “.Fakes”&lt;/font&gt;. Par cik &lt;font face="Consolas"&gt;DateTime&lt;/font&gt; ir definēts mscorlib bibliotēkā, bet pēc noklusējuma tā nav redzama references sarakstā, tad pēc Fakes bibliotēkas ģenerācijas, pieejama ir mscorlib.4.0.0.0.Fakes bibliotēka, kas satur &lt;font face="Consolas"&gt;stubs&lt;/font&gt; vai &lt;font face="Consolas"&gt;shims&lt;/font&gt; objektu veidus.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_7F7F8D5B.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin:0px auto;display:block;padding-right:0px;border-top-width:0px;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_5F64809E.png" width="336" height="519" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Microsoft Visual Studio Dev ‘11 pašlaik izmanto divu klašu “izbāžņu” veidus:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;Stub&lt;/strong&gt;: ir veids, kurā ģenerētā klase pilnībā ir spējīga aizvietot mērķa klasi, piedāvājot noklusēto uzvedību un funkcionalitāti visām virtuālajām vai abstraktajām metodēm, īpašībām un notikumiem. Šīs klašu “izkārtnes” iespējams ģenerēt arī interfeisiem un nemarķētām (non-sealed) klasēm. Savukārt pārējiem gadījumiem: statiskām vai ne-virtuālām metodēm jāģenerē būs &lt;strong&gt;Shim &lt;/strong&gt;veida aizbāžņi. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Shim&lt;/strong&gt;: ar šī veida palīdzību ir iespējams simulēt uzvedību statiskām vai ne-virutālām metodēm. Šī veida “izbāžņi” pārķers visus orģinālos izsaukumus un pāradresēs to alternatīvajai implementācijai. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Abu šo veidu klašu “izbāžņi” ļauj izmantot &lt;font face="Consolas"&gt;delegates&lt;/font&gt;, lai implementētu vai pārrakstītu nepieciešamo funkcionalitāti.&lt;/p&gt;    &lt;p&gt;Direktorija “Fakes/” satur sarakstu un papildus informāciju par bibliotēkām, kurām ir jāģenerē klašu “izbāžņi”.&lt;/p&gt;    &lt;p&gt;&lt;font face="Consolas"&gt;&amp;lt;Fakes xmlns=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/fakes/2011/&amp;quot;"&gt;&lt;font face="Consolas"&gt;http://schemas.microsoft.com/fakes/2011/&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;Assembly Name=&amp;quot;mscorlib&amp;quot; Version=&amp;quot;4.0.0.0&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;lt;/Fakes&amp;gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja gribam simulēt &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības vērtību, tad nozīmē, ka jāizmanto būs Shim veida ģenerācija, jo īpašība ir statiska.&lt;/p&gt;    &lt;p&gt;Lai darbotos &lt;font face="Consolas"&gt;Shim&lt;/font&gt; veida ģenerētās klases, vispirms nepieciešams ieslēgt &lt;font face="Consolas"&gt;Shim&lt;/font&gt; kontekstu vienuma testa izpildes laikā. &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksts paļaujas uz speciāli veidotu &lt;font face="Consolas"&gt;TraceProfilerInstrumentationProvider&lt;/font&gt;, kas arī nodarbojas ar izsaukumu pārķeršanu.&lt;/p&gt;    &lt;p&gt;Tātad, ja vēlamies izmantot &lt;font face="Consolas"&gt;Shim&lt;/font&gt; veida klašu ģenerāciju, tad no sākuma jāieslēdz:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c3316a1d-b300-4bc8-82b5-d558c70410b2" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityAddedOnJanuaryRemoved_Test()&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimsContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Create())&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja aizmirsīsim kontekstu ievietot &lt;font face="Consolas"&gt;using&lt;/font&gt; blokā, tad simulācija būs spēkā visa &lt;font face="Consolas"&gt;AppDomain&lt;/font&gt; dzīves laikā. Tāpēc svarīgi ir atcerēties kontrolēt &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksta scope. Pēc tam, kad &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksts ir uzstādīts, ir nepieciešams nodot instrukcijas klasei, kura jāsimulē.&lt;/p&gt;    &lt;p&gt;Tas notiek ar lambda izteiksmes palīdzību:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c93eda98-a7ae-4398-83d3-81158d423a00" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimsContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Create())&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimDateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.NowGet = () =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(2012, 1, 1);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šajā gadījumā tiek simulēts &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības uzvedība un atgrieztā vērtība.&lt;/p&gt;    &lt;p&gt;Izpildot vienuma testu redzams, ka Shim konteksts strādā un patiešām &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;property atgriež nepieciešamo vērtību.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_064AACF2.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin:0px auto;display:block;padding-right:0px;border-top-width:0px;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_662FA034.png" width="842" height="468" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja nepieciešams, piemēram, aizvietot vispār &lt;font face="Consolas"&gt;EntityValidator&lt;/font&gt; loģiku un testēt pavisam kādu citu sistēmas apgabalu pieņemot , ka vienumu testā šai klasei vienmēr ir jāatgriež &lt;font face="Consolas"&gt;true &lt;/font&gt;vērtība?&lt;/p&gt;    &lt;p&gt;Tas nozīmē, ka iespējami ir 2 scenāriji:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Izmantojam &lt;font face="Consolas"&gt;Shims&lt;/font&gt; ģenerācijas veidu un pielietojam jau apskatīto tehnoloģiju, kā modificēt vērtības klasēm, kurām nespējam piekļūt vienkāršā veidā. &lt;/li&gt;      &lt;li&gt;Pārdefinējam metodi &lt;font face="Consolas"&gt;CanEntityRemove()&lt;/font&gt; par virtuālu un izmantojam &lt;font face="Consolas"&gt;Stub&lt;/font&gt; klašu “izbāzeņu” ģenerācijas veidu, lai simulētu, ka dzēst no sistēmas var entity ar jebkādu datumu. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Lai šāda veida uzvedību nosimulētu, nepieciešams atkal &lt;font face="Consolas"&gt;Stub&lt;/font&gt; ģenerētajai klasei noinstruēt, ka vienmēr neskatoties uz kādu entity pievienošanas datumu, jāatgriež vienmēr &lt;font face="Consolas"&gt;true&lt;/font&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a65d4d5c-2b79-49bf-8041-a59b4a18cf81" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityRemove_StubTest()&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; stub = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;StubEntityValidator&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;stub.CanEntityRemoveEntity = (entity =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; result = stub.CanEntityRemove(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Entity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {Added = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(2012, 12, 12)});&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.IsTrue(result);&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šāda veida Stub ģenerētu uz noinstruēt klases instance var padot tālāk jau citām komponentēm, kurām nepieciešama šis objekts.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=338131" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Unit+testing/default.aspx">Unit testing</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+Dev+11/default.aspx">Visual Studio Dev 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/.NET4.5/default.aspx">.NET4.5</category></item><item><title>Entity Framework un kolonu vērtības pēc noklusējuma</title><link>http://dotnet.lv/blogs/dz/archive/2012/03/29/entity-framework-un-v-rt-bas-p-c-noklus-juma.aspx</link><pubDate>Thu, 29 Mar 2012 15:03:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:315096</guid><dc:creator>dace.zarina</dc:creator><slash:comments>13</slash:comments><description>&lt;p&gt;&amp;Scaron;odien saskāros ar diezgan interesantu problēmu - kā izdarīt tā, lai saglabājot datus datu bāzē, izmantojot Entity Framework, nenorādot konkrētas kolonas vērtību, tai tiktu pie&amp;scaron;ķirta vērtība pēc noklusējuma, kas ir definēta datu bāzē, nevis tiek paņemta konkrētā tipa vērtība pēc noklusējuma?&lt;/p&gt;
&lt;p&gt;Piem.,&lt;/p&gt;
&lt;p&gt;mums datu bāzē ir definēta &amp;scaron;āda tabula:&lt;/p&gt;
&lt;p&gt;CREATE TABLE DEAL(&lt;/p&gt;
&lt;p&gt;&lt;span&gt;	&lt;/span&gt;[ID] [bigint] &amp;nbsp;NOT NULL,&lt;/p&gt;
&lt;p&gt;[NAME] [varchar](50) NOT NULL ,&lt;/p&gt;
&lt;p&gt;[MIN_AMOUNT][bigint]&amp;nbsp;DEFAULT (1),&lt;/p&gt;
&lt;p&gt;[DATE]&amp;nbsp;[datetime] NOT NULL);&lt;/p&gt;
&lt;p&gt;Kods, lai saglabātu DEALS objektu datu bāzē ir apmēram &amp;scaron;āds:&lt;/p&gt;
&lt;p&gt;
using (var cnt = new Context())&lt;/p&gt;
&lt;p&gt;
{
&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;	DEAL deal = new DEAL();&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;
	deal.NAME = &amp;quot;The new Deal&amp;quot;;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;
	cnt.DEAL.AddObject(deal);&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;
	cnt.SaveChanges();
&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Taču pēc tam, apskatoties datu bāzē, lai gan es kodā nebiju norādījusi MIN_AMOUNT vērtību, MIN_AMOUNT ir 0 (kas ir tipa vērtība pēc noklusējuma) nevis 1 (kā ir definēts datu bāzes līmenī).&lt;/p&gt;
&lt;p&gt;
Izrādās, ka risinājums ir pavisam vienkār&amp;scaron;s... Vietā, kur notiek DB kolonu mapo&amp;scaron;ana uz objektiem, ir nepiecie&amp;scaron;ams pamainīt dažus uzstādījumus.&lt;/p&gt;
&lt;p&gt;Ir nepiecie&amp;scaron;ams uzlikt StoreGeneratedPattern uz Computed.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.dotnet.lv/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dz.EnityFramework/Mapping.jpg" width="527" height="315" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Un nāko&amp;scaron;o reizi, kad tiks saglabāti dati datu bāzē MIN_AMOUNT, kolonai tiks pie&amp;scaron;ķirta vērtība pēc noklusējuma, kas ir definēta datu bāzē.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs :)&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=315096" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/dz/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://dotnet.lv/blogs/dz/archive/tags/Kolonu+v_1301_rt_2B01_bas+p_1301_c+noklus_1301_juma/default.aspx">Kolonu vērtības pēc noklusējuma</category></item><item><title>Marta knockout.js prezentācijas materiāli</title><link>http://dotnet.lv/blogs/vi/archive/2012/03/09/marta-knockout-js-prezent-cijas-materi-li.aspx</link><pubDate>Fri, 09 Mar 2012 00:22:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:296841</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Marta prezentācijas materāli Microsoft .Net user group pasākumā par knockout.js bibliotēku, kas dod lielisku iespēju vienkārši un deklaratīvi veidot interakctīvas aplikācijas. Ar šīs bibliotēkas palīdzību iespējams ērti un viegli veidot sarežģītas aplikācijas, kurām nepieciešamas sarežģītas klieta puses DOM manipulācijas.&lt;/p&gt;    &lt;p&gt;&lt;img style="margin:5px 50px 0px 0px;display:inline;float:right;" align="right" src="http://learn.knockoutjs.com/Content/App/icon.png" width="130" height="130" alt="" /&gt;&lt;/p&gt;    &lt;div style="width:425px;" id="__ss_11942851"&gt;&lt;strong style="margin:12px 0px 4px;display:block;"&gt;&lt;a title="Knockoutjs UG meeting presentation" href="http://www.slideshare.net/valdisiljuconoks/knockoutjs-ug-meeting-presentation" target="_blank"&gt;Knockoutjs UG meeting presentation&lt;/a&gt;&lt;/strong&gt;       &lt;div style="padding-bottom:12px;padding-left:0px;padding-right:0px;padding-top:5px;"&gt;View more &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank"&gt;PowerPoint&lt;/a&gt; from &lt;a href="http://www.slideshare.net/valdisiljuconoks" target="_blank"&gt;Valdis Iljuconoks&lt;/a&gt; &lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;Pielikumā prezentācijas ppt - &lt;a href="https://skydrive.live.com/redir.aspx?cid=38746a08ebe72be7&amp;amp;resid=38746A08EBE72BE7!522&amp;amp;parid=38746A08EBE72BE7!521&amp;amp;authkey=!AMuTI-uxjwfiz2E"&gt;šeit&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Kā arī izejas kods, ja nu kādam tiešām ieinteresēja, iespējams papētīt - &lt;a href="https://skydrive.live.com/redir.aspx?cid=38746a08ebe72be7&amp;amp;resid=38746A08EBE72BE7!523&amp;amp;parid=38746A08EBE72BE7!521&amp;amp;authkey=!AGD5cY0ceugiqRE"&gt;šeit&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=296841" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/javascript+client-side+UI/default.aspx">javascript client-side UI</category></item><item><title>Daži spilgti citāti no grāmatas "The Pragmatic Programmer"</title><link>http://dotnet.lv/blogs/dz/archive/2012/02/23/da-i-spilgti-cit-ti-no-gr-matas-quot-the-pragmatic-programmer-quot.aspx</link><pubDate>Thu, 23 Feb 2012 16:14:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:290882</guid><dc:creator>dace.zarina</dc:creator><slash:comments>23</slash:comments><description>&lt;p&gt;No &amp;scaron;īs grāmatas man palika atmiņā daži spligti citāti, piem., &amp;nbsp;autoru Andrew Hunt un David Thomas apgalvojumi par zinā&amp;scaron;anu portfeli:&lt;/p&gt;
&lt;p&gt;&amp;quot;Zinā&amp;scaron;anu portfeļa pārvalde ir ļoti līdzīga fina&amp;scaron;u portfeļa pārvaldei:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nopietni investori investē regulāri - tas ir kā pieradums.&lt;/li&gt;
&lt;li&gt;Dažādība - tā ir ilgtermiņa panākumu atslēga.&lt;/li&gt;
&lt;li&gt;Nopietniem investoriem portfelis vienmēr ir sabalansēts - tajā ir gan konservatīvas, gan riskantas un lielu peļņu neso&amp;scaron;as investīcijas.&lt;/li&gt;
&lt;li&gt;Investori vienmēr cen&amp;scaron;as pirkt vērtīgas akcijas pēc iespējas lētāk un pārdot pēc iespējas dārgāk, &amp;scaron;ādā veidā nodro&amp;scaron;inot sev maksimālo peļnu.&lt;/li&gt;
&lt;li&gt;Portfeli vajag periodiski pārskatīt un atkārtoti sabalansēt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pārvaldiet savu zinā&amp;scaron;anu portfeli &amp;scaron;ādā pa&amp;scaron;ā veidā un Jūsu karjera būs veiksmīga&amp;quot;.&lt;/p&gt;
&lt;p&gt;Grūti nepiekrist &amp;scaron;iem apgalvojumiem, un, paskatoties uz programmētājiem ar lielo &amp;quot;P&amp;quot;, viņi tā arī dara :). Vēl man patika nodaļa par koda dublē&amp;scaron;anu un vēl dažas citas lietas. Viena no grāmatām, kuru ir vērts izlasīt un veltīt laiku. Priecē, ka grāmatai ir tikai 270 lapaspuses.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=290882" width="1" height="1"&gt;</description></item></channel></rss>