<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title></title>
    <description>Feito é melhor que perfeito.</description>
    <link>https://raelmax.github.io/</link>
    <atom:link href="https://raelmax.github.io/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Mon, 06 Sep 2021 21:34:47 +0000</pubDate>
    <lastBuildDate>Mon, 06 Sep 2021 21:34:47 +0000</lastBuildDate>
    <generator>Jekyll v3.9.0</generator>
    
      <item>
        <title>PEX: Empacotando projetos python e suas dependências em um único arquivo</title>
        <description>&lt;p&gt;Antes de começar a falar do PEX é importante conhecer um comportamento pouco explorado do interpretador do Python. Para isso vamos criar um arquivo de exemplo com o seguinte conteúdo e chamá-lo de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.py&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Tudo ok! Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;O código pode ser executado com o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python teste.py&lt;/code&gt;. Mas para o nosso exemplo tentaremos executá-lo assim:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;python .&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Mas receberemos um erro que diz que não existe um módulo “main” no diretório atual, o que é verdade já que nosso único o arquivo se chama &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.py&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;/Users/raelmax/.pyenv/versions/2.7.13/bin/python: can&lt;span class=&quot;s1&quot;&gt;'t find '&lt;/span&gt;__main__&lt;span class=&quot;s1&quot;&gt;' module in '&lt;/span&gt;.&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Nesse momento você já deve ter percebido qual é o tal comportamento pouco explorado. Se mudarmos o nome do nosso arquivo de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;teste.py&lt;/code&gt; para &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__main__.py&lt;/code&gt; ao executarmos o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python .&lt;/code&gt; o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__main__.py&lt;/code&gt; será executado, exemplo:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;teste.py __main__.py
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;python &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
Tudo ok! Hello World!&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Indo um pouco além podemos “zipar” esse arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__main__.py&lt;/code&gt; e o comportamento do interpretador não muda:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;zip teste.zip __main__.py
  adding: __main__.py &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;stored 0%&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;python teste.zip
Tudo ok! Hello World!&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Podemos também criar um diretório contendo nosso arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__main__.py&lt;/code&gt; e executá-lo da mesma forma:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;teste
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;__main__.py teste/
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;python teste
Tudo ok! Hello World!&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Esses comportamentos são padrões do interpretador do python, foram melhorados com a &lt;a href=&quot;https://www.python.org/dev/peps/pep-0441/&quot;&gt;PEP 441&lt;/a&gt; e o PEX usa para criar ambientes python independentes, que é o nosso objetivo.&lt;/p&gt;

&lt;h3 id=&quot;o-que-é-o-pex&quot;&gt;O que é o PEX&lt;/h3&gt;

&lt;p&gt;O PEX é o responsável por gerar arquivos independentes que contém um ambiente python completo, como um virtualenv. Ao gerar um arquivo PEX ele cuida dos detalhes necessários para criar um arquivo “zip” que atenda aos padrões do interpretador do python, adicionando um arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__main__.py&lt;/code&gt; e o header &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#!/usr/bin/env python&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A documentação do projeto é bem completa e dá mais detalhes sobre como tudo funciona, você pode conferir aqui: &lt;a href=&quot;https://pex.readthedocs.io/en/stable/index.html&quot;&gt;https://pex.readthedocs.io/&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;instalando-o-pex&quot;&gt;Instalando o PEX&lt;/h3&gt;

&lt;p&gt;A instalação é feita usando o pip, como qualquer outro pacote python:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pex&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Eu encontrei um pequeno probleminha nessa abordagem de instalação porque ela requer que você tenha um virtualenv ativo ou permissão para instalar como um pacote global. Para conseguir fugir desses dois pontos eu fiz um pequeno script que baixa, instala no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/&lt;/code&gt; e cria um executável PEX usando o próprio PEX:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; https://bit.ly/pex-standalone | bash&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Caso você tenha usado a primeira abordagem você terá disponível o comando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pex&lt;/code&gt;, se você optou por usar o meu script você precisará executar com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./pex&lt;/code&gt;. Nas dicas a seguir eu usarei o arquivo gerado pelo meu script.&lt;/p&gt;

&lt;h3 id=&quot;ambientes-virtuais-temporários&quot;&gt;Ambientes virtuais temporários&lt;/h3&gt;

&lt;p&gt;Com o PEX instalado podemos criar ambientes virtuais tanto temporários quanto permanentes. Para exemplificar vamos criar um ambiente virtual com a biblioteca &lt;a href=&quot;http://docs.python-requests.org/en/master/&quot;&gt;requests&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./pex &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; requests
  urllib3 1.22pex :: Resolving distributions
  requests 2.18.4
  certifi 2017.7.27.1
  chardet 3.0.4
  idna 2.6
