﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Jirka Pénzeš Blog</title><link>http://blog.penzes.cz</link><description>Blog o všedních a nevšedních věcech.</description><language>cs</language><pubDate>Mon, 06 Feb 2012 23:07:50 GMT</pubDate><copyright>(c) 2009 Jirka Pénzeš</copyright><ttl>10</ttl><item><title>Semestrální práce – Síťové kreslení</title><link>http://blog.penzes.cz/clanky/76-semestralni-prace-sitove-kresleni.aspx</link><guid>http://blog.penzes.cz/clanky/76-semestralni-prace-sitove-kresleni.aspx</guid><description>&lt;p&gt;Na univerzitě n&amp;aacute;s uč&amp;iacute; programovat v jazyku Java - snaž&amp;iacute; se tento jazyk aplikovat do v&amp;scaron;ech předmětů, kter&amp;eacute; souvis&amp;iacute; s programov&amp;aacute;n&amp;iacute;m. Samozřejmě v předmětu &amp;bdquo;&amp;Uacute;vod do jazyka C&amp;ldquo; se Java neuč&amp;iacute;. Nicm&amp;eacute;ně ve druh&amp;eacute;m ročn&amp;iacute;ku je mezi povinně voliteln&amp;yacute;mi předmět Programovac&amp;iacute; techniky jazyka Java. Tento předmět je určen pro studenty, kteř&amp;iacute; maj&amp;iacute; z&amp;aacute;jem o hlub&amp;scaron;&amp;iacute; pozn&amp;aacute;n&amp;iacute; tohoto jazyka a se z&amp;aacute;klady programov&amp;aacute;n&amp;iacute; nemaj&amp;iacute; probl&amp;eacute;m.&lt;/p&gt;
&lt;p&gt;Z&amp;aacute;počet z tohoto předmětu se skl&amp;aacute;dal z vypracovan&amp;iacute; semestr&amp;aacute;ln&amp;iacute; pr&amp;aacute;ce (program) a n&amp;aacute;sledn&amp;eacute; obh&amp;aacute;jen&amp;iacute; t&amp;eacute;to pr&amp;aacute;ce.&lt;/p&gt;
&lt;p&gt;Zad&amp;aacute;n&amp;iacute; bylo prost&amp;eacute; &amp;ndash; mělo se jednat buď o s&amp;iacute;ťovou aplikaci, aplikaci pracuj&amp;iacute;c&amp;iacute; s vl&amp;aacute;kny nebo aplikaci, kter&amp;eacute; zpracov&amp;aacute;v&amp;aacute; a nějak vyhodnocuje XML dokument. J&amp;aacute; jsem zvolil s&amp;iacute;ťovou aplikaci. Mnou zadan&amp;yacute; projekt nese n&amp;aacute;zev S&amp;iacute;ťov&amp;eacute; kreslen&amp;iacute;. Jedn&amp;aacute; se o jednoduchou aplikaci, kter&amp;aacute; umožňuje kreslen&amp;iacute; z&amp;aacute;kladn&amp;iacute;ch geometrick&amp;yacute;ch tvarů po s&amp;iacute;ti.&lt;/p&gt;
&lt;p&gt;Popis funkčnosti&lt;/p&gt;
&lt;p&gt;Aplikace je trivi&amp;aacute;ln&amp;iacute; &amp;ndash; funguje na principu klient/server, tj. pouze dva &amp;uacute;častn&amp;iacute;ci. Komunikace prob&amp;iacute;h&amp;aacute; pomoc&amp;iacute; př&amp;iacute;kazů, kter&amp;eacute; určuj&amp;iacute;, co se m&amp;aacute; nakreslit   &lt;br /&gt;obecn&amp;yacute; parametr:     &lt;br /&gt;TYP_OBRAZCE BARVA TLOUSTKA_STETCE PARAMETRY_KRESLENI[]    &lt;br /&gt; &lt;br /&gt;Aplikace um&amp;iacute; pos&amp;iacute;lat i obr&amp;aacute;zky, i když vykreslen&amp;iacute; trochu trv&amp;aacute; &amp;ndash; vykresluje po ř&amp;aacute;dc&amp;iacute;ch. Vět&amp;scaron;ina operac&amp;iacute; (kreslen&amp;iacute;, komunikace a posluchači) běž&amp;iacute; ve vl&amp;aacute;knech, samotn&amp;aacute; aplikace ale nen&amp;iacute; na procesor moc n&amp;aacute;ročn&amp;aacute;.&lt;/p&gt;
&lt;p&gt;Jednotliv&amp;eacute; tř&amp;iacute;dy (architektura)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DemoApp&lt;/strong&gt; &amp;ndash; inicializuje panel a spou&amp;scaron;t&amp;iacute; celou aplikaci    &lt;br /&gt;&lt;strong&gt;DemoFrame&lt;/strong&gt; &amp;ndash; samotn&amp;eacute; okno aplikace obsahuj&amp;iacute;c&amp;iacute; menu a instanci pl&amp;aacute;tna    &lt;br /&gt;&lt;strong&gt;Platno&lt;/strong&gt; &amp;ndash; kresl&amp;iacute;c&amp;iacute; pl&amp;aacute;tno    &lt;br /&gt;&lt;strong&gt;Client&lt;/strong&gt; &amp;ndash; obstar&amp;aacute;v&amp;aacute; klientskou komunikaci (poslouchac&amp;iacute; vl&amp;aacute;kno)    &lt;br /&gt;&lt;strong&gt;Server&lt;/strong&gt; &amp;ndash; obstar&amp;aacute;v&amp;aacute; serverou č&amp;aacute;st (poslouchac&amp;iacute; vl&amp;aacute;kno)    &lt;br /&gt;&lt;strong&gt;ConnectStatus&lt;/strong&gt; - třida, kter&amp;aacute; v&amp;iacute;, zda se komunikuje, nekomunikuje nebo jestli se n&amp;aacute;hodou nedokomunikovalo :-)     &lt;br /&gt;&lt;strong&gt;CommandsCollection&lt;/strong&gt; &amp;ndash; Datov&amp;aacute; struktura, kter&amp;aacute; přij&amp;iacute;m&amp;aacute; a odeb&amp;iacute;r&amp;aacute; př&amp;iacute;kazy (synchronizovan&amp;aacute;)     &lt;br /&gt;&lt;strong&gt;Algorithm&lt;/strong&gt; &amp;ndash; Obsahuje pomocn&amp;eacute; algoritmy kreslen&amp;iacute; (v&amp;yacute;počet Lagrangeho polynomu, sem&amp;iacute;nkov&amp;eacute; vyplňov&amp;aacute;n&amp;iacute; a XOR režim kreslen&amp;iacute;)    &lt;br /&gt;&lt;strong&gt;DrawGeometry&lt;/strong&gt; &amp;ndash; statick&amp;aacute; tř&amp;iacute;da, kter&amp;aacute; um&amp;iacute; kreslit jednotliv&amp;eacute; &amp;uacute;tvary&lt;/p&gt;
&lt;p&gt;V neposledn&amp;iacute; řadě tu je pak samotn&amp;yacute; bal&amp;iacute;ček obsahuj&amp;iacute;c&amp;iacute; tř&amp;iacute;dy jako Rect, Polygon, Line a dal&amp;scaron;&amp;iacute; &amp;uacute;tvary. Tyto tř&amp;iacute;dy v&amp;iacute;, jak&amp;eacute; parametry oček&amp;aacute;vat a jak z nich c&amp;iacute;len&amp;yacute; &amp;uacute;tvar vytvořit.&lt;/p&gt;
&lt;p&gt;K&amp;oacute;du je to kupa a div&amp;iacute;m se, že to vůbec funguje, nicm&amp;eacute;ně započet i zkou&amp;scaron;ku m&amp;aacute;m.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="../files/images/2010/08/NetPainting.png" alt="S&amp;iacute;ťov&amp;eacute; kreslen&amp;iacute;" /&gt;&lt;/p&gt;</description><pubDate>Fri, 20 Aug 2010 23:05:02 GMT</pubDate></item><item><title>Práce s šablony ve WPF</title><link>http://blog.penzes.cz/clanky/75-prace-s-sablony-ve-wpf.aspx</link><guid>http://blog.penzes.cz/clanky/75-prace-s-sablony-ve-wpf.aspx</guid><description>&lt;p class="MsoNormal"&gt;Kr&amp;aacute;tk&amp;eacute; sezn&amp;aacute;men&amp;iacute; s&amp;nbsp;vytv&amp;aacute;řen&amp;iacute;m &amp;scaron;ablon (template) ve Windows Presentation Foundation. V&amp;nbsp;uk&amp;aacute;zce je vysvětlena aplikace &amp;scaron;ablony na tlač&amp;iacute;tko, vytvořen&amp;iacute; reakce na my&amp;scaron;, n&amp;aacute;sledn&amp;eacute; zanimovan&amp;iacute; a odsunut&amp;iacute; &amp;scaron;ablony do statick&amp;yacute;ch zdrojů, pro př&amp;iacute;padn&amp;eacute; dal&amp;scaron;&amp;iacute; použit&amp;iacute;.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Odkazy: &lt;a href="http://cid-8c714c29dbc31857.office.live.com/self.aspx/MSTV/DemoTemplate.rar?sa=319971710"&gt;zdrojov&amp;eacute; k&amp;oacute;dy&lt;/a&gt;, &lt;a href="http://www.mstv.cz/vyvojari/videos/471/Sablony-ve-WPF"&gt;video na mstv.cz&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://www.mstv.cz/vyvojari/videos/471/Sablony-ve-WPF" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;iframe src="http://www.mstv.cz/player/471/Sablony-ve-WPF" width="480" height="397" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;
</description><pubDate>Dat, 07 Aug 2010 17:18:56 GMT</pubDate></item><item><title>Návrhový vzor Prototyp (Prototype)</title><link>http://blog.penzes.cz/clanky/72-navrhovy-vzor-prototyp-prototype.aspx</link><guid>http://blog.penzes.cz/clanky/72-navrhovy-vzor-prototyp-prototype.aspx</guid><description>&lt;p&gt;Dal&amp;scaron;&amp;iacute;m n&amp;aacute;vrhov&amp;yacute;m vzorem, po boku vzoru &lt;a href="http://blog.penzes.cz/clanky/70-navrhovy-vzor-jedinacek-singleton.aspx"&gt;Singleton&lt;/a&gt;, je &lt;strong&gt;Prototyp&lt;/strong&gt;, kter&amp;yacute; tak&amp;eacute; spad&amp;aacute; do kategorie &lt;strong&gt;vytv&amp;aacute;řej&amp;iacute;c&amp;iacute;ch&lt;/strong&gt; vzorů, tedy &lt;strong&gt;creational design patterns&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pokud m&amp;aacute;me složitou inicializaci objektů, tedy dlouh&amp;yacute; strojov&amp;yacute; čas proveden&amp;iacute; inicializace - vyplat&amp;iacute; se objekty od sebe navz&amp;aacute;jem kop&amp;iacute;rovat, tedy vytv&amp;aacute;řet &lt;strong&gt;klony&lt;/strong&gt;. Pr&amp;aacute;vě na t&amp;eacute;to my&amp;scaron;lence je postaven &lt;strong&gt;Prototyp&lt;/strong&gt;. Mějme např&amp;iacute;klad nějak&amp;yacute; vytvořen&amp;yacute; objekt, a pokud chceme vytvořit dal&amp;scaron;&amp;iacute; instanci stejn&amp;eacute; typu =&amp;gt; prvn&amp;iacute; si naklonujeme. T&amp;iacute;m obejdeme dal&amp;scaron;&amp;iacute; inicializaci.  V&amp;yacute;hody klonov&amp;aacute;n&amp;iacute; jsou nesčetn&amp;eacute;, můžeme např&amp;iacute;klad vyt&amp;aacute;hnout data z kolekce jako kopii a d&amp;aacute;le s touto kopi&amp;iacute; pracovat a měnit ji, aniž bychom měnili hodnoty v jin&amp;eacute; č&amp;aacute;sti programu.&lt;/p&gt;
&lt;h2&gt;Implementace Prototypu v jazyce C#.NET&lt;/h2&gt;
&lt;p&gt;Klov&amp;aacute;n&amp;iacute; se prov&amp;aacute;d&amp;iacute; za pomoci implementace rozhran&amp;iacute; &lt;strong&gt;ICloneable&lt;/strong&gt;, kter&amp;eacute; n&amp;aacute;m implementuje jednu metodu - &lt;strong&gt;Clone&lt;/strong&gt;&lt;strong&gt;()&lt;/strong&gt;, kter&amp;aacute; je bezparametrick&amp;aacute; a vrac&amp;iacute; n&amp;aacute;m obecn&amp;yacute; &lt;strong&gt;objekt&lt;/strong&gt; (nejedn&amp;aacute; se tedy o generick&amp;eacute; rozhran&amp;iacute;). Metoda je typu &lt;strong&gt;public&lt;/strong&gt; a může b&amp;yacute;t vol&amp;aacute;na jen v r&amp;aacute;mci tř&amp;iacute;dy nebo z modulu, kter&amp;yacute; danou tř&amp;iacute;du obsahuje.&lt;/p&gt;
&lt;p&gt;Možnost&amp;iacute; implementace metody &lt;strong&gt;Clone()&lt;/strong&gt; je v&amp;iacute;ce. My si zde uk&amp;aacute;žeme dva způsoby.&lt;/p&gt;
&lt;p&gt;Prvn&amp;iacute; způsob využ&amp;iacute;v&amp;aacute; syst&amp;eacute;mov&amp;eacute;ho klonov&amp;aacute;n&amp;iacute;, kter&amp;eacute; je přebran&amp;eacute; ze tř&amp;iacute;dy Object, neboť každ&amp;yacute; objekt je děděn od t&amp;eacute;to tř&amp;iacute;dy - můžeme toho tedy &amp;scaron;ikovně využ&amp;iacute;t a použ&amp;iacute;t již hotovou dobrou implementaci.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Prototype : ICloneable
{
    // N&amp;aacute;zev objektu
    private String _nazev;

    // Veřejn&amp;yacute; kontruktor pro vytvořen&amp;iacute; tř&amp;iacute;dy
    public Prototype(String nazev)
    {
        // Nastaven&amp;iacute; stavu
        this._nazev = nazev;
    }

    // Getter a setter
    public String Nazev
    {
        get { return _nazev; }
        set { _nazev = value; }
    }

    // Rozhran&amp;iacute; ICloneable
    #region ICloneable Members

    // Klonovac&amp;iacute; metoda Clone()
    public object Clone()
    {
        // Vytvořen&amp;iacute; objektu 
        Object c = null;
            
        // Test implementace metody
        try
        {
            // Vytvořen&amp;iacute; kopie pomoc&amp;iacute; děděn&amp;eacute; metody
            c = base.MemberwiseClone();
        }
        catch (NotImplementedException e)
        {
            // Pokud nen&amp;iacute; implementov&amp;aacute;na metoda Clone - vyj&amp;iacute;mka
            Console.WriteLine(e.Message);
        }

        // N&amp;aacute;vrat kopie
        return c;
    }

    #endregion
}
&lt;/pre&gt;
&lt;p&gt;Dal&amp;scaron;&amp;iacute;m způsobem je vytvořen&amp;iacute; &lt;strong&gt;nov&amp;eacute;&lt;/strong&gt; instance za pomoci &lt;strong&gt;priv&amp;aacute;tn&amp;iacute;ho&lt;/strong&gt; &lt;strong&gt;kontruktoru&lt;/strong&gt;, kter&amp;yacute; je přizpůsoben&amp;yacute; požadavkům klonov&amp;aacute;n&amp;iacute;. T&amp;eacute;to možnosti je dobr&amp;eacute; využ&amp;iacute;t tehdy, chceme-li m&amp;iacute;t klonov&amp;aacute;n&amp;iacute; v&amp;iacute;ce pod kontrolou nebo pokud chceme s klonovan&amp;yacute;m objektem je&amp;scaron;tě něco prov&amp;eacute;st.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Rozhran&amp;iacute; ICloneable
#region ICloneable Members

