<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Humberto Rocha</title><link>https://humberto.io/pt-br/</link><description>Recent content on Humberto Rocha</description><generator>Hugo</generator><language>pt-br</language><lastBuildDate>Tue, 27 Jan 2026 19:00:49 -0500</lastBuildDate><atom:link href="https://humberto.io/pt-br/index.xml" rel="self" type="application/rss+xml"/><item><title>$ whoami</title><link>https://humberto.io/pt-br/sobre/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/sobre/</guid><description>&lt;p&gt;Olá, meu nome é &lt;strong&gt;Humberto&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Eu sou um &lt;strong&gt;Cientista da Computação&lt;/strong&gt; entusiasta do &lt;strong&gt;Open Source&lt;/strong&gt; especializado em resolver problemas, atualmente morando em &lt;strong&gt;Québec, Canadá&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Apesar de trabalhar com uma vasta gama de tecnologias no meu dia a dia, minhas ferramentas prediletas são a &lt;strong&gt;linha de comando&lt;/strong&gt;, o editor &lt;strong&gt;VIM&lt;/strong&gt; e meu sistema operacional do coração é o &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Além de escrever aqui, meus hobbies são bem variados e vão de gastronomia e confeitaria passando por pixel art, videogames, kung fu, emoji, memes e mimar meus gatos até aprender novas línguagens (de programação ou não 😜).&lt;/p&gt;</description></item><item><title>Extrair certificado de um domínio</title><link>https://humberto.io/pt-br/bits/extrair-certificado-de-um-dominio/</link><pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/extrair-certificado-de-um-dominio/</guid><description>&lt;p&gt;Para extrair o certificado use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl s_client -showcerts -servername humberto.io -connect humberto.io:443 &amp;lt;/dev/null 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se o seu alvo não usa &lt;a href="https://en.wikipedia.org/wiki/Server_Name_Indication"&gt;SNI&lt;/a&gt; você não precisa usar a opção &lt;code&gt;-servername &amp;lt;fqdn&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Em seguida você pode concatenar outros commandos OpenSSL para extrair informação no formato que quiser.&lt;/p&gt;
&lt;p&gt;Para extrair o certificado no formato PEM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| openssl x509 -outform PEM
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para extrair a chave publica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| openssl x509 -pubkey -noout
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para extrair a impressão digital:&lt;/p&gt;</description></item><item><title>Extrair certificado e chave de um arquivo .pfx</title><link>https://humberto.io/pt-br/bits/extrair-certificado-e-chave-de-um-arquivo-pfx/</link><pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/extrair-certificado-e-chave-de-um-arquivo-pfx/</guid><description>&lt;p&gt;Extraia o certificado do arquivo &lt;code&gt;.pfx&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl pkcs12 -in &amp;lt;ARQUIVO_PONTO_PFX&amp;gt; -clcerts -nokeys -chain -out certificate.crt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Extraia a chave privada no formato &lt;code&gt;.pem&lt;/code&gt; sem cifragem do arquivo &lt;code&gt;.pfx&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl pkcs12 -in &amp;lt;ARQUIVO_PONTO_PFX&amp;gt; -nocerts -nodes -out private_key.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Converta o &lt;code&gt;.pem&lt;/code&gt; no formato de chave &lt;code&gt;RSA&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl rsa -in private_key.pem -out id_rsa
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se você esta usando OpenSSL 3 o formato de saida padrão será &lt;code&gt;PKCS8&lt;/code&gt;, com as barreiras de encapsulamento neste formato:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----BEGIN PRIVATE KEY-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----END PRIVATE KEY-----
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se você precisa da chave no formato &lt;code&gt;PKCS1&lt;/code&gt;, tambem conhecido como tradicional use a flag &lt;code&gt;-tradicional&lt;/code&gt; desta forma:&lt;/p&gt;</description></item><item><title>Enquetes do Mastodon no ActivityPub</title><link>https://humberto.io/pt-br/blog/enquetes-do-mastodon-no-activitypub/</link><pubDate>Mon, 06 Feb 2023 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/enquetes-do-mastodon-no-activitypub/</guid><description>&lt;p&gt;Eu comecei a rodar minha própria instância de &lt;a href="https://activitypub.rocks/"&gt;ActivityPub&lt;/a&gt; usando o &lt;a href="https://jointakahe.org/"&gt;Takahē&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Me interessei em contribuir com o projeto e uma das primeiras funcionalidades que implementei foi o suporte a enquetes.&lt;/p&gt;
&lt;p&gt;Enquanto eu implementava, notei que as informações sobre o assunto estavam espalhadas entre vários lugares diferentes.&lt;/p&gt;
&lt;p&gt;Então, para que eu possa me lembrar do seu funcionamento, e para que talvez sirva de ajuda para alguém buscando pela mesma informação, eu decidi escrever este artigo.&lt;/p&gt;</description></item><item><title>Conectar a um Pod Kubernetes</title><link>https://humberto.io/pt-br/bits/conectar-a-um-pod-kubernetes/</link><pubDate>Wed, 07 Dec 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/conectar-a-um-pod-kubernetes/</guid><description>&lt;p&gt;Para abrir uma sessão é preciso saber o nome do Pod.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pod -n &amp;lt;namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Em seguida abra uma sessão bash:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec --stdin --tty &amp;lt;nome do pod&amp;gt; -n &amp;lt;namespace&amp;gt; -- /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Também é possível abrir uma sessão shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec --stdin --tty &amp;lt;nome do pod&amp;gt; -n &amp;lt;namespace&amp;gt; -- /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Algumas vezes é preciso rodar um novo Pod a partir de uma imagem com as ferramentas necessárias para inspecionar algo.&lt;/p&gt;</description></item><item><title>Sessão interativa em um contêiner Docker</title><link>https://humberto.io/pt-br/bits/sessao-interativa-em-um-conteiner-docker/</link><pubDate>Tue, 22 Nov 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/sessao-interativa-em-um-conteiner-docker/</guid><description>&lt;p&gt;Abrindo uma sessão bash em um contêiner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it &amp;lt;nome-do-conteiner&amp;gt; /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No caso de imagens minimalistas onde bash não está disponível, ainda é possível abrir uma sessão shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it &amp;lt;nome-do-conteiner&amp;gt; /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;aside class="tip warning"&gt;
 Uma sessão só pode ser aberta em contêineres que estão rodando. Verifique o status com &lt;code&gt;docker ps&lt;/code&gt; antes de tentar abrir uma sessão.