pex: Building pex: 1249.6ms
pex:   Resolving distributions: 1243.7ms
Running PEX file at /var/folders/lp/bl8845jd6td_f_f99jfm034r0000gn/T/tmpQvgSXG with args &lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt;
pex: PEX.run invoking /Users/raelmax/.pyenv/versions/2.7.13/bin/python2.7 /var/folders/lp/bl8845jd6td_f_f99jfm034r0000gn/T/tmpQvgSXG
Python 2.7.13 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;default, Oct 10 2017, 14:59:59&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;GCC 4.2.1 Compatible Apple LLVM 9.0.0 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;clang-900.0.37&lt;span class=&quot;o&quot;&gt;)]&lt;/span&gt; on darwin
Type &lt;span class=&quot;s2&quot;&gt;&quot;help&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;copyright&quot;&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;&quot;credits&quot;&lt;/span&gt; or &lt;span class=&quot;s2&quot;&gt;&quot;license&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;more information.
&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;InteractiveConsole&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; import requests
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; r &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; requests.get&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'https://raelmax.github.io/'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; r.status_code
200&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Com esse comando o PEX executa o interpretador do python com o pacote especificado no PYTHONPATH, o que pode ser bem útil no momento do desenvolvimento. Caso o pacote que você queria instalar possua um executável você pode usar a flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt; para dizer para o PEX executá-lo. Vamos usar o &lt;a href=&quot;http://thumbor.org&quot;&gt;thumbor&lt;/a&gt; nesse exemplo:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./pex thumbor &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; thumbor &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
Thumbor v6.3.2 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;10-Apr-2017&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--&lt;/code&gt; é usado para dizer para o PEX que os próximo parâmetros serão passados para o programa que você está executando(no caso, o thumbor) e não para o próprio PEX.&lt;/p&gt;

&lt;h3 id=&quot;salvando-ambientes-pex&quot;&gt;Salvando ambientes PEX&lt;/h3&gt;

&lt;p&gt;Apesar de ser útil durante o desenvolvimento, os ambientes temporários não são tão interessantes quando você costumar usar sempre os mesmos softwares, nesse caso é interessante persistir o seu ambiente. Para esse exemplo vamos usar o &lt;a href=&quot;https://httpie.org/&quot;&gt;httpie&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./pex httpie &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; http &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; httpie.pex
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./httpie.pex &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
0.9.9
~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./httpie.pex &lt;span class=&quot;nt&quot;&gt;--print&lt;/span&gt; h https://raelmax.github.io
HTTP/1.1 200 OK
Accept-Ranges: bytes
Access-Control-Allow-Origin: &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
Age: 0
Cache-Control: max-age&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;600
Connection: keep-alive
Content-Encoding: &lt;span class=&quot;nb&quot;&gt;gzip
&lt;/span&gt;Content-Length: 3055
Content-Type: text/html&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf-8
Date: Sat, 14 Oct 2017 14:15:29 GMT
Expires: Sat, 14 Oct 2017 14:11:09 GMT
Last-Modified: Thu, 22 Sep 2016 22:55:15 GMT
Server: GitHub.com
Vary: Accept-Encoding
Via: 1.1 varnish
X-Cache: MISS
X-Cache-Hits: 0
X-Fastly-Request-ID: ce8dfb821c7e25940ebd20819c14f602f828558d
X-GitHub-Request-Id: BC2E:18C4E:826E725:BD29B8D:59E218A4
X-Served-By: cache-gru17128-GRU
X-Timer: S1507990529.067934,VS0,VE142&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;conclusão&quot;&gt;Conclusão&lt;/h3&gt;

&lt;p&gt;O PEX é uma ótima alternativa para quem quer testar um novo pacote sem “sujar” o ambiente de desenvolvimento do seu projeto e também para quem  usa projetos python que contém scripts no dia a dia, como o thumbor, httpie e outros. Nesse segundo caso a grande vantagem é não precisar ter um virtualenv apenas para esses projetos e ter que ficar alternando entre o virtualenv do projeto e o virtualenv que contém esses scripts, nem mesmo “sujar” sua instalação global do Python.&lt;/p&gt;

