<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.aspnet.sk/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/"><channel><title>Dev Crumbs</title><link>http://blog.aspnet.sk/devcrumbs/default.aspx</link><description>Programujem&lt;br /&gt;Dobrovoľne a s piesňou na perách</description><dc:language>sk-SK</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Logická hra Dominoes aj so zdrojákmi</title><link>http://blog.aspnet.sk/devcrumbs/archive/2011/01/23/logicka-hra-dominoes-aj-so-zdrojakmi.aspx</link><pubDate>Sun, 23 Jan 2011 09:30:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306870</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306870</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2011/01/23/logicka-hra-dominoes-aj-so-zdrojakmi.aspx#comments</comments><description>&lt;p&gt;Pred pár mesiacmi som sklepkal takú malú peknú zaujímavú a dosť obtiažnu
 logickú hru. V lete som sa po rokoch strávených v Java lande 
preorientoval na C# a .NET a chcel som si v novo-naučenom jazyku niečo 
pekné naprogramovať. Už sa mi to povaľuje na disku nejakú dobu a ešte 
som to vlastne nikde poriadne nezverejnil.
&lt;/p&gt;&lt;p&gt;Hlavne z toho dôvodu, že na rozdiel od mojej predošlej hry v Jave vo forme appletu - &lt;a href="http://www.perhac.com/shared/forest-defender/index.html" target="_blank" title="Zahrajte si hned teraz, linka sa otvori v novom okne"&gt;Forest&amp;nbsp;Defender&lt;/a&gt; - sa toto nedá načítať a hrať priamo v internetovom prehliadači (browseri). Túto hru s dominami si budete musieť &lt;a href="http://www.perhac.com/downloadable/games/dominoes_bin.zip"&gt;stiahnuť v ZIP archive&lt;/a&gt;, rozbaliť a spustiť. K celej hre preto dodávam aj &lt;a href="http://www.perhac.com/downloadable/code/dominoes_src.zip"&gt;zdrojový kód&lt;/a&gt; pre zvedavcov alebo nedôverčivých ľudí.&lt;/p&gt;
&lt;p&gt;Upozorňujem, že pre túto hru potrebujete mať nainštalovaný .NET 
framework verziu 3.5 (asi), no na to vás už hra samotná upozorní keď sa 
ju posnažíte spustiť bez prítomnosti .NET. To je už taká pliaga dnešných
 hier. Na webovky potrebujete poväčšine Flash plugin. Na Java applety 
potrebujete mať nainštalovanú Javu (JVM) a pre veci v C# alebo VB budete
 potrebovať mať .NET framework. Ale každý Windows užívateľ celkom určite
 aspoň nejakú verziu .NET nainštalovanú má.&lt;/p&gt;

&lt;img src="http://www.perhac.com/images/stories/programovanie/dominoes.jpg" alt="Dominoes puzzle game screenshot" title="Dominoes puzzle game screenshot" align="middle" border="0" height="401" hspace="6" width="500" /&gt;&lt;h2&gt;Ako sa to hrá&lt;/h2&gt;
&lt;p&gt;No... prvá časť logickej hádanky je práve tá, že by ste odpoveď na otázku &amp;quot;Ako sa to hrá?&amp;quot; mali nájsť sami. Takže veselé hranie prajem tým, čo teraz 
prestanú čítať a pokúsia sa prísť na to ako na vec sami. Veľa zdaru!&lt;/p&gt;
&lt;p&gt;Pre tých čo by však radšej vedeli o čo ide samozrejme uvediem viac 
podrobností: Na hracej doske je rozsypaná kompletná sada domino kociek 
(blokov). Teda všetky od 0-0 po 6-6. Ty však nevieš ako sú kocky 
poukladané a tvojou úlohou bude pospájať páry súsediacich štvorčekov aby
 tvorili domino bloky. Vyhrávaš vtedy, keď sa ti podarí pospájať úplne 
všetky na hracej ploche.&lt;/p&gt;
&lt;p&gt;Ono sa mi to ťažšie vysvetľuje než to v skutočnosti je. Stačí stláčať
 kocky a všimnete si, že keď označíte napr. kombináciu 3-3 tak sa vám 
možno nejaké kocky kde inde (čo ste už predošle označili) ODznačia. A 
aha, sú to kocky 3-3. Treba to potom poskladať nejak inač. Treba dosť 
pohútať.&lt;/p&gt;
&lt;p&gt;Veselé Kódovanie a šťastný Nový Rok!&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.perhac.com/downloadable/games/dominoes_bin.zip"&gt;== DOWNLOAD GAME ==&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.perhac.com/downloadable/code/dominoes_src.zip"&gt;== DOWNLOAD SOURCE ==&lt;/a&gt;&lt;/p&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306870" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/logick_26002300_225_3B00_+hra/default.aspx">logick&amp;#225; hra</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/z_26002300_225_3B00_bava/default.aspx">z&amp;#225;bava</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/wpf/default.aspx">wpf</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/board+game/default.aspx">board game</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/game/default.aspx">game</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/domino/default.aspx">domino</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/hra/default.aspx">hra</category></item><item><title>HTTPS výsledky Google vyhľadávania a ako sa ich zbaviť</title><link>http://blog.aspnet.sk/devcrumbs/archive/2011/01/22/HTTPS-vysledky-Google-vyhladavania-a-ako-sa-ich-zbavit.aspx</link><pubDate>Sat, 22 Jan 2011 18:15:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306886</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306886</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2011/01/22/HTTPS-vysledky-Google-vyhladavania-a-ako-sa-ich-zbavit.aspx#comments</comments><description>&lt;p&gt;Vyhľadával som určitú frázu na slovenskom Googli a vo výsledkoch sa 
zobrazil odkaz na článok na mojich stránkach. Keď som na neho 
klikol, zobrazila sa odporná výstražná stránka Firefoxu s upozornením o 
nebezpečenstve návštevy mojej stránky. Niečo o tom, že nebol nájdený žiaden certifikát pri pripájaní sa na server cez HTTPS. O čom to je toto? &lt;a href="http://www.perhac.com" title="linka sa otvori v novom okne/zalozke" target="_blank"&gt;Moja osobná stránka&lt;/a&gt; je založená na CMS systéme Joomla! a neposkytujem žiadnu užívateľskú sekciu, ani nemám žiadnu zabezpečenú zónu, v ktorej by užívatelia komunikovali cez protokol HTTPS.&lt;/p&gt;

&lt;p&gt;Zázračne, Google v niekoľkých prípadoch uvádza vo svojich výsledkoch hľadania odkazy na &lt;i&gt;správne stránky&lt;/i&gt; pod &lt;i&gt;nesprávnym protokolom&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Upozorňujem, že tento článok sa týka len tých, čo majú stránky podávané &lt;b&gt;Apache &lt;/b&gt;Web Server-om.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Keďže pochybujem, že by náhodný návštevník chcel pridávať bezpečnostnú výnimku do svojho prehliadača pre moju stránku, prv než ju navštívi, som presvedčený o tom, že ma takéto výsledky vyhľadávania penalizujú na návštevnosti mojej stránky. Bolo treba s tým niečo robiť. Príčinu som síce nezistil, ale so symptómami som si poradil. A to nasledovne:&lt;/p&gt;

