<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Banter bloguje</title>
    <link>http://blog.zvestov.cz/</link>
    <description></description>
    <language>cs</language>           
    <generator>Nucleus CMS v3.24</generator>
    <copyright>© 2007 Banter</copyright>             
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://blog.zvestov.cz/nucleus/nucleus2.gif</url>
      <title>Banter bloguje</title>
      <link>http://blog.zvestov.cz/</link>
    </image>
    <item>
 <title>Pokora</title>
 <link>http://blog.zvestov.cz/item/130</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="http://www.flickr.com/photos/bantercz/5881370465/in/set-72157627070334676"><img src="http://farm6.staticflickr.com/5184/5881370465_db32f1a045_m.jpg" /></a></div>Jedna z praktických <a href="http://blog.zvestov.cz/item/116">náboženských myšlenek, kterých se ateistům nedostává</a>, je pokora. Steve Biddulph v <a href="http://www.kosmas.cz/detail.asp?cislo=164279&afil=1102">Knize o mužství</a> píše, že bychom měli mít na paměti následující body.<br />
<br />
<ol style="margin: 0 0 0 12em"><li>Jednou zemřeš.</li><li>Život je těžký.</li><li>Nejsi tak důležitý.</li><li>Ve tvém životě nejde o tebe.</li><li>Konečný výsledek nemáš ve svých rukou.</li></ol><br />
<br />
Při programování nemusíme být tak hlubokomyslní, nicméně mějme na paměti slova Jeffa Atwooda (autora <a href="http://www.stackoverflow.com">stackoverflow.com</a>) z příspěvku <a href="http://www.codinghorror.com/blog/2006/03/sucking-less-every-year.html">Sucking Less Every Year</a><i>Měli byste být nespokojení se svým kódem, který jste napsali před rokem. Pokud nejste, znamená to že<br />
<br />
&nbsp;A) nic jste se za poslední rok nenaučili<br />
&nbsp;B) váš kód nelze vylepšit<br />
&nbsp;C) nikdy se nevracíte ke svému starému kódu<br />
<br />
Všechny možnosti jsou pro softwarového vývojáře polibkem smrti.</i>]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/130#c</comments>
 <pubDate>Thu, 16 May 2013 23:19:46 +0200</pubDate>
</item>
<item>
 <title>Práce není druhá rodina</title>
 <link>http://blog.zvestov.cz/item/129</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="http://www.flickr.com/photos/bantercz/8359394768/in/photostream"><img src="http://farm9.staticflickr.com/8089/8359394768_a0dafa22dc_m.jpg" /></a></div>Když jsem psal, že jako mariňáci <a href="http://blog.zvestov.cz/item/115">máte znát své kolegy</a>, nemyslel jsem, že se jim máte cpát do soukromého života a jejich volného času. Jsou ovšem firmy, které se tak prezentují nebo to snad dokonce dělají. Vojáci možná vstoupili do armády pro peníze, ale najdou se, doufejme, tací, které k tomu <a href="http://www.ted.com/talks/lang/cs/peter_van_uhm_why_i_chose_a_gun.html">vedly vyšší principy jako láska k vlasti a touha bránit svobodu</a>. Jde-li však do tuhého, tak nakonec bojují za kamarády ve zbrani. Takovou atmosféru se některé firmy, alespoň se mi zdá, snaží křečovitě vytvořit.Jak zmiňuje Riki Fridrich v článku <a href="http://content.fczbkk.com/ako-korporacie-lakaju-zamestnancov-a-preco-im-to-nejde/">Ako korporácie lákajú zamestnancov (a prečo im to nejde)</a> - rozhodně se jim to nepovede na teambuildingové akci. Za sebe dodávám: Je dobré jít s kolegy na oběd. Dokonce si u toho povídat, nikoliv mlčet. Další stupeň je, že se nebavíte o práci ale ani o tom, jak se kdo posledně vožral. Přesto není nad to, když si můžete povídat například o <a href="http://cs.wikipedia.org/wiki/%C4%8Cingisch%C3%A1n#.C3.9Asp.C4.9Bch_a_n.C3.A1sledky_mongolsk.C3.A9ho_ta.C5.BEen.C3.AD">mongolském tažení</a> nebo o <a href="http://zakonydokapsy.cz/">novém občanském zákoníku</a>. Jisté, spontánní akce jako jít na pivo jsou vhodný tmel. Nicméně, nesmí se z toho stát povinnost. <a href="http://www.csfotografie.cz/obsah-cs-fotografie/csf-c-15-2013.html">Robert Vano na to má vyhraněný názor</a> (ostatně jako na spoustu dalších věcí).<br />
<br />
<cite>S kamarádama třeba pracujeme celý den, jsme spolu od devíti do šesti, a pak řeknou: „Nechceš zajít na pivo?“ Já řeknu ne, já chci jít domů. A co doma? Doma budu já, já nechci jít s někým na pivo, koho vidím celý den a ještě abych ho viděl i po práci. Já rád jdu domů. Ale kdo nerad chodí domů, tak ještě chce někam jít, a přijdou domů ožralí, aby se nekoukali pravdě do očí, a pak jdou do postele, a ráno zas, a tak je to každý den a to je hrozný.</cite><br />
<br />
Práce není druhá rodina. Natož ta první. Život je jako trojnožka, přičemž nohy symbolizují rodinu, práci a čas, který máte pro sebe. Když je jedna noha kratší, jde to s vámi z kopce.]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/129#c</comments>
 <pubDate>Wed, 8 May 2013 23:00:43 +0200</pubDate>