&lt;p&gt;Uma última dica é criar um diretório para abrigar todos esses executáveis e colocar no seu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt;, com isso você não precisará chamar o executável com o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt; completo e poderá fazer isso de dentro do seu projeto mesmo. Para isso eu criei um diretório &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.pybin&lt;/code&gt; e coloquei lá o arquivo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pex&lt;/code&gt; gerado pelo meu script e sempre que crio um executável novo também mando pra lá. E adicionei esse diretório ao meu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;~/Code/me/pex &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'export PATH=&quot;~/.pybin:$PATH&quot;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;É isso! :)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://pex.readthedocs.io&quot;&gt;PEX&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=NmpnGhRwsu0&quot;&gt;WTF is PEX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 13 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/python/2017/10/13/pex-empacotando-projetos-python-e-suas-dependencias-em-um-unico-arquivo.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/python/2017/10/13/pex-empacotando-projetos-python-e-suas-dependencias-em-um-unico-arquivo.html</guid>
        
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>Livro: O último teorema de Fermat</title>
        <description>&lt;p&gt;Há uns meses vi uns colegas de trabalho falando sobre a história de Fermat, um matemático que viveu no século XVII e que tinha como principal diversão resolver e criar problemas relacionados a lógica e a teoria dos números. Fiquei tão curioso pela história que resolvi procurar o livro e encontrei numa ótima promoção da Amazon, pagando apenas 13 reais pelo &lt;a href=&quot;https://www.amazon.com.br/ltimo-Teorema-Fermat-Simon-Singh/dp/8577994287/&quot;&gt;livro físico&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/livro-fermat.jpg&quot; alt=&quot;livro-fermat&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O livro é uma aula sobre a história da matemática usando como ponto central os esforços de estudiosos de vários tempos para conseguir uma demonstração para esse teorema, deixado como uma anotação de canto de livro por Pierre de Fermat alguns anos antes de sua morte e que só foi resolvido quase quatro séculos depois, tendo “derrotado” vários dos mais importantes matemáticos da história.&lt;/p&gt;

&lt;p&gt;A leitura é bem tranquila e não é restrita apenas a pessoas com conhecimento matemático, já que os fatos são mostrados em uma linguagem muito clara e não se apega a detalhes de cálculo. Um outro ponto interessante é a forma que o autor traz uma minibiografia de todos os gênios que tentaram demonstrar o teorema e explica de forma clara qual a contribuição que cada um deixou para seus sucessores, o que me deixou bem curioso pra saber como a história terminaria.&lt;/p&gt;

&lt;p&gt;Esse livro é uma ótima fonte para quem se interessa por matemática e também para aqueles que gostam de uma boa história. Mas não vá por mim, pois eu &lt;em&gt;sou um mentiroso&lt;/em&gt;.&lt;/p&gt;
</description>
        <pubDate>Thu, 22 Sep 2016 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/livros/2016/09/22/livro-o-ultimo-teorema-de-fermat.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/livros/2016/09/22/livro-o-ultimo-teorema-de-fermat.html</guid>
        
        
        <category>livros</category>
        
      </item>
    
      <item>
        <title>Domínios customizados no Heroku com PointDNS</title>
        <description>&lt;p&gt;Há tempos uso o heroku para testar algumas ideias mas nunca havia chegado ao ponto de apontar um domínio relevante pra lá, até hoje.&lt;/p&gt;

&lt;p&gt;Bom, o heroku permite que você coloque um domínio próprio(&lt;del&gt;desde que deixe seu cartão de crédito lá&lt;/del&gt;), mesmo no plano gratuito, o problema é que como o apontamento só pode ser feito para o domínio do app no heroku(algo como &lt;em&gt;app-exemplo.herokuapp.com&lt;/em&gt;), não temos como fazer apontamentos que não sejam do tipo CNAME. Para termos mais flexibilidade nas configurações de DNS o heroku oferece alguns &lt;em&gt;addons&lt;/em&gt;, entre eles o PointDNS, que no plano gratuito oferece a possibilidade de várias configurações para um domínio. Então vamos lá configurar.&lt;/p&gt;

&lt;h2 id=&quot;adicionando-o-pointdns-ao-projeto&quot;&gt;Adicionando o PointDNS ao projeto&lt;/h2&gt;

&lt;p&gt;O primeiro passo para configurar o serviço de DNS é vincular o PointDNS ao projeto. Isso pode ser feito tanto pela &lt;a href=&quot;https://elements.heroku.com/addons/pointdns&quot;&gt;página do addon no heroku&lt;/a&gt; quanto pela linha de comando, usando o heroku toolbelt:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ heroku addons:create pointdns:developer -a nome_do_app
Creating pointdns:developer on ⬢ nome_do_app...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Feito isso você pode adicionar um domínio customizado pelo dashboard ou pela linha de comando:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ heroku domains:add dominio-exemplo.com -a nome_do_app
$ heroku domains:add *.dominio-exemplo.com -a nome-do-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Para abrir o painel do PointDNS você pode seguir usando a linha de comando:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ heroku addons:open pointdns
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O painel abrirá no seu browser padrão. Na aba “Nameservers” você pode encontrar uma lista de endereços de DNS que você pode usar para fazer o apontamento do domínio(no painel da godaddy, registro.br, etc).&lt;/p&gt;

&lt;p&gt;A partir daí você pode ir na aba “Domains” e selecionar o seu domínio criado nos passo anteriores, podendo criar registros de redirect , CNAME, A e fazer configurações mais complexas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/poindns-exemplo.png&quot; alt=&quot;poindns-exemplo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bom, é isso. Até onde deu pra ver as únicas limitações do PointDNS na versão gratuita é a quantidade de domínios(apenas 1) e a quantidade de registros(no máximo 10) e resolve bem o problema que se propõe.&lt;/p&gt;

