<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://paulocollares.com.br/feed.xml" rel="self" type="application/atom+xml" /><link href="https://paulocollares.com.br/" rel="alternate" type="text/html" /><updated>2026-07-17T13:43:05-03:00</updated><id>https://paulocollares.com.br/feed.xml</id><title type="html">Paulo Collares</title><subtitle>Tecnologia, programação e aleatoriedades</subtitle><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><entry><title type="html">Deploy de containers Docker na AWS: ECR, Portainer e SSL</title><link href="https://paulocollares.com.br/textos/deploy-docker-ecr-portainer-ssl/" rel="alternate" type="text/html" title="Deploy de containers Docker na AWS: ECR, Portainer e SSL" /><published>2026-07-17T00:00:00-03:00</published><updated>2026-07-17T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/deploy-docker-ecr-portainer-ssl</id><content type="html" xml:base="https://paulocollares.com.br/textos/deploy-docker-ecr-portainer-ssl/"><![CDATA[<p>Recentemente precisei estruturar um fluxo de deploy para um serviço containerizado rodando em uma instância EC2 na AWS, já com Docker e Portainer instalados e um domínio apontado via Route 53. Neste texto documento o processo completo: da criação do repositório de imagens até o HTTPS funcionando.</p>

<h2 id="o-cenário">O cenário</h2>

<ul>
  <li>EC2 Ubuntu com Docker e Portainer já rodando</li>
  <li>Domínio já configurado no Route 53</li>
  <li>Objetivo: subir uma imagem Docker para o Amazon ECR (Elastic Container Registry), fazer o Portainer consumir essa imagem e expor o serviço via HTTPS</li>
</ul>

<h2 id="1-autenticação-aws">1. Autenticação AWS</h2>

<p>O primeiro passo é garantir que o AWS CLI local tenha credenciais válidas:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aws sts get-caller-identity
</code></pre></div></div>

<p>Se o comando falhar (erros como <code class="language-plaintext highlighter-rouge">InvalidClientTokenId</code> ou pendências de configuração SSO), o caminho mais simples para uso individual é criar um usuário IAM dedicado, sem acesso ao console, com uma access key gerada especificamente para linha de comando:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aws configure
</code></pre></div></div>

<p>Informando <code class="language-plaintext highlighter-rouge">Access Key ID</code>, <code class="language-plaintext highlighter-rouge">Secret Access Key</code>, região e formato de saída.</p>

<h2 id="2-criando-o-repositório-no-ecr">2. Criando o repositório no ECR</h2>

<p>Com as credenciais configuradas:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aws ecr create-repository <span class="nt">--repository-name</span> meu-servico <span class="nt">--region</span> sa-east-1
</code></pre></div></div>

<p>A URL do repositório segue o padrão:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;account-id&gt;.dkr.ecr.&lt;regiao&gt;.amazonaws.com/meu-servico
</code></pre></div></div>

<h2 id="3-build-e-push-da-imagem">3. Build e push da imagem</h2>

<p>Na pasta do projeto, com o <code class="language-plaintext highlighter-rouge">Dockerfile</code> já pronto:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># autenticação no registry</span>
aws ecr get-login-password <span class="nt">--region</span> sa-east-1 | <span class="se">\</span>
  docker login <span class="nt">--username</span> AWS <span class="nt">--password-stdin</span> &lt;account-id&gt;.dkr.ecr.sa-east-1.amazonaws.com

<span class="c"># build</span>
docker build <span class="nt">-t</span> meu-servico <span class="nb">.</span>

<span class="c"># tag apontando para o ECR</span>
docker tag meu-servico:latest &lt;account-id&gt;.dkr.ecr.sa-east-1.amazonaws.com/meu-servico:latest

<span class="c"># push</span>
docker push &lt;account-id&gt;.dkr.ecr.sa-east-1.amazonaws.com/meu-servico:latest
</code></pre></div></div>

<p>Um detalhe que vale mencionar: depender só da tag <code class="language-plaintext highlighter-rouge">latest</code> dificulta rastrear qual versão está em produção e complica rollback. Tags mais específicas (SHA do commit, número de versão) resolvem isso sem custo adicional.</p>

<h2 id="4-um-usuário-iam-só-de-leitura-para-o-portainer">4. Um usuário IAM só de leitura para o Portainer</h2>

<p>Para o Portainer puxar imagens do ECR, não é necessário dar permissão de escrita. A AWS já tem uma policy gerenciada pronta para isso:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>AmazonEC2ContainerRegistryReadOnly
</code></pre></div></div>

<p>Ela cobre exatamente o necessário — <code class="language-plaintext highlighter-rouge">GetAuthorizationToken</code>, <code class="language-plaintext highlighter-rouge">BatchGetImage</code>, <code class="language-plaintext highlighter-rouge">DescribeRepositories</code>, entre outras — sem permitir push, delete ou alteração de repositórios. Vale criar um usuário IAM exclusivo com essa policy só para as credenciais que o Portainer vai usar, seguindo o princípio de menor privilégio.</p>

<h2 id="5-registrando-o-ecr-no-portainer">5. Registrando o ECR no Portainer</h2>

<p>No Portainer:</p>

<ol>
  <li><strong>Registries → Add registry</strong>, tipo <strong>AWS ECR</strong></li>
  <li>Informar as credenciais do usuário read-only e a região</li>
  <li>Salvar</li>
</ol>

<p>O Portainer se encarrega de renovar o token de autenticação do ECR automaticamente (ele expira a cada 12h).</p>

<h3 id="subindo-o-container-pela-primeira-vez">Subindo o container pela primeira vez</h3>

<p>Em <strong>Containers → Add container</strong>, seleciona-se o registry cadastrado, o repositório e a tag desejada. Um ponto de atenção aqui: o campo de imagem espera <code class="language-plaintext highlighter-rouge">repositorio:tag</code> — a URL do registry já é preenchida automaticamente pelo Portainer a partir do registry selecionado. Tentar digitar a tag isoladamente (ex: só <code class="language-plaintext highlighter-rouge">latest</code>) gera erro de referência inválida, porque o Portainer concatena o valor ao path do repositório.</p>

