<?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: Carine Neris</title>
    <description>The latest articles on DEV Community by Carine Neris (@carineneris).</description>
    <link>https://dev.to/carineneris</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F233100%2F231296a0-2b9d-4d97-b21d-8a07cb53cf0e.jpg</url>
      <title>DEV Community: Carine Neris</title>
      <link>https://dev.to/carineneris</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/carineneris"/>
    <language>en</language>
    <item>
      <title>Estratégias de Lançamento de Software Progressivo: Além do Simples If/Else com Feature Flags</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Thu, 19 Feb 2026 01:43:09 +0000</pubDate>
      <link>https://dev.to/carineneris/estrategias-de-lancamento-de-software-progressivo-alem-do-simples-ifelse-com-feature-flags-1ng5</link>
      <guid>https://dev.to/carineneris/estrategias-de-lancamento-de-software-progressivo-alem-do-simples-ifelse-com-feature-flags-1ng5</guid>
      <description>&lt;p&gt;E aí, pessoal! Já se pegaram suando frio antes de um deploy, pensando: "Será que essa nova funcionalidade vai quebrar tudo?" Ou talvez, "Como vamos testar isso em produção sem impactar os usuários?" Se sim, preparem-se para conhecer seu novo super-poder: os &lt;strong&gt;Feature Toggles&lt;/strong&gt; (também conhecidos como Feature Flags)!&lt;/p&gt;

&lt;p&gt;Inspirada no clássico artigo de Pete Hodgson no site do Martin Fowler [1], resolvi falar um pouco sobre essa técnica poderosa que permite alterar o comportamento do sistema &lt;em&gt;sem mudar uma linha de código&lt;/em&gt;! Vamos ver como aplicar isso com &lt;strong&gt;Python&lt;/strong&gt; e &lt;strong&gt;FastAPI&lt;/strong&gt;, de um jeito prático.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que São Feature Toggles? Mais que um Simples Liga/Desliga!
&lt;/h2&gt;

&lt;p&gt;Imagine que você está construindo um foguete espacial (seu software, claro!). Você tem várias seções novas: um motor de dobra espacial, um sistema de entretenimento holográfico, e um robô assistente. Você não quer lançar o foguete com tudo isso de uma vez sem testar, certo? E se o motor de dobra espacial der problema, você quer poder desligá-lo rapidamente sem ter que pousar o foguete e trocar a peça.&lt;/p&gt;

&lt;p&gt;Feature Toggles são exatamente isso: &lt;strong&gt;chaves de controle&lt;/strong&gt; no seu código que permitem ligar ou desligar funcionalidades específicas em tempo de execução. Elas desacoplam o &lt;strong&gt;deploy de código&lt;/strong&gt; do &lt;strong&gt;lançamento de funcionalidades&lt;/strong&gt;. Isso significa que você pode enviar código novo para produção (com a funcionalidade desligada) e ativá-la apenas quando estiver pronto, para quem quiser, ou sob certas condições.&lt;/p&gt;

&lt;h2&gt;
  
  
  As Categorias de Toggles
&lt;/h2&gt;

&lt;p&gt;Pete Hodgson categoriza os Feature Toggles com base em sua &lt;strong&gt;longevidade&lt;/strong&gt; e &lt;strong&gt;dinamismo&lt;/strong&gt;. Entender essas categorias é crucial para usar os toggles de forma eficaz e evitar a temida "dívida técnica" de toggles antigos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Longevidade&lt;/th&gt;
&lt;th&gt;Dinamismo&lt;/th&gt;
&lt;th&gt;Propósito Principal&lt;/th&gt;
&lt;th&gt;Exemplo de Uso&lt;/th&gt;
&lt;th&gt;Gerenciamento&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Release Toggles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Curta (dias/semanas)&lt;/td&gt;
&lt;td&gt;Baixo&lt;/td&gt;
&lt;td&gt;Habilitar/desabilitar funcionalidades incompletas ou para lançamento coordenado.&lt;/td&gt;
&lt;td&gt;Lançar uma nova interface de usuário para todos os clientes em uma data específica.&lt;/td&gt;
&lt;td&gt;Remover após o lançamento completo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Experiment Toggles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Média (semanas)&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Testes A/B, multivariados.&lt;/td&gt;
&lt;td&gt;Mostrar duas versões de um botão de compra para diferentes grupos de usuários para ver qual converte mais.&lt;/td&gt;
&lt;td&gt;Remover após o experimento e decisão.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ops Toggles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Curta/Longa&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Controle operacional, "kill switches".&lt;/td&gt;
&lt;td&gt;Desabilitar uma funcionalidade de alto consumo de recursos em caso de pico de tráfego.&lt;/td&gt;
&lt;td&gt;Manter alguns "kill switches" essenciais, remover outros após estabilidade.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissioning Toggles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Longa (meses/anos)&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Personalização de experiência para usuários/grupos específicos.&lt;/td&gt;
&lt;td&gt;Funcionalidades "premium" para assinantes, acesso antecipado para beta testers.&lt;/td&gt;
&lt;td&gt;Podem ser permanentes, parte da lógica de negócio.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Mão na Massa: Implementando um Release Toggle com FastAPI
&lt;/h2&gt;

&lt;p&gt;Vamos criar um cenário simples: uma API FastAPI que tem uma nova funcionalidade de "cálculo de frete otimizado". Queremos fazer o deploy do código, mas só ativar essa funcionalidade para um grupo seleto de usuários ou em um momento específico.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Setup Básico do Projeto
&lt;/h3&gt;