&lt;p&gt;Abraço!&lt;/p&gt;
</description>
        <pubDate>Thu, 15 Sep 2016 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/dicas/2016/09/15/dominios-customizados-no-heroku-com-pointdns.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/dicas/2016/09/15/dominios-customizados-no-heroku-com-pointdns.html</guid>
        
        
        <category>dicas</category>
        
      </item>
    
      <item>
        <title>6 meses no Rio de Janeiro</title>
        <description>&lt;p&gt;Há tempos planejava me mudar para uma cidade maior e entre as cidades brasileiras
o Rio de Janeiro sempre esteve em primeiro lugar na minha lista de possibilidades.
Convencer a &lt;a href=&quot;http://twitter.com/jerssicasousa&quot;&gt;Jerssica&lt;/a&gt; de que essa seria uma boa decisão
não foi nada fácil e não aconteceu da noite pro dia, mas depois de alguns meses de muita
conversa - e de vários “e se” - chegamos a um consenso e decidimos que esse seria o melhor
“próximo passo” que poderíamos dar na nossa vida.&lt;/p&gt;

&lt;h3 id=&quot;processo-seletivo&quot;&gt;Processo seletivo&lt;/h3&gt;

&lt;p&gt;Logo que tomamos a decisão entrei no &lt;a href=&quot;https://talentos.globo.com/&quot;&gt;processo seletivo&lt;/a&gt; para
uma vaga no time de plataformas da Globo.com. O processo é separado em algumas fases.
No início tive uma entrevista por telefone com o gestor da área, após um longo papo(~1h)
fui convidado a fazer um desafio de programação, topei de imediato.&lt;/p&gt;

&lt;p&gt;Alguns dias depois de enviar o código do desafio, entraram em contato comigo me convidando
a ir até a sede da empresa e participar de mais uma fase do processo. Nessa fase eu passaria
o dia dentro da empresa interagindo com um ou dois times para me avaliarem. Algum tempo depois
dessa visita à empresa recebi uma proposta e decidi aceitar, em mais ou menos um mês eu embarcava
de Imperatriz para o Rio.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xtf1/t51.2885-15/e35/11821090_393123907564111_233348088_n.jpg&quot; alt=&quot;Cittá América / Globo.com&quot; /&gt;
&lt;em&gt;Cittá América / Globo.com&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;a-mudança&quot;&gt;A mudança&lt;/h3&gt;

&lt;p&gt;Sem dúvidas essa foi a parte mais chata de todas. Como forma de facilitar a contratação de
pessoas de outras partes do país, a Globo.com ajuda na mudança dos funcionários contratados.
Até aí beleza, mas eu precisava me livrar de muita coisa que não poderia trazer(em Imperatriz
a rede é 220v e aqui no Rio é 110, tchau eletrônicos), entregar a casa que eu morava,
embalar caixas, desmontar móveis, etc. Uma tarefa e tanto pra ser feita em um mês mas tinha que dar.&lt;/p&gt;

&lt;p&gt;E deu. Entreguei a casa 2 dias antes da viagem e ficaram poucos detalhes que a
&lt;a href=&quot;http://twitter.com/jerssicasousa&quot;&gt;Jerssica&lt;/a&gt; ficou de resolver antes de vir pra cá
com o Bruce. Aliás, esse foi outro “problema”, mas conseguimos resolver. Apesar de
encher muito o saco durante o vôo conseguimos trazer o Bruce sem problemas. Aliás, se o
Bruce não pudesse vir ninguém viria, né.&lt;/p&gt;

&lt;p&gt;Então há exatos 6 meses peguei o vôo para o Rio. Uma coisa chata que tivemos que lidar é que
como passei o primeiro mês inteiro procurando apartamento para alugar e &lt;em&gt;morando&lt;/em&gt; num hotel,
tivemos que ficar separados, a &lt;a href=&quot;http://twitter.com/jerssicasousa&quot;&gt;Jerssica&lt;/a&gt; e o Bruce lá em
Imperatriz e eu aqui. Mas já passou, ainda bem. :)&lt;/p&gt;

&lt;p&gt;Achar um lugar pra morar foi um desafio. A Globo.com fica na Barra da Tijuca, que é um bairro
&lt;strong&gt;bem&lt;/strong&gt; caro e &lt;strong&gt;bem&lt;/strong&gt; distante da parte mais &lt;em&gt;famosa&lt;/em&gt; da cidade, logo, morar longe não era uma
boa opção mas morar perto também não sairia barato. Depois de visitar váaaarios apartamentos
nas redondezas e aqui na Barra achei um apartamento bacana com um custo aceitável e de certa
forma bem perto do trabalho. Com o apartamento alugado pude receber meus
&lt;a href=&quot;https://www.instagram.com/p/mbVzkWxpeA/?taken-by=raelmax&quot;&gt;negros maravilhosos&lt;/a&gt; e
começar mais uma fase da jornada, a adaptação.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xft1/t51.2885-15/e35/11856684_1053758004649216_2147277655_n.jpg&quot; alt=&quot;O Bruce parece que gostou da nova vista. :)&quot; /&gt;
&lt;em&gt;O Bruce parece que gostou da nova vista. :)&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;a-vida-no-rio&quot;&gt;A vida no Rio&lt;/h3&gt;