</item>
<item>
 <title>Burgundská pečeně</title>
 <link>http://blog.zvestov.cz/item/128</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="index.php?imagepopup=1/20130501-burgundska.png&amp;width=896&amp;height=600&amp;" onclick="window.open(this.href,'imagepopup','status=no,toolbar=no,scrollbars=no,resizable=yes,width=896,height=600');return false;"><img src="http://blog.zvestov.cz/media/1/thumb_20130501-burgundska.png" width="160" height="107" alt="" title="" /><br /></a></div>Internet je plný receptů na burgundskou. Takhle mě ji ale naučil Jarda, který nám vařil během <a href="http://banter.albumino.com/albums/bretan-na-kole">cyklistického výletu v Bretani</a>, kde jsme byli s <a href="http://www.adventura.cz/">CK Adventura</a>. Do podniků z Maurerova výběru <a href="http://www.grandrestaurant.cz/">Grand-restaurant</a> jdete s očekáváním kvality. Ovšem takový standard vás při stanování v kempu příjemně zaskočí. Jen skutečný profík v polních podmínkách, na dvouhořákovém vařiči, připraví delikatesní tříchodové menu pro padesát lidí. Právě burgundská se pro podobné příležitosti hodí, tj. vaříte pro více lidí a/nebo si s nimi místo stání u sporáku chcete povídat. Stačí mít chvilku a předem si vše v klidu připravit. Navíc burgundská, podle mě, patří do kategorie: pro začátečníky.<h3>Suroviny</h3><br />
<ul><li>hovězí maso - cca 1kg (přední nebo zadní)</li><li>červené víno</li><li>mrkev - cca 1kg</li><li>česnek</li><li>cibule</li><li>konzervovaná rajčata</li><li>sůl</li><li>pepř</li><li>máslo - cca 1/3 balení</li><li>tymián</li><li>bobkový list</li><li>brambory</li></ul><br />
<br />
<h3>Postup</h3><br />
Hovězí maso omyjeme a nakrájíme na kostky o hraně zhruba 3cm. Přidáme nakrájenou mrkev, oloupané cibule (množství dle chuti) rozkrojené na polovinu. Dále oloupané stroužky česneku (množství rovněž dle chuti, každý česnek jinak píše). Osolíme, opepříme (nejlépe čerstvě mletým pepřem). Dochutíme tymiánem a bobkovým listem.<br />
<br />
Celé zalijeme červeným vínem. Jarda doporučoval Merlot (i když ten je dost ovocný), ale výběr nechám na vás. Co se týče kvality, platí, že by to mělo být takové víno, které budete k jídlu pít. Pokud stále tápete, sáhněte po nějakém základním vínu <a href="http://www.habanskesklepy.cz/cs-CZ/nase-vino,klasicka-rada.html">Habánských sklepů</a>. Měli byste je sehnat v kdejakém supermarketu.<br />
<br />
Přilijeme rozpuštěné máslo a necháme přes noc naložené na chladném místě.<br />
<br />
Druhý den přidáme rajčata z konzervy (žádnou přislazovanou kejdu, ale např. Valfrutta). Pečeme tři hodiny v troubě na 180°C v zakrytém pekáči (takový ten dvoudílný). V polních podmínkách lze i v hrnci na plotně, ale to vyžaduje větší starost (míchání). Před servírováním <a href="http://www.cuketka.cz/?p=8218">necháme trochu zchladnout</a>.<br />
<br />
Podáváme s vařeným bramborem a samozřejmě s červeným vínem, ve kterém bylo maso naložené.<br />
<br />
Dobrou chuť!]]></description>
 <category>Jídlo a pití</category>
<comments>http://blog.zvestov.cz/item/128#c</comments>
 <pubDate>Wed, 1 May 2013 23:44:44 +0200</pubDate>
</item>
<item>
 <title>JSF, Spring Security, Ajax Session Expired</title>
 <link>http://blog.zvestov.cz/item/127</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><img src="http://upload.wikimedia.org/wikipedia/en/thumb/7/75/20110510-jsf-logo.tiff/lossless-page1-200px-20110510-jsf-logo.tiff.png"></div>V <a href="http://blog.zvestov.cz/item/125">úvodu do PrimeFaces a JSF 2</a> jsem se zmínil, že používáte-li Spring Security, nepotřebujete managed beanu pro login, stačí <i>jen</i> submit javascriptem (POST request na url /j_spring_security_check). Mnohem zapeklitější je ošetření ajaxu nad vypršenou HTTP session. Nejspíš si říkáte, žádná věda. Spring Security mě prostě přesměruje na login. Taky že ano, ale v případě ajaxu dostanete jako <i>partial response</i> právě onen login formulář. View ho není schopné zpracovat a uživatel je zmaten, protože se nic neděje. Jak to vyřešit?Klíčovým bodem je implementace rozhraní <a href="http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/web/session/InvalidSessionStrategy.html">InvalidSessionStrategy</a>. Začneme tím jednodušším, pro <b>ne</b>ajaxový request zavoláme <a href="http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html#sendRedirect(java.lang.String)">HttpServletResponse#sendRedirect(String)</a>. A jak vůbec ajaxový request rozlišit? V HTTP hlavičce <i>faces-request</i> dostanete hodnotu <i>partial/ajax</i>. Pak už stačí vytvořit xml odpověď s direktivou pro přesměrování.<br />
