<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Prskavčí blog]]></title>
  <link href="http://blog.prskavec.net/atom.xml" rel="self"/>
  <link href="http://blog.prskavec.net/"/>
  <updated>2017-06-28T17:04:37+02:00</updated>
  <id>http://blog.prskavec.net/</id>
  <author>
    <name><![CDATA[Ladislav Prskavec]]></name>
    <email><![CDATA[ladislav@prskavec.net]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[JAM stack]]></title>
    <link href="http://blog.prskavec.net/2017/06/jam-stack/"/>
    <updated>2017-06-28T15:26:00+02:00</updated>
    <id>http://blog.prskavec.net/2017/06/jam-stack</id>
    <content type="html"><![CDATA[<p>Co to je <a href="https://jamstack.org/">JAM Stack</a>? To je pojmenování moderního způsobu jak vytvářet weby pomocí clientského Javascriptu, API a Markupu.</p>

<p>Tento stack není žádná novinka, ale dlouho chybělo dobré pojmenování. Nejlepší příklad většího použití podle mne je přechod <a href="https://www.smashingmagazine.com/">Smashing Magazine</a>, který pěkně poslali v <a href="https://www.netlify.com/blog/2017/03/16/smashing-magazine-just-got-10x-faster/">článku</a>.</p>

<p>Nejdůležitější věci co definují JAMstack:</p>

<ul>
<li>používá CDN</li>
<li>používá místo databáze Git</li>
<li>markup se převádí pomocí automatického buildu</li>
</ul>


<!-- more -->


<h2>Javascript</h2>

<p>Pokud máte JAMstack nemusíte rezignovat na CMS, je tu několik CMS napsaných jako Javascriptové SPA aplikace &ndash; <a href="https://headlesscms.org/">A List of Content Management Systems for JAMstack Sites</a>. Nejznámější řešení je <a href="https://www.netlifycms.org/">Netlify CMS &ndash; An open-source CMS for your Git workflow</a>, které je open source, ale i nabízená jako <a href="https://www.netlify.com/">SaaS</a>.</p>

<p>Zajímavé řešení nění jen na Javascriptu, ale například na <a href="https://getshifter.io">WordPressu</a>, kde Wordpress funguje jako CMS, ale stránky jsou staticky vygenerované. Další podobné řešení je <a href="https://forestry.io">Forestry</a> a určitě najdete další.</p>

<h2>API</h2>

<p>Samozřejmě nevystačíte jen statickými stránkami a potřebujete přidat funkce na zpracování formulářů nebo napojit na eshop. Například <a href="https://snipcart.com">Javascript Shopping Cart</a> řeší eshop a můžete využít <a href="https://serverless.com/">Serverless</a> a implementovat co potřebujete pokud využijete <a href="http://graphql.org/">GraphQL</a> a například <a href="https://www.graph.cool/">Graphcool</a> kombinuje GraphQL a AWS Lambdu i jiné FaaS.</p>

<p>Další API které se používají například v Smashing magazine a jsou <a href="https://www.netlify.com/open-source/">open source</a>.</p>

<h2>Markup</h2>

<p>Statické generátory (<a href="http://jekyllrb.com/">jekyll</a>, <a href="http://gohugo.io/">hugo</a>) jsou oblíbené a najdete jich velký seznam na <a href="https://www.staticgen.com/">Top Open-Source Static Site Generators</a>. Například Hugo je napsaný v Go langu a je velmi rychlý a stále se hodně rozvíjí. Jekyll se součást <a href="https://pages.github.com/">Github Pages</a> a proto je hodně oblíbený mezi vývojáři na Githubu.</p>

<h2>Závěr</h2>

<p>Pokud vás to zajímá tak doporučuji <a href="http://www.heavybit.com/library/podcasts/jamstack-radio/ep-1-introducing-jamstack-radio/">podcast JAMstack Radio</a>, kde je spousta zajímavých hostů a zdrojů k inspiraci.</p>

<p>Pokud si chcete popovídat o GraphQL zastavte se na <a href="https://www.meetup.com/apiaryio/events/240962821/">Hive talks</a> 11.7. v Karlíně.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Docker - multi stage build]]></title>
    <link href="http://blog.prskavec.net/2017/04/docker-multi-stage-build/"/>
    <updated>2017-04-21T08:10:00+02:00</updated>
    <id>http://blog.prskavec.net/2017/04/docker-multi-stage-build</id>
    <content type="html"><![CDATA[<p>Tato novinka je dostupná v poslední verzi Dockeru 17.05, musíte mít <a href="https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac">Edge edici</a> a se zapnutými experimentálním funkcemi, ale objeví se to v další stabilní verzi. Je pro jistotu tady je výpis z mého <code>docker version</code>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ docker version
</span><span class='line'>Client:
</span><span class='line'> Version:      17.05.0-ce-rc1
</span><span class='line'> API version:  1.29
</span><span class='line'> Go version:   go1.7.5
</span><span class='line'> Git commit:   2878a85
</span><span class='line'> Built:        Tue Apr 11 20:55:05 2017
</span><span class='line'> OS/Arch:      darwin/amd64
</span><span class='line'>
</span><span class='line'>Server:
</span><span class='line'> Version:      17.05.0-ce-rc1
</span><span class='line'> API version:  1.29 (minimum version 1.12)
</span><span class='line'> Go version:   go1.7.5
</span><span class='line'> Git commit:   2878a85
</span><span class='line'> Built:        Tue Apr 11 20:55:05 2017
</span><span class='line'> OS/Arch:      linux/amd64
</span><span class='line'> Experimental: true</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<h2>Multi stage</h2>

<p>O co vlastně jde v tom multi stage. Pokud potřebujete vyrobit image pro aplikaci, která má artefakty (C/C++, Go, Java, etc.) tak potřebujete jen malou část těch závislostí pro běh v produkci, ale při výrobě těchto artefaktů musíte nainstalovat hodně a většinou ne malých závislostí. Řešilo se to patternem builder za pomocí dvou Dockerfile souborů, ale teď existuje jednodušší řešení.</p>

<p>Řešení v jednom souboru kde máte dvě sekce, každá začíná deklarací <code>FROM</code>. Tady je ukázka pro Go lang.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>FROM golang:1.8 as builder
</span><span class='line'>
</span><span class='line'>ENV GLIDE_VERSION 0.10.2
</span><span class='line'>ENV APP_VERSION 1.0.2
</span><span class='line'>
</span><span class='line'>ADD https://github.com/Masterminds/glide/releases/download/${GLIDE_VERSION}/glide-${GLIDE_VERSION}-linux-amd64.tar.gz /tmp/glide-${GLIDE_VERSION}-linux-amd64.tar.gz
</span><span class='line'>
</span><span class='line'>RUN cd /tmp && \
</span><span class='line'>    tar -zxvf /tmp/glide-${GLIDE_VERSION}-linux-amd64.tar.gz && \
</span><span class='line'>    cp /tmp/linux-amd64/glide /usr/local/bin/glide && \
</span><span class='line'>    chmod 755 /usr/local/bin/glide && \
</span><span class='line'>    rm /tmp/glide-${GLIDE_VERSION}-linux-amd64.tar.gz && rm -rf /tmp/linux-amd64/
</span><span class='line'>
</span><span class='line'>COPY . /go/src/github.com/apiaryio/heroku-datadog-drain-go
</span><span class='line'>
</span><span class='line'>RUN cd /go/src/github.com/apiaryio/heroku-datadog-drain-go && \
</span><span class='line'>    glide install && \
</span><span class='line'>    go install
</span><span class='line'>
</span><span class='line'>FROM scratch
</span><span class='line'>COPY --from=builder /go/bin/heroku-datadog-drain-go .
</span><span class='line'>CMD ["./heroku-datadog-drain-go"]</span></code></pre></td></tr></table></div></figure>


<p>V první části se použije image golang a nainstaluje se glide (package manager) a vyrobí se binární soubor, který potom v druhé část (<code>FROM scratch</code>) se použije a pomocí <code>COPY --from=builder</code> se překopíruje artefakt z jednoho image do druhého. Pokud si image v první sekci nepojmenujete tak použijte číselné označení <code>COPY --from=0</code>.</p>

<p>Výsledné image potom vypadají takto:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
</span><span class='line'>drain               latest              7a7abced7a9d        6 seconds ago       10MB
</span><span class='line'>&lt;none&gt;              &lt;none&gt;              edabce509d75        7 seconds ago       752MB
</span><span class='line'>golang              1.8                 c0ccf5f2c036        13 days ago         703MB</span></code></pre></td></tr></table></div></figure>


<p>Máte dva image jeden pro produkci a druhý můžete klidne smazat.</p>

<h2>Závěr</h2>

<p>Tato inovace zjednodušší život mnoha lidem a je to super. Pokud si to chcete vyzkoušet můžete na <a href="http://training.play-with-docker.com/multi-stage/">webu v bez nutnosti instalovat si poslední Docker</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jenkins Declarative Pipelines]]></title>
    <link href="http://blog.prskavec.net/2016/12/jenkins-declarative-pipelines/"/>
    <updated>2016-12-20T16:52:00+01:00</updated>
    <id>http://blog.prskavec.net/2016/12/jenkins-declarative-pipelines</id>
    <content type="html"><![CDATA[<p>Dnes Jenkins <a href="https://jenkins.io/blog/2016/12/19/declarative-pipeline-beta/">zveřejnil betu</a> nového formátu pro popis Continues Delivery Pipelines.</p>

<p>Pipeline se serie kroků, které vám dovolí orchestovat práci, kterou potřebujete k buildu, testovaní a nasazení aplikace. Pipelines jsou definovány v souboru <code>Jenkinsfile</code> a je uložen v
kořenovém adresáři repozitáře projektu.</p>

<!-- more -->


<p>Stávájící formát pipelines je psaný v Groovy DSL a vypadá takto:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">node</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Preparation&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">git</span> <span class="s1">&#39;https://github.com/abtris/bee.git&#39;</span>
</span><span class='line'>      <span class="nl">poll:</span> <span class="kc">true</span>
</span><span class='line'>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Deps&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">PACKAGE</span><span class="o">=</span><span class="s2">&quot;github.com/abtris/bee&quot;</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">GOPATH</span><span class="o">=</span><span class="s2">&quot;/Users/abtris/go&quot;</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">GOROOT</span><span class="o">=</span><span class="s2">&quot;/usr/local/opt/go/libexec&quot;</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;glide --no-color install&#39;</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;mkdir -p release&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Test&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;make xunit&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Build&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>         <span class="n">parallel</span> <span class="o">(</span>
</span><span class='line'>            <span class="nl">linux64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=linux GOARCH=amd64 go build -o release/bee-linux-amd64 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">linux32:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=linux GOARCH=386 go build -o release/bee-linux-386 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">mac64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=darwin GOARCH=amd64 go build -o release/bee-darwin-amd64 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">win64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=windows GOARCH=amd64 go build -o release/bee-windows-amd64 ${PACKAGE}&quot;</span> <span class="o">}</span>
</span><span class='line'>          <span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Results&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">archive</span> <span class="s1">&#39;release/*&#39;</span>
</span><span class='line'>      <span class="n">junit</span> <span class="s1">&#39;tests.xml&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>a nový formát zjednodušuje tento zápis i pro ty kteří Groovy nevládnou a je více deklarativní s podporou pro editor, který Jenkins Blue Ocean tým vyvíjí.</p>

<p>Tady je přepsaný příklad ze shora do nového formátu.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">pipeline</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">agent</span> <span class="n">any</span>
</span><span class='line'>  <span class="n">environment</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">PACKAGE</span><span class="o">=</span><span class="s2">&quot;github.com/abtris/bee&quot;</span>
</span><span class='line'>    <span class="n">GOPATH</span><span class="o">=</span><span class="s2">&quot;/Users/abtris/go&quot;</span>
</span><span class='line'>    <span class="n">GOROOT</span><span class="o">=</span><span class="s2">&quot;/usr/local/opt/go/libexec&quot;</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="n">stages</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Preparation&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">steps</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">git</span> <span class="s1">&#39;https://github.com/abtris/bee.git&#39;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>     <span class="o">}</span>
</span><span class='line'>     <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Deps&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">steps</span> <span class="o">{</span>
</span><span class='line'>           <span class="n">sh</span> <span class="s1">&#39;glide --no-color install&#39;</span>
</span><span class='line'>           <span class="n">sh</span> <span class="s1">&#39;mkdir -p release&#39;</span>
</span><span class='line'>       <span class="o">}</span>
</span><span class='line'>     <span class="o">}</span>
</span><span class='line'>     <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Test&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">steps</span> <span class="o">{</span>
</span><span class='line'>         <span class="n">sh</span> <span class="s1">&#39;make xunit&#39;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>     <span class="o">}</span>
</span><span class='line'>     <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Build&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">steps</span> <span class="o">{</span>
</span><span class='line'>           <span class="n">parallel</span> <span class="o">(</span>
</span><span class='line'>              <span class="nl">linux64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=linux GOARCH=amd64 go build -o release/bee-linux-amd64 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>              <span class="nl">linux32:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=linux GOARCH=386 go build -o release/bee-linux-386 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>              <span class="nl">mac64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=darwin GOARCH=amd64 go build -o release/bee-darwin-amd64 ${PACKAGE}&quot;</span> <span class="o">},</span>
</span><span class='line'>              <span class="nl">win64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;GOOS=windows GOARCH=amd64 go build -o release/bee-windows-amd64 ${PACKAGE}&quot;</span> <span class="o">}</span>
</span><span class='line'>            <span class="o">)</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>     <span class="o">}</span>
</span><span class='line'>     <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Results&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">steps</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">archive</span> <span class="s1">&#39;release/*&#39;</span>
</span><span class='line'>          <span class="n">junit</span> <span class="s1">&#39;tests.xml&#39;</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>     <span class="o">}</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Celou syntaxi si můžete prohlédnout <a href="https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/SYNTAX.md">v dokumentaci</a>.</p>