&lt;p&gt;De certo modo acredito que tenhamos subestimado essa mudança. Começar uma nova vida do &lt;em&gt;zero&lt;/em&gt;
nunca vai ser algo fácil. No fim das contas a gente deixou todo o conforto que tínhamos da
nossa casa, família e amigos por um monte de incertezas. Mas mesmo com tudo isso acreditamos
que esteja valendo a pena.&lt;/p&gt;

&lt;p&gt;Comparar Imperatriz com o Rio não faz sentido, são cidades bem diferentes, com estilos diferentes
e &lt;em&gt;funções&lt;/em&gt; diferentes. E foi com essa cabeça que cheguei aqui e foi justamente isso que
deixou tudo mais fácil.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xat1/t51.2885-15/e35/12105062_1692152971015351_221687942_n.jpg&quot; alt=&quot;Fomos no Maracanã ver o Barcelona da Gávea&quot; /&gt;
&lt;em&gt;Fomos no Maracanã ver o Barcelona da Gávea&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mas nem tudo são flores e tem algumas coisas que me incomodam por aqui. O custo de vida
é um negócio maluco, e aqui na Barra é pior ainda, a sensação que se
tem é de que você está o tempo todo dentro de um aeroporto. A distancia entre os lugares também é bem chato,
até os lugares que teoricamente são &lt;em&gt;perto&lt;/em&gt; no fim das contas são bem longe.
No geral as pessoas parecem estar &lt;em&gt;boladas&lt;/em&gt; o tempo inteiro e pelo menos comigo tem sido
raro dar um &lt;em&gt;obrigado&lt;/em&gt; e ouvir um &lt;em&gt;de nada&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Algumas coisas me surpreenderam de forma positiva. O transporte público apesar de ser uma bosta é
muito bom dependendo de onde você veio. Eu não estava acostumado a poder ir tão longe gastando
tão &lt;em&gt;pouco&lt;/em&gt;. Outra coisa é a violência que  apesar de ser algo bem presente não é tão ruim
quanto se vê no jornal.&lt;/p&gt;

&lt;p&gt;No mais, ainda estamos acostumando com a cidade e com as pessoas. Ainda nos assustamos ao entrar no
supermercado e ver um senhorzinho de sunga, ou em perceber que dois(ou três) corpos podem sim
ocupar o mesmo espaço como acontece nos ônibus. Ou que o pouco aqui ainda é muito, o perto ainda é muito longe,
o barato ainda é bem caro e coisas do tipo. São detalhes que a gente vai aprendendo com o tempo,
mas que não chegam a ser um problema.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A cidade é maravilhosa, mas se liga.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Sun, 31 Jan 2016 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/lifestyle/2016/01/31/6-meses-no-rio-de-janeiro.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/lifestyle/2016/01/31/6-meses-no-rio-de-janeiro.html</guid>
        
        
        <category>lifestyle</category>
        
      </item>
    
      <item>
        <title>Metas para 2015</title>
        <description>&lt;p&gt;Resolvi anotar aqui uma lista de coisas que tentarei alcançar nesse ano que se inicia, espero cumprir boa parte! :)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;andar mais de bike;&lt;/li&gt;
  &lt;li&gt;comer melhor, dia vegan/vegetariano é uma boa;&lt;/li&gt;
  &lt;li&gt;levar testes automatizados mais a sério;&lt;/li&gt;
  &lt;li&gt;concluir a série bottle e quem sabe lançar um site em pt-br com todos os textos;&lt;/li&gt;
  &lt;li&gt;colocar meus projetos pessoais atrasados no ar;&lt;/li&gt;
  &lt;li&gt;manter a casa limpa e organizada;&lt;/li&gt;
  &lt;li&gt;me mudar, de casa ou de cidade(de preferência);&lt;/li&gt;
  &lt;li&gt;blogar mais;&lt;/li&gt;
  &lt;li&gt;viajar, pra perto ou pra longe, por muito ou por pouco tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acho que é isso, vamos ver até onde vai!&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Jan 2015 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/pessoal/2015/01/02/metas-para-2015.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/pessoal/2015/01/02/metas-para-2015.html</guid>
        
        
        <category>pessoal</category>
        
      </item>
    
      <item>
        <title>Bottle: começando na web com python</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;Se você já tem uma experiência mais avançada em desenvolvimento web e/ou python, recomendo ler o tutorial oficial do Bottle, aqui o ritmo será bem mais lento pois o foco são os iniciantes!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Trabalho com web há alguns anos, passei rapidamente por PHP e logo em seguida comecei a trabalhar com python e por consequência com Django. O início foi bem doloroso, não sei se todos tem a mesma impressão, mas acredito que python(para a web) tem uma curva de aprendizado muito grande se comparado ao PHP(que ainda é a grande porta de entrada da web), são muitas coisas a aprender para colocar um simples projeto em python no ar  enquanto em PHP tudo que se precisa fazer é “escrever um arquivinho e jogar no ftp”.&lt;/p&gt;