&lt;/aside&gt;

&lt;p&gt;Em caso de dúvida sobre o nome do contêiner é possível lista-los com:&lt;/p&gt;</description></item><item><title>Docker sem root</title><link>https://humberto.io/pt-br/bits/docker-sem-root/</link><pubDate>Sat, 30 Jul 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/docker-sem-root/</guid><description>&lt;p&gt;Crie o grupo &lt;code&gt;docker&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo groupadd docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adicione o usuário ao grupo &lt;code&gt;docker&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aplique as modificações ao grupo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;newgrp docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verifique se é possível de rodar o &lt;code&gt;docker&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;aside class="tip warning"&gt;
 Isso não é recomendado em servidores conectados a internet, mantenha os privilégios &lt;code&gt;docker&lt;/code&gt; ao usuário &lt;code&gt;root&lt;/code&gt;.
&lt;/aside&gt;</description></item><item><title>Usar o laptop com a tela fechada</title><link>https://humberto.io/pt-br/bits/usar-o-laptop-com-a-tela-fechada/</link><pubDate>Sat, 30 Jul 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/usar-o-laptop-com-a-tela-fechada/</guid><description>&lt;p&gt;Edite o arquivo &lt;code&gt;/etc/systemd/logind.conf&lt;/code&gt; e altere as linhas seguintes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89b4fa"&gt;HandleLidSwitch&lt;/span&gt;&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89b4fa"&gt;HandleLidSwitchExternalPower&lt;/span&gt;&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89b4fa"&gt;HandleLidSwitchDocked&lt;/span&gt;&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depois, reinicie o serviço:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart systemd-logind.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Desligar automaticamente a tela do laptop</title><link>https://humberto.io/pt-br/bits/desligar-automaticamente-a-tela-do-laptop/</link><pubDate>Fri, 29 Jul 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/desligar-automaticamente-a-tela-do-laptop/</guid><description>&lt;p&gt;Modifique o arquivo &lt;code&gt;/etc/default/grub&lt;/code&gt; e adicione o seguinte conteúdo na variável &lt;code&gt;GRUB_CMDLINE_LINUX&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89b4fa"&gt;GRUB_CMDLINE_LINUX&lt;/span&gt;&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;consoleblank=300&amp;#34; # desliga a tela após 5 minutos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Em seguida atualize o grub:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo update-grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Atualizar múltiplos repositórios</title><link>https://humberto.io/pt-br/bits/atualizar-multiplos-repositorios/</link><pubDate>Mon, 23 May 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/atualizar-multiplos-repositorios/</guid><description>&lt;p&gt;Uma dica para quando temos uma lista de repositórios para atualizar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c &amp;#34;cd &amp;#39;{}&amp;#39; &amp;amp;&amp;amp; git pull &amp;amp;&amp;amp; cd ..&amp;#34; \;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A parte &lt;code&gt;\( ! -name . \)&lt;/code&gt; do comando é usada para evitar de executar o comando na pasta &lt;code&gt;.&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Busca e substituição de quebras de linha no vim</title><link>https://humberto.io/pt-br/bits/busca-e-substituicao-de-quebras-de-linha-no-vim/</link><pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/busca-e-substituicao-de-quebras-de-linha-no-vim/</guid><description>&lt;p&gt;Existem 2 tipos diferentes de caractere especial que são utilizados para as quebras de linha:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\n&lt;/code&gt; representa um caractere de nova linha &lt;code&gt;0x0a&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\r&lt;/code&gt; representa um caractere de retorno de carro &lt;code&gt;0x0d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mas no lado de substituição do padrão de busca e substituição do vim as coisas mudam um pouco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\n&lt;/code&gt; vira um caractere de nulo &lt;code&gt;0x00&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\r&lt;/code&gt; vira um caractere de nova linha &lt;code&gt;0x0a&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;%s/\n/\r/g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Commit vazio</title><link>https://humberto.io/pt-br/bits/commit-vazio/</link><pubDate>Fri, 18 Feb 2022 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/bits/commit-vazio/</guid><description>&lt;p&gt;De vez enquanto nós precisamos fazer um commit vazio só para ativar o CI ou para ativar uma web.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --allow-empty -m &amp;#34;Trigger CI&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Desbravando o pygame 5 - Movimento e Colisão</title><link>https://humberto.io/pt-br/blog/desbravando-o-pygame-5-movimento-e-colisao/</link><pubDate>Tue, 10 Sep 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/desbravando-o-pygame-5-movimento-e-colisao/</guid><description>&lt;p&gt;O movimento é uma característica que está presente na maioria dos jogos. Ao saltar entre plataformas, atirar contra a horda de inimigos, pilotar uma nave espacial e correr pelas estradas estamos exercendo movimento, interagindo com o ambiente do jogo, aplicando ações e causando reações.&lt;/p&gt;
&lt;p&gt;Neste capítulo iremos conhecer os conceitos básicos de movimentação de objetos na tela e sua interação com outros elementos através da detecção de colisão.&lt;/p&gt;
&lt;h2 id="movimento"&gt;Movimento&lt;/h2&gt;
&lt;p&gt;Se você vem acompanhando esta série de postagens, teve um breve exemplo de movimentação na postagem sobre &lt;a href="https://humberto.io/pt-br/blog/desbravando-o-pygame-3-game-loop/"&gt;game loop&lt;/a&gt;, onde uma bola que se movimentava quicando pela tela foi implementada.&lt;/p&gt;</description></item><item><title>Publicando meu primeiro Jogo</title><link>https://humberto.io/pt-br/blog/publicando-meu-primeiro-jogo/</link><pubDate>Wed, 28 Aug 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/publicando-meu-primeiro-jogo/</guid><description>&lt;p&gt;Jogos sempre me conectam com tecnologia desde o início.&lt;/p&gt;
&lt;p&gt;Eu e meu pai montamos nosso primeiro computador (um Pentium 286) e a primeira coisa que eu me lembro de fazer, foi jogar os jogos de DOS como Prince of Persia e Lunar Lander. Eu aprendi vários comandos de CLI só para poder jogar os meus jogos favoritos.&lt;/p&gt;
&lt;p&gt;A paixão por jogar e fazer jogos sempre me acompanhou como um hobby. I tenho uma &lt;a href="https://humberto.io/pt-br/tags/pygame/"&gt;série de posts sobre pygame&lt;/a&gt; neste blog onde eu passo pelos conceitos básicos de desenvolvimento de jogos tentando explicar para pessoas que estejam iniciando seu aprendizado na área.&lt;/p&gt;</description></item><item><title>Libs Fantásticas: pipx</title><link>https://humberto.io/pt-br/blog/libs-fantasticas-pipx/</link><pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/libs-fantasticas-pipx/</guid><description>&lt;p&gt;Estou começando esta série para dar dicas sobre bibliotecas que podem ser muito úteis no seu dia a dia, e também para apresentar bibliotecas interessantes nas quais que você deveria ficar de olho.&lt;/p&gt;
&lt;p&gt;Uma das habilidades de um bom Programador é ter a ferramenta certa para realizar seu trabalho, e nada mais apropriado que começar esta série com uma ferramenta que instala outras ferramentas!&lt;/p&gt;
&lt;p&gt;Quantas vezes você já teve que instalar algum programa Python em uma virtualenv que você acabou de criar? Já passou pela frustração de atualizar uma biblioteca e quebrar sua árvore de dependências?&lt;/p&gt;</description></item><item><title>TLDR: Gerando Secret Key para o Django</title><link>https://humberto.io/pt-br/blog/tldr-gerando-secret-key-para-o-django/</link><pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-gerando-secret-key-para-o-django/</guid><description>&lt;p&gt;Levante a mão quem nunca versionou a &lt;code&gt;SECRET_KEY&lt;/code&gt; do Django no início de um projeto e precisou gerar uma nova na hora de subir pra produção.&lt;/p&gt;
&lt;p&gt;Este &lt;strong&gt;TLDR&lt;/strong&gt; é um lembrete rápido de como você pode regerar uma secret key localmente, sem recorrer a sites na internet para gera-la para você.&lt;/p&gt;
&lt;p&gt;Como o Django gera a secret key no início de um projeto, já existe esta função implementada em seu código e você pode acessá-la desta forma:&lt;/p&gt;</description></item><item><title>Melhorando a rastreabilidade de UTM no seu site</title><link>https://humberto.io/pt-br/blog/melhorando-a-rastreabilidade-de-utm-no-seu-site/</link><pubDate>Fri, 14 Sep 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/melhorando-a-rastreabilidade-de-utm-no-seu-site/</guid><description>&lt;p&gt;Esses dias tive a oportunidade de encarar um desafio de frontend lá na &lt;a href="https://configr.com/?utm_source=humberto&amp;amp;utm_campaign=post-utm&amp;amp;utm_content=link-intro"&gt;Configr&lt;/a&gt; que consistiu em melhorar a rastreabilidade dos usuários novos (os famosos leads da galera do marketing) que entram no no sistema. Mais especificamente a rastreabilidade dos &lt;a href="https://en.wikipedia.org/wiki/UTM_parameters"&gt;parâmetros de utm&lt;/a&gt; das campanhas de marketing da empresa.&lt;/p&gt;
&lt;aside class="tip info"&gt;
 &lt;strong&gt;TLDR&lt;/strong&gt;: Eu criei uma biblioteca &lt;strong&gt;javascript&lt;/strong&gt; chamada &lt;strong&gt;utmkeeper&lt;/strong&gt; que faz a mágica para você e está disponível em &lt;a href="https://github.com/humrochagf/utmkeeper"&gt;https://github.com/humrochagf/utmkeeper&lt;/a&gt;