// Priv&amp;aacute;tn&amp;iacute; kontruktor pro vytvořen&amp;iacute; kopie
private Prototype(Prototype o)
{
    // Kopie stavů objektu
    this._nazev = o.Nazev;
}

// Klonovac&amp;iacute; metoda Clone()
public object Clone()
{
    // Vytvořen&amp;iacute; nov&amp;eacute; instance (kopie)
    return new Prototype(this);
}

#endregion
&lt;/pre&gt;</description><pubDate>Fri, 30 Jul 2010 20:48:25 GMT</pubDate></item><item><title>Návrhový vzor jedináček (Singleton)</title><link>http://blog.penzes.cz/clanky/70-navrhovy-vzor-jedinacek-singleton.aspx</link><guid>http://blog.penzes.cz/clanky/70-navrhovy-vzor-jedinacek-singleton.aspx</guid><description>&lt;p&gt;Pokud chceme ps&amp;aacute;t pěkn&amp;eacute; aplikace, tedy z pohledu k&amp;oacute;du, je dobr&amp;eacute; dodržovat jak&amp;eacute;si standardy. V dne&amp;scaron;n&amp;iacute; době celkem h&amp;yacute;be světem pojem OOP, neboli &lt;strong&gt;objektově orientovan&amp;eacute; programov&amp;aacute;n&amp;iacute;&lt;/strong&gt;. Do tohoto odvětv&amp;iacute; spad&amp;aacute; spousty různ&amp;yacute;ch praktik a pravidel, kter&amp;eacute; zlep&amp;scaron;uj&amp;iacute; čitelnost k&amp;oacute;du a zvy&amp;scaron;uj&amp;iacute; vět&amp;scaron;&amp;iacute; abstrakci aplikace. Mimo jin&amp;eacute; sem patř&amp;iacute; takzvan&amp;eacute; &lt;strong&gt;&amp;bdquo;n&amp;aacute;vrhov&amp;eacute; vzory&amp;ldquo; &lt;/strong&gt;(ang. &lt;strong&gt;design patterns&lt;/strong&gt;). Jedn&amp;aacute; se o jak&amp;eacute;si obecn&amp;eacute; ře&amp;scaron;en&amp;iacute; probl&amp;eacute;mu. Nejedn&amp;aacute; se o ž&amp;aacute;dn&amp;eacute; hotov&amp;eacute; &amp;uacute;tržky k&amp;oacute;dů či hotov&amp;eacute; knihovny, kter&amp;eacute; by se př&amp;iacute;mo vložili do na&amp;scaron;&amp;iacute; aplikace. Jedn&amp;aacute; se jakousi architekturu, nebo sp&amp;iacute;&amp;scaron;e l&amp;eacute;pe řečeno &amp;ndash; popis ře&amp;scaron;en&amp;iacute; probl&amp;eacute;mu nebo &amp;scaron;ablonu. Nen&amp;iacute; zde ž&amp;aacute;dn&amp;aacute; konkr&amp;eacute;tn&amp;iacute; implementace, proto můžou b&amp;yacute;t n&amp;aacute;vrhov&amp;eacute; vzory použity v libovoln&amp;yacute;ch situac&amp;iacute;ch.&lt;/p&gt;
&lt;p&gt;Mezi nejzn&amp;aacute;měj&amp;scaron;&amp;iacute; a asi nejpouž&amp;iacute;vaněj&amp;scaron;&amp;iacute; (možn&amp;aacute; pro svou jednoduchost) patř&amp;iacute; n&amp;aacute;vrhov&amp;yacute; vzor Jedin&amp;aacute;ček (angl. &lt;strong&gt;Singleton&lt;/strong&gt;). Jedn&amp;aacute; se o n&amp;aacute;vrhov&amp;yacute; vzor spadaj&amp;iacute;c&amp;iacute; do kategorie &lt;strong&gt;Creational patterns&lt;/strong&gt;, tedy vzory t&amp;yacute;kaj&amp;iacute;c&amp;iacute; se tvorby objektů.&lt;/p&gt;
&lt;p&gt;N&amp;aacute;vrhov&amp;yacute; vzor Jedin&amp;aacute;ček je typick&amp;yacute; t&amp;iacute;m, že instance nějak&amp;eacute; tř&amp;iacute;dy může b&amp;yacute;t v cel&amp;eacute;m programu &lt;strong&gt;pr&amp;aacute;vě a jen jednou&lt;/strong&gt;. T&amp;eacute;to v&amp;yacute;hody, že v cel&amp;eacute; aplikaci funguje pouze &lt;strong&gt;1 objekt&lt;/strong&gt; dan&amp;eacute; tř&amp;iacute;dy se může velmi dobře využ&amp;iacute;t, např&amp;iacute;klad při z&amp;iacute;sk&amp;aacute;v&amp;aacute;n&amp;iacute; informac&amp;iacute; mezi objekty. Typick&amp;yacute;m př&amp;iacute;kladem dobr&amp;eacute; implementace Jedin&amp;aacute;čka je schr&amp;aacute;nka ve Windows, kde se data mohou přesouvat mezi aplikacemi, přičemž schr&amp;aacute;nka může existovat jen jedna.&lt;/p&gt;
&lt;p&gt;Pojďme se pod&amp;iacute;vat na implementaci Jedin&amp;aacute;čka v jazyce &lt;strong&gt;&lt;em&gt;C#.NET&lt;/em&gt;&lt;/strong&gt;. Předvedeme si tři způsoby, kde každ&amp;yacute; způsob je něč&amp;iacute;m speci&amp;aacute;ln&amp;iacute;.&lt;/p&gt;
&lt;h2&gt;Singleton&lt;/h2&gt;
&lt;p&gt;Prvn&amp;iacute; implementace je typick&amp;aacute; t&amp;iacute;m, že se inicializace statick&amp;eacute;ho objektu vně tř&amp;iacute;dy prov&amp;aacute;d&amp;iacute; až při prvn&amp;iacute;m vol&amp;aacute;n&amp;iacute; t&amp;eacute;to instance.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Singleton
{
    // statick&amp;yacute; objekt
    private static Singleton instance;

    // priv&amp;aacute;tn&amp;iacute; konstruktor
    // nelze z venku zavolat vytvořen&amp;iacute; objektu
    // to n&amp;aacute;m zaruč&amp;iacute; jedinečnost instance v programu
    private Singleton() { }

    // metoda, kter&amp;aacute; n&amp;aacute;m vr&amp;aacute;t&amp;iacute; instanci tř&amp;iacute;dy
    public static Singleton Instance
    {
        get
        {
            // kontrola, zda instance byla již vytvořena
            if (instance == default(Singleton))
            {
                // pokud instance nen&amp;iacute;, vytvoř&amp;iacute; se
                instance = new Singleton();
            }
            // vr&amp;aacute;t&amp;iacute; instanci
            return instance;
        }
    }

}
&lt;/pre&gt;
&lt;h2&gt;Statick&amp;aacute; inicializace&lt;/h2&gt;
&lt;p&gt;V prvn&amp;iacute;m př&amp;iacute;kladu se instance vytvoř&amp;iacute; až při prvn&amp;iacute;m vol&amp;aacute;n&amp;iacute;. Pokud ale chceme vytvořit instanci již při startu aplikace &amp;ndash; mus&amp;iacute;me k&amp;oacute;d lehce pozměnit tak, aby byla statick&amp;aacute; inicializace objektu. Zde se o v&amp;scaron;e postar&amp;aacute; o CLR. Kromě toho je proměnn&amp;aacute; označena kl&amp;iacute;čov&amp;yacute;m slov&amp;iacute;čkem &lt;strong&gt;Readonly&lt;/strong&gt;, to n&amp;aacute;m zaručuje, že je určena pouze ke čten&amp;iacute; a lze j&amp;iacute; přiřadit pouze při statick&amp;eacute; inicializaci nebo v kontruktoru. Nev&amp;yacute;hodou zde možn&amp;aacute; je jen to, že nad vytv&amp;aacute;řen&amp;iacute;m nem&amp;aacute;me takovou kontrolu. Tato implementace je &lt;strong&gt;doporučov&amp;aacute;na&lt;/strong&gt; při vytv&amp;aacute;řen&amp;iacute; implementace Jedin&amp;aacute;čka.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Singleton
{
    // vytvořen&amp;iacute; statick&amp;eacute; instance
    private static readonly Singleton instance = new Singleton();

    private Singleton() { }

    // metoda vracej&amp;iacute;c&amp;iacute; instanci tř&amp;iacute;dy
    public static Singleton Instance
    {
        get
        {
            // nyn&amp;iacute; se již nemus&amp;iacute;me pt&amp;aacute;t, zda instance již byla vytvořena
            // je zde statick&amp;aacute; inicializace
            return instance;
        }
    }

}
&lt;/pre&gt;
&lt;h2&gt;V&amp;iacute;cevl&amp;aacute;knov&amp;yacute; př&amp;iacute;stup&lt;/h2&gt;
&lt;p&gt;Pokud se pod&amp;iacute;v&amp;aacute;me na předchoz&amp;iacute; implementace Singletona a budeme jej cht&amp;iacute;t nasadit ve v&amp;iacute;cevl&amp;aacute;knov&amp;eacute; aplikaci &amp;ndash; může nastat probl&amp;eacute;m. Pod&amp;iacute;vejme se na prvn&amp;iacute; implementaci. Pakliže zavol&amp;aacute; vytv&amp;aacute;řen&amp;iacute; instance Jedin&amp;aacute;čka jedno vl&amp;aacute;kno, kter&amp;eacute; po chvilce přepne (aniž by dokončilo svůj proces) na vl&amp;aacute;kno druh&amp;eacute;, kter&amp;eacute; tak&amp;eacute; pož&amp;aacute;d&amp;aacute; o instanci jedin&amp;aacute;čka. Mohou vzniknout dvojčata a to je již proti pravidlům tohoto n&amp;aacute;vrhov&amp;eacute;ho vzoru a tak&amp;eacute; je to pro n&amp;aacute;s než&amp;aacute;douc&amp;iacute;. Jak se tomuto probl&amp;eacute;mu tedy vyhnout? Mus&amp;iacute;me zde navrhnout nějakou &lt;strong&gt;synchronizaci&lt;/strong&gt;&amp;nbsp; - nab&amp;iacute;z&amp;iacute; se zde ře&amp;scaron;in&amp;iacute; pomoc&amp;iacute; komplexn&amp;iacute; synchronizace tov&amp;aacute;rn&amp;iacute; tř&amp;iacute;dy, nicm&amp;eacute;ně můžeme využ&amp;iacute;t modern&amp;iacute;ch n&amp;aacute;strojů, kter&amp;eacute; synchronizaci vyře&amp;scaron;&amp;iacute; za n&amp;aacute;s &amp;ndash; tedy použit&amp;iacute; kl&amp;iacute;čov&amp;eacute;ho slůvka &lt;strong&gt;volatile&lt;/strong&gt;. Značně n&amp;aacute;m to u&amp;scaron;etř&amp;iacute; pr&amp;aacute;ci.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Singleton
{
    // tentokr&amp;aacute;t dopň&amp;iacute;me kl&amp;iacute;čov&amp;eacute; slůvko volatile
    // volatile n&amp;aacute;m zaruč&amp;iacute; synchronizaci
    private static volatile Singleton instance;

    // připraven&amp;iacute; z&amp;aacute;mku
    private static object zamek = new Object();

    // opět priv&amp;aacute;tn&amp;iacute; konstruktor
    private Singleton() { }

    public static Singleton Instace
    {
        get
        {
            // kontrola vytvořen&amp;iacute; instance
            if (instance == null)
            {
                // použit&amp;iacute; z&amp;aacute;mku, aby ke bloku k&amp;oacute;du přistupovalo
                // pouze jedno vl&amp;aacute;kno
                lock (zamek)
                {
                    // opětovn&amp;aacute; kontrola instance
                    if (instance == null)
                        instance = new Singleton();
                }
            }

            // n&amp;aacute;vrat instance
            return instance;
        }
    }
}
}
&lt;/pre&gt;</description><pubDate>Sun, 25 Jul 2010 01:20:34 GMT</pubDate></item><item><title>Vytváření hashů SHA-1 a MD5 v jazyce C#.NET</title><link>http://blog.penzes.cz/clanky/69-vytvareni-hashu-sha-1-a-md5-v-jazyce-c-net.aspx</link><guid>http://blog.penzes.cz/clanky/69-vytvareni-hashu-sha-1-a-md5-v-jazyce-c-net.aspx</guid><description>&lt;p&gt;Pokud vytv&amp;aacute;ř&amp;iacute;te aplikace, ve kter&amp;eacute; chcete někter&amp;aacute; data hashovat (zpravidla přihla&amp;scaron;ovac&amp;iacute; &amp;uacute;daje uživatelů). Mus&amp;iacute;te s&amp;aacute;hnout po někter&amp;eacute;m &amp;scaron;ifrovac&amp;iacute;m algoritmu nebo si vytvořit &amp;scaron;ifrovac&amp;iacute; algoritmus vlastn&amp;iacute;.&lt;/p&gt;
&lt;p&gt;Zaměřme se např&amp;iacute;klad na zmiňovan&amp;eacute; uživatelsk&amp;eacute; &amp;uacute;daje a v&amp;yacute;hody použit&amp;iacute; hashů na tyto informace. Pokud m&amp;aacute;te internetovou aplikaci, kde hesla ukl&amp;aacute;d&amp;aacute;te do datab&amp;aacute;ze př&amp;iacute;mo &amp;ndash; m&amp;aacute;te &lt;strong&gt;nebezpečnou&lt;/strong&gt; aplikaci. Kdyby při&amp;scaron;el nějak&amp;yacute; z&amp;aacute;keřn&amp;yacute; &amp;uacute;točn&amp;iacute;k a např&amp;iacute;klad pomoc&amp;iacute; techniky &lt;strong&gt;&lt;em&gt;SQL-Injection&lt;/em&gt;&lt;/strong&gt; by napadl va&amp;scaron;i datab&amp;aacute;zi a z&amp;iacute;skal tato data. Mohl by ovl&amp;aacute;dnout &lt;strong&gt;v&amp;scaron;echny&lt;/strong&gt; uživatelsk&amp;eacute; &amp;uacute;čty. Tento čern&amp;yacute; sc&amp;eacute;n&amp;aacute;ř je hrůzou každ&amp;eacute;ho tvůrce internetov&amp;yacute;ch aplikac&amp;iacute;. Lze mu ale předej&amp;iacute;t, resp. &amp;uacute;točn&amp;iacute;kovi velmi znepř&amp;iacute;jemnit pr&amp;aacute;ci pomoci hashov&amp;aacute;n&amp;iacute; hesel. Při přihla&amp;scaron;ov&amp;aacute;n&amp;iacute; se pak porovn&amp;aacute;vaj&amp;iacute; zmiňovan&amp;eacute; hashe a nikdo skutečn&amp;aacute; hesla nezn&amp;aacute;.&lt;/p&gt;
&lt;p&gt;V dne&amp;scaron;n&amp;iacute; době se nejv&amp;iacute;ce použ&amp;iacute;v&amp;aacute; &amp;scaron;ifrovac&amp;iacute; algoritmus&lt;strong&gt; SHA-1&lt;/strong&gt; a star&amp;scaron;&amp;iacute; &lt;strong&gt;MD5&lt;/strong&gt;. Na tyto dva algoritmy se pod&amp;iacute;v&amp;aacute;me.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="../files/images/2010/06/sha1_md5.png" alt="Hashe" /&gt;&lt;/p&gt;
&lt;h2&gt;SHA-1 (Secure Hash Algorithm -1)&lt;/h2&gt;
&lt;p&gt;Jedn&amp;aacute; o algoritmus z kolekce Secure Hash Algorithm (odtud n&amp;aacute;zev SHA). Vytv&amp;aacute;ř&amp;iacute; se 160 bitov&amp;yacute; obraz s maxim&amp;aacute;ln&amp;iacute; d&amp;eacute;lkou 2^64  - 1 bitů. Tento algoritmus je založen&amp;yacute; na poznatc&amp;iacute;ch z algoritmů MD4 a MD5. Algoritmus byl sice již prolomen, nicm&amp;eacute;ně na prolomen&amp;iacute; hashe potřebujete takov&amp;yacute; stroj, kter&amp;yacute; by se popral se složitost&amp;iacute; 2^64. Tato v&amp;yacute;počtov&amp;aacute; n&amp;aacute;ročnost algoritmu na prolomen&amp;iacute; je ale mimo současnou techniku, takže se nen&amp;iacute; třeba b&amp;aacute;t. N&amp;aacute;stupce SHA-2 nen&amp;iacute; zat&amp;iacute;m moc zastoupen, pravděpodobně za to může slab&amp;scaron;&amp;iacute; podpora na operačn&amp;iacute;ch syst&amp;eacute;mech.&lt;/p&gt;
&lt;h2&gt;MD5 (Message-Digest algorithm 5)&lt;/h2&gt;
&lt;p&gt;Algoritmus MD5 je dnes asi nejroz&amp;scaron;&amp;iacute;řeněj&amp;scaron;&amp;iacute; &amp;scaron;ifrovac&amp;iacute;m algoritmem, i když byl již prolomen a složitost prolomen&amp;iacute; je znatelně men&amp;scaron;&amp;iacute; než u SHA-1 &amp;ndash; jedn&amp;aacute; se zde o složitost v&amp;yacute;počtu 2^33.&lt;/p&gt;
&lt;p&gt;Vytv&amp;aacute;ř&amp;iacute; se zde otisk fixn&amp;iacute; d&amp;eacute;lky (128 bitů) a velkou v&amp;yacute;hodou MD5 je, že mal&amp;aacute; změna na vstupu provede velkou změnu na v&amp;yacute;stupu. Algoritmu vdechl život Ronald Rivest v roce 1991. V modern&amp;iacute;ch bezpečnost aplikac&amp;iacute; se od tohoto algoritmu opou&amp;scaron;t&amp;iacute; a b&amp;yacute;v&amp;aacute; nahrazen někter&amp;yacute;m algoritmem z kolekce  SHA.&lt;/p&gt;
&lt;p&gt;Velk&amp;eacute; zv&amp;yacute;&amp;scaron;en&amp;iacute; bezpečnosti lze dos&amp;aacute;hnout pomoc&amp;iacute; &lt;strong&gt;kombinace&lt;/strong&gt; obou algoritmů.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;SHA1(MD5("login").MD5("heslo"))
&lt;/pre&gt;
&lt;p&gt;Pokud budeme cht&amp;iacute;t &amp;scaron;ifrovac&amp;iacute; algoritmy použ&amp;iacute;t, nemus&amp;iacute; se již zab&amp;yacute;vat jejich implementac&amp;iacute;, jelikož jsou už oba skvěle naprogramovan&amp;eacute; a jsou i souč&amp;aacute;st&amp;iacute; &lt;strong&gt;.NET Frameworku&lt;/strong&gt;, konkr&amp;eacute;tně ve jmenn&amp;eacute;m prostoru &lt;strong&gt;System.Security.Cryptography&lt;/strong&gt; &amp;ndash; proto je důležit&amp;yacute; tento prostor do aplikace přidat, pokud nechceme použ&amp;iacute;vat tečkovou notaci pro kompletn&amp;iacute; z&amp;aacute;pis objektů. &lt;br /&gt; V n&amp;aacute;sleduj&amp;iacute;c&amp;iacute;m k&amp;oacute;du je uk&amp;aacute;zka vytvořen&amp;iacute; &amp;scaron;ifry SHA-1 a MD5 v jazyce C#.NET.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class SifrovaciProgram
{
    static void Main(string[] args)
    {
        // načteme řětězec, kter&amp;yacute; chceme hashovat
        Console.Write("Zadej text: ");
        string text = Console.ReadLine();

        // připrav&amp;iacute;me si encoder
        ASCIIEncoding encoder = new ASCIIEncoding();
            
        // vstupni text prevedeme pomoci encoderu na pole bytů
        byte[] c = encoder.GetBytes(text);
            
        // vytvořen&amp;iacute; hashe SHA-1
        SHA1 sha1 = SHA1.Create();

        // metoda ComputeHash vrat&amp;iacute; pole bytů
        // toto pole pomoc&amp;iacute; statick&amp;eacute; tř&amp;iacute;dy Convert převedeme na řetězec
        string hashSHA1 = Convert.ToBase64String(sha1.ComputeHash(c));

        // vytvořen&amp;iacute; hashe MD5
        MD5 md5 = MD5.Create();
             
        // stejně jako u SHA-1 převedeme na byte[]
        string hashMD5 = Convert.ToBase64String(md5.ComputeHash(c));

        // vyp&amp;iacute;s jednotliv&amp;yacute;ch hashů
        Console.WriteLine("\nSHA-1:\t" + hashSHA1);
        Console.WriteLine("MD5:\t" + hashMD5);
            
        // konec
        Console.ReadKey();
    }
}
&lt;/pre&gt;</description><pubDate>Wed, 21 Jul 2010 18:51:16 GMT</pubDate></item><item><title>Čeština pro Visual Studio 2010 Professional</title><link>http://blog.penzes.cz/clanky/74-cestina-pro-visual-studio-2010-professional.aspx</link><guid>http://blog.penzes.cz/clanky/74-cestina-pro-visual-studio-2010-professional.aspx</guid><description>&lt;p&gt;Byl uvolněn &lt;strong&gt;česk&amp;yacute; jazykov&amp;yacute; bal&amp;iacute;ček&lt;/strong&gt; pro Visual Studio 2010. Tuto jazykovou sadu lze nainstalovat do VS2010, ov&amp;scaron;em do verze &lt;strong&gt;Professional&lt;/strong&gt;, popř.&amp;nbsp; vy&amp;scaron;&amp;scaron;&amp;iacute;. Do edice express zat&amp;iacute;m nen&amp;iacute; možn&amp;eacute; tuto sadu nainstalovat, pravděpodobně je to d&amp;aacute;no t&amp;iacute;m, že express edice nepodporuje z&amp;aacute;suvn&amp;eacute; moduly.&amp;nbsp;&lt;br /&gt;Pokud si če&amp;scaron;tinu nainstalujete, &lt;strong&gt;nemus&amp;iacute;te&lt;/strong&gt; se b&amp;aacute;t, že přijdete o&lt;strong&gt; anglickou lokalizaci&lt;/strong&gt; &amp;ndash; je možno mezi oběma jazyky&lt;strong&gt; velmi snadno přep&amp;iacute;nat&lt;/strong&gt;, bez nutnosti restartovat cel&amp;yacute; program.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Přep&amp;iacute;n&amp;aacute;n&amp;iacute; jazyků:&amp;nbsp;&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;Tools (N&amp;aacute;stroje) -&amp;gt; Options (Možnosti) -&amp;gt; Environment (Prostřed&amp;iacute;) -&amp;gt; International Settings (Mezin&amp;aacute;rodn&amp;iacute; nastaven&amp;iacute;) -&amp;gt; nab&amp;iacute;dka Language (Jazyk)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Stahovat če&amp;scaron;tinu, popř&amp;iacute;padě z&amp;iacute;skat v&amp;iacute;ce informac&amp;iacute;, můžete na &lt;a href="http://msdn.microsoft.com/cs-cz/ff799046.aspx"&gt;tomto linku&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 09 Jul 2010 13:49:29 GMT</pubDate></item><item><title>C#.NET 4.0 datový typ Dynamic - nové klíčové slovo</title><link>http://blog.penzes.cz/clanky/60-c-net-4-0-datovy-typ-dynamic-nove-klicove-slovo.aspx</link><guid>http://blog.penzes.cz/clanky/60-c-net-4-0-datovy-typ-dynamic-nove-klicove-slovo.aspx</guid><description>&lt;p&gt;Jednou z novinek &lt;strong&gt;&lt;em&gt;C#.Net 4.0&lt;/em&gt; &lt;/strong&gt;je kl&amp;iacute;čov&amp;eacute; slovo &lt;em&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;/em&gt;. Jedn&amp;aacute; se o statick&amp;yacute; typ, jehož vlastnosti a obecně implementace tohoto objektu v na&amp;scaron;&amp;iacute; aplikaci je zkoum&amp;aacute;na až za chodu programu. Použijeme-li tedy např&amp;iacute;klad neexistuj&amp;iacute;c&amp;iacute; metody &amp;ndash; kompil&amp;aacute;tor v&amp;scaron;e překousne a v&amp;yacute;jimka nastane až v samotn&amp;eacute;m chodu aplikace. Datov&amp;yacute; typ je automaticky odvozen.&lt;/p&gt;
&lt;p&gt;Jak&amp;yacute;koliv objekt může b&amp;yacute;t převeden na dynamick&amp;yacute; typ implicitně.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;static void Main(string[] args) {
        dynamic d1 = 7;
        dynamic d2 = "string";
        dynamic d3 = System.DateTime.Today;
        dynamic d4 = System.Diagnostics.Process.GetProcesses();

        int i = d1;
        string str = d2;
        DateTime dt = d3;
        System.Diagnostics.Process[] procs = d4;
}
&lt;/pre&gt;
&lt;p&gt;Chov&amp;aacute;n&amp;iacute; nov&amp;eacute;ho datov&amp;eacute;ho typu je obdobn&amp;eacute;, jako u objektu typu &lt;em&gt;Object&lt;/em&gt;. Nicm&amp;eacute;ně &lt;em&gt;dynamic&lt;/em&gt; nen&amp;iacute; kontrolov&amp;aacute;n kompil&amp;aacute;torem, což přin&amp;aacute;&amp;scaron;&amp;iacute; řadu v&amp;yacute;hod i nev&amp;yacute;hod. Pro porovn&amp;aacute;n&amp;iacute; těchto objektů se pod&amp;iacute;vejme na n&amp;aacute;sleduj&amp;iacute;c&amp;iacute; př&amp;iacute;klad.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;static void Main(string[] args) {
        dynamic dyn = 1;
        object obj = 1;

        System.Console.WriteLine(dyn.GetType());
        System.Console.WriteLine(obj.GetType());
}
&lt;/pre&gt;
&lt;p&gt;V&amp;yacute;pis by měl b&amp;yacute;t v obou př&amp;iacute;padech stajn&amp;yacute; - &lt;em&gt;System.Int32&lt;/em&gt;. Pokud ale přid&amp;aacute;me n&amp;aacute;sleduj&amp;iacute;c&amp;iacute; dva ř&amp;aacute;dky, program již nespust&amp;iacute;me. Zde zareaguje kompil&amp;aacute;tor &amp;ndash; nelze &amp;bdquo;spojit&amp;ldquo; &lt;em&gt;object&lt;/em&gt; a &lt;em&gt;integer&lt;/em&gt;. V&amp;scaron;imněte si ale, že u dynamick&amp;eacute;ho typu ž&amp;aacute;dn&amp;eacute; probl&amp;eacute;my nem&amp;aacute; a pokud druh&amp;yacute; ř&amp;aacute;dek zakomentujeme - chyba nenastane a program se spust&amp;iacute;.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;        dyn = dyn + 3;
        obj = obj + 3; //toto kompil&amp;aacute;tor již nevezme