&lt;p&gt;Primeiro, crie um projeto FastAPI (usando Poetry, claro!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry new feature-toggle-app
&lt;span class="nb"&gt;cd &lt;/span&gt;feature-toggle-app
poetry add fastapi uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo &lt;code&gt;main.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. O Nosso "Gerenciador" de Toggles
&lt;/h3&gt;

&lt;p&gt;Para simplificar, vamos usar um dicionário simples para gerenciar nossos toggles. Em um cenário real, isso viria de um serviço externo (como LaunchDarkly, Unleash, ou um banco de dados/config server).&lt;/p&gt;

&lt;p&gt;Crie um arquivo &lt;code&gt;feature_flags.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# feature_flags.py
&lt;/span&gt;
&lt;span class="n"&gt;FEATURE_TOGGLES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OTIMIZED_SHIPPING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Nosso Release Toggle
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NEW_DASHBOARD_BETA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Exemplo de Permissioning/Experiment Toggle
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_feature_enabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;FEATURE_TOGGLES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Integrando o Toggle no FastAPI
&lt;/h3&gt;

&lt;p&gt;Agora, vamos usar nosso toggle na API. Adicionaremos um endpoint para o cálculo de frete. Se o toggle &lt;code&gt;OTIMIZED_SHIPPING&lt;/code&gt; estiver &lt;code&gt;False&lt;/code&gt;, ele usará o cálculo antigo. Se estiver &lt;code&gt;True&lt;/code&gt;, usará o novo.&lt;/p&gt;

&lt;p&gt;Atualize &lt;code&gt;main.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;feature_flags&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;is_feature_enabled&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/shipping_cost/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_shipping_cost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_feature_enabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OTIMIZED_SHIPPING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Lógica do novo cálculo de frete otimizado
&lt;/span&gt;        &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="c1"&gt;# Exemplo: cálculo mais barato
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;optimized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Lógica do cálculo de frete antigo
&lt;/span&gt;        &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="c1"&gt;# Exemplo: cálculo padrão
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;standard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Exemplo de um endpoint que só aparece se o toggle estiver ativo
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/admin/new_dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new_admin_dashboard&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_feature_enabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NEW_DASHBOARD_BETA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New dashboard not available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bem-vindo ao novo painel de administração beta!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para rodar a aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry run uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, você pode testar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse &lt;code&gt;http://127.0.0.1:8000/shipping_cost/10&lt;/code&gt;. Você verá o método "standard".&lt;/li&gt;
&lt;li&gt;Altere &lt;code&gt;OTIMIZED_SHIPPING&lt;/code&gt; para &lt;code&gt;True&lt;/code&gt; em &lt;code&gt;feature_flags.py&lt;/code&gt; e salve. O &lt;code&gt;uvicorn&lt;/code&gt; recarregará.&lt;/li&gt;
&lt;li&gt;Acesse novamente &lt;code&gt;http://127.0.0.1:8000/shipping_cost/10&lt;/code&gt;. Agora você verá o método "optimized"!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é um Release Toggle em ação! Você pode fazer o deploy do código com a funcionalidade "desligada" e ativá-la quando quiser, sem um novo deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boas Práticas: Evitando a "Dívida Técnica" dos Toggles
&lt;/h2&gt;

&lt;p&gt;Feature Toggles são poderosos, mas com grandes poderes vêm grandes responsabilidades. Sem cuidado, seu código pode virar uma teia de &lt;code&gt;if/else&lt;/code&gt;s. Aqui vão algumas dicas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Nomeie Bem Seus Toggles:&lt;/strong&gt; Nomes claros como &lt;code&gt;OTIMIZED_SHIPPING&lt;/code&gt; são melhores que &lt;code&gt;FEATURE_A&lt;/code&gt;. O nome deve indicar o propósito da funcionalidade.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Mantenha a Taxonomia:&lt;/strong&gt; Use as categorias (Release, Experiment, Ops, Permissioning) para guiar a longevidade e o gerenciamento.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Remova Toggles Obsoletos:&lt;/strong&gt; Toggles de Release e Experiment devem ser removidos assim que cumprirem seu propósito. Eles são dívida técnica! Agende a remoção.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Isolamento de Código:&lt;/strong&gt; Tente isolar o código da funcionalidade por trás do toggle. Evite espalhar &lt;code&gt;if is_feature_enabled(...)&lt;/code&gt; por todo o codebase.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Testes:&lt;/strong&gt; Teste ambos os caminhos (toggle ligado e desligado). Seus testes devem cobrir todas as variações.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Ferramentas de Gerenciamento:&lt;/strong&gt; Para projetos maiores, considere usar ferramentas dedicadas como LaunchDarkly, Unleash, ou Split.io. Elas oferecem dashboards, segmentação de usuários, e gerenciamento centralizado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gerenciamento: Quando e Como Dizer Adeus aos Toggles
&lt;/h2&gt;

&lt;p&gt;O maior desafio dos Feature Toggles é o gerenciamento. Um toggle de Release que fica muito tempo no código se torna um toggle de Permissioning ou Ops por acidente, adicionando complexidade desnecessária.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Release Toggles:&lt;/strong&gt; Remova-os assim que a funcionalidade for totalmente lançada e estabilizada. Faça um refactor para remover o &lt;code&gt;if&lt;/code&gt; e o código antigo.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Experiment Toggles:&lt;/strong&gt; Remova-os após a conclusão do experimento e a decisão de manter ou descartar a funcionalidade.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ops Toggles:&lt;/strong&gt; Mantenha apenas os "kill switches" essenciais. Revise-os periodicamente.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Permissioning Toggles:&lt;/strong&gt; Podem ser de longa duração, mas devem ser bem documentados e tratados como parte da lógica de negócio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão: O Futuro da Entrega de Software é Flexível!
&lt;/h2&gt;

&lt;p&gt;Feature Toggles são uma ferramenta essencial para equipes que buscam &lt;strong&gt;Continuous Delivery&lt;/strong&gt; e &lt;strong&gt;Agilidade&lt;/strong&gt;. Eles permitem que você:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reduza o risco de deploys.&lt;/li&gt;
&lt;li&gt;  Faça testes A/B e experimentos em produção.&lt;/li&gt;
&lt;li&gt;  Libere funcionalidades para subconjuntos de usuários.&lt;/li&gt;
&lt;li&gt;  Reaja rapidamente a problemas em produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao adotar essa técnica com sabedoria, você não apenas melhora a qualidade do seu software, mas também a confiança e a velocidade da equipe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;[1] Fowler, Martin. "Feature Toggles (aka Feature Flags)". &lt;em&gt;MartinFowler.com&lt;/em&gt;, 2017. Disponível em: &lt;a href="https://martinfowler.com/articles/feature-toggles.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/feature-toggles.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Agora da pra fazer pequenos post aqui no DEV.to.
Amei a nova feature.</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Wed, 18 Feb 2026 21:07:50 +0000</pubDate>
      <link>https://dev.to/carineneris/agora-da-pra-fazer-pequenos-post-aqui-no-devtoamei-a-nova-feature-2102</link>
      <guid>https://dev.to/carineneris/agora-da-pra-fazer-pequenos-post-aqui-no-devtoamei-a-nova-feature-2102</guid>
      <description></description>
      <category>community</category>
      <category>devto</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Diga Adeus ao Caos: Gerenciando Dependências Python com Poetry</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Thu, 12 Feb 2026 23:22:12 +0000</pubDate>
      <link>https://dev.to/carineneris/diga-adeus-ao-caos-gerenciando-dependencias-python-com-poetry-2ocb</link>
      <guid>https://dev.to/carineneris/diga-adeus-ao-caos-gerenciando-dependencias-python-com-poetry-2ocb</guid>
      <description>&lt;p&gt;Você já se viu em um labirinto de &lt;code&gt;requirements.txt&lt;/code&gt; desatualizados, &lt;code&gt;venv&lt;/code&gt; que não ativam, e conflitos de dependência que parecem saídos de um filme de terror? Se a resposta é sim, respire fundo, porque seus problemas estão prestes a acabar (ou pelo menos, a ficar muito mais fácil de resolver!).&lt;/p&gt;

&lt;p&gt;Hoje, vamos entrar no mundo mágico do &lt;strong&gt;Poetry&lt;/strong&gt; [1], a ferramenta que veio para salvar nossos projetos do caos das dependências.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Fim da Era do &lt;code&gt;pip&lt;/code&gt; e &lt;code&gt;venv&lt;/code&gt; Manual
&lt;/h2&gt;

&lt;p&gt;Antes do Poetry, a vida era... rústica. Criávamos um &lt;code&gt;venv&lt;/code&gt; na mão, ativávamos, rodávamos &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;, e torcíamos para que nada explodisse. E quando explodia, era uma caçada por versões compatíveis que podia durar horas.&lt;/p&gt;

&lt;p&gt;O Poetry chega com uma proposta revolucionária: &lt;strong&gt;gerenciar tudo para você!&lt;/strong&gt; Ele cuida das dependências, cria e gerencia seu ambiente virtual, e ainda garante que todos os seus colaboradores (e até seu servidor de produção) usem exatamente as mesmas versões de bibliotecas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiros Passos: Instalando o Poetry
&lt;/h2&gt;

&lt;p&gt;Instalar o Poetry é moleza. Esqueça o &lt;code&gt;pip install poetry&lt;/code&gt; (sim, é irônico, eu sei). A forma recomendada é usar o instalador oficial, que garante que o Poetry seja isolado do seu ambiente Python principal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Linux/macOS/WSL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://install.python-poetry.org | python3 -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No Windows (PowerShell):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://install.python-poetry.org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseBasicParsing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a instalação, você pode precisar adicionar o diretório de binários do Poetry ao seu &lt;code&gt;PATH&lt;/code&gt;. O instalador geralmente te informa o caminho. Depois, reinicie seu terminal e digite &lt;code&gt;poetry --version&lt;/code&gt; para confirmar que tudo está funcionando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciando um Projeto Poetry: A Magia Começa!
&lt;/h2&gt;

&lt;p&gt;Para começar um novo projeto com Poetry, é tão simples quanto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry new meu_projeto_incrivel
&lt;span class="nb"&gt;cd &lt;/span&gt;meu_projeto_incrivel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria uma estrutura básica de projeto com um arquivo &lt;code&gt;pyproject.toml&lt;/code&gt;, que é onde toda a mágica das dependências acontece. Se você já tem um projeto existente, pode inicializar o Poetry nele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;meu_projeto_existente
poetry init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;poetry init&lt;/code&gt; fará algumas perguntas sobre seu projeto e criará o &lt;code&gt;pyproject.toml&lt;/code&gt; para você.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Coração do Projeto: &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Este arquivo é o seu manifesto. Ele substitui o &lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;setup.py&lt;/code&gt;, &lt;code&gt;setup.cfg&lt;/code&gt; e &lt;code&gt;MANIFEST.in&lt;/code&gt; (ufa!). Aqui você define metadados do projeto, dependências e até scripts. Veja um exemplo simplificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# pyproject.toml&lt;/span&gt;

&lt;span class="nn"&gt;[tool.poetry]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"meu-projeto-incrivel"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Um projeto Python que vai mudar o mundo!"&lt;/span&gt;
&lt;span class="py"&gt;authors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Seu Nome &amp;lt;seu.email@example.com&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;readme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"README.md"&lt;/span&gt;

&lt;span class="nn"&gt;[tool.poetry.dependencies]&lt;/span&gt;
&lt;span class="py"&gt;python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^3.9"&lt;/span&gt; &lt;span class="c"&gt;# Versão do Python que seu projeto usa&lt;/span&gt;
&lt;span class="py"&gt;requests&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^2.28.1"&lt;/span&gt; &lt;span class="c"&gt;# Uma dependência de produção&lt;/span&gt;
&lt;span class="py"&gt;fastapi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^0.100.0"&lt;/span&gt;
&lt;span class="py"&gt;uvicorn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="py"&gt;extras&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"standard"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^0.23.2"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nn"&gt;[tool.poetry.group.dev.dependencies]&lt;/span&gt;
&lt;span class="py"&gt;pytest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^7.4.0"&lt;/span&gt; &lt;span class="c"&gt;# Uma dependência de desenvolvimento&lt;/span&gt;
&lt;span class="py"&gt;ipdb&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^0.13.13"&lt;/span&gt;

&lt;span class="nn"&gt;[build-system]&lt;/span&gt;
&lt;span class="py"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"poetry-core"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;build-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"poetry.core.masonry.api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gerenciando Dependências: Adicionar, Remover, Atualizar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Adicionando Novas Bibliotecas
&lt;/h3&gt;

&lt;p&gt;Para adicionar uma nova dependência de &lt;strong&gt;produção&lt;/strong&gt; (aquela que seu código precisa para rodar em produção), use &lt;code&gt;poetry add&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry add requests
&lt;span class="c"&gt;# Ou com uma versão específica&lt;/span&gt;
poetry add beautifulsoup4@^4.12.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Poetry fará a mágica: ele encontra a melhor versão compatível, instala a biblioteca e suas sub-dependências, e atualiza o &lt;code&gt;pyproject.toml&lt;/code&gt; e o &lt;code&gt;poetry.lock&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependências de Desenvolvimento
&lt;/h3&gt;

&lt;p&gt;Ferramentas como &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;black&lt;/code&gt;, &lt;code&gt;flake8&lt;/code&gt; são essenciais para o desenvolvimento, mas não precisam ir para produção. Para elas, usamos a flag &lt;code&gt;--group dev&lt;/code&gt; (ou &lt;code&gt;-D&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry add pytest &lt;span class="nt"&gt;--group&lt;/span&gt; dev
&lt;span class="c"&gt;# Ou a forma curta&lt;/span&gt;
poetry add black &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elas serão listadas na seção &lt;code&gt;[tool.poetry.group.dev.dependencies]&lt;/code&gt; do seu &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removendo uma Biblioteca
&lt;/h3&gt;

&lt;p&gt;Não precisa mais de uma biblioteca? Sem problemas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry remove requests
&lt;span class="c"&gt;# Para remover uma dependência de desenvolvimento&lt;/span&gt;
poetry remove pytest &lt;span class="nt"&gt;--group&lt;/span&gt; dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Poetry desinstala a biblioteca e atualiza seus arquivos de configuração.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizando Dependências
&lt;/h3&gt;

&lt;p&gt;Para atualizar todas as dependências para as versões mais recentes compatíveis com seu &lt;code&gt;pyproject.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se quiser atualizar uma biblioteca específica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry update requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Segredo da Consistência: &lt;code&gt;poetry.lock&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Quando você adiciona ou atualiza uma dependência, o Poetry cria (ou atualiza) um arquivo chamado &lt;code&gt;poetry.lock&lt;/code&gt;. Este arquivo é um tesouro! Ele registra &lt;strong&gt;exatamente&lt;/strong&gt; quais versões de &lt;strong&gt;todas&lt;/strong&gt; as dependências (diretas e transitivas) foram instaladas e funcionaram juntas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que isso é incrível?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Reprodutibilidade:&lt;/strong&gt; Garante que, não importa onde seu projeto seja clonado ou implantado, ele sempre terá as mesmas versões de bibliotecas.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Estabilidade:&lt;/strong&gt; Evita que atualizações inesperadas de sub-dependências quebrem seu código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Regra de Ouro:&lt;/strong&gt; Sempre comite o &lt;code&gt;poetry.lock&lt;/code&gt; no seu controle de versão (Git)! Ele é tão importante quanto seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambientes Virtuais: Onde o Poetry Brilha
&lt;/h2&gt;

&lt;p&gt;O Poetry cria e gerencia automaticamente ambientes virtuais para seus projetos. Você não precisa mais de &lt;code&gt;python -m venv .venv&lt;/code&gt; ou &lt;code&gt;source .venv/bin/activate&lt;/code&gt;! O Poetry faz isso nos bastidores.&lt;/p&gt;

&lt;p&gt;Para executar um comando dentro do ambiente virtual do seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry run python meu_script.py
poetry run pytest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você realmente quiser entrar no ambiente virtual (para depuração, por exemplo):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry shell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ativa o ambiente virtual na sua sessão do terminal. Para sair, digite &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos Essenciais para o Dia a Dia
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;th&gt;Exemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instala todas as dependências listadas no &lt;code&gt;poetry.lock&lt;/code&gt; (ou &lt;code&gt;pyproject.toml&lt;/code&gt; se o lockfile não existir). Ideal para configurar um projeto pela primeira vez.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry install --no-root&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instala apenas as dependências, sem instalar o próprio projeto como um pacote. Útil em ambientes de produção.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry install --no-root&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry install --only main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instala apenas as dependências de produção.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry install --only main&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry install --only dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instala apenas as dependências de desenvolvimento.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry install --only dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lista todas as dependências instaladas no projeto.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry show&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry show --tree&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mostra as dependências em formato de árvore.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry show --tree&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry env list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lista os ambientes virtuais associados ao projeto.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry env list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;poetry env use python3.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define qual interpretador Python usar para o ambiente virtual.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry env use python3.10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusão: Sua Vida Python Nunca Mais Será a Mesma!
&lt;/h2&gt;

&lt;p&gt;O Poetry não é apenas uma ferramenta; é uma filosofia de gerenciamento de projetos Python. Ele simplifica o fluxo de trabalho, aumenta a reprodutibilidade e permite que você se concentre no que realmente importa: escrever código incrível.&lt;/p&gt;

&lt;p&gt;Então, da próxima vez que você iniciar um projeto Python, dê uma chance ao Poetry. Seu eu do futuro (e seus colegas de equipe) agradecerão! Diga adeus ao caos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;[1] Poetry Documentation: &lt;a href="https://python-poetry.org/docs/" rel="noopener noreferrer"&gt;https://python-poetry.org/docs/&lt;/a&gt;&lt;br&gt;
[2] PEP 518 – Specifying build system dependencies for Python projects: &lt;a href="https://peps.python.org/pep-0518/" rel="noopener noreferrer"&gt;https://peps.python.org/pep-0518/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>poetry</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Alembic: Versionamento de Banco de Dados (Parte 2)</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Thu, 12 Feb 2026 23:07:36 +0000</pubDate>
      <link>https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-parte-2-ldn</link>
      <guid>https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-parte-2-ldn</guid>
      <description>&lt;p&gt;Na &lt;a href="https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-40di"&gt;Parte 1&lt;/a&gt; deste artigo, aprendemos um pouco sobre os fundamentos do Alembic, como inicializar o ambiente de migração e como criar migrações manuais. Agora, vamos elevar o nível e descobrir como automatizar esse processo e como lidar com bancos de dados que já possuem dados e tabelas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatizando Migrações com &lt;code&gt;--autogenerate&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Um dos recursos mais poderosos do Alembic é a sua capacidade de detectar automaticamente as mudanças nos seus modelos SQLAlchemy e gerar os scripts de migração correspondentes. Isso economiza tempo e reduz erros humanos ao escrever DDL manualmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configurando o &lt;code&gt;target_metadata&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Para que o recurso de autogeração funcione, o Alembic precisa saber onde encontrar a definição dos seus modelos (o objeto &lt;code&gt;MetaData&lt;/code&gt;). Isso é configurado no arquivo &lt;code&gt;migrations/env.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Localize a variável &lt;code&gt;target_metadata&lt;/code&gt; e importe o seu objeto &lt;code&gt;Base.metadata&lt;/code&gt; (ou equivalente):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# migrations/env.py
&lt;/span&gt;
&lt;span class="c1"&gt;# Importe o seu objeto Base ou os seus modelos
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;my_app.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt; 

&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="c1"&gt;# Defina o target_metadata
&lt;/span&gt;&lt;span class="n"&gt;target_metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;

&lt;span class="c1"&gt;# ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Certifique-se de que todos os seus modelos foram importados antes de definir o &lt;code&gt;target_metadata&lt;/code&gt;, caso contrário, o Alembic não conseguirá detectá-los.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gerando a Migração Automática
&lt;/h3&gt;

&lt;p&gt;Com o &lt;code&gt;target_metadata&lt;/code&gt; configurado, você pode usar a flag &lt;code&gt;--autogenerate&lt;/code&gt; ao criar uma nova revisão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic revision &lt;span class="nt"&gt;--autogenerate&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add_profile_column_to_users"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Alembic irá comparar o estado atual do banco de dados com a definição nos seus modelos SQLAlchemy e gerará automaticamente as funções &lt;code&gt;upgrade()&lt;/code&gt; e &lt;code&gt;downgrade()&lt;/code&gt; com as alterações detectadas (ex: &lt;code&gt;op.add_column&lt;/code&gt;, &lt;code&gt;op.create_table&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; Sempre revise o arquivo gerado! O Alembic é excelente, mas algumas mudanças complexas (como renomear colunas) podem exigir ajustes manuais no script gerado[1].&lt;/p&gt;




&lt;h2&gt;
  
  
  Começando com um Banco de Dados Existente
&lt;/h2&gt;

&lt;p&gt;Um cenário muito comum é querer introduzir o Alembic em um projeto que já está em andamento e possui um banco de dados populado com tabelas. Se você simplesmente rodar &lt;code&gt;upgrade head&lt;/code&gt;, o Alembic tentará criar tabelas que já existem, resultando em erro.&lt;/p&gt;

&lt;p&gt;Para resolver isso, usamos o processo de &lt;strong&gt;Baselining&lt;/strong&gt;[2].&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1: Criar a Migração de "Estado Zero"
&lt;/h3&gt;

&lt;p&gt;Primeiro, gere uma migração que represente o estado atual do seu banco de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic revision &lt;span class="nt"&gt;--autogenerate&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"baseline_initial_state"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se seus modelos SQLAlchemy estiverem em sincronia com o banco de dados atual, o script gerado pode vir quase vazio. Se houver discrepâncias, ele conterá os comandos para criar as tabelas existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2: O Comando &lt;code&gt;stamp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Em vez de executar essa migração (que falharia ao tentar criar o que já existe), você deve dizer ao Alembic que o banco de dados já está naquela versão. Para isso, usamos o comando &lt;code&gt;stamp&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic stamp &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando &lt;code&gt;stamp&lt;/code&gt; cria a tabela &lt;code&gt;alembic_version&lt;/code&gt; no seu banco de dados e insere o ID da revisão mais recente (o &lt;code&gt;head&lt;/code&gt;), sem executar nenhum código de migração. A partir deste momento, o Alembic "sabe" onde o banco está e você pode começar a criar novas migrações normalmente para as próximas alterações.&lt;/p&gt;




&lt;h2&gt;
  
  
  Melhores Práticas e Arquitetura
&lt;/h2&gt;

&lt;p&gt;Ao trabalhar com Alembic e SQLAlchemy Core, considere estas diretrizes para manter uma arquitetura de banco de dados saudável:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prática&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scripts Atômicos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cada migração deve focar em uma única alteração lógica (ex: adicionar uma tabela ou um conjunto de colunas relacionadas).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Teste de Downgrade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sempre teste se o comando &lt;code&gt;downgrade&lt;/code&gt; funciona corretamente para evitar ficar "preso" em uma versão quebrada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integração no CI/CD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatize o comando &lt;code&gt;alembic upgrade head&lt;/code&gt; no seu pipeline de deploy para garantir que o banco de dados esteja sempre sincronizado com o código.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cuidado com Dados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Migrações DDL alteram estrutura. Se precisar migrar &lt;em&gt;dados&lt;/em&gt; (ex: transformar uma string em um JSON), você pode usar &lt;code&gt;op.execute()&lt;/code&gt; dentro do script de migração.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Alembic transforma o gerenciamento de banco de dados de uma tarefa manual e arriscada em um processo versionado e automatizado. Seja começando um projeto do zero ou organizando um legado, ele é a ferramenta indispensável para qualquer desenvolvedor Python que preza por agilidade e segurança na arquitetura de dados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;[1] Alembic Autogenerate Guide: &lt;a href="https://alembic.sqlalchemy.org/en/latest/autogenerate.html" rel="noopener noreferrer"&gt;https://alembic.sqlalchemy.org/en/latest/autogenerate.html&lt;/a&gt;&lt;br&gt;
[2] Handling Existing Databases with Alembic: &lt;a href="https://alembic.sqlalchemy.org/en/latest/tutorial.html#stamping-the-database" rel="noopener noreferrer"&gt;https://alembic.sqlalchemy.org/en/latest/tutorial.html#stamping-the-database&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>database</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Alembic: Versionamento de Banco de Dados</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Thu, 12 Feb 2026 23:03:50 +0000</pubDate>
      <link>https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-40di</link>
      <guid>https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-40di</guid>
      <description>&lt;h2&gt;
  
  
  A Dor da Evolução do Banco de Dados em Projetos Ágeis
&lt;/h2&gt;

&lt;p&gt;Em projetos de desenvolvimento de software, especialmente aqueles que adotam metodologias ágeis, a arquitetura do banco de dados está em constante evolução. Refatorar o esquema do banco de dados no meio do projeto pode se tornar uma grande dor de cabeça, impactando diretamente as entregas e a estabilidade da aplicação. Mudanças em tabelas, colunas ou relacionamentos precisam ser coordenadas cuidadosamente entre os desenvolvedores e aplicadas de forma consistente em diferentes ambientes (desenvolvimento, homologação, produção).&lt;/p&gt;

&lt;p&gt;É nesse cenário que o &lt;strong&gt;versionamento de banco de dados&lt;/strong&gt; se torna não apenas uma boa prática, mas uma necessidade crítica. Assim como versionamos o código-fonte da nossa aplicação para rastrear alterações, reverter para versões anteriores e colaborar de forma eficiente, precisamos de uma abordagem similar para o esquema do nosso banco de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alembic: A Solução para Evolução Controlada do Banco de Dados
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://alembic.sqlalchemy.org/en/latest/" rel="noopener noreferrer"&gt;Alembic&lt;/a&gt;[1] é uma ferramenta de migração de banco de dados leve, desenvolvida para o &lt;a href="https://www.sqlalchemy.org/" rel="noopener noreferrer"&gt;SQLAlchemy&lt;/a&gt;[2], o popular toolkit SQL e Object-Relational Mapper (ORM). Ele permite que você evolua o esquema do seu banco de dados de forma incremental e controlada, garantindo que as alterações sejam aplicadas de maneira previsível e reversível.&lt;/p&gt;

&lt;p&gt;O Alembic trabalha diretamente com a camada de &lt;strong&gt;Data Definition Language (DDL)&lt;/strong&gt;, ou seja, as operações que definem a estrutura do banco de dados (criar tabelas, adicionar colunas, etc.). Ele gera scripts de migração que podem ser executados para &lt;code&gt;upgrade&lt;/code&gt; (aplicar mudanças) ou &lt;code&gt;downgrade&lt;/code&gt; (reverter mudanças), proporcionando um controle total sobre o estado do seu esquema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Alembic em Seu Projeto
&lt;/h2&gt;

&lt;p&gt;Para começar a usar o Alembic em seu projeto Python, siga os passos abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Instalação
&lt;/h3&gt;

&lt;p&gt;Primeiro, adicione o Alembic como uma dependência do seu projeto. Se você estiver usando &lt;code&gt;poetry&lt;/code&gt; para gerenciamento de dependências, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry add alembic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou, se preferir &lt;code&gt;pip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;alembic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Inicialização do Ambiente de Migração
&lt;/h3&gt;

&lt;p&gt;Após a instalação, você precisa inicializar o ambiente de migração do Alembic. Isso criará uma estrutura de diretórios e arquivos de configuração essenciais. O comando &lt;code&gt;alembic init&lt;/code&gt; cria uma pasta onde suas migrações serão armazenadas e um arquivo de configuração principal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic init migrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando criará um diretório &lt;code&gt;migrations&lt;/code&gt; (ou o nome que você especificar) e um arquivo &lt;code&gt;alembic.ini&lt;/code&gt; na raiz do seu projeto. O diretório &lt;code&gt;migrations&lt;/code&gt; conterá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;env.py&lt;/code&gt;: O ambiente de execução do Alembic, onde você configura como o Alembic interage com seu banco de dados e modelos SQLAlchemy.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;script.py.mako&lt;/code&gt;: Um template para novos scripts de migração.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;versions/&lt;/code&gt;: Um diretório onde os arquivos de migração gerados serão armazenados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Configuração do &lt;code&gt;alembic.ini&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O arquivo &lt;code&gt;alembic.ini&lt;/code&gt; é o coração da configuração do Alembic. Ele contém configurações gerais, como a URL de conexão com o banco de dados. Por padrão, ele é configurado para um único banco de dados.&lt;/p&gt;

&lt;p&gt;Localize a linha &lt;code&gt;sqlalchemy.url&lt;/code&gt; e atualize-a com a string de conexão do seu banco de dados. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# alembic.ini
&lt;/span&gt;
&lt;span class="nn"&gt;[alembic]&lt;/span&gt;
&lt;span class="err"&gt;...&lt;/span&gt;
&lt;span class="py"&gt;sqlalchemy.url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;postgresql://user:password@host:port/database_name&lt;/span&gt;
&lt;span class="c"&gt;# ou para SQLite
# sqlalchemy.url = sqlite:///./sql_app.db
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; Para ambientes de produção, é uma boa prática usar variáveis de ambiente para a string de conexão do banco de dados, em vez de codificá-la diretamente no &lt;code&gt;alembic.ini&lt;/code&gt;. Você pode configurar isso no arquivo &lt;code&gt;env.py&lt;/code&gt; para ler a URL de uma variável de ambiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando Sua Primeira Migração (Manual)
&lt;/h2&gt;

&lt;p&gt;Com o Alembic configurado, você pode criar sua primeira migração. Uma migração é um script Python que descreve as alterações no esquema do banco de dados. Cada migração possui duas funções principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;upgrade()&lt;/code&gt;: Contém o código para aplicar as alterações no banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;downgrade()&lt;/code&gt;: Contém o código para reverter as alterações feitas por &lt;code&gt;upgrade()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para criar um novo arquivo de migração, use o comando &lt;code&gt;alembic revision&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic revision &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"create_initial_tables"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando gerará um novo arquivo Python no diretório &lt;code&gt;versions/&lt;/code&gt; (ex: &lt;code&gt;xxxxxxxxxxxx_create_initial_tables.py&lt;/code&gt;). O nome do arquivo incluirá um identificador único e a mensagem que você forneceu. O conteúdo será similar a este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# versions/xxxxxxxxxxxx_create_initial_tables.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;alembic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;


&lt;span class="c1"&gt;# revision identifiers, used by Alembic.
&lt;/span&gt;&lt;span class="n"&gt;revision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;xxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;down_revision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;branch_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;depends_on&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# ### commands auto generated by Alembic - please adjust! ###
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="c1"&gt;# ### end Alembic commands ###
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;downgrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# ### commands auto generated by Alembic - please adjust! ###
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="c1"&gt;# ### end Alembic commands ###
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste ponto, você preencheria as funções &lt;code&gt;upgrade()&lt;/code&gt; e &lt;code&gt;downgrade()&lt;/code&gt; com as operações DDL necessárias, usando as construções do SQLAlchemy Core. Por exemplo, para criar uma tabela &lt;code&gt;users&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# versions/xxxxxxxxxxxx_create_initial_tables.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;alembic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;


&lt;span class="c1"&gt;# revision identifiers, used by Alembic.
&lt;/span&gt;&lt;span class="n"&gt;revision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;xxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;down_revision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;branch_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;depends_on&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;downgrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para aplicar esta migração ao seu banco de dados, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic upgrade &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando &lt;code&gt;head&lt;/code&gt; instrui o Alembic a aplicar todas as migrações pendentes até a mais recente. Se você precisar reverter a última migração, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alembic downgrade &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Próximos Passos: Migrações Automáticas e Bancos Existentes
&lt;/h2&gt;

&lt;p&gt;Na &lt;a href="https://dev.to/carineneris/alembic-versionamento-de-banco-de-dados-parte-2-ldn"&gt;Parte 2&lt;/a&gt; deste artigo, exploraremos como o Alembic pode gerar migrações automaticamente com base nas mudanças detectadas em seus modelos SQLAlchemy, um recurso que agiliza significativamente o processo de desenvolvimento. Também abordaremos o desafio de integrar o Alembic a um banco de dados que já possui tabelas existentes, um cenário comum em projetos legados ou em andamento.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;[1] Alembic Documentation: &lt;a href="https://alembic.sqlalchemy.org/en/latest/" rel="noopener noreferrer"&gt;https://alembic.sqlalchemy.org/en/latest/&lt;/a&gt;&lt;br&gt;
[2] SQLAlchemy Documentation: &lt;a href="https://www.sqlalchemy.org/" rel="noopener noreferrer"&gt;https://www.sqlalchemy.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>backend</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Como Baixar, Quantizar e Rodar um Modelo LLM Localmente com Ollama</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Tue, 11 Nov 2025 23:09:51 +0000</pubDate>
      <link>https://dev.to/carineneris/como-baixar-quantizar-e-rodar-um-modelo-llm-localmente-no-ollama-1kpi</link>
      <guid>https://dev.to/carineneris/como-baixar-quantizar-e-rodar-um-modelo-llm-localmente-no-ollama-1kpi</guid>
      <description>&lt;p&gt;Rodar um modelo de linguagem grande (LLM) no seu próprio computador pode parecer coisa de outro mundo — e, pra ser sincera, eu também achava isso 😅. Mas a curiosidade falou mais alto, e eu decidi tentar rodar o modelo Jurema-7B (baseado no LLaMA 3), só por estudo... e deu certo!&lt;br&gt;
Consegui fazer todo o processo e colocar o modelo pra conversar comigo localmente, direto do meu computador.&lt;/p&gt;

&lt;p&gt;Neste guia, eu vou te mostrar o passo a passo que segui pra fazer isso funcionar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Baixar um modelo no Hugging Face — no meu caso, usei o Jurema-7B.&lt;/li&gt;
&lt;li&gt;Converter o modelo para .gguf, o formato compatível com o Ollama.&lt;/li&gt;
&lt;li&gt;Compilar o llama.cpp para ter acesso à ferramenta de quantização.&lt;/li&gt;
&lt;li&gt;Quantizar o modelo pra economizar memória da GPU e CPU.&lt;/li&gt;
&lt;li&gt;Adicionar o modelo ao Ollama e começar a conversar com ele, tudo rodando localmente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Todo o processo foi feito no Windows, mas se você usa Linux ou macOS, a lógica é praticamente a mesma — muda só o jeito de instalar algumas dependências.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧰 Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de começar, tenha instalado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;&lt;strong&gt;Python 3.10+&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmake.org/download/" rel="noopener noreferrer"&gt;&lt;strong&gt;CMake&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://winlibs.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;MinGW-w64 (GCC)&lt;/strong&gt;&lt;/a&gt; ou via chocolatey:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  choco &lt;span class="nb"&gt;install &lt;/span&gt;mingw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Dica: depois de instalar o MinGW, adicione &lt;code&gt;C:\mingw64\bin&lt;/code&gt; ao seu &lt;strong&gt;PATH&lt;/strong&gt;.&lt;br&gt;
Se você instalou via Chocolatey, o caminho é adicionado automaticamente. 😉&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  📥 1️⃣ Baixando o modelo Jurema-7B
&lt;/h2&gt;

&lt;p&gt;Para este exemplo, usei o &lt;strong&gt;Jurema-7B&lt;/strong&gt;, o mesmo modelo que explorei durante meus estudos.&lt;br&gt;
Ele é um &lt;strong&gt;LLM especializado no domínio jurídico brasileiro&lt;/strong&gt;, criado a partir de um &lt;em&gt;fine-tuning&lt;/em&gt; do &lt;strong&gt;Qwen2.5-7B-Instruct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você pode baixá-lo diretamente do &lt;strong&gt;Hugging Face&lt;/strong&gt; com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://huggingface.co/Jurema-br/Jurema-7B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Se aparecer um erro de autenticação, basta usar o &lt;strong&gt;Access Token&lt;/strong&gt; do Hugging Face em vez da senha.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso vai criar uma pasta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jurema-7B/
 ├── config.json
 ├── model.safetensors
 ├── tokenizer.json
 └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 2️⃣ Baixando e compilando o llama.cpp
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt; é o projeto que permite rodar e quantizar modelos LLaMA em praticamente qualquer hardware.&lt;/p&gt;

&lt;p&gt;Clone o repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ggerganov/llama.cpp
&lt;span class="nb"&gt;cd &lt;/span&gt;llama.cpp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, compile o projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cmake &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="s2"&gt;"MinGW Makefiles"&lt;/span&gt;
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;--config&lt;/span&gt; Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso vai gerar vários binários dentro da pasta build/bin, incluindo o quantize.exe, que é o executável responsável por quantizar o modelo (ou seja, reduzir o tamanho e o consumo de memória sem perder muita qualidade).&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ 3️⃣ Convertendo e Quantizando o modelo
&lt;/h2&gt;

&lt;p&gt;Primeiro, converta o modelo para o formato .gguf, que é o formato usado pelo Ollama para rodar modelos localmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python convert_hf_to_gguf.py &lt;span class="s2"&gt;"path_para_llm&lt;/span&gt;&lt;span class="se"&gt;\J&lt;/span&gt;&lt;span class="s2"&gt;urema-7B"&lt;/span&gt; &lt;span class="nt"&gt;--outfile&lt;/span&gt; &lt;span class="s2"&gt;"jurema-7b-fp16.gguf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos &lt;strong&gt;quantizar&lt;/strong&gt; o modelo para reduzir tamanho e uso de memória.&lt;/p&gt;

&lt;p&gt;Exemplo: Q4_K_M (boa precisão com economia de RAM).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;llama.cpp&lt;span class="se"&gt;\b&lt;/span&gt;uild&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\q&lt;/span&gt;uantize.exe jurema-7b-fp16.gguf jurema-7b-q4.gguf Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔹 O arquivo &lt;code&gt;jurema-7b-q4.gguf&lt;/code&gt; é o modelo quantizado final que usaremos no Ollama.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💬 4️⃣ Adicionando ao Ollama
&lt;/h2&gt;

&lt;p&gt;Crie um arquivo chamado &lt;code&gt;Modelfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM path_para_llm\Jurema-7B\jurema-7b-q4.gguf

TEMPLATE """### Instrução: {{ .Prompt }} ### Resposta: """
PARAMETER temperature 0.3
PARAMETER top_p 0.8
PARAMETER num_predict 512
PARAMETER stop ["&amp;lt;|im_end|&amp;gt;", "&amp;lt;/s&amp;gt;", "User:", "Human:", "###"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, crie o modelo no Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama create jurema &lt;span class="nt"&gt;-f&lt;/span&gt; Modelfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E rode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run jurema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto 🎉&lt;br&gt;
Você agora tem o &lt;strong&gt;Jurema-7B rodando localmente no Ollama&lt;/strong&gt;!&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 5️⃣ Evitando loops infinitos nas respostas
&lt;/h2&gt;

&lt;p&gt;Alguns modelos podem acabar “entrando em loop”, ou seja, continuar gerando texto indefinidamente sem concluir a resposta.&lt;br&gt;
Aconteceu isso comigo ao testar o Jurema-7B, mas pesquisando um pouco encontrei a solução no próprio repositório do modelo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicione &lt;code&gt;stop&lt;/code&gt; tokens no &lt;code&gt;Modelfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;num_predict&lt;/code&gt; para limitar o número de tokens.&lt;/li&gt;
&lt;li&gt;Mantenha &lt;code&gt;temperature&lt;/code&gt; baixa (&lt;code&gt;0.3~0.5&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de chamada via CLI com limite de tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run jurema &lt;span class="nt"&gt;--num-predict&lt;/span&gt; 300
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ 6️⃣ Dicas extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Q4_K_M&lt;/strong&gt; ou &lt;strong&gt;Q5_K_S&lt;/strong&gt; para bom equilíbrio entre desempenho e precisão.&lt;/li&gt;
&lt;li&gt;Se sua GPU for poderosa (ex: RTX 4070+) e você tiver boa quantidade de RAM, teste Q6 ou até Q8.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Esse processo não serve apenas para o Jurema-7B — você pode usar o mesmo passo a passo para qualquer modelo disponível no Hugging Face que precise ser convertido para rodar no Ollama ou quantizado para otimizar desempenho e consumo de memória&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ollama/ollama" rel="noopener noreferrer"&gt;Ollama Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/Jurema-br/Jurema-7B" rel="noopener noreferrer"&gt;Jurema no Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>llm</category>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Precisamos falar sobre o Hugging Face: o GitHub da Inteligência Artificial</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Tue, 11 Nov 2025 01:27:12 +0000</pubDate>
      <link>https://dev.to/carineneris/precisamos-falar-sobre-o-hugging-face-o-github-da-inteligencia-artificial-7cn</link>
      <guid>https://dev.to/carineneris/precisamos-falar-sobre-o-hugging-face-o-github-da-inteligencia-artificial-7cn</guid>
      <description>&lt;p&gt;Nos últimos anos, o termo &lt;strong&gt;Hugging Face&lt;/strong&gt; começou a aparecer em quase todas as conversas sobre &lt;strong&gt;inteligência artificial&lt;/strong&gt;.&lt;br&gt;
Ele está por trás de muitos dos modelos que usamos — desde análise de sentimentos até geração de imagens com IA.&lt;/p&gt;

&lt;p&gt;Mas afinal, o que é o Hugging Face?&lt;br&gt;
E por que ele é considerado o &lt;strong&gt;GitHub da IA&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Neste artigo, você vai entender de forma simples o que é o Hugging Face, como ele funciona e por que ele se tornou essencial para quem desenvolve com machine learning e IA generativa. 🚀&lt;/p&gt;


&lt;h2&gt;
  
  
  🤔 O que é o Hugging Face?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Hugging Face&lt;/strong&gt; é uma &lt;strong&gt;plataforma open source&lt;/strong&gt; que reúne &lt;strong&gt;modelos, datasets e ferramentas&lt;/strong&gt; para desenvolvimento de &lt;strong&gt;inteligência artificial&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se o &lt;strong&gt;GitHub&lt;/strong&gt; é onde os desenvolvedores compartilham código, o &lt;strong&gt;Hugging Face&lt;/strong&gt; é onde eles compartilham &lt;strong&gt;modelos de IA prontos para uso&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ele começou em 2016 como um simples chatbot, mas rapidamente se transformou em um &lt;strong&gt;ecossistema completo de machine learning&lt;/strong&gt;, apoiado por empresas como Google, Meta e Microsoft.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 O coração do Hugging Face: o Model Hub
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Model Hub&lt;/strong&gt; é o repositório principal da plataforma, onde você encontra &lt;strong&gt;milhares de modelos treinados&lt;/strong&gt; em diferentes tarefas de IA.&lt;/p&gt;

&lt;p&gt;Alguns exemplos populares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🗣️ &lt;code&gt;bert-base-uncased&lt;/code&gt; — modelo BERT da Google para NLP&lt;/li&gt;
&lt;li&gt;💬 &lt;code&gt;gpt2&lt;/code&gt; — modelo de linguagem da OpenAI&lt;/li&gt;
&lt;li&gt;🖼️ &lt;code&gt;stable-diffusion&lt;/code&gt; — geração de imagens&lt;/li&gt;
&lt;li&gt;🎧 &lt;code&gt;whisper&lt;/code&gt; — transcrição de áudio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode testar qualquer um desses modelos com apenas &lt;strong&gt;duas linhas de código&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;

&lt;span class="c1"&gt;# Exemplo: análise de sentimentos
&lt;/span&gt;&lt;span class="n"&gt;analisador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;analisador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eu adoro programar com Python!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;'label'&lt;/span&gt;: &lt;span class="s1"&gt;'POSITIVE'&lt;/span&gt;, &lt;span class="s1"&gt;'score'&lt;/span&gt;: 0.9995&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simples, direto e sem precisar treinar nada! 💡&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Principais bibliotecas do ecossistema Hugging Face
&lt;/h2&gt;

&lt;p&gt;A força do Hugging Face está nas suas bibliotecas open source, que cobrem desde processamento de texto até geração de imagens:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;code&gt;transformers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Permite acessar e usar milhares de modelos pré-treinados para &lt;strong&gt;texto, visão e áudio&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;code&gt;datasets&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Facilita o download e a manipulação de &lt;strong&gt;datasets prontos para IA&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;code&gt;tokenizers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Responsável por converter texto em números — um passo essencial para qualquer modelo de linguagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;code&gt;diffusers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Biblioteca usada em &lt;strong&gt;geração de imagens&lt;/strong&gt;, como o Stable Diffusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;code&gt;accelerate&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ajuda a treinar modelos em múltiplas GPUs, TPUs ou até em nuvem com pouquíssimas alterações no código.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ Hugging Face Hub e APIs
&lt;/h2&gt;

&lt;p&gt;Além das bibliotecas open source, o Hugging Face também oferece uma &lt;strong&gt;plataforma em nuvem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com ela, você pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hospedar seus próprios modelos&lt;/li&gt;
&lt;li&gt;Criar &lt;strong&gt;APIs de inferência&lt;/strong&gt; com um clique&lt;/li&gt;
&lt;li&gt;Integrar modelos de IA em sistemas web, mobile ou backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso sem precisar configurar servidores ou infraestrutura complexa.&lt;/p&gt;




&lt;p&gt;O &lt;strong&gt;Hugging Face&lt;/strong&gt; é muito mais do que uma biblioteca — é uma &lt;strong&gt;comunidade global&lt;/strong&gt; que está democratizando o acesso à Inteligência Artificial.&lt;br&gt;
Se você quer aprender NLP, treinar modelos ou criar aplicações com IA generativa, &lt;strong&gt;o Hugging Face é um bom ponto de partida&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Recursos úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://huggingface.co" rel="noopener noreferrer"&gt;Site oficial do Hugging Face&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://huggingface.co/docs" rel="noopener noreferrer"&gt;Documentação oficial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://huggingface.co/join/discord" rel="noopener noreferrer"&gt;Comunidade no Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧑‍💻 &lt;a href="https://github.com/huggingface/transformers" rel="noopener noreferrer"&gt;Repositório no GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>machinelearning</category>
      <category>nlp</category>
      <category>ai</category>
      <category>huggingface</category>
    </item>
    <item>
      <title>Manus AI: Transform Ideas into Action with Your New Autonomous Workmate (Invite Code)</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Tue, 05 Aug 2025 12:39:53 +0000</pubDate>
      <link>https://dev.to/carineneris/manus-ai-transform-ideas-into-action-with-your-new-autonomous-workmate-invite-code-58kc</link>
      <guid>https://dev.to/carineneris/manus-ai-transform-ideas-into-action-with-your-new-autonomous-workmate-invite-code-58kc</guid>
      <description>&lt;p&gt;Imagine having an assistant that not only understands your needs but also executes complex tasks completely autonomously. We're not talking about another chatbot or text generation tool – we're talking about &lt;strong&gt;Manus AI&lt;/strong&gt;, the world's first general artificial intelligence agent that truly connects thought and action.&lt;/p&gt;

&lt;p&gt;Whether you're a developer, analyst, content creator, or simply someone looking to optimize your workflow, this article will show you how Manus AI can revolutionize the way you work and live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Manus AI?
&lt;/h2&gt;

&lt;p&gt;Manus AI is an autonomous artificial intelligence agent developed by the Chinese startup Monica, based in Singapore [1]. The name "Manus" comes from Latin and means "hands," perfectly symbolizing its purpose: to be the hands that execute what your mind conceives.&lt;/p&gt;

&lt;p&gt;Unlike other AI tools that are limited to generating text or answering questions, Manus AI is capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planning and executing complex tasks&lt;/strong&gt; completely autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interacting with multiple tools&lt;/strong&gt; and platforms simultaneously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making decisions&lt;/strong&gt; based on defined context and objectives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Producing tangible results&lt;/strong&gt; such as websites, reports, analyses, and much more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes Manus AI truly special is its ability to function as a general agent – this means it's not specialized in a single task but can adapt and learn to perform practically any activity you need to carry out on a computer connected to the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can Manus AI Do for You?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Development and Programming
&lt;/h3&gt;

&lt;p&gt;For developers, Manus AI is like having a senior colleague available 24/7. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create complete applications&lt;/strong&gt; from planning to deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug code&lt;/strong&gt; and identify complex problems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate detailed and updated technical documentation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement APIs&lt;/strong&gt; and integrations between systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize performance&lt;/strong&gt; of existing applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Research and Data Analysis
&lt;/h3&gt;

&lt;p&gt;Manus AI excels at tasks requiring deep research and critical analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conduct comprehensive research&lt;/strong&gt; across multiple sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze large volumes of data&lt;/strong&gt; and extract insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create executive reports&lt;/strong&gt; with visualizations and recommendations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor market and technology trends&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate information&lt;/strong&gt; through automated fact-checking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Content Creation and Design
&lt;/h3&gt;

&lt;p&gt;Whether for marketing, education, or entertainment, Manus AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Produce long and well-structured technical articles&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create professional presentations&lt;/strong&gt; with attractive designs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Develop responsive and functional websites&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate personalized images and videos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write clear and accessible documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Process Automation
&lt;/h3&gt;

&lt;p&gt;One of Manus AI's greatest strengths is its ability to automate complex workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schedule and execute tasks&lt;/strong&gt; at specific times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate different tools&lt;/strong&gt; and platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor systems&lt;/strong&gt; and alert about problems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process forms&lt;/strong&gt; and input data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage communications&lt;/strong&gt; and follow-ups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Use Manus AI?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. True Autonomy
&lt;/h3&gt;

&lt;p&gt;While other AI tools require constant supervision and detailed prompts, Manus AI works genuinely autonomously. You define the objective, and it plans and executes all necessary steps to achieve it [2].&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unprecedented Versatility
&lt;/h3&gt;

&lt;p&gt;As a general agent, Manus AI is not limited to specific domains. It can switch between programming, design, research, data analysis, and content creation as needed to complete its tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Exponential Efficiency
&lt;/h3&gt;

&lt;p&gt;Manus AI can work 24 hours a day, 7 days a week, without breaks or fatigue. This means you can literally wake up to completed projects that were developed while you slept [3].&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Professional Quality
&lt;/h3&gt;

&lt;p&gt;The results produced by Manus AI meet high professional standards, with attention to detail, logical structure, and polished presentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Continuous Learning
&lt;/h3&gt;

&lt;p&gt;The system learns from each interaction, becoming more efficient and aligned with your preferences and specific needs over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use Manus AI: A Practical Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Access the platform&lt;/strong&gt; via the official website (manus.im) or mobile app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define your objective&lt;/strong&gt; clearly and specifically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide relevant context&lt;/strong&gt; about your preferences and requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let Manus AI work&lt;/strong&gt; while you focus on other activities&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tips for Maximizing Results
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Be Specific, But Don't Micromanage&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ "Create a website"
✅ "Create a portfolio website for a frontend developer, with sections on projects, skills, and contact, using a modern and responsive design"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Provide Relevant Context&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mention your target audience&lt;/li&gt;
&lt;li&gt;Specify style or technology preferences&lt;/li&gt;
&lt;li&gt;Include examples or references when possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Leverage Planning Capability&lt;/strong&gt;&lt;br&gt;
Manus AI excels at multi-step projects. Don't hesitate to request complex tasks that would normally take days or weeks to complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Use Cases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For Startups:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete MVP development&lt;/li&gt;
&lt;li&gt;Market research and competitive analysis&lt;/li&gt;
&lt;li&gt;Creation of pitch decks and marketing materials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Businesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automation of periodic reports&lt;/li&gt;
&lt;li&gt;Sales and performance data analysis&lt;/li&gt;
&lt;li&gt;Development of internal tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Freelancers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Management of multiple projects simultaneously&lt;/li&gt;
&lt;li&gt;Creation of proposals and quotes&lt;/li&gt;
&lt;li&gt;Development of customized solutions for clients&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of Work with AI
&lt;/h2&gt;

&lt;p&gt;Manus AI represents a milestone in the evolution of artificial intelligence applied to work. We are witnessing the transition from tools that help us work to agents that work with us – and sometimes for us.&lt;/p&gt;

&lt;p&gt;This change does not mean human replacement but rather an amplification of our capabilities. With Manus AI handling operational and repetitive tasks, we can focus on what truly matters: strategy, creativity, relationships, and innovation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impact on Productivity
&lt;/h3&gt;

&lt;p&gt;Users report productivity increases of 300% to 500% in tasks that Manus AI can execute autonomously [4]. This is not just about doing things faster – it's about doing more things, better things, and having time to think strategically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Democratization of Skills
&lt;/h3&gt;

&lt;p&gt;Manus AI democratizes advanced technical skills. You don't need to be an experienced developer to create a functional web application, nor a designer to produce professional visual materials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Your Journey with Manus AI Starts Now
&lt;/h2&gt;

&lt;p&gt;Manus AI is not just another tool – it's a new work paradigm. It represents the fulfillment of the promise that technology should free us to focus on what we do best: thinking, creating, and innovating.&lt;/p&gt;

&lt;p&gt;If you're ready to experience the future of work today, Manus AI is waiting to become your most productive new team member. The only question left is: what will you create first?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want to try Manus AI?&lt;/strong&gt; Start your journey today and see how AI can transform the way you work.&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://manus.im/invitation/QWCF4WMMRXRGR" rel="noopener noreferrer"&gt;Create your account using this link to get extra credits&lt;/a&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Manus AI: O que é? + Invitation Code</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Tue, 05 Aug 2025 02:14:49 +0000</pubDate>
      <link>https://dev.to/carineneris/manus-ai-o-que-e-invitation-code-1fpp</link>
      <guid>https://dev.to/carineneris/manus-ai-o-que-e-invitation-code-1fpp</guid>
      <description>&lt;p&gt;Imagine ter um assistente que não apenas entende suas necessidades, mas também executa tarefas complexas de forma completamente autônoma. Não estamos falando de mais um chatbot ou ferramenta de geração de texto — estamos falando do &lt;strong&gt;Manus AI&lt;/strong&gt;, o primeiro agente de inteligência artificial geral do mundo que verdadeiramente conecta pensamento e ação. &lt;em&gt;(Se quiser experimentar, você pode se cadastrar &lt;a href="https://manus.im/invitation/QWCF4WMMRXRGR" rel="noopener noreferrer"&gt;neste link e ganhar créditos extras&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se você é desenvolvedor, analista, criador de conteúdo ou simplesmente alguém que busca otimizar seu fluxo de trabalho, este artigo vai mostrar como o Manus AI pode revolucionar a forma como você trabalha e vive.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que É o Manus AI?
&lt;/h2&gt;

&lt;p&gt;O Manus AI é um agente de inteligência artificial autônomo desenvolvido pela startup chinesa Monica, sediada em Singapura [1]. O nome "Manus" vem do latim e significa "mãos", simbolizando perfeitamente sua proposta: ser as mãos que executam aquilo que sua mente concebe.&lt;/p&gt;

&lt;p&gt;Diferentemente de outras ferramentas de IA que se limitam a gerar texto ou responder perguntas, o Manus AI é capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planejar e executar tarefas complexas&lt;/strong&gt; de forma completamente autônoma&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interagir com múltiplas ferramentas&lt;/strong&gt; e plataformas simultaneamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tomar decisões&lt;/strong&gt; baseadas em contexto e objetivos definidos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Produzir resultados tangíveis&lt;/strong&gt; como websites, relatórios, análises e muito mais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O que torna o Manus AI verdadeiramente especial é sua capacidade de funcionar como um agente geral - isso significa que ele não é especializado em uma única tarefa, mas pode adaptar-se e aprender a executar praticamente qualquer atividade que você precise realizar em um computador conectado à internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que o Manus AI Pode Fazer Por Você?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Desenvolvimento e Programação
&lt;/h3&gt;

&lt;p&gt;Para desenvolvedores, o Manus AI é como ter um colega sênior disponível 24/7. Ele pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Criar aplicações completas&lt;/strong&gt; desde o planejamento até o deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debuggar código&lt;/strong&gt; e identificar problemas complexos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gerar documentação técnica&lt;/strong&gt; detalhada e atualizada&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementar APIs&lt;/strong&gt; e integrações entre sistemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Otimizar performance&lt;/strong&gt; de aplicações existentes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pesquisa e Análise de Dados
&lt;/h3&gt;

&lt;p&gt;O Manus AI excele em tarefas que exigem pesquisa profunda e análise crítica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conduzir pesquisas abrangentes&lt;/strong&gt; em múltiplas fontes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analisar grandes volumes de dados&lt;/strong&gt; e extrair insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Criar relatórios executivos&lt;/strong&gt; com visualizações e recomendações&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitorar tendências&lt;/strong&gt; de mercado e tecnologia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validar informações&lt;/strong&gt; através de fact-checking automatizado&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criação de Conteúdo e Design
&lt;/h3&gt;

&lt;p&gt;Seja para marketing, educação ou entretenimento, o Manus AI pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Produzir artigos técnicos&lt;/strong&gt; longos e bem estruturados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Criar apresentações&lt;/strong&gt; profissionais com design atrativo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desenvolver websites&lt;/strong&gt; responsivos e funcionais&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gerar imagens e vídeos&lt;/strong&gt; personalizados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escrever documentação&lt;/strong&gt; clara e acessível&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automação de Processos
&lt;/h3&gt;

&lt;p&gt;Uma das maiores forças do Manus AI é sua capacidade de automatizar fluxos de trabalho complexos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agendar e executar tarefas&lt;/strong&gt; em horários específicos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrar diferentes ferramentas&lt;/strong&gt; e plataformas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitorar sistemas&lt;/strong&gt; e alertar sobre problemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processar formulários&lt;/strong&gt; e dados de entrada&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gerenciar comunicações&lt;/strong&gt; e follow-ups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por Que Usar o Manus AI?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Autonomia Verdadeira
&lt;/h3&gt;

&lt;p&gt;Enquanto outras ferramentas de IA requerem supervisão constante e prompts detalhados, o Manus AI trabalha de forma genuinamente autônoma. Você define o objetivo, e ele planeja e executa todas as etapas necessárias para alcançá-lo [2].&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Versatilidade Sem Precedentes
&lt;/h3&gt;

&lt;p&gt;Como um agente geral, o Manus AI não está limitado a domínios específicos. Ele pode alternar entre programação, design, pesquisa, análise de dados e criação de conteúdo conforme necessário para completar suas tarefas.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Eficiência Exponencial
&lt;/h3&gt;

&lt;p&gt;O Manus AI pode trabalhar 24 horas por dia, 7 dias por semana, sem pausas ou fadiga. Isso significa que você pode literalmente acordar com projetos completos que foram desenvolvidos enquanto você dormia [3].&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Qualidade Profissional
&lt;/h3&gt;

&lt;p&gt;Os resultados produzidos pelo Manus AI atendem a padrões profissionais elevados, com atenção a detalhes, estrutura lógica e apresentação polida.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Aprendizado Contínuo
&lt;/h3&gt;

&lt;p&gt;O sistema aprende com cada interação, tornando-se mais eficiente e alinhado com suas preferências e necessidades específicas ao longo do tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Usar o Manus AI: Guia Prático
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Primeiros Passos
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Acesse a plataforma&lt;/strong&gt; através do site oficial (manus.im) ou aplicativo móvel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defina seu objetivo&lt;/strong&gt; de forma clara e específica&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forneça contexto&lt;/strong&gt; relevante sobre suas preferências e requisitos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deixe o Manus AI trabalhar&lt;/strong&gt; enquanto você foca em outras atividades&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dicas Para Maximizar Resultados
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Seja Específico, Mas Não Microgerencie&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ "Crie um site"
✅ "Crie um site de portfólio para um desenvolvedor frontend, com seções sobre projetos, habilidades e contato, usando design moderno e responsivo"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Forneça Contexto Relevante&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mencione seu público-alvo&lt;/li&gt;
&lt;li&gt;Especifique preferências de estilo ou tecnologia&lt;/li&gt;
&lt;li&gt;Inclua exemplos ou referências quando possível&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aproveite a Capacidade de Planejamento&lt;/strong&gt;&lt;br&gt;
O Manus AI excele em projetos de múltiplas etapas. Não hesite em solicitar tarefas complexas que normalmente levariam dias ou semanas para completar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Casos de Uso Avançados
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Para Startups:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento de MVP completo&lt;/li&gt;
&lt;li&gt;Pesquisa de mercado e análise competitiva&lt;/li&gt;
&lt;li&gt;Criação de pitch decks e materiais de marketing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Para Empresas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automação de relatórios periódicos&lt;/li&gt;
&lt;li&gt;Análise de dados de vendas e performance&lt;/li&gt;
&lt;li&gt;Desenvolvimento de ferramentas internas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Para Freelancers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gestão de múltiplos projetos simultaneamente&lt;/li&gt;
&lt;li&gt;Criação de propostas e orçamentos&lt;/li&gt;
&lt;li&gt;Desenvolvimento de soluções personalizadas para clientes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O Futuro do Trabalho com IA
&lt;/h2&gt;

&lt;p&gt;O Manus AI representa um marco na evolução da inteligência artificial aplicada ao trabalho. Estamos testemunhando a transição de ferramentas que nos ajudam a trabalhar para agentes que trabalham conosco - e às vezes por nós.&lt;/p&gt;

&lt;p&gt;Esta mudança não significa substituição humana, mas sim amplificação das nossas capacidades. Com o Manus AI cuidando das tarefas operacionais e repetitivas, podemos focar no que realmente importa: estratégia, criatividade, relacionamentos e inovação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impacto na Produtividade
&lt;/h3&gt;

&lt;p&gt;Usuários relatam aumentos de produtividade de 300% a 500% em tarefas que o Manus AI pode executar autonomamente [4]. Isso não é apenas sobre fazer as coisas mais rápido - é sobre fazer mais coisas, melhores coisas, e ter tempo para pensar estrategicamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Democratização de Habilidades
&lt;/h3&gt;

&lt;p&gt;O Manus AI democratiza habilidades técnicas avançadas. Você não precisa ser um desenvolvedor experiente para criar uma aplicação web funcional, nem um designer para produzir materiais visuais profissionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Sua Jornada com o Manus AI Começa Agora
&lt;/h2&gt;

&lt;p&gt;O Manus AI não é apenas mais uma ferramenta - é um novo paradigma de trabalho. Ele representa a realização da promessa de que a tecnologia deveria nos libertar para focar no que fazemos de melhor: pensar, criar e inovar.&lt;/p&gt;

&lt;p&gt;Se você está pronto para experimentar o futuro do trabalho hoje, o Manus AI está esperando para se tornar seu novo colega de equipe mais produtivo. A única pergunta que resta é: o que você vai criar primeiro?&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Quer experimentar o Manus AI?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Comece sua jornada hoje mesmo clicando no link abaixo para se cadastrar e ganhar créditos extras para utilizar a IA:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://manus.im/invitation/QWCF4WMMRXRGR" rel="noopener noreferrer"&gt;Acesse o Manus AI e ganhe créditos extras&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;[1] Wikipedia - Manus (AI agent): &lt;a href="https://en.wikipedia.org/wiki/Manus_(AI_agent)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Manus_(AI_agent)&lt;/a&gt;&lt;br&gt;
[2] Manus Official Website: &lt;a href="https://manus.im/" rel="noopener noreferrer"&gt;https://manus.im/&lt;/a&gt;&lt;br&gt;
[3] Veja - O que é Manus, a nova inteligência artificial que promete fazer tudo: &lt;a href="https://veja.abril.com.br/tecnologia/o-que-e-manus-a-nova-inteligencia-artificial-que-promete-fazer-tudo/" rel="noopener noreferrer"&gt;https://veja.abril.com.br/tecnologia/o-que-e-manus-a-nova-inteligencia-artificial-que-promete-fazer-tudo/&lt;/a&gt;&lt;br&gt;
[4] Canaltech - O que é Manus AI? Agente de IA chinês funciona de forma autônoma: &lt;a href="https://canaltech.com.br/inteligencia-artificial/o-que-e-manus-ai-agente-de-ia-chines-funciona-de-forma-autonoma/" rel="noopener noreferrer"&gt;https://canaltech.com.br/inteligencia-artificial/o-que-e-manus-ai-agente-de-ia-chines-funciona-de-forma-autonoma/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🐍 Gerenciando Múltiplas Versões do Python com Pyenv e Virtualenv</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Tue, 05 Aug 2025 01:49:07 +0000</pubDate>
      <link>https://dev.to/carineneris/gerenciando-multiplas-versoes-do-python-com-pyenv-e-ambientes-virtuais-1o51</link>
      <guid>https://dev.to/carineneris/gerenciando-multiplas-versoes-do-python-com-pyenv-e-ambientes-virtuais-1o51</guid>
      <description>&lt;p&gt;Você já se deparou com a mensagem &lt;code&gt;Python 3.11 required, but you are using 3.12&lt;/code&gt; ao tentar rodar um projeto? Ou teve dores de cabeça com conflitos de pacotes entre diferentes projetos Python?&lt;/p&gt;

&lt;p&gt;Se a resposta for sim, você precisa conhecer o &lt;strong&gt;pyenv&lt;/strong&gt; e entender como ele, em conjunto com ambientes virtuais, pode revolucionar seu fluxo de trabalho de desenvolvimento Python.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 O que é o &lt;code&gt;pyenv&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;pyenv&lt;/code&gt; é uma ferramenta de linha de comando que permite &lt;strong&gt;instalar e gerenciar múltiplas versões do Python&lt;/strong&gt; no mesmo sistema, sem precisar mexer na instalação padrão do Python do seu sistema operacional. Ele funciona criando um ambiente isolado onde cada versão do Python é instalada em seu próprio diretório. Isso significa que você pode ter Python 3.8, 3.9, 3.10 e 3.11 instalados simultaneamente e alternar entre eles com facilidade. [1]&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Por que usar o &lt;code&gt;pyenv&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Gerenciar múltiplas versões do Python pode ser um desafio, mas o &lt;code&gt;pyenv&lt;/code&gt; simplifica esse processo, oferecendo vantagens significativas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;📦 Isolamento&lt;/strong&gt;: Permite que você use versões diferentes do Python para projetos diferentes, sem que uma interfira na outra. Isso é crucial quando projetos legados dependem de versões mais antigas, enquanto novos projetos exigem as mais recentes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🔄 Facilidade de troca&lt;/strong&gt;: Alterne rapidamente entre as versões do Python usando comandos simples como &lt;code&gt;pyenv global&lt;/code&gt; (para definir a versão padrão do sistema) ou &lt;code&gt;pyenv local&lt;/code&gt; (para definir a versão específica de um projeto).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🧪 Testes em versões diferentes&lt;/strong&gt;: É uma ferramenta excelente para testar a compatibilidade do seu código em diversas versões do Python, garantindo que sua aplicação funcione como esperado em diferentes ambientes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🚫 Evita conflitos com o Python do sistema&lt;/strong&gt;: Em muitos sistemas operacionais, o Python é usado por ferramentas internas. O &lt;code&gt;pyenv&lt;/code&gt; instala versões do Python em um ambiente de usuário, evitando que você acidentalmente quebre o sistema ao instalar pacotes ou alterar a versão padrão.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Instalando o Pyenv
&lt;/h2&gt;

&lt;p&gt;A instalação do &lt;code&gt;pyenv&lt;/code&gt; geralmente envolve alguns passos, que podem variar ligeiramente dependendo do seu sistema operacional, mas a lógica é a mesma:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Dependências
&lt;/h3&gt;

&lt;p&gt;Antes de instalar o &lt;code&gt;pyenv&lt;/code&gt;, é importante ter as dependências de compilação necessárias para que ele possa instalar diferentes versões do Python a partir do código-fonte. Embora os nomes dos pacotes variem entre distribuições Linux (e não sejam aplicáveis a Windows/macOS da mesma forma), geralmente você precisará de ferramentas como &lt;code&gt;make&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;zlib-devel&lt;/code&gt;, &lt;code&gt;openssl-devel&lt;/code&gt;, entre outras. Consulte a documentação oficial do &lt;code&gt;pyenv&lt;/code&gt; para a lista exata de dependências para o seu sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Instale o &lt;code&gt;pyenv&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A forma mais comum de instalar o &lt;code&gt;pyenv&lt;/code&gt; é clonando seu repositório Git para um diretório específico (geralmente &lt;code&gt;~/.pyenv&lt;/code&gt;). Uma alternativa popular é usar o script &lt;code&gt;pyenv-installer&lt;/code&gt; para uma instalação mais automatizada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://pyenv.run | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Configure seu Shell
&lt;/h3&gt;

&lt;p&gt;Para que o &lt;code&gt;pyenv&lt;/code&gt; funcione corretamente, você precisa adicionar algumas linhas ao seu arquivo de configuração de shell (como &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt; ou &lt;code&gt;.profile&lt;/code&gt;). Essas linhas configuram as variáveis de ambiente necessárias e inicializam o &lt;code&gt;pyenv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de configuração (adicione ao final do seu arquivo de configuração de shell):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PYENV_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pyenv"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PYENV_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pyenv init &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pyenv init -&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; A linha &lt;code&gt;eval "$(pyenv init -)"&lt;/code&gt; é importante para a integração com o shell. Se você planeja usar o &lt;code&gt;pyenv-virtualenv&lt;/code&gt;, também precisará adicionar &lt;code&gt;eval "$(pyenv virtualenv-init -)"&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Recarregue o Terminal
&lt;/h3&gt;

&lt;p&gt;Após adicionar as linhas de configuração, salve o arquivo e recarregue seu terminal para que as alterações entrem em vigor. Você pode fazer isso fechando e reabrindo o terminal, ou executando &lt;code&gt;source ~/.bashrc&lt;/code&gt; (ou o arquivo de configuração do seu shell).&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Como usar o Pyenv
&lt;/h2&gt;

&lt;p&gt;Com o &lt;code&gt;pyenv&lt;/code&gt; instalado e configurado, gerenciar suas versões do Python se torna muito simples:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔽 Instalar uma nova versão do Python:
&lt;/h3&gt;

&lt;p&gt;Para instalar uma versão específica do Python, use o comando &lt;code&gt;install&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv &lt;span class="nb"&gt;install &lt;/span&gt;3.11.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode listar todas as versões disponíveis para instalação com &lt;code&gt;pyenv install --list&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Definir a versão global (para todo o sistema do usuário):
&lt;/h3&gt;

&lt;p&gt;Esta versão será a padrão para todos os seus projetos, a menos que uma versão local seja definida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv global 3.11.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📁 Definir versão local (por projeto):
&lt;/h3&gt;

&lt;p&gt;Navegue até o diretório raiz do seu projeto e defina a versão específica para ele. Isso criará um arquivo &lt;code&gt;.python-version&lt;/code&gt; no diretório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;meu_projeto
pyenv &lt;span class="nb"&gt;local &lt;/span&gt;3.9.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sempre que você estiver neste diretório, o &lt;code&gt;pyenv&lt;/code&gt; usará automaticamente a versão 3.9.7.&lt;/p&gt;

&lt;h3&gt;
  
  
  🐚 Definir versão de shell (temporária):
&lt;/h3&gt;

&lt;p&gt;Para usar uma versão específica do Python apenas na sessão atual do seu terminal, sem afetar as configurações globais ou locais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv shell 3.8.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📋 Listar versões instaladas:
&lt;/h3&gt;

&lt;p&gt;Para ver todas as versões do Python que você tem instaladas e qual está ativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv versions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧹 Como remover uma versão:
&lt;/h3&gt;

&lt;p&gt;Se você não precisa mais de uma versão específica do Python, pode desinstalá-la para liberar espaço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv uninstall 3.9.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Isolamento de Dependências com Ambientes Virtuais (&lt;code&gt;virtualenv&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Enquanto o &lt;code&gt;pyenv&lt;/code&gt; gerencia as versões do interpretador Python, os &lt;strong&gt;ambientes virtuais&lt;/strong&gt; (criados com ferramentas como &lt;code&gt;virtualenv&lt;/code&gt; ou o módulo &lt;code&gt;venv&lt;/code&gt; do Python) são essenciais para isolar as dependências de cada projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um Ambiente Virtual?
&lt;/h3&gt;

&lt;p&gt;Um ambiente virtual é um diretório que contém uma instalação isolada do Python e suas próprias cópias de &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;setuptools&lt;/code&gt; e &lt;code&gt;wheel&lt;/code&gt;. Isso significa que as bibliotecas instaladas em um ambiente virtual não afetam o ambiente global do Python ou outros ambientes virtuais. [2]&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que usar Ambientes Virtuais?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Evitar Conflitos&lt;/strong&gt;: Diferentes projetos podem usar diferentes versões da mesma biblioteca sem interferir uns nos outros.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ambiente Limpo&lt;/strong&gt;: As dependências de um projeto ficam contidas em seu próprio ambiente, evitando a poluição do ambiente global.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reprodução Fácil&lt;/strong&gt;: Facilita a recriação do ambiente de um projeto em outra máquina, garantindo que todos os desenvolvedores (e servidores de produção) usem as mesmas dependências.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pyenv-virtualenv: A Combinação Perfeita
&lt;/h3&gt;

&lt;p&gt;Para quem usa &lt;code&gt;pyenv&lt;/code&gt;, o plugin &lt;code&gt;pyenv-virtualenv&lt;/code&gt; é a solução ideal. Ele integra a funcionalidade de criação e gerenciamento de ambientes virtuais diretamente nos comandos do &lt;code&gt;pyenv&lt;/code&gt;, tornando o fluxo de trabalho ainda mais suave e intuitivo. Com ele, você pode criar ambientes virtuais vinculados a versões específicas do Python gerenciadas pelo &lt;code&gt;pyenv&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comandos Essenciais do &lt;code&gt;pyenv-virtualenv&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Criar um ambiente virtual&lt;/strong&gt;: Para criar um ambiente virtual para uma versão específica do Python (que já deve estar instalada via &lt;code&gt;pyenv&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv virtualenv 3.10.9 meu-projeto-env
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Isso criará um ambiente virtual chamado &lt;code&gt;meu-projeto-env&lt;/code&gt; baseado no Python 3.10.9.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ativar um ambiente virtual&lt;/strong&gt;: Você pode ativar um ambiente virtual manualmente:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv activate meu-projeto-env
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;O nome do ambiente virtual aparecerá no seu prompt de comando, indicando que ele está ativo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Desativar um ambiente virtual&lt;/strong&gt;: Para sair do ambiente virtual e retornar ao ambiente Python anterior:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remover um ambiente virtual&lt;/strong&gt;: Se não precisar mais de um ambiente virtual:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyenv uninstall meu-projeto-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Vantagens e Desvantagens do &lt;code&gt;pyenv&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vantagem&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔄 &lt;strong&gt;Versões múltiplas&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Gerencie facilmente várias versões do Python em um único sistema.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧼 &lt;strong&gt;Sem &lt;code&gt;sudo&lt;/code&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Evita a necessidade de usar &lt;code&gt;sudo pip&lt;/code&gt;, o que pode quebrar o Python do sistema.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 &lt;strong&gt;Integração com &lt;code&gt;virtualenv&lt;/code&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Crie ambientes isolados para cada projeto, garantindo a consistência das dependências.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📂 &lt;strong&gt;Local por projeto&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Torna o ambiente de desenvolvimento portátil e reproduzível através do arquivo &lt;code&gt;.python-version&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Desvantagem&lt;/th&gt;
&lt;th&gt;Como contornar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📦 &lt;strong&gt;Instalação inicial&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A instalação inicial pode ser um pouco demorada, mas uma vez feita, funciona para sempre.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐢 &lt;strong&gt;Compilação de versões&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A compilação de novas versões do Python pode levar alguns minutos, dependendo do seu hardware.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🤔 Quando &lt;strong&gt;não&lt;/strong&gt; usar o &lt;code&gt;pyenv&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Se você &lt;strong&gt;só usa uma versão do Python&lt;/strong&gt; e não precisa alternar entre projetos com diferentes requisitos de versão.&lt;/li&gt;
&lt;li&gt;  Se você já usa &lt;strong&gt;conda&lt;/strong&gt; e está satisfeito com seu ecossistema de gerenciamento de pacotes e ambientes.&lt;/li&gt;
&lt;li&gt;  Se você está em um ambiente muito restrito (como servidores compartilhados) onde não tem permissão para instalar novas ferramentas ou compilar software.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Conclusão
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;pyenv&lt;/code&gt;, combinado com o &lt;code&gt;pyenv-virtualenv&lt;/code&gt;, é uma ferramenta poderosa e leve para qualquer desenvolvedor Python que trabalha com múltiplos projetos, versões ou ambientes. Ele evita dores de cabeça com conflitos de dependência e oferece controle total sobre seu ambiente de desenvolvimento.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Comece instalando, experimente com diferentes versões e veja como seu fluxo de trabalho se torna mais limpo, organizado e eficiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📚 Referências
&lt;/h2&gt;

&lt;p&gt;[1] &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;https://github.com/pyenv/pyenv&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://realpython.com/python-virtual-environments-a-primer/" rel="noopener noreferrer"&gt;https://realpython.com/python-virtual-environments-a-primer/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>datascience</category>
      <category>programming</category>
    </item>
    <item>
      <title>WebRTC - One Byte Explainer</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Thu, 21 Mar 2024 12:39:17 +0000</pubDate>
      <link>https://dev.to/carineneris/dev-challenge-one-byte-explainer-ig8</link>
      <guid>https://dev.to/carineneris/dev-challenge-one-byte-explainer-ig8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for DEV Challenge v24.03.20, One Byte Explainer: Browser API or Feature.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explainer
&lt;/h2&gt;

&lt;p&gt;WebRTC (Web Real-time Communication) is like turning your browser into a Swiss Army knife: make video/audio calls without downloading anything extra. It's just like having a toolbox in your browser, all through the internet!&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Context
&lt;/h2&gt;

&lt;p&gt;I used MDN as a reference.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Precisamos falar sobre ipdb: Uma Jornada para um debugger mais Eficiente em Python</title>
      <dc:creator>Carine Neris</dc:creator>
      <pubDate>Wed, 20 Mar 2024 23:00:35 +0000</pubDate>
      <link>https://dev.to/carineneris/precisamos-falar-sobre-ipdb-uma-jornada-para-um-debugger-mais-eficiente-em-python-4blj</link>
      <guid>https://dev.to/carineneris/precisamos-falar-sobre-ipdb-uma-jornada-para-um-debugger-mais-eficiente-em-python-4blj</guid>
      <description>&lt;p&gt;Bugs e erros são inevitáveis no desenvolvimento de software. No entanto, enfrentar esses problemas pode ser uma experiência frustrante e demorada. Felizmente, existem ferramentas poderosas disponíveis para nos ajudar a depurar nossos programas de forma mais eficiente. Uma dessas ferramentas é o ipdb, um depurador interativo para Python que pode simplificar e agilizar o processo de identificação e correção de bugs. Vamos descobrir por que precisamos debuggar com ipdb e como essa ferramenta pode tornar nossa jornada de depuração mais eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas o que é ipdb?
&lt;/h2&gt;

&lt;p&gt;O ipdb é uma ferramenta de depuração interativa para Python, projetada para ajudar a inspecionar e depurar programas de forma eficiente. Ele oferece uma interface de linha de comando intuitiva e fácil de usar, juntamente com recursos avançados que facilitam a identificação e correção de bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais Recursos do ipdb:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interface amigável e interativa.&lt;/li&gt;
&lt;li&gt;Suporte a autocompletar.&lt;/li&gt;
&lt;li&gt;Navegação fácil entre frames de pilha.&lt;/li&gt;
&lt;li&gt;Suporte a expressões regulares durante a pesquisa.&lt;/li&gt;
&lt;li&gt;Compatibilidade total com o pdb, o depurador padrão do Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Como Usar o ipdb:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usar o ipdb é simples. Basta instalar e adicionar a linha &lt;code&gt;import ipdb; ipdb.set_trace()&lt;/code&gt; em seu código onde deseja iniciar a depuração. Isso define um ponto de interrupção no código e permite que você inspecione variáveis, execute comandos e navegue pelo stack trace(histórico de eventos que levou ao erro) durante a execução do programa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vamos a um passo a passo de como usar o ipdb:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instalação:&lt;/strong&gt; Podemos instalar o ipdb facilmente usando o pip:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   pip install ipdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definindo Pontos de interrupção:&lt;/strong&gt; Podemos definir pontos de interrupção em nosso código onde queremos iniciar a depuração, usando o seguinte import:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ipdb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;ipdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_trace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explorando e Depurando:&lt;/strong&gt; Depois de definir os pontos de interrupção, podemos executar nosso código e começar a explorar e depurar a execução interativamente usando os comandos do ipdb.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comandos do ipdb&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Comandos de Navegação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;n&lt;/code&gt; ou &lt;code&gt;next&lt;/code&gt;: Executa a próxima linha de código.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s&lt;/code&gt; ou &lt;code&gt;step&lt;/code&gt;: Entra em funções e métodos, permitindo que você acompanhe a execução linha por linha.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c&lt;/code&gt; ou &lt;code&gt;continue&lt;/code&gt;: Continua a execução até encontrar o próximo ponto de interrupção ou o final do programa.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comandos de Inspeção de Variáveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;p &amp;lt;variável&amp;gt;&lt;/code&gt;: Imprime o valor de uma variável.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pp &amp;lt;variável&amp;gt;&lt;/code&gt;: Imprime o valor de uma variável de forma mais bonita e legível.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whatis &amp;lt;variável&amp;gt;&lt;/code&gt;: Exibe o tipo de uma variável.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list &amp;lt;linha&amp;gt;&lt;/code&gt;: Exibe as linhas de código ao redor de uma linha específica.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comandos de Stack Trace e Escopo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;w&lt;/code&gt; ou &lt;code&gt;where&lt;/code&gt;: Exibe o stack trace atual, mostrando onde você está no código.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;u&lt;/code&gt; ou &lt;code&gt;up&lt;/code&gt;: Move-se para o frame de pilha anterior, permitindo que você inspecione o escopo de chamadas de funções anteriores.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;d&lt;/code&gt; ou &lt;code&gt;down&lt;/code&gt;: Move-se para o frame de pilha seguinte.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comandos de Controle de Execução:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;return&lt;/code&gt;: Simula o retorno imediato da função em que você está, permitindo que você teste diferentes caminhos de execução.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jump &amp;lt;linha&amp;gt;&lt;/code&gt;: Move a execução para uma linha específica do código.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disable &amp;lt;número&amp;gt;&lt;/code&gt;: Desativa um ponto de interrupção específico.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outros Comandos Úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;q&lt;/code&gt; ou &lt;code&gt;quit&lt;/code&gt;: Sai do depurador ipdb.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h&lt;/code&gt; ou &lt;code&gt;help&lt;/code&gt;: Exibe a lista de comandos disponíveis e fornece informações de ajuda sobre como usá-los.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de código:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aqui vai um exemplo de como usar o ipdb para depurar um programa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calcular_fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ipdb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;ipdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_trace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;calcular_fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calcular_fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;O fatorial de 5 é:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, estamos calculando o fatorial de 5 usando uma função recursiva. Ao iniciar o programa com o ipdb, podemos inspecionar o valor da variável &lt;code&gt;numero&lt;/code&gt; em cada chamada recursiva e entender como o cálculo do fatorial é realizado.&lt;/p&gt;

&lt;p&gt;É isto, quis mostrar aqui essa ferramenta que facilita bastante nossa vida e como ela pode ajudar a depurar nossos programas de forma mais eficiente e eficaz. Então, da próxima vez que você se deparar com um bug em seu código, don't worry, use o ipdb para depurar e encontrar a solução do erro de forma mais rápida.&lt;/p&gt;

</description>
      <category>python</category>
      <category>debugger</category>
      <category>webdev</category>
      <category>django</category>
    </item>
  </channel>
</rss>
