<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe</title>
    <description>The latest articles on DEV Community by Felipe (@felipesantos2).</description>
    <link>https://dev.to/felipesantos2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F841532%2F355e2bbc-a868-4d8f-adec-01c648db2cb7.jpg</url>
      <title>DEV Community: Felipe</title>
      <link>https://dev.to/felipesantos2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipesantos2"/>
    <language>en</language>
    <item>
      <title>O maldito ReportLab</title>
      <dc:creator>Felipe</dc:creator>
      <pubDate>Sun, 16 Aug 2026 03:43:58 +0000</pubDate>
      <link>https://dev.to/felipesantos2/o-maldito-reportlab-36ac</link>
      <guid>https://dev.to/felipesantos2/o-maldito-reportlab-36ac</guid>
      <description>&lt;p&gt;Como foi migrar um relatório criado com o ReportLab para o Jinja2 e WeasyPrint.&lt;/p&gt;




&lt;p&gt;Tudo começou com uma demanda de correção nos valores informados em alguns relatórios em PDF, gerados por processos (DAGS) dentro do Apache Airflow.   &lt;/p&gt;

&lt;p&gt;O Airflow funciona como uma aplicação web, onde existe um painel onde podemos ativar e desativar as DAGS (grafos acíclicos). São basicamente processos que podemos ativar e desativar quando bem quisermos.   &lt;/p&gt;

&lt;p&gt;Por fora, esse projeto era bem simples. Cada DAG verificava se existia um novo pedido de relatório na aplicação em produção e dava início à sua criação com todos os dados necessários e, no final, jogava tudo em um bucket do S3.   &lt;/p&gt;

&lt;h3&gt;
  
  
  O  Grande Problema
&lt;/h3&gt;

&lt;p&gt;Os valores informados nos relatórios estavam inconsistentes, incrivelmente errados, errados para mais, e todos esses valores eram valores monetários (dinheiro). Um puta problemão.   &lt;/p&gt;

&lt;p&gt;A grande questão se deu dentro do ReportLab. Todo o bloco de código que o envolvia me atormentava, pois ele era e ainda é muito complicado de entender. Mesmo olhando a documentação (talvez eu não tenha olhado direito, mas também não tinha tempo para estudar um negócio totalmente novo).   &lt;/p&gt;

&lt;h3&gt;
  
  
  A IA como meu socorrista
&lt;/h3&gt;

&lt;p&gt;Provavelmente esse foi meu uso mais consciente da IA. Sim, como os macacos faziam antes, dentro de um chat. Ele me ajudou a melhorar queries de SQL/MySQL e adicionar regras nelas para resolver a questão com os valores.   &lt;/p&gt;

&lt;p&gt;Hoje, no dia 16 de agosto de 2026, a forma mais fácil e rápida de usar IA como dev é dentro do seu terminal, simples assim. Os famosos agentes editam, criam e geram imagens, SVGs rapidamente dentro do seu projeto. PS: uso muito o CODEX e o pobre do ANTIGRAVITY do Google.   &lt;/p&gt;

&lt;p&gt;Todo o problema inicial era viável de ser resolvido só com o banco e as queries, mas houve um pedido de incremento de um resumo no relatório.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Alguma solução?
&lt;/h3&gt;

&lt;p&gt;Nesse ponto eu entendi a diferença entre montar e renderizar um PDF. Em pacotes/libs/bibliotecas como o ReportLab, você constrói o PDF como um Lego. Calculando o espaçamento, seja em pixel ou milímetro, fazendo o append de algum componente visual e a lógica maluca para montar tabelas junto a mais uma grande quantidade de problemas.   &lt;/p&gt;

&lt;p&gt;Agora, renderizar um PDF é outro mundo; transformar aquele HTML que você escreve quase todo dia em um documento pronto é surreal. Algumas ferramentas deixam tudo tão simples; tudo deveria ser assim.   &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Renderizar é exatamente o que seu navegador faz quando você usa o atalho de impressão (CTRL + P).&lt;/code&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conclusão:
&lt;/h3&gt;

&lt;p&gt;Criei bem rápido um novo repositório só para teste do WeasyPrint e do Jinja2. Usei o próprio chat de IA para me ajudar a replicar com certa exatidão em HTML o relatório anterior e com as marcações do Jinja2. E dito e feito: em um dia (dia completo) e mais uma noite, eu tinha replicado o PDF com certa exatidão e com o mesmo comportamento. Agora, graças a Deus, com os valores corretos.   &lt;/p&gt;

&lt;p&gt;No fim, eu acho que é isso. No meu caso, vou sempre optar por soluções simples, pois o simples, quase todas as vezes, vai ser superior e te poupar tempo.   &lt;/p&gt;

&lt;p&gt;Até a próxima!   &lt;/p&gt;

&lt;p&gt;Alguns links que podem ser úteis:&lt;br&gt;
&lt;a href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;openai/codex&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://antigravity.google/" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.reportlab.com/" rel="noopener noreferrer"&gt;ReportLab&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://jinja.palletsprojects.com/en/stable/" rel="noopener noreferrer"&gt;Jinja - Documentation (3.1.x)&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#installation" rel="noopener noreferrer"&gt;First Steps - WeasyPrint&lt;/a&gt;    &lt;/p&gt;

</description>
      <category>airflow</category>
      <category>sql</category>
      <category>laravel</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Shellscript</title>
      <dc:creator>Felipe</dc:creator>
      <pubDate>Sat, 13 Sep 2025 23:12:50 +0000</pubDate>
      <link>https://dev.to/felipesantos2/shellscript-5eap</link>
      <guid>https://dev.to/felipesantos2/shellscript-5eap</guid>
      <description>&lt;h2&gt;
  
  
  Scripts de shell: uma forma simples de interagir com seu S.O. através de texto.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;ex:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo, ls, pwd, cd, cat, printenv

$USER, $PATH, $USERNAME, $LANG

echo $USER

&amp;gt; teste esses comandos e veja o que acontece
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O comando &lt;code&gt;printenv&lt;/code&gt; lista todas as variáveis do sistema definidas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Todo ambiente desktop possui  uma interface de linha de comando(cli) onde você pode interagir com ele através de um terminal. Um dos principais motivos para se trabalhar com o terminais é o aumento de produtividade, a execução de suas tarefas acaba ficando mais incrivelmente ágil.&lt;/p&gt;

&lt;p&gt;Um exemplo muito básico de uma tarefa de uso geral que todos deveriam fazer é o processo de atualização de pacotes e apps. Atualizar cada ferramenta do seu PC individualmente é muito chato. Esse é um dos motivos que torna os terminais incrivelmente úteis.&lt;/p&gt;

&lt;p&gt;Quando você abrir seu terminal, em qualquer ambiente linux(unix) um shell vai estar disponível pronto para uso, possivelmente vai ser Bash. Ele é um dos mais populares, se não o mais popular atualmente(o Bash  é o shell padrão de muitas distros).&lt;/p&gt;

&lt;p&gt;Um trecho da wiki do Alpine linux sobre uma variedade de shells que estão disponíveis para testarmos, o bash está entre eles.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Acabei de descobrir o elvis shell 🕺, *Elvish na verdade! Mas um shell do Elvis seria uma ideia melhor!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcly007g3yu7in5hcrc6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcly007g3yu7in5hcrc6r.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nota: a ideia desses posts é ser um dump do que estou estudando no momento.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>shell</category>
    </item>
  </channel>
</rss>