<br />
Zbývá vyřešit několik drobností. Především ve web descriptoru musí být zaregistrován <a href="http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/web/session/HttpSessionEventPublisher.html">HttpSessionEventPublisher</a>, abyste vůbec dostávali eventy o vypršené session. Naši implementaci InvalidSessionStrategy injektujeme do filteru <a href="http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/web/session/SessionManagementFilter.html">SessionManagementFilter</a>, který zaregistrujeme na pozici <pre>before=&quot;SESSION_MANAGEMENT_FILTER&quot;</pre><br />
Problém je, že jako vedlejší efekt samotného Ajax POSTu, se InvalidSessionStrategy volá na GET requesty způsobené nějakými obrázky (přestože je to cache hit - HTTP status 304 Not Modified). Stačí neaplikovat zabezpečení na resources (css, javascript a obrázky).<br />
<pre><br />
&lt;sec:http pattern=&quot;/javax.faces.resource/**&quot; security=&quot;none&quot;/&gt;<br />
</pre><br />
<a href="index.php?imagepopup=1/20130403-ajax.png&amp;width=834&amp;height=161&amp;" onclick="window.open(this.href,'imagepopup','status=no,toolbar=no,scrollbars=no,resizable=yes,width=834,height=161');return false;"><img src="http://blog.zvestov.cz/media/1/thumb_20130403-ajax.png" width="160" height="30" alt="" title="" /><br /></a><br />
<br />
Provedete-li GET request a nejste-li autentizovaní, jste přesměrováni na login. Po úspěšném přihlášení jste ovšem opět přesměrováni, tentokrát na stránku, kterou jste původně žádali. To je standardní chování. Naše implementace má však potíž se zacyklením. Sice jste přesměrováni ale se stále stejnou, vypršenou, session. Vytvoříme tedy novou. <br />
<pre><br />
request.getSession(true);<br />
</pre><br />
<br />
S ajaxovým POSTem je to složitější. Je potřeba uživatele informovat, že došlo k vypršení session s možností prokliku na view, kde byl naposled, ačkoliv původní kontext je ztracen. View dostaneme z referera: #{header['referer']}<br />
<br />
Zde je kompletní konfigurace.<br />
<br />
<script src="https://gist.github.com/banterCZ/5160269.js"></script><br />
<noscript><br />
JsfRedirectStrategy.java<br />
<pre><br />
import org.slf4j.Logger;<br />
import org.slf4j.LoggerFactory;<br />
import org.springframework.security.web.session.InvalidSessionStrategy;<br />
import org.springframework.util.StringUtils;<br />
 <br />
import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import java.io.IOException;<br />
 <br />
/**<br />
 * Inspired by &lt;a href=&quot;http://stackoverflow.com/questions/10143539/jsf-2-spring-security-3-x-and-richfaces-4-redirect-to-login-page-on-session-tim&quot;&gt;StackOverflow.com&lt;/a&gt;<br />
 * and by &lt;a href=&quot;http://www.icesoft.org/wiki/display/ICE/Spring+Security#SpringSecurity-Step4%3AConfigureYourSpringSecurityredirectStrategy&quot;&gt;Spring Security 3 and ICEfaces 3 Tutorial&lt;/a&gt;.<br />
 *<br />
 * @author banterCZ<br />
 */<br />
