<?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: Nayara Martins</title>
    <description>The latest articles on DEV Community by Nayara Martins (@nayaramartins).</description>
    <link>https://dev.to/nayaramartins</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4101035%2Fc4ae661b-c3b0-4d18-b6ce-13c6557950d1.jpeg</url>
      <title>DEV Community: Nayara Martins</title>
      <link>https://dev.to/nayaramartins</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nayaramartins"/>
    <language>en</language>
    <item>
      <title>A versão de API que vence sem avisar</title>
      <dc:creator>Nayara Martins</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:31:10 +0000</pubDate>
      <link>https://dev.to/nayaramartins/a-versao-de-api-que-vence-sem-avisar-4ao</link>
      <guid>https://dev.to/nayaramartins/a-versao-de-api-que-vence-sem-avisar-4ao</guid>
      <description>&lt;p&gt;Um script meu que publicava conteúdo via API do LinkedIn parou de funcionar do nada. Nenhuma linha mudou. O erro voltou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"NONEXISTENT_VERSION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Requested version 20250601 is not active"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não tinha bug de código nenhum. A versão da API que eu tinha fixado no script simplesmente saiu da janela de suporte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como uma API versionada por data quebra sozinha
&lt;/h3&gt;

&lt;p&gt;A API REST do LinkedIn exige um cabeçalho &lt;code&gt;LinkedIn-Version&lt;/code&gt; no formato ano-mês, tipo &lt;code&gt;202506&lt;/code&gt;. Isso não é um número de versão semântica que você escolhe uma vez e esquece. É uma janela de tempo. Passado um certo período, aquela versão sai de circulação e a API recusa a chamada, mesmo que o resto do payload esteja perfeito.&lt;/p&gt;

&lt;p&gt;O código nunca mudou entre o dia em que funcionava e o dia em que parou. O relógio do calendário é que mudou.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que isso engana quem debuga
&lt;/h3&gt;

&lt;p&gt;O reflexo natural ao ver um erro de API é revisar o código: campo errado, token expirado, permissão faltando. Nenhuma dessas hipóteses batia. O token era válido, os escopos estavam certos, o payload era idêntico ao de uma chamada que tinha funcionado antes.&lt;/p&gt;

&lt;p&gt;A mensagem de erro ajudou bastante aqui, porque nomeou exatamente o campo problemático (&lt;code&gt;Requested version 20250601&lt;/code&gt;) e o motivo (&lt;code&gt;is not active&lt;/code&gt;). Sem prestar atenção nela e ir direto pro código, essa causa levaria muito mais tempo pra aparecer.&lt;/p&gt;

&lt;h3&gt;
  
  
  A correção
&lt;/h3&gt;

&lt;p&gt;Trocar o valor fixo do cabeçalho pela versão atual, no mesmo formato ano-mês. Nada mais no código precisou mudar.&lt;/p&gt;

&lt;p&gt;O detalhe que fica de lição: esse valor não é constante de verdade, é uma data disfarçada de configuração. Documentei isso direto no comentário ao lado da constante, pra próxima vez que o mesmo erro aparecer a causa já estar escrita ali, em vez de descoberta de novo do zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  A lição
&lt;/h3&gt;

&lt;p&gt;Nem todo bug tem código culpado. Uma integração que depende de versão de API, certificado, ou qualquer coisa com data de validade pode quebrar sem que uma única linha do seu sistema tenha mudado. Antes de caçar bug no próprio código, vale checar se alguma dependência externa simplesmente venceu.&lt;/p&gt;




&lt;p&gt;Nayara Martins, desenvolvedora de sistemas sob medida em Assis, SP. Mais em &lt;a href="https://prospectia.space" rel="noopener noreferrer"&gt;prospectia.space&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>linkedin</category>
      <category>debugging</category>
    </item>
    <item>
      <title>O dicionário que corrige acento errado sozinho</title>
      <dc:creator>Nayara Martins</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:26:56 +0000</pubDate>
      <link>https://dev.to/nayaramartins/o-dicionario-que-corrige-acento-errado-sozinho-55n5</link>
      <guid>https://dev.to/nayaramartins/o-dicionario-que-corrige-acento-errado-sozinho-55n5</guid>
      <description>&lt;p&gt;Um script meu corrige acentuação automática em português usando um dicionário de mais de noventa mil palavras. Ele existe justamente para consertar texto gerado por IA, que às vezes esquece acento. Só que hoje descobri que o próprio dicionário estava trocando "pele" por "Pelé" e "teve" por "tevê".&lt;/p&gt;