&lt;/aside&gt;

&lt;aside class="tip info"&gt;
 &lt;strong&gt;UPDATE (21/09/2018)&lt;/strong&gt; Postagem atualizada para a cobrir a versão &lt;strong&gt;0.3&lt;/strong&gt; do &lt;strong&gt;utmkeeper&lt;/strong&gt;
&lt;/aside&gt;

&lt;h2 id="utm"&gt;UTM&lt;/h2&gt;
&lt;p&gt;O termo &lt;strong&gt;UTM&lt;/strong&gt; surgiu do &lt;strong&gt;Urchin&lt;/strong&gt; que era um software de Analytics feito para analisar a efetividade de campanhas de marketing e utilizava os parâmetros do &lt;strong&gt;U&lt;/strong&gt;rchin &lt;strong&gt;T&lt;/strong&gt;raffic &lt;strong&gt;M&lt;/strong&gt;odule para realizar esta tarefa. Com o tempo o &lt;strong&gt;Google&lt;/strong&gt; passou a dar suporte a estes parâmetros, em seguida o &lt;strong&gt;Facebook&lt;/strong&gt; e atualmente estes parâmetros são comumente utilizados para rastrear a efetividade de campanhas de marketing na internet popularmente conhecidos como &lt;strong&gt;as utm tags&lt;/strong&gt;, ou simplesmente, &lt;strong&gt;as utms&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>TLDR: Leitura e escrita de Unicode em arquivos com Python 2 e 3</title><link>https://humberto.io/pt-br/blog/tldr-leitura-e-escrita-de-unicode-em-arquivos-com-python-2-e-3/</link><pubDate>Thu, 23 Aug 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-leitura-e-escrita-de-unicode-em-arquivos-com-python-2-e-3/</guid><description>&lt;p&gt;Conversando no Telegram com o &lt;a href="https://twitter.com/queirozMario21"&gt;Mário Sérgio&lt;/a&gt; sobre problemas que surgem ao migrar código entre versões do Python me veio a ideia de escrever este &lt;strong&gt;tldr&lt;/strong&gt; para ajudar quem precisa fazer leitura ou escrita de arquivos que contenham texto com caracteres &lt;a href="https://pt.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; que não estão presentes na tabela &lt;a href="https://pt.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt; como caracteres acentuados, alfabetos diferentes do romano e &lt;a href="https://pt.wikipedia.org/wiki/Emoji"&gt;emoji&lt;/a&gt;, através de um código que funcione em ambas versões.&lt;/p&gt;
&lt;p&gt;No Python 2 não existe uma distinção entre &lt;strong&gt;byte&lt;/strong&gt; e &lt;strong&gt;string&lt;/strong&gt;, o que faz com que códigos que lidam com entrada e saída sem o devido cuidado com codificação e decodificação funcionem sem nenhum erro aparente. Mas quando ele acontece deixa muita gente perdida com mensagens deste tipo:&lt;/p&gt;</description></item><item><title>Enviando e recebendo emails com Python</title><link>https://humberto.io/pt-br/blog/enviando-e-recebendo-emails-com-python/</link><pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/enviando-e-recebendo-emails-com-python/</guid><description>&lt;p&gt;Um dia na terça do Python no &lt;a href="https://calango.club/"&gt;Calango Hacker Clube&lt;/a&gt; surgiu uma dúvida de como ler emails do Gmail para poder categorizar as mensagens e automatizar o processo de leitura dos emails usando Python. Esta dúvida motivou esta postagem que tem o objetivo de ajudar a todos que tiverem dúvidas de como começar a interagir com sistemas de troca de emails utilizando Python.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://humberto.io/blog/sending-and-receiving-emails-with-python/assets/python-mail.png" alt="python email"&gt;&lt;/p&gt;
&lt;aside class="tip info"&gt;
 Esta postagem tem como alvo o público iniciante mas também pode ser útil para quem já possuí experiência na linguagem mas nunca tinha trabalhado diretamente com envio e recebimento de emails. A versão do Python utilizada para publicar esta postagem foi a 3.6.x.