&lt;/pre&gt;
&lt;p&gt;Pod&amp;iacute;vejme se, jak lze vytv&amp;aacute;řet instanci od tř&amp;iacute;dy, kde zvol&amp;iacute;me při instanci datov&amp;yacute; typ dynamic. Vytvořme si pro tento př&amp;iacute;klad jednoduchou tř&amp;iacute;du &lt;em&gt;Pocitadlo&lt;/em&gt;, kter&amp;aacute; um&amp;iacute; pouze inkrementaci a dekrementaci č&amp;iacute;sla, kter&amp;eacute; v sobě uchov&amp;aacute;v&amp;aacute;.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;    class Program {
        static void Main(string[] args) {
            //deklarace dynamick&amp;eacute;ho typu
            dynamic c = new Pocitadlo();

            for (int i = 0; i &amp;lt; 10; i++) {
                 c.increment();
            }
            c.decrement();

            // c.cislo = 10; - zde by za chodu programu nastala chyby
            // setter je priv&amp;aacute;tn&amp;iacute;
           

            //vyp&amp;iacute;&amp;scaron;e hodnotu 9
            Console.WriteLine("Hodnota poč&amp;iacute;tadla: " + c.cislo);
        }
    }

    class Pocitadlo {
        public int cislo { get; private set; }

        public Pocitadlo() 
        {
            cislo = 0;
        }

        public void increment() { cislo++; }

        public void decrement() { cislo--; }
    }