&lt;p&gt;O corretor não tinha bug de lógica nenhum. O dado dentro dele é que estava errado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como um dicionário de correção vira fonte de erro
&lt;/h3&gt;

&lt;p&gt;O dicionário foi gerado a partir de uma lista ampla de palavras em português, mapeando a forma sem acento pra forma com acento correspondente. Para a maioria das palavras isso funciona bem: uma palavra comum sem acento tem sempre a mesma forma acentuada certa, sem exceção.&lt;/p&gt;

&lt;p&gt;O problema aparece em palavra que também é nome próprio. "Pele" sem acento é ambíguo: pode ser a palavra comum (pele, órgão do corpo) ou o apelido do jogador, que leva acento (Pelé). Na hora de montar o dicionário, alguma etapa do processo escolheu a forma acentuada como "a certa" para aquela entrada, sem checar que a forma comum, sem acento, é muito mais frequente no uso real.&lt;/p&gt;

&lt;p&gt;Mesma história com "teve" (passado do verbo ter) virando "tevê" (forma informal de televisão).&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que isso é mais perigoso que parecer
&lt;/h3&gt;

&lt;p&gt;Um erro de dicionário desse tipo não quebra nada visivelmente. O texto sai fluente, gramaticalmente correto, sem nenhum sinal de que uma palavra foi trocada por engano. Quem lê rápido não percebe. Isso é o oposto de um erro de sintaxe, que pelo menos avisa que algo está errado.&lt;/p&gt;

&lt;p&gt;A única forma de achar foi ler o texto gerado com atenção, palavra por palavra, depois de já ter rodado o corretor automático. O corretor não se autodenuncia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde traçar a linha entre corrigir e não mexer
&lt;/h3&gt;

&lt;p&gt;Nem toda ambiguidade é bug. Uma palavra genuinamente ambígua, tipo "e" (conjunção "e" vs verbo "é"), "esta" (demonstrativo vs verbo "está") ou "pais" (progenitores vs "país"), não tem solução de dicionário. Só quem lê a frase inteira sabe qual acento é o certo. Forçar uma escolha automática aí erra tanto quanto deixar sem acento.&lt;/p&gt;

&lt;p&gt;A correção certa, então, tem duas partes diferentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug de verdade&lt;/strong&gt; (palavra não ambígua mapeada errado, tipo pele/teve): remover a entrada errada do dicionário. Ela nunca devia ter sido adicionada daquele jeito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambiguidade real&lt;/strong&gt;: não tentar resolver automaticamente. Documentar a lista de palavras que exigem leitura humana antes de publicar qualquer texto gerado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A lição
&lt;/h3&gt;

&lt;p&gt;Uma ferramenta que existe pra corrigir erro pode, ela mesma, ser a origem do erro. Isso não é motivo pra desconfiar de toda automação, é motivo pra sempre ter uma segunda checagem que não depende da mesma lógica da primeira. Se o corretor e a checagem final usam a mesma fonte de verdade, um erro nela passa despercebido duas vezes.&lt;/p&gt;




&lt;p&gt;Nayara Martins, desenvolvedora de sistemas sob medida em Assis, SP. Mais em &lt;a href="https://prospectia.space" rel="noopener noreferrer"&gt;prospectia.space&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>debugging</category>
      <category>automation</category>
    </item>
    <item>
      <title>O bug que corrige sozinho o arquivo, mas não o e-mail que ele gera</title>
      <dc:creator>Nayara Martins</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:17:59 +0000</pubDate>
      <link>https://dev.to/nayaramartins/o-bug-que-corrige-sozinho-o-arquivo-mas-nao-o-e-mail-que-ele-gera-33ph</link>
      <guid>https://dev.to/nayaramartins/o-bug-que-corrige-sozinho-o-arquivo-mas-nao-o-e-mail-que-ele-gera-33ph</guid>
      <description>&lt;p&gt;Um sistema meu estava mandando e-mail em português com acentuação errada. Não era acento faltando, era acento &lt;em&gt;trocado&lt;/em&gt;: "operação" virava "operaÃ§Ã£o" em alguns lugares e simplesmente sumia em outros. O arquivo CSV de onde os dados vinham parecia correto quando eu abria ele. O bug só aparecia na saída final.&lt;/p&gt;

