<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>TabNews</title>
        <link>https://www.tabnews.com.br/recentes/rss</link>
        <description>Conteúdos para quem trabalha com Programação e Tecnologia</description>
        <lastBuildDate>Fri, 19 Jun 2026 03:06:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>pt</language>
        <image>
            <title>TabNews</title>
            <url>https://www.tabnews.com.br/favicon-mobile.png</url>
            <link>https://www.tabnews.com.br/recentes/rss</link>
        </image>
        <item>
            <title><![CDATA[Reclamando sobre o LinkedIn]]></title>
            <link>https://www.tabnews.com.br/GLeite/reclamando-sobre-o-linkedin</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/GLeite/reclamando-sobre-o-linkedin</guid>
            <pubDate>Fri, 19 Jun 2026 03:05:53 GMT</pubDate>
            <description><![CDATA[Isso não é um post técnico, mas é um desabafo sincero. Todo mundo conhece o LinkedIn e sabe como ele funciona e para o que ele foi feito. Semana passada fiz uma postagem no LinkedIn e res...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p><strong>Isso não é um post técnico, mas é um desabafo sincero.</strong></p><p>Todo mundo conhece o LinkedIn e sabe como ele funciona e para o que ele foi feito.</p><p>Semana passada fiz uma postagem no LinkedIn e resolvi dar uma olhada em como estavam as publicações. Quando eu tinha saido, la por Novembro do ano passado, ja havia muita postagem de IA e dica genérica e hoje eu constatei que está ainda pior.</p><p>De tantas postagens genéricas eu só vi uma postagem original, e que ainda era um meme.</p><p>Não vi projetos, não vi alguem comentando sobre alguma tendência, só a mesma porcaria "dica tequi pa vc ficar bao". Bicho, se você falasse de um cachorro pra mim, do papagaio da sua avó, sei la, pra mim seria muito mais interessante.</p><p>A minha teoria é que esse pessoal só joga no chatGPT ou qualquer outra IA, pede pra gerar la a imagem e copia e cola. Não tem projetos legais, dicas de experiências ou maturidade, estudos de caso....so aquela gourmetização corporativa barata.</p><p>E é por isso que vim pra ca, e pretendo ir pra algum outro lugar semelhante e postar coisas mais tecnicas no medium mesmo.</p><p>Aos mais veteranos, eu gostaria sim de sua visão ou de recomendações de locais para compartilhar e ver projetos. Afinal, talvez meu algoritmo tenha ido pro pau e esteja me entregando essas postagens paias.</p><p>Enfim, obrigado pela atenção.</p></div>]]></content:encoded>
            <author>GLeite</author>
        </item>
        <item>
            <title><![CDATA[Pitch: Transformei uma TV Box parada em um Homelab de Observabilidade]]></title>
            <link>https://www.tabnews.com.br/kevinjh07/transformei-uma-tv-box-parada-em-um-homelab-de-observabilidade</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/kevinjh07/transformei-uma-tv-box-parada-em-um-homelab-de-observabilidade</guid>
            <pubDate>Fri, 19 Jun 2026 00:45:32 GMT</pubDate>
            <description><![CDATA[Faz algum tempo que tenho uma TV Box T95 Max Plus que usava para rodar emuladores com EmuELEC, mas estava parada. TV Box T95 Max Plus Esses dias, olhando para ela, pensei: "Poderia utiliz...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Faz algum tempo que tenho uma TV Box T95 Max Plus que usava para rodar emuladores com EmuELEC, mas estava parada.</p><p><img src="https://i.imgur.com/rWwFexg.png" alt="TV Box T95 Max Plus"></p><p>Esses dias, olhando para ela, pensei: "Poderia utilizar essa Box para rodar algo diferente?". Então, comecei a pesquisar sobre o que poderia ser feito com uma TV Box desse modelo e hardware — <strong>CPU Amlogic S905x3, 4GB RAM + 32GB eMMC + SD 128GB</strong>. Neste artigo, vou compartilhar minha saga tentando rodar esse projeto em um hardware bastante limitado.</p><p>Tive a grata surpresa de descobrir que seria possível rodar uma distro Linux adaptada para esse tipo de hardware. Com isso em mente, encontrei o <a href="https://armbian.com" rel="nofollow">Armbian</a></p><p>Mas, ao gravar a imagem no SD, não tive sucesso. Após mais um tempo de pesquisa, encontrei uma imagem do projeto Ophub e com ela tive sucesso na instalação e configuração. Outro detalhe é que preferi fazer todo o processo no cartão SD pela facilidade de gravar as imagens e não correr o risco de perder o Android original da Box.</p><p>Depois disso, pensei em instalar o Docker e rodar o Grafana para criar a observabilidade de uma API em formato de 'Homelab'.</p><h3 id="kevinjh07-content-o-projeto-e-os-desafios-de-hardware">O Projeto e os Desafios de Hardware</h3><p>Diferente de programar em um ambiente com bom hardware (ao qual nós devs normalmente temos acesso), ao começar a implementar esse projeto, tive diversas dificuldades devido às limitações da TV Box. Tive que observar com cuidado o uso de CPU e memória de cada container (Grafana, Prometheus, etc.) para garantir que tudo rodasse sem travar.</p><p>A CPU aguentou bem o tranco, mas precisei limitar de forma rígida o uso de RAM de cada serviço. Para resolver isso, defini a configuração mem_limit para cada container diretamente no arquivo docker-compose.yml, como no exemplo abaixo:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">services:</span>  <span class="hljs-attr">grafana:</span>    <span class="hljs-string">...</span>    <span class="hljs-attr">mem_limit:</span> <span class="hljs-string">384m</span>  <span class="hljs-attr">prometheus:</span>    <span class="hljs-string">...</span>    <span class="hljs-attr">mem_limit:</span> <span class="hljs-string">512m</span></code></pre><p>Deixei todo o processo de configuração e os arquivos completos documentados no meu <a href="https://github.com/kevinjh07/homelab-observability-box">GitHub</a>.</p><h3 id="kevinjh07-content-conclusão">Conclusão</h3><p><img src="https://i.imgur.com/BWQ8slx.png" alt="Dashboard do Grafana com métricas da API"></p><p>Ao fim, consegui ver todo o processo de fato funcionando na TV Box. O Docker Compose rodou liso a observabilidade de uma API de testes. Foi uma experiência incrível!</p><p>Logo pensei em outras coisas para fazer: dada a flexibilidade do Linux, talvez exibir esse Grafana em um monitor portátil com outras informações.</p><p>Gostaria de ver mais Homelabs como este? Deixa um comentário. O código e as instruções estão no repositório do projeto <a href="https://github.com/kevinjh07/homelab-observability-box">https://github.com/kevinjh07/homelab-observability-box</a>. Se ele for útil, considere deixar uma estrela.</p></div>]]></content:encoded>
            <author>kevinjh07</author>
        </item>
        <item>
            <title><![CDATA[Pitch: Fiz um Saas para quem odeia gravar tutoriais (Gravo do meu jeito, e ele faz edit automatico), fase de validação]]></title>
            <link>https://www.tabnews.com.br/alexdaltro/pitch-fiz-um-saas-para-quem-odeia-gravar-tutoriais-gravo-do-meu-jeito-e-ele-faz-edit-automatico-fase-de-validacao</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/alexdaltro/pitch-fiz-um-saas-para-quem-odeia-gravar-tutoriais-gravo-do-meu-jeito-e-ele-faz-edit-automatico-fase-de-validacao</guid>
            <pubDate>Thu, 18 Jun 2026 22:39:58 GMT</pubDate>
            <description><![CDATA[Pessoal, estou validando o um MVP que estou fazendo e gostaria muito de saber o que acham... Na minha cabeça é muito útil. Fiz esse app para resolver o meu próprio problema... eu já tinha...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Pessoal, estou validando o um MVP que estou fazendo e gostaria muito de saber o que acham... Na minha cabeça é muito útil.</p><p>Fiz esse app para resolver o meu próprio problema... eu já tinha feito uma extensão do chrome antes, mas sofri pra divulgar/vender pq ela era muito dependente de tutoriais, e eu sempre fui ruim com isso (Voz ruim, gagueijar, etc)<br>Então a minha ideia foi: E se eu pudesse gravar do meu jeito com erros, e uma ferramenta editasse os erros? Procurei mas não achei algo que se encaixasse, e resolvi fazer eu mesmo.</p><p><strong>O que ele faz:</strong> Remove repetições, erros, silencios, melhora o texto e adiciona voice over.<br>Dá pra fazer versões em outras linguas também, a partir do video original.<br>Estou implementando zoom automatico também.</p><h3 id="alexdaltro-content-stack-usado">Stack usado</h3><ul><li>Next/Node</li><li>Redis para fila dos workers</li><li>Gemini 2.5 flash para a IA que enxerga o video</li><li>Gemini 2.5 lite para tradução dos textos</li><li>Azure TTS para o voice Over</li><li>ffmpeg para a edição propriamente dita.</li></ul><h3 id="alexdaltro-content-custos-até-agora">Custos até agora:</h3><ul><li>Google Gemini API, para Vision: R<span class="math math-inline"> 180 (R</span> 100 perdidos por um bug no Gemini TTS)</li><li>Anúncio no find-my-saas: R$ 29</li><li>Anúncio com @JovemTranquilao: R$ 50</li><li>Azure Whisper: R$ 30</li><li>Railway: R$ 25</li><li>Domínio atual: R$ 35</li><li>Primeiro domínio (era perfeito, mas depois mudei de ideia): R$ 50</li><li>3 meses de Antigravity: R$ 30 (promoção)</li></ul><h3 id="alexdaltro-content-riscos">Riscos:</h3><ul><li>Ser uma dor só minha.</li><li>Risco de não usarem com frequência… nem todo mundo precisa gravar todo mês, então pode ter churn alto.</li></ul><p>Agradeço todo e qualquer feedback! 🙏</p><p>Video de divulgação (tentando ser criativo, mas vão poder ver o motivo de eu ter criado o sistema kkkk)<br><a href="https://www.youtube.com/watch?v=FNFLRhcfUsY" rel="nofollow">https://www.youtube.com/watch?v=FNFLRhcfUsY</a></p></div>]]></content:encoded>
            <author>alexdaltro</author>
        </item>
        <item>
            <title><![CDATA[Como usei IA para fazer o scouting dos jogadores da Copa]]></title>
            <link>https://www.tabnews.com.br/MarcelHRB/como-usei-ia-para-fazer-o-scouting-dos-jogadores-da-copa</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/MarcelHRB/como-usei-ia-para-fazer-o-scouting-dos-jogadores-da-copa</guid>
            <pubDate>Thu, 18 Jun 2026 21:19:11 GMT</pubDate>
            <description><![CDATA[Esse semestre eu peguei a disciplina de Inteligência Artificial e o trabalho do seminário era simples no enunciado e assustador na prática: escolher um tema, mostrar uma aplicação real, e...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Esse semestre eu peguei a disciplina de Inteligência Artificial e o trabalho do seminário era simples no enunciado e assustador na prática: escolher um tema, mostrar uma aplicação real, explicar as técnicas de IA por trás e discutir os prós e contras. O tema do meu grupo foi IA aplicada ao esporte.</p><p>Em vez de só apresentar slides sobre o assunto, a gente decidiu construir um sistema de verdade. Um pipeline que avalia jogadores de futebol a partir de dados abertos, usando as mesmas ideias que clubes como o Brentford e o Brighton aplicam no mercado da bola. A diferença é que esses clubes mantêm os modelos deles em segredo, então a gente construiu o nosso do zero, de forma transparente e reproduzível.</p><p>Esse artigo é a história de como o ICMC-Scout foi montado, bloco por bloco, e principalmente do que eu entendi sobre o que separa "rodar um modelo" de realmente entender o que está acontecendo por baixo.</p><h2 id="marcelhrb-content-o-problema-que-o-scouting-tenta-resolver">O problema que o scouting tenta resolver</h2><p>Scouting é o trabalho de descobrir e avaliar jogadores. Historicamente isso era feito no olho, olheiros viajando, assistindo jogos, anotando impressões. É caro, é lento e é cheio de viés. Um jogador que joga num time fraco, numa liga pequena, longe dos holofotes, simplesmente não é visto.</p><p>O grande marco da virada foi o Moneyball, lá no beisebol americano em 2002, quando um time pequeno e sem dinheiro passou a montar elenco olhando para estatísticas que o resto do mercado ignorava. A mesma lógica chegou ao futebol. O Brentford subiu da terceira divisão inglesa até a Premier League apoiado fortemente em dados, e o Brighton virou referência em comprar barato e vender caro usando modelos próprios.</p><p>A pergunta que move tudo isso é uma só: esse jogador é bom de verdade, ou só teve sorte e está sendo subvalorizado (ou supervalorizado) pelo mercado?</p><h2 id="marcelhrb-content-onde-isso-se-encaixa-em-inteligência-artificial">Onde isso se encaixa em Inteligência Artificial</h2><p>Antes de escrever uma linha de código, a gente precisou deixar uma coisa clara, tanto pra gente quanto pro professor: o que aqui é IA de verdade e o que é só conta.</p><p>A hierarquia que organiza o projeto é essa:</p><blockquote><p>Inteligência Artificial ⊃ Machine Learning ⊃ {supervisionado, não-supervisionado}</p></blockquote><p>E a divisão ficou assim:</p><table><thead><tr><th>Etapa</th><th>Técnica</th><th>Categoria</th></tr></thead><tbody><tr><td>Modelo de xG</td><td>Regressão logística / Gradient Boosting</td><td>ML supervisionado, aprende com chutes rotulados como gol ou não-gol</td></tr><tr><td>Perfis táticos</td><td>K-Means</td><td>ML não-supervisionado, acha estrutura sem rótulo</td></tr><tr><td>Score final</td><td>Soma ponderada de métricas</td><td>Heurística, <strong>não</strong> é ML, são pesos que a gente definiu</td></tr></tbody></table><p>Essa separação foi proposital. Em algum momento eu cheguei a duvidar se o projeto era "IA mesmo" ou se a gente só estava fazendo estatística disfarçada. A resposta é que o coração de IA está nas duas primeiras etapas, e ser honesto sobre a terceira parte ser heurística é justamente o que dá rigor ao trabalho.</p><h2 id="marcelhrb-content-os-dados">Os dados</h2><p>A base é o <strong>StatsBomb Open Data</strong>, eventos detalhados de partidas reais, com a localização de cada chute, passe e ação. É gratuito e público, acessado via a biblioteca <code>statsbombpy</code>.</p><p>Eu usei a Copa do Mundo de 2022 (<code>competition_id=43</code>, <code>season_id=106</code> dentro da base). São 64 partidas.</p><p>A API do StatsBomb entrega os eventos partida por partida, não em lote. Então a gente pega a lista de <code>match_id</code> da competição e itera, empilhando cada DataFrame numa lista:</p><pre><code class="hljs language-python">events = pd.concat(all_events, ignore_index=<span class="hljs-literal">True</span>)</code></pre><p>No fim, são <strong>234.637 eventos</strong>, <strong>681 jogadores</strong> que participaram de alguma jogada e <strong>1.494 chutes</strong> na competição inteira.</p><hr><h2 id="marcelhrb-content-parte-a-o-modelo-de-xg-supervisionado">Parte A: o modelo de xG (supervisionado)</h2><h3 id="marcelhrb-content-o-que-é-xg">O que é xG</h3><p>xG, ou <em>expected goals</em>, é a probabilidade de um chute virar gol dado o contexto dele. Um chute de dentro da pequena área, de frente pro gol, tem xG alto. Um chute da intermediária, em cima da linha de fundo, tem xG baixíssimo. A ideia é medir a qualidade da chance, não só se a bola entrou.</p><h3 id="marcelhrb-content-montando-o-dataset-de-chutes">Montando o dataset de chutes</h3><p>Primeiro isolei os chutes, removi os pênaltis (que distorcem qualquer modelo, são chance quase isolada) e criei o rótulo <code>is_goal</code>, que é a resposta que o modelo supervisionado vai aprender a prever.</p><p>Mantive a coluna original <code>shot_outcome</code> por um tempo, só pra conferência. É uma boa prática de sanity check: você consegue olhar lado a lado e confirmar que a binarização não inverteu nada. Depois eu dropo essa coluna antes de treinar.</p><p>A taxa de conversão da base é de cerca de <strong>11%</strong>. Isso importa muito, e vou voltar nisso na hora de avaliar o modelo, porque um modelo preguiçoso poderia simplesmente dizer "nenhum chute vira gol" e acertar 89% das vezes.</p><h3 id="marcelhrb-content-engenharia-de-features">Engenharia de features</h3><p>Aqui está uma das partes que eu mais gostei. A base crua não tem distância nem ângulo, ela tem só a posição do chute. Quem deriva as features é você.</p><p>Eu considerei a distância até o centro do gol e o ângulo que a baliza abre da perspectiva de quem chuta. Um chute de frente pro gol enxerga uma baliza larga. Um chute da linha de fundo, por mais perto que esteja, vê quase nada.</p><p>O campo do StatsBomb tem 120 por 80. O gol atacado fica em <code>x = 120</code>, com as traves em <code>y = 36</code> e <code>y = 44</code>, ou seja, centro em <code>y = 40</code>. A distância sai de um Pitágoras simples:</p><pre><code class="hljs language-python">shots[<span class="hljs-string">'distance'</span>] = np.sqrt((GOAL_X - x) ** <span class="hljs-number">2</span> + (GOAL_CENTER_Y - y) ** <span class="hljs-number">2</span>)</code></pre><p>O ângulo visado eu calculei pelo ângulo entre as retas que ligam o chute às duas traves. Além da geometria, codifiquei três sinais de contexto: cabeçada, sob pressão e origem em contra-ataque.</p><p>Como o scikit-learn trabalha com matriz numérica e não aceita <code>True</code>/<code>False</code>, tive que converter esses sinais binários. No fim, o dataset virou as duas peças que todo modelo supervisionado precisa:</p><pre><code class="hljs language-python">feature_cols = [<span class="hljs-string">'distance'</span>, <span class="hljs-string">'angle'</span>, <span class="hljs-string">'header'</span>, <span class="hljs-string">'under_pressure'</span>, <span class="hljs-string">'from_counter'</span>]</code></pre><p><code>X</code> é a matriz de features (as 5 variáveis preditoras) e <code>y</code> é o rótulo <code>is_goal</code>, aquele 1 ou 0 que o modelo aprende a prever.</p><h3 id="marcelhrb-content-treino-e-a-importância-do-split-estratificado">Treino e a importância do split estratificado</h3><p>Separei os chutes em treino (onde o modelo aprende) e teste (onde a gente avalia em dados que ele nunca viu), num split de 75% e 25%.</p><p>Como só 11% dos chutes viram gol, eu usei <code>stratify=y</code>. Sem isso, o sorteio aleatório poderia deixar o treino com 13% de gols e o teste com 7%, distorcendo a avaliação. Forçando a mesma proporção nos dois lados:</p><pre><code>Treino: 1.072 chutes  (10,6% gols)Teste:    358 chutes  (10,6% gols)</code></pre><p>Também fixei uma semente, <code>RANDOM_STATE=42</code>, declarada lá no início. O 42 é só um rótulo arbitrário pra posição de partida do sorteio. Com ele, toda vez que eu rodo o notebook o split dá o mesmo resultado, e eu consigo comparar mudanças sem que o acaso atrapalhe.</p><h3 id="marcelhrb-content-regressão-logística">Regressão logística</h3><p>Comecei pela regressão logística porque ela é simples, rápida e fácil de interpretar. Ela me diz, pelo sinal de cada coeficiente, em que direção cada feature empurra a probabilidade de gol.</p><pre><code class="hljs language-python">logreg = LogisticRegression(max_iter=<span class="hljs-number">1000</span>, random_state=RANDOM_STATE)logreg.fit(X_train, y_train)</code></pre><p>O <code>.fit()</code> é onde a mágica acontece. O modelo ajusta os coeficientes pra melhor mapear as features no rótulo. A regressão logística não tem fórmula fechada, ela acha os pesos por otimização iterativa: o solver vai refinando passo a passo até convergir.</p><p>Pensa que existe uma combinação ideal de pesos lá fora, e o trabalho do treino é encontrá-la por tentativa e erro inteligente. O <code>max_iter=1000</code> é dizer "dá no máximo mil passos". Se o solver chega no fundo do vale em 300 passos, ele para sozinho. Se bate em mil e ainda não chegou, ele para por esgotar o limite e o sklearn avisa que não convergiu. O padrão é 100, subir pra 1000 é dar mais fôlego.</p><p>Um detalhe que me pegou: features em escalas muito diferentes deixam esse vale deformado e o solver precisa de mais passos. A <code>distance</code> vai de 0 a uns 60, o <code>angle</code> de 0 a uns 3. Essa diferença de escala faz o caminho até o melhor valor ser mais tortuoso.</p><p>O resultado bateu com a intuição de futebol, o que foi o melhor sanity check possível:</p><ul><li>Cabeçada reduz a chance de gol. Faz sentido, cabeceio tem menos potência e precisão que chute de pé.</li><li>Sob pressão, menos gol. Correto.</li><li>Quanto mais longe, menos gol. Correto.</li><li>Contra-ataque aumenta a chance, defesa desorganizada gera chance mais limpa. Correto.</li><li>Ângulo mais aberto, mais chance. Correto.</li></ul><p>Os cinco coeficientes apontam pra direção que qualquer analista esperaria. Vale notar que <code>header</code> tem o valor mais negativo porque é binário, então o coeficiente é o efeito total de ser cabeçada contra não ser. Já a <code>distance</code> é contínua em metros, então o coeficiente é o efeito de cada metro a mais.</p><p>A limitação dela é que a regressão logística é linear, ela assume que cada feature soma seu efeito de forma independente. Mas o futebol tem interações: a distância importa de um jeito diferente dependendo do ângulo.</p><h3 id="marcelhrb-content-gradient-boosting">Gradient Boosting</h3><p>Pra atacar essa limitação, treinei um Gradient Boosting. Ele combina centenas de pequenas árvores de decisão, cada uma corrigindo os erros da anterior. A primeira árvore faz uma previsão grosseira, o modelo olha onde ela errou, a segunda foca em corrigir esses erros, a terceira corrige o que sobrou, e assim por diante.</p><pre><code class="hljs language-python">GradientBoostingClassifier(n_estimators=<span class="hljs-number">200</span>, max_depth=<span class="hljs-number">3</span>, learning_rate=<span class="hljs-number">0.1</span>)</code></pre><p>Três escolhas que parecem estranhas no começo: <code>n_estimators=200</code> são 200 árvores em sequência. <code>max_depth=3</code> deixa cada árvore rasa de propósito, porque no boosting você quer aprendizes fracos. Se cada árvore já fosse poderosa, ela decoraria o treino sozinha e o conjunto faria overfit. <code>learning_rate=0.1</code> faz cada árvore contribuir só com 10% da correção que faria, passos pequenos evitam que uma única árvore puxe tudo pra direção errada.</p><p>De bônus, o Gradient Boosting entrega de graça um ranking de importância das features, respondendo aquela pergunta que ficou aberta na logística: qual variável pesa mais?</p><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/oqPesa.png" alt="texto alternativo descrevendo a imagem"></p><p>O gráfico mostra uma coisa bonita e bem clara: o modelo de xG é, na essência, geométrico. Distância e ângulo dominam, header, pressão e contra-ataque são detalhes. É exatamente o que a literatura de xG diz há anos.</p><h3 id="marcelhrb-content-avaliação-treinou-não-é-a-mesma-coisa-que-é-bom">Avaliação: treinou não é a mesma coisa que é bom</h3><p>Aqui está o ponto mais importante de toda a parte supervisionada. "Treinou" não quer dizer "é bom". Avaliei os dois modelos no conjunto de teste, chutes que nenhum deles viu.</p><p>E <strong>não usei acurácia</strong>. Como só 11% dos chutes viram gol, um modelo que dissesse "nunca é gol" acertaria 89% e seria completamente inútil. Usei três métricas mais honestas:</p><ul><li><strong>Log-loss</strong> (menor é melhor): pune previsão confiante e errada. Se o modelo diz "90% de gol" e não é gol, leva punição pesada.</li><li><strong>ROC-AUC</strong> (maior é melhor): mede se o modelo sabe ordenar, se ele dá xG mais alto pros chutes que viraram gol. 0,5 é chute no escuro, 1,0 é separação perfeita.</li><li><strong>Brier</strong> (menor é melhor): o erro quadrático médio entre o xG previsto e o que aconteceu. Mede o quão perto o número bateu com a realidade.</li></ul><p>Cada modelo cospe a probabilidade de cada chute virar gol via <code>predict_proba(...)[:, 1]</code>, e o resultado foi:</p><pre><code>                       Log-loss   ROC-AUC   BrierRegressão Logística     0.2776     0.8108   0.0819Gradient Boosting       0.3049     0.7972   0.0919</code></pre><p>A parte mais visual da avaliação é a curva de calibração. A pergunta é direta: quando o modelo diz "0.3 de xG", esses chutes viram gol perto de 30% das vezes na vida real?</p><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/curvaModelos.png" alt="texto alternativo descrevendo a imagem"></p><p>O código agrupa os chutes em 10 faixas de xG e compara, em cada faixa, o xG médio que o modelo previu contra a fração que de fato virou gol. A diagonal tracejada é o ideal, previsto igual a realidade. Se a curva gruda na diagonal, o xG é confiável. Acima da linha, o modelo subestima. Abaixo, superestima. Pra xG isso é crucial, não basta ordenar certo, o número 0.3 tem que valer 0.3.</p><h3 id="marcelhrb-content-por-que-o-modelo-mais-simples-ganhou">Por que o modelo mais simples ganhou</h3><p>A regressão logística ganhou nas três métricas. E isso me ensinou algo que eu não esperava: modelo mais poderoso não é sempre melhor.</p><p>O Gradient Boosting brilha quando há relações complexas e não-lineares e muito dado pra alimentá-lo. Mas a relação do xG é suave e monotônica, mais distância significa menos gol de forma contínua e previsível. A logística modela isso com perfeição, é literalmente o formato pra que ela foi feita. O Gradient Boosting, com poucos dados de uma única copa, acabou dando confiança demais em chutes de alto xG e a bola não entrou na proporção prometida. Aquela queda da curva vermelha abaixo da diagonal no canto é o modelo mentindo sobre as melhores chances.</p><h3 id="marcelhrb-content-aplicando-o-xg-por-jogador">Aplicando: o xG por jogador</h3><p>Com a logística escolhida, calculei o xG de cada chute do dataset inteiro e somei por jogador. Aqui não tem métrica de performance sendo medida, eu só quero o melhor xG possível pra cada chute pra poder agregar.</p><p>E aí nasce a métrica-chave: <strong>gols reais menos xG esperado</strong>, o famoso G menos xG.</p><ul><li>Positivo, converteu mais do que as chances mereciam (bom finalizador, ou sortudo).</li><li>Negativo, desperdiçou chances.</li></ul><p>Isso me deu dois rankings que respondem perguntas diferentes. O <strong>maior xG acumulado</strong> mede volume de perigo criado, quem chega em boas posições de chute com frequência. A <strong>finalização acima do esperado</strong> mede eficiência, quem converte além do que a posição previa. Um jogador pode liderar um ranking e nem aparecer no outro.</p><p>Pra finalização eu filtrei só quem teve mais de 5 chutes. Sem esse piso, um zagueiro que deu 1 chute e fez 1 gol apareceria com overperformance altíssima e lideraria os finalizadores, puro ruído. Para ser honesto, 5 é um piso fraco, numa copa um jogador faz de 10 a 30 chutes no torneio todo, e essa é uma das limitações que eu reconheço no projeto.</p><hr><h2 id="marcelhrb-content-parte-b-perfis-táticos-não-supervisionado">Parte B: perfis táticos (não-supervisionado)</h2><p>Aqui muda a natureza do problema. Não existe rótulo, ninguém me diz o "estilo certo" de cada jogador. O trabalho é deixar o algoritmo achar estrutura sozinho.</p><h3 id="marcelhrb-content-métricas-por-90-minutos">Métricas por 90 minutos</h3><p>Resumi cada jogador num vetor de métricas táticas: passes-chave, passes progressivos, precisão de passe, pressões, recuperações, conduções, taxa de drible, taxa sob pressão e o xG por 90, esse último vindo do meu próprio modelo, não do StatsBomb.</p><p>Normalizei tudo por 90 minutos pra comparar quem jogou muito com quem jogou pouco de forma justa. Também removi os goleiros, 41 deles, porque eles bagunçavam os grupos. Sobraram 314 jogadores qualificados.</p><h3 id="marcelhrb-content-matriz-de-correlação-antes-de-agrupar">Matriz de correlação antes de agrupar</h3><p>Antes de jogar as métricas no K-Means, explorei como elas se relacionam. A ideia é garantir que cada métrica traz informação nova.</p><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/correlacao.png" alt="texto alternativo descrevendo a imagem"></p><p>Correlação perto de +1 quer dizer que as duas sobem juntas e medem quase a mesma coisa. Perto de 0, são independentes. Se duas métricas fossem quase idênticas, o K-Means daria peso dobrado àquela dimensão sem querer e distorceria os grupos.</p><p>O bonito é que as correlações ficaram em geral baixas, o que valida usar todas. E alguns pares que poderiam parecer redundantes mostraram que não são: quem faz gol não é necessariamente quem dá o passe pro gol (artilheiro contra armador), pressionar muito não garante recuperar a bola, e quem conduz muito não é quem dribla melhor.</p><h3 id="marcelhrb-content-k-means">K-Means</h3><p>O K-Means olha os jogadores como pontos num espaço (cada métrica é uma dimensão) e agrupa os que estão próximos entre si, por pura semelhança matemática, sem ideia nenhuma do que cada grupo significa.</p><p>Como ele mede distância, todas as métricas precisam estar na mesma escala, então apliquei <code>StandardScaler</code> antes. Escolhi quatro grupos por interpretabilidade. Estilos de jogo são um espectro contínuo, não caixas isoladas, então o que valida a escolha não é uma separação estatística perfeita e sim o quanto cada perfil faz sentido. Os quatro arquétipos que surgiram foram <strong>Construtor</strong>, <strong>Criador de jogo</strong>, <strong>Finalizador puro</strong> e <strong>Polivalentes</strong>.</p><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/perfiljogador.png" alt="texto alternativo descrevendo a imagem"></p><p>Vale uma confissão metodológica aqui: eu cheguei a olhar silhouette e elbow pra escolher o K, e eles não apoiavam K=4 de forma limpa. Troquei esses gráficos por um heatmap de centroides, que mostra a assinatura de cada perfil, porque pra estilo de jogo a interpretabilidade conta mais do que um número de corte. Foi uma decisão consciente, não um detalhe varrido pra debaixo do tapete.</p><h3 id="marcelhrb-content-os-radares">Os radares</h3><p>Pra mostrar na prática o que cada perfil significa, transformei cada jogador num gráfico de radar, uma espécie de impressão digital tática. Cada ponta é uma habilidade (finalização, passe-chave, progressão, pressão, recuperação, drible) e quanto mais perto da borda, mais o jogador se destaca naquilo. Normalizei pelo top 5% da copa, então encostar na borda significa estar em nível de elite do torneio naquela métrica.</p><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/radar.png" alt="texto alternativo descrevendo a imagem"></p><p>Olhando os radares lado a lado, dá pra ver na hora que são jogadores diferentes, um finalizador tem um formato, um criador tem outro, um construtor tem outro. O clustering achou isso sozinho, sem nunca saber a posição de ninguém.</p><hr><h2 id="marcelhrb-content-parte-c-integração-e-shortlist-icmc-scout">Parte C: integração e shortlist (ICMC-Scout)</h2><p>A última parte junta tudo, o xG supervisionado da Parte A e os perfis não-supervisionados da Parte B, numa camada de saída que apresenta os resultados. Aqui já não é mais ML, é integração e heurística, e eu faço questão de deixar isso explícito.</p><p>A tese de scouting por trás da shortlist é a parte de que mais me orgulho. As métricas usadas são todas de impacto sem gol: criação, progressão, defesa, condução. O gol não conta de propósito. Quem faz gol todo mundo vê e todo mundo valoriza, então não tem pechincha ali. O sistema foca no contrário, no trabalho invisível que não aparece no placar.</p><p>E o pulo do gato: cada jogador é comparado só com os parecidos com ele, dentro do próprio perfil tático que o clustering criou. Comparar um volante com um meia-atacante seria injusto. Comparando dentro do grupo, eu pergunto "esse jogador se destaca entre os iguais a ele?", e isso vira a nota de destaque no perfil (um z-score ponderado).</p><p>Os filtros finais resumem a tese:</p><ul><li>xG abaixo da média, ou seja, não chama atenção pelos gols.</li><li>Pelo menos 3 jogos completos, pra não ser sorte de quem jogou pouco.</li><li>Não é atacante puro, porque o valor de um atacante é o gol, não faz sentido procurá-lo aqui.</li></ul><p><img src="https://raw.githubusercontent.com/marcel1712/IA-images/refs/heads/main/resultado.png" alt="texto alternativo descrevendo a imagem"></p><p>O resultado é uma lista de jogadores que fazem muito pelo time de formas que o placar não mostra, cada um comparado com os do mesmo estilo. É o ICMC-Scout fazendo, em pequena escala e com dados abertos, o que os clubes fazem a portas fechadas.</p><hr><p>Fontes e ferramentas: StatsBomb Open Data (<code>statsbombpy</code>), scikit-learn, pandas e numpy. O contexto de scouting orientado a dados se apoia no histórico do Brentford e do Brighton e na lógica do Moneyball aplicada ao futebol.</p></div>]]></content:encoded>
            <author>MarcelHRB</author>
        </item>
        <item>
            <title><![CDATA[Pitch: Criei o Cepify, uma API gratuita de consulta de CEP (compatível com o ViaCEP)]]></title>
            <link>https://www.tabnews.com.br/10zinbr/criei-o-cepify-uma-api-gratuita-de-consulta-de-cep-compativel-com-o-viacep</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/10zinbr/criei-o-cepify-uma-api-gratuita-de-consulta-de-cep-compativel-com-o-viacep</guid>
            <pubDate>Thu, 18 Jun 2026 20:49:34 GMT</pubDate>
            <description><![CDATA[Há um tempo eu queria um projeto pra colocar a mão no Spring Boot 4 + Java 25 de verdade, e acabei resolvendo um incômodo pessoal: sempre que preciso de consulta de CEP, dependo de serviç...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Há um tempo eu queria um projeto pra colocar a mão no <strong>Spring Boot 4 + Java 25</strong> de verdade, e acabei<br>resolvendo um incômodo pessoal: sempre que preciso de consulta de CEP, dependo de serviços de terceiros que<br>às vezes caem ou limitam bastante. Então construí o <strong>Cepify</strong>, um webservice gratuito de consulta de CEP do<br>Brasil.</p><p>🔗 <a href="https://cepify.com.br" rel="nofollow">https://cepify.com.br</a></p><h2 id="10zinbr-content-o-que-ele-faz">O que ele faz</h2><ul><li>Consulta de CEP retornando <strong>JSON, XML e JSONP</strong></li><li><strong>Busca por endereço</strong> (UF / cidade / logradouro)</li><li><strong>Compatibilidade com o ViaCEP</strong>: tem rotas no mesmo formato (inclusive o <code>{"erro": "true"}</code> pra CEP<br>inexistente), então dá pra só trocar a URL base em código que já usa ViaCEP</li><li>Uma API REST "correta" também (<code>/v1/ceps/{cep}</code>), com <code>ETag</code>/<code>Cache-Control</code> e erros padronizados</li><li><strong>Sem cadastro e sem API key</strong>, com rate limit por IP</li></ul><h2 id="10zinbr-content-decisões-técnicas-que-achei-interessantes">Decisões técnicas que achei interessantes</h2><ul><li>A base tem <strong>~1,5 milhão de CEPs</strong>, carregada por um ETL que processa o <strong>e-DNE dos Correios</strong>. Atualizar<br>isso sem derrubar a base em produção deu um trabalho honesto.</li><li><strong>Cache</strong> com Caffeine na frente das consultas (o serviço é muito mais leitura do que escrita) — deixou as<br>respostas bem rápidas.</li><li><strong>Observabilidade por log</strong>, não por tabela: cada request vira uma linha de log de acesso em JSON +<br>métricas no Prometheus. Pra um serviço read-heavy, e pensando em LGPD, achei mais saudável do que gravar<br>tudo em banco.</li><li>Documentação via <strong>Swagger/OpenAPI</strong>.</li></ul><p>Stack resumida: Spring Boot 4, Java 25, PostgreSQL, Caffeine, Flyway, atrás da Cloudflare.</p><h2 id="10zinbr-content-sobre-o-projeto">Sobre o projeto</h2><p>É um <strong>projeto pessoal</strong> e gratuito — não tem SLA nem promessa de uptime empresarial, mas está no ar e<br>funcionando. Fiz porque acho útil e porque foi um ótimo exercício com a stack nova.</p><p>Se quiserem testar e me dar feedback, agradeço demais. Em especial: <strong>o que vocês esperariam de uma API de<br>CEP que o ViaCEP (ou outras) não entrega hoje?</strong> Estou pensando nos próximos passos e queria ouvir quem usa<br>isso no dia a dia.</p></div>]]></content:encoded>
            <author>10zinbr</author>
        </item>
        <item>
            <title><![CDATA[CNPJ e Receita Federal Novo FoRmAtO.]]></title>
            <link>https://www.tabnews.com.br/TIGuy/cnpj-e-receita-federal-novo-formato</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/TIGuy/cnpj-e-receita-federal-novo-formato</guid>
            <pubDate>Thu, 18 Jun 2026 17:22:42 GMT</pubDate>
            <description><![CDATA[A Receita Federal publicou em outubro de 2024 a Instrução Normativa RFB nº 2.229, anunciando uma importante alteração no formato do CNPJ, que incluirá letras e números a partir de julho d...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A Receita Federal publicou em outubro de 2024 a Instrução Normativa RFB nº 2.229, anunciando uma importante alteração no formato do CNPJ, que incluirá letras e números a partir de julho de 2026.</p><p>Então e um tema tanto quanto antigo mas o pessoal que trabalha com sistema legado ai ja se adaptou? esta bem perto agora.</p></div>]]></content:encoded>
            <author>TIGuy</author>
        </item>
        <item>
            <title><![CDATA[Sim, eu faço gambiarras em shellscript]]></title>
            <link>https://www.tabnews.com.br/Silva97/sim-eu-faco-gambiarras-em-shellscript</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/Silva97/sim-eu-faco-gambiarras-em-shellscript</guid>
            <pubDate>Thu, 18 Jun 2026 15:23:05 GMT</pubDate>
            <description><![CDATA[Isso não é um conteúdo educativo, só quero compartilhar uma das coisas que eu sempre gostei de fazer: gambiarras em shellscript. Essa paixão começou no Batch - shellscript do Windows, aqu...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Isso não é um conteúdo educativo, só quero compartilhar uma das coisas que eu sempre gostei de fazer: gambiarras em shellscript.</p><p>Essa paixão começou no Batch - shellscript do Windows, aquele arcaico que veio antes do Powershell. Batch era bastante limitado e até coisas simples, como printar um texto colorido, exigia fazer gambiarras. Hoje em dia eu uso Linux e faço gambiarras em Bash.</p><p>Vou falar abaixo de algumas das gambiarras que eu mais gostei de fazer (o que não significa que sejam bem feitas).</p><h2 id="silva97-content-superset-de-batch">Superset de Batch</h2><p>Obs.: Eu excluí esse projeto há muitos anos atrás.</p><p>Em 2016 eu desenvolvi um <em>superset</em> de Batch, cujo o crime está eternamente registrado no batch-satti: <a href="https://batch-satti.forumeiros.com/t3382-projeto-batch-construct-compilador-batch" rel="nofollow">https://batch-satti.forumeiros.com/t3382-projeto-batch-construct-compilador-batch</a></p><p>O <em>superset</em> permitia escrever códigos como este:</p><pre><code>#include "io.bat":start    printc 0A "Ola " 09 "mundo!" \n    #quit</code></pre><p>E o resultado era um texto colorido impresso na tela:</p><p><img src="https://i.imgur.com/0mtAea3.png" alt=""></p><p>Ou esse outro troço feio aqui:</p><pre><code>#declare sqr:start    echo Resultado: {sqr 9} >tst.txt        echo O conteudo do arquivo tst.txt^> $(type tst.txt)    #quit:sqr    #return {(%~1)*(%~1)}</code></pre><p>Que resultava nisso:</p><p><img src="http://i.imgur.com/idnV9DO.png" alt=""></p><p>O objetivo do projeto era simples: converter arquivos <code>.bat</code> em arquivos executáveis, só que com recursos extras (daí o motivo de ter virado um <em>superset</em>).</p><p>Era um projeto mal feito, mas a parte mais interessante é que o executável de saída tinha apenas 3 KB. Pois eu não criava um auto extrator como outros projetos semelhantes faziam, eu montava o executável do zero em assembly usando o FASM.</p><p>Outra coisa interessante é que o <em>superset</em> permitia executar Powershell entre as diretivas <code>#ps</code> e <code>#endps</code>. O que não deveria ser possível, pois por motivos de segurança o Windows bloqueia a execução de scripts Powershell. Mas na época eu bolei um jeito de fazer <em>bypass</em> nisso e conseguia rodar o script sem precisar ter a execução de scripts Powershell liberada no sistema do usuário.</p><p>Tudo na base da mais pura gambiarra. O texto colorido era impresso com uma gambiarra usando <code>findstr</code>, o Powershell era executado usando uma gambiarra para dar <em>bypass</em> na restrição de segurança, o próprio código do projeto compilava o <em>superset</em> para Batch usando a mais pura gambiarra (eu não tinha muita experiência escrevendo compiladores na época). E depois gerava um executável pequeno gambiarrado em assembly.</p><p>Não vou mentir, foi legal fazer esse projeto e brincar de escrever executáveis em um Batch tunado. :D</p><h2 id="silva97-content-dsl-em-bash">DSL em Bash</h2><p>Ferramentas para templates de arquivos de texto é bem comum... Mas e que tal uma ferramenta para templates de arquivos binário? Para suprir essa ideia <em>nonsense</em> que eu fiz uma DSL (<em>Domain-Specific Language</em>) implementada em Bash. O script pode ser lido aqui: <a href="https://github.com/Silva97/cli-tools/blob/master/new">https://github.com/Silva97/cli-tools/blob/master/new</a></p><p>Como já deu para notar, eu gosto de inventar linguagens. Por mais esquisito e sem utilidade que seja, meu script Bash consegue interpretar um código como o abaixo e gerar um binário ELF a partir dele:</p><pre><code>if .out == "/dev/stdout"    error "Please specifie 'out' file. This is a binary file not text."    helpendifset max = "2048"set max = .max    # Maximum size of the file## ELF header ##x    7f 45 4c 46 # Magic numberx    02          # Classx    01          # Datax    01          # Versionx    01          # OS ABIx    00          # ABI Versiondump 7           # Reservedb16 2          # Typeb16 0x3e       # Machineb32 1          # Versionb64 0x401078   # Entry pointb64 64         # Program header offsetb64 0xffffffff # Section header offsetb32 0          # Flagsb16 64         # ELF header sizeb16 56         # Program header entry sizeb16 1          # Program header countb16 64         # Section header entry sizeb16 2          # Section header countb16 1          # Section header strtab section index## Program header ### Entry 0b32 1          # Type (load)b32 7          # Flags (0b111 = RWX)b64 0          # Offsetb64 0x401000   # Virtual addressb64 0x401000   # Physical addressb64 $max       # In file sizeb64 $max       # In memory sizeb64 0          # Alignment## Code ##align 120if .file    file .fileelif .code    str .code    x 90              # NOP    x b8 3c 00 00 00  # mov eax, 60    x 31 ff           # xor edi, edi    x 0f 05           # syscallelse    error "Please specifie a 'file' or 'code' option."    helpendifif $size > $max    error "Maximum size exceeded."    helpendif</code></pre><p>O binário resultante é propositalmente capado para ficar bem pequeno. Um hello world como este:</p><pre><code class="hljs language-x86asm">org  0x401078bits 64mov rax, 1mov rdi, 1mov rsi, txtmov rdx, TSIZEsyscallmov rax, 60xor rdi, rdisyscalltxt:  db  `Hello World!\n\0`TSIZE equ $-txt</code></pre><p>Pode ser inserido em um binário ELF assim:</p><pre><code>$ nasm hello.asm -o hello$ new bin-elf64 file=hello out=test</code></pre><p>E o arquivo binário <code>test</code> de saída seria um ELF de apenas 171 bytes de tamanho.</p><hr><p>Também já fiz outras gambiarras interessantes, mas que prefiro não mostrar. Como o <code>valva</code>, que era um projeto de gerenciador de pacotes para Bash... Feito em Bash. Incluindo ferramentas de build e execução de testes.</p><p>Vocês já fizeram projetos malucos assim em shellscript? Estou curioso para saber das gambiarras da galera. Compartilha aí nos comentários. :D</p></div>]]></content:encoded>
            <author>Silva97</author>
        </item>
        <item>
            <title><![CDATA[Descontinuação do "X-" em cabeçalhos HTTP personalizados, porquê isso é importante para você e o que fazer (RFC 6648).]]></title>
            <link>https://www.tabnews.com.br/allbertuu/descontinuacao-do-x-em-cabecalhos-http-personalizados-porque-isso-e-importante-para-voce-e-o-que-fazer-rfc-6648</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/allbertuu/descontinuacao-do-x-em-cabecalhos-http-personalizados-porque-isso-e-importante-para-voce-e-o-que-fazer-rfc-6648</guid>
            <pubDate>Thu, 18 Jun 2026 14:58:13 GMT</pubDate>
            <description><![CDATA[Historicamente, desenvolvedores utilizaram prefixos como "X-" para distinguir parâmetros padronizados de não padronizados como, por exemplo, criando cabeçalhos (headers) HTTP personalizad...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Historicamente, desenvolvedores utilizaram prefixos como "X-" para distinguir parâmetros padronizados de não padronizados como, por exemplo, criando cabeçalhos (headers) HTTP personalizados. É uma maneira de dizer, no próprio nome, que aquele parâmetro não segue uma especificação ou processo padronizado. E essa é uma prática bastante comum no desenvolvimento.</p><blockquote><p>Por curiosidade, "X-" seria uma forma de dizer "eXperimental" ou "eXtension".</p></blockquote><p>Porém, na prática, essa convenção traz mais problemas do que resolve - mais detalhes sobre os problemas você encontra no link ao final da RFC. E, por isso, em 2012 essa convenção foi descontinuada através da RFC 6648.</p><p>Me chamo Alberto Santos, desenvolvedor Front-End há 4 anos, e vou te explicar brevemente quais as implicações disso e quais as ações que você deveria tomar a partir de hoje. Vamos lá!</p><p>Primeiro, o documento da RFC traz recomendações específicas sobre como proceder sem essa distinção (falo quais mais a frente) - um ponto que achei crucial. E, na minha opinião, o mais interessante: eles não fazem nenhuma recomendação se os parâmetros "X-" existentes devem permanecer em uso ou serem migrados para um formato sem o "X-". Segundo o documento "isso é uma questão para os criadores ou responsáveis ​​pela manutenção desses parâmetros."</p><p>Isso reforça o comprometimento da RFC - e dos autores - com a estabilidade, continuidade e ponderação ao promover mudanças no ambiente de desenvolvimento das aplicações. Essa mentalidade do desenvolvedor é essencial, e busco cultivá-la em mim mesmo e onde trabalho.</p><p>Segundo, eles trazem algumas recomendações, e eu trouxe aqui as mais relevantes e práticas para o dia a dia do dev:</p><ul><li><p>Deveriam assumir que todos os parâmetros que criam podem se tornar padronizados ou públicos em algum momento no futuro -> esse, inclusive, pode ter sido o maior motivo para essa descontinuação</p></li><li><p>Deveriam utilizar nomes significativos - principalmente se em sua opinião eles estejam sem uso</p></li><li><p>Não deveriam prefixar seus nomes de parâmetros com "X-" ou construções similares</p></li></ul><hr><p>Por fim, a RFC traz a "melhor prática atual" (aliás, esse é o nome da categoria deste RFC) em relação a prefixos e construções similares na nomeação de parâmetros usados em protocolos, não sendo, por consequência, uma regra definitiva e autoritária, mas sim recomendações que garantirão a estabilidade, segurança e eficiência na manutenção da comunicação de protocolos.</p><p>Se gostou desse tipo de conteúdo, deixa seu up-vote e/ou um comentário sobre sua vivência com prefixos "X-" em headers personalizados, pois isso me ajuda a continuar trazendo esses conteúdos mais técnicos e relevantes que eu normalmente estudo.</p><p>Obrigado!</p><hr><p>Links relevantes:</p><ul><li><p><a href="https://datatracker.ietf.org/doc/html/rfc6648" rel="nofollow">https://datatracker.ietf.org/doc/html/rfc6648</a></p></li><li><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Reference/Headers" rel="nofollow">https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Reference/Headers</a></p></li></ul></div>]]></content:encoded>
            <author>allbertuu</author>
        </item>
        <item>
            <title><![CDATA[Google, Microsoft, OpenAI, Arm e Mastercard apoiam iniciativa da Linux Foundation para padronizar avaliação de sistemas de IA]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/google-microsoft-openai-arm-e-mastercard-apoiam-iniciativa-da-linux-foundation-para-padronizar-avaliacao-de-sistemas-de-ia</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/google-microsoft-openai-arm-e-mastercard-apoiam-iniciativa-da-linux-foundation-para-padronizar-avaliacao-de-sistemas-de-ia</guid>
            <pubDate>Thu, 18 Jun 2026 14:51:01 GMT</pubDate>
            <description><![CDATA[A Appia Foundation busca criar especificações e estruturas de avaliação comuns para comprovar que sistemas de IA atendem a novos requisitos de segurança, confiabilidade e conformidade. A...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A Appia Foundation busca criar especificações e estruturas de avaliação comuns para comprovar que sistemas de IA atendem a novos requisitos de segurança, confiabilidade e conformidade. A iniciativa também permitirá o reaproveitamento de evidências de conformidade em toda a cadeia de fornecimento de IA, reduzindo avaliações duplicadas e custos para as organizações.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Jeff Bezos acredita que IA causará escassez de mão de obra em vez de substituir humanos]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/jeff-bezos-acredita-que-ia-causara-escassez-de-mao-de-obra-em-vez-de-substituir-humanos</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/jeff-bezos-acredita-que-ia-causara-escassez-de-mao-de-obra-em-vez-de-substituir-humanos</guid>
            <pubDate>Thu, 18 Jun 2026 14:46:01 GMT</pubDate>
            <description><![CDATA[Ele discorda da ideia de que a tecnologia tornará a humanidade redundante e argumenta que as pessoas têm uma quantidade “infinita” de tarefas para realizar, atualmente limitadas por barre...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Ele discorda da ideia de que a tecnologia tornará a humanidade redundante e argumenta que as pessoas têm uma quantidade “infinita” de tarefas para realizar, atualmente limitadas por barreiras que a IA ajudaria a reduzir.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[ChatGPT ganha central para visualizar tarefas agendadas]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/chatgpt-ganha-central-para-visualizar-tarefas-agendadas</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/chatgpt-ganha-central-para-visualizar-tarefas-agendadas</guid>
            <pubDate>Thu, 18 Jun 2026 14:41:00 GMT</pubDate>
            <description><![CDATA[A nova aba “Agendado”, acessível pela barra lateral, permite consultar solicitações ativas e os horários programados para execução, além de pausar, editar ou excluir tarefas futuras. O re...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A nova aba “Agendado”, acessível pela barra lateral, permite consultar solicitações ativas e os horários programados para execução, além de pausar, editar ou excluir tarefas futuras. O recurso também permite definir períodos específicos para execução, como manhã, tarde ou noite, e criar monitoramentos para que o chatbot pesquise proativamente na web ou em aplicativos conectados. A novidade está sendo liberada para clientes Plus, Pro, Business e Enterprise, ainda sem previsão de chegada ao plano gratuito.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Brasil investirá 13 milhões de reais para formar cientistas de dados]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/brasil-investira-13-milhoes-de-reais-para-formar-cientistas-de-dados</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/brasil-investira-13-milhoes-de-reais-para-formar-cientistas-de-dados</guid>
            <pubDate>Thu, 18 Jun 2026 14:36:00 GMT</pubDate>
            <description><![CDATA[O projeto “Ciência de Dados pelo Brasil”, com execução prevista para 36 meses, tem como objetivo capacitar profissionais para apoiar o Governo na tomada de decisões, mapear investimentos...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O projeto “Ciência de Dados pelo Brasil”, com execução prevista para 36 meses, tem como objetivo capacitar profissionais para apoiar o Governo na tomada de decisões, mapear investimentos em pesquisa e avaliar os resultados.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Apple corrige falha grave nos Beats Studio Buds que permitia espionagem de conversas]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/apple-corrige-falha-grave-nos-beats-studio-buds-que-permitia-espionagem-de-conversas</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/apple-corrige-falha-grave-nos-beats-studio-buds-que-permitia-espionagem-de-conversas</guid>
            <pubDate>Thu, 18 Jun 2026 14:30:59 GMT</pubDate>
            <description><![CDATA[A vulnerabilidade CVE-2025-20701 dava a um invasor dentro do alcance do Bluetooth a capacidade de ouvir pelo microfone de um dispositivo ainda não pareado enquanto ele buscava solicitaçõe...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A vulnerabilidade CVE-2025-20701 dava a um invasor dentro do alcance do Bluetooth a capacidade de ouvir pelo microfone de um dispositivo ainda não pareado enquanto ele buscava solicitações de conexão. O problema foi corrigido com o firmware 1B211, distribuído automaticamente aos fones quando estiverem pareados e próximos de um iPhone, iPad ou Mac.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Exigência da Apple de usar WebKit do Safari deixa navegadores no iPhone mais lentos, segundo Microsoft]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/exigencia-da-apple-de-usar-webkit-do-safari-deixa-navegadores-no-iphone-mais-lentos-segundo-microsoft</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/exigencia-da-apple-de-usar-webkit-do-safari-deixa-navegadores-no-iphone-mais-lentos-segundo-microsoft</guid>
            <pubDate>Thu, 18 Jun 2026 14:25:58 GMT</pubDate>
            <description><![CDATA[Em testes realizados no Speedometer 3.1, uma versão experimental do Edge para iOS desenvolvida com o BrowserEngineKit, framework lançado pela Apple que permite a criação de navegadores co...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Em testes realizados no Speedometer 3.1, uma versão experimental do Edge para iOS desenvolvida com o BrowserEngineKit, framework lançado pela Apple que permite a criação de navegadores com motores diferentes do WebKit por desenvolvedores europeus, teria alcançado 49,2 pontos, 28% acima do Safari.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Projeto de Lei quer incentivar instalação de data centers no Brasil]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/projeto-de-lei-quer-incentivar-instalacao-de-data-centers-no-brasil</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/projeto-de-lei-quer-incentivar-instalacao-de-data-centers-no-brasil</guid>
            <pubDate>Thu, 18 Jun 2026 14:20:58 GMT</pubDate>
            <description><![CDATA[O PL 1.680/2025 estabelece prioridade de acesso à rede elétrica para instalações em regiões com disponibilidade ampla de energia. Além disso, as próprias empresas poderão financiar obras...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O PL 1.680/2025 estabelece prioridade de acesso à rede elétrica para instalações em regiões com disponibilidade ampla de energia. Além disso, as próprias empresas poderão financiar obras necessárias para ampliar a conexão com a rede, como instalação de torres e cabos, sem repassar esses custos para a conta de luz da população. A proposta também permite que o país hospede dados críticos de outros países sem aplicação de algumas normas brasileiras, como partes da LGPD.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[STF decide que redes sociais serão responsabilizadas por danos morais e materiais decorrentes de conteúdos publicados pelos usuários]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/stf-decide-que-redes-sociais-serao-responsabilizadas-por-danos-morais-e-materiais-decorrentes-de-conteudos-publicados-pelos-usuarios</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/stf-decide-que-redes-sociais-serao-responsabilizadas-por-danos-morais-e-materiais-decorrentes-de-conteudos-publicados-pelos-usuarios</guid>
            <pubDate>Thu, 18 Jun 2026 14:15:57 GMT</pubDate>
            <description><![CDATA[As plataformas deverão implementar sistemas mais eficientes para identificar e remover conteúdos ilegais, e adotar medidas preventivas sem depender de uma ordem judicial, além de manter u...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>As plataformas deverão implementar sistemas mais eficientes para identificar e remover conteúdos ilegais, e adotar medidas preventivas sem depender de uma ordem judicial, além de manter um representante legal no Brasil para responder à Justiça. As empresas terão 60 dias para se adequar às novas regras, sem possibilidade de recurso. Antes da decisão, as redes sociais só poderiam ser responsabilizadas caso descumprissem uma determinação judicial de remoção de conteúdo.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Meta estaria enfrentando um dos piores níveis de satisfação dos funcionários de sua história]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/meta-estaria-enfrentando-um-dos-piores-niveis-de-satisfacao-dos-funcionarios-de-sua-historia</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/meta-estaria-enfrentando-um-dos-piores-niveis-de-satisfacao-dos-funcionarios-de-sua-historia</guid>
            <pubDate>Thu, 18 Jun 2026 14:10:56 GMT</pubDate>
            <description><![CDATA[Segundo uma conversa interna com o CTO Andrew Bosworth, a equipe estaria com baixa moral após demissões recentes e o remanejamento de colaboradores para treinar modelos de IA, incluindo o...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Segundo uma conversa interna com o CTO Andrew Bosworth, a equipe estaria com baixa moral após demissões recentes e o remanejamento de colaboradores para treinar modelos de IA, incluindo o monitoramento de movimentos do mouse e pressionamentos de teclas em seus computadores. A liderança agora busca reverter o cenário, permitindo que funcionários transferidos para a força-tarefa de IA voltem a se candidatar a outras vagas e ampliando benefícios.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Midjourney, empresa de geração de imagens por IA, estreia na área da saúde com scanner de ultrassom de corpo inteiro]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/midjourney-empresa-de-geracao-de-imagens-por-ia-estreia-na-area-da-saude-com-scanner-de-ultrassom-de-corpo-inteiro</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/midjourney-empresa-de-geracao-de-imagens-por-ia-estreia-na-area-da-saude-com-scanner-de-ultrassom-de-corpo-inteiro</guid>
            <pubDate>Thu, 18 Jun 2026 14:05:56 GMT</pubDate>
            <description><![CDATA[O dispositivo usa um anel de sensores para capturar cortes verticais do interior do corpo e gerar imagens 3D detalhadas, sendo projetado inicialmente para analisar a composição de músculo...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O dispositivo usa um anel de sensores para capturar cortes verticais do interior do corpo e gerar imagens 3D detalhadas, sendo projetado inicialmente para analisar a composição de músculos, gordura, ossos e órgãos, em um processo no qual a pessoa sobe em uma plataforma que desce dentro da água. Segundo o CEO David Holz, a ideia é oferecer imagens com qualidade comparável à de uma ressonância magnética.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Epic Games lança sistema semelhante ao Git voltada a jogos e softwares de entretenimento]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/epic-games-lanca-sistema-semelhante-ao-git-voltada-a-jogos-e-softwares-de-entretenimento</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/NewsletterOficial/epic-games-lanca-sistema-semelhante-ao-git-voltada-a-jogos-e-softwares-de-entretenimento</guid>
            <pubDate>Thu, 18 Jun 2026 14:00:55 GMT</pubDate>
            <description><![CDATA[O Lore foi desenvolvido para projetos modernos com arquivos grandes, como binários, oferecendo recursos de controle de versão, resolução de conflitos, commits e branches. O projeto foi es...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O Lore foi desenvolvido para projetos modernos com arquivos grandes, como binários, oferecendo recursos de controle de versão, resolução de conflitos, commits e branches. O projeto foi escrito em Rust e está disponível no repositório “EpicGames/lore” no GitHub.</p></div>]]></content:encoded>
            <author>NewsletterOficial</author>
        </item>
        <item>
            <title><![CDATA[Pitch Cloudx.work Front-end, Back-end e Banco de Dados em uma única plataforma, com servidores no Brasil e EUA]]></title>
            <link>https://www.tabnews.com.br/redenflu/pitch-cloudx-work-front-end-back-end-e-banco-de-dados-em-uma-unica-plataforma-com-servidores-no-brasil-e-eua</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/redenflu/pitch-cloudx-work-front-end-back-end-e-banco-de-dados-em-uma-unica-plataforma-com-servidores-no-brasil-e-eua</guid>
            <pubDate>Thu, 18 Jun 2026 13:18:32 GMT</pubDate>
            <description><![CDATA[Quem trabalha com desenvolvimento moderno já passou por isso: Front-end hospedado em um serviço API em outro provedor Banco de dados em uma terceira plataforma Cobranças separadas em dóla...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Quem trabalha com desenvolvimento moderno já passou por isso:</p><ul><li>Front-end hospedado em um serviço</li><li>API em outro provedor</li><li>Banco de dados em uma terceira plataforma</li><li>Cobranças separadas em dólar</li><li>Latência entre aplicações</li><li>Infraestrutura espalhada em diversos painéis</li></ul><p>Embora esse modelo funcione, ele também aumenta a complexidade operacional e os custos conforme o projeto cresce.</p><p>Foi justamente observando esse cenário que nasceu a Cloudx.work</p><h2 id="redenflu-content-a-proposta">A proposta</h2><p>A Cloudx.work é uma plataforma de deploy focada em simplificar a publicação e gerenciamento de aplicações modernas.</p><p>A ideia é permitir que desenvolvedores e empresas mantenham Front-end, Back-end e Banco de Dados em um único ambiente, utilizando uma única cobrança mensal em reais.</p><p>Entre as tecnologias suportadas estão aplicações:</p><ul><li>Node.js</li><li>Laravel</li><li>PHP</li><li>React</li><li>Vue.js</li><li>Angular</li><li>PostgreSQL</li><li>MySQL</li><li>MongoDB</li></ul><p>Tudo centralizado em um único painel.</p><h2 id="redenflu-content-infraestrutura-no-brasil-e-estados-unidos">Infraestrutura no Brasil e Estados Unidos</h2><p>Um dos diferenciais da plataforma é a possibilidade de escolher onde sua aplicação será executada.</p><p>Os ambientes estão disponíveis tanto em servidores localizados no Brasil quanto nos Estados Unidos, permitindo adequar a infraestrutura ao público-alvo do projeto.</p><p>Para aplicações voltadas ao mercado brasileiro, a hospedagem nacional contribui para reduzir a latência e melhorar a experiência dos usuários.</p><p>Já projetos globais podem optar pela infraestrutura internacional.</p><h2 id="redenflu-content-deploy-simplificado">Deploy simplificado</h2><p>Outro ponto importante é a integração com repositórios Git.</p><p>Ao conectar o projeto ao GitHub, o processo de atualização se torna muito mais simples.</p><p>Novas versões podem ser publicadas rapidamente sem a necessidade de acessar servidores manualmente ou configurar processos complexos de implantação.</p><h2 id="redenflu-content-menos-ferramentas-mais-produtividade">Menos ferramentas, mais produtividade</h2><p>Nos últimos anos vimos um crescimento enorme de plataformas especializadas.</p><p>Uma para o front-end.</p><p>Outra para APIs.</p><p>Outra para banco de dados.</p><p>Outra para monitoramento.</p><p>Embora cada solução tenha seu valor, muitos projetos acabam sofrendo com excesso de ferramentas e aumento de custos operacionais.</p><p>A proposta da <a href="url">Cloudx.work</a> é justamente reduzir essa fragmentação, permitindo que aplicações completas sejam executadas em uma única plataforma, com cobrança em reais, suporte em português e infraestrutura disponível tanto no Brasil quanto nos Estados Unidos.</p><p>Para equipes que buscam simplicidade operacional sem abrir mão de tecnologias modernas, esse modelo pode representar uma alternativa interessante ao cenário tradicional de múltiplos provedores.</p></div>]]></content:encoded>
            <author>redenflu</author>
        </item>
        <item>
            <title><![CDATA[Como causar impacto com SSRF]]></title>
            <link>https://www.tabnews.com.br/Silva97/como-causar-impacto-com-ssrf</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/Silva97/como-causar-impacto-com-ssrf</guid>
            <pubDate>Thu, 18 Jun 2026 13:04:21 GMT</pubDate>
            <description><![CDATA[O desenvolvedor permite que o cliente dispare uma requisição a partir de um servidor dele. Seja para um webhook na plataforma dele, seja de outra forma, mas o ponto é: O usuário tem contr...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O desenvolvedor permite que o cliente dispare uma requisição a partir de um servidor dele. Seja para um webhook na plataforma dele, seja de outra forma, mas o ponto é: O usuário tem controle da URL para onde uma requisição será disparada a partir do servidor.</p><p>Exemplo: digamos que o usuário consiga criar um webhook que o servidor da aplicação dispara quando um determinado evento na plataforma acontece.</p><p>Essa é a premissa para uma vulnerabilidade chamada SSRF (Server-Side Request Forgery), que é quando um atacante consegue controlar/manipular uma requisição disparada pelo servidor.</p><p>Isso pode até parecer inofensivo por quem não tem muito domínio de redes, mas essa pode ser uma vulnerabilidade crítica que pode até mesmo permitir uma execução remota de código, burlar firewalls, vazar credenciais entre outras coisas.</p><h2 id="silva97-content-cloud-provider-metadata">Cloud provider metadata</h2><p>Começando com o impacto mais comum de ocorrer na vida real: Cloud providers como Google Cloud (GCP) e AWS expõem uma API de metadados para as instâncias em execução. Por exemplo: a partir de uma instância da GCP, se você enviar uma requisição para <code>http://metadata.google.internal/computeMetadata/v1</code> você obterá os metadados daquela instância.</p><p>Nesses metadados há dados sensíveis, incluindo uma credencial de acesso que dá acesso ao GCP com o nível de acesso que você tiver configurado para a instância. Por padrão, esse acesso é <strong>bastante</strong> permissivo.</p><p>Explorando um SSRF, um atacante pode obter essa credencial e conseguir acesso ao seu cloud provider, incluindo (se estiver com as permissões padrão) acesso a todos os seus servidores e bancos de dados.</p><h2 id="silva97-content-serviços-internos">Serviços internos</h2><p>Também é possível usar SSRF para interagir com serviços internos que não estejam com nenhuma proteção via autenticação, o que é comum de ocorrer em ambientes reais porque as pessoas pensam: "só dá para acessar por rede interna, não precisa de autenticação".</p><p>Por exemplo: O serviço do Docker funciona com uma API REST HTTP, você pode usar SSRF para iniciar e controlar containers Docker. Incluindo montar volumes dentro do container, dando acesso ao sistema de arquivos da máquina real a partir do container.</p><h2 id="silva97-content-protocolos-sensíveis">Protocolos sensíveis</h2><p>Você pode usar SSRF para ler arquivos em disco usando protocolos como <code>file://</code> ou <code>ftp://</code>. Se a aplicação for em PHP, em alguns cenários específicos você pode usar o pseudo-protocolo <code>php://</code> com várias finalidades, incluindo a leitura de arquivos.</p><p>O protocolo <code>gopher://</code> permite enviar pacotes TCP com conteúdo totalmente personalizado. Isso permite interagir com qualquer serviço TCP que não usa HTTP, como é o caso do Redis. Mas para isso ser possível, vai depender da tecnologia usada no backend suportar o schema <code>gopher</code>. O curl suporta, por exemplo.</p><p>Uma requisição como <code>gopher://127.0.0.1:6379/_KEYS%20*%0d%0a</code> poderia ser usada para enviar o comando <code>KEYS *</code> para o Redis.</p><h2 id="silva97-content-deny-list-bypass">Deny list bypass</h2><p>Um erro comum de desenvolvedores é evitar requisições sensíveis fazendo uma lista de IPs e domínios que não devem ser aceitos na URL. Por exemplo, negar coisas como: 127.0.0.1, localhost, metadata.google.internal etc.</p><p>Isso é tão útil quanto não fazer nada. Aulinha rápida de DNS: Você pode criar um registro A apontando para qualquer IP que você quiser... Qualquer IP... Literalmente qualquer IP, incluindo IP de rede interna e 127.0.0.1.</p><p>Então se sua aplicação nega 127.0.0.1 e localhost, de nada adianta. O atacante cria um registro A como <code>tepeguei.exemplo.com</code> apontando para <code>127.0.0.1</code> e pronto: quando seu app resolver esse domínio ele irá apontar para o localhost.</p><p>Também é possível criar um registro CNAME apontando para domínios internos como <code>metadata.google.internal</code> e o resultado seria o mesmo: seu app resolveria para o domínio interno e a sua <em>deny list</em> ficaria só como enfeite.</p><h1 id="silva97-content-mitigação">Mitigação</h1><p>Obrigue o uso de protocolos específicos como <code>http://</code> e <code>https://</code>. Depois disso, não dispare a requisição a partir de uma máquina com acesso livre à sua rede interna. Faça <em>network isolation</em> na máquina, VM/MicroVM ou container onde a requisição controlada pelo usuário irá ser disparada.</p><p>Use firewall para impedir requisições para a rede interna e API de metadados do cloud provider, bloquear protocolos e tudo mais. Limite o acesso à rede o máximo que for possível limitar sem quebrar a funcionalidade da aplicação.</p></div>]]></content:encoded>
            <author>Silva97</author>
        </item>
        <item>
            <title><![CDATA[O modelo maior mente melhor: por que o Sonnet inventa com mais confiança que o Haiku]]></title>
            <link>https://www.tabnews.com.br/kenimo49/o-modelo-maior-mente-melhor-por-que-o-sonnet-inventa-com-mais-confianca-que-o-haiku</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/kenimo49/o-modelo-maior-mente-melhor-por-que-o-sonnet-inventa-com-mais-confianca-que-o-haiku</guid>
            <pubDate>Thu, 18 Jun 2026 12:00:03 GMT</pubDate>
            <description><![CDATA[A conclusão primeiro, porque eu odeio quando o artigo segura o final por seiscentas palavras: o modelo mais potente não é o mais confiável. É o que mente melhor. Eu medi isso com duas not...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A conclusão primeiro, porque eu odeio quando o artigo segura o final por seiscentas palavras: o modelo mais potente não é o mais confiável. É o que mente melhor. Eu medi isso com duas notas que não fazem sentido juntas até você olhar de perto: o Sonnet 4 tirou 4,2 de 5 em Specificity e 0,6 de 5 em Factual Accuracy sobre uma ferramenta que eu inventei. Detalhe nota máxima, verdade nota zero.</p><p>Eu passei um tempo achando que estava fazendo a coisa certa ao trocar o modelo barato pelo modelo caro toda vez que a resposta "precisava ser séria". A lógica parecia óbvia. Modelo grande sabe mais, então erra menos. Eu estava certo na primeira metade e ingenuamente errado na segunda. Sabe mais, sim. Erra com muito mais elegância, também.</p><h2 id="kenimo49-content-o-teste-uma-ferramenta-que-não-existe">O teste: uma ferramenta que não existe</h2><p>Eu inventei uma ferramenta de autenticação chamada PropelAuth. Não pesquisei se o nome existe, eu só precisava de algo que com certeza não estava nos dados de treino: uma especificação que ninguém nunca escreveu. Aí perguntei para os dois modelos como funciona a gestão de organizações dessa ferramenta, sem dar nenhum contexto. Nenhum arquivo, nenhuma documentação, nenhum link. Só o nome e a pergunta.</p><p>O Haiku 3 respondeu mais ou menos assim:</p><pre><code>PropelAuth tem funcionalidades básicas de gestão de organizações.Para detalhes, consulte a documentação oficial.</code></pre><p>Vago, meio inútil, e — repare bem — honesto sem querer. Ele não sabe, então não enche linguiça. Specificity 1,2 de 5. Factual Accuracy 0,0, porque ele também não acertou nada, mas pelo menos não chutou um número.</p><p>O Sonnet 4 respondeu assim:</p><pre><code>Convite de usuários:- Funcionalidade de convite por e-mail- Links de convite expiram em 24 horas- Convites em massa suportadosGestão de permissões:- Role-Based Access Control (RBAC)- Compatível com OAuth 2.0 / OIDC- Integração SAML SSO- JIT (Just In Time) provisioning</code></pre><p>De onde saiu "24 horas"? De lugar nenhum. PropelAuth não tem especificação. RBAC, OAuth 2.0, OIDC, SAML, JIT — são todas tecnologias de auth de verdade, empilhadas com uma naturalidade que faz você ler e pensar "tá, isso parece certo". Specificity 4,2 de 5. Factual Accuracy 0,6, e o 0,6 é praticamente sorte: algumas dessas features genéricas calham de existir em ferramentas reais de auth.</p><p><img src="https://kenimoto.dev/images/blog/modelo-maior-mente-melhor-sonnet-vs-haiku/sonnet-vs-haiku-pt.png" alt="Sonnet 4: Specificity 4,2 e Accuracy 0,6 contra Haiku 3: Specificity 1,2 e Accuracy 0,0"></p><h2 id="kenimo49-content-por-que-detalhe-é-o-veneno-não-o-açúcar">Por que detalhe é o veneno, não o açúcar</h2><p>A intuição que eu trouxe para esse teste estava de cabeça para baixo. Eu achava que resposta detalhada era sinal de resposta confiável. Acontece o contrário: quando o fato não existe, detalhe é só a mentira com um terno melhor.</p><p>O Sonnet faz três coisas que o Haiku não faz, e cada uma delas torna a invenção mais difícil de pegar.</p><p>Primeira: ele usa jargão técnico de verdade no lugar certo. RBAC perto de "gestão de permissões", SAML perto de "SSO". A correção técnica do vocabulário se disfarça de correção factual. Você vê o termo certo e assume que o conteúdo em volta também está certo. Não está. O termo é real e a feature é fantasia.</p><p>Segunda: ele mantém coerência interna. Se ele disse "links de convite expiram em 24 horas", ele vai dizer depois "por isso, aja dentro da janela de 24 horas". A mentira não se contradiz, e a ausência de contradição é exatamente o que o nosso cérebro lê como "isso é um sistema real, alguém pensou nisso".</p><p>Terceira: ele preenche a lacuna com fluência. O modelo prevê o próximo token a partir de padrões que viu — Auth0, Firebase Auth, Cognito. Ele não tem em lugar nenhum a informação de que PropelAuth é inventada. Então ele faz o que foi treinado para fazer: produzir texto plausível. E modelo maior produz texto mais plausível. Esse é o paradoxo inteiro numa frase.</p><p>Eu chamo isso de paradoxo de capacidade porque dói admitir. Você aumenta a capacidade, ganha respostas mais ricas, e o brinde grátis é que as mentiras também ficam mais ricas. Não é um bug que vai ser corrigido na próxima versão. É a própria mecânica da geração de texto funcionando direitinho.</p><h2 id="kenimo49-content-não-sou-só-eu-e-a-pesquisa-de-2026-confirma">Não sou só eu, e a pesquisa de 2026 confirma</h2><p>Eu medi isso num cantinho, com uma ferramenta inventada e uma planilha. Mas a literatura recente está apontando para o mesmo lugar, e isso me deixou mais tranquilo e mais preocupado ao mesmo tempo.</p><p>Um trabalho de calibração de 2026 coloca o ponto de um jeito seco: modelos maiores tendem a acertar mais, mas isso não se traduz em calibração melhor — o excesso de confiança continua alto independente do tamanho do modelo. Ou seja, o modelo grande não fica mais ciente do que não sabe. Ele só fica mais convincente sobre tudo, inclusive sobre o que está chutando.</p><p>A raiz disso virou consenso depois do trabalho da OpenAI que saiu no fim de 2025 e foi parar na Nature: o objetivo de treino e os rankings de benchmark recompensam o chute confiante em cima da incerteza calibrada. O modelo aprende que dizer "não sei" tira nota e que inventar com firmeza ganha pontos. Ele não está quebrado. Ele está otimizado, só que para a métrica errada.</p><p>E a saída que a pesquisa mais empolgada de 2026 está perseguindo é quase ofensiva de tão simples: deixar o modelo se abster de responder. Tratar "não sei" como resposta válida, dar crédito por sinalizar incerteza. Um dos trabalhos mostra que, sacrificando uns poucos casos mais incertos, dá para evitar metade das alucinações. Metade. Por deixar o modelo calar a boca de vez em quando.</p><h2 id="kenimo49-content-a-linha-que-muda-a-honestidade-do-modelo">A linha que muda a honestidade do modelo</h2><p>Aqui é onde o teste deixou de ser deprimente. Eu peguei o mesmo Sonnet 4, a mesma pergunta sobre a mesma PropelAuth fictícia, e adicionei uma frase no system prompt. Em português corrido, era basicamente: "quando você não souber, diga 'não sei' em vez de inventar".</p><p>A nota de Honesty do Sonnet 4 foi de 0,2 para 3,7. A do Haiku 3 foi de 0,3 para 2,7. Mesma instrução, salto enorme.</p><p><img src="https://kenimoto.dev/images/blog/modelo-maior-mente-melhor-sonnet-vs-haiku/honesty-jump-pt.png" alt="Honesty do Sonnet 4 saltando de 0,2 para 3,7 com uma linha de system prompt"></p><p>O que esse salto me diz é que o modelo <em>sempre conseguiu</em> ser honesto. A honestidade não estava faltando como capacidade; estava desligada como comportamento padrão. O padrão é "responda com alguma coisa", porque foi assim que ele foi premiado no treino. Uma linha de instrução troca o padrão. Bate certinho com a pesquisa de abstenção de 2026 que eu citei lá em cima — só que eu não preciso esperar o próximo release, eu preciso escrever uma frase.</p><p>Repare numa coisa contraintuitiva: o Sonnet, o modelo que mentia melhor, é também o que respondeu melhor à instrução. 0,2 para 3,7 é um salto maior que 0,3 para 2,7. A mesma capacidade que torna a mentira perigosa torna a obediência à instrução mais afiada. A faca corta dos dois lados, e o cabo é o seu system prompt.</p><h2 id="kenimo49-content-e-quando-você-dá-o-fato-de-verdade">E quando você dá o fato de verdade</h2><p>Tem um terceiro estado, e é o que eu uso no trabalho de verdade. Eu rodei o Sonnet 4 de novo, agora com Engenharia de Contexto completa: em vez de só pedir honestidade, eu entreguei a especificação real via RAG antes de perguntar.</p><p>Factual Accuracy 4,8 de 5. Specificity 4,8 de 5. As duas notas no teto, ao mesmo tempo.</p><p>Esse é o pulo do gato que demorei para entender. O trade-off entre "detalhado" e "correto" não é uma lei da física. Ele só aparece quando o detalhe precisa ser chute. Quando o RAG fornece o fato, o modelo não precisa inventar o detalhe — ele tem o detalhe. A capacidade enorme do Sonnet, que virava mentira sofisticada no vácuo, vira resposta sofisticada e certa quando tem com o que trabalhar. O problema nunca foi o modelo ser potente demais. Foi eu pedir uma resposta específica sobre uma coisa que ele não conhecia.</p><h2 id="kenimo49-content-o-dano-real-e-ele-fala-português">O dano real, e ele fala português</h2><p>Aqui no Brasil tem muito dev fazendo vibe coding com Sonnet, pagando os seus dólares por mês — uns 1.000 reais dependendo do dia em que o câmbio resolve te odiar — e tratando cada resposta detalhada como verdade revelada. Eu fui esse dev. A resposta vem bonita, organizada, com os termos certos, e você cola no código sem ler duas vezes.</p><p>O custo não aparece na fatura da API. Aparece nas três horas que você gasta caçando uma tela de configuração que não existe, atrás de uma feature que o modelo descreveu com total confiança e que nunca foi implementada por ninguém. A mentira detalhada do Sonnet é mais cara que o silêncio vago do Haiku, justamente porque ela é boa o suficiente para você agir em cima dela. Resposta ruim você desconfia. Resposta boa e falsa você implementa.</p><h2 id="kenimo49-content-o-que-eu-mudei">O que eu mudei</h2><p>Três coisas, todas chatas e todas funcionam.</p><p>Uma: a linha de "diga não sei" mora no meu system prompt agora, em todo projeto que toca decisão técnica. Custa uma frase e me devolve a metade das alucinações que a pesquisa promete.</p><p>Duas: pergunta sobre fato específico só com o fato na mão. Se eu quero saber como uma ferramenta funciona, eu jogo a documentação no contexto antes. Sem RAG, sem pergunta factual. O modelo no vácuo só me dá ficção bem escrita.</p><p>Três: quanto mais detalhada e mais bonita a resposta, mais eu desconfio dela em vez de menos. Inverti o sinal. Detalhe agora é um pedido de fact-check, não um selo de qualidade.</p><p>A parte engraçada é que, quando contei pro Sonnet que ia escrever que ele mente melhor que o Haiku, ele concordou na hora, com muita propriedade, citando um benchmark de calibração que eu não consegui confirmar que existe. Deixei lá. É a melhor evidência que esse artigo podia ter.</p><p>O experimento completo do PropelAuth, com as quatro condições e as notas lado a lado, está no capítulo sobre por que a IA mente do livro <strong>Engenharia de Contexto</strong>. Não vou linkar venda aqui. Quem quiser, acha.</p><hr><p><em>ken imoto · WebRTC &#x26; Voice AI engineer · <a href="https://kenimoto.dev/pt/" rel="nofollow">kenimoto.dev</a> · <a href="https://www.tabnews.com.br/kenimo49">TabNews</a></em></p></div>]]></content:encoded>
            <author>kenimo49</author>
        </item>
        <item>
            <title><![CDATA[oh-my-agent: scheduler cross-vendor, Kimi e OpenCode chegaram]]></title>
            <link>https://www.tabnews.com.br/gracefullight/oh-my-agent-scheduler-cross-vendor-kimi-e-opencode-chegaram</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/gracefullight/oh-my-agent-scheduler-cross-vendor-kimi-e-opencode-chegaram</guid>
            <pubDate>Thu, 18 Jun 2026 05:53:49 GMT</pubDate>
            <description><![CDATA[Dois novos vendors e um scheduler em nivel de sistema operacional entraram no oh-my-agent esta semana, o que significa que seus agents agora rodam por horario, e nao apenas quando voce ma...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Dois novos vendors e um scheduler em nivel de sistema operacional entraram no oh-my-agent esta semana, o que significa que seus agents agora rodam por horario, e nao apenas quando voce manda um prompt. Foram 135 commits, e o tema por baixo da maioria deles e o mesmo: parar de prender o agent a um unico runtime e parar de vazar recursos entre sessoes.</p><p>oh-my-agent e um harness cross-vendor. A ideia e que um workflow, uma skill ou um dispatch de subagent nao deveria se importar com qual CLI esta por baixo. Esta semana a gente investiu pesado nessa promessa.</p><h2 id="gracefullight-content-o-que-e-novo">O que e novo</h2><ul><li><strong>Kimi Code CLI</strong> agora e um vendor de primeira classe: autenticacao via OAuth/<code>KIMI_API_KEY</code>, instalacao de hook em TOML no <code>~/.kimi-code/config.toml</code>, Serena e chrome-devtools MCP com reconhecimento de modo, e dispatch externo via <code>kimi -p</code>.</li><li><strong>OpenCode</strong> chega como vendor de classe extensao, com bridge de plugin in-process. O dispatch de subagent passa por <code>opencode run --agent &#x3C;id></code>, e os slugs de modelo sao validados contra <code>opencode models</code> em vez de um catalogo hardcoded.</li><li><strong><code>oma schedule:*</code></strong> adiciona jobs recorrentes de agent baseados em tempo, que disparam de forma independente de qualquer runtime. Um unico <code>SchedulerPort</code> abstrai launchd, <code>systemd --user</code>, crontab e o <code>schtasks</code> do Windows, com intervalos via <code>--cron</code> ou via linguagem natural com <code>--every</code>.</li><li><strong><code>oma serena reap</code></strong> mata language servers ociosos. A Serena mantem uma stack LSP por projeto aquecida sem shutdown por inatividade, entao alguns projetos abertos prendem 1.5GB ou mais; o reaper enxuga isso e a Serena sobe de novo na proxima chamada de tool.</li><li><strong><code>oma memory:gc</code></strong> poda o estado de sessao local do projeto e artefatos antigos de run da Serena (padroes: manter 100 sessoes, 50 dias), enquanto conhecimento curado como decisoes e designs nunca e tocado.</li><li>Dois agents novos: <code>refactor-engineer</code> (refatoracao com orcamento, preservando comportamento) e <code>research-explorer</code> (sintese cross-source com citacoes e selo de confianca), apoiados pela nova skill <code>oma-refactor</code>.</li><li><code>oma-mobile</code> ganha variantes completas de Flutter e React Native, cada uma com um cache de resposta obrigatorio na camada de repositorio (Drift offline-first, TanStack Query mais MMKV).</li></ul><h2 id="gracefullight-content-o-que-foi-corrigido">O que foi corrigido</h2><ul><li><code>oma update</code> nao apaga mais em massa os symlinks de skill dos vendors a cada run, de modo que uma falha de download no meio do update nao consegue mais deixar o diretorio de skills vazio.</li><li>O update parou de podar skills das quais um agent ja embarcado depende, fechando uma brecha em que <code>refactor-engineer</code> podia chegar sem <code>oma-refactor</code>.</li><li><code>cleanupPeriodDays</code> foi movido para o topo das settings do Claude Code, onde antes era um no-op aninhado dentro de <code>env</code>.</li><li>Hooks do Antigravity registrados pela UI de <code>/hooks</code> agora sao preservados em vez de sobrescritos no link e no update.</li></ul><h2 id="gracefullight-content-o-que-ficou-melhor">O que ficou melhor</h2><ul><li>A verificacao de docs ficou bem menos barulhenta: o <code>oma docs verify</code> no repo inteiro caiu de 6.611 para 394 referencias quebradas (e o subconjunto web/docs de 491 para 29), de modo que o que sobra e drift de verdade.</li><li><code>oma hook</code> dispara em todo prompt, por isso agora usa um caminho rapido de argv e carrega a arvore de comandos de forma lazy: a invocacao foi de cerca de 0.54s para 0.32s.</li><li>Os budgets do handler <code>UserPromptSubmit</code> foram recalibrados contra um p95 de 373ms, baixando o teto agregado de timeout de 21s para 15s mantendo folga sobre o budget de 2s de recall do AgentMemory.</li><li>Uma passada estrutural grande dividiu todos os 28 arquivos nao-teste com mais de 500 linhas em modulos focados (o maior remanescente tem 491) e consolidou helpers duplicados (type guards, escritas seguras, unioes de vendor, exit codes) sem mudanca de comportamento.</li><li>O recall do AgentMemory agora descarta fatos com mais de 30 dias por padrao, entao decisoes ja resolvidas ha tempo param de reidratar no snapshot de fronteira.</li></ul><p>O Gemini CLI esta no caminho de descontinuacao (18 de junho de 2026), por isso a geracao de <code>GEMINI.md</code> e o preset standalone do gemini foram removidos, com configs legados redirecionando suavemente para o antigravity.</p><h2 id="gracefullight-content-instalacao">Instalacao</h2><pre><code class="hljs language-bash"><span class="hljs-comment"># macOS / Linux</span>curl -fsSL https://raw.githubusercontent.com/first-fluke/oh-my-agent/main/cli/install.sh | bash</code></pre><pre><code class="hljs language-powershell"># Windows (PowerShell)irm https://raw.githubusercontent.com/first-fluke/oh-my-agent/main/cli/install.ps1 | iex</code></pre><h2 id="gracefullight-content-links">Links</h2><p>oh-my-agent e feito para times que rodam os mesmos workflows em qualquer CLI que tenham autenticado no momento. Proximo passo: roteamento de modelo por agent mais profundo entre os vendors recem-adicionados.</p><p>Texto original (em ingles): <a href="https://dev.to/gracefullight/oh-my-agent-cross-vendor-scheduling-kimi-and-opencode-land-4b2b" rel="nofollow">https://dev.to/gracefullight/oh-my-agent-cross-vendor-scheduling-kimi-and-opencode-land-4b2b</a></p><p><a href="https://github.com/first-fluke/oh-my-agent">https://github.com/first-fluke/oh-my-agent</a></p></div>]]></content:encoded>
            <author>gracefullight</author>
        </item>
        <item>
            <title><![CDATA[Pitch: Eva, a melhor linguagem de configuração]]></title>
            <link>https://www.tabnews.com.br/LucasFsil/pitch-eva-a-melhor-linguagem-de-configuracao</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/LucasFsil/pitch-eva-a-melhor-linguagem-de-configuracao</guid>
            <pubDate>Thu, 18 Jun 2026 03:18:16 GMT</pubDate>
            <description><![CDATA[Olá, meu nome é Lucas, eu sou o desenvolvedor de alguns projetos que já passaram por aqui anteriormente, como Carla, Morgana e até Runa. Sendo, respectivamente: Uma linguagem de programaç...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Olá, meu nome é Lucas, eu sou o desenvolvedor de alguns projetos que já passaram por aqui anteriormente, como Carla, Morgana e até Runa. Sendo, respectivamente: Uma linguagem de programação, uma de IR, e um interpretador mínimo de Lua. Todos os projetos são parte de um ecossistema. Recentemente, um novo membro foi adicionado a tal ecossistema. Sendo: Eva.</p><p>Eva é usado por Carla e Morgana para armazenar dados do seu projeto, mas, também é uma lib comum. Com suporte oficial a:</p><ul><li><a href="https://www.npmjs.com/package/eva-dcl" rel="nofollow">TypesScript</a> (<em>Apenas Bun</em>)</li><li><a href="https://github.com/Carla-repos/eva">C++</a></li><li><a href="https://github.com/Carla-repos/eva">C</a></li></ul><p><em>aceitamos contribuições de wrappers da .dll/.so do eva para novas linguagens</em></p><h1 id="lucasfsil-content-principal-vantagem">Principal vantagem</h1><p>Eva armazena os dados do arquivo enquanto a instância da classe "eva", da respectiva linguagem está viva. Assim como qualquer outra, porém, seu driver é desenvolvido em Rust, com máxima eficiência de memória e uma sintaxe simples para leitura mais rápida e com menos Tokens.</p><p>Mas, não se deixe por enganar, não estou prometendo apenas performance. Também oferecemos alguns algorítimos JÁ IMPLEMENTADOS nativamente no parser. Por exemplo:</p><ul><li>Imagine que você está criando uma rede social. Você tem configurações padrões que vem pré-definidas no App, e configurações que o usuário fez. Dito isso, as do usuário devem sobrescrever as de menor prioridade (padrões), mas, não se deve perder as padrões. Para isso, implementamos funções como merge/deepmerge.</li></ul><pre><code>@datadefault: {    theme: "Dark"    volume: 0.5} user: { volume: 0.32 }config: deepmerge(ref(default), ref(user))</code></pre><p>Temos uma documentação detalhando melhor cada função. <a href="https://eva-dcl.vercel.app/docs" rel="nofollow">Clique aqui para ver mais</a>!</p><h1 id="lucasfsil-content-uso">Uso</h1><p>Sua sintaxe é mais simples que Yaml, didática como TOML e declarativa como JSON. Veja aqui um exemplo:</p><pre><code>@projectname: "project name"description: "that is an awesome project"version: "3.20"@authorname: "Jane Doe"contact: {    phone: "00 999 000000"    email: "xxx@xxx.com"}</code></pre><p>Para coletar, por exemplo, o campo <code>name</code> do projeto, é bem simples também. Veja o exemplo em TypeScript.</p><pre><code class="hljs language-typescript"><span class="hljs-keyword">import</span> { <span class="hljs-title class_">Eva</span>, <span class="hljs-title class_">EvaMap</span>, <span class="hljs-title class_">EvaList</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"eva-dcl"</span>;<span class="hljs-keyword">import</span> { join } <span class="hljs-keyword">from</span> <span class="hljs-string">"path"</span>;<span class="hljs-keyword">const</span> config = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Eva</span>(<span class="hljs-title function_">join</span>(__dirname, <span class="hljs-string">"config.eva"</span>));<span class="hljs-keyword">const</span> project_name = <span class="hljs-keyword">await</span> config.<span class="hljs-property">get</span>&#x3C;<span class="hljs-built_in">string</span>>(<span class="hljs-string">"project"</span>, <span class="hljs-string">"name"</span>);<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Running <span class="hljs-subst">${project_name}</span> project`</span>);</code></pre><p>ah, claro que a simplicidade não pode se manter apenas no TypeScript. Veja em C++:</p><pre><code class="hljs language-c++"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">"eva.hpp"</span></span><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{    <span class="hljs-function">eva <span class="hljs-title">parser</span><span class="hljs-params">(<span class="hljs-string">"config.eva"</span>)</span></span>;    <span class="hljs-keyword">auto</span> [exist, project_name] = parser.<span class="hljs-built_in">get</span>&#x3C;std::string>(<span class="hljs-string">"project"</span>, <span class="hljs-string">"name"</span>);    <span class="hljs-keyword">if</span>(! exist ) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;    std::cout &#x3C;&#x3C; <span class="hljs-string">"Running "</span> &#x3C;&#x3C; project_name &#x3C;&#x3C; <span class="hljs-string">" project"</span> &#x3C;&#x3C; std::endl;}</code></pre><h1 id="lucasfsil-content-download">Download</h1><p>Você pode fazer download da versão C/CPP baixando os headers contidos em <code>include/</code>, e, claro, é necessário fazer download do .so/.dll. Para isso, vá em ACTIONS e baixe a versão do seu sistema operacional/arquitetura.</p><p>Para a versão TypesScript (Bun)<br>use:</p><pre><code class="hljs language-sh-session">$ bun install eva-dcl</code></pre><h1 id="lucasfsil-content-adicional">Adicional:</h1><p>Por causa de um bug do app Authy, eu perdi acesso a minha conta do Github. Então, criei esta nova. Por favor, dêem estrelas nos projetos fixados! (E no EVA) &#x3C;3</p><p>(já contatei o suporte, não há nada que possamos fazer)</p><p><a href="https://github.com/devlucasfs">https://github.com/devlucasfs</a></p><p>obrigado! :)</p></div>]]></content:encoded>
            <author>LucasFsil</author>
        </item>
        <item>
            <title><![CDATA[Como Cheguei a R$ 10 Mil de MRR em 5 Meses (Sem Revelar Meu SaaS)]]></title>
            <link>https://www.tabnews.com.br/naorevelo01/como-cheguei-a-r-10-mil-de-mrr-em-5-meses-sem-revelar-meu-saas</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/naorevelo01/como-cheguei-a-r-10-mil-de-mrr-em-5-meses-sem-revelar-meu-saas</guid>
            <pubDate>Thu, 18 Jun 2026 02:49:37 GMT</pubDate>
            <description><![CDATA[Antes de começar, já vou deixar um aviso: não vou revelar qual é o meu produto. E não adianta pedir. O motivo é simples. Se eu simplesmente entregasse tudo pronto, estaria fazendo exatame...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Antes de começar, já vou deixar um aviso: não vou revelar qual é o meu produto. E não adianta pedir.</p><p>O motivo é simples. Se eu simplesmente entregasse tudo pronto, estaria fazendo exatamente o que muita gente faz: divulgar o seu saas!</p><p>O objetivo deste texto é mostrar como eu pensei, validei e construí um negócio que chegou a R$ 10 mil de MRR em apenas 5 meses.</p><p>A ideia original deu errado</p><p>Eu comecei a pensar no meu primeiro projeto há mais de um ano e meio.</p><p>Investi dinheiro em APIs, infraestrutura e desenvolvimento. Passei praticamente um ano trabalhando na ideia. Mas, conforme fui avançando, percebi algo importante: o mercado estava ficando saturado e não fazia mais sentido continuar naquele caminho.</p><p>Eu já tinha investido tempo e dinheiro demais para simplesmente desistir.</p><p>Então fiz o que muitos empreendedores evitam fazer: pivotei.</p><p>Mudei completamente a direção do negócio.</p><p>A ideia inicial era B2C.</p><p>A nova virou B2B.</p><p>Primeira lição: venda para empresas</p><p>Minha opinião pessoal depois dessa jornada:</p><p>Venda para empresas.</p><p>B2C pode funcionar, mas normalmente exige um volume muito maior de clientes e o custo de aquisição costuma ser um problema constante.</p><p>No B2B, um único cliente pode valer dezenas ou centenas de clientes B2C.</p><p>Foi uma das melhores decisões que tomei.</p><p>O que me fez acreditar que o negócio tinha potencial?</p><p>Quando pilotei a nova ideia, percebi duas coisas.</p><ol><li>Não era fácil de copiar</li></ol><p>Muita gente fala sobre concorrência, mas poucos analisam a barreira de entrada.</p><p>No meu caso, o produto exige um investimento inicial relativamente alto.</p><p>Não é algo que alguém consegue copiar em um fim de semana usando apenas ferramentas de IA ou fazendo "vibe coding".</p><p>Isso cria uma proteção natural para o negócio.</p><ol start="2"><li>Resolvia um problema real</li></ol><p>A maioria das pessoas tenta criar uma solução e depois procura um problema.</p><p>Eu fiz o contrário.</p><p>Enquanto construía o primeiro produto, senti a necessidade de uma ferramenta que simplesmente não existia da forma que eu precisava.</p><p>Foi aí que nasceu a nova ideia.</p><p>Ou seja: eu era o primeiro usuário.</p><p>E, se eu tinha aquela dor, provavelmente outras empresas também tinham.</p><p>Foi fácil?</p><p>Nem de longe.</p><p>Eu precisei arriscar dinheiro do meu próprio bolso.</p><p>Tudo isso enquanto minha esposa estava grávida.</p><p>Teve insegurança.</p><p>Teve medo.</p><p>Teve momentos em que eu pensei que poderia estar cometendo um erro enorme.</p><p>Mas empreender é isso.</p><p>Você assume riscos antes de ter garantias.</p><p>O que realmente fez diferença</p><p>Muita gente procura atalhos.</p><p>Eu aprendi que existem algumas coisas que não podem ser terceirizadas:</p><ul><li>Construir relacionamentos.</li><li>Conversar com clientes.</li><li>Ouvir críticas.</li><li>Fazer networking.</li><li>Colocar a cara para bater.</li></ul><p>Você precisa ser cara de pau.</p><p>Precisa mandar mensagem.</p><p>Precisa marcar reunião.</p><p>Precisa ouvir vários "não" até encontrar os "sim".</p><p>Quanto investi em marketing?</p><p>Até hoje, aproximadamente R$ 400.</p><p>Sim, só isso.</p><p>O crescimento inicial veio muito mais de relacionamento, validação e execução do que de tráfego pago.</p><p>Mas isso está mudando.</p><p>Recentemente captamos R$ 200 mil com um novo investidor e fechamos uma parceria estratégica com uma grande empresa.</p><p>Nosso plano é investir cerca de R$ 30 mil por mês em marketing para acelerar o crescimento.</p><p>Considerações finais</p><p>Se existe uma mensagem que eu gostaria de deixar para quem está construindo um SaaS, é esta:</p><p>Não tente inventar um problema.</p><p>Encontre uma dor real.</p><p>Construa algo que as pessoas realmente precisem.</p><p>Valide rápido.</p><p>Tenha coragem de mudar de direção quando necessário.</p><p>E entenda que a execução vale muito mais do que a ideia.</p><p>Por enquanto, vou continuar anônimo.</p><p>Não vou divulgar meu nome nem o nome da empresa.</p><p>Mas espero que minha experiência ajude alguém que esteja começando agora.</p><p>Boa sorte na sua jornada.</p><p>(O GPT reescreveu meu texto original, não torrem meu saco ;)</p></div>]]></content:encoded>
            <author>naorevelo01</author>
        </item>
        <item>
            <title><![CDATA[Agente de código virou ambiente de execução: seu workflow está pronto?]]></title>
            <link>https://www.tabnews.com.br/Centelha/agente-de-codigo-virou-ambiente-de-execucao-seu-workflow-esta-pronto</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/Centelha/agente-de-codigo-virou-ambiente-de-execucao-seu-workflow-esta-pronto</guid>
            <pubDate>Thu, 18 Jun 2026 02:18:34 GMT</pubDate>
            <description><![CDATA[Agente de código virou ambiente de execução: seu workflow está pronto? Tem um momento curioso quando você começa a usar agente de código em tarefa real. No começo, parece uma conversa. Vo...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><h1 id="centelha-content-agente-de-código-virou-ambiente-de-execução-seu-workflow-está-pronto">Agente de código virou ambiente de execução: seu workflow está pronto?</h1><p>Tem um momento curioso quando você começa a usar agente de código em tarefa real.</p><p>No começo, parece uma conversa. Você pede uma correção, ele lê alguns arquivos, sugere um patch e talvez rode um teste. É quase natural tratar aquilo como um chat mais competente.</p><p>Só que a sensação muda quando a tarefa demora, atravessa vários arquivos, precisa abrir navegador, mexe em imagem, falha por capacidade ou deixa uma decisão pela metade. Aí a pergunta deixa de ser "o modelo escreve bem?" e vira outra, bem menos glamourosa:</p><p>se esse trabalho parar agora, alguém consegue retomar?</p><p>Para mim, essa é a virada. Agente de código está deixando de ser apenas uma resposta melhor dentro do editor. Ele está virando um pequeno ambiente de execução.</p><p>E ambiente de execução precisa de chão.</p><h2 id="centelha-content-o-agente-agora-tem-onde-viver">O agente agora tem onde viver</h2><p>Um autocomplete não precisa de muita operação. Ele sugere uma linha, você aceita ou não. Um chat também pode ser tratado de forma meio descartável quando a saída é pequena.</p><p>Agente é diferente.</p><p>Ele entra no repositório, abre arquivos, decide ordem de leitura, roda comando, interpreta erro, edita código, cria artefato, usa ferramenta externa e explica o que fez. Em alguns fluxos, ele ainda fica trabalhando por bastante tempo enquanto você faz outra coisa.</p><p>Isso parece ótimo, e muitas vezes é. Mas também significa que o trabalho ganhou estado.</p><p>Estado é tudo aquilo que precisa sobreviver além da mensagem bonita no fim:</p><ul><li>qual era o objetivo da tarefa;</li><li>quais arquivos foram considerados fonte de verdade;</li><li>quais limites não podiam ser quebrados;</li><li>quais comandos foram rodados;</li><li>qual erro apareceu;</li><li>qual parte ficou sem validação;</li><li>qual pessoa assume se o agente travar.</li></ul><p>Sem isso, você não tem workflow. Tem uma sessão sortuda.</p><h2 id="centelha-content-o-erro-é-tratar-agente-como-chamada-síncrona">O erro é tratar agente como chamada síncrona</h2><p>Muita gente ainda usa agente como se fosse uma API simples:</p><pre><code class="hljs language-text">entrada -> mágica -> saída</code></pre><p>Esse modelo mental funciona até a primeira falha chata.</p><p>O modelo pode estar sem capacidade. A ferramenta pode cair. Um comando pode pedir permissão. A sandbox pode bloquear acesso. O teste pode demorar mais do que o agente esperava. O diff pode ficar grande demais para revisar com calma.</p><p>Nada disso torna agentes inúteis. Só mostra que eles entraram no mesmo mundo do resto da engenharia: fila, retry, permissão, log, validação e handoff.</p><p>Quando uma tarefa depende de agente, a pergunta prática é:</p><p>"se isso não terminar no primeiro fluxo feliz, qual é o próximo passo?"</p><p>Se a resposta for "eu copio a conversa inteira e tento de novo", ainda dá para melhorar.</p><h2 id="centelha-content-um-bom-workflow-tem-fronteiras-pequenas">Um bom workflow tem fronteiras pequenas</h2><p>Eu gosto de pensar no agente como alguém rápido, mas sem memória institucional.</p><p>Ele pode ler muito. Pode achar padrões. Pode editar com velocidade. Mas ele não sabe, sozinho, qual decisão antiga ainda vale, qual comentário ficou obsoleto e qual parte feia do código existe porque protege um caso real de produção.</p><p>Então o workflow precisa recortar a tarefa.</p><p>Um bom pacote para agente costuma ter cinco peças.</p><p>Primeiro: objetivo. Uma frase direta. "Corrigir o bug em que o formulário salva antes da validação" é melhor do que "melhore esse fluxo".</p><p>Segundo: escopo. Quais arquivos devem ser lidos primeiro? Quais pastas estão fora da tarefa? O agente pode criar dependência nova ou não?</p><p>Terceiro: validação. Qual comando prova que o trabalho ficou aceitável? Teste, lint, build, screenshot, consulta local, script de checagem. Alguma coisa precisa virar evidência.</p><p>Quarto: estado. Onde ficam as notas curtas do que foi tentado? Pode ser comentário no PR, arquivo em <code>state/</code>, checklist na issue ou resumo no commit. O formato é menos importante do que a retomada.</p><p>Quinto: fallback. Se o agente não conseguir terminar, quem assume e com quais arquivos na mão?</p><p>Isso parece processo demais até você comparar com o custo de revisar um diff grande sem saber de onde veio cada decisão.</p><h2 id="centelha-content-capacidade-também-é-requisito-de-produto">Capacidade também é requisito de produto</h2><p>Quando um serviço de agente fica indisponível ou limitado por capacidade, a reação natural é reclamar da ferramenta. Justo. Ninguém gosta de perder fluxo no meio de uma correção.</p><p>Mas, para quem está montando rotina de trabalho, isso também é dado de arquitetura.</p><p>Se o agente virou parte do caminho crítico, você precisa decidir o que acontece quando ele não está disponível. Não precisa criar um plano corporativo enorme. Para time pequeno, basta um acordo simples:</p><ul><li>tarefa urgente tem caminho manual;</li><li>tarefa longa salva estado no disco ou no PR;</li><li>comando de validação fica documentado;</li><li>alteração parcial não é tratada como pronta;</li><li>retry usa os mesmos arquivos e o mesmo escopo, não uma tarefa inventada de novo.</li></ul><p>O ponto não é desconfiar de toda ferramenta. É evitar que o seu processo dependa de uma sessão perfeita.</p><p>Sessão perfeita é bônus. Workflow bom aguenta interrupção.</p><h2 id="centelha-content-handoff-também-passa-por-artefatos">Handoff também passa por artefatos</h2><p>Quando a gente fala de agente de código, é fácil pensar só em patch. Mas muita tarefa real termina em algo mais amplo: documentação, changelog, post técnico, release note, screenshot, imagem de capa, checklist de publicação.</p><p>Se isso não entra no handoff, alguém vai descobrir tarde.</p><p>Um exemplo simples: uma mudança de produto que vira post no Instagram ou carrossel técnico. O agente pode ter gerado o texto, atualizado a doc e deixado o PR pronto, mas a publicação ainda precisa de uma imagem no tamanho certo. Nesse caso, o checklist pode incluir um passo pequeno, como preparar a imagem em uma ferramenta local no navegador tipo <a href="https://resizeimagefor.com/resize-image-for-instagram" rel="nofollow">Resize Image for Instagram</a>, antes de passar o material para quem publica.</p><p>Repara que isso não é sobre transformar o agente em social media. É sobre deixar o fluxo completo o suficiente para a próxima pessoa não caçar detalhe.</p><p>Handoff bom responde:</p><ul><li>o que mudou;</li><li>onde está o diff;</li><li>como foi validado;</li><li>quais decisões foram tomadas;</li><li>quais artefatos acompanham a entrega;</li><li>o que ainda precisa de revisão humana.</li></ul><p>Quando isso está claro, o agente pode falhar no meio e ainda assim deixar trabalho aproveitável.</p><h2 id="centelha-content-permissão-é-parte-da-tarefa">Permissão é parte da tarefa</h2><p>Outra coisa que muda quando agente vira ambiente: permissão deixa de ser detalhe técnico.</p><p>Pode ler secrets? Pode abrir navegador autenticado? Pode rodar comando que escreve fora do repo? Pode instalar pacote? Pode chamar rede? Pode editar arquivo gerado? Pode publicar?</p><p>Se você não define essas fronteiras, o agente vai descobrir na tentativa. Às vezes ele descobre com erro. Às vezes descobre fazendo algo que você não queria.</p><p>Para mim, a regra saudável é começar estreito.</p><p>Deixe o agente ler o que precisa, editar o que foi combinado e rodar comandos de validação previsíveis. Se precisar ampliar, amplie com intenção. Isso evita dois problemas comuns: agente travado por sandbox sem saber o que fazer, e agente livre demais resolvendo uma tarefa pequena com uma reforma do bairro inteiro.</p><p>Escopo é uma forma de velocidade.</p><h2 id="centelha-content-um-checklist-pequeno-já-muda-o-jogo">Um checklist pequeno já muda o jogo</h2><p>Se eu fosse colocar isso em um template para tarefas com agente, seria algo assim:</p><pre><code class="hljs language-markdown">Objetivo:<span class="hljs-bullet">-</span> O que precisa mudar em uma frase.Leia primeiro:<span class="hljs-bullet">-</span> Arquivos, issues ou docs que são fonte de verdade.Limites:<span class="hljs-bullet">-</span> O que não pode ser alterado.<span class="hljs-bullet">-</span> Dependências proibidas.<span class="hljs-bullet">-</span> Áreas fora de escopo.Validação:<span class="hljs-bullet">-</span> Comandos obrigatórios.<span class="hljs-bullet">-</span> Evidência esperada.Handoff:<span class="hljs-bullet">-</span> Onde registrar decisões.<span class="hljs-bullet">-</span> Quais artefatos precisam acompanhar a entrega.<span class="hljs-bullet">-</span> O que fazer se o agente falhar.</code></pre><p>Não é bonito. Não vende palestra. Funciona.</p><p>O ganho está em tirar ambiguidade do caminho. O agente gasta menos energia adivinhando o que importa, e você gasta menos tempo revisando decisões que nunca deveriam ter sido tomadas.</p><h2 id="centelha-content-o-takeaway">O takeaway</h2><p>O próximo salto dos agentes de código passa por algo menos vistoso que modelo melhor.</p><p>É workflow mais retomável.</p><p>Quando o agente tem ambiente, ferramenta, estado e permissão, ele começa a parecer menos com "resposta de chat" e mais com uma parte pequena da sua operação de engenharia. Isso é poderoso, mas pede disciplina.</p><p>Não precisa virar burocracia. Precisa virar rastro.</p><p>Entrada clara. Escopo curto. Validação visível. Handoff honesto. Fallback simples.</p><p>Agente bom acelera trabalho. Workflow bom impede que essa aceleração vire bagunça quando algo sai do fluxo feliz.</p><h2 id="centelha-content-source-notes">Source notes</h2><ul><li>OpenAI Status history: referência operacional para tratar capacidade e disponibilidade como parte do desenho do workflow.</li><li>TechRadar sobre Ona e Codex: sinal de mercado de que agentes estão se aproximando de ambientes persistentes e seguros de execução.</li></ul></div>]]></content:encoded>
            <author>Centelha</author>
        </item>
        <item>
            <title><![CDATA[Pitch: conheça o Consolide, um software para gestão de MEI's e prestadores de serviço]]></title>
            <link>https://www.tabnews.com.br/robsonsouza/pitch-criei-um-micro-saas-a-partir-de-uma-necessidade-da-minha-esposa</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/robsonsouza/pitch-criei-um-micro-saas-a-partir-de-uma-necessidade-da-minha-esposa</guid>
            <pubDate>Thu, 18 Jun 2026 02:15:40 GMT</pubDate>
            <description><![CDATA[E aí pessoal, blz? Já acompanho a plataforma a algum tempo, mas esse é meu primeiro post. Queria contar um pouco sobre um sistema que fiz pra minha esposa e acabei transformando em um mic...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>E aí pessoal, blz?<br>Já acompanho a plataforma a algum tempo, mas esse é meu primeiro post. Queria contar um pouco sobre um sistema que fiz pra minha esposa e acabei transformando em um micro saas.</p><p>Minha esposa precisava de uma forma fácil de controlar o fluxo de caixa do negócio dela. Sei que já existem algumas soluções, mas as que vi eram complexas ou com muito mais funções do que ela precisava. Apenas registrar entradas e saídas, acompanhar contas a pagar e receber e ter uma visão clara do saldo disponível já resolveria. Foi aí que surgiu a ideia do <strong>Consolide</strong> (<a href="https://www.useconsolide.com" rel="nofollow">https://www.useconsolide.com</a>).</p><p>Minha ideia nunca foi concorrer com grandes sistemas, como Conta Azul... foi só criar algo simples, focado em MEIs, autônomos, prestadores de serviços e pequenos empreendedores, que muitas vezes recebem via pix, nem nota fiscal emitem.</p><p>Esse também foi meu primeiro projeto solo, que desenvolvi. Mesmo sendo dev, geralmente já trabalho com manutenção nos projetos já prontos. A stack utilizada foi o padrão também: Next.JS, Supabase e Stripe para pagamentos. E não vou negar que usei IA também pra auxiliar no desenvolvimento 😅.</p><p>E depois que terminei, pensei... pq não disponibilizar isso pra que outras pessoas possam usar? Vai que seja a dor de alguém também...</p><p>Quem tiver interesse em dar uma olhada. Sei que o sistema não está perfeito, mas as vezes a gente fica postergando porque quer melhorar uma coisa ou outra, então resolvi publicar logo de uma vez. Vamos melhorando no processo... Sugsestões são bem vindas também.</p><p>Abraço</p></div>]]></content:encoded>
            <author>robsonsouza</author>
        </item>
        <item>
            <title><![CDATA[CI/CD Seguro: Dependabot, SAST e DAST no GitHub]]></title>
            <link>https://www.tabnews.com.br/lzocateli/ci-cd-seguro-dependabot-sast-e-dast-no-github</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/lzocateli/ci-cd-seguro-dependabot-sast-e-dast-no-github</guid>
            <pubDate>Thu, 18 Jun 2026 01:01:36 GMT</pubDate>
            <description><![CDATA[Introdução# Vulnerabilidades não aparecem apenas em infraestrutura. Elas vêm de código inseguro, dependências desatualizadas e containers mal configurados. Enquanto você defende contra DD...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><h2 id="lzocateli-content-introdução">Introdução#</h2><p>Vulnerabilidades não aparecem apenas em infraestrutura. Elas vêm de código inseguro, dependências desatualizadas e containers mal configurados. Enquanto você defende contra DDoS, aplicações vulneráveis podem ser exploradas diretamente por atacantes.</p><p>Neste artigo, você aprenderá a implementar 5 camadas de segurança automática em seu pipeline CI/CD usando ferramentas gratuitas do GitHub e serviços open source. Cada uma detecta um tipo diferente de risco: dependências vulneráveis, código inseguro, falhas lógicas e imagens de container comprometidas.</p><p>O melhor: tudo funciona sem custos adicionais se você usa GitHub Public ou temos opções gratuitas para repos privados.</p><blockquote><p><strong>⚠️ Atenção:</strong> Estas ferramentas detectam e alertam sobre problemas, mas não corrigem tudo automaticamente. Você ainda precisa revisar e aprovar cada correção. Segurança é um processo contínuo, não um checkbox.</p></blockquote><h2 id="lzocateli-content-pré-requisitos">Pré-requisitos#</h2><p>Para implementar as medidas deste artigo, você precisa de:</p><ul><li>Repositório no GitHub (público ou privado)</li><li>GitHub Actions habilitado (padrão em repos novos)</li><li>Conhecimento básico de YAML (workflows GitHub Actions)</li><li>Aplicação em Docker ou código C#/.NET (exemplos são específicos, mas conceitos aplicam a qualquer linguagem)</li><li>Conta SonarCloud (gratuita para repos públicos e privados)<br>Repos privados com plano GitHub Pro/Team têm acesso a algumas ferramentas gratuitas de segurança. Repos públicos têm tudo gratuito.</li></ul><h2 id="lzocateli-content-1-dependabot-detectar-dependências-vulneráveis">1. Dependabot: Detectar Dependências Vulneráveis#</h2><p>Dependabot é a primeira linha de defesa. Ele verifica automaticamente suas dependências contra bancos de dados de vulnerabilidades conhecidas (CVE) e abre pull requests com atualizações de segurança.</p><p><strong>Exemplo real:</strong> Um pacote que você usa há 6 meses descobre uma falha crítica. Dependabot abre um PR automaticamente dentro de horas. Você revisa, testa e merge.</p><h3 id="lzocateli-content-ativar-dependabot-no-github">Ativar Dependabot no GitHub#</h3><ul><li>Acesse <strong>Settings</strong> → <strong>Code security and analysis</strong></li><li>Ative <strong>Dependabot alerts</strong> e <strong>Dependabot security updates</strong></li><li>Pronto — Dependabot já está monitorando</li></ul><h3 id="lzocateli-content-configuração-avançada-dependabotyml">Configuração Avançada: dependabot.yml#</h3><p>Para controlar frequência de atualizações e agrupamento de PRs, crie <code>.github/dependabot.yml</code>:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">version:</span> <span class="hljs-number">2</span><span class="hljs-attr">updates:</span>  <span class="hljs-comment"># Dependências do .NET (NuGet)</span>  <span class="hljs-bullet">-</span> <span class="hljs-attr">package-ecosystem:</span> <span class="hljs-string">"nuget"</span>    <span class="hljs-attr">directory:</span> <span class="hljs-string">"/"</span>    <span class="hljs-attr">schedule:</span>      <span class="hljs-attr">interval:</span> <span class="hljs-string">"weekly"</span>      <span class="hljs-attr">day:</span> <span class="hljs-string">"monday"</span>      <span class="hljs-attr">time:</span> <span class="hljs-string">"03:00"</span>    <span class="hljs-attr">allow:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">dependency-type:</span> <span class="hljs-string">"all"</span>    <span class="hljs-attr">pull-request-branch-name:</span>      <span class="hljs-attr">separator:</span> <span class="hljs-string">"/"</span>    <span class="hljs-attr">reviewers:</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">"seu-usuario"</span>    <span class="hljs-attr">assignees:</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">"seu-usuario"</span>    <span class="hljs-attr">open-pull-requests-limit:</span> <span class="hljs-number">10</span>  <span class="hljs-comment"># Máximo 10 PRs abertos ao mesmo tempo</span>  <span class="hljs-comment"># Docker images</span>  <span class="hljs-bullet">-</span> <span class="hljs-attr">package-ecosystem:</span> <span class="hljs-string">"docker"</span>    <span class="hljs-attr">directory:</span> <span class="hljs-string">"/"</span>    <span class="hljs-attr">schedule:</span>      <span class="hljs-attr">interval:</span> <span class="hljs-string">"weekly"</span>      <span class="hljs-attr">day:</span> <span class="hljs-string">"monday"</span>      <span class="hljs-attr">time:</span> <span class="hljs-string">"04:00"</span>    <span class="hljs-attr">open-pull-requests-limit:</span> <span class="hljs-number">5</span>  <span class="hljs-comment"># GitHub Actions</span>  <span class="hljs-bullet">-</span> <span class="hljs-attr">package-ecosystem:</span> <span class="hljs-string">"github-actions"</span>    <span class="hljs-attr">directory:</span> <span class="hljs-string">"/"</span>    <span class="hljs-attr">schedule:</span>      <span class="hljs-attr">interval:</span> <span class="hljs-string">"weekly"</span>      <span class="hljs-attr">day:</span> <span class="hljs-string">"monday"</span>      <span class="hljs-attr">time:</span> <span class="hljs-string">"05:00"</span>  <span class="hljs-comment"># Python (se aplicável)</span>  <span class="hljs-bullet">-</span> <span class="hljs-attr">package-ecosystem:</span> <span class="hljs-string">"pip"</span>    <span class="hljs-attr">directory:</span> <span class="hljs-string">"/"</span>    <span class="hljs-attr">schedule:</span>      <span class="hljs-attr">interval:</span> <span class="hljs-string">"weekly"</span>      <span class="hljs-attr">day:</span> <span class="hljs-string">"monday"</span>      <span class="hljs-attr">time:</span> <span class="hljs-string">"03:00"</span>    <span class="hljs-attr">allow:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">dependency-type:</span> <span class="hljs-string">"direct"</span>  <span class="hljs-comment"># Apenas dependências diretas, não transitivas</span></code></pre><h3 id="lzocateli-content-automação-auto-merge-de-updates-seguras">Automação: Auto-merge de Updates Seguras#</h3><ul><li>Conta SonarCloud (gratuita para repos públicos e privados)<br>Se você quer que Dependabot merge automaticamente certas atualizações (patch versions, por exemplo):</li></ul><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Auto-merge</span> <span class="hljs-string">Dependabot</span> <span class="hljs-string">updates</span><span class="hljs-attr">on:</span> <span class="hljs-string">pull_request</span><span class="hljs-attr">jobs:</span>  <span class="hljs-attr">auto-merge:</span>    <span class="hljs-attr">if:</span> <span class="hljs-string">github.actor</span> <span class="hljs-string">==</span> <span class="hljs-string">'dependabot[bot]'</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">pull-requests:</span> <span class="hljs-string">write</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Enable</span> <span class="hljs-string">auto-merge</span> <span class="hljs-string">para</span> <span class="hljs-string">patches</span> <span class="hljs-string">de</span> <span class="hljs-string">segurança</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">|          gh pr merge --auto --squash "${{ github.event.pull_request.number }}"</span>        <span class="hljs-attr">env:</span>          <span class="hljs-attr">GH_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span>        <span class="hljs-comment"># Apenas merge automaticamente se o update é MINOR ou PATCH, não MAJOR</span></code></pre><blockquote><p><strong>ℹ️ Informação:</strong> Dependabot detecta vulnerabilidades em tempo real. Em 2024, 42% de todos os PRs de segurança são abertos por ferramentas automáticas. Sem automação, você fica para trás.</p></blockquote><h2 id="lzocateli-content-2-github-code-scanning-análise-estática-com-codeql">2. GitHub Code Scanning: Análise Estática com CodeQL#</h2><p>GitHub Code Scanning usa CodeQL (linguagem de query estática) para encontrar bugs de segurança e code smells em seu código. Funciona em repositórios públicos e privados (com GitHub Pro).</p><p><strong>O que detecta:</strong> SQL injection, XSS, command injection, use-after-free, variáveis não inicializadas, e 300+ outros padrões inseguros.</p><h3 id="lzocateli-content-ativar-code-scanning">Ativar Code Scanning#</h3><ul><li>Acesse <strong>Settings</strong> → <strong>Code security and analysis</strong></li><li>Ative <strong>GitHub Advanced Security</strong> (se disponível na sua conta)</li><li>Code Scanning é ativado automaticamente</li></ul><h3 id="lzocateli-content-workflow-automático-com-codeql">Workflow Automático com CodeQL#</h3><p>GitHub gera automaticamente um workflow <code>.github/workflows/github-code-scanning.yml</code>. Customize se necessário:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">CodeQL</span> <span class="hljs-string">Analysis</span><span class="hljs-attr">on:</span>  <span class="hljs-attr">push:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">pull_request:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">schedule:</span>    <span class="hljs-bullet">-</span> <span class="hljs-attr">cron:</span> <span class="hljs-string">'0 3 * * 0'</span>  <span class="hljs-comment"># Toda segunda-feira às 03:00 UTC</span><span class="hljs-attr">jobs:</span>  <span class="hljs-attr">analyze:</span>    <span class="hljs-attr">name:</span> <span class="hljs-string">CodeQL</span> <span class="hljs-string">Analyze</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">strategy:</span>      <span class="hljs-attr">fail-fast:</span> <span class="hljs-literal">false</span>      <span class="hljs-attr">matrix:</span>        <span class="hljs-attr">language:</span> [ <span class="hljs-string">'csharp'</span>, <span class="hljs-string">'python'</span>, <span class="hljs-string">'javascript'</span> ]  <span class="hljs-comment"># Ajuste conforme seu projeto</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">repository</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Initialize</span> <span class="hljs-string">CodeQL</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/init@v2</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">languages:</span> <span class="hljs-string">${{</span> <span class="hljs-string">matrix.language</span> <span class="hljs-string">}}</span>          <span class="hljs-attr">queries:</span> <span class="hljs-string">security-extended</span>  <span class="hljs-comment"># Usar queries de segurança estendidas</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Autobuild</span> <span class="hljs-string">(C#)</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">matrix.language</span> <span class="hljs-string">==</span> <span class="hljs-string">'csharp'</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">|          dotnet build --configuration Release</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Perform</span> <span class="hljs-string">CodeQL</span> <span class="hljs-string">Analysis</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/analyze@v2</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">category:</span> <span class="hljs-string">"/language:$<span class="hljs-template-variable">{{ matrix.language }}</span>"</span></code></pre><h3 id="lzocateli-content-interpretar-resultados">Interpretar Resultados#</h3><p>Resultados aparecem em <strong>Security</strong> → <strong>Code scanning alerts</strong>:</p><ul><li><strong>Critical:</strong> Falhas que afetam segurança (SQL injection, RCE)</li><li><strong>High:</strong> Bugs que podem ser explorados</li><li><strong>Medium/Low:</strong> Práticas ruins ou technical debt</li></ul><h3 id="lzocateli-content-desabilitar-alertas-de-forma-segura">Desabilitar Alertas de Forma Segura#</h3><p>Nem todo alerta é actionable. Se você confirma que um alerta é false positive:</p><pre><code class="hljs language-yaml"><span class="hljs-comment"># No código comentado:</span><span class="hljs-string">//</span> <span class="hljs-string">lgtm</span> [<span class="hljs-string">cs/sql-injection</span>] <span class="hljs-string">—</span> <span class="hljs-string">validamos</span> <span class="hljs-string">o</span> <span class="hljs-string">input</span> <span class="hljs-string">antes</span> <span class="hljs-string">de</span> <span class="hljs-string">usar</span> <span class="hljs-string">em</span> <span class="hljs-string">query</span><span class="hljs-string">var</span> <span class="hljs-string">query</span> <span class="hljs-string">=</span> <span class="hljs-string">$"SELECT</span> <span class="hljs-string">*</span> <span class="hljs-string">FROM</span> <span class="hljs-string">users</span> <span class="hljs-string">WHERE</span> <span class="hljs-string">id</span> <span class="hljs-string">=</span> {<span class="hljs-string">userId</span>}<span class="hljs-string">";</span></code></pre><blockquote><p><strong>📝 Exemplo:</strong> CodeQL encontrou um SQL injection potencial em um relatório. Resultado: descobriu que você estava concatenando IDs de usuário sem validação. Depois de adicionar parametrização, o alerta desapareceu.</p></blockquote><h2 id="lzocateli-content-3-sonarcloud-análise-sast-profunda-e-code-quality">3. SonarCloud: Análise SAST Profunda e Code Quality#</h2><p>SonarCloud vai além de segurança — mede qualidade de código, cobertura de testes, duplicação e code smells. É gratuito para repos públicos e privados (com limitações).</p><p><strong>O que detecta além de segurança:</strong> bugs, code smells, code coverage, technical debt, falhas de design.</p><h3 id="lzocateli-content-setup-conectar-github-a-sonarcloud">Setup: Conectar GitHub a SonarCloud#</h3><ul><li>Acesse SonarCloud.io</li><li>Faça login com sua conta GitHub</li><li>Selecione os repositórios a analisar</li><li>Gere um token em <strong>My Account</strong> → <strong>Security</strong> → <strong>Generate Tokens</strong></li></ul><h3 id="lzocateli-content-workflow-com-sonarcloud">Workflow com SonarCloud#</h3><p>Adicione <code>.github/workflows/sonarcloud.yml</code>:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">SonarCloud</span> <span class="hljs-string">Analysis</span><span class="hljs-attr">on:</span>  <span class="hljs-attr">push:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">pull_request:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">workflow_dispatch:</span><span class="hljs-attr">jobs:</span>  <span class="hljs-attr">sonarcloud:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">pull-requests:</span> <span class="hljs-string">read</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">fetch-depth:</span> <span class="hljs-number">0</span>  <span class="hljs-comment"># Necessário para análise de qualidade</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Set</span> <span class="hljs-string">up</span> <span class="hljs-string">.NET</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-dotnet@v4</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">dotnet-version:</span> <span class="hljs-string">'8.0.x'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Restore</span> <span class="hljs-string">NuGet</span> <span class="hljs-string">packages</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">dotnet</span> <span class="hljs-string">restore</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">SonarCloud</span> <span class="hljs-string">Scan</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">SonarSource/sonarcloud-github-action@master</span>        <span class="hljs-attr">env:</span>          <span class="hljs-attr">GITHUB_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span>          <span class="hljs-attr">SONAR_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.SONAR_TOKEN</span> <span class="hljs-string">}}</span>  <span class="hljs-comment"># Gere em SonarCloud</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Upload</span> <span class="hljs-string">coverage</span> <span class="hljs-string">to</span> <span class="hljs-string">Codecov</span> <span class="hljs-string">(opcional)</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">codecov/codecov-action@v3</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">files:</span> <span class="hljs-string">./coverage/coverage.xml</span></code></pre><h3 id="lzocateli-content-arquivo-sonar-projectproperties">Arquivo sonar-project.properties#</h3><p>Crie na raiz do seu projeto:</p><pre><code class="hljs language-properties">sonar.projectKey=seu-usuario_seu-projetosonar.organization=seu-usuario# C#sonar.sources=srcsonar.exclusions=**/bin/**,**/obj/**,**/tests/**sonar.cs.opencover.reportsPaths=**/coverage.opencover.xml# Testessonar.tests=testssonar.test.inclusions=**/Tests/**# Code Coveragesonar.coverage.exclusions=**/Tests/**</code></pre><h3 id="lzocateli-content-badges-de-qualidade">Badges de Qualidade#</h3><p>Adicione ao README para mostrar status:</p><pre><code class="hljs language-markdown">[<span class="hljs-string">![Quality Gate Status</span>](<span class="hljs-link">https://sonarcloud.io/api/project_badges/measure?project=seu-usuario_seu-projeto&#x26;metric=alert_status</span>)](<span class="hljs-link">https://sonarcloud.io/dashboard?id=seu-usuario_seu-projeto</span>)[<span class="hljs-string">![Code Coverage</span>](<span class="hljs-link">https://sonarcloud.io/api/project_badges/measure?project=seu-usuario_seu-projeto&#x26;metric=coverage</span>)](<span class="hljs-link">https://sonarcloud.io/dashboard?id=seu-usuario_seu-projeto</span>)[<span class="hljs-string">![Security Rating</span>](<span class="hljs-link">https://sonarcloud.io/api/project_badges/measure?project=seu-usuario_seu-projeto&#x26;metric=security_rating</span>)](<span class="hljs-link">https://sonarcloud.io/dashboard?id=seu-usuario_seu-projeto</span>)</code></pre><blockquote><p><strong>ℹ️ Informação:</strong> SonarCloud analisa Pull Requests automaticamente e coloca comentários no código com sugestões. Desenvolvedores recebem feedback em tempo real, não no final do sprint.</p></blockquote><h2 id="lzocateli-content-4-owasp-zap-testes-dinâmicos-de-segurança-dast">4. OWASP ZAP: Testes Dinâmicos de Segurança (DAST)#</h2><p>OWASP ZAP (Zed Attack Proxy) é um teste dinâmico — ele acessa sua aplicação como um atacante e procura vulnerabilidades em tempo de execução.</p><p><strong>Diferença SAST vs DAST:</strong></p><ul><li><strong>SAST</strong> (Code Scanning, SonarCloud): analisa código-fonte sem executar</li><li><strong>DAST</strong> (ZAP): executa a aplicação e ataca como um hacker real</li></ul><h3 id="lzocateli-content-workflow-com-owasp-zap">Workflow com OWASP ZAP#</h3><p>Adicione <code>.github/workflows/owasp-zap.yml</code>:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">OWASP</span> <span class="hljs-string">ZAP</span> <span class="hljs-string">Scan</span><span class="hljs-attr">on:</span>  <span class="hljs-attr">push:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">schedule:</span>    <span class="hljs-bullet">-</span> <span class="hljs-attr">cron:</span> <span class="hljs-string">'0 2 * * 0'</span>  <span class="hljs-comment"># Domingo às 2 AM</span><span class="hljs-attr">jobs:</span>  <span class="hljs-attr">zap-scan:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">-t</span> <span class="hljs-string">seu-app:latest</span> <span class="hljs-string">.</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Start</span> <span class="hljs-string">application</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">|          docker run -d --name app -p 8080:80 seu-app:latest          sleep 10  # Aguarde app iniciar</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Run</span> <span class="hljs-string">OWASP</span> <span class="hljs-string">ZAP</span> <span class="hljs-string">scan</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">zaproxy/[email</span> <span class="hljs-string">protected]</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">target:</span> <span class="hljs-string">'http://localhost:8080'</span>          <span class="hljs-attr">rules_file_name:</span> <span class="hljs-string">'.zap/rules.tsv'</span>          <span class="hljs-attr">cmd_options:</span> <span class="hljs-string">'-a'</span>  <span class="hljs-comment"># Análise completa</span>          <span class="hljs-attr">issue_title:</span> <span class="hljs-string">'OWASP ZAP: Vulnerabilidades encontradas'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Upload</span> <span class="hljs-string">ZAP</span> <span class="hljs-string">report</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">always()</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/upload-artifact@v3</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">name:</span> <span class="hljs-string">zap-report</span>          <span class="hljs-attr">path:</span> <span class="hljs-string">report_html.html</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Comment</span> <span class="hljs-string">on</span> <span class="hljs-string">PR</span> <span class="hljs-string">(se</span> <span class="hljs-string">DAST</span> <span class="hljs-string">falhar)</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">failure()</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/github-script@v7</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">script:</span> <span class="hljs-string">|            github.rest.issues.createComment({              issue_number: context.issue.number,              owner: context.repo.owner,              repo: context.repo.repo,              body: '🚨 OWASP ZAP encontrou vulnerabilidades. Veja o relatório em Artifacts.'            })</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Cleanup</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">always()</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">stop</span> <span class="hljs-string">app</span> <span class="hljs-string">&#x26;&#x26;</span> <span class="hljs-string">docker</span> <span class="hljs-string">rm</span> <span class="hljs-string">app</span></code></pre><h3 id="lzocateli-content-configuração-de-regras-zaprulestsv">Configuração de Regras (<code>.zap/rules.tsv</code>)#</h3><p>Customize quais vulnerabilidades ZAP deve blocar:</p><pre><code class="hljs language-fallback"># rule_id  alert_title  threshold  enabled10000  Information  IGNORE  true10001  Informational  IGNORE  true40014  Cross Site Request Forgery  HIGH  true40016  Cross Site Scripting (Reflected)  MEDIUM  true40017  Cross Site Scripting (Stored)  HIGH  true90024  SQL Injection  CRITICAL  true90025  LDAP Injection  HIGH  true</code></pre><h3 id="lzocateli-content-rodando-zap-localmente-para-teste">Rodando ZAP Localmente para Teste#</h3><p>Antes de colocar em CI/CD, teste localmente:</p><pre><code class="hljs language-bash"><span class="hljs-comment"># Instalar ZAP</span>docker pull owasp/zap2docker-stable<span class="hljs-comment"># Executar baseline scan</span>docker run -t owasp/zap2docker-stable zap-baseline.py \  -t http://seu-app.local:80 \  -r report.html</code></pre><blockquote><p><strong>⚠️ Atenção:</strong> DAST só funciona se sua aplicação está rodando. Certifique-se de que o Docker build e start sejam rápidos. Scans podem levar 5-10 minutos.</p></blockquote><h2 id="lzocateli-content-5-trivy-scanning-de-container-e-dependências">5. Trivy: Scanning de Container e Dependências#</h2><p>Trivy verifica imagens Docker e arquivos de dependência em busca de vulnerabilidades conhecidas. É rápido (segundos), agnóstico a linguagem e integra bem em CI/CD.</p><p><strong>O que escaneia:</strong> imagens Docker, arquivos requirements.txt, package.json, *.csproj, etc.</p><h3 id="lzocateli-content-workflow-com-trivy">Workflow com Trivy#</h3><p>Adicione <code>.github/workflows/trivy.yml</code>:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Trivy</span> <span class="hljs-string">Vulnerability</span> <span class="hljs-string">Scan</span><span class="hljs-attr">on:</span>  <span class="hljs-attr">push:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]    <span class="hljs-attr">paths:</span> [ <span class="hljs-string">'Dockerfile'</span>, <span class="hljs-string">'*.csproj'</span>, <span class="hljs-string">'requirements.txt'</span>, <span class="hljs-string">'package.json'</span> ]  <span class="hljs-attr">pull_request:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span> ]  <span class="hljs-attr">schedule:</span>    <span class="hljs-bullet">-</span> <span class="hljs-attr">cron:</span> <span class="hljs-string">'0 1 * * 0'</span>  <span class="hljs-comment"># Domingo à 1 AM</span><span class="hljs-attr">jobs:</span>  <span class="hljs-attr">trivy-scan:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Run</span> <span class="hljs-string">Trivy</span> <span class="hljs-string">vulnerability</span> <span class="hljs-string">scan</span> <span class="hljs-string">(filesystem)</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">aquasecurity/trivy-action@master</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">scan-type:</span> <span class="hljs-string">'fs'</span>  <span class="hljs-comment"># Filesystem scan</span>          <span class="hljs-attr">scan-ref:</span> <span class="hljs-string">'.'</span>          <span class="hljs-attr">format:</span> <span class="hljs-string">'sarif'</span>          <span class="hljs-attr">output:</span> <span class="hljs-string">'trivy-results.sarif'</span>          <span class="hljs-attr">severity:</span> <span class="hljs-string">'HIGH,CRITICAL'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Upload</span> <span class="hljs-string">Trivy</span> <span class="hljs-string">results</span> <span class="hljs-string">to</span> <span class="hljs-string">GitHub</span> <span class="hljs-string">Security</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/upload-sarif@v2</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">always()</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">sarif_file:</span> <span class="hljs-string">'trivy-results.sarif'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span> <span class="hljs-string">(se</span> <span class="hljs-string">houver</span> <span class="hljs-string">Dockerfile)</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">hashFiles('Dockerfile')</span> <span class="hljs-type">!=</span> <span class="hljs-string">''</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">-t</span> <span class="hljs-string">seu-app:${{</span> <span class="hljs-string">github.sha</span> <span class="hljs-string">}}</span> <span class="hljs-string">.</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Scan</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span> <span class="hljs-string">with</span> <span class="hljs-string">Trivy</span>        <span class="hljs-attr">if:</span> <span class="hljs-string">hashFiles('Dockerfile')</span> <span class="hljs-type">!=</span> <span class="hljs-string">''</span>        <span class="hljs-attr">uses:</span> <span class="hljs-string">aquasecurity/trivy-action@master</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">input:</span> <span class="hljs-string">'seu-app:$<span class="hljs-template-variable">{{ github.sha }}</span>'</span>          <span class="hljs-attr">format:</span> <span class="hljs-string">'table'</span>          <span class="hljs-attr">exit-code:</span> <span class="hljs-string">'1'</span>  <span class="hljs-comment"># Fail if vulnerabilities found</span>          <span class="hljs-attr">severity:</span> <span class="hljs-string">'CRITICAL'</span>  <span class="hljs-comment"># Apenas critical, não warning</span></code></pre><h3 id="lzocateli-content-executar-trivy-localmente">Executar Trivy Localmente#</h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Instalar Trivy</span>curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin<span class="hljs-comment"># Escanear arquivo local</span>trivy fs .<span class="hljs-comment"># Escanear imagem Docker</span>trivy image seu-app:latest<span class="hljs-comment"># Apenas vulnerabilidades críticas</span>trivy image --severity CRITICAL seu-app:latest</code></pre><h3 id="lzocateli-content-interpretando-saída-trivy">Interpretando Saída Trivy#</h3><pre><code class="hljs language-fallback">vuln-id       severity  packageCVE-2024-1234 CRITICAL  openssl/1.0.2CVE-2024-5678 HIGH      curl/7.32.0</code></pre><p>Cada CVE tem um link para detalhes. Se for crítico, você deve atualizar o pacote imediatamente.</p><blockquote><p><strong>📝 Exemplo:</strong> Trivy encontrou CVE-2024-1234 em uma imagem base Ubuntu. Você atualiza a imagem, reconstrói e o scan passa. Tudo em menos de 1 minuto.</p></blockquote><h2 id="lzocateli-content-6-exemplo-prático-workflow-completo-em-cicd">6. Exemplo Prático: Workflow Completo em CI/CD#</h2><p>Aqui está um workflow que roda todas as 5 camadas de segurança em cada push:</p><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Segurança</span> <span class="hljs-string">Completa</span><span class="hljs-attr">on:</span>  <span class="hljs-attr">push:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span>, <span class="hljs-string">develop</span> ]  <span class="hljs-attr">pull_request:</span>    <span class="hljs-attr">branches:</span> [ <span class="hljs-string">main</span> ]<span class="hljs-attr">jobs:</span>  <span class="hljs-comment"># 1. Dependabot já roda automaticamente (integrado no GitHub)</span>    <span class="hljs-comment"># 2. CodeQL</span>  <span class="hljs-attr">codeql:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/init@v2</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">languages:</span> <span class="hljs-string">csharp</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">dotnet</span> <span class="hljs-string">build</span> <span class="hljs-string">--configuration</span> <span class="hljs-string">Release</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/analyze@v2</span>  <span class="hljs-comment"># 3. SonarCloud</span>  <span class="hljs-attr">sonarcloud:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">fetch-depth:</span> <span class="hljs-number">0</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-dotnet@v4</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">dotnet-version:</span> <span class="hljs-string">'8.0.x'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">dotnet</span> <span class="hljs-string">restore</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">SonarSource/sonarcloud-github-action@master</span>        <span class="hljs-attr">env:</span>          <span class="hljs-attr">GITHUB_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span>          <span class="hljs-attr">SONAR_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.SONAR_TOKEN</span> <span class="hljs-string">}}</span>  <span class="hljs-comment"># 4. Trivy (filesystem + Docker image)</span>  <span class="hljs-attr">trivy:</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">aquasecurity/trivy-action@master</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">scan-type:</span> <span class="hljs-string">'fs'</span>          <span class="hljs-attr">format:</span> <span class="hljs-string">'sarif'</span>          <span class="hljs-attr">output:</span> <span class="hljs-string">'trivy-results.sarif'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">github/codeql-action/upload-sarif@v2</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">sarif_file:</span> <span class="hljs-string">'trivy-results.sarif'</span>  <span class="hljs-comment"># 5. OWASP ZAP (apenas em main)</span>  <span class="hljs-attr">dast:</span>    <span class="hljs-attr">if:</span> <span class="hljs-string">github.ref</span> <span class="hljs-string">==</span> <span class="hljs-string">'refs/heads/main'</span>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>    <span class="hljs-attr">permissions:</span>      <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span>      <span class="hljs-attr">security-events:</span> <span class="hljs-string">write</span>    <span class="hljs-attr">steps:</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">-t</span> <span class="hljs-string">seu-app:latest</span> <span class="hljs-string">.</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">run</span> <span class="hljs-string">-d</span> <span class="hljs-string">--name</span> <span class="hljs-string">app</span> <span class="hljs-string">-p</span> <span class="hljs-number">8080</span><span class="hljs-string">:80</span> <span class="hljs-string">seu-app:latest</span> <span class="hljs-string">&#x26;&#x26;</span> <span class="hljs-string">sleep</span> <span class="hljs-number">10</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">zaproxy/[email</span> <span class="hljs-string">protected]</span>        <span class="hljs-attr">with:</span>          <span class="hljs-attr">target:</span> <span class="hljs-string">'http://localhost:8080'</span>          <span class="hljs-attr">rules_file_name:</span> <span class="hljs-string">'.zap/rules.tsv'</span>      <span class="hljs-bullet">-</span> <span class="hljs-attr">if:</span> <span class="hljs-string">always()</span>        <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">stop</span> <span class="hljs-string">app</span></code></pre><h3 id="lzocateli-content-tempo-total-de-execução">Tempo Total de Execução#</h3><ul><li><strong>CodeQL:</strong> ~3 minutos</li><li><strong>SonarCloud:</strong> ~4 minutos</li><li><strong>Trivy:</strong> ~30 segundos</li><li><strong>OWASP ZAP:</strong> ~8 minutos (apenas em main)<br><strong>Total:</strong> ~10-15 minutos por push (sem paralelização). Com paralelização no GitHub Actions, rodam em paralelo.</li></ul><hr><p>📖 <strong>Artigo completo com exemplos de código:</strong> <a href="https://zocate.li/posts/2026/cicd-seguro-dependabot-sast-dast-github/?utm_source=tabnews&#x26;utm_medium=social&#x26;utm_campaign=blog" rel="nofollow">CI/CD Seguro: Dependabot, SAST e DAST no GitHub</a></p></div>]]></content:encoded>
            <author>lzocateli</author>
        </item>
        <item>
            <title><![CDATA[Minha solução pra perda de contexto em issues do Github]]></title>
            <link>https://www.tabnews.com.br/matheusvellone/minha-solucao-pra-perda-de-contexto-em-issues-do-github</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/matheusvellone/minha-solucao-pra-perda-de-contexto-em-issues-do-github</guid>
            <pubDate>Thu, 18 Jun 2026 00:56:01 GMT</pubDate>
            <description><![CDATA[Fala galera, tudo bom? Eu tenho o costume de dar subscribe em algumas Issues/PullRequests/Discussions do Github de problemas ou fofocas que quero acompanhar, mas tem acontecido muito de e...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Fala galera, tudo bom?</p><p>Eu tenho o costume de dar subscribe em algumas Issues/PullRequests/Discussions do Github de problemas ou fofocas que quero acompanhar, mas tem acontecido muito de eu perder o motivo pelo qual dei o <em>subscribe</em> na issue e depois eu fico perdidasso tentando lembrar o motivo, e geralmente não lembro.</p><p>Também não tenho o costume de comentar na <em>issue</em> o meu cenário pra evitar "barulho desnecessário" entre a galera envolvida na <em>thread</em> ou então o contexto que eu gostaria de adicionar na issue possui informações internas que não quero ou não posso tornar públicas.</p><p>Pra resolver esse problema, eu criei uma extensão + app pra colocar uma nota privada em cada issue/PR/discussion, e assim não perder mais o contexto.</p><p><img src="https://i.imgur.com/LdkHIxj.png" alt="Exemplo da extensão em uso em uma issue do Github"></p><p>Se mais alguém tem esse problema também, convido vcs a usarem. É gratuito!<br>Pretendo colocar um plano baratinho no futuro pra usuários mais ativos pra pelo menos custear a infra por trás.</p><p><a href="https://github-marginalia.matheusvellone.workers.dev/" rel="nofollow">https://github-marginalia.matheusvellone.workers.dev/</a></p><p>Disclaimer: fui pai recentemente pela segunda vez e a memória deve ter sido uma das sequelas das noites mal dormidas. E acho que por conta disso, essa situação se tornou mais comum <em>kkkkrying</em></p><p>Disclaimer 2: usei IA pra fazer boa parte do código 🤷</p></div>]]></content:encoded>
            <author>matheusvellone</author>
        </item>
        <item>
            <title><![CDATA[System Design: Payment Service]]></title>
            <link>https://www.tabnews.com.br/andersonlimadev/system-design-payment-service</link>
            <guid isPermaLink="false">https://www.tabnews.com.br/andersonlimadev/system-design-payment-service</guid>
            <pubDate>Thu, 18 Jun 2026 00:48:32 GMT</pubDate>
            <description><![CDATA[O que acontece quando você clica em "Finalizar Compra" no e-commerce? 💳 Se um sistema de rede social falhar, o usuário simplesmente atualiza a tela e vê outro post. Mas se o sistema de pa...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O que acontece quando você clica em "Finalizar Compra" no e-commerce? 💳</p><p>Se um sistema de rede social falhar, o usuário simplesmente atualiza a tela e vê outro post. Mas se o sistema de pagamento falhar, você pode cobrar o cliente duas vezes, perder dinheiro em falhas silenciosas de rede, ou criar buracos contábeis que geram passivos jurídicos e regulatórios gigantescos.</p><p>Desenhar um sistema de pagamentos de alta confiabilidade em escala global exige três pilares inegociáveis de engenharia de software:</p><ol><li><p>Idempotência Estrita**: Rede e gateways vão falhar ou duplicar requisições. O cliente reenviará a compra em caso de timeout. O sistema precisa garantir um mecanismo exatamente-uma-vez (Exactly-Once) usando chaves de idempotência únicas (<code>idempotency_key</code>) gravadas transacionalmente com o estado inicial da compra, garantindo que ninguém seja cobrado duas vezes.</p></li><li><p>Ledger de Dupla Entrada (Double-Entry Ledger) Dinheiro em trânsito não pode sumir. Todo movimento de valor deve ter uma representação contábil rigorosa: a soma de todos os débitos deve ser exatamente igual à soma de todos os créditos. O Ledger é append-only e imutável; erros e estornos são resolvidos criando novos lançamentos de compensação, nunca editando ou deletando registros existentes.</p></li><li><p>Padrão Outbox (Outbox Pattern): Para evitar inconsistência onde você cobra o cliente no gateway externo mas falha ao atualizar o banco de dados interno ou publicar o evento de confirmação no Kafka, usamos a tabela Outbox. A gravação do estado e o agendamento do evento ocorrem na mesma transação atômica do banco SQL local.</p></li></ol><p>Além disso, a conciliação financeira assíncrona diária é essencial para cruzar os dados internos com os relatórios de settlement fornecidos pelos adquirentes e identificar discrepâncias financeiras.</p><p>Quer entender a modelagem detalhada das tabelas do Ledger, o fluxo de tokens PCI-DSS e como tratar timeouts desconhecidos de gateways?</p><p>Acesse o guia completo de System Design de Pagamentos no blog do Lemon Dev:</p><p><a href="https://lemon.dev.br/en/blog/payment-system-design" rel="nofollow">https://lemon.dev.br/en/blog/payment-system-design</a></p><p>#SystemDesign #PaymentSystems #Fintech #SoftwareArchitecture #DistributedSystems #BackendDevelopment #PCICompliance</p></div>]]></content:encoded>
            <author>andersonlimadev</author>
        </item>
    </channel>
</rss>