<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog do Benito</title>
  
  <subtitle>Mais um blog com nome genial</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.benito.com.br/"/>
  <updated>2017-03-02T20:21:00.000Z</updated>
  <id>https://www.benito.com.br/</id>
  
  <author>
    <name>JrBenito</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Automatizando a geração do blog</title>
    <link href="https://www.benito.com.br/2017/03/geracao-automatizada-do-blog/"/>
    <id>https://www.benito.com.br/2017/03/geracao-automatizada-do-blog/</id>
    <published>2017-03-02T20:21:00.000Z</published>
    <updated>2017-03-02T20:21:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Blogs e sites gerados através de programas como <a href="http://hexo.io" target="_blank" rel="noopener">Hexo</a> ou <a href="https://jekyllrb.com/" target="_blank" rel="noopener">Jekyll</a> trazem uma simplicidade enorme para o servidor e uma mudança de paradigma no que tange a gerência do conteúdo. Porém a simplicidade no servidor vem a um custo: a preparação do conteúdo! É necessário escrever em um editor, salvar o arquivo e “compilar” o site com o gerador e só depois subir no servidor. Será que há como automatizar isso?<br><a id="more"></a></p><h2 id="Inspiracao"><a href="#Inspiracao" class="headerlink" title="Inspiração"></a>Inspiração</h2><p>O serviço <a href="https://pages.github.com/" target="_blank" rel="noopener">Github Pages</a> é muito simples e interessante. Fantástico eu diria! Ao mesmo tempo que é simples, permite usar ferramentas mais complexas como o gerador de sites <a href="https://jekyllrb.com/" target="_blank" rel="noopener">Jekyll</a> que, no caso do Github Pages, a cada <em>commit</em> no repositório do seu projeto, gera as páginas estáticas automaticamente. Isso resolve o problema da geração sem a necessidade de instalações locais.</p><p>Infelizmente o serviço do Github limita-se a fornecer o Jekyll, como rodar outros geradores ou mesmo versões customizadas do Jekyll? <a href="https://travis-ci.org" target="_blank" rel="noopener">Travis-ci</a>!!!</p><h2 id="Integracao-continua"><a href="#Integracao-continua" class="headerlink" title="Integração contínua"></a>Integração contínua</h2><p>O Travis é um serviço de integração contínua. No mundo do desenvolvimento de software isso é como um servidor de compilação que, a cada integração de código feita pelos desenvolvedores (<em>commit</em>), executa uma compilação e, possivelmente, testes automáticos. Para entender melhor leia os artigos <a href="http://www.devmedia.com.br/integracao-continua-uma-introducao-ao-assunto/28002" target="_blank" rel="noopener">“Integração contínua: uma introdução ao assunto”</a> e <a href="https://aws.amazon.com/pt/devops/continuous-integration/" target="_blank" rel="noopener">“O que significa integração contínua?”</a>.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p><p>Na verdade, o Travis é uma máquina virtual que roda uma configuração de comandos para compilar e testar o código. Quase qualquer comando do Linux (SO nativo do Travis) pode ser executado sobre o código. Rodar o Hexo ou qualquer outro gerador é possível.</p><h2 id="Versionamento"><a href="#Versionamento" class="headerlink" title="Versionamento"></a>Versionamento</h2><p>Para que o Travis enxergue o projeto, este precisa estar  versionado em um repositório no Github. Usando o <a href="https://github.com/jrbenito/benito.com.br" target="_blank" rel="noopener">repositório deste blog</a> como exemplo, as informações ficam no <em>branch</em> <a href="https://github.com/jrbenito/benito.com.br/tree/development" target="_blank" rel="noopener"><code>development</code></a>. Para mais detalhes leia o <a href="/2016/05/hexo-aws-blog-hexo-para-leigos-parte-1/" title="post">post</a>.</p><h2 id="Configurando-o-Travis"><a href="#Configurando-o-Travis" class="headerlink" title="Configurando o Travis"></a>Configurando o Travis</h2><p>Ao criar uma conta no <a href="https://travis-ci.org" target="_blank" rel="noopener">Travis-ci</a> utilizando as credenciais do Github e autorizá-lo, ele instalará <em>hooks</em><sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> nos repositórios de cada projeto ativado.</p><p>Pode-se configurar o Travis através de um arquivo de versionado no repositório do próprio projeto. O arquivo deve ser nomeado <a href="https://github.com/jrbenito/benito.com.br/blob/development/.travis.yml" target="_blank" rel="noopener"><code>.travis.yml</code></a> e, como a extensão sugere, ele é escrito no formato <a href="http://www.yaml.org/" target="_blank" rel="noopener">YAML</a>.</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">language:</span> node_js</span><br><span class="line"><span class="symbol">node_js:</span></span><br><span class="line">  - <span class="string">"4.4.3"</span></span><br></pre></td></tr></table></figure><p>As primeiras linhas definem a linguagem e a versão do compilador/interpretador utilizado. Depois, há a lista de <em>branches</em> que serão compilados (<code>#whitelist</code>) e a lista de <em>branches</em> cujos os <em>commits</em> serão ignorados:<br><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># whitelist</span></span><br><span class="line">branches:</span><br><span class="line">  only:</span><br><span class="line">      - development</span><br><span class="line">      - test-site-development</span><br><span class="line"><span class="comment"># blacklist</span></span><br><span class="line">  except:</span><br><span class="line">      - <span class="literal">master</span></span><br><span class="line">      - conteudo</span><br></pre></td></tr></table></figure></p><p>Na sessão <code>before_install</code> são instalados o Hexo e suas dependências, exatamente como se estivesse preparando uma máquina linux nova para rodar o Hexo: </p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">git:</span><br><span class="line">  depth: 1</span><br><span class="line">before_install:</span><br><span class="line"><span class="bullet">- </span>npm install -g hexo-cli</span><br><span class="line"><span class="bullet">- </span>npm install -g grunt-cli</span><br><span class="line"><span class="bullet">- </span>npm install -g bower</span><br><span class="line"><span class="bullet">- </span>npm install</span><br><span class="line"><span class="bullet">- </span>cd themes/tranquilpeak/</span><br><span class="line"><span class="bullet">- </span>npm install</span><br><span class="line"><span class="bullet">- </span>bower install</span><br><span class="line"><span class="bullet">- </span>grunt buildProd</span><br><span class="line"><span class="bullet">- </span>cd ../../</span><br><span class="line">install:</span><br><span class="line"><span class="bullet">- </span>hexo generate</span><br></pre></td></tr></table></figure><p>Caso o comando <code>hexo generate</code> termine em sucesso, o Hexo rodará a sessão <code>before_script</code>. No caso deste blog, o git faz o clone do <em>branch</em> <code>conteudo</code>, esse passo serve apenas para manter um histórico do site gerado e é completamente opcional. Um detalhe importante desta configuração está na sessão <code>script</code>:</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">before_scrip<span class="variable">t:</span></span><br><span class="line">- git config --<span class="keyword">global</span> user.name <span class="string">'Josenivaldo Benito Jr'</span></span><br><span class="line">- git config --<span class="keyword">global</span> user.email <span class="string">'jrbenito@benito.qsl.br'</span></span><br><span class="line">- sed -i<span class="string">''</span> <span class="string">"s~git@github.com:jrbenito/benito.com.br.git~https://$&#123;GH_TOKEN&#125;:x-oauth-basic@github.com/jrbenito/benito.com.br.git~"</span> _config.yml</span><br><span class="line">- git clone http<span class="variable">s:</span>//github.<span class="keyword">com</span>/jrbenito/benito.<span class="keyword">com</span>.<span class="keyword">br</span>.git .deploy_git -<span class="keyword">b</span> conteudo</span><br><span class="line"><span class="keyword">scrip</span><span class="variable">t:</span></span><br><span class="line">- grunt s3-prod-deploy</span><br><span class="line">- hexo deploy --<span class="keyword">silent</span></span><br><span class="line">after_succes<span class="variable">s:</span></span><br><span class="line">- grunt sns</span><br></pre></td></tr></table></figure><p>Na linha 4 do trecho acima, o comando <code>sed</code> substituirá a URL do repositório no arquivo de configuração do Hexo. Mais precisamente, esse comando está trocando o protocolo de acesso <code>SSH</code> por <code>HTTPS</code> e acrescentando um <em>token</em> de autorização para poder escrever no repositório no github. Mas de onde vem a variável <code>GH_TOKEN</code>?<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> O Travis dispões de dois mecanismos para configuração de variáveis de ambiente. Uma através do site, na configuração do repositório e a segunda através da criptografia da variável e seu conteúdo no arquivo <code>.travis.yml</code>.<sup id="fnref:5"><a href="#fn:5" rel="footnote">5</a></sup></p><p>Neste exemplo foi utilizado o <a href="https://docs.travis-ci.com/user/environment-variables/" target="_blank" rel="noopener">método da criptografia</a>.<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup></p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">env</span>:</span><br><span class="line">  <span class="attribute">global</span>:</span><br><span class="line">  - <span class="attribute">secure</span>: O5f2zGaXraEVUOIk[...]</span><br><span class="line">  - <span class="attribute">secure</span>: bsmjzMqApTjofgAc[...] </span><br><span class="line">  - <span class="attribute">secure</span>: A84t9ASnL11WFrqL[...]</span><br></pre></td></tr></table></figure><h3 id="Habilitando-o-repositorio-no-Travis"><a href="#Habilitando-o-repositorio-no-Travis" class="headerlink" title="Habilitando o repositório no Travis."></a>Habilitando o repositório no Travis.</h3><p>Falta pouco! Com a configuração versionada no repositório é necessário avisar ao Travis que ele deve vigiar tal projeto. No site do Travis procure pelo sinal <code>+</code> no canto superior esquerdo da tela, esse é o botão <em>“Add New Repository”</em>.</p><div class="figure " style="width:;"><a class="fancybox" href="travis-settings.jpg" title="Configurações de repositório no Travis" data-fancybox-group="travis"><img class="fig-img" src="travis-settings.jpg" alt="Configurações de repositório no Travis"></a><span class="caption">Configurações de repositório no Travis</span></div><p>Nas configurações do repositório (<em>more options -&gt; settings</em>), habilite <em>Build only if .travis.yml is present</em> e <em>Build pushes</em> e mantenha desabilitado <em>Build pull requests</em> já que não desejamos que contribuições de qualquer pessoa gerem o site. Nesta mesma página é possível especificar variáveis de ambiente se necessário.</p><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Pronto! Todo <em>commit</em> no repositório do blog irá disparar o Travis e gerar o site. Utilizando o <em>Grunt</em> o conteúdo produzido é atualizado no servidor.</p><div id="footnotes"><hr><div id="footnotelist"><ol style="list-style:none; padding-left: 0;"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">1.</span><span style="display: inline-block; vertical-align: top;">Há muitos outros artigos mais completos sobre o assunto, a ideia é apenas referenciar o conceito não desviando o foco.</span><a href="#fnref:1" rev="footnote"> ↩</a></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">2.</span><span style="display: inline-block; vertical-align: top;"><a href="https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks" target="_blank" rel="noopener">Git hook</a> é um mecanismo do git para disparar scripts quando ações acontecem no repositório. Por exemplo, um <em>commit</em>.</span><a href="#fnref:2" rev="footnote"> ↩</a></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">3.</span><span style="display: inline-block; vertical-align: top;">Os repositório grátis são também <strong>públicos</strong>, é <strong>muito importante</strong> não versionar dados sensíveis como credenciais de acesso, tokens, etc.</span><a href="#fnref:3" rev="footnote"> ↩</a></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">4.</span><span style="display: inline-block; vertical-align: top;">O conteúdo das três variáveis foi cortado afim de poupar espaço.</span><a href="#fnref:4" rev="footnote"> ↩</a></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">5.</span><span style="display: inline-block; vertical-align: top;">O comando <code>hexo deploy</code> escreve a URL do github (e seu <em>token</em>) nos registros de compilação do Travis. Para evitar isso é só usar a opção <code>–silent</code>.</span><a href="#fnref:5" rev="footnote"> ↩</a></li></ol></div></div>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Blogs e sites gerados através de programas como &lt;a href=&quot;http://hexo.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt; ou &lt;a href=&quot;https://jekyllrb.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jekyll&lt;/a&gt; trazem uma simplicidade enorme para o servidor e uma mudança de paradigma no que tange a gerência do conteúdo. Porém a simplicidade no servidor vem a um custo: a preparação do conteúdo! É necessário escrever em um editor, salvar o arquivo e “compilar” o site com o gerador e só depois subir no servidor. Será que há como automatizar isso?&lt;br&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
      <category term="nodejs" scheme="https://www.benito.com.br/tags/nodejs/"/>
    
  </entry>
  
  <entry>
    <title>Variável DISPLAY em sessões tmux</title>
    <link href="https://www.benito.com.br/2017/02/configurando-a-variavel-display-em-sessoes-tmux/"/>
    <id>https://www.benito.com.br/2017/02/configurando-a-variavel-display-em-sessoes-tmux/</id>
    <published>2017-02-10T20:40:00.000Z</published>
    <updated>2017-02-10T20:40:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Quando utilizamos um terminal, a variável <code>$DISPLAY</code> é responsável por informar às aplicações gráficas o endereço do servidor gráfico X. Ao reconectar à uma sessão tmux, a variável <code>$DISPLAY</code> poderá estar desatualizada.<br><a id="more"></a></p><p>Imagine que a situação onde o usuário faz <em>login</em> no servidor através de SSH, inicia uma sessão tmux, destaca a sessão e faz <em>logout</em>. Algum tempo depois, volta a fazer <em>login</em>, seja via SSH ou até mesmo localmente. Neste ponto a variável <code>$DISPLAY</code> está corretamente configurada, mas dentro da sessão tmux ela pode conter informações da antiga sessão. É necessário popular manualmente a variável com o valor atual. Mas como descobrir?</p><h2 id="Procurando-o-servidor-X"><a href="#Procurando-o-servidor-X" class="headerlink" title="Procurando o servidor X"></a>Procurando o servidor X</h2><p>Geralmente um usuário logado ao sistema possui um servidor X ativo e este exporta um “display” que pode ser conectado através de uma porta TCP. É assim que aplicações rodando em um servidor remoto conseguem abrir interfaces gráficas (GUI) em nossa máquina local.</p><p>No cenário exemplificado, uma forma de descobrir o valor para a variável <code>$DISPLAY</code> seria, antes de abrir o tmux, imprimir o valor corrente e, dentro do tmux atribuir o valor novo:</p><figure class="highlight gams"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">$</span> echo <span class="symbol">$</span><span class="keyword">DISPLAY</span></span><br><span class="line">localhost:<span class="number">10.0</span></span><br><span class="line"></span><br><span class="line"><span class="symbol">$</span> tmux attach</span><br><span class="line">[...]</span><br><span class="line"><span class="symbol">$</span> export <span class="keyword">DISPLAY</span>=<span class="string">'localhost:10.0'</span></span><br></pre></td></tr></table></figure><p>Repare que o formato do endereço é <code>&lt;ip_ou_dominio&gt;:&lt;porta&gt;.&lt;display&gt;</code>. O servidor X escuta em uma porta TCP geralmente acima dos 6000. No caso, do exemplo acima, a porta TCP seria 6010, sendo o número 10 correspondente ao <code>&lt;porta&gt;</code> da variável <code>$DISPLAY</code>. Com essa informação podemos, dentro da sessão tmux (ou qualquer outra sessão de terminal), listar os servidores X abertos para o usuário atual:</p><figure class="highlight elixir"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>netstat -ane | grep <span class="string">"LISTEN "</span> | grep <span class="string">"`id -u`"</span> </span><br><span class="line">tcp6       <span class="number">0</span>      <span class="number">0</span> ::<span class="number">1</span><span class="symbol">:</span><span class="number">6010</span>                ::<span class="symbol">:*</span>                    LISTEN      <span class="number">1000</span>       <span class="number">160206</span></span><br><span class="line">tcp        <span class="number">0</span>      <span class="number">0</span> <span class="number">127.0</span>.<span class="number">0</span>.<span class="number">1</span><span class="symbol">:</span><span class="number">6010</span>          <span class="number">0</span>.<span class="number">0</span>.<span class="number">0</span>.<span class="number">0</span><span class="symbol">:*</span>               LISTEN      <span class="number">1000</span>       <span class="number">160207</span></span><br></pre></td></tr></table></figure><p>Usamos o <code>netstat</code> para listar as portas TCP, filtramos com <code>grep</code> pelas portas que estão em estado <code>LISTEN</code> e que pertencem ao usuário corrente (<code>id -u</code>). Como geralmente acessamos os terminais localmente ou via SSH<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, estamos interessados apenas no <code>localhost</code> ou IP <code>127.0.0.1</code>. Mais um filtro com <code>grep</code> para pegar apenas os IPs <code>localhost</code> e pronto. Tudo isso colocado em uma função <code>bash</code> que pode ser convenientemente chamada para acertar a variável <code>$DISPLAY</code> sempre que necessário.</p><script src="//gist.github.com/259e4030dce480e8a3e7d24e219175aa.js"></script><p>O código da função é simples mas note que usei um <code>sort</code> para ordenar a saída pelo PID e um <code>tail</code> para selecionar a última entrada. Esse passo serve apenas para ordenar as sessões concorrentes que possam existir na mesma máquina, pegando sempre o PID mais alto. Isso <em>garante<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup></em> a seleção do mais recente.</p><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Uma função simples que resolve um problema constante no meu ambiente de trabalho onde acesso um servidor compartilhado através de SSH. A cada sessão reiniciada as chances do meu número de display mudar é muito grande. Espero que seja útil para mais alguém. </p><div id="footnotes"><hr><div id="footnotelist"><ol style="list-style:none; padding-left: 0;"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">1.</span><span style="display: inline-block; vertical-align: top;">O ssh pode fazer o chamado <em>X forward</em> que é o tunelamento do tráfego do servidor X. Para habilitar essa opção é preciso chamar o cliente ssh com parâmetro <code>-x</code>: <code>$ ssh -x &lt;endereço&gt;</code>.</span><a href="#fnref:1" rev="footnote"> ↩</a></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px;">2.</span><span style="display: inline-block; vertical-align: top;">No Unix o PID é sempre incremental, porém, quando o valor máximo é alcançado ele reinicia do zero. Nesse caso a lógica irá falhar mas isso será muito muito raro.</span><a href="#fnref:2" rev="footnote"> ↩</a></li></ol></div></div>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Quando utilizamos um terminal, a variável &lt;code&gt;$DISPLAY&lt;/code&gt; é responsável por informar às aplicações gráficas o endereço do servidor gráfico X. Ao reconectar à uma sessão tmux, a variável &lt;code&gt;$DISPLAY&lt;/code&gt; poderá estar desatualizada.&lt;br&gt;
    
    </summary>
    
    
      <category term="linux" scheme="https://www.benito.com.br/tags/linux/"/>
    
      <category term="tmux" scheme="https://www.benito.com.br/tags/tmux/"/>
    
  </entry>
  
  <entry>
    <title>Receptor IR TV Panasonic com defeito</title>
    <link href="https://www.benito.com.br/2017/01/controle-remote-tv-panasonic/"/>
    <id>https://www.benito.com.br/2017/01/controle-remote-tv-panasonic/</id>
    <published>2017-01-30T04:07:00.000Z</published>
    <updated>2017-02-01T12:40:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>Importante:</strong> <em>O autor não se responsabiliza por consequências causadas em decorrência deste artigo. Só mexa em aparelhos eletro-eletrônicos se for qualificado para tal.</em></p><h2 id="O-problema"><a href="#O-problema" class="headerlink" title="O problema"></a>O problema</h2><p>Possuo uma TV Plasma da Panasonic, o modelo é TC-P50UT20B que, ao que parece, é uma tropicalização da TX-50VT20B. Eu gosto de TVs de Plasma graças à profundidade do preto que estas telas oferecem, mas confesso que gostava mais da minha antiga TX-P50V20B (a versão não 3D e não - muito -tropicalizada). Bom mas isso é história para outro artigo.</p><p>Da noite para o dia essa TV parou de ligar pelo controle remoto. Claro que troquei as pilhas do controle remoto sem sucesso. Também testei com um controle universal sem o menor sucesso. Para finalizar o diagnóstico eu apontei o controle remoto para a câmera do celular e é possível ver o LED IR (infravermelho) piscar. Se não é o controle remoto só pode ser a TV…<br><a id="more"></a></p><h3 id="Aprendendo-com-a-experiencia-ruim-de-outros"><a href="#Aprendendo-com-a-experiencia-ruim-de-outros" class="headerlink" title="Aprendendo com a experiência (ruim) de outros"></a>Aprendendo com a experiência (ruim) de outros</h3><p>Seguindo o caminho padrão recorri ao <a href="https://www.google.com.br" title="Google" target="_blank" rel="noopener">oráculo</a> e encontrei alguns relatos de pessoas com problemas similares em modelos de outras marcas. Os relatos eram sempre de que a TV parava de responder a qualquer controle remoto mas que funcionava perfeitamente ao ser comandada pelos botões no painel ou via algum aplicativo de celular (se a mesma for uma SmartTV e possuir esse tipo de aplicativo). Esse é exatamente o sintoma que a minha Pana vinha apresentando.</p><h3 id="Minha-experiencia-ruim-com-assistencias-tecnicas"><a href="#Minha-experiencia-ruim-com-assistencias-tecnicas" class="headerlink" title="Minha experiência (ruim) com assistências técnicas"></a>Minha experiência (ruim) com assistências técnicas</h3><p>Com todas as informações em mãos eu abri um chamado na Panasonic perguntando se haveria algum procedimento para fazer o <em>reset</em> da TV uma vez que o procedimento descrito no manual faz uso do controle remoto - justamente o que não está funcionando. Relatei em meu chamado que já havia testado o controle remoto, trocado pilhas e usado um outro controle remoto e que esse não era o real motivo. No dia seguinte eu recebi uma reposta da Panasonic aconselhando-me a verificar as pilhas do controle remoto e testá-lo com a câmera do celular… Mas não foi exatamente isso que escrevi no meu chamado? Ao que parece existe uma doença epidêmica que acomete canais de suporte técnico; tal doença apresenta sintomas como ignorar o que é escrito pelo consumidor e responde-lo com respostas genéricas de algum manual. Em casos mais graves pode forçar o suporte a não responder. Contente-se se seu suporte responder mesmo que seja repetindo exatamente o que você descreveu.</p><p>Liguei em três assistências técnicas autorizadas, a primeira disse que o modelo era velho e que não teria peça condenando minha TV ao descarte. A segunda assistência ouviu todo meu relato e negou-me falar diretamente com o técnico, disse que o procedimento era eu levar a TV até eles e em até 7 dias eles me passavam um diagnóstico e orçamento. Insisti dizendo que a assistência ficava a 35 km da minha cidade e que eu gostaria de falar com um técnico para saber se havia possibilidade de eu levar apenas a peça defeituosa ou ele simplesmente encomendar a placa de IR e eu levar a TV só para trocar. Nada! A moça que me atendeu parecia estar falando com um E.T. que apareceu falando coisas que ela não entendia e queria a todo custo burlar o processo que ela seguia de forma tão correta. A terceira assistência foi quase como a segunda, mas a moça não pensou que eu fosse um “quebra protocolo” e, percebendo que eu entendia um pouco daquilo que falava, disse: “Olha, essas TVs não têm mais peça de reposição no mercado. O que fazemos é mandar a placa para um <strong>laboratório</strong> e eles verificam se há como trocar os componentes”. A palavra <em>laboratório</em> foi o que me chamou a atenção para o fato de que eu mesmo poderia verificar o que estava errado na placa de IR. Afinal de contas ali não tem nenhum CI elaborado, mas sim componentes simples como resistores, capacitores e sensor de IR (óbvio ddddduuuuhhhhh!).</p><h2 id="Desmontando-a-Pana"><a href="#Desmontando-a-Pana" class="headerlink" title="Desmontando a Pana"></a>Desmontando a Pana</h2><p>Desmontar a TV não foi complicado, por sorte eu tive auxílio de uma parafusadeira pois tirar os 20 parafusos que prendem a tampa traseira ao corpo da TV seria um trabalho ingrato de se fazer na unha. Durante a retirada da tampa me deparei com um módulo estranho, olhado as inscrições no mesmo descobri tratar-se de um módulo <em>Bluetooth</em>. Porque diabos essa TV tem um módulo <em>Bluetooh</em> que não aparece em menu nenhum, muito menos em seu manual, permanece um mistério ainda por ser desvendado.<div class="figure nocaption fig-50" style="width:;"><a class="fancybox" href="tv-aberta.jpg" title="TV aberta ocupando meu sofá" data-fancybox-group><img class="fig-img" src="tv-aberta-375.jpg" alt="TV aberta ocupando meu sofá"></a></div> O fato do módulo não ter certificação da Anatel causa-me a impressão de que é uma das funcionalidades capadas durante a tropicalização do modelo - mas porque colocar o módulo lá se ele não está funcionado? Bom, deixa isso para lá, a TV atende minhas necessidades sem que eu saiba para que isso está ali.</p><p>Retirados a tampa traseira e o misterioso módulo <em>Bluetooth</em>, a placa IR está a um parafuso de sair. A mesma placa é compartilhada por outras duas funções: o LED de ligado/espera e o sensor de iluminação usado pela TV para calcular o brilho aplicado ao painel quando o <em>ECO Mode</em> está ativado. A placa possui a identificação TNPA5602, que usei para pesquisar na Internet e descobrir que a placa toda custa US$ 10,00 no <a href="https://ebay.com" title="eBay" target="_blank" rel="noopener">eBay</a> mas que ninguém no Brasil tem a essa placa para vender. De fato a participação de mercado da Panasonic no Brasil não é algo que salte aos olhos e quando falamos em TVs de plasma a base instalada é ainda menor. Se não tem usuário não tem mercado para peças certo?</p><h3 id="Desvendando-o-circuito"><a href="#Desvendando-o-circuito" class="headerlink" title="Desvendando o circuito"></a>Desvendando o circuito</h3><p>Sabendo que existe placa semelhante para venda, eu fiquei mais tranquilo de tentar arrumá-la e, em caso de desastre, posso encomendar outra. Mas para mexer na placa eu preciso entender o circuito. Meu amigo Alexandre do <a href="http://www.tabalabs.com.br/" title="Tabajara" target="_blank" rel="noopener">Tabajara Labs</a> pegou uma foto da placa e desvendou parte do circuito para mim. Mas torturando um pouco mais o Google, o Pedro - outro amigo, conseguiu encontrar o manual de serviço de uma TV que compartilha a mesma placa. O circuito está abaixo com a parte do infravermelho em destaque.</p><p></p><div class="figure center" style="width:;"><a class="fancybox" href="esquematico.jpg" title="Esquemático: destaque para o circuito do receptor infravermelho" data-fancybox-group="pcb"><img class="fig-img" src="esquematico-375.jpg" alt="Esquemático: destaque para o circuito do receptor infravermelho"></a><span class="caption">Esquemático: destaque para o circuito do receptor infravermelho</span></div><div style="clear:both;"></div><h3 id="Procurando-o-culpado"><a href="#Procurando-o-culpado" class="headerlink" title="Procurando o culpado"></a>Procurando o culpado</h3><p>Utilizando um multímetro e com a placa IR conectada na TV eu comecei a medir as tensões. Primeiro a entrada Vcc, provavelmente normal pois o LED da TV brilha normalmente. Como esperado, o Vcc apresentava tensão de 3.3V mas, no pino Vcc do sensor de IR (círculo azul nas imagens) havia aproximadamente 0,72V. Isso indica que algo, o sensor ou algum componente vizinho, está derrubando a tensão Vcc. Pensei que o sensor poderia estar em curto ou algo parecido, mas esses sensores são bastante robustos e pelo circuito ele não está condenado a nenhum trabalho forçado. Foi aí que reparei nos capacitores de desacoplamento que ficam próximos ao sensor (destaques amarelo e vermelho no verso da placa). Meu grande amigo Alex sugeriu que um deles ou ambos poderiam estar em curto circuito devido a fadiga.</p><p></p><div class="figure fig-50" style="width:;"><a class="fancybox" href="pcb-frente.jpg" title="Frente PCB - destaques para Vcc sensor e R2542. O Sr. Foco não pode comparecer" data-fancybox-group="pcb"><img class="fig-img" src="pcb-frente-375.jpg" alt="Frente PCB - destaques para Vcc sensor e R2542. O Sr. Foco não pode comparecer"></a><span class="caption">Frente PCB - destaques para Vcc sensor e R2542. O Sr. Foco não pode comparecer</span></div><div class="figure fig-50" style="width:;"><a class="fancybox" href="pcb-verso.jpg" title="Verso PCB - destaques para R2517, C2512 e C2521" data-fancybox-group="pcb"><img class="fig-img" src="pcb-verso-375.jpg" alt="Verso PCB - destaques para R2517, C2512 e C2521"></a><span class="caption">Verso PCB - destaques para R2517, C2512 e C2521</span></div><div style="clear:both;"></div><p>Para testar essa possibilidade eu desliguei a TV e retirei a placa depois descarreguei os capacitores para evitar danos ao multímetro. Colocando o multímetro na função ohmímetro e medindo os terminais dos capacitores esse deve apresentar resistência zero Ohm e ir aumentando, preferencialmente até indicar resistência infinita (acima da escala de medição). Porém eu obtive a leitura de aproximadamente 7,5O Ohms, isso significa que um ou ambos capacitores está com problemas, esse valor de resistência é muito baixo. Aliado ao resistor (R2517) de 47 Ohms (destaque marrom) entre Vcc da alimentação e o pino Vcc do sensor, forma-se um divisor resistivo entregando uma tensão mais baixa para o sensor. Calculando a tensão resultante desse divisor para Ventrada=3,3V, R1=47 e R2=7,5 temos Vsaída=0,45V, mais baixa um pouco que aquela que eu efetivamente verifiquei com o circuito ligado, talvez porque a resistência dos capacitores aumente um pouco quando eles estão energizados ou por erro de medida do meu multímetro. Curiosidade: o valor de R2 para que a saída seja de 0,72V teria que ser de aproximadamente 13 Ohms.</p><h3 id="Reparando-a-placa"><a href="#Reparando-a-placa" class="headerlink" title="Reparando a placa"></a>Reparando a placa</h3><p>Se os culpados são os capacitores, qual deles? Ambos? Um palpite baseado na experiência diz que o capacitor de menor tensão (6,3V) tem mais chances de sofrer danos nesse circuito. Utilizando um ferro de solda eu retirei o capacitor C2512 (circulado em amarelo) e repeti a medida de resistência nele fora do circuito. Obtive aproximados 6 Ohms, de fato este capacitor estava danificado. Medi também o capacitor que ficou no circuito e obtive vários kilo-Ohms na leitura. Voltando a teoria do divisor de resistivo, com R1=47 e R2 agora valendo quase 1 Mega-Ohm, teríamos praticamente os 3,3V no pino Vcc do sensor. Testei a placa sem o capacitor de volta na TV. O circuito apresentou 3.3V no pino Vcc do sensor, apontei o controle remoto e este funcionou perfeitamente; a TV estava de volta à ativa.</p><p>Montei a TV sem o capacitor, como sua função é apenas de desacoplamento, sua falta não irá interferir (muito) no funcionamento do sensor IR. Não queria ficar sem TV por mais tempo e já estava de saco cheio de ter meu sofá tomado pela grande tela de 50” que inviabilizava qualquer um de sentar ali. E nem vamos falar no que poderia acontecer se alguém acidentalmente derrubasse o potinho de parafusos que estava ao lado, no braço do sofá. Quando eu precisar comprar uns componentes eu aproveito e coloco esse capacitor na lista.</p><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Apesar do controle remoto não ser imprescindível ao funcionamento da TV, muitas configurações ficam impossíveis. O problema mostrou-se muito mais simples do que o prognóstico dado pelas assistências técnicas. Como em quase todos os problemas da vida, a fase de preparação e pesquisa tomou mais tempo que a execução; eu gastei algumas horas vasculhando a Internet por manuais e informações dessa TV, mais algumas horas discutindo o circuito com amigos e pouco mais de 2 minutos para retirar a peça problemática e testar o circuito. E como toda experiência na vida, valeu a pena cada informação absorvida no processo. Para mim o mais importante nesse tipo de situação é escapar da armadilha da obsolescência programada que nos impele a comprar produtos novos e jogar fora produtos que poderiam ter vida útil estendida.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; &lt;em&gt;O autor não se responsabiliza por consequências causadas em decorrência deste artigo. Só mexa em aparelhos eletro-eletrônicos se for qualificado para tal.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;O-problema&quot;&gt;&lt;a href=&quot;#O-problema&quot; class=&quot;headerlink&quot; title=&quot;O problema&quot;&gt;&lt;/a&gt;O problema&lt;/h2&gt;&lt;p&gt;Possuo uma TV Plasma da Panasonic, o modelo é TC-P50UT20B que, ao que parece, é uma tropicalização da TX-50VT20B. Eu gosto de TVs de Plasma graças à profundidade do preto que estas telas oferecem, mas confesso que gostava mais da minha antiga TX-P50V20B (a versão não 3D e não - muito -tropicalizada). Bom mas isso é história para outro artigo.&lt;/p&gt;