&lt;p&gt;Pensando nisso resolvi escrever uma série de artigos para ajudar iniciantes em desenvolvimento web a darem os primeiros passos utilizando python. Vamos lá?&lt;/p&gt;

&lt;h2 id=&quot;requisitos&quot;&gt;Requisitos&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Saber o básico de python (import, funções, tipos de dados…)&lt;/li&gt;
  &lt;li&gt;Conhecer um pouco de html será bastante útil também&lt;/li&gt;
  &lt;li&gt;Um computador com linux(pra facilitar as coisas pra mim. :)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;configurando-o-ambiente&quot;&gt;Configurando o ambiente&lt;/h2&gt;

&lt;p&gt;Assumindo que você esteja usando Linux e que o Python já vem por padrão na maioria das distribuições, vamos configurar nosso ambiente para depois partirmos para as explicações.&lt;/p&gt;

&lt;p&gt;Primeiro, crie um diretório na sua home com o nome “meu_projeto” e em seguida baixe o arquivo &lt;a href=&quot;https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py&quot;&gt;bottle.py&lt;/a&gt; para esse diretório. Caso queria fazer isso no terminal execute:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;meu_projeto &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;meu_projeto &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Com isso você já estará pronto para desenvolver seu projeto em python, utilizando o Bottle. Mais na frente aprenderemos a isolar nosso ambiente de desenvolvimento, gerir dependências e muito mais, por hora isso é mais que o suficiente.&lt;/p&gt;

&lt;h2 id=&quot;hello-world&quot;&gt;Hello World&lt;/h2&gt;

&lt;p&gt;Com o Bottle “instalado” no passo anterior, vamos agora escrever nossa primeira aplicação web, será um exemplo clássico de “Hello World!”. Para isso, crie um arquivo “app.py” no diretório “meu_projeto”.&lt;/p&gt;

&lt;p&gt;Abra o arquivo com seu editor de código preferido e digite o seguinte:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;bottle&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Hello World!'&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Nesse pequeno trecho de código temos uma aplicação web básica. Na primeira linha temos os “imports”. No python, quando precisamos buscar coisas(variáveis, funções, classes…) que estão em outros arquivos usamos essa sintaxe. Como no passo anterior fizemos download de um arquivo “bottle.py” que se encontra no mesmo diretório do nosso arquivo “app.py”, podemos importar funções do módulo bottle[.py]. Nesse caso importamos as funções “route” e “run”.&lt;/p&gt;

&lt;p&gt;Na linha 3 temos a definição da “rota”. Podemos chamar de rotas todos os endereços acessíveis da sua aplicação web, como “/” que é a raíz ou “/contato” que seria sua página de contato. Para definir uma rota no Bottle usamos a função “route”, que importamos na primeira linha. Essa função é usada como um decorator nas funções que representam uma página da sua aplicação, o conceito de decorator é um pouco complexo e podemos deixar para depois, o importante é você entender qual o papel do “route”. Note que o decorator “route” recebe um parâmetro, nesse caso “/”, que significa que estamos mapeando a rota da url raíz da aplicação. Resumindo: o “route(“/”)” faz com que ao acessar a url raíz o Bottle invoque a função que está abaixo do “route”, no caso, a função “index”.&lt;/p&gt;

&lt;p&gt;Na linha 4 temos a definição da função “index” que é a função usada para responder à url raíz da nossa aplicação. O nome “index” poderia ser trocado por qualquer outro, pois o que define a qual rota responderá essa função é o decorator “route” que está logo acima da definição dela.&lt;/p&gt;

&lt;p&gt;Na linha 5 temos o retorno da função “index”. Nesse caso estamos retornando uma string com o nosso “Hello World”. Essa é fácil, né. :)&lt;/p&gt;

&lt;p&gt;Na última linha usamos o comando “run”(importado na primeira linha) para dizer ao python “hey, executa esse código aqui!” e nele passamos dois parâmetros, o “host” que seria a url da aplicação e “port”, que será a porta usada para rodar a aplicação.&lt;/p&gt;

&lt;p&gt;Simples, não? :)&lt;/p&gt;

&lt;h2 id=&quot;executando-a-aplicação&quot;&gt;Executando a aplicação&lt;/h2&gt;