&lt;p&gt;Aby sa mi Google, či iné roboty, nešplhali po stránkach cez https, pridal som na svoje stránky sekundárny súbor robots.txt, s názvom robots_ssl.txt.&lt;/p&gt;

&lt;p&gt;Obsah tohto súboru je jednoduchý:&lt;/p&gt;

&lt;pre&gt;User-agent: *&lt;br /&gt;Disallow: /&lt;/pre&gt;
&lt;p&gt;Zakážeme všetkým robotom prístup k celej stránke. Zadaním lomítka by mala byť nedostupná celá stránka, jej hlavný adresár, aj všetky podadresáre.&lt;/p&gt;

&lt;p&gt;Ako však povedať robotom prichádzajúcim cez HTTPS na súbor robots.txt, aby si pozreli moju alternatívnu verziu robots_ssl.txt? Zavŕtame sa do &lt;i&gt;.htaccess &lt;/i&gt;súboru a pozrieme, či je zapnutý RewriteEngine, ak nie, potrebujeme pridať tieto riadky:&lt;/p&gt;

&lt;pre&gt;RewriteEngine On&lt;br /&gt;RewriteBase /&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Pridáme RewriteRule pre Apache, pomocou ktorého roboty prichádzajúce cez port využívaný pri komunikácii HTTPS protokolom budú presmerované na správny robots.txt súbor, teda v mojom prípade robots_ssl.txt vyhradený práve pre tieto roboty:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;RewriteCond %{SERVER_PORT} ^443$&lt;br /&gt;RewriteRule ^robots.txt$ robots_ssl.txt&lt;/pre&gt;
&lt;p&gt;Toto pravidlo ich nasmeruje na správne miesto, odkiaľ by už nemali pokračovať v prehľadávaní mojich stránok, pretože som nastavil Disallow: / Takto nastavené robots.txt súbory by v budúcnosti mali zabrániť tomu, aby sa vo výsledkoch hľadania zobrazovali linky na stránky s HTTPS protokolom. No čo s tými, čo Google už má vo svojom indexe a stále zobrazuje ľuďom pri hľadaní?&lt;/p&gt;&lt;p&gt;Vyhľadával som určitú frázu na slovenskom Googli a vo výsledkoch sa 
zobrazil odkaz na článok na mojich stránkach. Keď som na neho 
klikol, zobrazila sa odporná výstražná stránka Firefoxu s upozornením o 
nebezpečenstve návštevy mojej stránky. Niečo o tom, že nebol nájdený 
žiaden certifikát pri pripájaní sa na server cez HTTPS. O čom to je 
toto? &lt;a href="http://www.perhac.com/" title="linka sa otvori v novom okne/zalozke" target="_blank"&gt;Moja osobná stránka&lt;/a&gt;
 je založená na CMS systéme Joomla! a neposkytujem žiadnu užívateľskú 
sekciu, ani nemám žiadnu zabezpečenú zónu, v ktorej by užívatelia 
komunikovali cez protokol HTTPS.&lt;/p&gt;

&lt;p&gt;Zázračne, Google v niekoľkých prípadoch uvádza vo svojich výsledkoch hľadania odkazy na &lt;i&gt;správne stránky&lt;/i&gt; pod &lt;i&gt;nesprávnym protokolom&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Upozorňujem, že tento článok sa týka len tých, čo majú stránky podávané &lt;b&gt;Apache &lt;/b&gt;Web Server-om.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Keďže pochybujem, že by náhodný návštevník chcel pridávať 
bezpečnostnú výnimku do svojho prehliadača pre moju stránku, prv než ju 
navštívi, som presvedčený o tom, že ma takéto výsledky vyhľadávania 
penalizujú na návštevnosti mojej stránky. Bolo treba s tým niečo robiť. 
Príčinu som síce nezistil, ale so symptómami som si poradil. A to 
nasledovne:&lt;/p&gt;

&lt;p&gt;Aby sa mi Google, či iné roboty, nešplhali po stránkach cez https, 
pridal som na svoje stránky sekundárny súbor robots.txt, s názvom 
robots_ssl.txt.&lt;/p&gt;

&lt;p&gt;Obsah tohto súboru je jednoduchý:&lt;/p&gt;

&lt;pre&gt;User-agent: *&lt;br /&gt;Disallow: /&lt;/pre&gt;
&lt;p&gt;Zakážeme všetkým robotom prístup k celej stránke. Zadaním lomítka by 
mala byť nedostupná celá stránka, jej hlavný adresár, aj všetky 
podadresáre.&lt;/p&gt;

&lt;p&gt;Ako však povedať robotom prichádzajúcim cez HTTPS na súbor 
robots.txt, aby si pozreli moju alternatívnu verziu robots_ssl.txt? 
Zavŕtame sa do &lt;i&gt;.htaccess &lt;/i&gt;súboru a pozrieme, či je zapnutý RewriteEngine, ak nie, potrebujeme pridať tieto riadky:&lt;/p&gt;

&lt;pre&gt;RewriteEngine On&lt;br /&gt;RewriteBase /&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Pridáme RewriteRule pre Apache, pomocou ktorého roboty prichádzajúce 
cez port využívaný pri komunikácii HTTPS protokolom budú presmerované na
 správny robots.txt súbor, teda v mojom prípade robots_ssl.txt vyhradený
 práve pre tieto roboty:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;RewriteCond %{SERVER_PORT} ^443$&lt;br /&gt;RewriteRule ^robots.txt$ robots_ssl.txt&lt;/pre&gt;
&lt;p&gt;Toto pravidlo ich nasmeruje na správne miesto, odkiaľ by už nemali 
pokračovať v prehľadávaní mojich stránok, pretože som nastavil Disallow:
 / Takto nastavené robots.txt súbory by v budúcnosti mali zabrániť tomu,
 aby sa vo výsledkoch hľadania zobrazovali linky na stránky s HTTPS 
protokolom. No čo s tými, čo Google už má vo svojom indexe a stále 
zobrazuje ľuďom pri hľadaní?&lt;/p&gt;Prečítajte si prosím &lt;a href="http://www.perhac.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=207&amp;amp;Itemid=31#pokracovanie" title="celý článok na stránkach perhac.com"&gt;zvyšok článku na mojich stránkach&lt;/a&gt;, kde by ma potešilo keby kliknete na facebook &amp;quot;Like&amp;quot; tlačidlo. Dúfam, že vám môj článok poslúži, ako i ostatným, čo sa mi už stihli na tento článok pozitívne vyjadriť.&lt;br /&gt;

		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306886" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/google/default.aspx">google</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/.htaccess/default.aspx">.htaccess</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/apache/default.aspx">apache</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/presmerovanie/default.aspx">presmerovanie</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/http/default.aspx">http</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/https/default.aspx">https</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/seo/default.aspx">seo</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/vyh_3E01_ad_26002300_225_3B00_vanie/default.aspx">vyhľad&amp;#225;vanie</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/robots.txt/default.aspx">robots.txt</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/konfigur_26002300_225_3B00_cia/default.aspx">konfigur&amp;#225;cia</category></item><item><title>C# Navrátené objekty anonymného typu. Čo s nimi?</title><link>http://blog.aspnet.sk/devcrumbs/archive/2011/01/08/c-navr-225-ten-233-objekty-anonymn-233-ho-typu-o-s-nimi.aspx</link><pubDate>Sat, 08 Jan 2011 12:50:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306877</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306877</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2011/01/08/c-navr-225-ten-233-objekty-anonymn-233-ho-typu-o-s-nimi.aspx#comments</comments><description>Jedna z novších čŕt jazyku C# (od C# 3.0) sú anonymné typy (vytváranie objektov neznámeho typu, respektíve objektov žiadneho deklarovaného typu). Sú vynikajúce pri použití s technológiou LINQ, no je problém s konzumovaním týchto objektov po navrátení z funkcie. Anonymné objekty sa dajú navrátiť jedine ako typu object, ktorý potom však nemáme ako využiť bez toho aby sme ho explicitne pretypovali (explicit cast). No do akého typu - ako - chceme pretypovať objekt, keď je anonymný a jeho typ bol vytvorený takzvane on-the-fly (za behu)?&lt;br /&gt;&lt;div class="post-footer"&gt;