<p>Configurações do container:</p>
<ul>
  <li><strong>Port mapping:</strong> porta interna do host (ex: <code class="language-plaintext highlighter-rouge">3000</code>) → porta exposta pela aplicação (ex: <code class="language-plaintext highlighter-rouge">8080</code>)</li>
  <li><strong>Restart policy:</strong> <code class="language-plaintext highlighter-rouge">unless-stopped</code></li>
</ul>

<p>Essa política reinicia o container automaticamente após falhas ou reboot da instância, mas <strong>não</strong> o reinicia se ele for parado manualmente — diferente de <code class="language-plaintext highlighter-rouge">always</code>, que reinicia mesmo após parada intencional.</p>

<h3 id="atualizando-o-container-em-deploys-futuros">Atualizando o container em deploys futuros</h3>

<p>Após um novo <code class="language-plaintext highlighter-rouge">docker push</code>, no Portainer: seleciona-se o container → <strong>Recreate</strong> → marca-se <strong>“Pull latest image”</strong>. Isso refaz o container com a imagem mais recente, mantendo porta, nome e demais configurações.</p>

<blockquote>
  <p>Container webhooks (que permitiriam disparar esse recreate via uma chamada HTTP simples, útil em pipelines de CI/CD) fazem parte da Business Edition do Portainer — que, vale registrar, é gratuita para até 3 nós, sem limite de tempo. Uma alternativa sem depender disso é rodar o pull/stop/rm/run diretamente via SSH a partir do pipeline de CI.</p>
</blockquote>

<h2 id="6-https-com-lets-encrypt">6. HTTPS com Let’s Encrypt</h2>

<p>Como o container passa a escutar numa porta interna (não mais diretamente na 80), um reverse proxy na própria instância cuida do SSL.</p>

<p>Instalação:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>nginx certbot python3-certbot-nginx <span class="nt">-y</span>
</code></pre></div></div>

<p>Configuração do site (<code class="language-plaintext highlighter-rouge">/etc/nginx/sites-available/meu-servico</code>):</p>

<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
    <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
    <span class="kn">server_name</span> <span class="s">meuservico.exemplo.com</span><span class="p">;</span>

    <span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
        <span class="kn">proxy_pass</span> <span class="s">http://localhost:3000</span><span class="p">;</span>
        <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
        <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
        <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
        <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-Proto</span> <span class="nv">$scheme</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo ln</span> <span class="nt">-s</span> /etc/nginx/sites-available/meu-servico /etc/nginx/sites-enabled/
<span class="nb">sudo </span>nginx <span class="nt">-t</span>
<span class="nb">sudo </span>systemctl reload nginx
</code></pre></div></div>

<p>Emissão do certificado:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>certbot <span class="nt">--nginx</span> <span class="nt">-d</span> meuservico.exemplo.com
</code></pre></div></div>

<p>O Certbot detecta a configuração do Nginx, emite o certificado e já configura o redirecionamento HTTP → HTTPS. A renovação automática é instalada junto (via cron ou systemd timer), e pode ser validada com:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>certbot renew <span class="nt">--dry-run</span>
</code></pre></div></div>

<h2 id="considerações-finais">Considerações finais</h2>

<p>O fluxo inteiro — ECR para armazenar imagens, Portainer como camada de gerenciamento visual dos containers, Nginx + Certbot para TLS — é uma combinação simples de montar e barata de manter, especialmente para quem já tem uma única instância EC2 e não quer (ainda) a complexidade de um orquestrador completo como ECS ou Kubernetes. Para cenários com múltiplos serviços ou necessidade de deploy automatizado via webhook, vale considerar migrar para a Business Edition do Portainer ou integrar o pull/redeploy diretamente no pipeline de CI/CD via SSH.</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Como estruturei um fluxo de deploy de containers Docker usando ECR, Portainer e Let's Encrypt em uma EC2.]]></summary></entry><entry><title type="html">Dicas úteis de terminal Linux</title><link href="https://paulocollares.com.br/textos/dicas-uteis-terminal-linux/" rel="alternate" type="text/html" title="Dicas úteis de terminal Linux" /><published>2026-07-17T00:00:00-03:00</published><updated>2026-07-17T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/dicas-uteis-terminal-linux</id><content type="html" xml:base="https://paulocollares.com.br/textos/dicas-uteis-terminal-linux/"><![CDATA[<p>Reuni aqui um conjunto de comandos e atalhos de terminal que uso com frequência. Nada revolucionário, mas são daquelas coisas que, uma vez aprendidas, você não larga mais.</p>

<h2 id="limpar-swap">Limpar swap</h2>

<p>Quando o swap está “sujo” e você quer forçar o kernel a liberar e realocar:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>swapoff <span class="nt">-a</span> <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>swapon <span class="nt">-a</span>
</code></pre></div></div>

<p>Isso desativa todas as áreas de swap e as reativa em seguida, efetivamente limpando o que estava armazenado ali.</p>

<h2 id="alterar-grupo-de-um-diretório">Alterar grupo de um diretório</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chgrp </span>suporte <span class="o">[</span>diretorio]
</code></pre></div></div>

<p>Troca o grupo dono do diretório informado.</p>

<h2 id="listar-tamanho-de-diretórios">Listar tamanho de diretórios</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">du</span> <span class="nt">-hd</span> 1
</code></pre></div></div>

<p>Mostra o tamanho de cada subdiretório (1 nível de profundidade) em formato legível (<code class="language-plaintext highlighter-rouge">-h</code>).</p>

<h2 id="top--htop">top / htop</h2>

<p><code class="language-plaintext highlighter-rouge">top -c</code> mostra a linha de comando completa do processo, em vez de só o nome do programa.</p>

<p>Atalhos úteis dentro do <code class="language-plaintext highlighter-rouge">top</code>:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">e</code> — altera as unidades na lista de processos</li>
  <li><code class="language-plaintext highlighter-rouge">E</code> — altera as unidades no resumo (topo da tela)</li>
  <li><code class="language-plaintext highlighter-rouge">P</code> — ordena por uso de processador</li>
  <li><code class="language-plaintext highlighter-rouge">M</code> — ordena por uso de memória</li>
  <li><code class="language-plaintext highlighter-rouge">T</code> — ordena por tempo de execução</li>
  <li><code class="language-plaintext highlighter-rouge">espaço</code> — força atualização imediata</li>