&lt;p&gt;O último passo dessa etapa é rodar nossa aplicação, para isso execute no terminal:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;meu_projeto &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; python app.py
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Agora, acesse no seu navegador o endereço: &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; e veja o seu primeiro app em python rodando! \o/&lt;/p&gt;

&lt;h2 id=&quot;concluindo&quot;&gt;Concluindo&lt;/h2&gt;

&lt;p&gt;Esse é um exemplo básico de como desenvolver uma aplicação simples, nesse primeiro artigo abordamos alguns princípios que fazem parte de qualquer aplicação web em Bottle e nos demais daremos uma incrementada nesse projeto.&lt;/p&gt;

&lt;p&gt;Dúvidas, críticas e sugestões nos comentários! :)&lt;/p&gt;

&lt;h3 id=&quot;links-úteis&quot;&gt;Links úteis&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://pycursos.com/python-para-zumbis/&quot;&gt;Python para Zumbis (curso online de python)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bottlepy.org&quot;&gt;Bottle - Site Oficial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.avelino.xxx/2014/12/bottle-full-stack-without-django&quot;&gt;Bottle - Fullstack without Django&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ericstk.wordpress.com/2014/12/03/bottle-framework-fontes-de-estudos/&quot;&gt;Bottle - Fontes de Estudo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://pythonclub.com.br/desenvolvendo-com-bottle-parte-1.html&quot;&gt;Bottle - Desenvolvendo com Bottle - Parte 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 03 Dec 2014 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/python/bottle/2014/12/03/bottle-comecando-na-web-com-python.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/python/bottle/2014/12/03/bottle-comecando-na-web-com-python.html</guid>
        
        
        <category>python</category>
        
        <category>bottle</category>
        
      </item>
    
      <item>
        <title>Não somos tão bons assim</title>
        <description>&lt;p&gt;Há alguns meses precisei desenvolver uma aplicação para um dispositivo da motorola que roda Windows CE 5. Conversei com um amigo que já tinha experiência com esses dispositivos e ele me falou que havia uma versão do python e do tk que rodava perfeitamente, logo optei por desenvolver dessa forma. Era perfeito, trabalho com python há bastante tempo e resolveria o problema rapidamente.&lt;/p&gt;

&lt;p&gt;Aplicação desenvolvida e testada, encomendamos mais dispositivos e após meses de espera fui colocar a aplicação para rodar, aí começou o problema. Os novos dispositivos vieram atualizados com Windows CE 6.0 e o python só rodava até a versão 5.x. Todo o trabalho foi por água a baixo.&lt;/p&gt;

&lt;p&gt;Pesquisei alternativas e aí tive que desenvolver a aplicação utilizando C#, no .Net Compact Framework e DB4O para o banco de dados. Tentamos fazer a implantação por duas vezes e falhamos. Não deu erro, não tinha bugs(até tinha, mas não veio ao caso) e tudo havia sido implementado do “jeito certo”. Então qual o problema? Bom, entendíamos bastante de tecnologia, conversamos bastante sobre o problema que o cliente precisava resolver, mas não entendíamos como as coisas funcionavam no dia-a-dia da empresa, e isso fez com que todo o trabalho fosse em vão e com quem precisássemos reescrever a aplicação com base na experiência que tivemos nas tentativas anteriores.&lt;/p&gt;

&lt;p&gt;Com isso aprendi algumas coisas que são interessantes de serem apontadas, acredito que pelo menos uma vez você já tenha passado por algo parecido.&lt;/p&gt;

&lt;h2 id=&quot;nem-tudo-é-o-que-parece&quot;&gt;Nem tudo é o que parece&lt;/h2&gt;

&lt;p&gt;Essa foi minha primeira experiência com um aplicativo desktop, trabalho com web há muito tempo e achei que não poderia ser tão diferente. Nunca me enganei tanto. Os problemas são diferentes, suportar 10mil req/s não é a mesma coisa que 10mil pessoas numa loja, por exemplo.&lt;/p&gt;

&lt;h2 id=&quot;se-você-não-é-especialista-no-assunto-não-suponha-teste&quot;&gt;Se você não é especialista no assunto, não suponha, teste&lt;/h2&gt;

&lt;p&gt;Em alguns casos achei que uma requisição pela rede wifi demoraria demais e no fim das contas se mostrou mais rápido que fazer a leitura em disco(sério). Errei em não estudar a fundo o dispositivo usado e tivemos vários problemas desse tipo.&lt;/p&gt;

&lt;h2 id=&quot;conheça-bem-os-pontos-de-falha&quot;&gt;Conheça bem os pontos de falha&lt;/h2&gt;

&lt;p&gt;O dispositivo é específico para coleta de dados(leitura de código de barras) e em vários casos a leitura demorou mais do que a checagem(no banco). Isso não passou pela minha cabeça em momento algum, afinal, o dispositivo é feito para isso, e como é de se imaginar, não nos preparamos para esse problema.&lt;/p&gt;