&lt;br /&gt;
(Neviem sa tu veľmi spriateliť s formátovaním článkov na tomto blogu. &lt;a href="http://www.perhac.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=198"&gt;Kuknite na to na mojej stránke&lt;/a&gt;, kde to občas aj updateujem)   &lt;br /&gt;
&lt;br /&gt;
Okrem argumentu, že by sme sa o to nemali radšej ani pokúšať, že anonymné objekty sa nemajú navrácať z metód a mali by sa použiť priamo v metóde kde boli vytvorené (všetko veľmi dobré a opodstatnené rady), sa nám poskytuje ešte niekoľko možností. Na jednu konkrétne zaujímavú som naďabil nedávno a chcel by som sa o nej zmieniť:&lt;br /&gt;
&lt;br /&gt;
Pokiaľ tvoríme aplikáciu pre &amp;quot;.NET Framework 4&amp;quot; profil a nie &amp;quot;.NET Framework 4 Client Profile&amp;quot;, môžeme využiť jeden typ z namespace-u System.Web.Routing (knižnica System.Web.dll). V nastaveniach projektu zmeníme profil na .NET Framework 4 (implikácie čoho nám musia byť jasné), aby sme mohli pridať do projektu referenciu na knižnicu System.Web.dll&lt;br /&gt;
&lt;br /&gt;
V našom projekte potom stačí pridať jednu &amp;quot;using&amp;quot; klauzulu:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;using System.Web.Routing;&lt;/div&gt;&lt;br /&gt;
A na nasledujúcej ukážke malého programíku vám ukážem čo a ako s anonymným objektom navráteným z nejakej funkcie:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="font-size:smaller;overflow:auto;width:500px;"&gt;1  class Program&lt;br /&gt;2  {&lt;br /&gt;3    static void Main(string[] args)&lt;br /&gt;4    {&lt;br /&gt;5      object anonym = Metoda_Vracia_Objekt_Anonymneho_Typu(); //CO S TYM?&lt;br /&gt;6  &lt;br /&gt;7      //Uz viem! Pouzijem RouteValueDictionary zo System.Web.dll&lt;br /&gt;8      RouteValueDictionary rvd = new RouteValueDictionary(anonym);&lt;br /&gt;9  &lt;br /&gt;10      //a dalej je vsetko vesele :-)&lt;br /&gt;11      Console.WriteLine(&amp;quot;Ahoj, volám sa {0} a pracujem ako {1}&amp;quot;, rvd[&amp;quot;Meno&amp;quot;], rvd[&amp;quot;Povolanie&amp;quot;]);&lt;br /&gt;12    }&lt;br /&gt;13  &lt;br /&gt;14    private static object Metoda_Vracia_Objekt_Anonymneho_Typu()&lt;br /&gt;15    {&lt;br /&gt;16      return new { Id = 1, Meno = &amp;quot;Peter Perháč&amp;quot;, Povolanie = &amp;quot;softwareový vývojár&amp;quot; };&lt;br /&gt;17    }&lt;br /&gt;18  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;
Tento program, ako sa dá očakávať, produkuje nasledovnú vetu (číročistá pravda):&lt;br /&gt;
Ahoj, volám sa Peter Perháč a pracujem ako softwareový vývojár&lt;br /&gt;
&lt;br /&gt;
Ta fasa, ňe?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size:x-large;"&gt;Načo je nám toto dobré?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nuž... ako som vravel, vyhúť sa navracaniu anonymných objektov z metód je dobrá rada. Vyhnite sa tomu ak môžete. Ja som narazil na potrebu kontrolovania stavu anonymných objektov pri testovaní ASP.NET MVC2 webovej aplikácie.&lt;br /&gt;
&lt;br /&gt;
Niektoré z action methods mojich kontrolerov navracali JsonResult. V JSON notácii som tam mal nejaké DATA, ktoré som do JSON formy dával cez anonymné objekty. V mojom Unit teste som chcel potom overiť, či navrátený ActionResult po zavolaní action method na kontroleri naozaj navracia JsonResult objekt a či teda Data object toho JsonResult-u má správne nastavené hodnoty svojich vlastností.&lt;br /&gt;
&lt;br /&gt;
Toto sa dá celkom jednoducho, takto v kontext ASP.NET MVC2 webovej aplikácie, pretože správny profil je už zvolený, referencia na System.Web.dll je už v projekte (teda nemusí byť za sekundu si ju môžeme pridať), stačí len naimportovať správny namespace System.Web.Routing a z neho použiť triedu RouteValueDictionary.&lt;br /&gt;
&lt;br /&gt;
Tento anonymný objekt, JSON Data, môžeme podať RouteValueDictionary v jej konštruktore a potom už len vyťahovať jednotlivé vlastnosti anonymného objektu zo slovníka použitím jeho indexer-u.&lt;br /&gt;
&lt;br /&gt;
Myslím si, že zbytočne veľa slov o niečom, čo vidíte najjednoduchšie z hore-uvedeného príkladu.&lt;br /&gt;
&lt;br /&gt;
Veselé kódovanie a veľa Wow! pocitov&lt;div class="post-footer-line post-footer-line-3"&gt;&lt;span class="post-location"&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;

		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306877" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/.net/default.aspx">.net</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/web+development/default.aspx">web development</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/json/default.aspx">json</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/routevaluedictionary/default.aspx">routevaluedictionary</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/anonymous+types/default.aspx">anonymous types</category></item><item><title>Označovanie položiek pomocou vpisovania do ListBox/ComboBox-u</title><link>http://blog.aspnet.sk/devcrumbs/archive/2011/01/02/ozna-ovanie-polo-iek-pomocou-vpisovania-do-listbox-combobox-u.aspx</link><pubDate>Sun, 02 Jan 2011 22:40:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306871</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306871</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2011/01/02/ozna-ovanie-polo-iek-pomocou-vpisovania-do-listbox-combobox-u.aspx#comments</comments><description>&lt;p&gt;Mnohokrát si užívateľ musí vybrať jednu položku z množstva v ponuke ListBox alebo ComboBox a je to nesmierne uľahčenie života, keď môže označiť požadovanú vec priamim zadaním jednotlivých písmen. Teda napríklad pri výbere krajiny zo zoznamu všetkých krajín sveta v ComboBoxe je najjednoduchšie označiť ComboBox a začať vyťukávať &amp;quot;Slove&amp;quot;... a to by už malo stačiť na označenie položky &amp;quot;Slovensko&amp;quot; v zozname.&lt;/p&gt;

&lt;p&gt;Nedávno som si naprogramoval malú utilitku na prehľadávanie (atď.) prednastavených farieb ktoré sú nadefinované v triede System.Windows.Media.Colors&lt;br /&gt;Do ListBoxu som potom nasypal jednotlivé farby napojením ItemsSource na ObservableCollection triedy ColorVM (ktorá zastáva ViewModel jednotlivých farieb). Nastavil som DataTemplate pre datový typ ColorVM aby jednotlivé objetky boli zobrazované v ListBoxe (a všade inde) ako obdĺžnik&amp;nbsp; farebnej vzorky, vedľa ktorého je umiestnený text s názvom farby.&lt;/p&gt;

&lt;pre&gt;&amp;lt;DataTemplate DataType=&amp;quot;{x:Type local:ColorVM}&amp;quot; &amp;gt;...&lt;/pre&gt;
&lt;p&gt;&lt;i&gt;Takto nadefinovaný DataTemplate v App.xaml zaručuje že všetky objekty typu ColorVM v rámci aplikácie budú zdieľať rovnaký vzhľad.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.aspnet.sk/controlpanel/blogs/color_selector.PNG" alt="" /&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://www.perhac.com/shared/color_selector.png" title="color selector for wpf applications" alt="color selector for wpf applications" align="middle" height="356" width="306" /&gt;&lt;/p&gt;&lt;p&gt;Prichystal som si aj políčko do ktorého užívateľ môže vpísať časti názvu farbieb a ListBox sa podľa zadaného textu prefiltruje. Avšak, po označení ListBoxu som si všimol, že sa nedajú označovať farby v ňom jednoduchým vyťukávaním názvu farby. Teda, ak by som dal Focus ListBoxu na obrázku, a začal vyťukávať &amp;quot;Toma&amp;quot;, položka s farbou &amp;quot;Tomato&amp;quot; by sa neoznačila automaticky.&lt;/p&gt;

&lt;p&gt;Ako teda donútiť ListBox (alebo ComboBox) aby označoval položky ako sme na to zvyknutí? ListBox v mojom príklade obsahuje objekty typu ColorVM a automatické označovanie položiek vieme, že funguje pri zoznamoch, v ktorých sú textové položky. Jednoduché riešenie teda aby aj náš zoznam sa dal prehľadávať automaticky postupným zadávaním písmen od začiatku slova nasleduje:&lt;/p&gt;

&lt;p&gt;Stačí aby dátový typ jednotlivých položiek prekryl (override) metódu ToString. Keďže moja trieda ColorVM mala vlastnosť (property) Name, stačilo triedu ColorVM obohatiť o nasledovný kód: &lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;public override string ToString()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Name;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;A hneď sa položky v našom ListBoxe dajú označovať automaticky vpísaním niekoľkých začiatočných písmen.&lt;/p&gt;&lt;p&gt;K tomtu článku som pripojil prílohu (Attachment) v ktorej nájdete celý VS2010 projekt WPFColors (utilitka spomínaná vyššie).&lt;br /&gt;&lt;/p&gt;

		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306871" width="1" height="1"&gt;</description><enclosure url="http://blog.aspnet.sk/devcrumbs/attachment/306871.ashx" length="116784" type="application/x-zip-compressed" /><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/.net/default.aspx">.net</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/wpf/default.aspx">wpf</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/xaml/default.aspx">xaml</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/colors/default.aspx">colors</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/data+template/default.aspx">data template</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/reflection/default.aspx">reflection</category></item><item><title>NHibernate a automaticky udržiavané časové známky (timestamps)</title><link>http://blog.aspnet.sk/devcrumbs/archive/2010/12/16/nhibernate-a-automaticky-udr-iavan-233-asov-233-zn-225-mky-timestamps.aspx</link><pubDate>Thu, 16 Dec 2010 20:32:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306859</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306859</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2010/12/16/nhibernate-a-automaticky-udr-iavan-233-asov-233-zn-225-mky-timestamps.aspx#comments</comments><description>&lt;p&gt;Keď padne rozhodnutie používať vo vašom projekte NHibernate, môžete si
v mnohých ohľadoch uľahčiť život (teda hneď potom, čo si omotáte hlavu
okolo tejto zázračnej technológie). V tomto blogu vám ukážem ako
dohovoriť NHibernate, aby automaticky udržiavalo timestamps na
vami-zvolených poliach (teda reálne budete potrebovať mať nanájvyš
jedno pole automaticky timestampované).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pperhac.blogspot.com/2010/12/nhibernate-automaticky-udrziavane.html" target="_blank" title="linka sa otvori v novom okne"&gt;Tento článok nájdete aj na mojom technologickom Google blogu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ako príklad si uvedieme nasledovné: Užívateľ vašej (webovej)
aplikácie uverejní komentár. Tento komentár bude vo vašej aplikácii
obsahovať samotný text komentára a časové pole DateUpdated, v ktorom
budete chcieť udržiavať dátum a čas zverejnenia/poslednej úpravy
komentára. Zakaždým keď užívateľ komentár zverejní, alebo upraví, a
obsah komentára je vpísaný/aktualizovaný v databáze, chceme aby sa
zaznamenal aj aktuány časový údaj. Toto by za vás mohlo robiť
NHibernate, stačí si ho tak nastaviť. Dobre sledujte nasledujúcich pár
riadkov kódu, alebo si tie riadky skrátka len skopírujte a použite.&lt;/p&gt;


&lt;p&gt;Najprv vás zasypem kódom a potom trošku pokecáme o tom ako to
funguje. Budeme potrebovať triedu implementujúcu dve NHibernate
interface-y: IPreUpdateEventListener, IPreInsertEventListener. Táto
trieda bude potrebovať dva namespace-y, ktoré si môžeme pridať medzi
ostatné základné namespace-y ktoré dostaneme pri vytvorení novej čistej
triedy:&lt;/p&gt;

&lt;pre&gt;using NHibernate.Event;&lt;br /&gt;using NHibernate.Persister.Entity;&lt;br /&gt;&lt;/pre&gt;
    
&lt;p&gt;
      Trieda samotná bude vyzerať takto:
    &lt;/p&gt;
    
&lt;pre&gt;1	public class TimestampOnInsertUpdate : IPreUpdateEventListener, IPreInsertEventListener&lt;br /&gt;2	{&lt;br /&gt;3		public bool OnPreUpdate(PreUpdateEvent @event)&lt;br /&gt;4		{&lt;br /&gt;5			return !AutoUpdateTimestamps(@event.Entity, @event.Persister, @event.State, true);&lt;br /&gt;6		}&lt;br /&gt;7	&lt;br /&gt;8		public bool OnPreInsert(PreInsertEvent @event)&lt;br /&gt;9		{&lt;br /&gt;10			return !AutoUpdateTimestamps(@event.Entity, @event.Persister, @event.State, false);&lt;br /&gt;11		}&lt;br /&gt;12	&lt;br /&gt;13		private bool AutoUpdateTimestamps(object entity, IEntityPersister persister, object[] state, bool isUpdate)&lt;br /&gt;14		{&lt;br /&gt;15			var dateTimeProperties = entity.GetType().GetProperties().Where(p =&amp;gt; p.PropertyType.Equals(typeof(DateTime)));&lt;br /&gt;16			var autoTimestampedProperties = dateTimeProperties.Where(p =&amp;gt; p.GetCustomAttributes(false).OfType().Any());&lt;br /&gt;17			if (!autoTimestampedProperties.Any())&lt;br /&gt;18			{&lt;br /&gt;19				return true;&lt;br /&gt;20			}&lt;br /&gt;21			&lt;br /&gt;22			IEnumerable propertiesToTimestamp;&lt;br /&gt;23			if (isUpdate)&lt;br /&gt;24			{&lt;br /&gt;25				propertiesToTimestamp = autoTimestampedProperties.Where(p =&amp;gt; !p.GetCustomAttributes(false).OfType().First().InsertOnly);&lt;br /&gt;26			}&lt;br /&gt;27			else&lt;br /&gt;28			{&lt;br /&gt;29				propertiesToTimestamp = autoTimestampedProperties;&lt;br /&gt;30			}&lt;br /&gt;31	&lt;br /&gt;32			if (!autoTimestampedProperties.Any())&lt;br /&gt;18			{&lt;br /&gt;19				return true;&lt;br /&gt;20			}&lt;br /&gt;34	&lt;br /&gt;35			var timestamp = DateTime.Now;&lt;br /&gt;36			try&lt;br /&gt;37			{&lt;br /&gt;38				foreach (var propertyToTimestamp in propertiesToTimestamp)&lt;br /&gt;39				{&lt;br /&gt;40					Set(persister, state, propertyToTimestamp.Name, timestamp);&lt;br /&gt;41					propertyToTimestamp.SetValue(entity, timestamp, null);&lt;br /&gt;42				}&lt;br /&gt;43			}&lt;br /&gt;44			catch (InvalidOperationException)&lt;br /&gt;45			{&lt;br /&gt;46				return false;&lt;br /&gt;47			}&lt;br /&gt;48			return true;&lt;br /&gt;49		}&lt;br /&gt;50	&lt;br /&gt;51		private void Set(IEntityPersister persister, object[] state, string propertyName, object value)&lt;br /&gt;52		{&lt;br /&gt;53			var index = Array.IndexOf(persister.PropertyNames, propertyName);&lt;br /&gt;54			state[index] = value;&lt;br /&gt;55		}&lt;br /&gt;56	}&lt;br /&gt;&lt;/pre&gt;
    
&lt;p&gt;
      Ďalej si budeme potrebovať nadefinovať svoju vlastnú atribútu (custom attribute)
      AutoUpdatedTimestampAttribute, ktorej definícia bude veľmi jednoduchá:
    &lt;/p&gt;
    
&lt;pre&gt;[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]&lt;br /&gt;public sealed class AutoUpdatedTimestampAttribute : System.Attribute {&lt;br /&gt;&lt;br /&gt;	public bool InsertOnly { get; set; }&lt;br /&gt;&lt;br /&gt;	public AutoUpdatedTimestampAttribute()&lt;br /&gt;	{&lt;br /&gt;		InsertOnly = false;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
    
&lt;p&gt;Naša modelová trieda bude potom môcť takto jednoducho
prehlásiť, že niektoré z jej vlastností (properties) potrebujú mať vždy
automaticky aktualizovanú časovú známku (timestamp). Príkladná trieda
dole napríklad našepkáva NHibernate, žeby bola rada keby sa jej ktosi
ujal a aktualizoval jej DateUpdated vlastnosť (pri každom uložení zmeny
alebo vytvorení nového záznamu v databáze). Taktiež sa zmieňuje, že by
bolo fajn keby pred vložením záznamu (ale len pre &lt;i&gt;vložením&lt;/i&gt;) do databázy bola vlastnosť DateCreated nastavená na aktuálny dátum/čas.&lt;/p&gt;
    
&lt;pre&gt;...&lt;br /&gt;public virtual string Comments { get; set; }&lt;br /&gt;public virtual DateTime DateLastUsed { get; set; }&lt;br /&gt;&lt;br /&gt;[AutoUpdatedTimestamp]&lt;br /&gt;public virtual DateTime DateUpdated { get; set; }&lt;br /&gt;&lt;br /&gt;[AutoUpdatedTimestamp(InsertOnly=true)]&lt;br /&gt;public virtual DateTime DateCreated { get; set; }&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;
    
&lt;p&gt;Ešte nám treba objasniť NHibernate, že kde bolo tam
bolo, žila raz jedna trieda TimestampOnInsertUpdate, ktorá sa zaujíma o
dianie v NHibernate mechanizme pred insert-om/update-om. Stačí pár
riadkov medzi nakonfigurovanie NHibernate a vytvorenie ISessionFactory:&lt;/p&gt;
    
&lt;pre&gt;var nhConfig = new NHibernate.Cfg.Configuration().Configure();&lt;br /&gt;var timestamper = new TimestampOnInsertUpdate();&lt;br /&gt;nhConfig.EventListeners.PreUpdateEventListeners = new NHibernate.Event.IPreUpdateEventListener[] { timestamper };&lt;br /&gt;nhConfig.EventListeners.PreInsertEventListeners = new NHibernate.Event.IPreInsertEventListener[] { timestamper };&lt;br /&gt;return nhConfig.BuildSessionFactory();&lt;br /&gt;&lt;/pre&gt;
    
&lt;p&gt;Mohli by sme ich tu zaregistrovať viac než dosť, keďže
priradzujeme pole event listernerov. Mohli by sme si zostaviť celú radu
listenerov takto:&lt;/p&gt;
	
&lt;pre&gt;nhConfig.EventListeners.PreUpdateEventListeners = new NHibernate.Event.IPreUpdateEventListener[] {&lt;br /&gt;	timestamper, id_generator, some_other_listener, nonsense_generator, ...&lt;br /&gt;};&lt;br /&gt;...&lt;/pre&gt;
	
&lt;p&gt;Ale to hádam všetci vieme :-)&lt;/p&gt;
	&lt;h2&gt;Ako to funguje&lt;/h2&gt;
	
&lt;p&gt;Naša
NHibernate IPreInsertEventListener a IPreUpdateEventListener
implementujúca trieda je asi najzaujímavejšia časť z toho čo som tu
uviedol. Preto som k jej kódu pripojil aj čísla riadkov, aby sa mi na
ňu lepšie komentovalo. (Ak vám čísla riadkov prekážajú pri copy-paste
robote, vedzte, že nie je prečo robiť paniku: Visual Studio má
schopnosť &lt;b&gt;stĺpcovej editácie&lt;/b&gt; a tak si pokojne vložte
kód aj s číslami do Visual Studia a potom stlačte a držte Alt a myškou
označte celý stĺpec čísel a tabulátorov. Zmažeme a práca hotová.)&lt;/p&gt;
	
&lt;p&gt;Najprv
však v skratke popíšem všetko ostatné a prečo sme to nakódovali tak ako
sme to nakódovali a nie nejak ináč (v článku uvedenom na spodku blogu
je uvedený trošku iný príklad používajúci IAuditable interface (ak sa
nemýlim)). Využitím vlastnej atribúty a neskôr reflection mechanizmu
získame flexibilitu - naše modelové triedy nemusia implementovať žiaden
konkrétny interface, ich DateTime vlastnosti nemusia mať také-či-onaké
konkrétne predpísané meno, ale je celkom na nás, ktorú vlastnosť
označíme našou atribútou. Ak by sme časom odpojili náš
IPreInsertEventListener / IPreUpdateEventListener od NHibernate
(rozhodli sa nepoužiť NHibernate na udržiavanie časových známok
(rozhodneme sa použiť default values na databázových poliach, resp.
databázové trigger-y alebo inú metódu), naše modelové triedy môžu
pokojne zostať nezmenené, pretože atribúty ani nemusíme odobrať - ak
nie sú nikým využité, nevadí.&lt;/p&gt;
	
&lt;p&gt;Náš listener sa dá jednoducho
zapojiť / odpojiť z mechanizmu NHibernate, ako sme videli vyššie.
Samozrejme si podobným spôsobom môžeme naprogramovať iné &lt;i&gt;aspekty&lt;/i&gt;
našej aplikácie a pripojiť ich do mechanizmu. V našej aplikécii sa
začne diať mágia :-) Tieto listenery musíme zapojiť do NHibernate
konfigurácie ešte pred požiadaním o konštrukciu ISessionFactory.&lt;/p&gt;
	
&lt;p&gt;Implementácia
našej vlastnej attribúty je jednoduchá, stačí (ako pri každej vlastnej
atribúte) vytvoriť uzavretú - sealed - triedu dediacu od
System.Attribute a dodať tých pár základných riadkov. Komentár utratím
už len na nôtu tohto riadku:&lt;/p&gt;
	
&lt;pre&gt;[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]&lt;/pre&gt;
	
&lt;p&gt;Obmedzíme
použitie našej atribúty na vlastnosti (čiže aby sme nimi neokrašľovali
triedy / metódy atď.) a tiež aby sa mohla uplatniť len jedna atribúta
thoto typu na jednu vlatnosť (property). Bol by to chaos, keby môžeme
anotovať vlastnosť dvoma protichodnými atribútami:&lt;/p&gt;
	
&lt;pre&gt;[AutoUpdatedTimestamp]&lt;br /&gt;[AutoUpdatedTimestamp(InsertOnly=true)]&lt;br /&gt;public virtual DateTime MyProperty;&lt;/pre&gt;
	
&lt;p&gt;Náš zázračný listener by nevedel čo s takou vlastnosťou.&lt;/p&gt;
	
&lt;p&gt;Náš
listener TimestampOnInsertUpdate na prvých dvanástich riadkoch len
implementuje metódy, ktoré musí, sú predpísané v
IPreInsertEventListener / IPreUpdateEventListener interface-och. Z
oboch metód zavolá magickú metódu AutoUpdateTimestamps a pošle jej to
čo treba na celý trik. To sú argumenty entity, persister, state a
isUpdate. Entity je náš modelový objekt ktorého stav sa snažíme vopchať
do databázy. Persister je objekt zodpovedný za vykonanie samotného
úkonu (emituje SQL príkaz(y)), state je aktuálny stav entity, ktorý
NHibernate extrahoval z entity a pokúsi sa ho persistovať (uchovať v
databáze) pomocou persisteru. Booleanská hodnota isUpdate len informuje
o tom, či sa koná insert alebo update (potrebné pre vlastnosti kde
atribúta má vlastnosť InsertOnly=true).&lt;/p&gt;
	
&lt;p&gt;Riadok 15 získa z
entity všetky vlastnosti typu DateTime. Riadok 16 prezrie tieto
vlastnosti a vyberie z nich len tie, ktoré sme označili atribútou
AutoUpdatedTimestamp. Ďalej, ak v tomto bode entita nemá žiadne
pre-náš-listerner zaujímavé vlastnosti unikáme z metódy s návratovou
hodnotou true - všetko OK - vybavené.&lt;/p&gt;
	
&lt;p&gt;Ďalej, od riadku 22 sa
venujeme tomu aby sme pri update-ovaní nemenili vlastnosti označené ako
InsertOnly. Vyfiltrujeme ich preč, aby sme nemenili to čo nemáme.&lt;/p&gt;
	
&lt;p&gt;Na
riadku 32 sa znova pozrieme, či máme čo meniť, ak nie, padáme preč s
pozitívnou správou TRUE. Ďalej už je takmer všetko jasné: zaobstaráme
si timestamp (r.35) a ideme na vec - každej vhodnej vlastnosti zmeníme
hodnotu na aktuálnu časovú známku (1.)priamo na entite r.41, (2.) v
stave entity (argument state), ktorý bude persisterom zapísaný do
databázy r.40.&lt;/p&gt;
	
&lt;p&gt;Na zmenu stavu entity si zavoláme na pomoc malú
metódku r.51, ktorá za pomoci informácií o persisterovi nastaví správnu
časť objeku state na patričnú hodnotu.&lt;/p&gt;
	
&lt;p&gt;Krok na riadku 41 je
veľmi dôležitý: ako vysvetľuje stránka uvedená na spodku tohto článku,
vynechaním tohto kroku by sme si mohli privodiť veľa veľa starostí
debugovaním ťažko nájditeľných problémov. Hoci na databázovom servri by
sme mali časovú známku nastavenú správne, nebola by v synchróne so
stavom našej entity (náš objektový model by nebol zhodný s modelom
persistovaným v našej databáze), čo by očividne mohlo napáchať škodu v
rámci aplikácie. (Alebo aj nie, ak máme šťastie... radšej ani
neskúšajme.)&lt;/p&gt;
	
&lt;p&gt;A to je všetko. Je to &lt;i&gt;v podstate&lt;/i&gt; celé
jednoduché ako detská hračka, len človek sa samozrejme nenarodil s
inštinktívnou znalosťou NHibernate a C#, tak si pomáhame blogmi ako
tento. Dúfam, že som niekomu pomohol. Happy coding!&lt;/p&gt;
    
&lt;p&gt;
      Niektoré časti tejto implementácie boli založené na kóde nájdenom v tomto
      článku:&amp;nbsp;&lt;a href="http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx" target="_blank" title="linka sa otvorí v novom okne"&gt;Ayende Rahien a jeho článok o IPreInsertEventListener a IPreUpdateEventListener&lt;/a&gt;
    &lt;/p&gt;



		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306859" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/nhibernate/default.aspx">nhibernate</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/.net/default.aspx">.net</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/timestamps/default.aspx">timestamps</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/ipreinserteventlistener/default.aspx">ipreinserteventlistener</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/ipreupdateeventlistener/default.aspx">ipreupdateeventlistener</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/orm/default.aspx">orm</category></item><item><title>Twitter status s pomocou jQuery </title><link>http://blog.aspnet.sk/devcrumbs/archive/2010/12/16/twitter-status-s-pomocou-jquery.aspx</link><pubDate>Thu, 16 Dec 2010 20:10:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306858</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306858</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2010/12/16/twitter-status-s-pomocou-jquery.aspx#comments</comments><description>&lt;p&gt;Malá&amp;nbsp; ukážka práce s Twitter API (užívateľský status), jQuery, a&amp;nbsp;cross‑origin AJAX volaniami. Keď si chcete kamsi decentne umiestniť svoj (alebo niečí iný)
najaktuálnejší Twitter status, stačí vám malá troška JavaScriptu a
zázrak je hotový.&lt;/p&gt;
    &lt;ul&gt;&lt;li&gt;Na svojom (alebo niekoho iného) twittri nazrite do zdroju stránky (View Source / View Page Source) vyhľadajte &lt;span style="font-weight:bold;text-decoration:underline;"&gt;&amp;quot;id&amp;quot;:&lt;/span&gt; a okopírujte si vaše ID. &lt;sub&gt;Ozaj neviem z kade ho inač vykopať.&lt;/sub&gt;&lt;br /&gt;
    [napr. moje id je 44183405]
      &lt;/li&gt;&lt;li&gt;Požiadajte twitter API o statusy napríklad takto:&lt;br /&gt;
        &lt;a href="http://twitter.com/statuses/user_timeline/44183405.xml" target="_blank"&gt;http://twitter.com/statuses/user_timeline/44183405.xml&lt;/a&gt;
      &lt;/li&gt;&lt;li&gt;Alebo takto:&lt;br /&gt;
        &lt;a href="http://twitter.com/statuses/user_timeline/44183405.json" target="_blank"&gt;http://twitter.com/statuses/user_timeline/44183405.json&lt;/a&gt;&lt;br /&gt;
JSON sa mi viac pozdáva a dá sa z neho jednoducho vykopať to čo
potrebujeme v prípade, že výsledok spracuvávame v JavaScriptovej
funkcii (čo predpokladám) &lt;/li&gt;&lt;li&gt;Ak sa vám zdá byť navrátených dobrôt priveľa, stačí prikvačiť na koniec požiadavky
      parameter ?count=2&lt;br /&gt;
        &lt;sub&gt;Prečo práve 2? Čo vám ja viem? jeden nefunguje (vracia sa prázdny výsledok), dva vám
        dá práva jeden posledný Tweet. Tak žiadajme o dva.&lt;/sub&gt;
      &lt;/li&gt;&lt;/ul&gt;
	&lt;hr /&gt;
  &lt;p&gt;Za
predpokladu teda, že vo vašej web stránke máte zapojené jQuery a chcete
načítať svoj status do span-u s ID &amp;quot;twitter-status&amp;quot;, bude vám stačiť
nasledovných pár riadkov:&lt;/p&gt;
  &lt;pre&gt;$(function(){&lt;br /&gt;  $.getJSON(&amp;quot;http://twitter.com/statuses/user_timeline/44183405.json?count=2&amp;amp;callback=?&amp;quot;,&lt;br /&gt;    function(data){&lt;br /&gt;      $(&amp;quot;#twitter-status&amp;quot;).text(data[0].text);&lt;br /&gt;    });&lt;br /&gt;  });&lt;/pre&gt;
  &lt;p&gt;&lt;a href="http://www.perhac.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=195" title="otvori s av novom okne-zalozke" target="_blank"&gt;Na tejto adrese nájdete tento príspevok aj s funkčnou ukážkou vyššie-uvedeného príkladu.&lt;/a&gt;&lt;/p&gt;
  
  &lt;p&gt;Na
tomto príklade je ešte jedna vec hodná povšimnutia: keďže AJAX
požiadavky musia byť vždy cieľené na server, z ktorého stránka prišla
(aby sa zabránilo rôznym cross-site scripting (XSS) attack-om)
teoreticky by toto nemalo byť možné. jQuery sa s týmto obmedzením
vysporiadalo tak, že stačí na záver URL pridať &amp;amp;callback=? jQuery
si potom namiesto otáznička dosadí názov vygenerovaného callbacku,
ktorý použije aby umožnilo cross-origin resource request. Samá mágia.
Ešteže nám stačí vedieť toľko, že pripojením magického slovka na záver
URL môžeme spytovať rôzne Web API ako twitter, flickr, facebook etc. a
nelámať hlavu nad nepeknými obchádzkami cez server-side proxies a tak
ďalej.&lt;/p&gt;
  &lt;p&gt;Dúfam, že spokojní, nie je toho veľa. Nemám čo dodať. Snažím sa radšej poradiť &lt;i&gt;veľa&lt;/i&gt; zaujímavého, než &lt;i&gt;málo&lt;/i&gt; do hĺbky rozbrblaného.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Programujem. Dobrovoľne a s piesňou na perách.&lt;/p&gt;
  &lt;p&gt;&lt;a href="http://www.perhac.com/"&gt;Peter Perhac (personal website, [SK])&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href="http://pperhac.blogspot.com/"&gt;Peter Perhac (blog on programming [EN])&lt;/a&gt;&lt;/p&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306858" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/javascript/default.aspx">javascript</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/web+development/default.aspx">web development</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/status/default.aspx">status</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/twitter/default.aspx">twitter</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/web+api/default.aspx">web api</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/jquery/default.aspx">jquery</category></item><item><title>NHibernate - konfigurácia a chytáky</title><link>http://blog.aspnet.sk/devcrumbs/archive/2010/12/15/nhibernate-konfigur-225-cia-a-chyt-225-ky.aspx</link><pubDate>Wed, 15 Dec 2010 22:38:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306853</guid><dc:creator>DevCrumbs</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/devcrumbs/rsscomments.aspx?PostID=306853</wfw:commentRss><comments>http://blog.aspnet.sk/devcrumbs/archive/2010/12/15/nhibernate-konfigur-225-cia-a-chyt-225-ky.aspx#comments</comments><description>Práve sa mi podarilo prísť na to, prečo mi môj malý skúšobný programík
s NHibernate nechcel ani za svet fungovať. Prv než zabudnem ako som
problém vyriešil a na čo všetko som cestou k riešeniu naďabil, chcel by
som si o tom urobiť záznam.&lt;br /&gt;
Problém spočíval v tom, že nech som sa snažil ako som sa snažil, stále
NHibernate vyhadzoval chybu &amp;quot;NHibernate.MappingException: No persister
for &amp;lt;class name&amp;gt;&amp;quot;.&lt;br /&gt;
Užil som si pekné trápenie hľadaním problému. Preliezol som internet
krížom-krážom a našiel viacero možných príčin pre toto chybové
hlásenie, ale &amp;quot;no joy&amp;quot;. Dosť frustrujúci bol fakt, že v práci pracujem
na projekte, kde úspešne mapujem s NHibernate a všetko klape. Prezrel
som niekoľko hodín video tutoriálov, prečítal niekoľko kratších aj
dlhších textov na NHibernate/Hibernate a už-už som si začínal myslieť,
že všetkému rozumiem, keď tu som doma narazil hlavou do steny a nemohol
som sa s NHibernate ani pohnúť. Neustále sa NHibernate sťažovalo na &amp;quot;No
persister for...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size:x-large;"&gt;Možné príčiny chyby NHibernate.MappingException&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size:x-large;"&gt;&lt;span style="font-size:large;"&gt;Message: No persister for &amp;lt;class name&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size:large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size:large;"&gt;Chýba mapovací súbor (mapping file)&lt;/span&gt;&lt;/h3&gt;Proste
ste ho ešte nevytvorili alebo ste ho vytvorili mimo Visual Studio a
nepridali ste mapovací súbor do svojho projektu pomocou Solution
Explorer-u.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size:small;"&gt;&lt;b&gt;Možné riešenia&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Uistite sa, že teda naozaj mapovací súbor pre danú entitu máte v
projekte. Je to XML súbor s názvom v tvare
&amp;quot;MenoMapovanejEntity.hbm.xml&amp;quot;. Pokiaľ sa nemýlim, v názve súboru
ne*musí* byť meno mapovanej entity, ale musí mať koncovku &amp;quot;.hbm.xml&amp;quot;
(hibernate mapping.xml). V jednom mapovacom XMLku môžete mať
zmapovaných niekoľko entít naraz, ale neodporúča sa to, aby ste sa
potom vyhli chaosu.&lt;br /&gt;
Pokiaľ tento súbor existuje niekde v zložkách projektu, skontrolujte
ešte či vo Visual Studiu váš projekt zahŕňa tento súbor. V Solution
Exploreri kliknite na ikonku Show All Files, navigujte k mapovaciemu
súboru, urobte jeden pravý klik :-) a zvoľte Include in Project.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size:large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size:large;"&gt;Build Action nastavená na Content&lt;/span&gt;&lt;/h3&gt;Jeden
z ďalších dôvodov prečo sa vám NHibernate môže stále sťažovať, že No
persister for... môže byť práve taký, že hoci mapovací súbor máte, aj
je Included vo vašom projekte, jeho Build Action je ešte stále
nastavená na &amp;quot;Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Toto musíte v okne Properties zmeniť na Embedded Resource, aby sa váš
xml súbor vkompiloval do výstupného .dll alebo .exe. Skontrolujte si,
či ste nastavili Embedded resource pre všetky vaše .hbm.xml mapping
files.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size:large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size:large;"&gt;NHibernate konfigurácia nevie v ktorej knižnici (assembly) má hľadať mapovacie info&lt;/span&gt;&lt;/h3&gt;Ďalšia
často odporúčaná rada pri problémoch tohto typu je pridať element
mapping do session-factory konfigurácie v NHibernate konfiguračnej
sekcii vášho app.config súboru (ak teda je vaša NHibernate konfigurácia
umiestnená práve tam).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Vlastne, pokiaľ ste si zvolili metódu konfigurácie založenú na XML, tak
je jedno ci máte nastavenia v nejakom zvlášť súbore, či v ako sekciu v
app.config. Budete v nich potrebovať element mapping.&lt;br /&gt;
&amp;lt;hibernate-configuration xmlns=&amp;quot;urn:nhibernate-configuration-2.2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;session-factory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;... /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mapping assembly=&amp;quot;Kniznica&amp;quot;/&amp;gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/session-factory&amp;gt;&lt;br /&gt;
&amp;lt;/hibernate-configuration&amp;gt;&lt;br /&gt;
Tento element uvediete v poradí až posledný, každopádne po všetkých
&amp;quot;property&amp;quot; elementoch, ktoré nastavujú NHibernate session factory. Nič
viac v ňom nie je potrebné, len názov knižnice (assembly), ktorá
obsahuje mapované triedy a do ktorej sú vkompilované mapovacie súbory
.hbm.xml. NHibernate to pomôže v tom, že bude pri zavolaní metódy
Configure() vedieť ktorej knižnice sa ujať a prezrieť jej metadata.&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size:large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="font-size:large;"&gt;NHibernate.Cfg.Configuration objekt nie je nakonfigurovaný&lt;/span&gt;&lt;/h3&gt;Tento
problém ma strašil niekoľko hodín. Kôli tomuto som sa vlastne odhodlal
napísať tento článok. Aj keď máte úplne všetko pre NHibernate nastavené
tak ako sa patrí a všetky mapovania máte namapované správne a
pozapájané do svojho projektu podľa všetkých múdrych rád, stále je
šanca že vám nič z toho nebude fungovať a že sa vám NHibernate stále
bude sťažovať, že No persister for... Ešte aj Stack Trace je
zavádzajúci. Popreklínal som si tvorcov NHibernate dosť keď som zistil
v čom bol problém.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Riešenie&lt;/b&gt;&lt;br /&gt;
Problém môže byť v tom ako si vytvárate NHibernate ISessionFactory. Tak napríklad mne sa podarilo nasledovné:&lt;br /&gt;
&lt;pre&gt;var nhConfig = new NHibernate.Cfg.Configuration();&lt;br /&gt;ISessionFactory sessionFactory = nhConfig.BuildSessionFactory();&lt;/pre&gt;Problém
spočíval v tom, že hoci som svoj nový objekt NHibernate kofigurácie
vytvoril, nenakonfiguroval som ho zavolaním metódy Configure(). Možno
mi jedného dňa niekto vysvetlí, prečo volanie funkcie
BuildSessionFactory v nanakofigurovanom stave nevedie k
InvalidOperationException. Hore-uvedený kód krásne funguje, teda okrem
toho, že pri prvom pokuse o získanie perzistentnej entity cez interface
ISession (volaním metódy Load, Get, etc...) sa NHibernate sťažuje na No
persister for... Kôli tomuto čudesnému správaniu som zabil niekoľko
hodín vŕtaním sa v mojom kóde a prezeraním konfigurácií a mapovacích
súborov a vlastností projektových súborov. Pri tom jediné, čo bolo
treba urobiť pre odstránenie problému, bolo zavolať Configure() na
objekte Configuration &lt;i&gt;skôr&lt;/i&gt; než ho požiadame o vytvorenie ISessionFactory.&lt;br /&gt;
&lt;pre&gt;var nhConfig = new NHibernate.Cfg.Configuration().Configure();&lt;br /&gt;...&lt;/pre&gt;&lt;p&gt;Paráda,
tak a je po problémoch. Kto narazí na NHibernate.MappingException so
správou &amp;quot;No persister for...&amp;quot; a má v projekte všetko podľa vyššie
uvedených rád, ozvite sa mi, rád sa pokúsim pomôcť, resp. ak máte
riešenie, tak popis problému aj s riešením môžeme pripísať na zoznam.&lt;br /&gt;
Veselé kódovanie!
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;
  &lt;p&gt;Programujem. Dobrovoľne a s piesňou na perách.&lt;/p&gt;
  &lt;p&gt;&lt;a href="http://www.perhac.com/"&gt;Peter Perhac (personal website, [SK])&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href="http://pperhac.blogspot.com/"&gt;Peter Perhac (blog on programming [EN])&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306853" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/nhibernate/default.aspx">nhibernate</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/probl_26002300_233_3B00_my/default.aspx">probl&amp;#233;my</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/mappingexception/default.aspx">mappingexception</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/chyt_26002300_225_3B00_ky/default.aspx">chyt&amp;#225;ky</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/mapping/default.aspx">mapping</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/chyby/default.aspx">chyby</category><category domain="http://blog.aspnet.sk/devcrumbs/archive/tags/.net/default.aspx">.net</category></item></channel></rss>