&lt;/aside&gt;

&lt;h2 id="os-protocolos-de-email"&gt;Os Protocolos de email&lt;/h2&gt;
&lt;p&gt;Sistemas de email são muito robustos pois são construídos em cima de protocolos muito bem estabelecidos e usados por todas as plataformas de email da internet. Estes protocolos são definidos e publicados através de documentos chamados de &lt;a href="https://en.wikipedia.org/wiki/Request_for_Comments"&gt;RFC&lt;/a&gt; que é uma sigla para Request for Comments que lembram um pouco as &lt;a href="https://www.python.org/dev/peps/"&gt;PEPs&lt;/a&gt; do Python só que para os protocolos que definem a base do funcionamento das comunicações entre sistemas como a internet.&lt;/p&gt;</description></item><item><title>TLDR: Dependências Dev Python no Ubuntu</title><link>https://humberto.io/pt-br/blog/tldr-dependencias-dev-python-no-ubuntu/</link><pubDate>Tue, 19 Jun 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-dependencias-dev-python-no-ubuntu/</guid><description>&lt;p&gt;Algumas bibliotecas do python como a que usamos para conversar um banco &lt;strong&gt;SQLite&lt;/strong&gt; são na prática um &lt;strong&gt;encapsulamento de um binário externo&lt;/strong&gt;. Nestes casos precisamos que eles estejam instalados em nosso sistema operacional para que determinado pacote python funcione.&lt;/p&gt;
&lt;p&gt;Quando isso acontece, recebemos erros como este:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para resolver estes problemas basta instalar esta dependência externa que normalmente o sistema já reconfigura tudo para você, mas para quem trabalha múltiplas versões do python e com &lt;a href="https://github.com/pyenv/pyenv"&gt;pyenv&lt;/a&gt; é preciso recompilar todas as versões do python toda vez que lembra de uma dependência externa.&lt;/p&gt;</description></item><item><title>TLDR: Configurando corretamente o default de um Model Field do Django</title><link>https://humberto.io/pt-br/blog/tldr-configurando-corretamente-o-default-de-um-model-field-do-django/</link><pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-configurando-corretamente-o-default-de-um-model-field-do-django/</guid><description>&lt;p&gt;Esta postagem é o resultado de um &lt;strong&gt;bug&lt;/strong&gt; que me assombrou por uns três meses até conseguir isolar totalmente o erro e, por acontecer em condições muito específicas de temperatura e pressão, tomou muito tempo quebrando cabeça até perceber que o problema era este.&lt;/p&gt;
&lt;aside class="tip warning"&gt;
 &lt;strong&gt;Disclaimer:&lt;/strong&gt; essa informação existe na documentação do &lt;a href="https://docs.djangoproject.com/en/2.0/ref/models/fields/#default"&gt;Django&lt;/a&gt;, porém reforçá-la pode lhe poupar um belo tempo de &lt;strong&gt;debugging&lt;/strong&gt;.