&lt;/pre&gt;
&lt;p&gt;Jak je vidět z uk&amp;aacute;zky k&amp;oacute;du - nad t&amp;iacute;mto typem můžeme dělat v&amp;scaron;echny klasick&amp;eacute; operace &amp;ndash; vol&amp;aacute;n&amp;iacute; metod, př&amp;iacute;stup k prvkům i vlastnostem a dal&amp;scaron;&amp;iacute;. Pokud budete k&amp;oacute;d ps&amp;aacute;t, možn&amp;aacute; si pov&amp;scaron;imnete, že nefunguje &lt;em&gt;IntelliSense&lt;/em&gt;. To je dobře, neboť &lt;em&gt;Visual Studio&lt;/em&gt; nev&amp;iacute;, o jak&amp;yacute; datov&amp;yacute; typ se jedn&amp;aacute; &amp;ndash; v&amp;scaron;e se dozv&amp;iacute; až za běhu programu a přetypov&amp;aacute;n&amp;iacute; provede implicitně za běhu programu.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="../files/images/2010/04/dynamic.png" alt="Dynamic C#.Net 4.0" /&gt;&lt;/p&gt;
&lt;p&gt;Co jsem se dočetl, tak tento datov&amp;yacute; typ je směřov&amp;aacute;n předev&amp;scaron;&amp;iacute;m pro zjednodu&amp;scaron;en&amp;iacute; př&amp;iacute;stupu k &lt;strong&gt;COM API&lt;/strong&gt;, jako je&lt;strong&gt; Office Automation API&lt;/strong&gt;, &lt;strong&gt;IronPython&lt;/strong&gt; knihovny nebo &lt;strong&gt;HTML Document Object Model&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Největ&amp;scaron;&amp;iacute; nev&amp;yacute;hodu vid&amp;iacute;m v &lt;strong&gt;nepř&amp;iacute;tomnosti extensit&lt;/strong&gt; metod. Uvid&amp;iacute;me, jak se tento typ vyvine v dal&amp;scaron;&amp;iacute;ch verz&amp;iacute;ch jazyka.&lt;/p&gt;</description><pubDate>Thu, 08 Jul 2010 18:53:06 GMT</pubDate></item><item><title>Generický vzor Singleton</title><link>http://blog.penzes.cz/clanky/73-genericky-vzor-singleton.aspx</link><guid>http://blog.penzes.cz/clanky/73-genericky-vzor-singleton.aspx</guid><description>&lt;p&gt;Byl mi položen dotaz, zda lze vytvořit takov&amp;yacute; model vzoru &lt;a href="http://blog.penzes.cz/clanky/70-navrhovy-vzor-jedinacek-singleton.aspx"&gt;Singleton&lt;/a&gt;, kter&amp;yacute; půjde použ&amp;iacute;t i jinde, resp. pro jin&amp;yacute; typ. Singleton je ale takov&amp;yacute; vzor, kter&amp;yacute; může m&amp;iacute;t pr&amp;aacute;vě jednu instanci pro cel&amp;yacute; program &amp;ndash; obecně by měl figurovat pouze jednou. Jak tady udělat nějak&amp;yacute; &lt;strong&gt;znovupoužiteln&amp;yacute;&lt;/strong&gt; &lt;a href="http://blog.penzes.cz/clanky/70-navrhovy-vzor-jedinacek-singleton.aspx"&gt;&lt;strong&gt;Singleton&lt;/strong&gt;&lt;/a&gt; v jednom programu? Na tuto ot&amp;aacute;zku si lze odpověď celkem jednodu&amp;scaron;e &amp;ndash; použijeme &lt;strong&gt;generick&amp;eacute;&lt;/strong&gt; &lt;strong&gt;typy&lt;/strong&gt; jazyka C#.NET.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Singleton where T : new()
{
    private Singleton() { }

    static class vytvoreniJedinacka
    {
        internal static readonly T instance = new T();
    }

    public static T Instance
    {
        get
        {
            return vytvoreniJedinacka.instance;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;Na ověřen&amp;iacute;, zda v&amp;scaron;echno funguje tak jak m&amp;aacute;, je zde přirpravena kr&amp;aacute;tk&amp;aacute; testovac&amp;iacute; metoda. Zkus&amp;iacute;me udělat v&amp;iacute;ce instanc&amp;iacute; a pak dva stejn&amp;eacute; typy porovnat. Pokud se budou rovnat - můžeme ř&amp;iacute;ct,  že to &amp;scaron;lape dobře.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class Program
{
    class Osoba { }

    static void Main(string[] args)
    {
        Double d1 = Singleton&amp;lt;Double&amp;gt;.Instance;
        Int16 i = Singleton&amp;lt;Int16&amp;gt;.Instance;
        Double d2 = Singleton&amp;lt;Double&amp;gt;.Instance;
        Osoba o = Singleton&amp;lt;Osoba&amp;gt;.Instance;

        if (d1 == d2)
        {
            Console.WriteLine("Jsou to stejn&amp;eacute; instance");
        }

        Console.ReadKey();

    }
}
&lt;/pre&gt;
&lt;p&gt;Z v&amp;yacute;sledku vid&amp;iacute;me, že lze vytvořit i generick&amp;yacute; Singleton, kter&amp;yacute; &lt;strong&gt;um&amp;iacute;&lt;/strong&gt; vytv&amp;aacute;řet unik&amp;aacute;tn&amp;iacute; instanci vždy pro zadan&amp;yacute; typ.&lt;/p&gt;</description><pubDate>Dat, 03 Jul 2010 11:28:03 GMT</pubDate></item><item><title>Dva nové přírůstky do knihovny - Mistrovství ve Windows Presentation Foundation a Microsoft LINQ</title><link>http://blog.penzes.cz/clanky/71-dva-nove-prirustky-do-knihovny-mistrovstvi-ve-windows-presentation-foundation-a-microsoft-linq.aspx</link><guid>http://blog.penzes.cz/clanky/71-dva-nove-prirustky-do-knihovny-mistrovstvi-ve-windows-presentation-foundation-a-microsoft-linq.aspx</guid><description>&lt;p&gt;&lt;img class="imgLeft" src="../files/images/2010/06/kniha_WPF_LINQ.png" alt="Mistrovstv&amp;iacute; ve WPF, Microsoft LINQ" /&gt;&lt;/p&gt;
&lt;p&gt;Ned&amp;aacute;vno byla na internetov&amp;eacute;m knihkupectv&amp;iacute; &lt;a href="http://knihy.cpress.cz/"&gt;Computer Press&lt;/a&gt; akce na knihy, s t&amp;eacute;matikou programov&amp;aacute;n&amp;iacute;. Někter&amp;eacute; tituly dostali slevu až ve v&amp;yacute;&amp;scaron;i &lt;strong&gt;50%&lt;/strong&gt;, a to je u někter&amp;yacute;ch draž&amp;scaron;&amp;iacute;ch kousků na ceně velmi zn&amp;aacute;t. Proto jsem nev&amp;aacute;hal a hned dvě knihy, na kter&amp;eacute; jsem měl již del&amp;scaron;&amp;iacute; dobu spadeno, objednal.&lt;/p&gt;
&lt;p&gt;Jedn&amp;aacute; se o tituly &lt;a href="http://knihy.cpress.cz/knihy/pocitacova-literatura/akce-programovani/mistrovstvi-ve-windows-presentation-foundation/"&gt;Mistrovstv&amp;iacute; ve Windows Presentation Foundation&lt;/a&gt; a &lt;a href="http://knihy.cpress.cz/knihy/pocitacova-literatura/programovani/microsoft-linq-kompletni-pruvodce-programatora/komentar/"&gt;Microsoft LINQ&lt;/a&gt;. Knihy maj&amp;iacute; pevnou vazbu a nejedn&amp;aacute; se o ž&amp;aacute;dn&amp;eacute; slab&amp;eacute; kousky.&lt;/p&gt;
&lt;h2&gt;Mistrovstv&amp;iacute; ve Windows Presentation Foundation&lt;/h2&gt;
&lt;p&gt;Už jen my&amp;scaron;lenka, že kniha spad&amp;aacute; do edice &amp;bdquo;Mistrovstv&amp;iacute;&amp;ldquo;, představuje knihu, kter&amp;aacute; v&amp;aacute;s uvede do kompletn&amp;iacute; problematiky WPF (Windows Presentation Foundation).&lt;/p&gt;
&lt;p&gt;Kniha je rozdělena do dvou z&amp;aacute;kladn&amp;iacute; č&amp;aacute;sti, jak již napov&amp;iacute;d&amp;aacute; ob&amp;aacute;lka &amp;ndash; k&amp;oacute;d a markup. V prvn&amp;iacute; č&amp;aacute;sti knihy se autor věnuje k&amp;oacute;du jazyka C#.NET. Představ&amp;iacute; vět&amp;scaron;inu komponent, vysvětl&amp;iacute; použit&amp;iacute; a v&amp;scaron;e demonstruje na spousty praktick&amp;yacute;ch př&amp;iacute;kladech. V druh&amp;eacute; č&amp;aacute;sti knihy, zhruba v polovině, se autor věnuje č&amp;aacute;sti markup, tedy jazyku XAML. V obou č&amp;aacute;stech je v&amp;scaron;e pěkně vysvětlen&amp;eacute; a d&amp;iacute;ky doprovodu spousty zdrojov&amp;yacute;ch k&amp;oacute;du a předveden&amp;eacute;. Každ&amp;aacute; č&amp;aacute;st t&amp;eacute;to knihy je d&amp;aacute;le rozdělena na několik tematick&amp;yacute;ch kapitol. Celkově na mě kniha působ&amp;iacute; zat&amp;iacute;m kladně a předev&amp;scaron;&amp;iacute;m hodně detailně obs&amp;aacute;hle, nicm&amp;eacute;ně jeden z&amp;aacute;por by tu byl.  Chyb&amp;iacute; mi, předev&amp;scaron;&amp;iacute;m v markup č&amp;aacute;sti, screeny aplikac&amp;iacute;, kter&amp;eacute; autor vytv&amp;aacute;ř&amp;iacute;. Přeci jen je WPF určeno na tvorbu grafick&amp;yacute;ch aplikac&amp;iacute; a proto mi absence uk&amp;aacute;zky hotov&amp;yacute;ch v&amp;yacute;tvorů trochu chyb&amp;iacute;.&lt;/p&gt;
&lt;h2&gt;Microsoft LINQ - Kompletn&amp;iacute; průvodce program&amp;aacute;tora&lt;/h2&gt;
&lt;p&gt;Tato knihy spad&amp;aacute; do edice &amp;bdquo;Kompletn&amp;iacute; průvodce&amp;ldquo;. Je o něco m&amp;aacute;lo slab&amp;scaron;&amp;iacute;, nežli předchoz&amp;iacute; titul. Knihu napsali dva autoři &amp;ndash; Paolo Pialorsi a Marco Russo. Kniha je velmi dobře čtiv&amp;aacute; a v&amp;scaron;e je dobře vysvětleno. LINQ je zde br&amp;aacute;n od samotn&amp;eacute;ho zač&amp;aacute;tku, takže zač&amp;aacute;tečn&amp;iacute;ci s LINQ nebudou m&amp;iacute;t probl&amp;eacute;m (i j&amp;aacute; s touto technologi&amp;iacute; zač&amp;iacute;n&amp;aacute;m). K&amp;oacute;d je zde prakticky předv&amp;aacute;děn v jazyce C#.NET a Visual Basic. Je to postaven&amp;eacute; na .NET Frameworku 3.5 &amp;ndash; na konci knihy jsou popsan&amp;yacute; novinky  v .NET 3.5, kter&amp;eacute; se nějak dot&amp;yacute;kaj&amp;iacute; pr&amp;aacute;vě technologie LINQ, jak pro jazyk C# tak VB. Kniha je zde rozdělena do &amp;scaron;esti č&amp;aacute;st&amp;iacute;: Z&amp;aacute;klady LINQ, LINQ pro relačn&amp;iacute; data, LINQ pro XML, Pokročil&amp;eacute; LINQ, LINQ v praxi a posledn&amp;iacute; kapitola jsou zmiňovan&amp;eacute; Př&amp;iacute;lohy.&lt;/p&gt;
&lt;p&gt;Můj verdikt pro tuto knihu je opět kladn&amp;yacute;. Je velmi dobře napsan&amp;eacute; a čtiv&amp;aacute;, což každ&amp;aacute; kniha nen&amp;iacute;. Zač&amp;aacute;tečn&amp;iacute;kům program&amp;aacute;torům bych až zas tak tolik nedoporučoval, neboť se zde předpokl&amp;aacute;d&amp;aacute; alespoň z&amp;aacute;kladn&amp;iacute; znalost programov&amp;aacute;n&amp;iacute; v .NET. Doporučil bych ji jinak každ&amp;eacute;mu v&amp;yacute;voj&amp;aacute;ři .NET aplikac&amp;iacute;.&lt;/p&gt;
&lt;p&gt;&lt;img class="imgRAM" src="../files/images/2010/06/kniha_WPF_LINQ2.png" alt="Mistrovstv&amp;iacute; ve WPF, Microsoft LINQ" /&gt;&lt;/p&gt;</description><pubDate>Mon, 28 Jun 2010 15:29:42 GMT</pubDate></item><item><title>Třídící algoritmus Merge Sort</title><link>http://blog.penzes.cz/clanky/68-tridici-algoritmus-merge-sort.aspx</link><guid>http://blog.penzes.cz/clanky/68-tridici-algoritmus-merge-sort.aspx</guid><description>&lt;p&gt;Jako u algoritmu &lt;a href="http://blog.penzes.cz/clanky/67-tridici-algoritmus-quicksort.aspx"&gt;QuickSort&lt;/a&gt; se jedn&amp;aacute; algoritmus pracuj&amp;iacute;c&amp;iacute; se strategi&amp;iacute; &amp;bdquo;rozděl a panuj&amp;ldquo;, ov&amp;scaron;em Merge Sort je postaven na odli&amp;scaron;n&amp;eacute;m principu. Logaritmick&amp;aacute; složitost algoritmu, by mohla napov&amp;iacute;dat o jeho velk&amp;eacute; rychlosti, ov&amp;scaron;em oproti &lt;a href="http://blog.penzes.cz/clanky/67-tridici-algoritmus-quicksort.aspx"&gt;QuickSortu&lt;/a&gt; nebo HeapSortu je pomalej&amp;scaron;&amp;iacute;. Nev&amp;yacute;hodou může b&amp;yacute;t potřeba dal&amp;scaron;&amp;iacute;ho pole o &lt;strong&gt;&lt;em&gt;N&lt;/em&gt;&lt;/strong&gt; prvků, kter&amp;eacute; Merge Sort potřebuje. Tato nev&amp;yacute;hoda lze obej&amp;iacute;t, nicm&amp;eacute;ně se velmi zkomplikuje implementace a kvůli vysok&amp;eacute; režii se algoritmus zpomal&amp;iacute;.&lt;/p&gt;
&lt;p&gt;Tento algoritmus spad&amp;aacute; do kategorie &amp;bdquo;tř&amp;iacute;děn&amp;iacute; spojov&amp;aacute;n&amp;iacute;m&amp;ldquo;, někdy je proto Merge Sort naz&amp;yacute;v&amp;aacute;n jako algoritmus sl&amp;eacute;v&amp;aacute;n&amp;iacute;.&lt;/p&gt;
&lt;p&gt;Merge Sort je implicitn&amp;iacute;m vyhled&amp;aacute;vac&amp;iacute;m algoritmem v mnoha implementac&amp;iacute;ch programovac&amp;iacute;ch jazyků &amp;ndash; např&amp;iacute;klad JAVA, Perl, Python a GNU C Library. Čast&amp;aacute; implementace je d&amp;aacute;na t&amp;iacute;m, že se jedn&amp;aacute; o velmi stabiln&amp;iacute; algoritmus, kter&amp;yacute; se l&amp;eacute;pe paralelizuje a m&amp;aacute; vy&amp;scaron;&amp;scaron;&amp;iacute; v&amp;yacute;kon na sekvenčn&amp;iacute;ch m&amp;eacute;di&amp;iacute;ch s niž&amp;scaron;&amp;iacute; př&amp;iacute;stupovou dobou.&lt;/p&gt;
&lt;p&gt;Algoritmus Merge Sort vytvořil maďarsk&amp;yacute; matematik &lt;strong&gt;John von Neumann&lt;/strong&gt;, kter&amp;yacute; mimo jin&amp;eacute; vymyslel z&amp;aacute;kladn&amp;iacute; koncepci poč&amp;iacute;tače, kter&amp;aacute; je použ&amp;iacute;v&amp;aacute;na do dnes.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="../files/images/2010/06/quickSort_slozitost.png" alt="Složitost" /&gt;&lt;/p&gt;
&lt;p&gt;Princip algoritmu&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rozděl&amp;iacute;me pole na dvě zhruba stejn&amp;eacute; č&amp;aacute;st&amp;iacute; (vzniknout n&amp;aacute;m dva probl&amp;eacute;my)&lt;/li&gt;
&lt;li&gt;Jednotliv&amp;eacute; podmnožiny seřad&amp;iacute;me (vyře&amp;scaron;&amp;iacute;me probl&amp;eacute;my)&amp;nbsp;&lt;br /&gt; 
&lt;ul&gt;
&lt;li&gt;Pokud je probl&amp;eacute;mu mnoho &amp;ndash; vyře&amp;scaron;&amp;iacute;me je rekurz&amp;iacute; (vol&amp;aacute;n&amp;iacute; bodu 1) &lt;/li&gt;
&lt;li&gt;Vyře&amp;scaron;&amp;iacute;me př&amp;iacute;mo &amp;ndash; dimenze podprobl&amp;eacute;mů je mal&amp;aacute;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; Postupně jednotliv&amp;eacute; podmnožiny (podprobl&amp;eacute;my) spoj&amp;iacute;me (slijeme) do jedn&amp;eacute; v&amp;yacute;sledn&amp;eacute; množiny dat (původn&amp;iacute; probl&amp;eacute;m) &lt;/li&gt;
&lt;/ol&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="../files/images/2010/06/mergeSort_tabulka.png" alt="Složitost" /&gt;&lt;/p&gt;
&lt;p&gt;Možn&amp;aacute; implementace algoritmu Merge Sort v jazyce C#.NET&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class MergeSort
{
    public static void setrid&amp;lt;T&amp;gt;(T[] pole) where T : IComparable
    {
        mergeSort&amp;lt;T&amp;gt;(pole, 0, pole.Length - 1);
    }

    private static void mergeSort&amp;lt;T&amp;gt;(T[] pole, int start, int konec) where T : IComparable
    {
        int s = start;
        int k = konec;

        if (s &amp;gt;= k)
        {
            return;
        }

        int prostredek = (s + k) / 2;

        mergeSort(pole, s, prostredek);
        mergeSort(pole, prostredek + 1, k);

        int i = prostredek;
        int j = prostredek + 1;

        while ((start &amp;lt;= i) &amp;amp;&amp;amp; (j &amp;lt;= k))
        {
            if (pole[s].CompareTo(pole[j]) &amp;lt; 0)
            {
                s++;
            }
            else
            {
                T Temp = pole[j];
                for (int p = j - 1;p &amp;gt;= s; p--)
                {
                    pole[p + 1] = pole[p];
                }
                pole[s] = Temp;
                s++;
                i++;
                j++;
            }
        }
    }
}
&lt;/pre&gt;</description><pubDate>Sun, 20 Jun 2010 13:50:34 GMT</pubDate></item></channel></rss>