public class JsfRedirectStrategy implements InvalidSessionStrategy {<br />
 <br />
    private Logger logger = LoggerFactory.getLogger(getClass());<br />
 <br />
    private static final String FACES_REQUEST_HEADER = &quot;faces-request&quot;;<br />
 <br />
    private String invalidSessionUrl;<br />
 <br />
    /**<br />
     * {@inheritDoc}<br />
     */<br />
    @Override<br />
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {        <br />
 <br />
        boolean ajaxRedirect = &quot;partial/ajax&quot;.equals(request.getHeader(FACES_REQUEST_HEADER));<br />
        if(ajaxRedirect) {<br />
            String contextPath = request.getContextPath();<br />
            String redirectUrl = contextPath + invalidSessionUrl;<br />
            logger.debug(&quot;Session expired due to ajax request, redirecting to '{}'&quot;, redirectUrl);<br />
            <br />
            String ajaxRedirectXml = createAjaxRedirectXml(redirectUrl);<br />
            logger.debug(&quot;Ajax partial response to redirect: {}&quot;, ajaxRedirectXml);<br />
 <br />
            response.setContentType(&quot;text/xml&quot;);<br />
            response.getWriter().write(ajaxRedirectXml);<br />
        } else {<br />
            String requestURI = getRequestUrl(request);<br />
            logger.debug(&quot;Session expired due to non-ajax request, starting a new session and redirect to requested url '{}'&quot;, requestURI);<br />
            request.getSession(true);<br />
            response.sendRedirect(requestURI);<br />
        }<br />
 <br />
    }<br />
 <br />
    private String getRequestUrl(HttpServletRequest request) {<br />
        StringBuffer requestURL = request.getRequestURL();<br />
 <br />
        String queryString = request.getQueryString();<br />
        if (StringUtils.hasText(queryString)) {<br />
            requestURL.append(&quot;?&quot;).append(queryString);<br />
        }<br />
 <br />
        return requestURL.toString();<br />
    }<br />
 <br />
    private String createAjaxRedirectXml(String redirectUrl) {<br />
        return new StringBuilder()<br />
                        .append(&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot;)<br />
                        .append(&quot;&lt;partial-response&gt;&lt;redirect url=\&quot;&quot;)<br />
                        .append(redirectUrl)<br />
                        .append(&quot;\&quot;&gt;&lt;/redirect&gt;&lt;/partial-response&gt;&quot;)<br />
                        .toString();<br />
    }<br />
 <br />
    public void setInvalidSessionUrl(String invalidSessionUrl) {<br />
        this.invalidSessionUrl = invalidSessionUrl;<br />
    }<br />
 <br />
}<br />
</pre><br />
<br />
security.xml<br />
<pre><br />
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;<br />
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br />
       xmlns:sec=&quot;http://www.springframework.org/schema/security&quot;<br />
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd<br />
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&quot;&gt;<br />
 <br />
    &lt;sec:http pattern=&quot;/pages/public/**&quot; security=&quot;none&quot;/&gt;<br />
    &lt;sec:http pattern=&quot;/javax.faces.resource/**&quot; security=&quot;none&quot;/&gt;<br />
 <br />
    &lt;sec:http use-expressions=&quot;true&quot; &gt;<br />
        &lt;sec:custom-filter ref=&quot;sessionManagementFilter&quot; before=&quot;SESSION_MANAGEMENT_FILTER&quot; /&gt;<br />
        &lt;sec:intercept-url pattern=&quot;/pages/protected/**&quot; access=&quot;isAuthenticated()&quot; /&gt;<br />
        &lt;sec:form-login login-page='/pages/public/login.xhtml' default-target-url=&quot;/pages/protected/index.xhtml&quot;<br />
                        authentication-failure-url=&quot;/pages/public/login.xhtml?failure=true&quot; /&gt;<br />
        &lt;sec:logout logout-success-url=&quot;/pages/public/login.xhtml&quot;/&gt;<br />
    &lt;/sec:http&gt;<br />
 <br />
    &lt;sec:authentication-manager&gt;<br />
        &lt;sec:authentication-provider&gt;<br />
            &lt;sec:user-service&gt;<br />
                &lt;sec:user name=&quot;joe&quot; password=&quot;password&quot; authorities=&quot;ROLE_USER&quot;/&gt;<br />
            &lt;/sec:user-service&gt;<br />
        &lt;/sec:authentication-provider&gt;<br />
    &lt;/sec:authentication-manager&gt;<br />
 <br />
    &lt;bean id=&quot;sessionManagementFilter&quot; class=&quot;org.springframework.security.web.session.SessionManagementFilter&quot;&gt;<br />
        &lt;constructor-arg name=&quot;securityContextRepository&quot; ref=&quot;httpSessionSecurityContextRepository&quot; /&gt;<br />
        &lt;property name=&quot;invalidSessionStrategy&quot; ref=&quot;jsfRedirectStrategy&quot; /&gt;<br />
    &lt;/bean&gt;<br />
 <br />
    &lt;bean id=&quot;jsfRedirectStrategy&quot; class=&quot;JsfRedirectStrategy&quot;&gt;<br />
        &lt;property name=&quot;invalidSessionUrl&quot; value=&quot;/pages/public/error/viewExpired.xhtml&quot; /&gt;<br />
    &lt;/bean&gt;<br />
 <br />
    &lt;bean id=&quot;httpSessionSecurityContextRepository&quot; class=&quot;org.springframework.security.web.context.HttpSessionSecurityContextRepository&quot;/&gt;<br />
 <br />
&lt;/beans&gt;<br />
</pre><br />
<br />
web.xml<br />
<pre><br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;web-app version=&quot;3.0&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;<br />
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br />
         xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&quot;&gt;<br />
 <br />
    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;<br />
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
    &lt;/servlet&gt;<br />
 <br />
    &lt;context-param&gt;<br />
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
        &lt;param-value&gt;<br />
            classpath:security.xml<br />
        &lt;/param-value&gt;<br />
    &lt;/context-param&gt;<br />
 <br />
    &lt;listener&gt;<br />
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
    &lt;/listener&gt;<br />
 <br />
    &lt;listener&gt;<br />
        &lt;listener-class&gt;org.springframework.security.web.session.HttpSessionEventPublisher&lt;/listener-class&gt;<br />
    &lt;/listener&gt;<br />
 <br />
    &lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt;<br />
    &lt;/servlet-mapping&gt;<br />
 <br />
    &lt;filter&gt;<br />
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;<br />
        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;<br />
    &lt;/filter&gt;<br />
 <br />
    &lt;filter-mapping&gt;<br />
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;<br />
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
    &lt;/filter-mapping&gt;<br />
 <br />
&lt;/web-app&gt;<br />
</pre><br />
<br />
viewExpired.xhtml<br />
<pre><br />
&lt;ui:composition template=&quot;/WEB-INF/templates/public_layout.xhtml&quot;<br />
     xmlns=&quot;http://www.w3.org/1999/xhtml&quot;<br />
     xmlns:h=&quot;http://java.sun.com/jsf/html&quot;<br />
     xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;<br />
&gt;<br />
 <br />
    &lt;ui:param name=&quot;title&quot; value=&quot;#{msg['error.viewExpired.title']}&quot; /&gt;<br />
 <br />
    &lt;ui:define name=&quot;content&quot;&gt;<br />
        #{msg['error.viewExpired.text']}<br />
        &lt;h:outputLink value=&quot;#{header['referer']}&quot;&gt;#{msg['link.back']}&lt;/h:outputLink&gt;<br />
    &lt;/ui:define&gt;<br />
&lt;/ui:composition&gt;<br />
</pre><br />
</noscript>]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/127#c</comments>
 <pubDate>Thu, 4 Apr 2013 18:45:44 +0200</pubDate>
</item>
<item>
 <title>Hořící keř</title>
 <link>http://blog.zvestov.cz/item/126</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="index.php?imagepopup=1/20130331-horici-ker.png&amp;width=573&amp;height=805&amp;" onclick="window.open(this.href,'imagepopup','status=no,toolbar=no,scrollbars=no,resizable=yes,width=573,height=805');return false;"><img src="http://blog.zvestov.cz/media/1/thumb_20130331-horici-ker.png" width="113" height="160" alt="" title="" /><br /></a></div>Viděli jste už <a href="http://www.csfd.cz/film/313105-horici-ker/">Hořící keř</a>, první hraný film o Janu Palachovi? Jedná se o třídílný barevný televizní film natočený HBO. Víc než o samotném činu sebeupálení pojednává o událostech, které poté následovaly. Při sledování na vás dolehnou morální otázky, na které by si měl každý sám odpovědět. Hlavně na tu: <i>Jak bych se zachoval já?</i> Sepsal jsem několik citací, kolem kterých se mé úvahy točí.Především v týdeníku Respekt vyšel podnětný <a href="http://respekt.ihned.cz/c1-59194770-polakum-se-libi-vase-marnivost-a-amoralnost">rozhovor s režisérkou Agnieszkou Holland</a>. Věřím, že jste se u Pelíšků dosyta nasmáli, ale režisérka říká:<br />
<br />
<i>Až na Kawasakiho růži jsou všechny české filmy o normalizaci jen takové srandičky.</i><br />
<br />
A možný důvod?<br />
<br />
<i>Moje a trochu mladší generace si nechtěla přiznat, že normalizace byla trauma. Proto měla potřebu ji relativizovat v lehkém duchu.</i><br />
<br />
Jsme však ochotní boji za svobodu obětovat danou cenu?<br />
<i>Palach vyvolal veliké emotivní vzplanutí celého národa. Takovou skoro vlasteneckou exaltaci. A když opadla, lidé si najednou uvědomili, že jestli bojovat o svobodu znamená takovou oběť, tak oni nejsou ochotni ji položit. Když se měsíc poté upálil Jan Zajíc, nechtěl o tom už nikdo ani slyšet. Normalizace nastoupila nečekaně rychle. Lidé si uvědomili, že raději budou žít svůj malý konformní život.</i><br />
<br />
Což odpovídá tomu, co napsal Nelson Mandela v knize <a href="https://plus.google.com/107399094493317618479/posts/GLRPEtnM6TU">Dlouhá cesta za svobodou</a>:<br />
<br />
<i>Boj za svobodu vám postupně vezme úplně všechno. Člověk, který se ho zúčastní, je člověkem bez domova.</i><br />
<br />
Jaromír Nohavica zpívá v písni <a href="http://www.nohavica.cz/cz/tvorba/texty/ja_si_to_pamatuju.htm">Já si to pamatuju</a> <br />
<br />
<i>...<br />
zbabělce pamatuju,<br />
hrdiny pamatuju,<br />
mlčící pamatuju,<br />
…<br />
</i><br />
Přičemž to jsou právě mlčící, na kterých vše stojí a padá. V knize <a href="http://www.kosmas.cz/detail.asp?cislo=145601&amp;afil=1102">Zakázaná rétorika</a> je sice výrok o nacistickém režimu, ale lze ho vztáhnout i na ten komunistický:<br />
<br />
<i>Dějiny nacistického režimu ukazují, že připravenost podřízených osob být spolupachateli zločinu je téměř neomezená, když jim přísný řetězec příkazů a striktně ohraničené oblasti úkolů dávají pocit, že jsou jen bezvýznamným kolečkem v nepřehlédnutelně velkém soukolí. Je to typický mechanismus poslušnosti, ponořit se do nějakého úkolu v úzkých technických aspektech a ztratit (vědomě nebo nevědomě) z očí přehled o obsáhlých důsledcích. Příjemci rozkazů nepřebírají takto zodpovědnost za celek nebo výsledek, protože sami sebe vidí jenom jako mezičlánek v řetězci akcí.</i><br />
<br />
Nepřestává mě znepokojovat, jak se něco takového mohlo stát a jak to mohli ostatní dopustit. Jakkoliv si můžu krásně nalhávat cokoliv, tak nemám odpověď na otázku: <i>Jak bych se zachoval já?</i> Doufám, že se do podobné situace, kdy by pravda vyšla najevo, nikdy nedostanu.<br />
<br />
Film je <a href="http://www.hbogo.cz/redirect/11950">zdarma k vidění (jako stream) na HBO GO</a>.<br />
]]></description>
 <category>K zamyšlení</category>
<comments>http://blog.zvestov.cz/item/126#c</comments>
 <pubDate>Sun, 31 Mar 2013 20:17:51 +0200</pubDate>
</item>
<item>
 <title>Začínáme s PrimeFaces a JSF 2</title>
 <link>http://blog.zvestov.cz/item/125</link>
<description><![CDATA[<a href="http://blog.zvestov.cz/media/1/20130322-primefaces_logo.gif"></a>Frontendové frameworky javovských webových aplikací, to je bolest. Sice se javisti vymezují třeba oproti Ruby on Rails, jak jsou rychlejší, ale pak to zabijí něčím takovým, jako jsou JavaServer Faces (JSF). Nic naplat, když chcete rychle vyvíjet z dostupných komponent, jsou JSF jednou z možností. Shrnuji pár poznatků, které vám pomůžou rychlejší rozjezd projektu s JSF a knihovnou komponent PrimeFaces. Uvítám i konfrontace zkušenějších kolegů. Nejedná se o podrobný návod, spíš rozcestník.<h3>Proč PrimeFaces</h3><br />
<a href="http://www.primefaces.org">PrimeFaces</a> jsou knihovna komponent pro JSF, pod licencí Apache 2.0 Nabízí se ještě konkurenti <a href="http://www.jboss.org/richfaces">RichFaces</a> a <a href="http://www.icesoft.org/">IceFaces</a>. Prohlédněte si <a href="http://www.primefaces.org/showcase">PrimeFaces ShowCase</a>. Jako výčet pozitiv na svých stránkách uvádějí: jediný jar bez závislostí, Spring Roo addon a hlavně graf z Google Trends.<br />
<a href="http://blog.zvestov.cz/media/1/20130322-trends.png"></a><br />
<br />
Doporučuji ovšem srovnat s job trends.<br />
<br />
<a href="http://blog.zvestov.cz/media/1/20130322-jobgraph.png"></a><br />
<br />
<h3>Proč ne PrimeFaces</h3><br />
Sice jsou PrimeFaces open source, ale bohužel s poslední verzí 3.5.0 ohlásili, že <a href="http://blog.primefaces.org/?p=2451">bugfixing je placený</a>. Major a minor verze (major.minor.bugfix) jsou nadále zdarma. Zaráží to s ohledem na takřka tři roky staré, neopravené, respektive prohlášené za opravené, chyby. Přitom nejde o žádný výjimečný případ použití, viz <a href="http://code.google.com/p/primefaces/issues/detail?id=1544#c23">LazyDataTable.setRowIndex throws arithmetic exception: division by 0</a>. Dále v extensions, konkrétně u dynamických formulářů, jsem nenašel ani řádek javadocu, asi si se mnou hraje na schovávanou<br />
<br />
<h3>Spring</h3><br />
JSF od verze 2 přicházejí s ViewScope, nemusíte už plývat prostředky na Session scope managed beany. Pokud ovšem chcete, aby je spravoval Spring, tak si musíte <a href="http://www.harezmi.com.tr/spring-view-scope-for-jsf-2-users/">implementovat ViewScope sami</a>. Pozor, s ViewScope budete mít  problém, pokud se třeba rozhodnete <a href="http://balusc.blogspot.cz/2011/09/communication-in-jsf-20.html#ViewScopedFailsInTagHandlers ">v ui:include použít EL</a>.<br />
<br />
Spring Security je realizováno webovým filtrem, login provádíte POST requestem na url <i>/j_spring_security_check</i> Jenže nechcete kvůli tomu mít manage beanu, že? Nepoužijete tedy <i>h:form</i>, ale normální html form a submit vyvoláte javascriptem. Spring Security a JSF to je vůbec téma na samostatný článek. Třeba o tom, <a href="http://blog.zvestov.cz/item/127">jak se řeší expirace session, tak aby to správně fungovalo i s ajaxem</a>.<br />
<br />
<h3>404 Page Not Found</h3><br />
Nepříjemně mě překvapilo, že se JSF nechovají jako webová aplikace, jak bych to od ní čekal. Pokud přistoupíte na adresu, která neexistuje, nicméně odpovídá mapování Faceletu, nedostanete http status kód <i>404 stránka nenalezena</i>, ale <i>500 vnitřní chyba serveru</i>. Je to kvůli výjimce <i>java.io.FileNotFoundException</i> Vyřeší to následující implementace filtru<br />
<br />
<script src="https://gist.github.com/banterCZ/4730442.js"></script><br />
<noscript><br />
<pre><br />
import javax.servlet.*;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import java.io.FileNotFoundException;<br />
import java.io.IOException;<br />
 <br />
/**<br />
 * This filter interprets {@link FileNotFoundException} as HTTP status code <code>404</code>.<br />
 *<br />
 * @author banterCZ<br />
 */<br />