&lt;/aside&gt;

&lt;p&gt;Um dos atributos básicos de um &lt;strong&gt;Model field&lt;/strong&gt; do Django é o &lt;strong&gt;default&lt;/strong&gt; que determina o valor padrão de um campo quando criamos uma instância do &lt;strong&gt;Model&lt;/strong&gt;. Você pode atribuir um &lt;strong&gt;valor&lt;/strong&gt; a ele ou um &lt;strong&gt;callable&lt;/strong&gt; que nada mais é que uma função ou uma classe que implemente o método &lt;code&gt;__call__&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Autenticação JWT com Angular e Django</title><link>https://humberto.io/pt-br/blog/autenticacao-jwt-com-angular-e-django/</link><pubDate>Sun, 15 Apr 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/autenticacao-jwt-com-angular-e-django/</guid><description>&lt;p&gt;Quase todo sistema que opera na internet e armazena dados de usuário hoje em dia depende de uma camada de autenticação. E com o crescimento do modelo de API`s e separação do &lt;strong&gt;frontend&lt;/strong&gt; do &lt;strong&gt;backend&lt;/strong&gt; a implementação desta camada cresceu em complexidade.&lt;/p&gt;
&lt;p&gt;Esta postagem tem como foco mostrar o caminho das pedras em uma stack de frontend &lt;strong&gt;Angular 6&lt;/strong&gt; e backend &lt;strong&gt;Django 2&lt;/strong&gt; utilizando o modelo de separação discutido na postagem &lt;a href="https://humberto.io/pt-bt/blog/separando-o-frontend-do-backend-com-angular-e-django/"&gt;&amp;ldquo;Separando o Frontend do Backend com Angular e Django&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>TLDR: Publicando no PyPI</title><link>https://humberto.io/pt-br/blog/tldr-publicando-no-pypi/</link><pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-publicando-no-pypi/</guid><description>&lt;p&gt;Já se perguntou como publicar seu próprio pacote Python para instalá-lo com o &lt;a href="https://pypi.python.org/pypi/pip"&gt;pip&lt;/a&gt;? É menos complicado que parece, e qualquer pessoa pode fazer.&lt;/p&gt;
&lt;p&gt;Basta acessar o &lt;a href="https://pypi.python.org/pypi"&gt;Python Package Index (PyPI)&lt;/a&gt; e criar uma conta na qual irá registrar seus pacotes.&lt;/p&gt;
&lt;p&gt;Em seguida crie um arquivo python chamado &lt;code&gt;setup.py&lt;/code&gt; alterando os valores que forem necessários:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#585b70;font-style:italic"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;setuptools&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; find_packages, setup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setup(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;meu-pacote-python&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; packages&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;find_packages(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;Descrição curta do meu pacote&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; long_description&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;Longa descrição do meu pacote&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; author&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;Meu Nome&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; author_email&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;meu@email.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;https://github.com/usuario/meu-pacote-python&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; install_requires&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;[&lt;span style="color:#a6e3a1"&gt;&amp;#39;dependencia1&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#39;dependencia2&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; license&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keywords&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;[&lt;span style="color:#a6e3a1"&gt;&amp;#39;dev&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#39;web&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; classifiers&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#39;Intended Audience :: Developers&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#39;License :: OSI Approved :: MIT License&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#39;Natural Language :: English&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#39;Programming Language :: Python :: 2&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#39;Programming Language :: Python :: 3&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O &lt;code&gt;find_packages&lt;/code&gt; é uma ferramenta muito boa para encontrar automaticamente os arquivos que fazem parte do seu pacote qualquer dúvida veja sua documentação clicando &lt;a href="http://setuptools.readthedocs.io/en/latest/setuptools.html#using-find-packages"&gt;aqui&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>TLDR: Executando comandos em multiplos hosts com Fabric</title><link>https://humberto.io/pt-br/blog/tldr-executando-comandos-em-multiplos-hosts-com-fabric/</link><pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/tldr-executando-comandos-em-multiplos-hosts-com-fabric/</guid><description>&lt;p&gt;Me perguntaram como realizar uma conexão ssh em um servidor para rodar o comando &lt;code&gt;df -h&lt;/code&gt; que mostra o uso de disco da máquina. Logo depois descobri que a dúvida se estendia a como fazer isso em vários servidores.&lt;/p&gt;
&lt;p&gt;A resposta me veio rápido na mente, e junto com ela a ideia de documentar estas coisas, o que me trouxe ao começo desta série de postagens curtas carinhosamente batizada de &lt;strong&gt;TLDR&lt;/strong&gt;, que é a abreviação de &lt;strong&gt;T&lt;/strong&gt;oo &lt;strong&gt;L&lt;/strong&gt;ong &lt;strong&gt;D&lt;/strong&gt;idn`t &lt;strong&gt;R&lt;/strong&gt;ead ou, em português, Muito longo, não li.&lt;/p&gt;</description></item><item><title>Separando o Frontend do Backend com Angular e Django</title><link>https://humberto.io/pt-br/blog/separando-o-frontend-do-backend-com-angular-e-django/</link><pubDate>Tue, 13 Feb 2018 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/separando-o-frontend-do-backend-com-angular-e-django/</guid><description>&lt;p&gt;No mundo do desenvolvimento web as coisas vem evoluindo muito rápido e crescendo em complexidade em um ritmo intenso. Aquele modelo antigo de criação de sites onde tinamos o webmaster que dominava o html e logava no servidor para atualiza uma página é algo cada vez mais raro de se ver. Até para criar sites estáticos estamos utilizando ferramentas para agilizar nosso trabalho.&lt;/p&gt;
&lt;p&gt;Nos últimos anos tivemos um crescimento expressivo dos frameworks javascript e uma grande evolução do frontend como um todo, e estas novas tecnologias possuem ferramentas e fluxos de desenvolvimento próprios, o que vem tornando mais oneroso para um sistema só entregar o backend e o frontend.&lt;/p&gt;</description></item><item><title>Desbravando o pygame 4 - Game of Life</title><link>https://humberto.io/pt-br/blog/desbravando-o-pygame-4-game-of-life/</link><pubDate>Sun, 27 Aug 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/desbravando-o-pygame-4-game-of-life/</guid><description>&lt;p&gt;A um tempo atrás eu fiz uma postagem sobre &lt;a href="https://humberto.io/pt-br/blog/coding-dojo-101/"&gt;como organizar um coding dojo&lt;/a&gt; publicada logo após um dojo de aniversário da comunidade python aqui do DF no qual eu preparei o desafio de implementar o &lt;a href="https://pt.wikipedia.org/wiki/Jogo_da_vida"&gt;jogo da vida&lt;/a&gt; (game of life) do matemático John Horton Conway.&lt;/p&gt;
&lt;p&gt;Para deixar este desafio mais interativo preparei um simulador visual com pygame para testar nossa implementação. Este simulador utiliza de todos os conceitos que vimos até agora nesta série e aproveitando o interesse que ressurgiu no Grupy-DF sobre o assunto decidi reforçar os tópicos até então apresentados com a demonstração desta implementação.&lt;/p&gt;</description></item><item><title>Desbravando o pygame 3 - Game Loop</title><link>https://humberto.io/pt-br/blog/desbravando-o-pygame-3-game-loop/</link><pubDate>Thu, 24 Aug 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/desbravando-o-pygame-3-game-loop/</guid><description>&lt;p&gt;Agora que sabemos como desenhar na tela (&lt;a href="https://humberto.io/pt-br/blog/desbravando-o-pygame-2-desenhando-na-tela/"&gt;postagem anterior&lt;/a&gt;) seria interessante que nosso jogo ficasse rodando até que alguém o feche. Para isso vamos utilizar um dos fundamentos do desenvolvimento de jogos que é o Game Loop.&lt;/p&gt;
&lt;h2 id="conceito"&gt;Conceito&lt;/h2&gt;
&lt;p&gt;Dentro da computação o conceito de ciclo é bastante recorrente, trata-se de uma sequência de ações e tomadas de decisão programadas que se repetem dentro de um laço de repetição (ou loop). No baixo nível temos o processador do computador que trabalha em ciclos de operações aritméticas gerenciadas pelo clock, em sistemas operacionais o ciclo é quem gerencia o tempo de uso do processador, o dividindo entre todas as aplicações do sistema além de verificar se o usuário realizou algum comando, em servidores web usamos um ciclo para verificar se alguém requisitou uma página que será processada e devolvida em forma de resposta. Com jogos não seria diferente.&lt;/p&gt;</description></item><item><title>Desbravando o pygame 2 - Desenhando na Tela</title><link>https://humberto.io/pt-br/blog/desbravando-o-pygame-2-desenhando-na-tela/</link><pubDate>Fri, 03 Feb 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/desbravando-o-pygame-2-desenhando-na-tela/</guid><description>&lt;p&gt;Ao longo de um jogo estamos constantemente desenhando na tela. E agora que já sabemos criar um programa em pygame é hora de começar a desenhar.&lt;/p&gt;
&lt;h2 id="plano-de-desenho"&gt;Plano de desenho&lt;/h2&gt;
&lt;p&gt;Voltando nas aulas de matemática do ensino fundamental fomos apresentados ao plano cartesiano. O plano cartesiano e um espaço bidimensional orientado pelos eixos x e y onde x aumenta para o lado direito e diminui para o lado esquerdo enquanto y aumenta para cima e diminui para baixo:&lt;/p&gt;</description></item><item><title>Desbravando o pygame 1 - Conhecendo a Biblioteca</title><link>https://humberto.io/pt-br/blog/desbravando-o-pygame-1-conhecendo-a-biblioteca/</link><pubDate>Sun, 15 Jan 2017 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/desbravando-o-pygame-1-conhecendo-a-biblioteca/</guid><description>&lt;p&gt;Desenvolver jogos é um lugar comum dentre muitas das pessoas que começam a estudar programação. Comigo não foi diferente, mesmo não seguindo a carreira de desenvolvimento de jogos esta sempre foi uma área que me chamou a atenção.&lt;/p&gt;
&lt;p&gt;Estou criando esta série para aprender mais sobre desenvolvimento de jogos utilizando como ferramenta o &lt;a href="http://www.pygame.org/"&gt;pygame&lt;/a&gt; e para compartilhar minhas descobertas no processo. Irei desbrava-lo partindo de seus princípios básicos até a criação de um pequeno jogo pong single player.&lt;/p&gt;</description></item><item><title>Coding Dojo 101</title><link>https://humberto.io/pt-br/blog/coding-dojo-101/</link><pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/coding-dojo-101/</guid><description>&lt;p&gt;Meu primeiro Coding Dojo aconteceu próximo ao meu primeiro contato com a linguagem Python na faculdade. Um colega de classe (&lt;a href="https://github.com/ravishi"&gt;Dirley&lt;/a&gt;) tinha acabado de voltar da Python Brasil muito animado, pois tinha visto uma palestra sobre o tema e queria colocar em prática com o pessoal da turma. Aquele dia foi muito divertido e talvez um dos mais importantes momentos que me levaram a mergulhar de cabeça na linguagem Python.&lt;/p&gt;</description></item><item><title>Software Livre ou Código Aberto?</title><link>https://humberto.io/pt-br/blog/software-livre-ou-codigo-aberto/</link><pubDate>Wed, 25 May 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/software-livre-ou-codigo-aberto/</guid><description>&lt;p&gt;Recentemente, participei de uma discussão no &lt;a href="https://telegram.me/grupydf"&gt;Telegram da comunidade Grupy-DF&lt;/a&gt; sobre como diferenciar de forma simples código aberto de software livre para pessoas que não são da área de TI. E na medida em que a discussão acontecia percebi que toda tentativa de simplificar levou a mais discussão e dúvidas sobre o assunto.&lt;/p&gt;
&lt;p&gt;Com isso tentei condensar aqui meu entendimento sobre o assunto.&lt;/p&gt;
&lt;h2 id="software-livre"&gt;Software Livre&lt;/h2&gt;
&lt;p&gt;O software livre ou Free Software é um termo utilizado para denominar programas de computador que respeitam o ideais de liberdade e comunidade. Eles estão compilados em 4 liberdades essenciais definidas pela Free Software Foundation (FSF) que podem ser lidas através deste &lt;a href="http://www.gnu.org/philosophy/free-sw.pt-br.html"&gt;link&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>GitHub Pages com Pelican e Travis-CI</title><link>https://humberto.io/pt-br/blog/github-pages-com-pelican-e-travis-ci/</link><pubDate>Thu, 05 May 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/github-pages-com-pelican-e-travis-ci/</guid><description>&lt;p&gt;&lt;strong&gt;Publicado originalmente em:&lt;/strong&gt; &lt;a href="http://df.python.org.br/blog/github-pages-com-pelican-e-travis-ci"&gt;df.python.org.br/blog/github-pages-com-pelican-e-travis-ci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Estou fazendo esta postagem para ajudar quem quer criar seu site no &lt;a href="http://pages.github.com"&gt;GitHub Pages&lt;/a&gt; usando &lt;a href="http://blog.getpelican.com"&gt;Pelican&lt;/a&gt; para a criação das páginas e o &lt;a href="https://travis-ci.org"&gt;Travis-CI&lt;/a&gt; para automatizar a tarefa de geração e publicação.&lt;/p&gt;
&lt;p&gt;Este guia assume que o leitor possua conta no &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; e no Travis-CI e tenha familiaridade com o ambiente python. A versão do pelican utilizada ao elaborar esta publicação foi a 3.6.&lt;/p&gt;
&lt;h2 id="o-github-pages"&gt;O GitHub Pages&lt;/h2&gt;
&lt;p&gt;O GitHub Pages é uma funcionalidade gratuita do GitHub para hospedar conteúdo estático (html, css, js e imagens) e publicar através de um sub-domínio de &lt;strong&gt;github.io&lt;/strong&gt; ou até mesmo de um domínio customizado.&lt;/p&gt;</description></item><item><title>Relacionamentos ManyToMany genéricos com Django</title><link>https://humberto.io/pt-br/blog/relacionamentos-manytomany-genericos-com-django/</link><pubDate>Fri, 29 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/relacionamentos-manytomany-genericos-com-django/</guid><description>&lt;p&gt;A documentação oficial do django cobre muito bem sua funcionalidade de relacionamento genérico na cardinalidade &lt;code&gt;OneToMany&lt;/code&gt; (um para muitos ou &lt;strong&gt;1:N&lt;/strong&gt;), porém, quando é preciso implementar um relacionamento genérico de &lt;code&gt;ManyToMany&lt;/code&gt; (muitos para muitos ou &lt;strong&gt;N:N&lt;/strong&gt;) não há muita documentação a respeito.&lt;/p&gt;
&lt;p&gt;Recentemente, precisei implementar um &lt;strong&gt;N:N&lt;/strong&gt; com um lado genérico, e encontrei uma biblioteca chamada &lt;a href="http://django-gm2m.readthedocs.io/en/stable/index.html"&gt;django-gm2m&lt;/a&gt; que me foi muito útil nesta tarefa, e vou descrever aqui dando dicas de como implementar evitando possíveis dores de cabeça.&lt;/p&gt;</description></item><item><title>Sites Estáticos com Lektor</title><link>https://humberto.io/pt-br/blog/sites-estaticos-com-lektor/</link><pubDate>Sat, 23 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/sites-estaticos-com-lektor/</guid><description>&lt;p&gt;Faz pelo menos 4 anos que eu ensaio montar um blog, e neste período já criei alguns para a comunidade, mas quando chegava a hora de criar o meu nunca conseguia chegar ao ponto de publicar.&lt;/p&gt;
&lt;p&gt;Usando ferramentas como o WordPress o problema era a dificuldade de customização e a quantidade de ferramentas e padrões que eu nunca iria usar, além é claro, de não ser &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Em seguida com o &lt;a href="https://pages.github.com"&gt;GitHub Pages&lt;/a&gt; eu descobri o &lt;a href="http://blog.getpelican.com"&gt;Pelican&lt;/a&gt; por indicação do &lt;a href="http://mindbending.org/pt"&gt;Magnun Leno&lt;/a&gt; e comecei a fazer muita coisa com ele, mas da mesma forma com que eu ganhei em liberdade de customização, o processo autoral era o mesmo do desenvolvimento o que em um primeiro momento parece legal não é mesmo? Pois é, mas com o tempo você percebe que isso acaba virando um problema quando você para a escrita de uma postagem para arrumar um &lt;strong&gt;bug&lt;/strong&gt; ou melhorar alguma coisa no layout e lá vamos nós novamente&amp;hellip;&lt;/p&gt;</description></item><item><title>Olá mundo!</title><link>https://humberto.io/pt-br/blog/ola-mundo/</link><pubDate>Thu, 21 Apr 2016 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/blog/ola-mundo/</guid><description>&lt;p&gt;Olá pessoal,&lt;/p&gt;
&lt;p&gt;Está é a primeira postagem do meu blog, nele discutirei temas ligados a Python, tecnologia, open source, o universo e tudo mais.&lt;/p&gt;
&lt;p&gt;Eu criei este blog com o objetivo de me ajudar a consolidar conhecimento e eventualmente ajudar alguém com meus devaneios.&lt;/p&gt;
&lt;p&gt;No mais, fiquem ligados nas cenas dos próximos capítulos&amp;hellip;&lt;/p&gt;</description></item><item><title>Curriculum</title><link>https://humberto.io/pt-br/curriculum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://humberto.io/pt-br/curriculum/</guid><description/></item></channel></rss>