<p>Hlavní rozdíl je v tom, že přidali další bloky jako je hlavní <code>pipelines</code> a je potřeba deklarovat vždy agenta, který může být v různém formátu. Vyměnilo nazvosloví a z <code>node</code> je <code>agent</code>.</p>

<p>Build můžete pustit jednoduše například v Dockeru pomocí: <code>agent docker:'node:6.3'</code> nebo pokud nechcete to řešit tak můžete dát <code>agent any</code> jako v příkladu, to se hodí například pro lokální testování a není to rozhodně vhodné pro nějaké větší nasazení, kdy potřebujete orchestrovat jednotlivé agenty.</p>

<p>Deklarace <code>environment</code> na začátku zpřehledňuje celý zápis a každá <code>stage</code> má teď <code>steps</code>, které jsou nové. Přidali sekci <code>post</code>, která má kroky <code>always</code>, <code>success</code> a <code>failure</code> pro ošetření konce buildu a poslání notifikací. Nechybí ani <code>options</code>, <code>parameters</code> a <code>triggers</code>, kde nastavíte co potřebujete.</p>

<p>I když celý tento projekt v beta fázi, přijde mi to jako krok správným směrem a spolu s čím dál lepším <a href="https://jenkins.io/blog/2016/05/26/introducing-blue-ocean/">Blue Ocean</a> to bude příští rok hlavní novinka v Jenkinsu.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jenkins 2.0 - novinky a vylepšení - 2.část]]></title>
    <link href="http://blog.prskavec.net/2016/10/jenkins-2-dot-0-novinky-a-vylepseni-2-dot-cast/"/>
    <updated>2016-10-31T10:26:00+01:00</updated>
    <id>http://blog.prskavec.net/2016/10/jenkins-2-dot-0-novinky-a-vylepseni-2-dot-cast</id>
    <content type="html"><![CDATA[<p>V minulé části jsem probíral proč je důležité mít definice v souboru a proč potřebujeme Continues Delivery Pipelines.</p>

<p>V tomto příspěvku se budu věnovat dalším bodům:</p>

<ul>
<li>distributed job across multiple nodes</li>
<li>autoscaling on traffic with lowest possible price</li>
<li>solution for caching for installations</li>
<li>docker support</li>
<li>matrix builds</li>
</ul>


<p>V Jenkinsu je podpora pro distribuované agenty, dnes můžete mít jednotlivé stroje v AWS (pomocí ec2, ec2-fleet pluginů), OpenStack, Docker, Kubernetes apod.</p>

<p>Aby jste byli schopni dosáhnou kvalitního autoscalingu za velmi dobrou cenu dají se velmi dobře využít <a href="https://aws.amazon.com/ec2/spot/">spot instance</a> od AWS. Můžete ušetřit až 90% nákladů oproti normálním instancím.</p>

<!-- more -->


<p>Pokud provozujete vlastní Jenkins je potřeba vyřešit cache, ideální řešení je <a href="https://www.jfrog.com/artifactory/">JFrog Artifactory</a>, které podporuje caching pro velké množství vývojových nástrojů. Bohužel toto řešení poměrně drahé. Ale existuje <a href="http://www.sonatype.org/nexus/">Nexus repository</a>, které má komunitní verzi. Ale bohužel v Nexus OSS chybí například podpora pro PHP Composer.</p>

<p>Matrix buildy jsou potřeba v Jenkinsu se jim říká Multi-configuration project. Můžete tu vytvořit vlatní matice podle čeho chcete a Jenkins vygeneruje potřebné projekty s parametry které potřebujete, podobně jako když by jste použili <a href="https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin">Job DSL plugin</a>. To se hodí od testovaní různých verzí operačního systému, verzí programovacího jazyka apod.</p>

<p>Poslední věc je podpora Dockeru. V Jenkinsu je několik pluginů pro Docker. Využití může být také různé. Buď to použijete na vytvoření agentů nebo přímo můžete pouštět projekt v docker containeru. Bohužel toto funguje spolehlivě jen na linuxu.</p>

<p>Takto se docker popíše v Jenkins pipelines.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">node</span><span class="o">(</span><span class="s1">&#39;docker&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'> <span class="c1">// My project sources include both build.xml and a Dockerfile to run it in.</span>
</span><span class='line'> <span class="n">git</span> <span class="s1">&#39;https://git.mycorp.com/myproject.git&#39;</span>
</span><span class='line'> <span class="c1">// Ready?</span>
</span><span class='line'> <span class="n">docker</span><span class="o">.</span><span class="na">build</span><span class="o">(</span><span class="s1">&#39;mycorp/ant-qwerty:latest&#39;</span><span class="o">).</span><span class="na">inside</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">sh</span> <span class="s1">&#39;ant dist-package&#39;</span>
</span><span class='line'> <span class="o">}</span>
</span><span class='line'> <span class="n">archive</span> <span class="s1">&#39;app.zip&#39;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hostované řešení jako je TravisCI nebo CircleCI mají výhodu pokud potřebujete začít. Ale postupem, když máte více lidí nebo potřebujete větší flexibilitu tak se můžete dostat do potíží. Jenkins je náročnější na údržbu, ale umožňuje velkou flexibilitu.</p>

<h2>Shrnutí</h2>

<p>Jenkins 2 přinesl deklarativní popis, lepší bezpečnost a stále zachoval zpětnou kompatibilitu. Vylepšené UI a tady se stále pracuje na dalších vylepšeních (Blue Ocean). S Blue Ocean potom přijde deklarativní popis continues delivery pipelines a také by měl tam být online visual editor pro pipelines. Na další rok mají plány také na přidání Configuration API a myslím, že by mohl Blue Ocean v budoucnu uplně nahradit dnešní UI a zároveň otevřít cestu pro to například kompletně používat Jenkins bez UI. Uvidíme jak to bude dlouho trvat, každopádně se už teď těším na další novinky.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jenkins 2.0 - novinky a vylepšení]]></title>
    <link href="http://blog.prskavec.net/2016/10/jenkins-2-dot-0-novinky-a-vylepseni/"/>
    <updated>2016-10-26T19:02:00+02:00</updated>
    <id>http://blog.prskavec.net/2016/10/jenkins-2-dot-0-novinky-a-vylepseni</id>
    <content type="html"><![CDATA[<p>Jenkins je nejznámější řešení na Continues Integration, který existuje už řadu let. Od září je venku konečně verze 2.x (aktuálně 2.19.1 LTS), která obsahuje několik zásadních novinek.</p>

<p>Jenkins používám řadu let a také ho <a href="http://blog.prskavec.net/skoleni-a-kurzy/">školím ve firmách</a> co chtějí toto řešení nasadit. Před 2 lety jsem si řekl, že není Jenkins moc dobrá cesta. Žádné použitelné novinky se dlouho neobjevovali a vůbec se nezlepšovalo použití pro větší nasazení Jenkinusů ve firmách.</p>

<!-- more -->


<p>Já mám na každé CI tento seznam požadavků:</p>

<ul>
<li>job definitions in repository</li>
<li>autoscaling on traffic with lowest possible price</li>
<li>pipelines / workflow</li>
<li>solution for caching for installations</li>
<li>docker support</li>
<li>matrix builds</li>
<li>distributed job across multiple nodes</li>
</ul>


<p>a hned ten nejzásadnější právě dlouho Jenkins nesplňoval. Od verze 2.0 je mezi základními rozšířeními podpora pro Continues Delivery Pipelines (dále jen pipelines), které jdou psát do souboru jako <code>Jenkinsfile</code>, který můžete mít s projektem v repozitáři a Jenkins umí spolupracovat s SCM například s Github, kde mu stačí dát jméno organizace nebo uživatele a on proskenuje vaše repositáře a tam kde najde <code>Jenkinsfile</code> pro ty repositáře vytvoří úlohy ke zpracování.</p>

<p>Ukázka jak takový soubor s pipelines vypadá pro malý projekt.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">node</span> <span class="o">{</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Preparation&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">git</span> <span class="s1">&#39;https://github.com/abtris/bee.git&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Deps&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">PACKAGE</span><span class="o">=</span><span class="s2">&quot;github.com/abtris/bee&quot;</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">GOPATH</span><span class="o">=</span><span class="s2">&quot;~/go&quot;</span>
</span><span class='line'>       <span class="n">env</span><span class="o">.</span><span class="na">GOROOT</span><span class="o">=</span><span class="s2">&quot;/usr/local/opt/go/libexec&quot;</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;glide --no-color install&#39;</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;mkdir -p release&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Test&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>       <span class="n">sh</span> <span class="s1">&#39;make xunit&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Build&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>         <span class="n">parallel</span> <span class="o">(</span>
</span><span class='line'>            <span class="nl">linux64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;goos=linux goarch=amd64 make build&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">linux32:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;goos=linux goarch=386 make build&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">mac64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;goos=darwin goarch=amd64 make build&quot;</span> <span class="o">},</span>
</span><span class='line'>            <span class="nl">win64:</span> <span class="o">{</span> <span class="n">sh</span> <span class="s2">&quot;goos=windows goarch=amd64 make build&quot;</span> <span class="o">}</span>
</span><span class='line'>          <span class="o">)</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'>   <span class="n">stage</span><span class="o">(</span><span class="s1">&#39;Results&#39;</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">archive</span> <span class="s1">&#39;release/*&#39;</span>
</span><span class='line'>      <span class="n">junit</span> <span class="s1">&#39;tests.xml&#39;</span>
</span><span class='line'>   <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Jenkinsfile je <a href="https://en.wikipedia.org/wiki/Domain-specific_language">DSL</a> v programovacím jazyku <a href="http://www.groovy-lang.org">Groovy</a> obsahuje blok s názvem <code>node</code> kde si definujete, kde a co se má co spouštět. V ukázce tam není žádná podmínka a tak Jenkins rozhodně sám kde to spustí. Pokud by jste to chtěli upřesnit tak se dá se specifikovat zda to má být master nebo naopak, že to nemá být master (doporučeno) a také jde přímo označit agenta (slave), kterého máte připojeného k Jenkins masteru. Může to být instance na Amazon Web Services (AWS) nebo v jiném cloudu, tak jakýkoliv jiný počítač, který si k tomu určíte a pustíte na něm potřebného klienta.</p>

<p>Další klíčovým slovem je <code>stage</code>, kde si názvem rozdělíme pipeline do nějakých logických celků. Tyto části, pokud to má smysl, můžeme zpracovávat paralelně jako je to v ukázce v části <code>Build</code>. Využití paralelního zpracování je tam, kde chcete zkrátit čas celého build a pokud na to máte volné prostředky (agenty).</p>

<p>Vše spouštím pomocí linuxového shellu pomocí klíčového slova <code>sh</code>. Mohl bych testovat pomocí <code>isUnix()</code> zda jsme na stroji, který toho je vůbec schopen, to vám pomůže pokud používáte různé stroje, některé s Windows a jiné s Linuxem.</p>

<p>V poslední části <code>Results</code> archivujeme artefakty (tady binárné soubory) vytvořené při buildu a výsledky testů z kroku <code>Test</code>.</p>

<p>To je vše a v Jenkinsu to potom vypadá takto:</p>