public class FileNotFoundFilter implements Filter {<br />
 <br />
    /**<br />
     * {@inheritDoc}<br />
     */<br />
    @Override<br />
    public void init(FilterConfig filterConfig) throws ServletException {<br />
        //no code<br />
    }<br />
 <br />
    /**<br />
     * Interprets {@link FileNotFoundException} as HTTP status code <code>404</code><br />
     *<br />
     * {@inheritDoc}<br />
     */<br />
    @Override<br />
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {<br />
        if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {<br />
            throw new ServletException("FileNotFoundFilter just supports HTTP requests");<br />
        }<br />
 <br />
        doFilter((HttpServletRequest) request, (HttpServletResponse) response, filterChain);<br />
    }<br />
 <br />
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {<br />
        try {<br />
            filterChain.doFilter(request, response);<br />
        } catch (FileNotFoundException e) {<br />
            response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getRequestURI());<br />
        }<br />
    }<br />
 <br />
    /**<br />
     * {@inheritDoc}<br />
     */<br />
    @Override<br />
    public void destroy() {<br />
        //no code<br />
    }<br />
 <br />
}<br />
<br />
</pre><br />
</noscript><br />
<br />
<h3>Logování</h3><br />
V době mavenu mi nepřijde jediný jar bez závislostí jako výhoda, spíš naopak. PrimeFaces používají java.util.logging, chcete-li tedy použít například slf4j, tak musíte do logging.properties přidat SLF4JBridgeHandler z <a href="http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j">jul-to-slf4j</a><br />
<pre>handlers = org.slf4j.bridge.SLF4JBridgeHandler</pre><br />
<br />
<h3>Ignorování komentářů</h3><br />
V souborech s definicí JSF view nelze používat scripletové komentáře no a html komentáře budou vidět ve výsledné stránce. Pokud nenastavíte facelet, aby je přeskakoval.<br />
<pre><br />
&lt;context-param&gt;<br />
	&lt;param-name&gt;javax.faces.FACELETS_SKIP_COMMENTS&lt;/param-name&gt;<br />
	&lt;param-value&gt;true&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