&lt;p&gt;A causa não era o arquivo. Era a leitura dele.&lt;/p&gt;

&lt;h3&gt;
  
  
  O sintoma
&lt;/h3&gt;

&lt;p&gt;O script lia um CSV com &lt;code&gt;encoding="latin1"&lt;/code&gt; e escrevia de volta com &lt;code&gt;encoding="latin1"&lt;/code&gt;. Isso rodava há meses sem erro, sem exceção, sem log estranho. Só que o arquivo, na verdade, sempre foi UTF-8.&lt;/p&gt;

&lt;p&gt;Por que isso nunca quebrou? Porque &lt;strong&gt;UTF-8 lido como Latin-1 é um round-trip estável&lt;/strong&gt;. Cada caractere acentuado em UTF-8 ocupa dois bytes. Latin-1 é uma tabela de um byte só, mas cobre justamente a faixa 0x80-0xFF, então cada um daqueles dois bytes vira um caractere Latin-1 válido, só que errado (tipo "Ã" e "§" no lugar de "ç"). Escrever esses dois caracteres de volta como Latin-1 produz exatamente os mesmos dois bytes originais. O arquivo nunca corrompe. Ele só mente pra quem olha.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde o estrago aparece
&lt;/h3&gt;

&lt;p&gt;O estrago só ficou visível quando esse texto mal lido saiu para um lugar que realmente decodifica como UTF-8: um prompt de LLM, um log em UTF-8, um e-mail. Aí os dois bytes viram os dois caracteres errados de verdade, visíveis, feios.&lt;/p&gt;

&lt;p&gt;Ler &lt;code&gt;raw.decode('latin1')&lt;/code&gt; nunca lança exceção, mesmo com dado sujo. Isso é o motivo do bug ter sobrevivido tanto tempo: não existe erro pra investigar, só resultado sutilmente errado.&lt;/p&gt;

&lt;h3&gt;
  
  
  O diagnóstico que separou hipótese de fato
&lt;/h3&gt;

&lt;p&gt;Antes de mexer em qualquer script, decodifiquei o arquivo inteiro como UTF-8 puro, sem passar por nenhum código do sistema:&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="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dados.csv&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;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# se isso não lançar erro, o arquivo já é UTF-8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Decodificou limpo, zero exceção, em um arquivo de mais de cem mil caracteres. Isso provou duas coisas de uma vez: o arquivo sempre foi UTF-8 correto, e o problema inteiro estava nos scripts que liam ele errado. Não havia dado real pra recuperar ou consertar, só a leitura errada pra corrigir.&lt;/p&gt;

&lt;h3&gt;
  
  
  A correção
&lt;/h3&gt;

&lt;p&gt;Trocar &lt;code&gt;encoding="latin1"&lt;/code&gt; por &lt;code&gt;encoding="utf-8"&lt;/code&gt; em cada ponto que abria aquele arquivo específico. Nada mais. Nenhuma linha de dado foi reescrita.&lt;/p&gt;

&lt;p&gt;O jeito de confirmar que a correção funcionou não foi só rodar sem erro. Foi gerar conteúdo de verdade a partir do fluxo completo, com vocabulário que nunca tinha passado por ali antes, e ler o resultado num lugar que expõe o problema visualmente, no caso, o corpo de um e-mail de teste.&lt;/p&gt;

&lt;h3&gt;
  
  
  A lição que fica
&lt;/h3&gt;

&lt;p&gt;Round-trip estável esconde bug. Se ler errado e escrever errado sempre voltam pro mesmo byte, o sistema parece saudável em todo teste que só olha o arquivo. O bug só aparece no consumidor final, e só se alguém realmente olhar o resultado, não só o código de saída do processo.&lt;/p&gt;

&lt;p&gt;Antes de assumir que um dado está corrompido, vale testar a hipótese mais simples primeiro: talvez o dado esteja certo, e a leitura é que está errada.&lt;/p&gt;




&lt;p&gt;Nayara Martins, desenvolvedora de sistemas sob medida em Assis, SP. Mais em &lt;a href="https://prospectia.space" rel="noopener noreferrer"&gt;prospectia.space&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>python</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