&lt;h2 id=&quot;ambiente-de-implantação&quot;&gt;Ambiente de implantação&lt;/h2&gt;

&lt;p&gt;Numa aplicação desktop, onde praticamente toda a infraestrutura é local, é importantíssimo que se conheça muito bem os possíveis problemas. Essa foi a maior das falhas. Quando trabalhamos com web, é muito fácil reproduzir o ambiente dos usuários do sistema, há inúmeras ferramentas e geralmente ter várias versões dos principais browsers já cobre 90% dos casos. No caso dessa aplicação local, fazer suposições e testes com o que imaginávamos do cenário da implantanção foi longe de ser uma boa ideia.&lt;/p&gt;

&lt;h2 id=&quot;converse-com-quem-entende&quot;&gt;Converse com quem entende&lt;/h2&gt;

&lt;p&gt;Mesmo conhecendo profissionais que já fizeram esse tipo de projeto, não nos preocupamos em perguntar mais sobre como funciona, quais os problemas comuns ou quais as melhores abordagens. Poderíamos ter poupado muito tempo e esforço se tivéssemos nos atentado para isso.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Dá pra resumir tudo isso em excesso de confiança e inexperiência. Agora é recolher os cacos e transformar tudo isso em experiência, até porque no fim das contas não somos tão bons assim.&lt;/p&gt;
</description>
        <pubDate>Tue, 25 Nov 2014 00:00:00 +0000</pubDate>
        <link>https://raelmax.github.io/projetos/python/c%23/2014/11/25/nao-somos-tao-bons-assim.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/projetos/python/c%23/2014/11/25/nao-somos-tao-bons-assim.html</guid>
        
        
        <category>projetos</category>
        
        <category>python</category>
        
        <category>c#</category>
        
      </item>
    
      <item>
        <title>PythonBrasil[9]: Dicas de frontend para projetos django</title>
        <description>&lt;p&gt;Nos dias 2, 3 e 4 de outubro tive a oportunidade de mais uma vez participar da PythonBrasil, dessa vez pude contribuir um pouco mais com a comunidade apresentando uma palestra no último dia de evento.&lt;/p&gt;

&lt;p&gt;O tema que abordei foi frontend em projetos django, visto que esse é um assunto muito importante dentro do desenvolvimento de aplicações web e que também tem sido a área que mais tenho trabalhado nos últimos dois anos.&lt;/p&gt;

&lt;p&gt;O vídeo da palestra está disponível aqui:&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/X_5KgJ2C9hg&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;E os slides:&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/28411398&quot; width=&quot;597&quot; height=&quot;486&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;Bom, é isso aí!&lt;/p&gt;
</description>
        <pubDate>Sun, 24 Nov 2013 13:37:14 +0000</pubDate>
        <link>https://raelmax.github.io/python/pythonbrasil9/palestra/2013/11/24/pythonbrasil-9-dicas-de-frontend-para-projetos-django.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/python/pythonbrasil9/palestra/2013/11/24/pythonbrasil-9-dicas-de-frontend-para-projetos-django.html</guid>
        
        
        <category>python</category>
        
        <category>pythonbrasil9</category>
        
        <category>palestra</category>
        
      </item>
    
      <item>
        <title>Aquele primeiro post que todo mundo faz</title>
        <description>&lt;p&gt;Olá, amigos.&lt;/p&gt;

&lt;p&gt;Como é de praxe, precisava escrever alguma coisa aqui para não deixar aquele post &lt;em&gt;default&lt;/em&gt;, né. O que também serve para dar uma enganada e até faz você pensar que isso aqui será atualizado com frequência. E talvez seja.&lt;/p&gt;

&lt;p&gt;Vou tentar compartilhar aqui alguns frutos da experiência que tenho adquirido sobre desenvolvimento de software nos últimos anos.&lt;/p&gt;

&lt;p&gt;Para me ajudar nisso, escolhi o &lt;a href=&quot;http://ghost.org&quot;&gt;Ghost&lt;/a&gt; como plataforma. Sabe como é, nada mais &lt;em&gt;cool&lt;/em&gt; do que um blog em &lt;a href=&quot;http://nodejs.org&quot;&gt;node.js&lt;/a&gt;. Bom, é isso aí, nos vemos num post &lt;em&gt;de verdade&lt;/em&gt;. :)&lt;/p&gt;
</description>
        <pubDate>Sun, 24 Nov 2013 13:37:14 +0000</pubDate>
        <link>https://raelmax.github.io/pessoal/2013/11/24/aquele-primerio-post-que-todo-mundo-faz.html</link>
        <guid isPermaLink="true">https://raelmax.github.io/pessoal/2013/11/24/aquele-primerio-post-que-todo-mundo-faz.html</guid>
        
        
        <category>pessoal</category>
        
      </item>
    
  </channel>
</rss>