</pre><br />
<br />
<h3>Cancel</h3><br />
Storno tlačítko pro odchod z obrazovky překvapivě volá validace v případě jejich selhání vám nedovolí odejít. Vyřešíte nastavením atributu <i>immediate="true"</i>.<br />
Pro reset formuláře má PrimeFaces šikovnou komponentu <a href="http://www.primefaces.org/showcase/ui/resetInput.jsf">resetInput</a><br />
<br />
<h3>Validace</h3><br />
Vstupní formulářové políčka mají atribut <i>maxlength</i> omezující maximální délku. To funguje, ale při stylu práce ctrl+c a ctrl+v vám nadbytečné znaky tiše ořízne. Řešením je validátor <pre>&lt;f:validateLength maximum="254" for="myField" /&gt;</pre><br />
Nejspíš budete řešit i zobrazení validačních hlášek přes komponentu <a href="http://www.primefaces.org/showcase/ui/messages.jsf">messages</a> Globální rozchodíte jistě hned, ale nezapomeňte u command buttonu přidat atribut <i>update="form_id"</i>, který zajistí aktualizuje hodnoty zpráv u jednotlivých formulářových políček.<br />
<br />
<h3>Verzování skriptů</h3><br />
Již dříve jsem psal, že máte <a href="http://blog.zvestov.cz/item/118">verzovat skipty</a>. Jsf zvolilo nešikovnou cestu přes adresáře. Např. /resources/css/1_0_2<br />
Lze se tomu vyhnout (adresář neměnit), sice nepěkným, ale funkčním zápisem.<br />
<pre>&lt;link <br />
href="#{request.contextPath}/javax.faces.resource/screen.css.xhtml?ln=css&amp;v=#{initParam['applicationVersion']}"<br />
rel="stylesheet" type="text/css" /&gt;</pre><br />
<br />
<h3>Výkon</h3><br />
Spíš dříve než později si všimnete, že se gettery volají až příliš často. Pokud by managed beany byly obyčejné POJO, tak by to nevadilo, ale možná jste provolávali přes  servisní vrstvu databázi, ne? Takže si výsledek budete cachovat do fieldu, který je ale pak někdy potřeba přenačíst... Podrobněji <a href="http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times">Why JSF calls getters multiple times</a>.<br />
<br />
<h3>Literatura</h3><br />
Papírově i pro kindle je dostupná kniha <a href="http://amzn.to/YrUWEt">PrimeFaces Cookbook</a>. Máte-li ji, přečtěte si, jinak můžete ušetřit a projít si jen <a href="https://github.com/ova2/primefaces-cookbook">příklady z knihy</a>.<br />
<br />
<h3>Závěr</h3><br />
V JSF lze obyčejné formuláře nabušit rychle a PrimeFaces vám poskytnou pěkné komponenty. I když se zpoplatněním můžou přijít o popularitu. Narazíte-li na něco nestandardního, znamená to mnohdy zásek a složité dohledávání, jak věci fungují. V té chvíli blahořečíte JSP, i když jen do té doby, než byste tam měli ručně zapojovat podobný ajaxový šavlostroj. Ideální řešení prostě neexistuje.<br />
]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/125#c</comments>
 <pubDate>Fri, 22 Mar 2013 00:37:33 +0100</pubDate>