<p><img src="http://blog.prskavec.net/images/jenkins/pipelines-parallel.png" alt="" /></p>

<p>Takto se pipelines zobrazují v novém UI BlueOcean.</p>

<p>Pipelines mají před sebou velkou budoucnost, připravují se vylepšení v podobě online editoru a více deklarativního zápisu než dnes.</p>

<p>Dalším požadavkům, které mám na CIE se budu věnovat zase v dalším příspěvku.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Přednáška o SRE na DevOPS meetupu]]></title>
    <link href="http://blog.prskavec.net/2016/10/prednaska-o-sre-na-devops-meetupu/"/>
    <updated>2016-10-17T08:22:00+02:00</updated>
    <id>http://blog.prskavec.net/2016/10/prednaska-o-sre-na-devops-meetupu</id>
    <content type="html"><![CDATA[<p>O <a href="http://blog.prskavec.net/2016/03/co-to-je-sre/">SRE</a> ve startup budu mluvit 31. řijna na
<a href="https://www.meetup.com/Prague-DevOps-Meetup/events/233883552/">DevOps Meetupu</a>.</p>

<p>Pokud vás zajímá rozdíl mezi SRE a DevOps a o tom jak se liší SRE v Google, Facebooku, LinkendIn nebo Microsoftu a ve startatup jako je <a href="https://apiary.io">Apiary</a>, přijděte si o tom popovídat.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SREcon'16 Europe]]></title>
    <link href="http://blog.prskavec.net/2016/07/srecon-16-europe/"/>
    <updated>2016-07-14T08:13:00+02:00</updated>
    <id>http://blog.prskavec.net/2016/07/srecon-16-europe</id>
    <content type="html"><![CDATA[<p>Letošní <a href="https://www.usenix.org/conference/srecon16europe">SREcon</a> byl zase v Dublinu. Od 11.7. do 13.7. se zde setkali velcí hráči (Google, Facebook, Microsoft, Amazon) s těmi menšími a vyměňovali si spoustu zkušeností. Letos jsem se mohl poprvé zúčastnit. Nebyl jsem z ČR sám, zastoupení měli Avast, Seznam nebo Skype či Algolia. Dohromady asi 5 lidí.
Konference byla vyprodaná a hodně míst měli lidé z Googlu a pokud vás zajímalo jak se pracuje v Dublinském Googlu nebo Facebooku mohli jste si o tom s lidmi promluvit.
Celá konference byla ve 4 sálech a to jeden hlavní, který se po keynote rozdělil na dva a potom poslední dva byli hlavně pro workshopy a lighting talky.</p>

<h2>Co to SRE je?</h2>

<p>Pokud nevíte <a href="http://blog.prskavec.net/2016/03/co-to-je-sre/">co to je SRE</a>, tak kromě mého článku existuje skvělá kniha <a href="http://shop.oreilly.com/product/0636920041528.do">Site Reliability Engineering</a> od lidí z Googlu, kde se všechno detailně vysvětluje a skoro každý přenášející něco z knihy citoval. Je to taková bible SRE a vůbec první kniha zastřešujíc tento obor.</p>

<!-- more -->


<h2>Nejzajímavější přednášky</h2>

<p>K přednáškám chci jen dodat, jsou to mé postřehy, pokud vás to zaujme měli by být videa za pár týdnů veřejně dostupné na youtube.</p>

<h3>Splicing SRE DNA Sequences in the Biggest Software Company on the Planet &ndash; Greg Veith, Microsoft</h3>

<p>Greg mluvil o transformaci v Microsoftu a jeho práci na zavádění SRE do práce týmů kolem MS Azure. Začali budovat SRE kolem roku 2009 a doteď transformace probíhá nejen v MS Azure, ale v celé firmě. Pro zavedení byli klíčové tři věci. Za prvé vlastní start SRE týmu, zavedení principů. Za druhé aplikaci principů, aby jste model otestovali. Za třetí musíte akcelerovat a vylepšovat ho tak, aby zahrnul celou firmu. Gregova přednáška byla také hodně o tom jak je MS velký firma a tak je to práce pro hodně lidí, přesto hlavní SRE tým je asi jen 5-7 lidí.</p>

<p>Diskuze o tom kolik SRE lidí má být ve firmě byla celkem častá. Osobně se mi libí názor z LinkedIN, kde uvádějí 1:10 poměr SRE a Engineeringu. U velkých firem jako je Google je to asi 5%. Tomu 1:10 odpovídáme i v Apiary a myslím, že je dobré se toho držet.</p>

<h3>Doorman: Global Distributed Client-Side Rate Limiting &ndash; Jos Visser, Google</h3>

<p>Jos mluvil o projektu <a href="https://github.com/youtube/doorman">Doorman</a>, který používají v Youtube limitaci zdrojů v distribuovaném systému pro omezení zátěže MySQL. Doorman je napsaný v Go langu, používá pro komunikaci gRPC. Zajímavé je hlavně to, že nemá žádný diskový prostor pro ukládání stavu a drží informace jen v paměti. Pokud dojde k výpadku tak se pustí learning mode a od klientů se dozví všechno co potřebuje a potom pokračuje ve funkci.</p>

<p> ### Building and Running SRE Teams &ndash; Kurt Andersen, LinkedIn
Kurt mluvil o knize <a href="https://www.amazon.com/Team-Teams-Rules-Engagement-Complex/dp/1591847486">Team of Teams</a> a jak aplikovat vojenské postupy do SRE a systému rozhodování. Jako klíčové viděl hlavně posun důležitých rozhodnutí na lidi co jsou nejblíže tomu tu akci potom vykonat.</p>

<h3>The Production Engineering Lifecycle: How We Build, Run, and Disband Great Reliability-focused Teams &ndash; Andrew Ryan, Facebook</h3>

<p>Andrew mluvil o Production Engineeringu (PE) ve Facebooku. Je to obdoba SRE. Mají asi 700 lidí v šesti kancelářích po celém světe. Drží poměr 1:10 podobně jako LinkedIn. Hodně řeší nakolik je v každém týmu potřeba PE a zda je produkt opravdu tak důležitý pro firmu, aby bylo nutné mít oncall (min. 12+ PE). Pokud ne tak se oncall přesune na vývojáře a PE může působit jako poradce jak věci zlepšit. Naopak na core produktech mají například pro cache pět paralelních rotací na oncallu.</p>

<h3>How to Improve Your Service by Roasting It &ndash; Jake Welch, Microsoft</h3>

<p>Jake mluvil o tom jak přenést znalosti o komplexních systémech od autorů k dalším lidem do firmy. Doporučil vytvořit skupinku a věnovat 45min týdně po dobu 10 týdnů na předávání znalostí. Je důležité, aby to někdo řídil. Role Roast Master je pro úspěch klíčová. Musí hlídat jak tón řeči a vůbec vyjadřování, aby to nesklouzlo k osobním antipatijím a drželo se to v racionální rovině. Agendu je potřeba správně rozdělit po komponentách nebo subsystémech a držet se toho, na konci potom stanovit co se bude probírat příště a nepřekračovat čas 45min.</p>

<h3>What SRE Means in a Start-up &ndash; Brian Scanlon, Intercom</h3>

<p>Brian mluvil o SRE ve startupu, kde je situace jednoduší pokud se prostě nastaví politika od začátku, často se používá hostovaná infrastruktura, která celou věc usnadňuje. Celkem to kopírovalo to jak to děláme mi v Apiary.</p>

<p>Hodně je vidět jaký velký rozdíl a kolik práce to dá pokud chcete firmu předělat na SRE (brownfielding) nebo začnete hned.</p>

<h3>The Many Ways Your Monitoring Is Lying to You &ndash; Sebastian Kirsch, Google, <a href="&#109;&#x61;&#105;&#108;&#116;&#x6f;&#58;&#x73;&#107;&#105;&#x72;&#x73;&#99;&#x68;&#x40;&#x67;&#111;&#x6f;&#x67;&#108;&#x65;&#46;&#99;&#x6f;&#109;">&#115;&#x6b;&#x69;&#114;&#115;&#99;&#104;&#x40;&#103;&#111;&#111;&#x67;&#108;&#x65;&#x2e;&#99;&#111;&#x6d;</a></h3>

<p>Skvělá přednáška o tom jak nemůžete věřit každému grafu v monitoringu. Doporučuji schlédnout až bude video, bylo tam hodně příkladů. Jde o to, že věci, které uváděl nejsou pro mě například vůbec nové díky lekcím z numerické matematiky a statistiky na ČVUT, ale ne každý má statistický background a nebývá to až tak běžná součást Computer Science.</p>

<h3>Next-generation Alerting and Fault Detection &ndash; Dieter Plaetinck, <a href="http://raintank.io">raintank</a></h3>

<p>Dieter hodně zdůrazňoval použití machine learning na detekci anomálií a to jak to prakticky moc nefunguje a proto se uchylujeme k streamovanému zpracování dat pomocí nástrojů jako je Spark nebo Riemann.io. Ale nejzajímavější věc zmíněná v přednášce je <a href="https://bosun.org">Bosun</a>, také IDE pro alerting, kde se dá dělat historický testing, ladění alertů, vyhodnocování na základě dalších dat. Pro podrobosti doporučuji projít články na <a href="http://dieter.plaetinck.be">blogu</a>.</p>

<h3>DNS @ Shopify &ndash; Emil Stolarsky, Shopify</h3>

<p>Krátký lighting talk o mangementu DNS používající Git a CI. Čerstvé open source přímo před konferencí.</p>

<ul>
<li><a href="https://github.com/Shopify/record_store">https://github.com/Shopify/record_store</a></li>
<li><a href="https://github.com/Shopify/ejson">https://github.com/Shopify/ejson</a></li>
</ul>


<h3>Availability Objectives of SoundCloud’s Microservices &ndash; Bora Tunca, SoundCloud</h3>

<p>SoudCloud je autorem Prometheus.io monitoringu a měli dvě přednášky co jsem viděl. Mají dnes microservice architekturu rozdělenou do několika vrstev a podle toho je daná požadovaný dostupnost a také pracují s graceful degradation pokud to jde. Jako příklad jsou třeba statistky k jednotlivým trackům. Modul stats má SLO 95% a tracks mají 99.995% a tak je to zohledněné i na UI.</p>

<h3>The Knowledge: Towards a Culture of Engineering Documentation &ndash; Riona MacNamara, Staff technical writer, Google</h3>

<p>Riona mluvila o hrozném stavu dokumentace v Google. Přirovnala ji k testování v roce 2005. Jak to celkově zhoršuje produktivitu, spolehlivost a rychost. Zkoušeli to několikrát vyřešit pomocí vytvoření komplexního dokumentačního systému, který vytvoří někdo pro celou firmu a zeshora se to prosadí.</p>

<p>Tento přístup nefungoval a proto v roce 2014 úplně změnili přístup, začali ze zdola nahoru od jednotlivých engineerů a vytvořili systém g3doc, který dnes používá 10k projektů v google a mají přes 17k autorů, kteří do dokumentace přispívají.</p>

<p>Klíčové bylo dát dokumentaci přímo do repositářů projektu, mít to v jednoduchém formátů čitelném přímo v IDE. Zvolili markdown, který si potom silně vylepšili. Mají potom na serverové straně systém, který vygeneruje HTML a publikuje dokumentaci na url, které se dá lehce podle jména projektu odhadnout.</p>

<p>Projekt bohužel není open source, ale snad jednou bude. Díky spoustě googlerů, kteří do projektu v rámci svých 20% přispěli je tam hodně funkcí, které mi máme díky Sphinx.</p>

<h2>Odkazy na zdroje</h2>

<ul>
<li><a href="http://www.franklinangulo.com/blog/2016/7/11/srecon-2016-dublin-day-1">http://www.franklinangulo.com/blog/2016/7/11/srecon-2016-dublin-day-1</a></li>
<li><a href="http://www.slideshare.net/goldshtn/the-next-linux-superpower-ebpf-primer">http://www.slideshare.net/goldshtn/the-next-linux-superpower-ebpf-primer</a></li>
<li><a href="https://github.com/dastergon/awesome-sre">https://github.com/dastergon/awesome-sre</a></li>
</ul>


<p>Budu se snažit průběžně doplňovat zdroje a přidám odkazy na videa až budou.</p>

<h2>Shrnutí</h2>

<p>Pokud se zajímáte o transformaci engineeringu a říká vám něco DevOps nebo SRE je to konference pro vás. Pokud vás to zajímá a chtěli by jste si o tom promluvit, klidně mě kontaktujte. Bohužel jsem nenašel vhodnou konferenci v Česku, kde o tom mluvit, aby se to dostalo více do povědomí firmem.</p>

<p>Další SREcon bude příští rok zase v USA (March 13–14, 2017, SF), Evropě (Dublin) a také poprvé v Asii (May 22–24, 2017, Singapur).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Serverless jako něco víc než Docker]]></title>
    <link href="http://blog.prskavec.net/2016/06/serverless-jako-neco-vic-nez-docker/"/>
    <updated>2016-06-06T13:50:00+02:00</updated>
    <id>http://blog.prskavec.net/2016/06/serverless-jako-neco-vic-nez-docker</id>
    <content type="html"><![CDATA[<h2>Serverless</h2>

<p>Zkusím popsat co je to serverless trochu lidsky. Samotné bez serveru je asi moc široký pojem. Pokud se podíváte na <a href="https://github.com/anaibol/awesome-serverless">Awesome Serverless</a> najdete zde všechno možné od databází jako <a href="https://firebase.google.com/">Firebase</a>, <a href="http://hood.ie/">Hoodie</a>, které poskytují frontendovým aplikacím vše co potřebují k běhu, až k systémům, které vám umožňují více než stávající řešení na principu virtuálních serverů. O těch se <a href="https://twitter.com/search?q=%23serverless&amp;src=typd&amp;lang=en">hodně mluví</a> a nejstarší z nich je <a href="https://aws.amazon.com/lambda/details/">Amazon Web Service Lambda</a>.</p>

<p>AWS příšlo se základním systémem v roce <a href="https://aws.amazon.com/blogs/aws/run-code-cloud/">2014</a> a postupně to rozšiřovali, přidali v roce 2015 <a href="https://aws.amazon.com/blogs/aws/amazon-api-gateway-build-and-run-scalable-application-backends/">AWS Gateway</a> a dnes je systém celkem dobře použitelný a vzniklo i několik frameworků (<a href="http://serverless.com/">Serverless</a>, <a href="http://apex.run/">Apex</a> a <a href="http://thenewstack.io/amazon-debuts-flourish-runtime-application-model-serverless-computing/">Flourish</a>).</p>

<p>Amazon, ale není jediný kdo má podobný systém. Dnes je k dispozici těch systémů několik.</p>

<ul>
<li><a href="http://www.ibm.com/cloud-computing/bluemix/openwhisk/">IBM Bluemix OpenWhisk</a>    (únor 2016, early access)</li>
<li><a href="https://cloud.google.com/functions/">Google Cloud Functions</a> (únor 2016, alfa)</li>
<li><a href="https://azure.microsoft.com/en-us/services/functions/">Microsoft Azure Functions</a> (březen 2016, in preview)</li>
</ul>


<p>Jak vidíte kromě AWS, ale jsou ostatní spíše na začátku, ale za pár let v tom bude dobrá konkurence. Zvláště je důležité dořešit věci o které se snaží frameworky a to zjednodušit vývojáři nastavení samotné infrastruktury, verzování aplikace a prostředí do kterých nasazujete.</p>

<h2>Proč by mě to mělo zajímat?</h2>

<p>Dnes se můžete na Lambdu koukat jako na něco co umí pustit kód v NodeJS, Pythonu nebo Javě. Ale hlavní síla je v kombinaci s dalšími AWS službami, ze kterých můžete vytvořit obří velmi dobře škálující aplikaci za velmi nízkých nákladů pro provoz resp. závislé na tom co opravdu aplikace dělá. Skoro zdarma dostanete neprodukční prostředí, které můžete mít stejné jako to produkční. Je potřeba samozřejmě aplikace navrhovat trochu jinak a ne pro každé použití je to správná cesta, ale na spoustu věcí to je zajímé.</p>

<p>Například si můžete udělat vlastní <a href="https://github.com/serverless/serverless-graphql-blog">GraphQL server</a> nebo <a href="https://aws.amazon.com/blogs/aws/new-slack-integration-blueprints-for-aws-lambda/">Slack bot</a>.</p>

<p>Před nedávnem se konala i <a href="http://serverlessconf.io/">specializovaná konference</a> na toto téma.</p>

<h2>PragueJS o Serverless</h2>

<p>Pokud vás to zaujalo, přijďte si poslechnout nejen moji přednášku o Serverless na meetup 30.6.2016 do kanceláří STRV. Registrace je na <a href="https://www.eventbrite.com/e/serverless-architecture-and-usage-tickets-25563194202?utm_source=prskavec-blog">eventbrite</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Co to je SRE?]]></title>
    <link href="http://blog.prskavec.net/2016/03/co-to-je-sre/"/>
    <updated>2016-03-10T08:45:00+01:00</updated>
    <id>http://blog.prskavec.net/2016/03/co-to-je-sre</id>
    <content type="html"><![CDATA[<p>Včera jsem měl <a href="http://srazy.info/jak-nejlepe-nasadit-docker-kontejnery-do-cloudu/6197">přednášku v Brně o dockeru</a> a ptal jsem se lidí kolem na meetup a v hospodě potom zda znají Site Reliability Engineering (SRE) ze svého okolí. Tento koncept od Googlu rozšiřuje klasické pojetí DevOps a myslím, že je to jedna z nejlepších věcí co Google vymyslel.</p>

<p>Můžete to slyšet přímo od Bena Treynora. Poslechněte jeho skvělou přednášku <a href="https://www.usenix.org/conference/srecon14/technical-sessions/presentation/keys-sre">Keys to SRE z SRECon14</a>.</p>

<!-- more -->


<p>Díky, že jste přímo neutekli na přednášku Bena Treynora, podívejte se na ní aspoň někdy později, protože to opravdu stojí za to.</p>

<p>Jestli jste se snažili někdy ve firmě zavést DevOps tak jste možná narazili, případně říkáte, že máte DevOps, ale často to úplně ve všem nepomohlo.</p>

<p>Přišel jsem před 7 lety do <a href="http://www.lmc.eu">LMC</a>. Měli jsme všecho rozdělené na týmy podle toho co kdo dělal a přišlo nám to tehdy logické. Produkt měl svůj tým, QA měl svůj tým, Support, Ops, Sales, Marketing a Development také. Development byl ještě rozdělný na tři týmy podle specializace (interní systémy, B2C). A ještě jsme měli externí partnery. Také jsme měli release 3-4 krát do roka a celkem to fungovalo.</p>

<p>Potom, ale přišla revoluce. Měli jsme skvělé školení od produktového vývoje a ve firmě se všechno začalo měnit. Vytvořili se produktové týmy. Každý tým měl scrummastera, produkťáka, ux a programátory, kterří dělali i QA. Jediné co zůstalo bylo Operations. Potom jsem z firmy odešel a nevím zda se v tom posunuly dál, ale to je dost těžký krok zvláště pro větší firmu.</p>

<p>V Apiary přišel náš CTO Lukáš Linhart s tím, že vytvoříme SRE tým, který bude horizontálně podporovat ostatní týmy na produktech. Protože tyto věci mě baví, tak jsem do toho týmu šel a dnes ten malý tým vedu. Nejdříve jsem si myslel, že to je prostě takové agilní, startupové OPS. Ale až později mi došlo, že za tím je mnohem víc a že se to musí přenést do kultury celé firmy.</p>

<p>Podle mě nejdůležitější věc je, aby se byl společný pool lidí. Prostě přijmete jen programátory, žadné lidi co chtějí dělat jen OPS. Důležité, aby to byli hodně líní programátoři a nechtěli nic dělat ručně a když to dělají podruhé už si na to píší nějaký kód, zautomatizují to a příště už mohou řešit něco jiného. Snaha o automatizaci je klíčová. Každá firma chce růst a nechcete to dohánět neustálým nabíráním nových lidí, kteří pokrývají jen provoz.</p>

<p>Začněte SRE dělat hned ono se vám to v budoucnu vrátí. V Googlu začali v 6 lidech (2003) a těď mají v SRE asi 2500 lidí (odněkud zaslechnuto).</p>

<p>Musíte zapojit do OPS práce programátory. V <a href="https://apiary.io">Apiary</a> každý programátor má službu a stará se i produkční systémy, je to potřeba, aby to každý z nich uměl. Využíváme hodně SaaS řešení což celou práci programátorům ulehčuje, když máte technický problém, je tu support od poskytovale co vám rád pomůže. Tohle funguje velmi dobře.</p>

<p>Klíčový rozdíl mezi SRE a DevOPS jsou error buggety. Aby jste neměli válku mezi DEV a OPS týmy, dá se to nastavit jednoduše. Stanovíte SLA mezi systémy. SLA může být interní nebo externí se zákazníky a tuto metriku nestanoví obvykle ani SRE nebo DEV tým. Je to spíš nástroj managementu. Důležité je jen, aby tým se svým SLA souhlasil, nepřišlo mu to nesmyslé. Potom se dá vypočítat <strong>error budget</strong> pomocí: <code>1 - SLA</code> a máte v hodnotu budgetu.</p>

<p>Budget musíte měřit a mít to v monitoringu, kde na to vidí jak DEV tak SRE tým. Když je DEV tým pod limitem svého error budgetu, může provádět deploy. Po překročení limitu nesmí nasazovat. To má tu výhodu, že je to čirá matematika, nikde tam není boj o moc apod. DEV se naučí hlídat si svůj error budget a PR, které mají málo testů nebo mají jiná rizika nebudou mít tak jednoduchý život.</p>

<p>Samozřejmě to není všechno kolem SRE, je toho mnohem více. Pro ty, které SRE problematika zajímá tak doporučuji sledovat <a href="http://sreweekly.com/">SRE Weekly</a> nebo se zůčastnit <a href="https://www.usenix.org/conference/srecon16">SRECon 2016</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Suchý docker]]></title>
    <link href="http://blog.prskavec.net/2016/02/suchy-docker/"/>
    <updated>2016-02-05T09:20:00+01:00</updated>
    <id>http://blog.prskavec.net/2016/02/suchy-docker</id>
    <content type="html"><![CDATA[<p><a href="http://suchejunor.cz/">Suchý únor</a> je skvělá akce a tak jsem říkal, zda s Dockerem nebudeme také na suchu. Našťěstí včera se situace změnila a vyšli nové verze Docker Engine, Docker Swarm and Docker Compose.</p>

<blockquote><p>Pokud budete upgradovat, buďte opatrní, nový formát image není zpětně kompatibilní.</p><footer><strong>Docker docs</strong> <cite><a href='https://docs.docker.com/engine/breaking_changes/'>docs.docker.com/engine/&hellip;</a></cite></footer></blockquote>


<p>V originálu si novinky můžete prostudovat na blogu Dockeru:</p>

<ul>
<li><a href="http://blog.docker.com/2016/02/docker-1-10/">Docker 1.10: New Compose file, improved security, networking and much more!</a></li>
<li><a href="http://blog.docker.com/2016/02/docker-engine-1-10-security/">Docker Engine 1.10 Security Improvements</a></li>
<li><a href="http://blog.docker.com/2016/02/compose-1-6/">Compose 1.6: New Compose file for defining networks and volumes</a></li>
</ul>


<p>pokud si chcete přečíst novinky v češtině pokračujte v mém článku.</p>

<!-- more -->


<p>Novinek je spousta, ale budu se věnovat jen těm zásadním.</p>

<h2>Docker Engine 1.10</h2>

<p>Docker 1.10 používá nový systém pro ukládání image a layers. Není to zpětně kompatibilní, pokud uděláte upgrade, nemůžete použít staršího clienta. Migrace, která se spustí může trvat poměrně dlouho, pozor pokud máte docker v produkci. Při migraci se počítají SHA256 checksumy pro každý soubor.</p>

<p>Tyto změny s podporou paralelního pushovaní by měli urychlit <code>docker push</code> a <code>docker pull</code>, zvláště při pushi by to mělo být znát.</p>

<p>Další změny se týkají bezpečnosti. Podpora <a href="https://en.wikipedia.org/wiki/Seccomp">seccomp profiles</a>, User namespaces, Authorization plugins. V dalších verzích budou PID Control Group.</p>

<ul>
<li>nový příkaz <code>docker update</code> umožňuje měnit resources za běhu například pro navýšení paměti apod.</li>
<li>příkaz <code>docker images</code> podporuje flag <code>--format</code></li>
<li>nový <code>status=dead</code> pro filtrování v <code>docker ps</code></li>
<li>deprecated <code>-f</code> pro <code>docker tag</code></li>
<li>přidaný support pro <code>**</code> v <code>.dockerignore</code> pro více úrovní adresářů</li>
<li>nový logging ovladač pro Splunk</li>
<li>podpora více tagů v buildu</li>
</ul>


<h2>Docker Compose 1.6</h2>

<p>Nový formát <a href="https://docs.docker.com/compose/compose-file/#version-2">version 2</a> pro <code>docker-compose.yml</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">version</span><span class="p-Indicator">:</span> <span class="s">&#39;2&#39;</span>
</span><span class='line'><span class="l-Scalar-Plain">services</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">web</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">build</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">.</span>
</span><span class='line'>    <span class="l-Scalar-Plain">ports</span><span class="p-Indicator">:</span>
</span><span class='line'>     <span class="p-Indicator">-</span> <span class="s">&quot;5000:5000&quot;</span>
</span><span class='line'>    <span class="l-Scalar-Plain">volumes</span><span class="p-Indicator">:</span>
</span><span class='line'>     <span class="p-Indicator">-</span> <span class="l-Scalar-Plain">.:/code</span>
</span><span class='line'>  <span class="l-Scalar-Plain">redis</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">image</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">redis</span>
</span></code></pre></td></tr></table></div></figure>


<p>Migrace většinou nebude <a href="https://docs.docker.com/compose/compose-file/#upgrading">složitá</a>, stačí přidat <code>version: 2</code> a <code>services:</code> na začátek a odsadit.</p>

<h3>Nové vlastnosti</h3>

<ul>
<li>nový příkaz <code>events</code> stejný jako <a href="https://docs.docker.com/engine/reference/commandline/events/"><code>docker events</code></a></li>
<li>nový příkaz <code>config</code> pro validaci <code>docker-compose.yml</code> včetně interpolací a použítí extendu</li>
<li>nový příkaz <code>create</code> pro vytvoření kontejnerů bez spuštění</li>
<li>nový příkaz <code>down</code> pro stopnutí a odstranění všeho co pouští příkaz <code>up</code></li>
<li>přídané nové konfigurační vlastnosti <code>cpu_quota</code>, <code>stop_signal</code></li>
<li>flag <code>--abort-on-container-exit</code> stopne všechny kontainery pokud jeden vyhodí exit</li>
</ul>


<h2>Docker Machine 0.6</h2>

<p>Zásadní vylepšení developer experience v příkazech docker-machine start, docker-machine stop a ostatních nemusíte používat argument <code>default</code> pokud ho přímo nespecifikujete.</p>

<p>Driver pro EC2 umí používat default VPC and automaticky číst přístupové údaje z <code>~/.aws/credentials</code>.</p>

<p>Spousta drobných změn, které mi nepřišli už důležité.</p>

<h2>Závěr</h2>

<p>Každý release přinese spoustu změn. Celý ekosystém dockeru je poměrně mladý, ale o to <a href="https://twitter.com/icecrime/status/694558000615288834">více dynamický</a>.</p>

<p>V Praze se každý měsíc konají <a href="http://www.meetup.com/Docker-Prague-Czech-Republic/">docker meetupy</a>, pokud vás tato problematika zajímá. Přijďte nebo nabídněte svoji přednášku pořadatelům.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nástroje co používám pro vývoj a správu]]></title>
    <link href="http://blog.prskavec.net/2015/12/nastroje-co-pouzivam-pro-vyvoj-a-spravu/"/>
    <updated>2015-12-03T10:35:00+01:00</updated>
    <id>http://blog.prskavec.net/2015/12/nastroje-co-pouzivam-pro-vyvoj-a-spravu</id>
    <content type="html"><![CDATA[<p>Sublime Text, Terminal</p>

<h2>Sublime Text jako vývojové prostředí</h2>

<p><a href="http://www.sublimetext.com/">Sublime</a> používá dost lidí, u nás v Apiary je to rozdělné mezi Emacs, Vim, Sublime, Atom a Webstorm. Řekl bych, že Sublime je asi nejvíc používaný, ale to se také mění. Já ho preferuju hlavně pro jeho rychlost startu.</p>

<p><a href="http://blog.prskavec.net/images/sublime.png"><img class="center" src="http://blog.prskavec.net/images/sublime.png" alt="Sublime Text" /></a></p>

<!-- more -->


<p>Používám tyto balíčky:</p>

<ul>
<li><a href="https://packagecontrol.io/">Package Control</a> – balíčkovací systém</li>
<li><a href="https://packagecontrol.io/packages/API%20Blueprint">API Blueprint</a> &ndash; podpora pro práci s jazykem [API Blueprint</li>
<li><a href="https://packagecontrol.io/packages/Alignment">Alignment</a> &ndash; zarovnávání na různé znaky, obvykle např. require na začátku js souborů</li>
<li><a href="https://packagecontrol.io/packages/All%20Autocomplete">All Autocomplete</a></li>
<li><a href="https://packagecontrol.io/packages/Better%20CoffeeScript">Better CoffeeScript</a> &ndash; podpora pro CoffeeScript</li>
<li><a href="https://packagecontrol.io/packages/Color%20Highlighter">Color Highlighter</a> &ndash; zobrazí barvu v CSS</li>
<li><a href="https://packagecontrol.io/packages/FileDiffs">FileDiffs</a> &ndash; porovnávání souborů přímo v Sublime, podpora clipboard, velmi užitečné</li>
<li><a href="https://packagecontrol.io/packages/Focus%20File%20on%20Sidebar">Focus File on Sidebar</a></li>
<li><a href="https://packagecontrol.io/packages/GhostText">GhostText</a> &ndash; s pluginem v Chrome je to combo pro editaci textarea na webu přímo v Sublime</li>
<li><a href="https://packagecontrol.io/packages/Git">Git</a></li>
<li><a href="https://packagecontrol.io/packages/Hayaku%20-%20tools%20for%20writing%20CSS%20faster">Hayaku</a> &ndash; jednoduší psaní CSS</li>
<li><a href="https://packagecontrol.io/packages/JSCS-Formatter">JSCS Formatter</a> &ndash; lepší formátování pro Javascript</li>
<li><a href="https://packagecontrol.io/packages/Pretty%20JSON">Pretty JSON</a> &ndash; formátovaní JSON</li>
<li><a href="https://packagecontrol.io/packages/Markdown%20Preview">Markdown Preview</a> &ndash; podpora pro Markdown</li>
<li><a href="https://packagecontrol.io/packages/SideBarEnhancements">SidebarEnhancements</a></li>
<li><a href="https://packagecontrol.io/packages/Stylus">Stylus</a> &ndash; podpora pro jazyk</li>
<li><a href="https://packagecontrol.io/packages/Terraform">Terraform</a> &ndash; podpora pro jazyk</li>
<li><a href="https://packagecontrol.io/packages/TrailingSpaces">TrailingSpaces</a> &ndash; příkazy pro mazání, zobrazení whitespace z dokumentů</li>
<li><a href="https://packagecontrol.io/packages/GoSublime">GoSublime</a> &ndash; podpora pro jazyk Go</li>
<li><a href="https://packagecontrol.io/packages/GoImports">GoImports</a> &ndash; podpora pro zakomentování importů v Go</li>
<li><a href="https://packagecontrol.io/packages/Pretty%20YAML">Pretty YAML</a> &ndash; formátovaní YML</li>
<li><a href="https://packagecontrol.io/packages/AutoSpell">AutoSpell</a> &ndash; kontrola překlepů v angličtině</li>
<li><a href="https://packagecontrol.io/packages/Docker%20Based%20Build%20Systems">Docker Based Build Systems</a> &ndash; pouštění kódu v dockeru pro různé jazyky</li>
<li><a href="https://packagecontrol.io/packages/Dockerfile%20Syntax%20Highlighting">Dockerfile Syntax Highlighting</a> &ndash; zvýrazňování syntaxe pro Dockerfile</li>
<li><a href="https://packagecontrol.io/packages/Seti_UI">Seti UI</a> &ndash; vzhled který používám</li>
</ul>


<h2>Terminal</h2>

<p>Možná se divíte, že terminál uvádím, ale i tady lze nastavit tisíce věcí.</p>

<ul>
<li><a href="https://www.iterm2.com/">iTerm2</a></li>
<li><a href="http://ohmyz.sh/">oh-my-zsh</a></li>
<li><a href="http://beyondgrep.com/">ack</a></li>
<li><a href="https://dotfiles.github.io/">dotfiles</a></li>
</ul>


<p>Pokud používáte pro programování bash doporučuji na Macu, hlavně upgradovat přes homebrew na verzi 4, která bohužel stále není v základu Mac OS X.</p>

<p>Mých top 10 příkazů v terminalu. Dostal se tam jen 1 alias a to <code>gco -  git checkout</code>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'> 1  2015  20.152%    git
</span><span class='line'> 2  834   8.34083%   heroku
</span><span class='line'> 3  734   7.34073%   gco
</span><span class='line'> 4  499   4.9905%    cd
</span><span class='line'> 5  465   4.65047%   cat
</span><span class='line'> 6  451   4.51045%   docker
</span><span class='line'> 7  317   3.17032%   npm
</span><span class='line'> 8  264   2.64026%   ack
</span><span class='line'> 9  252   2.52025%   curl
</span><span class='line'>10  157   1.57016%   brew</span></code></pre></td></tr></table></div></figure>


<p>Pokud nemáte vlastní dotfiles, doporučuji si je vytvořit a uchovávat si konfiguraci pro svůj terminál.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Porovnání implementace service v NodeJS a Go lang]]></title>
    <link href="http://blog.prskavec.net/2015/09/porovnani-implementace-microservice-v-nodejs-and-go-lang/"/>
    <updated>2015-09-16T10:54:00+02:00</updated>
    <id>http://blog.prskavec.net/2015/09/porovnani-implementace-microservice-v-nodejs-and-go-lang</id>
    <content type="html"><![CDATA[<h2>Datadog a log parsing service</h2>

<p>Pro používání <a href="https://www.datadoghq.com/">Datadog</a> na <a href="https://heroku.com">Heroku</a> je potřeba několik věcí.
Za prvé, pro datadog agenta potřebujete <a href="https://github.com/miketheman/heroku-buildpack-datadog.git">custom buildpack</a>, který v kombinaci s vaším buildpackem vám umožní mít vše pohromadě. Pokud to nechcete můžete udělat samostatnou service přes kterou se dají parsovat logy pomocí této <a href="https://github.com/ozinc/heroku-datadog-drain">knihovny v NodeJS</a>.
Pokud chcete do Datadogu zapisovat deploy na Heroku použijte <a href="https://devcenter.heroku.com/articles/deploy-hooks#email">emailový post deploy hook</a>.
Aplikaci a její metriky můžete posílat přes Datadog API.</p>

<!-- more -->


<h2>Začátek</h2>

<p>Jako první jsem použil výchozí aplikaci od tvůrců a pustil tam jednu malou aplikaci, kde počet req/min dosahoval několika desítek a vše bylo bez problémů.</p>

<p>Tak jsem zapojil produkční aplikace. Počet requestů stoupl na 3000 req/min a aplikace začala mít značné problémy i když běžela na Performace-M dynu.</p>

<p><a href="http://blog.prskavec.net/images/drain/01.png"><img class="center" src="http://blog.prskavec.net/images/drain/01.png" alt="Heroku monitoring - NodeJS before optimalization" /></a></p>

<h2>Řešení</h2>

<p>Po diagnostikování těchto problémů jsme se dali do <a href="https://github.com/apiaryio/heroku-datadog-drain">hledání memory leaks v NodeJS aplikaci</a> a současně jsme zkusili tuto malou service přepsat do <a href="https://github.com/apiaryio/heroku-datadog-drain-golang">Go</a>.</p>

<p>Obě řešení zafungovala a za pár hodin práce jsme měli už přijatelné výsledky v NodeJS. Mohli jsme snížit používaná dyna na běžné <code>1X</code> a tam provádět další srovnání.</p>

<p><a href="http://blog.prskavec.net/images/drain/02.png"><img class="center" src="http://blog.prskavec.net/images/drain/02.png" alt="Heroku monitoring - NodeJS" /></a></p>

<p>Verze v go langu je na tom ještě trochu lépe hlavně s ohledem na stabilitu a pamět. Tuto verzi jsme nechali potom trvale v běhu na nejmenším dynu k dispozici s monitoringem.</p>

<p><a href="http://blog.prskavec.net/images/drain/03.png"><img class="center" src="http://blog.prskavec.net/images/drain/03.png" alt="Heroku monitoring - Go lang" /></a></p>

<h2>Závěr</h2>

<p>Pokud vás toto zaujalo pojďte si popovídat o Go langu na první <a href="http://srazy.info/golang-meetup/5676">Go lang meetup v Praze</a>. Budeme mít lighting talk o tomto příkladu s dalšími detaily a zúčastní se i další firmy, které řeknou o svých zkušenostech. Pokud vás zajímají nějaké detaily o používaní Datadogu na Heroku tak se ozvěte v komentářích.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Amazon Elastic Beanstalk a docker]]></title>
    <link href="http://blog.prskavec.net/2015/05/amazon-elastic-beanstalk-a-docker/"/>
    <updated>2015-05-14T11:36:00+02:00</updated>
    <id>http://blog.prskavec.net/2015/05/amazon-elastic-beanstalk-a-docker</id>
    <content type="html"><![CDATA[<p>Amazon Elastic Beanstalk je Platform as Service podobný známému Heroku. Jen je součást Amazon Web Services. Podporuje řadu jazyků a v neposlední době přidal podporu <a href="http://www.docker.io">Dockeru</a>. Díky podpoře docker kontejnerů je možné pustit víceméně cokoliv.</p>

<!-- more -->


<p>Amazon web services operují v několika regionech. Dnes je jich 10 a z toho máte dva i v evropě. Pokud chcete zkoušet novinky, které AWS poskytuje doporučuji použít region <code>us-east-1</code>.</p>

<p>Amazon kromě regionů, které vám umožňují poskytovat služby z geograficky nejbližšího místa vašim zákazníkům, také podporuje Availability Zones (AZ), které vám umožňují zvýšit spolehlivost v jednom regionu. V každém regionu je k dispozici několik zón. Pokud máte skupinu serverů ve škálovacím režimu je dobré je rozprostřít přes několik AZ a tím máte jistotu pokud dojde k výpadku jedné zóny, že vaše služba poběží.</p>

<p>Elastic Beanstalk podporuje PHP, NodeJS, Python, Ruby, Java, Go a Docker.</p>

<p>Teď k Elastic Beanstalku (EB). Služba využívá zdroje AWS. Na vstupu je Elastic Load Balancer, který vám směřuje provoz na vaši aplikaci.</p>

<h2>Docker</h2>

<p>Pro funkci dockeru potřebujete buď <code>Dockerrun.aws.json</code> nebo <code>Dockerfile</code>. Já pro svůj příklad používám json file.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'>    "AWSEBDockerrunVersion": "1",
</span><span class='line'>    "Image": {
</span><span class='line'>        "Name": "registry:0.9.1"
</span><span class='line'>    },
</span><span class='line'>    "Volumes": [
</span><span class='line'>    ],
</span><span class='line'>    "Ports": [
</span><span class='line'>        {
</span><span class='line'>            "ContainerPort": "5000"
</span><span class='line'>        }
</span><span class='line'>    ]
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>tady je příslušný dockerfile, ale ten nemusíte použít. Buď json file nebo dockerfile.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>FROM registry:0.9.1
</span><span class='line'>
</span><span class='line'>ENV DEPS loose
</span><span class='line'>RUN pip uninstall -y docker-registry-core && pip uninstall -y boto && pip install boto==2.34.0 && pip install docker-registry-core
</span><span class='line'>
</span><span class='line'>RUN env
</span><span class='line'>
</span><span class='line'>ENV SETTINGS_FLAVOR s3
</span><span class='line'>ENV AWS_BUCKET $AWS_S3_BUCKET
</span><span class='line'>ENV STORAGE_PATH /registry
</span><span class='line'>ENV AWS_KEY $AWS_S3_ACCESS_KEY
</span><span class='line'>ENV AWS_SECRET $AWS_S3_SECRET_KEY
</span><span class='line'>ENV AWS_REGION $AWS_S3_REGION
</span><span class='line'>ENV AWS_HOST s3.amazonaws.com
</span><span class='line'>ENV AWS_PORT 443
</span><span class='line'>ENV AWS_CALLING_FORMAT REGULAR
</span><span class='line'>ENV DEBUG True
</span><span class='line'>ENV LOGLEVEL debug
</span><span class='line'>
</span><span class='line'>EXPOSE 5000
</span><span class='line'>
</span><span class='line'>CMD ["docker-registry"]</span></code></pre></td></tr></table></div></figure>


<p>Možná vás překvapí, že kontainer nemá definovaný port na který má být směřovám. EB ve verzi 1 směřuje všechno na port 80, kde nginx proxy. Pokud definujete více portů použije se jen ten poslední.</p>

<p>Není to moc užitečné a pokud potřebujete použít více portů nenašel jsem vhodné řešení. Konfigurční předpis, ale již existuje ve verzi 2, kde jsou možnosti mnohem širší a tyto problémy se dají dobře řešit. Ale zatím to není v oficiální dokumentaci a našel jsem to jen AWS labs.</p>

<h2>Nginx Proxy</h2>

<p>Jak jsem říkal v předchozím odstavci, máte defaultní nginx proxy a veškeré nastavení se dá změnit, ale musíte to udělat pomocí adresáře <code>.ebextensions</code>.</p>

<p>Například konfigurace nginxu:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>files:
</span><span class='line'>  "/etc/nginx/docker-registry.conf":
</span><span class='line'>    mode: "000644"
</span><span class='line'>    owner: root
</span><span class='line'>    owner: root
</span><span class='line'>    content: |
</span><span class='line'>      proxy_pass                        http://docker;
</span><span class='line'>      proxy_http_version                1.1;
</span><span class='line'>      proxy_set_header  Host            $http_host;
</span><span class='line'>      proxy_set_header  X-Real-IP       $remote_addr;
</span><span class='line'>      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
</span><span class='line'>      proxy_set_header  Authorization  "";
</span><span class='line'>      proxy_read_timeout               900;</span></code></pre></td></tr></table></div></figure>


<p>a tady konfigurace vlastní website, kde jsem přidal autorizaci.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>files:
</span><span class='line'>  "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf":
</span><span class='line'>    mode: "000644"
</span><span class='line'>    owner: root
</span><span class='line'>    owner: root
</span><span class='line'>    content: |
</span><span class='line'>      server {
</span><span class='line'>        listen 80;
</span><span class='line'>
</span><span class='line'>        client_max_body_size 0;
</span><span class='line'>        chunked_transfer_encoding on;
</span><span class='line'>
</span><span class='line'>        location / {
</span><span class='line'>          auth_basic            "Restricted";
</span><span class='line'>          auth_basic_user_file  docker-registry.htpasswd;
</span><span class='line'>          include               docker-registry.conf;
</span><span class='line'>        }
</span><span class='line'>
</span><span class='line'>        location /_ping {
</span><span class='line'>          auth_basic off;
</span><span class='line'>          include               docker-registry.conf;
</span><span class='line'>        }
</span><span class='line'>
</span><span class='line'>        location /v1/_ping {
</span><span class='line'>          auth_basic off;
</span><span class='line'>          include               docker-registry.conf;
</span><span class='line'>        }
</span><span class='line'>      }</span></code></pre></td></tr></table></div></figure>


<h2>Závěr</h2>

<p>Je potřeba definovat několik proměnných prostředí, které jsou vidět na skriptu pro spuštění.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>docker run \
</span><span class='line'>         -e SETTINGS_FLAVOR=s3 \
</span><span class='line'>         -e AWS_BUCKET=$AWS_S3_BUCKET \
</span><span class='line'>         -e STORAGE_PATH=/registry \
</span><span class='line'>         -e AWS_KEY=$AWS_S3_ACCESS_KEY \
</span><span class='line'>         -e AWS_SECRET=$AWS_S3_SECRET_KEY \
</span><span class='line'>         -e SEARCH_BACKEND=sqlalchemy \
</span><span class='line'>         -e DEBUG=True \
</span><span class='line'>         -e LOGLEVEL=debug \
</span><span class='line'>         -e AWS_REGION="us-east-1" \
</span><span class='line'>         -p 5000:5000 \
</span><span class='line'>         registry</span></code></pre></td></tr></table></div></figure>


<p>PaaS jako Elastic Beanstalk je celkem použitelný, má CLI clienta, funguje s gitem. Má to některé věci, které mi chybí například na Heroku (VPC, auto scaling). Ale přesto mi například práce s heroku přijde příjemnější i když to teď <a href="https://www.heroku.com/beta-pricing">zabili změnou plánů</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Docker cluster management]]></title>
    <link href="http://blog.prskavec.net/2015/02/docker-cluster-management/"/>
    <updated>2015-02-07T18:09:00+01:00</updated>
    <id>http://blog.prskavec.net/2015/02/docker-cluster-management</id>
    <content type="html"><![CDATA[<ul>
<li>Update: přidal jsem do článku další věci zmíněné v komentářích, všem děkuji za příspěvky.</li>
<li>Update 23.2.2015: Přidán odkaz na Centurion od New Relic</li>
</ul>


<p>V poslední době se zabývám technologiemi pro řízení clusterů s docker konteinery.</p>

<p>Pokud by to někoho zajímalo, zkusím jsem shrnout s čím jsem se potkal a kde vidím možné využití.</p>

<p>Nástroje, které můžete použít cluster management:</p>

<ul>
<li><a href="http://mesos.apache.org/">Apache Mesos</a> (cpp, api for java, python, c++)</li>
<li><a href="https://github.com/docker/swarm/">Docker Swarm</a> (golang)</li>
<li><a href="https://coreos.com/using-coreos/clustering/">CoreOS Fleet</a> (golang)</li>
<li><a href="http://kubernetes.io/">Google Kubernetes</a> (golang)</li>
<li><a href="https://github.com/spotify/helios">Spotify Helios</a> (java)</li>
<li><a href="https://github.com/newrelic/centurion">New Relic Centurion</a> (ruby)</li>
</ul>


<p>potom k tomu ješte patří některé frameworky pro Mesos a to <a href="https://mesosphere.github.io/marathon/">Marathon</a> a <a href="http://airbnb.github.io/chronos/">Chronos</a>. <a href="https://github.com/mesosphere/kubernetes-mesos">A Kubernetes Framework for Apache Mesos</a>.</p>

<!-- more -->


<p>Ještě potřebujete nástroj pro service discovery:</p>

<ul>
<li><a href="https://coreos.com/using-coreos/etcd/">CoreOS Etcd</a> (golang)</li>
<li><a href="https://consul.io/">Hashicorp Consul</a> (golang)</li>
<li><a href="http://zookeeper.apache.org/">Apache Zookeeper</a> (java)</li>
</ul>


<p>Etcd používá Kubernetes a další projekty. Service discovery je potřeba pro management clusteru. Můžete použít stejně jednoduše i ostatní projekty.</p>

<p>Apache Mesos umí pracovat s různorodým prostředím včetně Amazon ECS service. Framework Marathon vám potom slouží k pouštění dlouho běžících konteinerů pro aplikace a Chronos typicky pro batch processing například pro zpracování velkých dat. S Mesosem musíte provozovat ZooKeeeper pro discovery service.</p>

<p>Protože se snažím Javě vyhnout a raději volím nástroje v jiných jazycích, kde mám větší znalosti. Pro discovery service clusteru bych raději použil Consul nebo Etcd.</p>

<p>Google Kubernetes je poměrně vyspělý nástroj používaný pro Google Cloud a adaptovaný například RedHatem pro OpenShift V3. Tam mám trochu výhradu, že to nemá podporu pro více uživatelů a neumí pracovat s externím filesystémy co vím. Ale dá se používat na tvorbu dokonce hybridních clusterů mezi více poskytovateli (AWS, Google Cloud, OpenShift, fyzické stroje).</p>

<p>Docker Swarm je nástroj pro řízení clusterů konteinerů přímo od Dockeru, ale kromě základních příkladů není k dispozici nic většího, poporuje několik discovery service (etcs, consul, zookeeper). Nevím o nikom, kdo by to používal ve větším měřítku.</p>

<p>CoreOS Fleet je <a href="https://coreos.com/using-coreos/systemd/">systemd</a> a <a href="https://coreos.com/using-coreos/etcd/">etcd</a> a nemám s ním zkušenosti vůbec žádné. Projekty kolem <a href="https://coreos.com/">CoreOS</a> jsou zajímavé. Mají vlastní technologii konteinerů <a href="https://coreos.com/blog/rocket/">Rocket</a>.</p>

<p>Stejně jako CoreOS snaží se o podobnou věc i <a href="http://www.projectatomic.io/">Project Atomic</a> od RedHatu. Vytvořit základní systém pro práci s konteinery.</p>

<p>Závěr je asi takový, že pokud budete chtít řídít vlastní cluster asi zvolíte buď Mesos nebo Kubernetes. Osobně asi budu volit Kubernetes, co vy?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Zapier a zasílání zůstatku z banky zdarma na mobil]]></title>
    <link href="http://blog.prskavec.net/2014/12/zapier-a-zasilani-zustatku-z-banky-zdarma-na-mobil/"/>
    <updated>2014-12-11T16:29:00+01:00</updated>
    <id>http://blog.prskavec.net/2014/12/zapier-a-zasilani-zustatku-z-banky-zdarma-na-mobil</id>
    <content type="html"><![CDATA[<h2>Motivace</h2>

<p>Banky posílají změnu zůstatku emailem a SMS. Za SMS začínájí účtovat třeba i 2Kč což mi přijde fakt hrůza. Tak jsem si řekl jak dostat ten email do telefonu pomocí push notifikace, aby mě to nestálo moc peněz a dalo se případně používat univerzálně.</p>

<!-- more -->


<h2>Pushover</h2>

<p>Služba <a href="https://pushover.net/">Pushover</a> není zcela zdarma, ale zaplatíte jen jednorázově při nákupu aplikace nebo při aktivaci desktop notifkací. A získáte tím možnost zasílat notifikace skoro z čehokoliv a kam potřebujete. Můžete konfigurovat kdy nechcete být rušeni (noc, víkendy apod.).</p>

<h2>Parse emails by Zapier</h2>

<p>Služba <a href="https://zapier.com/">Zapier</a> má zajímavou <a href="http://parser.zapier.com/">službu na parsování dat z emailu</a>, která se zatím zdarma a nenašel jsem jinou, který by byla dobrá pro tento můj problém. Existují sice služby na parsování emailů, ale ty jsou spíše děláný na zpracování velkého množství emailů a nejsou zdarma.</p>

<p>Na službě si zřídíte emailovou schránku na kterou si přepošlete email z banky, označíte si v něm část co chcete posílat na mobil. Služba potom toto políčko poskytne jako placeholder pro zpracování a poslání dále.</p>

<h2>Zapier</h2>

<p>V Zapieru potom nakonfigurujete zpracování emailů z vaší schránky na parseru a poslání na mobil pomocí pushover. Zkoušel jsem třeba i hangouts, ale nedošlo mi to všechna zařízení a není to tak komfortní jako pushover.</p>

<h2>Závěr</h2>

<p>I bez programování můžete vyzrát na chytráky co si snaží za služby s minimálními nároky účtovat hromady peněz a <a href="https://zapier.com/">Zapier</a> nebo <a href="https://ifttt.com">IFTTT</a> jsou na  to super pomocníci.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git a pre-commit hook pro kontrolu syntaxe]]></title>
    <link href="http://blog.prskavec.net/2014/01/git-a-pre-commit-hook-pro-kontrolu-syntaxe-v-mnoha-jazycich/"/>
    <updated>2014-01-06T19:29:00+01:00</updated>
    <id>http://blog.prskavec.net/2014/01/git-a-pre-commit-hook-pro-kontrolu-syntaxe-v-mnoha-jazycich</id>
    <content type="html"><![CDATA[<p>Pokud pracujete s gitem nebo jiným verzovacím systémem, určitě jste se setkali s hooky. Pro kontrolu než provedete commit, který se jmenuje pre-commit a hodí se zejména pro kontrolu syntaxe. Já mám několik hooků, které kontrolují php, js, xml a ruby. Říkal jsem si, že by to chtělo je refactorovat a udělat z nich použitelný kód.</p>

<h2>Ochtra</h2>

<p>Naštěstí jsem to dělat nemusel, protože vznikl malý projekt <a href="https://github.com/kvz/ochtra">ochtra</a>  (One Commit Hook To Rule All).</p>

<p>Tento projekt teď umí kontrolovat Ruby, JavaScript, Python, Bash, Dash, Go, PHP, XML, JSON, YAML. A co se mi zvláště líbí je, že autor pěkně popsal instalaci, která je potřeba, aby vám hook fungoval automaticky, když použijete git clone.</p>

<h3>Instalace</h3>

<p>Potřebujete git 1.7, kde je podpora pro git templates.</p>

<pre><code>mkdir -p ~/.gittemplate/hooks
curl https://raw.github.com/kvz/ochtra/master/pre-commit -o ~/.gittemplate/hooks/pre-commit \
 &amp;&amp; chmod u+x $_
git config --global init.templatedir '~/.gittemplate'
</code></pre>

<p>Instalace vytvoří adresář s template pro git, která se použije pokud dáte git clone, případne git init.</p>

<p>Git init potřebujete pokud už máte projekty někde vyclonované.</p>

<pre><code>cd my-project
rm .git/hooks/pre-commit
git init
</code></pre>

<p>Celý projekt má i testy a podpora je pro všechno co mě napadlo. Pokud něco někomu chybí tak se ozvěte nebude to problém přidat.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[docker]]></title>
    <link href="http://blog.prskavec.net/2013/11/docker/"/>
    <updated>2013-11-28T08:25:00+01:00</updated>
    <id>http://blog.prskavec.net/2013/11/docker</id>
    <content type="html"><![CDATA[<p>Pokud se zajímáte o to jak nasazovat aplikace na svoje servery, pronajaté VPS nebo doc cloudu, měli by jste si něco o této poměrně mladé technologii přečíst nebo vidět.</p>

<h2>Co to je docker?</h2>

<p>Pěkně podrobně to najdete na samotném webu <a href="http://www.docker.io/the_whole_story/">docker.io</a> a také jsem to snažil postihnout ve své <a href="http://youtu.be/oZ86BoAUtSQ">přednášce na letošním Devfestu</a>.</p>

<iframe width="640" height="360" src="http://blog.prskavec.net//www.youtube.com/embed/oZ86BoAUtSQ?rel=0" frameborder="0" allowfullscreen></iframe>


<!-- more -->


<h2>Co se do přednášky nevešlo</h2>

<p>Všechny příklady, které jsem nestihl předvést naživo jsou v <a href="https://github.com/abtris/devfest-2013">repository</a> a jsou pro verzi 0.6.7 a mezi Devfestem a tímto článkem už stačila vyjít verze 0.7, která je revoluční v podpoře více distribucí (Fedora, RHEL, Ubuntu, Debian, Suse, Gentoo, Arch). Přidáný storage drivers o kterých jsem mluvil kromě AuFS je to VFS a DEVICEMAPPER a brzo budou další ZFS, Gluster, Ceph.</p>

<h2>Závěr</h2>

<p>Autoři slibují v další verzi se zaměřit hlavně na kvalitu, doplnění dokumentace a api. Je před nimi mnoho práce, ale čím dál více lidí docker používá i v produkci. O dockeru budu mluvit 13.12. také v rámci <a href="http://webovky.vse.cz/web-inkognito">Web Inkognito</a> a 3-4.12.2013 se koná celosvětový Docker <a href="http://www.meetup.com/Docker-Prague-Czech-Republic/events/152779712/">HackDay</a>, pokud by jste se chtěli zůčastnit nebo pomocí s organizací místa kde se to bude konat dejte vědět mě nebo organizátorům.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jenkins polling a git-notify]]></title>
    <link href="http://blog.prskavec.net/2013/09/jenkins-polling-a-git-notify/"/>
    <updated>2013-09-05T10:01:00+02:00</updated>
    <id>http://blog.prskavec.net/2013/09/jenkins-polling-a-git-notify</id>
    <content type="html"><![CDATA[<p>Minulý rok jsem psal o tom, že <a href="http://blog.prskavec.net/2012/06/jenkins-scm-polling-je-zlo/">polling v Jenkinsu je zlo</a>. To stále platí, ale i když máte tento přístup nemusí to stačit.</p>

<!--more-->


<p>Tady je příklad hooku pro gitolite, který používáme na některých repository.</p>

<div><script src='https://gist.github.com/5625369.js'></script>
<noscript><pre><code>#!/bin/bash

NOBOLD=&quot;\033[0m&quot;
BOLD=&quot;\033[1m&quot;
BLACK=&quot;\033[30m&quot;
GREY=&quot;\033[0m&quot;
RED=&quot;\033[31m&quot;
GREEN=&quot;\033[32m&quot;
YELLOW=&quot;\033[33m&quot;
BLUE=&quot;\033[34m&quot;
MAGENTA=&quot;\033[35m&quot;
CYAN=&quot;\033[36m&quot;
WHITE=&quot;\033[37m&quot;

# V +1007

# Peff helped:
# http://thread.gmane.org/gmane.comp.version-control.git/118626

syntax_check=&quot;xmllint --noout &quot;
tmp=$(mktemp /tmp/git.update.XXXXXX)
log=$(mktemp /tmp/git.update.log.XXXXXX)
tree=$(mktemp /tmp/git.diff-tree.XXXXXX)

git diff-tree -r &quot;$2&quot; &quot;$3&quot; &gt; $tree
 
echo
echo diff-tree:
cat $tree

exit_status=0

while read old_mode new_mode old_sha1 new_sha1 status name
do
  # skip lines showing parent commit
  test -z &quot;$new_sha1&quot; &amp;&amp; continue
  # skip deletions
  [ &quot;$new_sha1&quot; = &quot;0000000000000000000000000000000000000000&quot; ] &amp;&amp; continue
  # check all files for unmerged signs
    mergefail=`git cat-file blob $new_sha1 | grep -e &quot;^&lt;&lt;&lt;&lt;&lt;&lt;&quot; -e &quot;^&gt;&gt;&gt;&gt;&gt;&gt;&quot;`
    if [[ &quot;$mergefail&quot; != &quot;&quot; ]]
    then
      echo
      echo &quot;umerged file $name&quot; &gt;&amp;2
      echo &quot;$mergefail&quot; &gt;&amp;2
      echo
      exit_status=1
    fi

  # Only test .xml, xsl(t)? files
  if [[ $name =~ [.]xml$|xsl(t)?$ ]]
  then
    git cat-file blob $new_sha1 &gt; $tmp
    set -o pipefail
    $syntax_check $tmp 2&gt;&amp;1 | sed &#39;s|/tmp/git.update.......:\([0-9]*\)$|JOJOMOJO:\1|&#39;&gt; $log
    if [[ $? != 0 ]]
    then
      echo
      echo -e &quot;$(cat $log | sed &#39;s|JOJOMOJO|&#39;\\${RED}${name}\\${NOBOLD}&#39;|&#39;)&quot; &gt;&amp;2
      echo -e &quot;For more details run this: ${CYAN} git diff $old_sha1 $new_sha1 ${NOBOLD}&quot; &gt;&amp;2
      echo
      exit_status=1
    fi
  fi

  # CRLF check only java, xml
  if [[ $name =~ [.]java$|xml$ ]]
  then  
    git cat-file blob $new_sha1 &gt; $tmp
    RESULT=`grep -Pl &#39;\r\n&#39; $tmp`
    echo $RESULT
    if [ &quot;$RESULT&quot; = &quot;$tmp&quot; ]; then
          echo &quot;###################################################################################################&quot; &gt;&amp;2
          echo &quot;# &#39;$name&#39; contains CRLF! Dear Windows developer, please activate the GIT core.autocrlf feature,&quot; &gt;&amp;2
          echo &quot;# or change the line endings to LF before trying to push.&quot; &gt;&amp;2
          echo &quot;# Use &#39;git config core.autocrlf true&#39; to activate CRLF conversion.&quot; &gt;&amp;2
          echo &quot;# OR use &#39;git reset HEAD~1&#39; to undo your last commit and fix the line endings.&quot; &gt;&amp;2
          echo &quot;###################################################################################################&quot; &gt;&amp;2
          exit_status=1
    fi  
  fi

done &lt; $tree

# jenkins polling
branch=$(git rev-parse --symbolic --abbrev-ref $1)
escaped_branch=$(echo $branch | sed s:/:%2F:g)

refname=&quot;$1&quot;
oldrev=&quot;$2&quot;
newrev=&quot;$3&quot;
# --- Check types
# if $newrev is 0000...0000, it&#39;s a commit to delete a ref.
zero=&quot;0000000000000000000000000000000000000000&quot;
if [ &quot;$newrev&quot; = &quot;$zero&quot; ]; then
  newrev_type=delete
else
  newrev_type=$(git cat-file -t $newrev)
fi
skip_notify=0
echo &quot;$refname $newrev_type&quot; &gt;&amp;2
case &quot;$refname&quot;,&quot;$newrev_type&quot; in
  refs/tags/*,delete)
    # delete tag
    skip_notify=1
    echo &quot;Delete tag&quot; &gt;&amp;2
    ;;
  refs/heads/*,delete)
    # delete branch
    skip_notify=1
    echo &quot;Delete branch&quot; &gt;&amp;2
    ;;
  refs/remotes/*,delete)
    # delete tracking branch
    skip_notify=1
    echo &quot;Delete tracking branch&quot; &gt;&amp;2
    ;;
  *)
esac
if [[ &quot;$skip_notify&quot; == &quot;0&quot; ]]
then
  REPOSITORY_BASENAME=$(basename &quot;$PWD&quot;)
  curl &quot;http://jenkins.firma.cz/git/notifyCommit?url=ssh://git@git.firma.cz/$REPOSITORY_BASENAME&amp;branch=$escaped_branch&quot;
fi

rm -f $log $tmp $tree
exit $exit_status

</code></pre></noscript></div>


<p>Občas je potřeba notifikovat jen větev, která se změní, aby to nepustilo zbytečně joby, kde změny neproběhli.</p>

<p>Nejdůležitější části, jsou detekce větve, escape lomítka ve jménech větve.</p>

<pre><code>branch=$(git rev-parse --symbolic --abbrev-ref $1)
escaped_branch=$(echo $branch | sed s:/:%2F:g)
</code></pre>

<p>potom vlastní git-notify volání curlem.</p>

<pre><code>REPOSITORY_BASENAME=$(basename "$PWD")
curl "http://jenkins.firma.cz/git/notifyCommit?url=ssh://git@git.firma.cz/$REPOSITORY_BASENAME&amp;branch=$escaped_branch"
</code></pre>

<p>Snad to bude někomu užitečné také, pokud si chcete o Jenkinsu popovídat <a href="http://blog.prskavec.net/skoleni/">více, dejte vědět</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Firebase a AngularJS]]></title>
    <link href="http://blog.prskavec.net/2013/08/firebase-a-angularjs/"/>
    <updated>2013-08-29T11:31:00+02:00</updated>
    <id>http://blog.prskavec.net/2013/08/firebase-a-angularjs</id>
    <content type="html"><![CDATA[<p>Dnešní většina aplikací v javascriptu má architekturu klient server. Pokud nechcete psát nějaký backend pro vaši aplikaci, můžete se tomu vyhnout pokud použijete nějaký druh úložiště (databáze), která vám k tomu přidá i funkce, které má nějaký backend napsaný např. v nodejs nebo php.</p>

<!--more-->


<p>Těmto řešením se věnuje web <a href="http://nobackend.org/solutions.html">nobackend.org</a>, kde se dají najít tyto řešení:</p>

<ul>
<li> <a href="https://backendless.com/">Backendless</a></li>
<li> <a href="http://deployd.com/">deployd</a> &ndash;  <a href="http://docs.deployd.com/docs/collections/examples/a-simple-todo-app-with-angular.md">example in angularjs</a></li>
<li> <a href="http://www.firebase.com">Firebase</a></li>
<li> <a href="http://hood.ie/">Hoodie</a></li>
<li> <a href="http://www.kinvey.com/">Kinvey</a></li>
<li> <a href="https://parse.com/">Parse</a></li>
<li> <a href="http://remotestorage.io/">remoteStorage</a></li>
<li> <a href="http://sockethub.org/">Sockethub</a></li>
</ul>


<p>Bohužel jsem neměl tolik času, abych podrobně prozkoumal všechny řešení. O Firebase jsem se dozvěděl z přednášky na meetupu:</p>

<iframe width="640" height="360" src="http://blog.prskavec.net//www.youtube.com/embed/C7ZI7z7qnHU?rel=0" frameborder="0" allowfullscreen></iframe>


<p>Z této přednášky jsem vycházel pro svoji přednášku na <a href="http://www.praguejs.cz">PragueJS</a>.</p>

<h2>Firebase</h2>

<p>Zajímavé na tomto projektu je, že je to poměrně mladý projekt, ale který vznikl z projektu Envolve (2009), což je skupinový chat pro tisíce websites. Zjistili, že vyvíjený backend je užitečný pro více druhů aplikací než jenom chat a nabídli ho jako produkt Firebase.</p>

<p>Hlavní věci, které dělají Firebase zajímavou jsou:
&ndash; JSON formát pro data
&ndash; je to dokumentová databáze v mnoha směrech mi připomíná práci např. s CouchDb
&ndash; REST každý dokument má HTTP endpoint s kterým se dá pracovat, můžete používát API v přes HTTP, nativní knihovny pro Android (Java) a iOS (Objective-C) a javascript.
&ndash; přímo od autorů je knihovna pro práci s AngularJS &ndash; <a href="http://angularfire.com/">AngularFire</a> a pro práci s Backbone &ndash; <a href="https://github.com/firebase/backfire">BackFire</a>.
&ndash; real-time synchronizace dat, pokud přistupujete z více klientů tak se změny projeví v milisekundách
&ndash; automatic scaling je pěkná věc pokud potřebujete opravdu řešit hodně klientů, autoři slibují, že je jedno pokud máte 1 klienta nebo 1 milion a že nebudete muset nic na aplikaci měnit, což je dost ambiciózní, ale vzhledem ke klientům jako je Atlassian, CodeAcademy, CBS a další řekl bych že už si to více než ověřili
&ndash; security &ndash; bezpečnost je řešena celkem jednoduše a přitom celkem se dá dobře nastavit přes <a href="https://www.firebase.com/docs/security/security-rules.html">security rules</a>. Vlastní přihlašovnání je podporováno přes jejich <a href="https://www.firebase.com/docs/security/authentication.html">Firebase Simple Login</a> nebo můžete použít nějakou vlastní implementaci.
&ndash; servery nepotřebujete. Firebase je schopná nahradit aplikaci psanou na serveru, jde jen o to zvážit kdy to ještě stačí a kdy už potřebujete nějaké další části infrastruktury navíc.</p>

<h2>AngularFire</h2>

<p>AngularFire je modul, který řeší vlastní authentikaci pomocí angularFireAuth.</p>

<p>Stačí mít includnuté tyto soubory pro práci s firebase.</p>

<pre><code>&lt;script src="https://cdn.firebase.com/v0/firebase.js"/&gt;
&lt;script src="https://cdn.firebase.com/v0/firebase-simple-login.js"/&gt;
&lt;script src="angularFire.js"/&gt;
</code></pre>

<p>potom v controlleru se předá angularFireAuth přes dependency injection</p>

<pre><code>function MyController($scope, angularFireAuth) {
    var url = "https://&lt;my-firebase&gt;.firebaseio.com/";
    angularFireAuth.initialize(url, {scope: $scope, name: "user"});
}
</code></pre>

<p>v šabloně potom máte vlastní přihlašování</p>

<pre><code>&lt;span ng-show="user"&gt;
 | &lt;a ng-click="logout()"&gt;Logout&lt;/a&gt;
&lt;/span&gt;
&lt;span ng-hide="user"&gt;&lt;a ng-click="login()"&gt;Login&lt;/a&gt;&lt;/span&gt;
</code></pre>

<p>metody pro login přes Firebase simple login, které použijí facebook takto jednoduše deklarujete</p>

<pre><code>$scope.login = function() {
    angularFireAuth.login("facebook");
};
$scope.logout = function() {
    angularFireAuth.logout();
};
</code></pre>

<p>AngularFire podporuje <a href="http://angularfire.com/documentation.html#implicit">implicitní</a> a <a href="http://angularfire.com/documentation.html#explicit">explicitní data binding</a>. Příklady najdete v dokumentaci.</p>

<h2>Firebase Open Source</h2>

<p>Na <a href="http://firebase.github.io/">githubu</a> najdete všechny příklady a zdrojové kódy, ke všemu co se vyvíjí kolem Firebase. Postupně to přibývá a většina demo příkladů jsou reálně použitelné za ty nejzajímavější bych zmínil:</p>

<ul>
<li><a href="http://www.firepad.io/">Firepad</a></li>
<li><a href="http://firebase.github.io/firechat/">Firechat</a></li>
<li><a href="http://firefeed.io/">Firefeed</a></li>
</ul>


<h2>Závěr</h2>

<p>Tyto nové databáze jsou velmi zajímavé, ale těžko se asi porovná to nejzajímavější a to jak se vypořádají s konflikty při synchronizaci. Pokud používáte nějako jako je Evernote nebo nějaký todo list a máte ho na počítači, mobilu a tabletu. Sami víte jak je obtížné pokud nejsou všechny zařízení stále online občas udržet konzistenci. Ve Firebase se to dá částečně řešit pomocí security rules, ale stejně si občas myslím, že může být problém.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jaký bude AngularJS 1.2?]]></title>
    <link href="http://blog.prskavec.net/2013/06/angularjs-1-dot-2/"/>
    <updated>2013-06-13T22:08:00+02:00</updated>
    <id>http://blog.prskavec.net/2013/06/angularjs-1-dot-2</id>
    <content type="html"><![CDATA[<p>Pokud sledujete dění kolem frameworku <a href="http://angularjs.org">AngularJS</a> tak jste jistě zaznamenali, že se pracuje na nové verzi 1.2, která je teď blízko k dokončení. V masteru mají dnes verzi pojmenovanou jako verzi 1.1.8 a brzy se snad dočkáme finální verze. Zkusím zde popsat nejdůležitější věci z <a href="https://docs.google.com/presentation/d/1WHCcp3G3HxoE7b_ut_ERKJF4zQK_P4qFlESjE2E9AUQ/preview?sle=true#slide=id.geaf70e8e_16">prezentace</a> na meetupu 11.6. co prezentovali Igor Minár a Brad Green.</p>

<!--more-->


<h2>ng-animate</h2>

<p><a href="http://yearofmoo-articles.github.io/angularjs-2nd-animation-article/app/#/">Deklarativní animace</a> pro aplikace v Angularu. Podpora pro CSS animace a přechody s možností fallbacku pomocí JS. Pro vlastní animace je dobré použít některou s knihoven pro CSS animace (Greensock.js, <a href="http://daneden.me/animate/">Animate.css</a>, Custom CSS3 Keyframes).
Direktiva se stará o práci s DOMem, nastavuje potřebné třídy a timing, také zabraňuje vnořeným animacím.</p>

<h2>$http</h2>

<p>Měla by být přidána podpora pro blob a authentication (metoda withCredentials). Budete si moci více nastavit XSRF header a názvy cookie. Přidá se podpora pro zrušení requestů a podpora pro around interceptors.</p>

<p>Around interceptors se dají dobře využít například při authentication, asynchronní zpracování request/response a práci s chybami. Například chcete provést request a server vrátí, že vypršela session a pomocí interceptoru vyvoláte přihlášení a potom pokračuje původní request.</p>

<h2>$resource</h2>

<p>Více konfiguračních nastavení (hlavičky, url), api bude vylepšené o podporu promise a měli by být k dispozici i interceptory.</p>

<h2>$route a ngView</h2>

<p>Separátní moduly, rozšíření o možnost zachycení všech parametrů a přidána podpora pro animace.</p>

<pre><code>    when('/users/:userId/params/*params/'
</code></pre>

<h2>ngRepeat</h2>

<p>V této snad nejpotřebnější direktivě je přidána podpora pro animace, potom je možnost opakovat sadu elementů (multi-element repeater) pomocí ng-repeat-start a ng-repeat-end a v neposlední řadě podpora track by paramteru, kdy se dá kontrolovat asociace mezi modelem a DOMem.</p>

<h2>Controller as</h2>

<p>Tato konstrukce nám umožní jednoduší zápis a není potřeba používat v controlleru $scope (samozřejmě pokud ho nepotřebujete např. při $watch()).</p>

<pre><code>    &lt;body ng-controller="DemoController as demo"&gt;
    &lt;tr ng-repeat="student in demo.students"&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/body&gt;

    function DemoController() {
        this.students = [ ... ]
    }
</code></pre>

<h2>ng-if</h2>

<p>Tato direktiva přejatá z projektu AngularUI umožňuje udělat podmínku na kompilaci části šablony a reší některé problémy, které se nadali zvládnout pomocí ngShow a ngHide.</p>

<h2>Expressions</h2>

<p>Podpora pro nové operátory: ===, !==, ?
Konečně lze napsat:</p>

<pre><code>    ng-class="loggedIn ? 'user': 'anonym'"
</code></pre>

<h2>ngTouch</h2>

<p>Podpora pro touch eventy v ngClick a ngSwipe.</p>

<h2>Shrnutí</h2>

<p>Přibude jestě několik vylepšení pro bezpečnost (CSP) a vylepší error hlášky, také by se měla zlepšit dokumentace a bude interaktivní tutorial. Dema a detaily najdete také ve videu na <a href="https://www.youtube.com/watch?v=W13qDdJDHp8&amp;feature=c4-overview">youtube</a>.</p>
]]></content>
  </entry>
  
</feed>