</ul>

<p>O <code class="language-plaintext highlighter-rouge">htop</code>, por padrão, mostra cada thread de cada processo separadamente. Para desabilitar isso, adicione a linha abaixo em <code class="language-plaintext highlighter-rouge">~/.config/htop/htoprc</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hide_userland_threads=1
</code></pre></div></div>

<h2 id="testar-portas">Testar portas</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nc <span class="nt">-zv</span> 192.168.0.1 80
nc <span class="nt">-zv</span> 192.168.0.1 80-81
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-z</code> — faz o <code class="language-plaintext highlighter-rouge">nc</code> apenas escanear por serviços escutando, sem enviar dados de fato</li>
  <li><code class="language-plaintext highlighter-rouge">-v</code> — modo verboso</li>
</ul>

<h2 id="listar-processo-com-porta-aberta">Listar processo com porta aberta</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsof <span class="nt">-i</span> :portNumber
</code></pre></div></div>

<h2 id="detalhes-do-executável-de-um-pid">Detalhes do executável de um PID</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> <span class="nt">-l</span> /proc/1138/exe
</code></pre></div></div>

<p>O link simbólico aponta para o binário em execução daquele processo.</p>

<h2 id="wget-ignorando-verificação-de-certificado-ssl">wget ignorando verificação de certificado SSL</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget <span class="nt">--no-check-certificate</span> <span class="o">[</span>url]
</code></pre></div></div>

<p>Útil em ambientes de teste com certificados autoassinados — evite em produção.</p>

<h2 id="nano">Nano</h2>

<p>Algumas flags que deixam o <code class="language-plaintext highlighter-rouge">nano</code> mais confortável:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-m</code> — habilita suporte a mouse</li>
  <li><code class="language-plaintext highlighter-rouge">-q</code> — esconde a barra de rolagem</li>
  <li><code class="language-plaintext highlighter-rouge">-l</code> — mostra números de linha</li>
  <li><code class="language-plaintext highlighter-rouge">-t</code> — autosave</li>
  <li><code class="language-plaintext highlighter-rouge">-B</code> — mantém uma versão de backup do arquivo original</li>
</ul>

<h2 id="reexecutar-o-último-comando-com-sudo">Reexecutar o último comando com sudo</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="o">!!</span>
</code></pre></div></div>

<p>Repete o último comando digitado, agora com privilégios de superusuário. Clássico para quando você esquece o <code class="language-plaintext highlighter-rouge">sudo</code>.</p>

<h2 id="busca-reversa-no-histórico">Busca reversa no histórico</h2>

<p><code class="language-plaintext highlighter-rouge">Ctrl + R</code> inicia a busca reversa; <code class="language-plaintext highlighter-rouge">Esc</code> edita o comando encontrado; <code class="language-plaintext highlighter-rouge">Ctrl + R</code> novamente rotaciona entre as ocorrências anteriores.</p>

<p>Para tornar essa busca realmente útil, vale aumentar o tamanho do histórico. Adicione ao <code class="language-plaintext highlighter-rouge">.bashrc</code> ou <code class="language-plaintext highlighter-rouge">.zshrc</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">HISTSIZE</span><span class="o">=</span>10000
<span class="nv">HISTFILESIZE</span><span class="o">=</span>20000
<span class="nv">HISTCONTROL</span><span class="o">=</span>ignoredups:erasedups
</code></pre></div></div>

<p>Assim o histórico guarda até 10.000 comandos e não fica poluído com duplicatas.</p>

<h2 id="corrigir-erros-de-digitação-instantaneamente">Corrigir erros de digitação instantaneamente</h2>

<p>Digitou um comando com typo, tipo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git chekcout main
</code></pre></div></div>

<p>Em vez de subir com a seta e editar manualmente, use a substituição <code class="language-plaintext highlighter-rouge">^antigo^novo</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>^chekcout^checkout
</code></pre></div></div>

<p>Isso troca <code class="language-plaintext highlighter-rouge">chekcout</code> por <code class="language-plaintext highlighter-rouge">checkout</code> no último comando e já executa.</p>

<h2 id="diversos-úteis">Diversos úteis</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> -
</code></pre></div></div>

<p>Volta para o último diretório em que você estava.</p>

<h2 id="rodar-processos-em-background">Rodar processos em background</h2>

<p>Está rodando algo demorado — um build, uma suíte de testes, um servidor — e não quer abrir outra aba? Adicione <code class="language-plaintext highlighter-rouge">&amp;</code> ao final do comando:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm run build &amp;
</code></pre></div></div>

<p>Para trazer de volta ao primeiro plano:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">fg</span>
</code></pre></div></div>

<p>Para ver todos os jobs em background:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">jobs</span>
</code></pre></div></div>

<p>E se você já iniciou um processo longo sem o <code class="language-plaintext highlighter-rouge">&amp;</code>, dá para suspendê-lo com <code class="language-plaintext highlighter-rouge">Ctrl + Z</code> e depois retomá-lo em background:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Ctrl + Z   <span class="c"># suspende</span>
<span class="nb">bg</span>         <span class="c"># retoma em background</span>
</code></pre></div></div>

<h2 id="atalhos-de-linha-de-comando">Atalhos de linha de comando</h2>

<table>
  <thead>
    <tr>
      <th>Atalho</th>
      <th>Ação</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl + U</code></td>
      <td>Limpa tudo antes do cursor</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl + K</code></td>
      <td>Limpa tudo depois do cursor</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl + L</code></td>
      <td>Limpa a tela (equivalente ao <code class="language-plaintext highlighter-rouge">clear</code>)</td>
    </tr>
  </tbody>