</item>
<item>
 <title>Psi, hovna a vztahy</title>
 <link>http://blog.zvestov.cz/item/124</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="http://www.scribd.com/fullscreen/49362700"><img src="http://blog.zvestov.cz/media/1/20130309-on%20retirement.png" /></a></div>Pokaždé, když rozšlápnu nebo rozjedu psí lejno, má mé alter ego chuť v něm dotyčného majitele čtyřnohého stvoření vyválet. Občas mi to ve městě připomíná slalom mezi slepičinci u babičky na dvoře. Ovšem tento příspěvek nemá být o hovně, ale o psech, respektive o vztazích.<i>Česko zaujímá jedno z předních míst EU v rozvodech a současně mu patří druhé místo v počtu domácích zvířat na obyvatele.</i> Veterinární lékař Alexandr Skácel to komentoval slovy: „Vypadá to, že Češi ztrácejí schopnost vytvořit spokojený vztah a mnozí přicházejí na to, že je jednodušší chovat zvíře, které jim dává ničím nepodmíněnou lásku a je na ně spoleh.“ Zdroj <a href="http://respekt.ihned.cz/c1-55241360-uplynulych-sedm-dni-ocima-ivana-lampera">Uplynulých sedm dní očima Ivana Lampera</a>.<br />
<br />
Obrázek v úvodu je z díla autora Yang Liu, který/která se narodil(a) v Číně a studoval(a) v Německu. Obrazem velmi výstižně vystihuje kontrast mezi západní a asijskou kulturou, přičemž z toho nevyplývá, že by jedna z nich byla lepší. Obrázek asi nemá smysl rozpitvávat, udělejte si názor sami. Vždy si na něj vzpomenu, když vidím důchodce se psem na procházce. Bylo by škoda, aby se odkaz ztratil ve štěbetání twitteru.<br />
<p  style=" margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block;">   <a title="View East vs West Cultural Differences on Scribd" href="http://www.scribd.com/doc/49362700"  style="text-decoration: underline;" >East vs West Cultural Differences</a> by   <a title="View 's profile on Scribd" href="undefined"  style="text-decoration: underline;" ></a> </p><iframe class="scribd_iframe_embed" src="http://www.scribd.com/embeds/49362700/content?start_page=1&view_mode=scroll" data-auto-height="false" data-aspect-ratio="undefined" scrolling="no" id="doc_32219" width="100%" height="600" frameborder="0"></iframe>]]></description>
 <category>K zamyšlení</category>
<comments>http://blog.zvestov.cz/item/124#c</comments>
 <pubDate>Sat, 9 Mar 2013 17:12:57 +0100</pubDate>
</item>
<item>
 <title>Zen a umění údržby motocyklu</title>
 <link>http://blog.zvestov.cz/item/123</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><img src="http://obalky.kosmas.cz/ArticleCovers/111759.gif" /></div> Kniha <i>Zen a umění údržby motocyklu</i> není primárně o údržbě motocyklu ani o kapajícím kohoutku. Je to taková intelektuální zenová road movie, se zajímavými postoji k životu. Našel jsem tam i jeden přesah do softwarového inženýrství. Konkrétně jde o scénu, kdy autorovi v nějaké dílně „zmasakrovali“ jeho motorku. Zamýšlí se nad postojem oněch chlapíků k práci.<br />
<br />
<i>Vůbec svoji práci neprožívali. Nikdo o sobě neříkal: „Já jsem mechanik.“ Bylo vám jasné, že v pět odpoledne, nebo kdy jim ta osmihodinová směna skončí, se vším seknou a o práci pak ani myšlenkou nezavadí. Snažili se na ni nemyslet už během pracovní doby. Svým způsobem se jim tak dařila stejná věc jako Johnovi a Sylvii - žili s technikou, aniž by se jí jakkoliv zabývali. I když oni se jí vlastně zabývali, ale nevkládali do ní nic ze sebe, stáli jakoby stranou, duchem mimo. Technika se jich přímo dotýkala, ale oni nejevili sebemenší zájem.</i><br />
<br />
Nevidíte podobné postoje i ve vaší branži? V podstatě tak lze vystihnout rozdíl mezi dělníkem a řemeslníkem, ne? Jistě, nic nenamítám proti osmihodinové pracovní době, ostatně sám ji dle principů <a href="http://en.wikipedia.org/wiki/Extreme_programming_practices#Programmer_welfare">extrémního programování</a> zastávám. Ovšem být dobrý, a nejen vývojář, znamená mít o svou práci zájem.<br />
<br />
České vydání je očividně rozebrané, tak alespoň odkaz na anglický originál <a href="http://www.amazon.com/gp/product/0061673730/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0061673730&amp;linkCode=as2&amp;tag=blog0752-20">Zen and the Art of Motorcycle Maintenance</a>. Mohly by vás zajímat i další <a href="https://plus.google.com/107399094493317618479/posts/P8VnR77f3FA">citace z knihy</a>.<br />
<br />
Na závěr jedno ilustrační video.<br />
<iframe src="http://player.vimeo.com/video/30586946" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <p><a href="http://vimeo.com/30586946">MACHINE</a> from <a href="http://vimeo.com/machineshed">matt machine</a> on <a href="http://vimeo.com">Vimeo</a>.</p>]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/123#c</comments>
 <pubDate>Sun, 3 Mar 2013 21:55:08 +0100</pubDate>