&lt;p&gt;Da noite para o dia essa TV parou de ligar pelo controle remoto. Claro que troquei as pilhas do controle remoto sem sucesso. Também testei com um controle universal sem o menor sucesso. Para finalizar o diagnóstico eu apontei o controle remoto para a câmera do celular e é possível ver o LED IR (infravermelho) piscar. Se não é o controle remoto só pode ser a TV…&lt;br&gt;
    
    </summary>
    
    
      <category term="eletrônica" scheme="https://www.benito.com.br/tags/eletronica/"/>
    
  </entry>
  
  <entry>
    <title>CDN - Colocando o Blog em velocidade dobra</title>
    <link href="https://www.benito.com.br/2016/06/configurando-uma-cdn-para-acelerar-o-acesso-ao-blog/"/>
    <id>https://www.benito.com.br/2016/06/configurando-uma-cdn-para-acelerar-o-acesso-ao-blog/</id>
    <published>2016-06-15T05:00:41.000Z</published>
    <updated>2016-06-15T05:00:41.000Z</updated>
    
    <content type="html"><![CDATA[<p>Uma <em>Content Delivery Network</em> ou simplesmente CDN, é um serviço que provê cache do seu conteúdo armazenado em pontos estratégicos ao redor do globo. Esses pontos, estão, idealmente, mais próximos do cliente que solicita o conteúdo, portanto, a latência de acesso ao CDN é menor que até seu servidor.<br><a id="more"></a></p><p>O principal objetivo da CDN é diminuir a latência aumentando a velocidade do site, porém as CDN adicionam ainda, disponibilidade e redundância que os provedores mais básicos (<em>e baratos</em>) não conseguem entregar.</p><h2 id="AWS-Cloudfront"><a href="#AWS-Cloudfront" class="headerlink" title="AWS Cloudfront"></a><a href="https://aws.amazon.com/cloudfront/" title="Cloudfront page" target="_blank" rel="noopener">AWS Cloudfront</a></h2><p>Cloudfront é a CDN do Amazon Web Services e, como é costume do AWS, possui um <a href="https://aws.amazon.com/cloudfront/pricing/" title="Preço da Cloudfront" target="_blank" rel="noopener">preços atrativos</a> e <em>free tier</em> generoso. Já que esse site é <a href="/2016/06/hexo-aws-blog-s3-static-webhosting/" title="hospedado no AWS S3">hospedado no AWS S3</a>, utilizar o Cloudfront é natural.<blockquote><p>O Github Pages já possui uma CDN servindo seus sites. Embora não haja muito controle sobre como seu conteúdo é armazenado (<em>cache</em>) e distribuído, o serviço é totalmente grátis para projetos não comerciais.</p></blockquote></p><h3 id="Criando-uma-distribuicao"><a href="#Criando-uma-distribuicao" class="headerlink" title="Criando uma distribuição"></a>Criando uma distribuição</h3><p>Para criar um nova distribuição acesse o <a href="https://console.aws.amazon.com/cloudfront/" title="Console Cloudfront" target="_blank" rel="noopener">console</a> AWS e clique no serviço Cloudfront. Na tela que se abre clique no botão azul <code>Create Distribution</code>. Na tela seguinte será perguntado se você deseja criar uma CDN Web ou uma CDN RTMP, selecionamos o botão <code>Get Start</code> na sessão <code>Web</code>. A tela seguinte solicita as configurações da CDN, vou explicá-la por sessão.</p><h4 id="Origin-Settings"><a href="#Origin-Settings" class="headerlink" title="Origin Settings"></a>Origin Settings</h4><div class="figure right" style="width:85%;"><a class="fancybox" href="origin-settings.png" title="Configurações da Origem" data-fancybox-group="cdn"><img class="fig-img" src="origin-settings.png" style="width:85%;" alt="Configurações da Origem"></a><span class="caption">Configurações da Origem</span></div><div style="clear:both;"></div><p>A Cloudfront não precisa ser usada em conjunto com AWS S3, mas sim com qualquer servidor web. Nessa sessão colocaremos as informações da origem, ou seja o seu servidor de conteúdo que geralmente é um servidor web ou no meu caso o bucket S3. </p><p>No primeiro campo, <code>Origin Domain Name</code>, coloque o endereço do seu conteúdo, não o seu domínio pessoal mas sim o endereço servidor onde seu conteúdo está armazenado. Pode ser um nome ou um endereço IP disponibilizado pelo seu provedor. No caso de utilizar o AWS S3, o correto é colocar o <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html" title="VirtualHosting" target="_blank" rel="noopener">endereço (<em>endpoint</em>)</a> do bucket. </p><blockquote><p>O primeiro campo é traiçoeiro, ao clicar nele o console irá oferecer-lhe uma lista de seus buckets S3. <span class="highlight-text danger">Não utilize essa facilidade!</span><br>Use o endpoint do seu bucket, dessa forma a CDN irá buscar o conteúdo via HTTP e não como objetos do S3 na rede interna da AWS. Isso evita erros nas URL não terminadas em “/“. </p></blockquote> <p>O campo <code>Origin Path</code> pode deixar em branco a não ser que seu conteúdo esteja dentro de algum diretório, por exemplo <a href="http://www.exemplo.com/blog" target="_blank" rel="noopener">http://www.exemplo.com/blog</a> - nesse caso o path é <code>/blog</code>. </p><p>O campo <code>Origin Id</code> é um apelido para a origem, um identificador. O ID é interessante quando a distribuição possui diversas origens e através do ID fica fácil diferenciá-las, como esse não é o caso vamos deixar em branco. E por fim, os campos <code>Origin Custom Headers</code> devem ficar em branco para os fins deste artigo. Detalhes sobre sua utilidade estão fora do escopo deste artigo.</p><h4 id="Default-Cache-Behavior-Settings"><a href="#Default-Cache-Behavior-Settings" class="headerlink" title="Default Cache Behavior Settings"></a>Default Cache Behavior Settings</h4><div class="figure right" style="width:85%;"><a class="fancybox" href="default-settings.png" title="Configurações de Cache" data-fancybox-group="cdn"><img class="fig-img" src="default-settings.png" style="width:85%;" alt="Configurações de Cache"></a><span class="caption">Configurações de Cache</span></div><div style="clear:both;"></div><p>Nesta sessão as opções padrão estão boas para a maioria dos blogs estáticos. Sugiro <span class="highlight-text yellow">apenas mudar para `yes` a opção</span> assinalada em vermelho. A Cloudfront é capaz de servir o conteúdo compactado com gzip, para clientes que aceitam essa opção - praticamente a totalidade dos navegadores atualmente - isso economiza banda e acelera ainda mais o download do seu conteúdo. No futuro essas configurações podem ser modificadas para atender as necessidades que surgirem, por exemplo o uso de HTTPS.</p><h4 id="Distribution-Settings"><a href="#Distribution-Settings" class="headerlink" title="Distribution Settings"></a>Distribution Settings</h4><div class="figure right" style="width:85%;"><a class="fancybox" href="distribution-settings.png" title="Configurações da Distribuição" data-fancybox-group="cdn"><img class="fig-img" src="distribution-settings.png" style="width:85%;" alt="Configurações da Distribuição"></a><span class="caption">Configurações da Distribuição</span></div><div style="clear:both;"></div><blockquote class="pullquote right"><p>A opção padrão oferece melhor performance em todo o globo utilizando todos os servidores de borda disponíveis. É também a opção potencialmente mais cara.</p></blockquote>O campo `Price Class` permite escolher algumas combinações de *Edge Locations* onde essa distribuição estará ativa. Os *Edge Locations* são as localidades dos servidores da CDN. No momento desta publicação [há servidores][edge] nos EUA, Europa, Asia e América do Sul. Entretanto as combinações disponíveis para configuração não incluem América do Sul. (não se preocupe, a América do Sul está incluída em todas combinações através da opção região USA).<blockquote class="pullquote left"><p>Após configurar a CDN você deverá alterar a configuração do seu DNS para apontar os CNAMES aqui definidos para o <em>endpoint</em> da CDN.</p></blockquote>O campo <code>Alternate Domain Names</code> deve conter o nome de domínio registrado para servir o conteúdo.  No meu caso esse campo foi preenchido com <code>benito.com.br</code>, <code>www.benito.com.br</code> e  <code>blog.benito.com.br</code>. (no momento em que escrevo apenas os dois primeiros estão funcionando)<br><br>Nesse momento vamos manter os campos SSL como padrão e alterar o campo <code>Default Root Object</code> para <code>index.html</code>.(ou o nome do seu arquivo index padrão)<br><br>Finalize a configuração clicando no botão <code>Create Distribution</code>.<br><br><div class="figure right" style="width:85%;"><a class="fancybox" href="distribution.png" title="Distribuição criada" data-fancybox-group="cdn"><img class="fig-img" src="distribution.png" style="width:85%;" alt="Distribuição criada"></a><span class="caption">Distribuição criada</span></div><div style="clear:both;"></div><p>Anote o endereço destacado em vermelho na sua distribuição, vá até seu DNS server e configure o CNAME apropriado de seu domínio apontando para este endereço. No meu caso o endereço <code>www.benito.com.br</code> e <code>blog.benito.com.br</code> são CNAMES para essa distribuição, já o [domínio APEX] <code>benito.com.br</code> não pode ser do tipo CNAME e necessita tratamento especial, esta função depende de seu servidor DNS.</p><p>Perceba que sua distribuição está ativa e a do exemplo acima desativada, isso porque ela foi criada apenas para escrever esse artigo. Note ainda que ela está <code>in progress</code>, isso significa que os <a href="https://aws.amazon.com/cloudfront/details/" title="CF edge locations" target="_blank" rel="noopener">servidores de borda</a> ainda estão buscando seu conteúdo e preparando o cache. Pegue um café e relaxe, esse processo leva entre 15 e 30 minutos. Quando o processo terminar, o estado será <code>Deployed</code> e seu conteúdo estará sendo servido corretamente pela Cloudfront. </p><h3 id="Endpoint-S3-nao-aceita-HTTPS"><a href="#Endpoint-S3-nao-aceita-HTTPS" class="headerlink" title="Endpoint S3 não aceita HTTPS"></a>Endpoint S3 não aceita HTTPS</h3><p>Esse é um ponto que me causou alguns problemas até eu descobrir o que estava errado. O <em>endpoint</em> do bucket S3 só pode ser acessado por HTTP e não por HTTPS. Já a distribuição Cloudfront pode servir tanto HTTP quanto HTTPS e, por padrão, repassa as requisições à origem no mesmo protocolo que recebe. Dessa forma se alguém acessar o site através do HTTPS, a CF irá requisitar o conteúdo no S3 através de HTTPS resultando em um erro. </p><p>Para corrigir basta desabilitar o HTTPS na origem, essa opção não está disponível no momento em que se cria a distribuição. Para acessá-la, na tela da imagem anterior clique no ID da distribuição. Na tela que se abre clique na aba <code>Origin</code> e selecione a origem depois clique no botão <code>Edit</code>. Altere as opções conforme destaque na imagem abaixo e salve clicando em <code>Yes, edit</code></p><div class="figure right" style="width:85%;"><a class="fancybox" href="edit-origin.png" title="Edição da origem" data-fancybox-group="cdn"><img class="fig-img" src="edit-origin.png" style="width:85%;" alt="Edição da origem"></a><span class="caption">Edição da origem</span></div><div style="clear:both;"></div><h2 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h2><p>Utilizar um CDN para servir o conteúdo de um blog estático é uma boa estratégia já que todo o conteúdo pode ser armazenado em cache por algum período. Assim a CDN não só acelera o download do site mas também provê disponibilidade e redundância de servidores diminuindo o tráfego direto destinado ao seu provedor. O custo de uma CDN pode ser, inclusive com opções grátis no mercado, e os benefícios são muitos. A estrutura da Cloudfront é excelente para nós brasileiros pois possui servidores de borda no Rio de Janeiro e em São Paulo com latências baixíssimas para nossos leitores no Brasil.</p><p>Espero que esse artigo ajude você a por seu site em velocidade de dobra com a AWS Cloudfront. Vida longa e próspera!</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Uma &lt;em&gt;Content Delivery Network&lt;/em&gt; ou simplesmente CDN, é um serviço que provê cache do seu conteúdo armazenado em pontos estratégicos ao redor do globo. Esses pontos, estão, idealmente, mais próximos do cliente que solicita o conteúdo, portanto, a latência de acesso ao CDN é menor que até seu servidor.&lt;br&gt;
    
    </summary>
    
    
      <category term="AWS" scheme="https://www.benito.com.br/tags/aws/"/>
    
  </entry>
  
  <entry>
    <title>Hexo+Aws=Blog! - S3 static webhosting</title>
    <link href="https://www.benito.com.br/2016/06/hexo-aws-blog-s3-static-webhosting/"/>
    <id>https://www.benito.com.br/2016/06/hexo-aws-blog-s3-static-webhosting/</id>
    <published>2016-06-09T02:50:58.000Z</published>
    <updated>2016-06-15T03:00:58.000Z</updated>
    
    <content type="html"><![CDATA[<p>Chegou a hora de publicar, o comando <code>hexo server</code> abre um mini servidor para o blog mas não é feito para rodar em produção. No <a href="/2016/05/hexo-aws-blog/" title="primeiro artigo">primeiro artigo</a> ficou claro que procuramos uma solução onde não precisemos nos preocupar com servidores ou coisas como distribuição de carga. Procura-se um <em>static web-hosting</em>.<br><a id="more"></a></p><h2 id="Github-Pages"><a href="#Github-Pages" class="headerlink" title="Github Pages"></a>Github Pages</h2><p>Um serviço gratuito e com boa qualidade é oferecido pelo <a href="https://pages.github.com" target="_blank" rel="noopener">Github Pages</a>. Sua configuração é muito simples e para quem já está acostumado com o Git o setup pode ser feito em questão de minutos. O <em><a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">plugin</a></em> ‘hexo-deployer-git` automatiza o processo de upload (o termo correto aqui é <em>commit</em>) tornando a manutenção do blog muito simples. Porém o Github pages não dá muito controle sobre como seu conteúdo é servido e sua CDN não permite invalidar o conteúdo do cache.</p><h2 id="Amazon-S3"><a href="#Amazon-S3" class="headerlink" title="Amazon S3"></a>Amazon S3</h2><blockquote class="pullquote right"><p>A nuvem AWS possui várias regiões, utilizar a região mais próxima do público alvo diminui a latência.</p></blockquote><p>O <a href="https://aws.amazon.com/s3/" target="_blank" rel="noopener">Amazon S3</a> é um serviço de armazenamento de massa na nuvem. Ele trabalha com o conceito de <em>bucket</em> que pode ser entendido como um repositório ou um diretório raiz. O usuário pode ter quantos <em>buckets</em> quiser com nomes distintos e o <a href="https://aws.amazon.com/s3/pricing/" target="_blank" rel="noopener">custo</a> por Gigabyte armazenado é muito baixo. Além do armazenamento, um bucket pode ser configurado para servir, de forma estática, o conteúdo armazenado. Ainda, a nuvem AWS possui várias regiões e uma delas fica em São Paulo, se o bucket for criado nessa região a latência para usuários brasileiros é bastante baixa quando comparada a serviços de <em>hosting</em> localizados no exterior. Se você ainda não se convenceu, somados os custos de armazenamento e transferência de dados, um blog com 100 mil acessos semanais não custa um BigMac.</p><p>Então mãos à obra?</p><h3 id="Criando-o-bucket"><a href="#Criando-o-bucket" class="headerlink" title="Criando o bucket"></a>Criando o bucket</h3><blockquote class="pullquote right"><p>O nome do bucket não importa mas precisa ser único na região em que está sendo criado.</p></blockquote><p>Abra o <a href="https://console.aws.amazon.com/s3/home" target="_blank" rel="noopener">console</a> do Amazon S3 para criar o bucket do site. Não reaproveite outro bucket pois iremos configurá-lo para servir o conteúdo através do protocolo HTTP, todo o conteúdo do bucket estará exposto na Internet. Clique no botão <em>Create Bucket</em> e escolha uma região para o bucket. Outro ponto importante é o nome do bucket, o domínio de nomes é compartilhado entre todos os usuários do AWS, então se eu criar um bucket chamado <code>balde</code> e outro usuário tentar criar um bucket com mesmo nome ele terá problemas. Para evitar esses conflitos sugiro podemos:</p><ol><li>Prefixar o nome do bucket com seu nome de usuário Amazon (ideal para buckets privados que não servem conteúdo via HTTP). Exemplo <code>jsilva-balde</code>.</li><li>Prefixar o nome do bucket com o nome de domínio ou nome do domínio mais algum identificador (forma preferida para sites). Exemplos: <code>benito.com.br</code> ou <code>benito.com.br-site</code> e <code>benito.com.br-documentos</code>. Essa última forma ficar organizada se você tiver outros buckets para guardar informações privadas do site ou cliente.</li></ol><p>Coloque o nome e clique no botão <em>Create</em> para finalizar.</p><blockquote><p>Se pretende usar uma CDN para servir o site a região não importará</p></blockquote><div class="figure right" style="width:85%;"><a class="fancybox" href="create-bucket.png" title="Criar um Bucket" data-fancybox-group="bucket"><img class="fig-img" src="create-bucket.png" style="width:85%;" alt="Criar um Bucket"></a><span class="caption">Criar um Bucket</span></div><div style="clear:both;"></div><h3 id="Configurando-o-Bucket"><a href="#Configurando-o-Bucket" class="headerlink" title="Configurando o Bucket"></a>Configurando o Bucket</h3><p>Agora clique no botão <em>Properties</em> direita e depois em <em>Static Website Hosting</em>, selecione <em>Enable website hosting</em>. Indique o nome do arquivo <code>index</code>, esse é o arquivo padrão que o S3 irá procurar em cada diretório. Para Hexo basta preencher com <code>index.html</code>. O Hexo não fornece uma página de erro (<code>404</code>), se você possui uma página de erro informe o nome no campo correspondente. Sempre que o S3 não encontrar algo ele irá apresentar essa página ao invés de uma mensagem de erro críptica que assustará seus leitores para sempre!</p><div class="figure right" style="width:85%;"><a class="fancybox" href="config-bucket.png" title="Configurando o Bucket" data-fancybox-group="bucket"><img class="fig-img" src="config-bucket.png" style="width:85%;" alt="Configurando o Bucket"></a><span class="caption">Configurando o Bucket</span></div><div style="clear:both;"></div><p>Anote o <em>Endpoint</em> mostrado nessa tela, ele é o endereço de acesso do bucket na web.</p><p>O próximo passo é editar as permissões do bucket permitindo acesso público a esse bucket. Ainda nas propriedades, clique no item <em>Permissions</em> e depois no botão <em>Edit bucket policy</em>. No editor que abrirá coloque a política abaixo.</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"><span class="attr">"Version"</span>: <span class="string">"2008-10-17"</span>,</span><br><span class="line"><span class="attr">"Statement"</span>: [</span><br><span class="line">&#123;</span><br><span class="line"><span class="attr">"Sid"</span>: <span class="string">"Allow Public Access to All Objects"</span>,</span><br><span class="line"><span class="attr">"Effect"</span>: <span class="string">"Allow"</span>,</span><br><span class="line"><span class="attr">"Principal"</span>: &#123;</span><br><span class="line"><span class="attr">"AWS"</span>: <span class="string">"*"</span></span><br><span class="line">&#125;,</span><br><span class="line"><span class="attr">"Action"</span>: <span class="string">"s3:GetObject"</span>,</span><br><span class="line"><span class="attr">"Resource"</span>: <span class="string">"arn:aws:s3:::benito.com.br/*"</span></span><br><span class="line">&#125;</span><br><span class="line">]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Altere a linha para refletir o nome do bucket, salve e feche o edito. Está garantido o acesso público de leitura a todos os objetos do bucket.</p><p>Vamos aproveitar o embalo e adicionar a configuração de CORS (<em>Cross-Origin Resource Sharing</em>). Esse passo é importante para garantir que outros sites possam acessar seu conteúdo, por exemplo, uma CDN servindo o conteúdo do seu S3 ou um outro site referenciando um script Javascript servido por este bucket/site. Para isso clique no botão <em>Add CORS configuration</em>, ao lado do botão usado no passo anterior. No editor que se abrirá coloque a configuração abaixo.</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">CORSConfiguration</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">CORSRule</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">AllowedOrigin</span>&gt;</span>*<span class="tag">&lt;/<span class="name">AllowedOrigin</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">AllowedMethod</span>&gt;</span>GET<span class="tag">&lt;/<span class="name">AllowedMethod</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">MaxAgeSeconds</span>&gt;</span>3000<span class="tag">&lt;/<span class="name">MaxAgeSeconds</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">AllowedHeader</span>&gt;</span>Authorization<span class="tag">&lt;/<span class="name">AllowedHeader</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">CORSRule</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">CORSConfiguration</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Essa configuração é bastante permissiva e não vamos detalhar seu funcionamento agora. No futuro se pode alterar essa política conforme a necessidade do site. A Amazon provê uma vasta documentação a respeito.</p><h2 id="Upload"><a href="#Upload" class="headerlink" title="Upload"></a>Upload</h2><p>Para subir suas páginas HTML no bucket, utilize o método que mais lhe convir. Nesse momento sugiro o próprio S3 Console; clique no botão azul <em>upload</em>, agora arraste o arquivos da pasta <code>public</code> do seu Hexo para área cinza demarcada no S3 Console. Espere tudo o upload terminar e teste acessando o <em>endpoint</em> do seu bucket digitando <code>http://&lt;endpoint&gt;</code> no seu navegador.</p><p>Depois instalaremos um <a href="https://www.npmjs.com/package/hexo-deployer-s3-cloudfront" title="hexo-deployer-s3-cloudfront" target="_blank" rel="noopener">plugin</a> para fazer o upload diretamente do Hexo.</p><h1 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h1><p>Pronto! Apesar do post extenso, executar os passos descritos não levará mais que 15 minutos e seu site já está no ar. Não esqueça de verificar o valor do armazenamento S3 na região que você escolheu e simular o custo mensal na <a href="https://calculator.s3.amazonaws.com/index.html" title="calculadora de custos AWS" target="_blank" rel="noopener">calculadora AWS</a>. Vale lembrar que Amazon oferece um <em>free tier</em> generoso durante um ano para novos clientes.</p><p>Ah! Quase esqueço, se você tem um domínio e deseja servir o blog deste domínio precisa apontar um <code>CNAME</code> para o <em>endpoint</em> do seu S3 bucket. Explicarei com mais detalhes quando <a href="/2016/06/configurando-uma-cdn-para-acelerar-o-acesso-ao-blog/" title="configurarmos a CDN">configurarmos a CDN</a>. Até lá.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Chegou a hora de publicar, o comando &lt;code&gt;hexo server&lt;/code&gt; abre um mini servidor para o blog mas não é feito para rodar em produção. No &lt;a href=&quot;/2016/05/hexo-aws-blog/&quot; title=&quot;primeiro artigo&quot;&gt;primeiro artigo&lt;/a&gt; ficou claro que procuramos uma solução onde não precisemos nos preocupar com servidores ou coisas como distribuição de carga. Procura-se um &lt;em&gt;static web-hosting&lt;/em&gt;.&lt;br&gt;
    
    </summary>
    
    
      <category term="AWS" scheme="https://www.benito.com.br/tags/aws/"/>
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
      <category term="Nodejs" scheme="https://www.benito.com.br/tags/nodejs/"/>
    
  </entry>
  
  <entry>
    <title>Criando um formulário de contato para um site estático - Parte 2</title>
    <link href="https://www.benito.com.br/2016/05/formulario-de-contato-site-estatico-pt2/"/>
    <id>https://www.benito.com.br/2016/05/formulario-de-contato-site-estatico-pt2/</id>
    <published>2016-05-21T02:30:25.000Z</published>
    <updated>2016-06-02T01:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Na <a href="/2016/05/formulario-de-contato-site-estatico/" title="parte 1">parte 1</a> desse artigo nós criamos um formulário HTML dentro de uma página <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a>. O formulário envia os dados para um e-mail através do serviço <a href="https://formspree.io" target="_blank" rel="noopener">Formspree</a>.</p><p>Hoje iremos integrar o formulário ao tema e assim ganhar controle da apresentação do formulário podendo adicionar estilos e scripts e aproveitar as facilidades que seu tema disponibiliza. O tema que escolhi para meu blog é o <a href="https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak" target="_blank" rel="noopener">Tranquilpeak</a> e os exemplo abaixo serão baseados em sua estrutura. Porém, é fácil extrapolar isso para o tema de sua escolha.<br><a id="more"></a></p><h2 id="Layout"><a href="#Layout" class="headerlink" title="Layout"></a>Layout</h2><p>As páginas <code>source/contato/index.md</code> e <code>source/contato/sucesso.md</code> criadas na <a href="/2016/05/formulario-de-contato-site-estatico/" title="parte 1">parte 1</a> utilizam o layout <em>page</em>. Esse layout é obrigatório em todos os temas Hexo. Como o nome sugere ele difere do layout <em>post</em> e é voltado para criação de páginas do site. No <a href="https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak" target="_blank" rel="noopener">Tranquilpeak</a> v1.7.1 (mais atual enquanto escrevo esse artigo), o layout page contém:</p><figure class="highlight gcode"><figcaption><span>layout/page.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;<span class="meta">%</span>- partial<span class="comment">('_partial/post', &#123;post: page&#125;)</span> <span class="meta">%</span>&gt;</span><br></pre></td></tr></table></figure><p>A função <code>partial</code> carrega um outro arquivo passando o objeto JSON <code>{post: page}</code>. Esse modelo de carga de arquivos parciais é bastante poderoso como veremos a seguir. Alteraremos o arquivo acima para ficar assim:</p><figure class="highlight gcode"><figcaption><span>layout/page.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;<span class="meta">%</span> <span class="keyword">if</span> <span class="comment">(page.path.indexOf('contato')</span> &gt; <span class="number">-1</span>)&#123; <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span>- partial<span class="comment">('_partial/contact', &#123;post: page&#125;)</span> <span class="meta">%</span>&gt;</span><br><span class="line">&lt;<span class="meta">%</span> &#125; else &#123; <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span>- partial<span class="comment">('_partial/post', &#123;post: page&#125;)</span> <span class="meta">%</span>&gt;</span><br><span class="line">&lt;<span class="meta">%</span> &#125; <span class="meta">%</span>&gt;</span><br></pre></td></tr></table></figure><p>Nessa nova versão, toda página com layout page poderá ter carregado o layout <code>layout/_partial/post.ejs</code>ou o layout <code>layout/_partial/contact.ejs</code> dependendo do caminho na URL do site. Toda página cujo endereço contiver a palavra <em>contato</em> carregará o layout específico para páginas de contato, todas as outras continuam como antes. O arquivo <code>layout/_partial/contact.ejs</code> não existe no tema <a href="https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak" target="_blank" rel="noopener">Tranquilpeak</a> e devemos criá-lo:</p><figure class="highlight erb"><figcaption><span>layout/_partial/contact.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">article</span> <span class="attr">class</span>=<span class="string">"post"</span> <span class="attr">itemscope</span> <span class="attr">itemType</span>=<span class="string">"http://schema.org/BlogPosting"</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> <span class="keyword">if</span> (post.coverCaption) &#123; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">"post-header-cover-caption caption"</span>&gt;</span><span class="tag">&lt;<span class="name">%=</span></span></span><span class="ruby"> post.coverCaption </span><span class="xml"><span class="tag">%&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> &#125; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> <span class="keyword">if</span> (!post.coverImage <span class="params">||</span> post.coverMeta === <span class="string">'out'</span>) &#123; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">%-</span></span></span><span class="ruby"> partial(<span class="string">'contact/header'</span>)</span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> &#125; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"post-content markdown"</span> <span class="attr">itemprop</span>=<span class="string">"articleBody"</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"main-content-wrap"</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">%-</span></span></span><span class="ruby"> post.content </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">br</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> <span class="keyword">if</span> (post.form) &#123; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">            <span class="tag">&lt;<span class="name">%-</span></span></span><span class="ruby"> partial(<span class="string">'contact/form'</span>) </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> &#125; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;/<span class="name">article</span>&gt;</span></span></span><br></pre></td></tr></table></figure><p>O conteúdo foi extraído, com pouca modificação, do <code>layout/_partial/post.ejs</code>, assim a formatação fica similar. Utilizando um <code>&lt;DIV&gt;</code>com classe <em>“main-content-wrap”</em>, herdamos a formatação da área de conteúdo do site. E a linha <code>&lt;%- post.content %&gt;</code> é responsável por preencher o <code>&lt;DIV&gt;</code> com o conteúdo do arquivo <code>.md</code> já traduzido de <em>markdown</em> para HTML. Através da condição <code>&lt;% if (post.form) { %&gt;</code>, a variável <code>form</code> controla a inserção do conteúdo do arquivo <code>layout/_partial/contact/form</code>. </p><figure class="highlight accesslog"><figcaption><span>layout/_partial/contact/form.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;form action=<span class="string">"https://formspree.io/&lt;%= theme.author.email %&gt;"</span> method=<span class="string">"<span class="keyword">POST</span>"</span>&gt;</span><br><span class="line">    &lt;input type=<span class="string">"text"</span> name=<span class="string">"name"</span>&gt;</span><br><span class="line">    &lt;input type=<span class="string">"email"</span> name=<span class="string">"_replyto"</span>&gt;</span><br><span class="line">    &lt;input type=<span class="string">"submit"</span> value=<span class="string">"Send"</span>&gt;</span><br><span class="line">&lt;/form&gt;</span><br></pre></td></tr></table></figure><p>Repare na utilização da variável provida pelo tema <code>theme.author.email</code> para preencher o action do formulário. Dessa forma a solução fica mais portável. Os arquivo <code>source/contato/index.md</code> e <code>source/contato/sucesso.md</code> alterados estão abaixo. O formulário migrou do arquivo de markdown <code>contato/index.md</code> para o layout <code>form.ejs</code> e foi acrescentada a variável form ao <em>front-matter</em>.</p><figure class="highlight yaml"><figcaption><span>source/contato/index.md</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">title:</span> <span class="string">Contato</span></span><br><span class="line"><span class="attr">layout:</span> <span class="string">page</span></span><br><span class="line"><span class="attr">form:</span> <span class="literal">true</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="string">Deixa</span> <span class="string">sua</span> <span class="string">mensagem!</span></span><br></pre></td></tr></table></figure><figure class="highlight yaml"><figcaption><span>source/contato/sucesso.md</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">title:</span> <span class="string">Contato</span></span><br><span class="line"><span class="attr">layout:</span> <span class="string">page</span></span><br><span class="line"><span class="attr">form:</span> <span class="literal">false</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="string">Obrigado</span> <span class="string">por</span> <span class="string">nos</span> <span class="string">enviar</span> <span class="string">uma</span> <span class="string">mensagem!</span></span><br></pre></td></tr></table></figure><p>Eu particularmente não gosto que a data de postagem seja incluída junto ao título da página de contato. Retirei ela criando um novo cabeçalho para as páginas de contato em <code>layout/_partial/contact/header</code>.</p><figure class="highlight erb"><figcaption><span>layout/_partial/contact/header</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"post-header main-content-wrap &lt;%=</span></span></span><span class="ruby"> (post.metaAlignment ? <span class="string">'text-'</span> + post.metaAlignment : <span class="string">'text-left'</span>) </span><span class="xml"><span class="tag"><span class="string">%&gt;"</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> <span class="keyword">if</span> (post.link) &#123; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">h1</span> <span class="attr">itemprop</span>=<span class="string">"headline"</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">"link"</span> <span class="attr">href</span>=<span class="string">"&lt;%-</span></span></span><span class="ruby"> url_for(post.link) </span><span class="xml"><span class="tag"><span class="string">%&gt;"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">itemprop</span>=<span class="string">"url"</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">%=</span></span></span><span class="ruby"> post.title <span class="params">||</span> <span class="string">'('</span> + _<span class="number">_</span>(<span class="string">'post.no_title'</span>) + <span class="string">')'</span> </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> &#125; <span class="keyword">else</span> &#123; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;<span class="name">h1</span> <span class="attr">class</span>=<span class="string">"post-title"</span> <span class="attr">itemprop</span>=<span class="string">"headline"</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;<span class="name">%=</span></span></span><span class="ruby"> post.title <span class="params">||</span> <span class="string">'('</span> + _<span class="number">_</span>(<span class="string">'post.no_title'</span>) + <span class="string">')'</span> </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml">    <span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">%</span></span></span><span class="ruby"> &#125; </span><span class="xml"><span class="tag">%&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br></pre></td></tr></table></figure><h3 id="Conclusao"><a href="#Conclusao" class="headerlink" title="Conclusão"></a>Conclusão</h3><p>O que foi apresentado até aqui integra o formulário HTML ao conteúdo do site, permite que os arquivo <code>.md</code> controlem o conteúdo das páginas mas delega o layout do formulário ao tema. Ainda é preciso criar alguns estilos <code>CSS</code> para os campos e legendas pois o <a href="https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak" target="_blank" rel="noopener">Tranquilpeak</a> não prevê o uso de campos de formulário. Porém, utilizando o tema dessa forma fica simples reaproveitar o que o tema oferece e ainda acrescentar estilos e scripts ao formulário.</p><p><strong>Edição:</strong> Após terminar de escrever, revisar esse artigo, já com ele pronto para publicação percebi que seria mais elegante, ao invés de editar o layout <em>page</em> para escolher entre os arquivos parciais, criar um novo layout chamado contato e declará-lo no <code>front-matter</code>do arquivo <code>.md</code>. Apesar de mais elegante essa solução demanda mais alterações no tema ficando, então, para outra oportunidade.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Na &lt;a href=&quot;/2016/05/formulario-de-contato-site-estatico/&quot; title=&quot;parte 1&quot;&gt;parte 1&lt;/a&gt; desse artigo nós criamos um formulário HTML dentro de uma página &lt;a href=&quot;https://hexo.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt;. O formulário envia os dados para um e-mail através do serviço &lt;a href=&quot;https://formspree.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Formspree&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hoje iremos integrar o formulário ao tema e assim ganhar controle da apresentação do formulário podendo adicionar estilos e scripts e aproveitar as facilidades que seu tema disponibiliza. O tema que escolhi para meu blog é o &lt;a href=&quot;https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tranquilpeak&lt;/a&gt; e os exemplo abaixo serão baseados em sua estrutura. Porém, é fácil extrapolar isso para o tema de sua escolha.&lt;br&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>Criando um formulário de contato para um site estático</title>
    <link href="https://www.benito.com.br/2016/05/formulario-de-contato-site-estatico/"/>
    <id>https://www.benito.com.br/2016/05/formulario-de-contato-site-estatico/</id>
    <published>2016-05-20T22:31:42.000Z</published>
    <updated>2016-06-02T01:33:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Sites estáticos são legais por muitos motivos. São rápidos, seguros já que não há interação com o servidor, são fáceis de gerenciar e criar com ferramentas como <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a> e <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a>. Mas todas essas benesses não vêm sem um custo. Um típico formulário de contato é impossível de ser implementado em sites totalmente estáticos. Será?<br><a id="more"></a><br>Com o serviço <a href="https://formspree.io" target="_blank" rel="noopener">Formspree</a> basta submeter seu formulário para o endereço <a href="https://formspree.io/seu@email.com.br" target="_blank" rel="noopener">formspree.io/seu@email.com.br</a> e receber os dados do formulário diretamente em sua caixa postal. Simples, fácil e grátis! </p><p>Veja o formulário básico:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">action</span>=<span class="string">"https://formspree.io/your@email.com"</span> <span class="attr">method</span>=<span class="string">"POST"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">name</span>=<span class="string">"name"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"email"</span> <span class="attr">name</span>=<span class="string">"_replyto"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"Send"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="Integrando-com-o-Hexo"><a href="#Integrando-com-o-Hexo" class="headerlink" title="Integrando com o Hexo"></a>Integrando com o Hexo</h2><h3 id="Modo-rapido-e-feio"><a href="#Modo-rapido-e-feio" class="headerlink" title="Modo rápido (e feio!)"></a>Modo rápido (e feio!)</h3><p>No <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a> basta criar uma página (não um post) chamado contato:</p><p><code>$ hexo new page contato</code></p><p>Uma página nova será criada em <code>source/contato/index.md</code>, edite esse arquivo para conter algo similar a:</p><figure class="highlight markdown"><figcaption><span>source/contato/index.md</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">title: Contato</span><br><span class="line">layout: page</span><br><span class="line">---</span><br><span class="line">Deixa sua mensagem!</span><br><span class="line"></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">form</span> <span class="attr">action</span>=<span class="string">"https://formspree.io/your@email.com"</span></span></span></span><br><span class="line"><span class="xml">  method="POST"&gt;</span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">name</span>=<span class="string">"name"</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"email"</span> <span class="attr">name</span>=<span class="string">"_replyto"</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"Send"</span>&gt;</span></span></span><br><span class="line"><span class="xml"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span></span><br></pre></td></tr></table></figure><p>Nesse ponto o formulário já funciona e pode ser acessado em <code>http://seu.dominio.com/contato/</code>. Mas vamos melhorar um pouco a experiência do usuário acrescentando uma página personalizada de sucesso após o envio da mensagem. Para isso vamos criar o arquivo <code>source/contato/sucesso.md</code>.</p><figure class="highlight markdown"><figcaption><span>source/contato/sucesso.md</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">title: Contato</span><br><span class="line">layout: page</span><br><span class="line">---</span><br><span class="line">Obrigado por nos enviar uma mensagem!</span><br></pre></td></tr></table></figure><p>E acrescentamos um campo escondido ao formulário no arquivo <code>source/contato/index.md</code>.<br><em>(mais detalhes sobre os campos escondidos veja o site <a href="https://formspree.io" target="_blank" rel="noopener">formspree.io</a>)</em></p><p><code>&lt;input type=&quot;hidden&quot; name=&quot;_next&quot; value=&quot;//seu.dominio.com/contato/sucesso.html&quot; /&gt;</code></p><p>Esse campo não aparece para o usuário e instrui o <a href="https://formspree.io" target="_blank" rel="noopener">formspree</a> a retornar para a página de sucesso depois de enviar o formulário.</p><p>Pronto! O formulário de contato está integrado ao site.</p><h4 id="Pontos-negativos"><a href="#Pontos-negativos" class="headerlink" title="Pontos negativos"></a>Pontos negativos</h4><ul><li>O endereço e-mail fica aberto à <em>scrappers</em>, porém colocar um <code>mailto:</code> no site teria o mesmo efeito. Também, as ferramentas de e-mail modernas são muito boas em filtrar spam.</li><li>Esse método oferece pouco controle sobre a apresentação do formulário, isso porque o Hexo irá interpretar o arquivo <code>.md</code> como markdown. Isso não altera diretamente o código HTML do formulário mas torna difícil controlar o resultado final.</li><li>O resultado pode variar muito de acordo com o tema utilizado. Essas variações podem não ser agradáveis.</li></ul><p>Uma alternativa para ter mais controle sobre a apresentação do formulário é criar o HTML completo ao invés de um <code>.md</code>. O Hexo vai apenas copiar o HTML para o site final. Mas isso requer cópia da estrutura gerada pelo Hexo para dentro do HTML manualmente afim de fazê-lo se parecer com uma página do site. Manter a sincronia dos arquivos pode se tornar trabalhoso.</p><p>Outra saída é personalizar o tema. Explicarei os detalhes de como fazer isso na <a href="/2016/05/formulario-de-contato-site-estatico-pt2/" title="parte 2">parte 2</a> desse artigo.</p><h4 id><a href="#" class="headerlink" title></a><a href="/2016/05/formulario-de-contato-site-estatico-pt2/" title="continua...">continua...</a></h4>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Sites estáticos são legais por muitos motivos. São rápidos, seguros já que não há interação com o servidor, são fáceis de gerenciar e criar com ferramentas como &lt;a href=&quot;https://hexo.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt; e &lt;a href=&quot;https://jekyllrb.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jekyll&lt;/a&gt;. Mas todas essas benesses não vêm sem um custo. Um típico formulário de contato é impossível de ser implementado em sites totalmente estáticos. Será?&lt;br&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hexo+Aws=Blog! - Hexo para leigos (parte 1)</title>
    <link href="https://www.benito.com.br/2016/05/hexo-aws-blog-hexo-para-leigos-parte-1/"/>
    <id>https://www.benito.com.br/2016/05/hexo-aws-blog-hexo-para-leigos-parte-1/</id>
    <published>2016-05-19T02:45:23.000Z</published>
    <updated>2016-06-02T01:24:30.000Z</updated>
    
    <content type="html"><![CDATA[<p>No <a href="/2016/05/hexo-aws-blog/" title="primeiro artigo">primeiro artigo</a> expliquei as motivações por trás da criação desse blog e porque optei por criar um site estático e armazená-lo utilizando os serviços do <a href="//aws.amazon.com">Amazon Web Services</a>. Nesta primeira parte da série vamos abordar o básico: <a href="//hexo.io">Hexo</a>!<br><a id="more"></a><br>O Hexo é um <em>framework</em> para desenvolvimento de blogs estáticos com diversos <a href="//hexo.io/plugins/">plugins</a> que o tornam ainda mais poderoso. Ele é desenvolvido utilizando o <a href="//nodejs.org/en/">Node.js</a>, um interpretador javascript desenvolvido com base no <a href="//developers.google.com/v8/"><em>motor</em> javascript Chrome V8</a>.</p><p>Se você já conhece e utiliza o Node.js, basta instalar o Hexo. Eu precisei instalar o Node.js em meu Ubuntu, e a maneira mais prática que encontrei para fazê-lo foi através do <em>nvm</em>; a forma também descrita na documentação do Hexo. No terminal do Ubuntu, como usuário normal (não root) fiz:</p><p><code>$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh</code></p><p>E em seguida usei o <code>nvm</code> para instalar o Node.js.</p><p><code>$ nvm install 4.4.3</code></p><p>Muitos tutoriais na internet utilizam a versão 0.12 do Node.js com o Hexo, mas alguns plugins e módulos do próprio Node.js requerem a versão mais nova. Então preferi instalar a versão LTS, v4.4.3 enquanto escrevo esse artigo. Também poderia baixar o instalador no site do <a href="//nodejs.org/en/">Node.js</a>. Caso tenha usado o <code>nvm</code>, em novas sessões do terminal é importante ativar o Node.js rodando <code>nvm use 4.4.3</code>.</p><h2 id="Instalando-o-Hexo-e-iniciando-o-blog"><a href="#Instalando-o-Hexo-e-iniciando-o-blog" class="headerlink" title="Instalando o Hexo e iniciando o blog"></a>Instalando o Hexo e iniciando o blog</h2><p>Depois foi só instalar o <a href="//hexo.io">Hexo</a>. No momento em que esse artigo é escrito a versão mais recente é a 3.2.0.</p><p><code>$ npm install hexo-cli -g</code></p><p>Para iniciar o blog</p><figure class="highlight shell"><figcaption><span>Iniciar o novo blog</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> hexo init meuBlog</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> <span class="built_in">cd</span> meuBlog</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> npm install</span></span><br></pre></td></tr></table></figure><p>O último comando é responsável por instalar os pacotes Node.js dos quais o hexo depende para gerar o blog. Para quem já trabalha com Node.js não é novidade, mas é importante saber que o diretório do blog é como uma espécie de sistema desenvolvido em Node.js. O Hexo e todas os pacotes dos quais eles dependente são instalados dentro do diretório do blog.</p><p>Para ver o blog rodando, o Hexo possui um mini servidor:</p><p><code>$ hexo server</code></p><p>Acesse o conteúdo apontando seu navegador para <a href="http://localhost:4000" target="_blank" rel="noopener">http://localhost:4000</a>.</p><h2 id="Controlando-seu-blog-com-Git"><a href="#Controlando-seu-blog-com-Git" class="headerlink" title="Controlando seu blog com Git"></a>Controlando seu blog com <a href="//git-scm.com" title="Git">Git</a></h2><p>Esse passo é opcional mas muito recomendado. Como alterações nas configurações, testes, novos artigos são operações freqüentes no blog, o versionamento do conteúdo é uma excelente maneira de manter registro dessas modificações e, de quebra, adicionar um pouco de proteção a desastres (sem dispensar o backup). Após inicializar o blog com Hexo, inicializei um repositório <a href="//git-scm.com" title="Git">Git</a>:</p><p><code>$ git init</code></p><p>Coloquei um arquivo <code>.gitignore</code> no repositório para instruir o git a ignorar arquivos que não devem ser rastreados.</p><figure class="highlight stylus"><figcaption><span>.gitignore</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">.DS_Store</span><br><span class="line">Thumbs.db</span><br><span class="line">db.json</span><br><span class="line">*.log</span><br><span class="line">node_modules/</span><br><span class="line">public/</span><br><span class="line">.deploy*/</span><br><span class="line">*~</span><br></pre></td></tr></table></figure><p>E adicionei os arquivos ao repositório:</p><figure class="highlight dockerfile"><figcaption><span>adicionar arquivos ao repositório</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="keyword">add</span><span class="bash"> *</span></span><br><span class="line">$ git commit -m <span class="string">"Blog: estado inicial"</span></span><br></pre></td></tr></table></figure><p>A cada alteração importante eu gravo um <em>snapshot</em> no repositório com um novo <em>commit</em>. Dessa forma posso retroceder a qualquer momento no tempo e restaurar um estado funcional do site.</p><h2 id="Arquivos-do-site"><a href="#Arquivos-do-site" class="headerlink" title="Arquivos do site"></a>Arquivos do site</h2><p>Um site recém gerado com Hexo contém:</p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>_config.yml</td><td>Configuração do blog e <a href="//hexo.io/plugins/">plugins</a> do Hexo</td></tr><tr><td>package.json</td><td>Lista de npm packages necessários para o blog</td></tr><tr><td>scaffolds</td><td>Modelo dos layouts disponíveis (<code>draft</code>, <code>post</code>, <code>page</code>)</td></tr><tr><td>source</td><td>Arquivos dos posts, páginas e conteúdo do site</td></tr><tr><td>themes</td><td>Temas instalados, por padrão o Hexo traz o tema Landscape, esse site usa o <a href="//github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/">Tranquilpeak</a></td></tr></tbody></table><p>Veja a listagem deste blog.</p><figure class="highlight bash"><figcaption><span>Hexo file structure</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">drwxrwxr-x 6 jrbenito jrbenito 4096 Mai 19 00:43 .</span><br><span class="line">drwxrwxr-x 5 jrbenito jrbenito 4096 Mai 19 00:43 ..</span><br><span class="line">-rw-rw-r-- 1 jrbenito jrbenito 2203 Mai 19 00:43 _config.yml</span><br><span class="line">drwxrwxr-x 8 jrbenito jrbenito 4096 Mai 19 00:43 .git</span><br><span class="line">-rw-rw-r-- 1 jrbenito jrbenito   71 Mai 19 00:43 .gitignore</span><br><span class="line">-rw-rw-r-- 1 jrbenito jrbenito  727 Mai 19 00:43 package.json</span><br><span class="line">drwxrwxr-x 2 jrbenito jrbenito 4096 Mai 19 00:43 scaffolds</span><br><span class="line">drwxrwxr-x 7 jrbenito jrbenito 4096 Mai 19 00:43 <span class="built_in">source</span></span><br><span class="line">drwxrwxr-x 4 jrbenito jrbenito 4096 Mai 19 00:43 themes</span><br><span class="line">-rw-rw-r-- 1 jrbenito jrbenito 2590 Mai 19 00:43 .travis.yml</span><br></pre></td></tr></table></figure><p>Os arquivos <code>.git</code> e <code>.gitignore</code> são específicos dos repositório <a href="//git-scm.com" title="Git">git</a>; o <code>.travis·yml</code> também não pertence ao Hexo e sua função é assunto para outro post.</p><h2 id="Feito"><a href="#Feito" class="headerlink" title="Feito!"></a>Feito!</h2><p>Pronto, agora é só personalizar o blog através das configurações e temas.</p><p>Dentre os geradores de sites que conheci, escolhi o hexo por sua simplicidade e por rodar em diversas plataformas sem problemas de compatibilidade possibilitando que eu edite esse blog em casa no Linux ou em uma máquina windows <em>on the go</em>. Continuando minha saga escreverei ainda sobre como hospedar o blog no <a href="//aws.amazon.com">AWS S3</a> e configurar uma CDN para acelerar o acesso ao site.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;No &lt;a href=&quot;/2016/05/hexo-aws-blog/&quot; title=&quot;primeiro artigo&quot;&gt;primeiro artigo&lt;/a&gt; expliquei as motivações por trás da criação desse blog e porque optei por criar um site estático e armazená-lo utilizando os serviços do &lt;a href=&quot;//aws.amazon.com&quot;&gt;Amazon Web Services&lt;/a&gt;. Nesta primeira parte da série vamos abordar o básico: &lt;a href=&quot;//hexo.io&quot;&gt;Hexo&lt;/a&gt;!&lt;br&gt;
    
    </summary>
    
    
      <category term="AWS" scheme="https://www.benito.com.br/tags/aws/"/>
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
      <category term="Nodejs" scheme="https://www.benito.com.br/tags/nodejs/"/>
    
  </entry>
  
  <entry>
    <title>Hexo + AWS = Blog!</title>
    <link href="https://www.benito.com.br/2016/05/hexo-aws-blog/"/>
    <id>https://www.benito.com.br/2016/05/hexo-aws-blog/</id>
    <published>2016-05-06T23:00:00.000Z</published>
    <updated>2019-02-19T02:08:36.423Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Introducao"><a href="#Introducao" class="headerlink" title="Introdução"></a>Introdução</h1><p>Recentemente meu irmão iniciou um <a href="http://counsellor.life" target="_blank" rel="noopener">projeto</a> para sua esposa; um site com sua apresentação profissional e um fomulário de contato para que seus clientes pudessem encontrá-la. Ele já tinha um esboço do trabalho e estava hospedando junto ao site de um amigo apenas para teste. Começamos a conversar sobre qual domínio registrar, qual hospedagem contratar, qual tamanho da demanda e claro: preço! </p><p>Já há algum tempo que eu venho maturando a ideia de iniciar um blog com o objetivo de documentar meus projetos pessoais, compartilhar informação e manter organizado aquele conhecimento resultado de horas na Internet tentando resolver algum problema (geralmente simples). A discussão sobre o projeto para minha cunhada foi a faísca para que eu mergulhasse em uma pesquisa sobre sites, hospedagem, custos, tecnologias e acabasse por escrever esse primeiro post.<br><a id="more"></a></p><h1 id="Estatico-vs-Dinamico"><a href="#Estatico-vs-Dinamico" class="headerlink" title="Estático vs. Dinâmico"></a>Estático vs. Dinâmico</h1><p>O modelo mais comum de website contém uma mistura de páginas com conteúdo estático e páginas de conteúdo dinâmico que se alteram de acordo com a interação entre o usuário e o sistema. Por exemplo, uma oficina mecânica teria em seu site páginas de informações estáticas como endereço, serviços prestados, fotos do local e um sistema para confecção de orçamentos via internet que gera conteúdo dinamicamente.</p><p>Sistemas web necessitam que seu código fonte seja executado no servidor, também costumam depender de bancos de dados e essa estrutura pode ser bem grande e depender de vários computadores para funcionar. Um bom provedor de hospedagem oferece pacotes que alocam recursos computacionais de acordo com a necessidade dos usuários.</p><p>Já o conteúdo estático precisa apenas ser transmitido de um servidor para o cliente, geralmente um navegador web. Esse processo não envolve grande poder computacional e ainda há a possibilidade de cache diminuindo o tráfego de dados sendo possível a utilização de pacotes de serviços mais baratos e com menos recursos computacionais.</p><p>Para o projeto de minha cunhada, meu irmão e eu chegamos a conclusão que um conjunto de páginas estáticas em HTML5, CSS e Javascript seria suficiente. </p><h1 id="Hospedagem"><a href="#Hospedagem" class="headerlink" title="Hospedagem"></a>Hospedagem</h1><p>Na pesquisa por hospedagem eu encontrei nos serviços <a href="https://aws.amazon.com" title="Amazon Web Services" target="_blank" rel="noopener">AWS da Amazon</a> uma alternativa muito interessante. O [Amazon Web Services] é o nome comercial de um dos maiores serviços de computação em nuvem do planeta. Eles comercializam serviços com preços atrativos e faixas de consumo que se adaptam ao tipo do usuário.</p><p>O serviço <a href="https://aws.amazon.com/s3" title="Amazon Simple Storage  Service" target="_blank" rel="noopener">S3</a> é uma espécie de disco rígido virtual onde se pode armazenar quantidades absurdas de dados com garantias de durabilidade, versionamento e preços atrativos. O <a href="https://aws.amazon.com/s3" title="Amazon Simple Storage  Service" target="_blank" rel="noopener">S3</a> é capaz de servir o conteúdo armazenado em forma de site estático, o custo por GB é baixo, ele oferece um <em>free tier</em> para novos clientes que é suficiente para acomodar sem custos o projeto de minha cunhada nos primeiros meses. Problema resolvido.</p><p>Também através dessas pesquisas eu conheci o <a href="http://hexo.io/" title="Hexo.io" target="_blank" rel="noopener">Hexo</a> um gerador de sites estáticos escrito em <a href="http://nodejs.org" title="NodeJs.org" target="_blank" rel="noopener">Node.js</a>, cheio de plugins e de fácil automação. Perfeito para iniciar meu blog e hospedá-lo no <a href="https://aws.amazon.com" title="Amazon Web Services" target="_blank" rel="noopener">AWS</a>.</p><h1 id="Nasce-mais-um-blog"><a href="#Nasce-mais-um-blog" class="headerlink" title="Nasce mais um blog"></a>Nasce mais um blog</h1><p>Inspirado pela pesquisa e satisfazendo um desejo antigo estou iniciando esse blog utilizando:</p><ul><li><a href="https://aws.amazon.com" title="Amazon Web Services" target="_blank" rel="noopener">Amazon AWS</a> como <em>backend</em></li><li><a href="http://hexo.io/" title="Hexo.io" target="_blank" rel="noopener">Hexo</a> para gerar o site</li><li><a href="https://draftin.com" title="WRITE BETTER WITH DRAFT" target="_blank" rel="noopener">Draftin</a> para escrever esse post</li></ul><p>Além de um nome pouco criativo para o blog.</p><p>Nos próximos artigos eu farei um passo à passo de como coloquei esse blog no ar, a configuração do Hexo, Node.js, dos plugins e dos serviços AWS. Fique ligado.</p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;Introducao&quot;&gt;&lt;a href=&quot;#Introducao&quot; class=&quot;headerlink&quot; title=&quot;Introdução&quot;&gt;&lt;/a&gt;Introdução&lt;/h1&gt;&lt;p&gt;Recentemente meu irmão iniciou um &lt;a href=&quot;http://counsellor.life&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;projeto&lt;/a&gt; para sua esposa; um site com sua apresentação profissional e um fomulário de contato para que seus clientes pudessem encontrá-la. Ele já tinha um esboço do trabalho e estava hospedando junto ao site de um amigo apenas para teste. Começamos a conversar sobre qual domínio registrar, qual hospedagem contratar, qual tamanho da demanda e claro: preço! &lt;/p&gt;
&lt;p&gt;Já há algum tempo que eu venho maturando a ideia de iniciar um blog com o objetivo de documentar meus projetos pessoais, compartilhar informação e manter organizado aquele conhecimento resultado de horas na Internet tentando resolver algum problema (geralmente simples). A discussão sobre o projeto para minha cunhada foi a faísca para que eu mergulhasse em uma pesquisa sobre sites, hospedagem, custos, tecnologias e acabasse por escrever esse primeiro post.&lt;br&gt;
    
    </summary>
    
    
      <category term="AWS" scheme="https://www.benito.com.br/tags/aws/"/>
    
      <category term="Hexo" scheme="https://www.benito.com.br/tags/hexo/"/>
    
  </entry>
  
</feed>