</table>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Um apanhado de comandos e atalhos de terminal que economizam tempo no dia a dia.]]></summary></entry><entry><title type="html">A revolução que ameaça o trabalho humano</title><link href="https://paulocollares.com.br/textos/a-revolucao-que-ameaca-o-trabalho-humano/" rel="alternate" type="text/html" title="A revolução que ameaça o trabalho humano" /><published>2026-01-26T00:00:00-03:00</published><updated>2026-01-26T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/a-revolucao-que-ameaca-o-trabalho-humano</id><content type="html" xml:base="https://paulocollares.com.br/textos/a-revolucao-que-ameaca-o-trabalho-humano/"><![CDATA[<p>Nos últimos anos, fomos inundados pela dita ‘IA’. O mercado adotou essa novidade, que não é tão nova assim, e a vende como se fosse a grande revolução do mundo moderno. Será que vamos ser substituídos por máquinas? Será que o trabalho como conhecemos será extinto? São alguns dos temas que quero abordar neste texto.</p>

<p>O conceito de Inteligência Artificial foi simplificado nos últimos anos desde o lançamento do ChatGPT ao público. Foi uma estratégia incrível de simplificar o que já existia para uma interface que qualquer pessoa que já utilizava a internet conseguisse usar, sem API, sem configuração, sem nada técnico, mas um simples chat. Só que, desta vez, do outro lado não há uma pessoa, mas uma LLM poderosa interagindo contigo.</p>

<p>E isso foi o suficiente para determinar uma nova tendência no mercado e acender novamente a dúvida: o trabalho humano pode ser substituído por uma máquina? Acho que Alan Turing ficaria orgulhoso e preocupado se pudesse viver esse momento.</p>

<p>Antes dessa ascensão das LLMs e da simplificação de todo um campo da computação, reduzindo isso a IA, muito se falava em como as máquinas poderiam substituir o trabalho humano. Fábricas já são operadas por robôs autônomos há décadas, aviões já são pilotados automaticamente, dentre outros exemplos, mas, pela primeira vez, o trabalho criativo foi ameaçado.</p>

<p>Já era claro no mercado que toda tarefa, física ou intelectual, que pudesse ser automatizada deveria ser automatizada para baratear custos e reduzir erros de processos, mesmo que isso levasse a demissões. A discussão é retomada agora.</p>

<p>Os defensores usam o exemplo da Revolução Industrial para justificar que o progresso pode e vai extinguir empregos. Porém, a meu ver, a grande diferença está no tempo dessa transição e na possível quantidade de pessoas afetadas de uma só vez. Quando as grandes fábricas foram criadas, houve um grande tempo de transição para isso, e os trabalhadores do campo conseguiram se realocar. Desta vez, talvez isso não aconteça.</p>

<p>A alta capacidade de automatizações que uma IA bem treinada é capaz de fazer pode não substituir trabalhadores braçais, como era esperado de início, mas o trabalho dito criativo, que até então era considerado inatingível. E, na velocidade que isso tem avançado, pode ser questão de tempo que se torne mais viável, para uma empresa, pagar um software que vai realizar o trabalho mais rápido e sem erros do que manter um funcionário.</p>

<p>Mas a pergunta que fica é: isso seria sustentável? Se não houver mais trabalhadores, quem vai consumir os produtos que as máquinas produzem? Na minha opinião, temos que achar um meio-termo para isso, seja combinar o trabalho humano com a máquina, além de sustentar aqueles que não poderão se realocar, não por falta de capacidade, mas por não haver mais vagas disponíveis.</p>

<p>Estamos caminhando para um futuro que, ao mesmo tempo, é brilhante e cheio de possibilidades, mas assustador. Como vamos lidar com isso como sociedade, só o futuro dirá.</p>

<p>[]`s</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Será que estamos ameaçados pela IA?]]></summary></entry><entry><title type="html">Filmes, séries, HQs, livros e jogos de 2025</title><link href="https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2026/" rel="alternate" type="text/html" title="Filmes, séries, HQs, livros e jogos de 2025" /><published>2026-01-01T00:00:00-03:00</published><updated>2026-01-01T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2025</id><content type="html" xml:base="https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2026/"><![CDATA[<p>Como já virou tradição, cataloguei os filmes, séries, jogos e leituras que consumi durante o ano, esta é a lista de 2025.</p>

<h2 id="filmes">Filmes</h2>

<ul>
  <li>Dungeons and dragons</li>
  <li>Túmulo dos vaga-lumes</li>
  <li>Asteroid city</li>
  <li>Aqui</li>
  <li>Robô selvagem</li>
  <li>Chico Bento</li>
  <li>Conclave</li>
  <li>Evidências do amor</li>
  <li>O urso do pó branco</li>
  <li>Rogue one</li>
  <li>Wiked</li>
  <li>Guerra civil</li>
  <li>MIB international</li>
  <li>A baleia</li>
  <li>Superman</li>
  <li>Mikey 17</li>
  <li>Pecadores</li>
</ul>

<h2 id="séries">Séries</h2>

<ul>
  <li>Arcane (Temporada 2)</li>
  <li>Round 6 (Temporada 2 e 3)</li>
  <li>Senna</li>
  <li>Invencível (Temporada 3)</li>
  <li>Ruptura (Temporada 2)</li>
  <li>Adolescência</li>
  <li>Rick and Morty (Temporadas 7 e 8)</li>
  <li>Love, death, robot (Temporada 4)</li>
  <li>The last of us (Temporada 2)</li>
  <li>Black mirror (Temporada 6)</li>
  <li>Andor (Temporada 2)</li>
  <li>Nivel secreto</li>
  <li>The bear (Temporada 4)</li>
  <li>Cardcaptor sakura</li>
  <li>Pacificador (Temporada 2)</li>
  <li>The paper</li>
  <li>Chespirito</li>
  <li>Stranger things (Temporada 5)</li>
</ul>

<h2 id="jogos">Jogos</h2>

<ul>
  <li>Child of light</li>
  <li>Neva</li>
  <li>Peper grinder</li>
  <li>Yakuza like a dragon infinit wealth</li>
  <li>Jedi survivor</li>
</ul>

<h2 id="livros-hqs-e-mangás">Livros, HQs e Mangás</h2>

<ul>
  <li>Refatoração: Aperfeiçoando o design de códigos existentes (Martin Fowler)</li>
  <li>O codificador limpo (Bob Martin)</li>
  <li>O sol é para todos (Harper Lee) [Audiolivro]</li>
  <li>Anne de green gables (L. M. Montgomery) [Audiolivro]</li>
  <li>Enviesados (Rian Dutra)</li>
  <li>O livro que você gostaria que seus pais tivessem lido (Philippa Perry)</li>
  <li>Anne de Alvonela (L. M. Montgomery) [Audiolivro]</li>
  <li>Migrando sistemas monolíticos pqra Microsserviços (Sam Newman)</li>
  <li>De dev a tech lead (Eduardo Matos)</li>
  <li>Anne da ilha (L. M. Montgomery) [Audiolivro]</li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><category term="Lista anual" /><summary type="html"><![CDATA[Como já virou tradição, cataloguei os filmes, séries, jogos e leituras que consumi durante o ano, esta é a lista de 2025.]]></summary></entry><entry><title type="html">A IA já roubou o seu emprego</title><link href="https://paulocollares.com.br/textos/a-ia-ja-roubou-seu-emprego/" rel="alternate" type="text/html" title="A IA já roubou o seu emprego" /><published>2025-11-27T00:00:00-03:00</published><updated>2025-11-27T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/a-ia-ja-roubou-seu-emprego</id><content type="html" xml:base="https://paulocollares.com.br/textos/a-ia-ja-roubou-seu-emprego/"><![CDATA[<p>Pablo Neruda disse uma vez: “Escrever é fácil, você começa com uma letra maiúscula e termina com um ponto final. No meio você coloca ideias.”</p>

<p>Programar é assim também. Você começa com uma instrução, termina com um ponto e vírgula e, no meio… coloca ideias.</p>

<p>Nos últimos anos, vimos uma transformação impressionante no mercado com o avanço das inteligências artificiais generativas — os modelos de linguagem (LLMs) como o ChatGPT e seus concorrentes, o que comumente chamamos de IAs, e como vou chamar neste artigo para fins de simplificação.</p>

<p>A velocidade dessa revolução é espantosa. Em pouquíssimo tempo, essas tecnologias deixaram de ser curiosidades para se tornarem ferramentas de trabalho, estudo e criação.
E aí surge a pergunta: a IA já roubou o seu emprego?</p>

<p>Talvez ainda não, mas, dependendo de como você a usa, ela pode estar se preparando para isso.</p>

<h1 id="explore-com-curiosidade-e-ceticismo">Explore com curiosidade e ceticismo</h1>

<p>É preciso entender o que ela faz, por que faz e o que você está pedindo que ela faça. Usar IA sem senso crítico é perigoso, principalmente para quem ainda está aprendendo. Ela deve acelerar seu aprendizado, não substituí-lo.</p>

<p>Eu mesmo já usei IA para automatizar tarefas demoradas: gerar scripts, montar consultas, criar trechos de código ou pequenas aplicações inteiras, até para ajudar a escrever este texto. Mas sempre em situações em que eu sabia o que estava pedindo. Eu entendia a lógica, sabia validar o resultado e revisar o que foi entregue.
Ela apenas acelerou um processo que eu já dominava.</p>

<h1 id="a-ia-deve-ser-ferramenta-não-substituto">A IA deve ser ferramenta, não substituto.</h1>

<p>Quando você pede à IA para fazer algo que você não sabe fazer, você não aprende. E se você não sabe revisar o resultado, não tem como saber se ela errou — e ela vai errar.</p>

<p>Um estudo da Veracode mostrou que ferramentas de desenvolvimento com IA geram código inseguro em 45% das vezes. Entre as linguagens analisadas, o Java teve o pior desempenho, com apenas 28,5% das gerações consideradas seguras. Os modelos foram bem em alguns tipos de falha (como criptografia insegura e SQL injection), mas foram desastrosos em cross-site scripting (13,5%) e log injection (12%).</p>

<h1 id="se-a-ia-pode-te-substituir-ela-vai-te-substituir">Se a IA pode te substituir, ela vai te substituir</h1>

<p>Esse ponto é especialmente importante para quem ainda está na faculdade ou começando a carreira. Vejo muitos estudantes usando IA como substituto — deixando que ela faça os exercícios, escreva os códigos, monte os trabalhos. Isso é um grande erro!</p>

<p>Porque, se a IA pode te substituir, ela vai te substituir. E o mercado não vai precisar mais de você.</p>

<p>Tarefas repetitivas, mecânicas, que antes eram atribuídas a juniores ou estagiários, agora podem ser automatizadas em minutos. Se você pula essa etapa e se apoia na IA, você pode até entregar o resultado, mas não constrói conhecimento.</p>

<h1 id="primeiro-você-aprende-a-dirigir">Primeiro você aprende a dirigir</h1>

<p>Aprender programação é como aprender a dirigir. No começo, você se preocupa com cada detalhe: trocar marcha, segurar a embreagem; na programação, você se esforça para lembrar o comando do for, o while, a sintaxe correta. Com o tempo, isso se torna natural. Você para de pensar no “como” e começa a pensar no “para onde”.</p>

<p>É nesse momento que a IA pode brilhar: quando você já domina a base e quer ir além. Quando a programação flui naturalmente, a IA pode te ajudar a pensar em alto nível, testar hipóteses, automatizar partes chatas. Mas se você ainda está decorando o básico, ela só vai te atrapalhar.</p>

<h1 id="programar-é-90-pensar">Programar é 90% pensar</h1>

<p>Programar é 90% pensar — entender o problema, planejar, testar hipóteses, buscar soluções, evitar bugs. O código é apenas o resíduo desse esforço mental.</p>

<p>Programação não é linha de produção — é design, é criação. Forçar movimento não gera valor. O que realmente importa é a qualidade do pensamento.</p>

<h1 id="conclusão">Conclusão</h1>

<p>A IA é uma revolução, mas também traz grandes problemas. Ela amplifica tanto nossa capacidade quanto nossas limitações. Se você a usa para aprender, criar e pensar melhor, ela te torna mais forte. Mas se você a usa como atalho para pular etapas, ela vai te substituir.</p>

<p>No fim, a verdade é simples: você não vai perder seu emprego para a IA, mas sim para alguém que sabe usar IA melhor que você.</p>

<p>[]’s</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Será que a IA já roubou o seu emprego?]]></summary></entry><entry><title type="html">Codecon Summit 2025</title><link href="https://paulocollares.com.br/textos/codecon-summit-2025/" rel="alternate" type="text/html" title="Codecon Summit 2025" /><published>2025-08-19T00:00:00-03:00</published><updated>2025-08-19T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/codecon-summit-2025</id><content type="html" xml:base="https://paulocollares.com.br/textos/codecon-summit-2025/"><![CDATA[<p>Nos dias 18 e 19 de julho de 2025 participei da Codecon Summit 2025, um evento voltado para desenvolvedores, com foco em engenharia de software, programação e segurança. Realizado em Curitiba, Paraná, esta foi a terceira edição do evento. Com mais de 1500 participantes nos dois dias do evento, e contou com mais de 30 palestras e painéis.</p>

<p>Deixo aqui, um resumo dos principais temas e discutidos:</p>

<h2 id="ia-no-mercado-de-trabalho">IA no Mercado de Trabalho</h2>

<p>A Inteligência Artificial foi abordada de forma prática: deve ser usada como auxílio, não como substituto. A recomendação é explorar a IA com curiosidade e ceticismo, focando em seu uso para otimizar processos, sem cair em “hypes” sem justificativa real.</p>

<h2 id="monorepo-vs-microsserviços">Monorepo vs. Microsserviços</h2>

<p>Foi apresentada a ideia de Monorepo como uma alternativa aos microsserviços, usando modularização para separar responsabilidades e permissões em um único repositório. As vantagens incluem menor custo e maior facilidade de deploy e manutenção. Enquanto microsserviços são úteis para escalar times, não necessariamente aplicações, o monorepo pode oferecer escalabilidade de módulos e manter fronteiras bem definidas. A mensagem principal foi a importância de escalar a complexidade conforme a necessidade, evitando adicionar complexidade acidental sem justificativa clara. A regra é: “Do the Simplest Thing That Could Possibly Work”.</p>

<blockquote>
  <p>Microsserviços não servem para escalar aplicações, mas para escalar times</p>
</blockquote>

<h2 id="refatoração">Refatoração</h2>

<p>A refatoração deve ser uma prática constante da equipe, e não uma tarefa fixa. Sugere-se que entre 10% e 20% do tempo do desenvolvedor seja dedicado a isso, de forma natural, enquanto se trabalha em novas funcionalidades. Refatorar é essencial para manter o sistema coeso, atualizado e resistente a mudanças.</p>

<h2 id="testes">Testes</h2>

<p>O teste unitário é o seu primeiro usuário e não existe uma boa arquitetura sem testes. A pirâmide de testes (unitário na base, integração no meio, e2e no topo) orienta onde concentrar os esforços, com testes unitários sendo mais “baratos” e importantes para diminuir a dependência do QA. Testes devem ser simples, objetivos, pequenos e fáceis de ler. Um ponto crucial é que “Code Coverage não é tudo, quantidade nem sempre significa qualidade”, e testes que falham intermitentemente devem ser corrigidos ou removidos, pois não são confiáveis.</p>

<blockquote>
  <p>O teste unitário é o seu primeiro usuário!</p>
</blockquote>

<h2 id="rest-apis">REST APIs</h2>

<p>É melhor falhar para alguns usuários do que para todos, enfatizando a importância do conceito “Fail Fast”. APIs REST devem ser idempotentes, ou seja, chamar o mesmo endpoint várias vezes deve produzir o mesmo comportamento. Endpoints de escrita não devem ter efeitos colaterais de inserir o mesmo dado duas vezes, e as operações devem ser “tudo ou nada” para evitar inconsistências.</p>

<h2 id="aprendizagem-e-carreira">Aprendizagem e Carreira</h2>

<p>A aprendizagem se divide em duas formas: difusa (conhecimentos adquiridos em podcasts, eventos, conversas, palestras) e focada (conhecimento formal, cursos, estudo pessoal direcionado). “Aprender dói, tem que doer”, pois o crescimento ocorre quando saímos da zona de conforto. A mensagem final para a carreira é comece agora, não esperar o momento certo, pois “Feito é melhor do que bem feito!”. E lembre-se: “Nem tudo dá certo, mas o que importa é tentar. Falhe rápido, mas não deixe de tentar”.</p>

<blockquote>
  <p>Nem tudo dá certo, mas o que importa é tentar. Falhe rápido, mas não deixe de tentar.</p>
</blockquote>

<p>Foi um evento incrível, quero poder voltar nas próximas edições.</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Mês passado participei da Codecon Summit 2025, conto aqui um pouco da minha experiência]]></summary></entry><entry><title type="html">Dicas para se dar bem na sua primeira entrevista de estágio</title><link href="https://paulocollares.com.br/textos/dicas-para-se-dar-bem-na-sua-primeira-entrevista-de-estagio/" rel="alternate" type="text/html" title="Dicas para se dar bem na sua primeira entrevista de estágio" /><published>2025-08-18T00:00:00-03:00</published><updated>2025-08-18T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/dicas-para-se-dar-bem-na-sua-primeira-entrevista-de-estagio</id><content type="html" xml:base="https://paulocollares.com.br/textos/dicas-para-se-dar-bem-na-sua-primeira-entrevista-de-estagio/"><![CDATA[<p>Hoje é o dia do estagiário, esse texto é a minha forma de celebrar quem está começando na área de tecnologia.</p>

<p>Ao longo de mais de 10 anos participando da seleção de candidatos para vagas de estágio, percebi que muita gente ainda acha que é preciso ter experiência prática para conseguir a primeira oportunidade. A verdade é que, para estagiários, a principal qualidade que buscamos é a disposição para aprender. O resto vem com o tempo e com o próprio aprendizado no dia a dia.</p>

<p>O que realmente faz diferença é a curiosidade e a vontade de se desafiar. Pesquisar por conta própria, perguntar, estudar novas tecnologias, se envolver em discussões técnicas, enfim, tudo que mostra que você não espera só o conhecimento cair no seu colo.</p>

<p>Não é esperado que o candidato chegue com experiência prática, dominando todos os requisitos técnicos, mas que a vontade de aprender se reflita em aplicações práticas. Nada melhor do que mostrar que a teoria que você aprendeu na faculdade, consegue ser aplicada na prática, um projeto pessoal, por exemplo. Não precisa ser algo grande nem útil, mas deve demonstrar que você está realmente colocando em prática o que está aprendendo. É isso que faz a diferença no início da carreira.</p>

<p>Já tive experiências com candidatos que diziam que estavam dispostos a aprender e a encarar qualquer desafio, mas que no dia a dia não se interessavam em nada diferente do que viam na faculdade. É esperado que que ele queira ir além da sala de aula.</p>

<p>Então fica aqui minha dica, para você estudante, para sua próxima entrevista: Ninguém espera que você domine uma determinada linguagem ou ferramenta, mas que demonstre, de forma prática, que tem capacidade e interesse de dominá-las.</p>

<p>Corra atrás disso e boa sorte.</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Hoje é o dia do estagiário, esse meu texto é para auxiliar quem esta procurando a sua primeira oportunidade para entrar no mercado de trabalho]]></summary></entry><entry><title type="html">Algumas boas práticas de desenvolvimento com Spring Boot</title><link href="https://paulocollares.com.br/textos/algumas-boas-praticas-de-desenvolvimento-com-spring/" rel="alternate" type="text/html" title="Algumas boas práticas de desenvolvimento com Spring Boot" /><published>2025-08-15T00:00:00-03:00</published><updated>2025-08-15T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/algumas-boas-praticas-de-desenvolvimento-com-spring</id><content type="html" xml:base="https://paulocollares.com.br/textos/algumas-boas-praticas-de-desenvolvimento-com-spring/"><![CDATA[<p><strong>1. Separar propriedades por ambiente</strong> Evite colocar configurações de produção diretamente no application.properties padrão. Utilize perfis específicos como application-dev.yml, application-prod.yml e application-test.yml para organizar propriedades de acordo com cada ambiente.</p>

<p><strong>2. Agrupar configurações em classes específicas com @Configuration</strong> Centralize configurações relacionadas em classes dedicadas anotadas com @Configuration, como para banco de dados, segurança, mensageria ou cache. Facilita testes e mantém separação limpa entre serviços.</p>

<p><strong>3. Manter separação clara entre Controller, Service e Repository</strong></p>

<p><strong>Controller:</strong> lida com chamadas HTTP, validação e delega o trabalho.
<strong>Service:</strong> encapsula a lógica de negócio e orquestra interações entre repositórios e outros serviços.
<strong>Repository:</strong> gerencia a persistência no banco de dados.</p>

<p><strong>4. Manter controllers enxutos e serviços robustos</strong> Controllers devem apenas delegar a lógica; toda lógica de negócio deve ficar nos serviços, garantindo clareza, testabilidade e separação de responsabilidades.</p>

<p><strong>5. Usar DTOs para requisição, entidade e resposta</strong> Não exponha entidades JPA diretamente nos controllers. Crie DTOs específicos (CreateUserRequest, UserEntity, UserResponse) para proteger camadas, evitar over-fetching, LazyInitializationException e proteger dados sensíveis.</p>

<p><strong>6. Criar handlers globais de exceção com @ControllerAdvice</strong> Centralize o tratamento de erros usando @ControllerAdvice, retornando respostas consistentes e mapeando exceções para códigos HTTP apropriados.</p>

<p><strong>7. Usar códigos HTTP significativos</strong> Retorne códigos adequados para cada operação: 201 Created para novos recursos, 204 No Content para exclusões, 400 Bad Request para erros de validação etc. Isso torna a API mais intuitiva.</p>

<p><strong>8. Prefira injeção via construtor em vez de via campo</strong> Promove imutabilidade, facilita testes, identifica dependências ausentes em tempo de compilação e torna dependências explícitas.</p>

<p><strong>9. Reduzir uso de classes utilitárias estáticas</strong> Encapsule a lógica em serviços ou beans que podem ser testados isoladamente. Reserve métodos estáticos apenas para funções puramente utilitárias.</p>

<p><strong>10. Adicionar resiliência com Retry, Circuit Breaker e Rate Limiting</strong> Use @Retryable (Spring Retry), @CircuitBreaker (Resilience4j) e rate limiting (Redis ou Bucket4j) ao chamar APIs externas ou bancos de dados.</p>

<p><strong>Referências:</strong></p>

<p>(https://medium.com/@sanchitvarshney/ten-architecture-tips-every-spring-boot-developer-should-learn-early-26ce8327f3c4)</p>

<p>(https://medium.com/@ujjawalr/5-spring-boot-patterns-that-separate-senior-developers-from-juniors-3fdb110d7d30)</p>

<p>(https://medium.com/javaguides/12-best-practices-every-spring-boot-developer-should-follow-4d678d0d5ed6)</p>

<p>(https://medium.com/@pudarimadhavi99/advanced-spring-boot-concepts-every-java-developer-should-know-575fe023d4e5)</p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Algumas boas práticas de desenvolvimento com Spring Boot]]></summary></entry><entry><title type="html">Quatro mitos da engenharia de software</title><link href="https://paulocollares.com.br/textos/quatro-mitos-da-engenharia-de-software/" rel="alternate" type="text/html" title="Quatro mitos da engenharia de software" /><published>2025-08-13T00:00:00-03:00</published><updated>2025-08-13T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/quatro-mitos-da-engenharia-de-software</id><content type="html" xml:base="https://paulocollares.com.br/textos/quatro-mitos-da-engenharia-de-software/"><![CDATA[<p>Texto baseado no episódio de mesmo nome do podcast <strong>Tech Leadership Rocks</strong> do <a href="/in/eduardodematos/">Eduardo Matos</a>: <a href="https://escolaforja.com.br/podcast/tech-leadership-rocks/4-mitos-em-engenharia-de-software-com-edu-matos">https://escolaforja.com.br/podcast/tech-leadership-rocks/4-mitos-em-engenharia-de-software-com-edu-matos</a></p>

<ol>
  <li><strong>Linguagem ‘X’ é lenta</strong> – O desempenho real depende mais do contexto (CPU-bound vs. I/O-bound) do que da velocidade intrínseca da linguagem. Aplicações web são majoritariamente I/O-bound, e otimizar operações de I/O traz ganhos muito maiores do que trocar de linguagem.</li>
  <li><strong>Microsserviços são sempre melhores (ou piores) que monolitos</strong> – Nenhuma abordagem é universal. Monolitos simplificam o início do projeto e aceleram entregas; microsserviços fazem sentido quando há dores reais. Mais importante que adotar uma determinada arquitetura, é escrever um código bem estruturado, com componentes isolados e contratos claros.</li>
  <li><strong>Bancos de Dados SQL não escalam</strong> – Sim, porém com otimizações adequadas. Leitura pode ser otimizada com índices, réplicas, cache e desnormalização; escrita com batching, transações otimizadas e filas assíncronas para diluir carga.</li>
  <li><strong>Trunk-Based Development é a solução definitiva</strong> – Entregas pequenas reduzem riscos, mas o uso excessivo de feature flags pode gerar código complexo e funcionalidades fragmentadas. O foco deve ser entregar valor em incrementos pequenos, não apenas código.</li>
</ol>

<h3 id="bônus">Bônus:</h3>

<p>Alguns mitos que considero importante discutir:</p>

<ul>
  <li><strong>Quanto mais código, melhor o software</strong> - Mensurar produtividade com linhas de código pode ter sido uma métrica do passado, hoje, entendemos que um código limpo, e fácil de manter torna o software mais seguro.</li>
  <li><strong>Adicionar mais programadores acelera qualquer projeto</strong> - A clássica lei de Brooks, adicionar mais programadores em um projeto atrasado aumenta a interação entre os participantes, diminuindo a eficácia a curto prazo.</li>
  <li><strong>Automatizar testes elimina bugs</strong> - Automatizar testes previne que os mesmos bugs reapareçam, não é uma ferramenta mágica que descobre os bugs.</li>
  <li><strong>Software bom não precisa de manutenção</strong> - Software degrada sim, otimizações são necessárias para suprir novas demandas de acesso, novas vulnerabilidades de segurança são descobertas e exploradas, etc.</li>
  <li><strong>Entregar rápido é mais importante que clareza</strong> - um código limpo, fácil de entender e manter é possível realizar melhorias futuras, um código entregue rápido sem responsabilidades definidas, com alto acoplamento e sem testes, torna quase impossível de manter.</li>
  <li><strong>O trabalho do programador é só escrever código</strong> - Parte importante do nosso trabalho é conversar com os pares e o cliente, para extrair do primeiro grupo melhores práticas para cada implementação e com o segundo a real necessidade dele e saber interpretar e transpor isso para um bom produto, que não necessariamente é o que ele quer, mas o que ele precisa para resolver seu problema.</li>
</ul>

<p><strong>Quais mitos você ainda ouve por aí?</strong></p>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><summary type="html"><![CDATA[Alguns mitos da engenharia de software]]></summary></entry><entry><title type="html">Filmes, séries, HQs, livros e jogos de 2024</title><link href="https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2024/" rel="alternate" type="text/html" title="Filmes, séries, HQs, livros e jogos de 2024" /><published>2025-01-01T00:00:00-03:00</published><updated>2025-01-01T00:00:00-03:00</updated><id>https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2024</id><content type="html" xml:base="https://paulocollares.com.br/textos/filmes-series-hqs-livros-e-jogos-de-2024/"><![CDATA[<p>Como já virou tradição, cataloguei os filmes, séries, jogos e leituras que consumi durante o ano, esta é a lista de 2024.</p>

<h2 id="filmes">Filmes</h2>

<ul>
  <li>Assassinos da lua das flores</li>
  <li>Indiana jones e a relíquia do destino</li>
  <li>Nimoma</li>
  <li>Super mario</li>
  <li>Pobres criaturas</li>
  <li>Godzila -1</li>
  <li>Ela</li>
  <li>Gato de botas 2</li>
  <li>Divertidamente 2</li>
  <li>Tartaruga ninjas caos munatnte</li>
  <li>A substância</li>
  <li>O menino e a garça</li>
  <li>Deadpool e wolverine</li>
  <li>O duble</li>
</ul>

<h2 id="séries">Séries</h2>

<ul>
  <li>For all mankind (Temporada 4)</li>
  <li>Treta</li>
  <li>A mensageira</li>
  <li>Cangaco novo</li>
  <li>Invencível (Temporada 2, parte 2)</li>
  <li>X man 97</li>
  <li>The boys (Temporada 4)</li>
  <li>The bear (Temporada 3)</li>
</ul>

<h2 id="jogos">Jogos</h2>

<ul>
  <li>Ducktales remaster</li>
  <li>Shadow of tomb raider</li>
  <li>Rayman legend</li>
  <li>Venba</li>
  <li>Frog detetive</li>
  <li>Super mario world</li>
  <li>Goof troper</li>
  <li>Donkey kong</li>
  <li>Persona 3</li>
  <li>Dungeons of Hinterberg</li>
  <li>O escudeiro valente</li>
  <li>Monument valley 3</li>
</ul>

<h2 id="livros-hqs-e-mangás">Livros, HQs e Mangás</h2>

<ul>
  <li>One Piece (Eiichiro Oda)</li>
  <li>O auto da compadecida (Ariano Suassuna)</li>
  <li>Recursão (Blake Crouch)</li>
  <li>O teste da mãe (Rob Fitzpatrick)</li>
  <li>Solanin (Inio Asano)</li>
  <li>Charlie o jovem adulto (Rafael Fritzen)</li>
  <li>O Mulato (Aluísio Azevedo) [Audio Livro]</li>
  <li>One piece vol 1 (Eiichiro Oda)</li>
  <li>Criando bebês (Dr. Howard Chilton)</li>
  <li>As primeiras quatro estações (Fernanda Witwytzky)</li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;&quot;https://1.gravatar.com/avatar/01b70c3b569fc09fd2b5800e12f0b7c940adca724c1c7343c5e3a93a80160c90?size=256&quot;, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;Profissional de TI com vasta experiência no desenvolvimento de sistemas em Java&quot;, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;&quot;pcollares&quot;, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;&quot;pcollares.photos&quot;, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;&quot;pcollares&quot;, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;pcollares&quot;, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name></author><category term="textos" /><category term="Lista anual" /><summary type="html"><![CDATA[Como já virou tradição, cataloguei os filmes, séries, jogos e leituras que consumi durante o ano, esta é a lista de 2024.]]></summary></entry></feed>