</item>
<item>
 <title>Spring, JSP a IndexOutOfBoundsException</title>
 <link>http://blog.zvestov.cz/item/122</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><img src="http://static.springsource.org/images/spring_green_on_white_160x90.png" /></div>Po nějaké době praxe řešíte většinu problému rutinně, metodou kouknu a vidím. Občas je to ovšem zásek, se kterým na první pohled netušíte, jak pohnout. Tohle je jeden z takových. Měli jsme JSP formulář, který fungoval rok bez chyby. Renderoval se v pořádku, ale binding začal házet <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/IndexOutOfBoundsException.html">IndexOutOfBoundsException</a>. Ale přitom na modelu byl field typu <i>java.util.List</i> Už máte řešení? Tak to asi znáte Spring jako své boty.<h3>Řešení</h3><br />
Pes je zakopaný v <a href="http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/validation/DataBinder.html#setAutoGrowCollectionLimit(int)">DataBinder.html#setAutoGrowCollectionLimit(int)</a> a jeho výchozím nastavení na 256 kvůli prevenci OutOfMemoryErrors.<br />
<br />
<script src="https://gist.github.com/banterCZ/4754235.js"></script><br />
<noscript><br />
<pre><br />
import org.springframework.beans.factory.annotation.Value;<br />
import org.springframework.stereotype.Controller;<br />
import org.springframework.web.bind.WebDataBinder;<br />
import org.springframework.web.bind.annotation.InitBinder;<br />
 <br />
/**<br />
 * @author banterCZ<br />
 */<br />
@Controller<br />
public class MyController {<br />
 <br />
    @Value("${myApplication.autoGrowCollectionLimit:1000}")<br />
    private int autoGrowCollectionLimit;<br />
 <br />
    /**<br />
     * {@link org.springframework.validation.DataBinder#DEFAULT_AUTO_GROW_COLLECTION_LIMIT} is only 256,<br />
     * but there are much more items.<br />
     * @param dataBinder<br />
     */<br />
    @InitBinder<br />
    public void initBinder(WebDataBinder dataBinder) {<br />
        dataBinder.setAutoGrowCollectionLimit(autoGrowCollectionLimit);<br />
    }<br />
 <br />
    //TODO<br />
 <br />
}<br />
</pre><br />
</noscript>]]></description>
 <category>Software Development</category>
<comments>http://blog.zvestov.cz/item/122#c</comments>
 <pubDate>Wed, 20 Feb 2013 22:19:15 +0100</pubDate>
</item>
<item>
 <title>Stát bere živnostníky s rodinou na hůl</title>
 <link>http://blog.zvestov.cz/item/121</link>
<description><![CDATA[<div style="float: left; margin: 0 1em 1em 0; text-align: center;"><a href="http://cs.wikipedia.org/wiki/Soubor:Coin-1-Kc-reverse.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Coin-1-Kc-reverse.jpg/160px-Coin-1-Kc-reverse.jpg" /></a></div>Výdajové paušály jsou, musím za sebe a IT obor přiznat, vysoké. Ovšem ušlý zisk z výběru daní kompenzovat na rodinách s dětmi mi nepřijde koncepční. Pokud uplatňujete náklady paušálem, tak za rok 2013 nebudete moc uplatnit slevu na vyživovanou manželku a na děti. Co jsem se bavil s kolegy OSVČ, tak buď tuto informaci nezaregistrovali nebo ji dokonce ignorují. Nevím jak vy, ale za manželku a dvě děti to dělá 24&nbsp;840 + 2 x 13&nbsp;404&nbsp;Kč, to státu nehodlám nechat. Obzvlášť s vidinou, že by peníze skončily třeba na dostavbě Temelína nebo podobně smysluplném projektu.Jako řešení vidím, pokud si manželka zřídí živnostenský list a bude uplatňovat reálné náklady nižší než 50 %, může si uplatnit slevy ona. Kdo se v tom chcete šťourat, je to ustanovení <a href="http://zakony.kurzy.cz/586-1992-zakon-o-danich-z-prijmu/paragraf-35ca-az-36/">§35ca zákona o daních z příjmů od roku 2013</a>.<br />
<br />
<b>EDIT:</b> Aby si manželka mohla uplatnit bonus, musí podle <a href="http://www.podnikatel.cz/zakony/zakon-c-586-1992-sb-o-danich-z-prijmu/cele-zneni/#p-35c">§ 35c</a> mít příjem alespoň ve výši šestinásobku minimální mzdy (cca 48 000,-).<br />
<br />
<b>Nejedná se o oficiální vyjádření daňového poradce, případné kroky podnikáte na vlastní zodpovědnost!</b>]]></description>
 <category>Zeď nářků</category>
<comments>http://blog.zvestov.cz/item/121#c</comments>
 <pubDate>Wed, 13 Feb 2013 22:43:26 +0100</pubDate>
</item>

  </channel>
</rss>