<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Open-Source | AkitaOnRails.com</title><link>https://akitaonrails.github.io/tags/open-source/</link><description>Blog do Fabio Akita do Canal do YouTube 'Akitando' falando sobre tecnologia, carreira e coisas geek.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 23:20:48 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><item><title>Auto-publiquei meu próprio Livro/e-book: Competente o Suficiente</title><link>https://akitaonrails.github.io/2026/10/13/auto-publiquei-meu-proprio-livro-ebook-competente-o-suficiente/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/10/13/auto-publiquei-meu-proprio-livro-ebook-competente-o-suficiente/</guid><pubDate>Tue, 13 Oct 2026 19:00:00 -0300</pubDate><description>&lt;p&gt;Acabei de publicar meu próprio livro sobre inteligência artificial. Chama &lt;em&gt;Competente o Suficiente&lt;/em&gt;, tem o subtítulo &amp;ldquo;Um ano colocando a inteligência artificial à prova, sem medo e sem propaganda&amp;rdquo;, e é de graça, em EPUB e PDF, pra ler no celular, no PC ou no Kindle. A página oficial é &lt;a href="https://ailair.akitaonrails.com/pt-br/book/"target="_blank" rel="noopener"&gt;esta&lt;/a&gt;, e o &lt;a href="https://github.com/akitaonrails/ai-book-2026"target="_blank" rel="noopener"&gt;repositório&lt;/a&gt; é público.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ailair.akitaonrails.com/pt-br/book/"target="_blank" rel="noopener"&gt;&lt;img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261013190000_livro-competente-o-suficiente-3d.png" alt="Competente o Suficiente, o livro, em 3D" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O livro consolida quase tudo que eu escrevi sobre IA aqui no blog de fevereiro a outubro de 2026: todas as experiências, os projetos Frank, os benchmarks, bilhões de tokens gastos e centenas de horas de trabalho ao longo de oito meses, reorganizados num formato mais fácil de ler do que uma pilha de posts datados. Saiu em português e em inglês.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Acabei de publicar meu próprio livro sobre inteligência artificial. Chama <em>Competente o Suficiente</em>, tem o subtítulo &ldquo;Um ano colocando a inteligência artificial à prova, sem medo e sem propaganda&rdquo;, e é de graça, em EPUB e PDF, pra ler no celular, no PC ou no Kindle. A página oficial é <a href="https://ailair.akitaonrails.com/pt-br/book/"target="_blank" rel="noopener">esta</a>, e o <a href="https://github.com/akitaonrails/ai-book-2026"target="_blank" rel="noopener">repositório</a> é público.</p>
<p><a href="https://ailair.akitaonrails.com/pt-br/book/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261013190000_livro-competente-o-suficiente-3d.png" alt="Competente o Suficiente, o livro, em 3D"  loading="lazy" /></a></p>
<p>O livro consolida quase tudo que eu escrevi sobre IA aqui no blog de fevereiro a outubro de 2026: todas as experiências, os projetos Frank, os benchmarks, bilhões de tokens gastos e centenas de horas de trabalho ao longo de oito meses, reorganizados num formato mais fácil de ler do que uma pilha de posts datados. Saiu em português e em inglês.</p>
<blockquote>
  <p><strong>Aviso importante:</strong> isso é um <em>preview</em>. O livro ainda está em andamento e vão sair novas versões até eu considerar ele pronto. Se você achar qualquer coisa errada, de erro de digitação a fato, <a href="https://github.com/akitaonrails/ai-book-2026/issues"target="_blank" rel="noopener">abra uma issue no GitHub</a>. O rastro que eu descrevo abaixo existe justamente pra que a correção chegue no parágrafo certo.</p>

</blockquote>
<p>Este texto é sobre o bastidor técnico. Como se transforma 131 posts de blog, escritos ao longo de meses, com opiniões que mudaram no caminho, num livro com começo, meio, fim, apêndice, glossário e bibliografia. E como se faz isso com agentes sem perder o controle do que o livro diz.</p>
<h2>O que tem dentro<span class="hx:absolute hx:-mt-20" id="o-que-tem-dentro"></span>
    <a href="#o-que-tem-dentro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cinco partes, cada uma respondendo a uma pergunta que as pessoas vivem me fazendo:</p>
<ol>
<li><strong>O que é essa coisa, afinal.</strong> Ela é inteligente? A AGI está chegando?</li>
<li><strong>A maratona.</strong> Funciona de verdade, ou é tudo demo?</li>
<li><strong>Números e propaganda.</strong> Qual IA é a melhor? Dá pra acreditar nos anúncios?</li>
<li><strong>Quem fica com as chaves.</strong> É perigoso deixar ela mexer nas minhas coisas?</li>
<li><strong>E o meu emprego?</strong> Ela vai me substituir? O que vem depois?</li>
</ol>
<p>São 20 capítulos e dois interlúdios, mais prefácio, um &ldquo;como ler&rdquo;, um &ldquo;antes de começar&rdquo; dizendo o que o livro deixa de explicar e onde aprender, epílogo e posfácio. Depois vêm dez apêndices (a máquina por dentro sem matemática, leituras pra ir mais fundo, como estudar com a IA do lado, três bolhas, linha do tempo, kit mínimo pra usar agente com segurança, ai-memory, como ler um benchmark ou um anúncio, os projetos do ano, e os bastidores pra quem programa), as fontes, os créditos de imagem, um glossário de quase 150 termos e mais de 300 referências em ABNT. A edição impressa passa de 500 páginas em 6 por 9 polegadas; a de tela, uns 475. São mais de 50 figuras, todas com ficha de origem.</p>
<p>O público é diferente do blog. O livro foi escrito pra quem está ansioso ou confuso com IA: o profissional com medo de ser substituído, o pai que leu que a AGI chega em dois anos, o gerente a quem estão vendendo uma &ldquo;transformação por IA&rdquo;. A maioria não programa. Isso muda a voz, e eu volto nisso.</p>
<h2>O problema: meio milhão de palavras que discordam entre si<span class="hx:absolute hx:-mt-20" id="o-problema-meio-milhão-de-palavras-que-discordam-entre-si"></span>
    <a href="#o-problema-meio-milh%c3%a3o-de-palavras-que-discordam-entre-si" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em 12 de outubro publiquei <a href="/2026/10/12/llms-agentes-competente-o-suficiente/">a síntese do ano</a>, que virou o capítulo 20. No dia 13 comecei o livro. Eu tinha 131 textos de 2026 no blog, quase meio milhão de palavras, de benchmark de modelo a carteira de bitcoin.</p>
<p>Reorganizar isso à mão levaria meses. E tem um problema pior que o volume: eu mudei de opinião durante o ano. Refiz o benchmark várias vezes, corrigi custos, troquei de ferramenta, e um post de fevereiro contradiz um de setembro com toda a naturalidade. Um livro que simplesmente colasse os posts em ordem seria um livro que se contradiz.</p>
<p>Então fiz o que o livro inteiro descreve: entreguei o trabalho braçal pra agentes de código, e fiquei com a parte de decidir, montar o processo e conferir. O processo é o assunto deste texto.</p>
<h2>Passo 1: um inventário lacrado<span class="hx:absolute hx:-mt-20" id="passo-1-um-inventário-lacrado"></span>
    <a href="#passo-1-um-invent%c3%a1rio-lacrado" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A primeira coisa foi um script que lê os 131 posts e grava, pra cada um, o hash SHA-256 do arquivo em português e do arquivo em inglês, mais o commit exato do repositório do blog de onde tudo foi lido. Se uma vírgula muda num post, o hash muda junto. Esse arquivo é gerado por máquina e nunca editado à mão.</p>
<p>Depois, um agente leu cada post e preencheu um formulário fixo, com esquema definido em YAML: a tese em uma ou duas frases, as afirmações que um livro precisaria conferir, quais delas envelhecem rápido, que medo de leitor leigo o texto responde, o que cortar. Cada análise leva o hash do post de onde saiu.</p>
<p>Dos 131 textos, 96 tinham IA como assunto central ou com peso relevante. Os outros só entraram quando ensinavam alguma coisa específica, e cada post sobre IA deixado de fora tem o motivo anotado no arquivo de estrutura. Um script reprova a estrutura se qualquer post de IA estiver sem destino.</p>
<h3>Linhagem: quem substitui quem<span class="hx:absolute hx:-mt-20" id="linhagem-quem-substitui-quem"></span>
    <a href="#linhagem-quem-substitui-quem" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Pra resolver o problema das contradições, existe um mapa de linhagem. Ele diz qual post substituiu qual, o que ainda dá pra aproveitar do mais velho, e quais correções vindas dos projetos de referência (o repositório do benchmark, o do ai-memory, o do ai-jail, as anotações do meu servidor de casa) se aplicam a cada texto.</p>
<p>A regra pros capítulos é contar o estado mais recente e, quando a mudança ensina alguma coisa, contar a mudança. &ldquo;Em junho eu achava X; em julho os números diziam Y&rdquo; é história. Imprimir o número velho como se fosse atual é erro, e o verificador trata como erro.</p>
<h2>Passo 2: a estrutura é dado, e gera a configuração<span class="hx:absolute hx:-mt-20" id="passo-2-a-estrutura-é-dado-e-gera-a-configuração"></span>
    <a href="#passo-2-a-estrutura-%c3%a9-dado-e-gera-a-configura%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Das análises saiu uma proposta de estrutura: cinco partes, cada uma respondendo a um medo do leitor, vinte capítulos, dois interlúdios. Eu li, mexi e aprovei. Algumas peças entraram a meu pedido, como o &ldquo;antes de começar&rdquo; e o apêndice sobre a máquina por dentro.</p>
<p>Essa estrutura vive num único arquivo YAML, e ele é a fonte da verdade. Cada capítulo tem lá o id, o título, a cena de abertura, a pergunta que responde, o arco, a lista de posts de origem e as ideias de figura. A configuração do Quarto, que monta o livro, é gerada a partir desse arquivo por script. Ninguém edita a configuração na mão.</p>
<p>Isso importa porque mudança estrutural é onde livro quebra. No meio do caminho eu mudei o corte: os textos de janeiro saíram, e a história ficou entre fevereiro e outubro. Dez posts sumiram da base.</p>
<p>Três capítulos precisaram de cena nova, uma dúzia de unidades precisou de reparo pequeno, e o estrago difícil de ver estava em outro lugar: uma frase num capítulo intocado dizendo &ldquo;os cinco revisores do capítulo 5&rdquo;, a linha do tempo, o apêndice de projetos, rótulos de gráfico, cada tradução. Por isso existe um script de impacto que, antes de qualquer edição, lista cada parágrafo, figura, referência e tradução que depende de um post.</p>
<h2>Passo 3: um capítulo piloto vira contrato<span class="hx:absolute hx:-mt-20" id="passo-3-um-capítulo-piloto-vira-contrato"></span>
    <a href="#passo-3-um-cap%c3%adtulo-piloto-vira-contrato" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes de escalar, um capítulo piloto. Escolhi o capítulo 5, sobre os primeiros dez por cento de um projeto, e ele serviu pra calibrar a voz e descobrir as dúvidas que um agente teria no meio do caminho. Cada dúvida resolvida virou uma regra escrita.</p>
<p>Essas regras foram pra um documento de contrato que todo agente lê antes de escrever, junto com três coisas:</p>
<ul>
<li>o guia de voz do livro, que herda as regras do blog (o meu WRITER.md, o humanizer e a minha checklist de acabamento) e só adiciona o que muda quando o texto sai de um post datado e vai pra um livro que um leigo segura na mão;</li>
<li>um arquivo de continuidade, dizendo qual capítulo explica cada conceito e como cada personagem se chama, pra ninguém explicar &ldquo;janela de contexto&rdquo; cinco vezes;</li>
<li>a estrutura inteira, pra cada agente saber o que os outros capítulos cobrem.</li>
</ul>
<p>Além das regras de voz que já existiam (capítulo abre numa cena com data, lugar e algo em jogo, nunca numa definição; fecha num gancho pro próximo, nunca em &ldquo;neste capítulo vimos&rdquo;), algumas das regras que saíram do piloto, pra dar o gosto:</p>
<ul>
<li>quando o resumo do capítulo e o post discordam num detalhe, vale o post;</li>
<li>o capítulo que é dono de um conceito explica direito; se o termo aparece antes na ordem de leitura, ganha meia frase de glosa e um ponteiro, nunca uma segunda explicação;</li>
<li>fato verificado na internet ganha citação mesmo que o post original não tivesse link;</li>
<li>nome de modelo e produto na grafia do fornecedor, mesmo quando o blog abreviou.</li>
</ul>
<blockquote>
  <p>É o arquivo de instruções de projeto que eu descrevo no capítulo sobre como falar com a máquina, na escala de um livro. Quem já fez um AGENTS.md pra uma base de código reconhece tudo.</p>

</blockquote>
<h2>Passo 4: rascunhos em paralelo, contradições esperadas<span class="hx:absolute hx:-mt-20" id="passo-4-rascunhos-em-paralelo-contradições-esperadas"></span>
    <a href="#passo-4-rascunhos-em-paralelo-contradi%c3%a7%c3%b5es-esperadas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Com o contrato pronto, os capítulos foram rascunhados em paralelo, um agente por capítulo, em duas levas: partes I e II primeiro, depois III a V, pra que os capítulos de trás pudessem construir em cima dos da frente. Cada agente recebia o brief do seu capítulo, as análises, os posts completos, a linhagem e os arquivos dos projetos de referência que precisasse.</p>
<p>Agentes trabalhando ao mesmo tempo se contradizem, e isso aconteceu. Um capítulo dizia que o FrankMD teve uns 130 commits em três dias; outro, que teve 212 em 19 dias. Os dois números vinham dos posts e estavam certos, só que eram janelas diferentes. Um registro de integração juntou esses conflitos, e a regra virou explicitar a janela em cada capítulo.</p>
<p>Depois dos rascunhos vem a passada de integração, com outro conjunto de agentes, cada um dono de um grupo de capítulos e proibido de tocar nos outros. O trabalho deles: aplicar o registro de conflitos, cortar conceito explicado duas vezes, conferir que cada callback bate com o que o outro capítulo de fato diz, garantir que o último parágrafo de um capítulo leva pro primeiro do seguinte, e refazer a conferência de fatos assumindo que o rascunho está errado.</p>
<p>Pra ler as emendas, o build gera um arquivo de &ldquo;costuras&rdquo;: o parágrafo final de cada unidade ao lado do parágrafo inicial da próxima. É a leitura mais rápida que existe pra achar onde o livro deixa de parecer um livro só.</p>
<h2>Passo 5: uma marca invisível por parágrafo<span class="hx:absolute hx:-mt-20" id="passo-5-uma-marca-invisível-por-parágrafo"></span>
    <a href="#passo-5-uma-marca-invis%c3%advel-por-par%c3%a1grafo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esta é a parte que eu acho mais útil do projeto inteiro. Cada parágrafo do livro, no arquivo de origem, carrega um comentário dizendo de onde veio:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">&lt;!-- src: 2026/09/28/llms-sao-boas-em-reproduzir-o-que-existe-e-coisas-novas --&gt;
</span></span><span class="line"><span class="cl">Todo LLM foi treinado só no que é público...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;!-- src: original --&gt;
</span></span><span class="line"><span class="cl">Texto novo, escrito pro livro.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;!-- src: ref:ai-jail/README.md --&gt;
</span></span><span class="line"><span class="cl">Fato conferido no projeto de referência.</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>A marca some na hora de montar o livro, por um filtro Lua do Pandoc, então o leitor nunca vê. Ela serve pra manutenção. Eu edito post depois de publicado o tempo todo, e o livro precisa acompanhar.</p>
<p>O comando <code>rake drift</code> refaz o inventário, compara os hashes, e lista os capítulos que dependem de um post que mudou, com o diff do post desde o commit em que o livro o leu pela última vez. A marca leva direto aos parágrafos que saíram daquele post, e só eles precisam de revisão. Resolvido, um script grava o novo hash e o commit.</p>
<p>Exemplo real, de hoje. Removi do <a href="/2026/10/13/engenharia-reversa-com-ia-a-adobe-morreu/">post sobre engenharia reversa</a> um parágrafo sobre um vídeo do Linus Tech Tips. O <code>drift</code> apontou o capítulo 19 e um apêndice; o diff mostrou que aquele trecho nunca tinha sido usado no livro; dois comandos depois, os dois estavam carimbados com o hash novo. Sem a marca, eu teria que reler dois capítulos pra descobrir que não precisava mudar nada.</p>
<p>A bibliografia faz o mesmo papel pras fontes externas: cada referência anota qual post a citou. E as imagens têm cada uma a sua ficha de origem.</p>
<h2>Passo 6: o que a conferência pegou<span class="hx:absolute hx:-mt-20" id="passo-6-o-que-a-conferência-pegou"></span>
    <a href="#passo-6-o-que-a-confer%c3%aancia-pegou" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cada número, data e nome foi conferido contra três oráculos: os posts, os projetos de referência e fontes primárias na internet, com o mesmo prompt de checagem adversarial que eu uso nos artigos do blog. A lista completa está no posfácio do livro, e boa parte das correções é do meu próprio blog:</p>
<ul>
<li>no review de março do mini-PC com Strix Halo, eu tinha separado 96 GB de memória pra GPU; em abril baixei pra 64, e posts posteriores ainda diziam 96. O livro usa 64 pra tudo depois de abril;</li>
<li>um defeito na contagem de uma das ferramentas do benchmark subestimou de 40 a 90 vezes o custo das execuções feitas nela antes de agosto. O livro não cita nenhum desses custos;</li>
<li>no texto de junho sobre o Claude Fable 5, escrevi que ele custava dez vezes mais que o Opus 4.8 por execução. Refazendo as contas em julho, com os tokens lidos do cache incluídos, o Fable custava quase o dobro. O post ainda diz dez vezes; o livro conta o número errado e a correção;</li>
<li>num texto de março, escrevi que a Anthropic tinha comprado o Bun no fim de 2024. O anúncio é de dezembro de 2025;</li>
<li>um resumo de capítulo, escrito por agente, dizia que a trava de assinatura do Claude Code caiu em menos de um dia depois do vazamento. O anúncio saiu umas 30 horas depois, e o livro diz &ldquo;no dia seguinte&rdquo;.</li>
</ul>
<blockquote>
  <p>Os rascunhos saíram rápido. A confiança no texto veio da conferência. E a fonte vence o resumo, inclusive quando o resumo vem da máquina.</p>

</blockquote>
<h2>Passo 7: capítulo com erro não passa<span class="hx:absolute hx:-mt-20" id="passo-7-capítulo-com-erro-não-passa"></span>
    <a href="#passo-7-cap%c3%adtulo-com-erro-n%c3%a3o-passa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Por cima de tudo roda um verificador automático, o equivalente da integração contínua. São scripts em Ruby, só biblioteca padrão, encadeados num Rakefile, mais o que eles chamam por fora: o verificador de gráfico é Python porque vive dentro do matplotlib, a auditoria de página usa o poppler, e o epubcheck precisa de Java:</p>
<ul>
<li>um <strong>linter de capítulo</strong> reprova travessão, frase proibida pelo guia de voz, URL solta no meio da prosa, chave de citação desconhecida, parágrafo sem marca de origem, e avisa de parágrafo longo demais;</li>
<li>um <strong>doctor</strong> confere que toda referência cruzada, citação, termo de glossário e figura existe, que a proveniência bate com o inventário, que nenhum post anterior ao corte vazou, que as traduções estão em dia, e faz uma heurística de callback: uma frase que aponta pra outro capítulo usando nomes que aquele capítulo já não contém;</li>
<li>uma <strong>auditoria de página</strong> abre o PDF pronto e procura bloco partido entre páginas, título órfão no pé da página, página quase vazia, imagem grande demais, linha estourando a margem;</li>
<li>um <strong>verificador de gráfico</strong> procura rótulo que vazou da caixa;</li>
<li>o <strong>epubcheck</strong> valida o EPUB 3;</li>
<li>um <strong>relatório de estilo</strong> pra copidesque: trecho repetido entre capítulos (consequência inevitável de posts que repetem a mesma tese por ângulos diferentes), frase recorrente, palavra usada demais, variante de termo, comparativo mal formado em português.</li>
</ul>
<p>E os scripts têm teste. Uma suíte de quase 170 testes monta um livro de mentira num diretório temporário, com cinco posts falsos num repositório git falso, e confere que cada ferramenta pega o problema que deveria pegar. Quando um bug é corrigido, entra o teste que teria pegado ele, com um comentário dizendo qual regressão protege. Roda no CI antes de cada build.</p>
<h2>A pipeline de montagem<span class="hx:absolute hx:-mt-20" id="a-pipeline-de-montagem"></span>
    <a href="#a-pipeline-de-montagem" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A toolchain é Quarto, que embute Pandoc e Typst, fixada em versão dentro do repositório. Sem LaTeX. Um único <code>rake build</code> produz, da mesma árvore de arquivos Markdown:</p>
<table>
  <thead>
      <tr>
          <th>Saída</th>
          <th>Pra quê</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>EPUB 3</td>
          <td>Kindle, Kobo, Apple Books, qualquer leitor</td>
      </tr>
      <tr>
          <td>PDF de tela</td>
          <td>ler no computador ou tablet, com capa</td>
      </tr>
      <tr>
          <td>PDF de impressão</td>
          <td>6 por 9 polegadas, versos em branco, capítulo abrindo na direita</td>
      </tr>
      <tr>
          <td>HTML</td>
          <td>edição web</td>
      </tr>
      <tr>
          <td>DOCX</td>
          <td>pra editor que quer Word</td>
      </tr>
  </tbody>
</table>
<p>Português e inglês são perfis do Quarto, gerados do mesmo arquivo de estrutura. Citações saem de um YAML em formato CSL compartilhado pelas duas edições, com um estilo ABNT ajustado pra português. O glossário é um filtro Lua: cada termo vem marcado no fonte onde aparece, e o filtro liga a marca à entrada, expande a sigla na primeira vez e gera a página.</p>
<p>O Typst resolveu uma coisa que eu achava que ia me custar semanas: PDF com cara de livro tipografado, hifenização em português, ligaduras, sem a dor de TeX. A auditoria de página depois do build pega o que o motor deixou passar, e um <code>rake fit</code> recompila apertando capítulos que terminam numa página quase vazia.</p>
<h3>As figuras<span class="hx:absolute hx:-mt-20" id="as-figuras"></span>
    <a href="#as-figuras" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Toda figura é código ou tem ficha. Gráficos e diagramas de caixas e setas são scripts de matplotlib, 43 deles, cada um com a indicação do capítulo de onde vieram os dados, e com os rótulos em português e em inglês dentro do próprio script: o mesmo gráfico sai nas duas línguas. O caminho pra diagramas em D2 existe no repositório, e nenhuma figura do livro precisou dele.</p>
<p>As ilustrações conceituais foram geradas por IA, com o modelo, o pedido e a data de cada uma gravados na ficha de crédito, e o livro declara isso. A regra que eu me impus: nenhuma imagem de pessoa real gerada por IA. Pessoas reais só aparecem em fotos com licença livre, com o crédito na legenda.</p>
<p>A capa é o robô retrofuturista de rosto cansado, ajoelhado numa Feira Mundial dos anos 1950, estudando a própria mão enquanto a multidão assiste. O pedido ao modelo descrevia a cena pra segurar três medos de uma vez: o fim da humanidade, perder o emprego, a máquina ficando consciente. A ficha da capa guarda o prompt inteiro. O rosto é o do Marvin, o personagem da minha newsletter, e um adesivo com a minha cara fica ao lado do nome.</p>
<h2>As manhas de transformar post em livro<span class="hx:absolute hx:-mt-20" id="as-manhas-de-transformar-post-em-livro"></span>
    <a href="#as-manhas-de-transformar-post-em-livro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Transformar blog em livro é uma lista de conversões mecânicas, e cada uma tem pegadinha:</p>
<ul>
<li><strong>Link vira citação.</strong> Cada link externo virou uma entrada de bibliografia, e a frase precisa ficar de pé sem o link. Link pra outro post meu virou referência cruzada pro capítulo que agora cobre aquilo, ou sumiu. Nunca uma URL na prosa.</li>
<li><strong>&ldquo;Hoje&rdquo;, &ldquo;ontem&rdquo;, &ldquo;semana passada&rdquo;, &ldquo;atualização:&rdquo;</strong> viraram data absoluta. O livro vai ser lido em 2028 também.</li>
<li><strong>Versão de modelo, preço, nota de benchmark</strong> ficaram como fotografia datada (&ldquo;em setembro de 2026, o melhor&hellip;&rdquo;), e quando um post posterior substituiu o número, o livro conta a mudança em vez de imprimir o número velho.</li>
<li><strong>Dump de código, passo de instalação, print de terminal</strong> foram cortados. No máximo um trecho de 3 a 8 linhas quando o código é o ponto; o passo a passo foi pra apêndice.</li>
<li><strong>Título de post, que é feito pra busca</strong> (&ldquo;Vibe Code: fiz X em dois dias&rdquo;), virou título literário curto, com o assunto no subtítulo.</li>
<li><strong>Repetição entre posts</strong>, a mesma tese por muitos ângulos, é dita uma vez, no lugar certo, e os capítulos seguintes constroem em cima.</li>
<li><strong>Chamada pra ação, &ldquo;assine&rdquo;, &ldquo;comente&rdquo;</strong>, cortadas.</li>
<li><strong>A ponta afiada mira na propaganda, nunca no leitor.</strong> O post &ldquo;Você é um idiota se acredita&hellip;&rdquo; virou um capítulo sobre como os anúncios funcionam. O leitor que acreditou no anúncio é a pessoa que o livro quer ajudar.</li>
<li><strong>Todo termo técnico é explicado uma vez</strong>, na primeira aparição no livro, e vai pro glossário.</li>
</ul>
<p>E a mais importante de todas: o livro lê como história em primeira pessoa, com o ano como espinha dorsal. A informação chega quando a narrativa precisa dela, em vez de seguir ordem de enciclopédia. Isso é o oposto de como um blog é escrito, e foi a regra que mais trabalho deu pros agentes seguirem.</p>
<h2>A edição em inglês<span class="hx:absolute hx:-mt-20" id="a-edição-em-inglês"></span>
    <a href="#a-edi%c3%a7%c3%a3o-em-ingl%c3%aas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A edição em inglês, <em>Competent Enough</em>, só começou depois que eu aprovei a em português. Cada unidade traduzida grava o hash do arquivo em português de onde saiu, e onde o livro segue um post meu que já tinha versão em inglês no blog, a tradução usa a minha própria redação em inglês em vez de traduzir de novo.</p>
<p>O <code>drift</code> também funciona por língua: se eu mudo um parágrafo em português, ele aponta a unidade em inglês que ficou velha, e só os parágrafos marcados são retraduzidos. Os gráficos com texto são gerados de novo em inglês a partir dos mesmos scripts, e a capa em inglês é composta por script em cima da mesma arte.</p>
<h2>Lançar é empurrar uma tag<span class="hx:absolute hx:-mt-20" id="lançar-é-empurrar-uma-tag"></span>
    <a href="#lan%c3%a7ar-%c3%a9-empurrar-uma-tag" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Lançamento é uma entrada no CHANGELOG e um <code>git push</code> de uma tag <code>vX.Y.Z</code>. Um workflow do GitHub Actions roda os testes, monta as duas edições em todos os formatos, valida o EPUB, roda a auditoria e publica a release com os arquivos. Ele apaga todas as releases menos as duas mais novas, e mantém as tags. É assim que a página oficial sempre aponta pra versão atual.</p>
<p>O repositório é público, e isso trouxe uma pegadinha própria: as anotações do meu servidor de casa são fonte de alguns fatos, e são privadas. Os marcadores de origem citam esses arquivos por apelido, o mapa de apelidos fica fora do git, e um hook de pré-push bloqueia qualquer arquivo ou mensagem de commit que contenha nome de repositório privado, host ou IP.</p>
<h2>O copidesque: o que a máquina de checagem deixa passar<span class="hx:absolute hx:-mt-20" id="o-copidesque-o-que-a-máquina-de-checagem-deixa-passar"></span>
    <a href="#o-copidesque-o-que-a-m%c3%a1quina-de-checagem-deixa-passar" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Lint, doctor, auditoria de página e testes pegam problema estrutural. Eles deixam passar o que um livro escrito por muitos agentes, cada um vendo poucos capítulos, sempre sofre: a mesma frase ou anedota reaproveitada em três capítulos, tom que deriva, terminologia inconsistente, concordância escorregando. Pra isso existe um procedimento de copidesque, que roda uma vez por versão, em três passos do mais barato pro mais caro.</p>
<p><strong>Passo 1, mecânico e quase de graça:</strong> o relatório de estilo que eu citei acima. Sequências de sete palavras ou mais que aparecem em mais de uma unidade, ou seja, frase reaproveitada e anedota recontada; frases feitas de quatro a seis palavras usadas em muitos capítulos, que são bonitas como callback e viram tique quando se repetem; palavra usada muito mais num capítulo do que no resto; variante de termo (&ldquo;e-mail&rdquo; e &ldquo;email&rdquo;, &ldquo;Open AI&rdquo; e &ldquo;OpenAI&rdquo;); e uma heurística de concordância em português. O relatório é uma lista de trabalho, e nada muda sozinho.</p>
<p><strong>Passo 2, a leitura corrida:</strong> um agente só de leitura por parte do livro, cada um lendo as suas unidades em ordem, do começo ao fim, com uma folha de estilo compartilhada (nomes, grafias, termos, frases recorrentes vindas do passo 1). Cada um produz um relatório ranqueado, sem editar nada: erro de digitação e gramática primeiro, depois inconsistência com a folha de estilo, repetição que o leitor notaria, trecho em que um leigo tropeçaria, e ritmo só nos piores casos. Um script valida os relatórios, confere que cada trecho citado existe mesmo na unidade, numera os itens e resume.</p>
<p>Daí vem a triagem, feita por mim com um agente editor, e a aplicação pontual de cada item aprovado, com as mesmas regras da passada de integração. Modelo mais barato faz a revisão; trecho difícil vai pro modelo forte. Orçamento aproximado: dois a três milhões de tokens por língua.</p>
<p>A regra mais importante desse passo é &ldquo;fato se confere, não se pergunta&rdquo;. Qualquer item que dependa de um número, data, nome ou comportamento de ferramenta é resolvido pelo editor contra a fonte da verdade antes de chegar em mim: primeiro o post apontado pela marca de origem do parágrafo, recalculando totais; depois o código ou os dados por trás da afirmação, nos meus repositórios; depois registro público.</p>
<p>Quando duas fontes discordam, a tarefa é descobrir por quê. &ldquo;653 commits em 8 projetos&rdquo; contra &ldquo;692 em 4&rdquo; eram dois recortes do mesmo trabalho, um deles sem o repositório privado da newsletter, e o texto passou a dizer o escopo em vez de escolher um número. Quando o post do blog está errado, o livro imprime o certo e o erro vai pra uma lista de errata do blog, pra eu corrigir na fonte.</p>
<p>Só chega em mim o que fonte nenhuma resolve: fato não publicado, intenção (&ldquo;isso é ironia?&rdquo;), preferência de corte ou de título, e contradição entre duas afirmações minhas sem registro pra desempatar. Cada pergunta vem com o que foi conferido e o que foi encontrado.</p>
<p><strong>Passo 3, a minha leitura.</strong> A última e a mais valiosa. As notas entram no mesmo ciclo de aplicar, conferir e propagar pra edição em inglês.</p>
<p>A primeira rodada desse copidesque é o que separa o preview 2 do preview 3. Entre o que ela pegou: contagem de commits agora diz o escopo, um &ldquo;mais de mil&rdquo; que na soma era 984, o exemplo de votação do Frank Investigator que não batia com o código (figura redesenhada), as citações do David Sacks e do Pirate Wires no capítulo 14 conferidas contra os originais e corrigidas, a foto do Sam Altman trocada por uma de 2025. E na edição em inglês, uma leitura própria depois da ressincronização: decalque de português reescrito, termos do glossário usados do mesmo jeito, pontuação americana de citação do começo ao fim.</p>
<h2>Leitores de mentira, feedback de verdade<span class="hx:absolute hx:-mt-20" id="leitores-de-mentira-feedback-de-verdade"></span>
    <a href="#leitores-de-mentira-feedback-de-verdade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Copidesque confere o texto. Ele deixa passar a pergunta que importa num livro pra leigo: a pessoa pra quem eu escrevi consegue ler isso até o fim, entende, e sai convencida? Pra responder, a passada seguinte foi uma revisão por leitores simulados.</p>
<p>O prefácio do livro tem uma seção &ldquo;Pra quem eu escrevi&rdquo;. Dela saíram cinco personas, cada uma com nome, idade, profissão e o medo que a trouxe ao livro:</p>
<ul>
<li><strong>Marina</strong>, 38, contadora em Belo Horizonte, leu que o emprego dela &ldquo;acaba em dois anos&rdquo;, lê no celular à noite e quer saber o que fazer na segunda-feira;</li>
<li><strong>Roberto</strong>, 52, dono de loja de ferragens, o filho de 15 anos viu um vídeo sobre superinteligência e perguntou se era verdade; desconfia de hype, de &ldquo;especialista&rdquo; e de autor que se exibe;</li>
<li><strong>Carla</strong>, 44, gerente de operações numa empresa de logística, a diretoria contratou consultoria vendendo &ldquo;transformação por IA&rdquo;; quer uma decisão que ela possa tomar;</li>
<li><strong>Lucas</strong>, 24, desenvolvedor júnior há um ano, com medo de ter escolhido a carreira errada;</li>
<li><strong>Helena</strong>, 61, professora de história aposentada, sem medo nenhum, veio pelas histórias e perde a paciência com lista e manual.</li>
</ul>
<p>Um agente por persona, só de leitura, modelo mais barato, lê o livro inteiro em ordem como aquela pessoa leria. A instrução é explícita: você é leitor, editor fica de fora; erro de vírgula já foi tratado, reporte só o que muda a experiência de leitura. Cada um devolve uma nota de 1 a 5 por capítulo, um comentário na voz da persona (&ldquo;finalmente entendi por que o chatbot concorda comigo&rdquo;, &ldquo;me perdeu nas tabelas de benchmark&rdquo;), no máximo 35 anotações classificadas em confuso, chato, reescrever ou lógica, e candidatos a corte. Custa uns 350 mil tokens por persona por leitura completa.</p>
<p>Um editor consolida: a matriz de notas por capítulo e persona e o padrão por trás dela, o que os leitores adoraram (pra proteger em qualquer edição), os itens de lógica, conferidos contra o texto e os posts antes de entrar na lista e corrigidos independentemente de voto, e os itens de clareza ranqueados por quantas personas levantaram. Nota de gosto de uma persona só é descartada. Daí eu decido, e o padrão recorrente vira regra numerada num documento de regras editoriais, com a origem e como é fiscalizado.</p>
<blockquote>
  <p>A primeira leitura disse o que eu desconfiava e deu a medida: histórias e ferramentas práticas funcionam pra todo mundo; o miolo cheio de medição, os capítulos 11 a 13, perde quem não programa, com nota média entre 2,2 e 2,4. &ldquo;Afiado quando conta o que aconteceu com ele, me perde quando conta o que mediu&rdquo;, resumiu a Helena, por todos os cinco.</p>

</blockquote>
<p>E os cinco pegaram as mesmas falhas de argumento. A conclusão do capítulo 20 ia além da evidência: dizia &ldquo;os números dizem que ela não vai ficar mais inteligente&rdquo; apoiada num benchmark de programação que o próprio capítulo chama de saturado. O capítulo 9 argumentava de um jeito que nunca perde: toda falha do agente era culpa do pedido. Quatro dos cinco foram mandados pro capítulo errado pelo &ldquo;como ler&rdquo;.</p>
<p>Isso virou as primeiras regras:</p>
<ul>
<li>toda afirmação com o escopo do que foi medido;</li>
<li>nenhum argumento que não possa perder;</li>
<li>opinião marcada como opinião;</li>
<li>o lado contrário na forma mais forte antes de rebater;</li>
<li>o livro obedece às próprias lições.</li>
</ul>
<p>Uma rodada só é pouco, porque edição conserta o problema velho e cria o novo. Na segunda rodada, uma frase de desculpa colocada ao lado de uma contradição (&ldquo;eu sei que isso parece bater de frente&hellip;&rdquo;) fez os cinco leitores notarem a contradição que antes três tinham deixado passar. Virou regra: conserta o desenho, e a desculpa fica fora. Então o processo é em rodadas: ler, editar, ler de novo com as mesmas personas e leitura nova, proibidas de abrir os relatórios anteriores pra evitar ancoragem, e um script compara as rodadas.</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th style="text-align: right">rodada 1</th>
          <th style="text-align: right">rodada 2</th>
          <th style="text-align: right">rodada 3</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>nota média do livro</td>
          <td style="text-align: right">3,32</td>
          <td style="text-align: right">3,38</td>
          <td style="text-align: right">3,41</td>
      </tr>
      <tr>
          <td>anotações de lógica</td>
          <td style="text-align: right">73</td>
          <td style="text-align: right">53</td>
          <td style="text-align: right">51</td>
      </tr>
  </tbody>
</table>
<p>A nota média é ruidosa (um capítulo intocado oscila 0,6 entre leituras), então o critério de parada é outro: os problemas apontados deixaram de voltar e nada novo chega a três leitores. Na terceira rodada a curva achatou e a revisão parou ali, com uma lista de pendências pra minha própria leitura. O que mudou no caminho: uns 8 mil palavras de caderno de laboratório saíram dos capítulos pra um apêndice novo, &ldquo;Para quem programa: os bastidores&rdquo;, cada parágrafo levando a marca de origem junto; a lista de leituras virou apêndice; a seção sobre o Genesys PI foi estacionada, guardada fora do livro enquanto a verificação está pendente; o capítulo 19 ganhou o título que o argumento dele sustenta; cada capítulo abre orientando o leitor antes do primeiro jargão; e o epílogo ganhou uma lista do que fazer nesta semana, por tipo de leitor. Custo das três rodadas: uns 5 milhões de tokens de leitura mais uns 3 milhões de edição e ressincronização do inglês.</p>
<h2>O narrador ganhou passado<span class="hx:absolute hx:-mt-20" id="o-narrador-ganhou-passado"></span>
    <a href="#o-narrador-ganhou-passado" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Com o argumento no lugar, faltava substância na primeira pessoa. O narrador do livro era o Akita de 2026, e eu tenho trinta anos de história que explicam por que eu penso o que penso: o estouro da bolha pontocom visto de dentro, cinco anos integrando SAP em empresa grande, os avisos sobre a bolha de contratação que eu dei em vídeo em 2019, 2020 e 2022, o &ldquo;Não terceirize suas decisões&rdquo;. Tudo isso está nas transcrições dos 149 episódios do <a href="https://www.youtube.com/@Akitando"target="_blank" rel="noopener">Akitando</a>, publicadas aqui no blog entre 2018 e 2023.</p>
<p>O processo foi o mesmo do resto do livro, em miniatura. Agentes de extração leram 23 episódios na íntegra, com um formulário: fatos biográficos com a citação literal e o que os verificaria, fatos sobre o mundo, posições recorrentes nas minhas palavras, e ganchos, ou seja, o lugar exato do livro onde uma ou duas frases dessa história sustentam uma afirmação de 2026. Daí saiu um perfil do narrador, que eu confirmei linha a linha, e um plano com uns 30 toques, a maioria de uma a três frases.</p>
<p>Antes de qualquer toque, mais de 140 afirmações tiradas dos episódios passaram pela checagem. Ela corrigiu o livro e corrigiu a mim: a bolha de contratação começou por volta de 2010, com o juro perto de zero, e o meu post de fevereiro dizia 2014; a pontocom estourou entre 2000 e 2002; as demissões de 2022 foram umas 165 mil. E achou erro em episódio antigo que o livro nem usa, que foi pra uma lista de errata do blog.</p>
<p>Os toques entraram onde a experiência vira evidência: a semana de 2001 em que a minha pontocom fechou e um mentor me chamou pra uma consultoria SAP; os anos de SAP por trás da afirmação de que o modelo é cego pras regras privadas de uma empresa; os avisos datados da bolha ao lado do erro admitido, porque em 2022 eu esperava uma segunda perna de queda em 2023 que a onda de IA cancelou. Dois apêndices novos saíram daí: &ldquo;Três bolhas&rdquo;, com os números verificados da pontocom, da bolha de juro zero e da onda de IA, e &ldquo;Como estudar com a IA do lado&rdquo;, a partir do episódio mais assistido do canal.</p>
<p>Esses episódios são fonte de fundo, e o <code>drift</code> passou a vigiá-los como vigia os posts de 2026. Depois veio uma checagem reduzida com as mesmas cinco personas, só nos capítulos tocados, com três perguntas a mais: a história do narrador deixa o argumento mais convincente, e onde? Alguma passagem parece exibição ou &ldquo;eu avisei&rdquo;? Alguma coisa sobre o narrador se contradiz?</p>
<blockquote>
  <p>Os cinco disseram sim pra credibilidade, com uma condição: a história convence quando é evidência que o leitor consegue checar, o aviso com data ao lado do erro admitido, e convence menos quando vira currículo, o que bate de frente com o próprio livro, que diz &ldquo;currículo não é argumento&rdquo;. Virou a regra 21: a história do narrador entra como evidência, e credencial fica de fora.</p>

</blockquote>
<p>Três ou quatro leitores marcaram as mesmas linhas como exibição, e elas saíram: &ldquo;Os avisos têm data&rdquo;, &ldquo;mais de trinta repositórios públicos&rdquo;, &ldquo;o mais visto do meu canal&rdquo;. As linhas de autodepreciação e os erros admitidos, todos contaram a favor. E a checagem achou contradições que eu mesmo não tinha visto: o prefácio dizia &ldquo;fim dos anos 90&rdquo; e o capítulo 18 dizia 1996; um capítulo falava em &ldquo;oito meses&rdquo; e outro em &ldquo;um ano de uso diário&rdquo;, e foram consertadas uma a uma.</p>
<h2>Acessibilidade também faz parte do build<span class="hx:absolute hx:-mt-20" id="acessibilidade-também-faz-parte-do-build"></span>
    <a href="#acessibilidade-tamb%c3%a9m-faz-parte-do-build" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Um EPUB abrir no Kindle não quer dizer que ele seja acessível. Este livro tem dezenas de diagramas, gráficos e tabelas. Sem trabalho adicional, boa parte do argumento simplesmente desaparece pra quem usa leitor de tela.</p>
<p>Por isso a pipeline agora trata acessibilidade como contrato de publicação. Cada uma das 55 figuras, nas duas línguas, ganhou um texto alternativo curto e uma descrição completa do que a imagem comunica. No HTML e no EPUB, a descrição detalhada aparece junto da figura; no PDF, entra como substituto semântico sem alterar a diagramação. Tabelas ganharam legendas, e o EPUB agora identifica no índice semântico onde começam o texto principal, o glossário, as referências e os créditos das imagens. O contrato de autoria está <a href="https://github.com/akitaonrails/ai-book-2026/blob/main/docs/ACCESSIBILITY.md"target="_blank" rel="noopener">documentado no repositório</a>.</p>
<p>Isso também não ficou dependendo da minha memória. <code>rake check</code> barra figura sem as duas descrições ou com alternativa longa demais. Cada build valida os dois EPUBs com EPUBCheck, DAISY Ace e verificadores próprios do projeto. A versão pra Kindle ainda passa por uma limpeza do CSS e dos ícones embutidos que costumam dar problema nos leitores da Amazon, mas o script se recusa a remover qualquer regra da qual o conteúdo tenha passado a depender.</p>
<p>Ferramenta automática nenhuma certifica WCAG ou garante o comportamento de todo leitor do mercado. A revisão manual continua obrigatória. A diferença é que a acessibilidade agora faz parte do build e cada mudança precisa preservar esse contrato.</p>
<h2>O que continua sendo meu<span class="hx:absolute hx:-mt-20" id="o-que-continua-sendo-meu"></span>
    <a href="#o-que-continua-sendo-meu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O repositório registra o primeiro commit e o rascunho de todos os capítulos no mesmo dia, 13 de outubro. São os primeiros dez por cento, os que impressionam e quase não dizem nada sobre o resto. Os outros noventa por cento são leitura, corte e correção, e essa parte é minha. Nenhum capítulo entra sem eu ler e aprovar, e o que eu mando refazer volta pro mesmo processo.</p>
<p>Qualquer um dos bons modelos de outubro de 2026 teria escrito rascunhos parecidos, porque modelo virou commodity. O que fez o processo funcionar foi o que está em volta dele: o inventário, o contrato escrito, o verificador automático, as fontes como oráculo, o rastro por parágrafo. É a mesma engenharia de software velha que eu defendo em cada capítulo, aplicada a texto.</p>
<blockquote>
  <p>Os agentes foram competentes o suficiente pra escrever o rascunho. Decidir o que ele dizia continuou sendo trabalho meu.</p>

</blockquote>
<p>E, mais uma vez: fazer um livro com IA não é um prompt de &ldquo;escreva um livro pra mim&rdquo; e pronto. Eu tive que inventar o processo inteiro e pilotar o agente pra criar cada peça dele: os scripts, os testes, a consolidação dos posts, a estratégia narrativa, os objetivos, o que fica e o que sai, o copidesque, a checagem de fatos, o lançamento automatizado. Você precisa saber exatamente o que quer, e aí a IA ajuda muito. Quem não sabe o que um processo de publicação de livro envolve não vai fazer um livro de verdade, e mostrar isso era um dos objetivos que eu tinha ao criar este exemplo.</p>
<h2>Baixe, leia, e me diga onde errei<span class="hx:absolute hx:-mt-20" id="baixe-leia-e-me-diga-onde-errei"></span>
    <a href="#baixe-leia-e-me-diga-onde-errei" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>As duas edições, em três formatos cada, direto do GitHub, sem cadastro. A versão atual é a 1.0.0 final, de 17 de outubro, com tudo que este texto descreve:</p>
<table>
  <thead>
    <tr><th>Edição</th><th>EPUB (Kindle, Kobo, Apple Books)</th><th>PDF pra tela</th><th>PDF pra impressão (6 × 9 pol.)</th></tr>
  </thead>
  <tbody>
    <tr><td>Competente o Suficiente (PT-BR)</td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competente-o-Suficiente.epub">EPUB</a></td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competente-o-Suficiente-ebook.pdf">PDF</a></td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competente-o-Suficiente.pdf">PDF capa dura</a> · <a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competente-o-Suficiente-paperback.pdf">PDF brochura</a></td></tr>
    <tr><td>Competent Enough (EN)</td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competent-Enough.epub">EPUB</a></td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competent-Enough-ebook.pdf">PDF</a></td><td><a href="https://github.com/akitaonrails/ai-book-2026/releases/download/v1.0.0/Competent-Enough.pdf">PDF</a></td></tr>
  </tbody>
</table>
<p>A versão mais recente, sempre, fica na <a href="https://ailair.akitaonrails.com/pt-br/book/"target="_blank" rel="noopener">página do livro</a> e nas <a href="https://github.com/akitaonrails/ai-book-2026/releases"target="_blank" rel="noopener">releases do GitHub</a>.</p>
<p>É preview. Vai ter erro, e o processo acima existe pra que ele seja corrigido no lugar certo. Achou um, <a href="https://github.com/akitaonrails/ai-book-2026/issues"target="_blank" rel="noopener">abra uma issue</a>.</p>
]]></content:encoded><category>inteligencia-artificial</category><category>agentes-de-codigo</category><category>open-source</category></item><item><title>Engenharia Reversa com IA: a Adobe morreu?</title><link>https://akitaonrails.github.io/2026/10/13/engenharia-reversa-com-ia-a-adobe-morreu/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/10/13/engenharia-reversa-com-ia-a-adobe-morreu/</guid><pubDate>Tue, 13 Oct 2026 00:00:00 -0300</pubDate><description>&lt;p&gt;O PhotoCraft existe. O REA existe. Recomp e decomp de jogo antigo saem todo dia. Logo: a Adobe morreu, nenhum binário é sagrado, e programador acabou.&lt;/p&gt;
&lt;p&gt;Essa foi a semana no X, e se você só lê manchete, é uma conclusão razoável. Este texto é pra quem quer saber o que cada uma dessas coisas faz de verdade.&lt;/p&gt;
&lt;p&gt;Explodiu no dia 9, quando a conta abaixo resumiu o que um desenvolvedor de Atlanta, Brandon Thomas, vinha publicando desde o fim de setembro: sete clones de código aberto dos produtos principais da Adobe, escritos em Rust com ajuda do Claude Opus 5.5. Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign, Acrobat. Tudo de graça, tudo feito em &amp;ldquo;sala limpa&amp;rdquo;, sem uma linha de código da Adobe. A conta que viralizou foi esta:&lt;/p&gt;</description><content:encoded><![CDATA[<p>O PhotoCraft existe. O REA existe. Recomp e decomp de jogo antigo saem todo dia. Logo: a Adobe morreu, nenhum binário é sagrado, e programador acabou.</p>
<p>Essa foi a semana no X, e se você só lê manchete, é uma conclusão razoável. Este texto é pra quem quer saber o que cada uma dessas coisas faz de verdade.</p>
<p>Explodiu no dia 9, quando a conta abaixo resumiu o que um desenvolvedor de Atlanta, Brandon Thomas, vinha publicando desde o fim de setembro: sete clones de código aberto dos produtos principais da Adobe, escritos em Rust com ajuda do Claude Opus 5.5. Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign, Acrobat. Tudo de graça, tudo feito em &ldquo;sala limpa&rdquo;, sem uma linha de código da Adobe. A conta que viralizou foi esta:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">AI is now being used to recreate Adobe's software, a developer has released seven free, open-source apps as clean-room alternatives to Adobe's main tools:<br><br>- PhotoCraft → Photoshop<br>- VectorCraft → Illustrator<br>- FilmCraft → Premiere Pro<br>- LightCraft → Lightroom<br>- EffectCraft → After Effects<br>- DesignCraft → InDesign<br>- PrintCraft → Acrobat Pro<br><br>Built in Rust with help from Claude Opus 5.5, they run on Windows, Linux, and macOS under MIT/Apache licenses without using Adobe's source code.</p>&mdash; Pirat_Nation (@Pirat_Nation) <a href="https://twitter.com/Pirat_Nation/status/2108437553615425881">October 9, 2026</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Na mesma semana, o <a href="https://github.com/morluto/rea"target="_blank" rel="noopener">REA</a>, &ldquo;Reverse Engineer Anything&rdquo;, passou de 100 mil estrelas no GitHub, ganhando dezenas de milhares por dia. A promessa da página: &ldquo;viu uma feature num app que você quer no seu produto? Peça pro seu agente investigar com o REA e construir uma versão pro seu projeto&rdquo;.</p>
<p>E quem acompanha retrogaming sabe que 2026 é o ano que não para de dar. Tem uma <a href="https://docs.google.com/spreadsheets/d/1MT_xMPlKNbyhANRUMzOH94J3ybeF0b1Ws8F0kb-_598/edit"target="_blank" rel="noopener">planilha comunitária</a> tentando listar os ports não oficiais pra PC, com uns 100 jogos de Ship of Harkinian a Skate 3, e ela está sempre atrasada. O canal <a href="https://www.youtube.com/@VideoGameEsoterica"target="_blank" rel="noopener">Video Game Esoterica</a> publica port novo quase todo dia: Time Crisis decompilado do arcade, Daytona USA, Bloodborne.</p>
<p>A versão de Xbox One do <a href="https://almost-there-games.itch.io/azimuth"target="_blank" rel="noopener">Forza Horizon 2</a>, presa lá desde 2014, roda em Windows. O <a href="https://github.com/boykopovar/AnyPS5"target="_blank" rel="noopener">AnyPS5</a> promete converter executável de PS5 em binário nativo de PC, e emuladores de PS5 como o KytyPS5 e o SharpEmu já <a href="https://www.invenglobal.com/articles/26860/astro-bot-boots-on-pc-as-ps5-emulation-makes-rapid-progress"target="_blank" rel="noopener">rodam Astro Bot</a> com gameplay de verdade. Boa parte disso com IA no meio, alguns abertamente vibe-coded.</p>
<p>Daí o consenso: programar, em geral, acabou. Todo binário é reversível e reutilizável, basta apontar o agente. Minha posição é que ficou muito mais fácil mesmo, que ainda está longe da bala de prata que as pessoas imaginam, e que o motor por trás disso, o LLM, <a href="/2026/10/12/llms-agentes-competente-o-suficiente/">parou de crescer exponencialmente</a>. O resto do texto são os motivos.</p>
<blockquote>
  <p><strong>TL;DR:</strong> engenharia reversa é uma disciplina de 40 anos com ferramenta madura, e a IA acelerou o trabalho braçal dela, com destaque pro retrô, onde o binário está disponível, é minúsculo e o alvo não se move. Os clones da Adobe são alpha com centenas de bugs abertos e print bonito. O REA é uma caixa de ferramentas que exige o binário na mão, Ghidra ou IDA instalados, e muito token. O que vale dinheiro hoje nem binário tem: é SaaS, nuvem, parceria com fabricante e décadas de ciência de cor. Reescrever o Bun, com o autor do projeto e 64 agentes, custou US$ 165 mil. Pule pra <a href="#engenharia-reversa-n%c3%a3o-nasceu-semana-passada">linha do tempo</a>, pro <a href="#o-que-o-rea-faz-de-verdade">REA</a>, pros <a href="#photocraft-print-bonito-alpha-por-dentro">clones da Adobe</a>, pro <a href="#o-caso-bun-quanto-custa-reescrever-software-grande">caso Bun</a>, por que <a href="#por-que-o-retr%c3%b4-anda-t%c3%a3o-r%c3%a1pido">o retrô anda rápido</a> ou pras <a href="#respondendo-a-lista-do-come%c3%a7o">respostas no final</a>.</p>

</blockquote>
<h2>Antes de tudo: eu não gosto da Adobe<span class="hx:absolute hx:-mt-20" id="antes-de-tudo-eu-não-gosto-da-adobe"></span>
    <a href="#antes-de-tudo-eu-n%c3%a3o-gosto-da-adobe" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra ficar claro de onde eu falo. Eu detesto as práticas comerciais da Adobe tanto quanto qualquer um. Fui cliente pagante por anos, usei Photoshop e Premiere extensivamente, mais Lightroom e After Effects, e saí pelos mesmos motivos que todo mundo sai: assinatura compulsória, cancelamento com multa, preço subindo sem contrapartida.</p>
<p>E é exatamente por ter usado a fundo que eu sei o tamanho do que está dentro daquelas caixas. Quem acha que Photoshop é camada, crop e texto nunca precisou de prova de cor pra gráfica, nunca abriu um RAW de câmera cujo perfil de cor a Adobe mantém há vinte anos, nunca fez a conformação de material de cinema, o trabalho de reunir o material bruto da câmera pra finalização. Vou chegar lá, depois do básico.</p>
<h2>Engenharia reversa não nasceu semana passada<span class="hx:absolute hx:-mt-20" id="engenharia-reversa-não-nasceu-semana-passada"></span>
    <a href="#engenharia-reversa-n%c3%a3o-nasceu-semana-passada" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Todo emulador que você já usou existe porque alguém abriu hardware, desmontou binário, farejou protocolo e, em alguns casos, quebrou criptografia. A disciplina tem jurisprudência, ferramenta comercial e uma história de décadas. Uma linha do tempo resumida, com os marcos que mais importam:</p>
<ul>
<li><strong>1982 a 1984</strong>: a Compaq reescreve a BIOS do IBM PC por engenharia reversa, e em 1984 a Phoenix vende uma BIOS licenciável feita em sala limpa, com um time que só lia a especificação. Nasce a indústria de PC compatível. <a href="https://en.wikipedia.org/wiki/Phoenix_Technologies"target="_blank" rel="noopener">Fonte</a>.</li>
<li><strong>1992</strong>: Andrew Tridgell cria o Samba farejando pacotes SMB. No mesmo ano, <a href="https://www.copyright.gov/fair-use/summaries/segaenters-accolade-9thcir1992.pdf"target="_blank" rel="noopener">Sega v. Accolade</a> e <a href="https://www.copyright.gov/fair-use/summaries/atari-nintendo-fedcir1992.pdf"target="_blank" rel="noopener">Atari v. Nintendo</a> firmam nos EUA que desmontar código pra chegar em elementos funcionais é <em>fair use</em>, uso justo (a Atari perdeu o caso dela por outro motivo: mentiu pro Copyright Office pra conseguir o fonte).</li>
<li><strong>1993</strong>: começa o Wine, que vira a base do Proton e de todo jogo de Windows que roda no Steam Deck hoje.</li>
<li><strong>1999</strong>: UltraHLE roda jogos comerciais de N64 em velocidade real; o bleem! emula PS1, a Sony processa e perde as liminares, e o bleem! ainda assim fecha em 2001; o DeCSS quebra a proteção do DVD.</li>
<li><strong>2000</strong>: <a href="https://law.resource.org/pub/us/case/reporter/F3/203/203.F3d.596.99-15852.html"target="_blank" rel="noopener">Sony v. Connectix</a> decide que copiar a BIOS do PS1 pra construir um emulador é uso justo.</li>
<li><strong>2002 e 2003</strong>: nascem PCSX2 e Dolphin, os dois emuladores que vinte anos depois ainda são referência.</li>
<li><strong>2007</strong>: o iPhone é aberto onze dias depois do lançamento. A Comissão Europeia obriga a Microsoft a documentar seus protocolos de rede, e a <a href="https://fsfe.org/news/2007/news-20071220-01.html"target="_blank" rel="noopener">equipe do Samba recebe a documentação</a> por 10 mil euros.</li>
<li><strong>2010</strong>: o grupo fail0verflow mostra no 27C3 que a Sony assinou o firmware do PS3 com um nonce fixo, expondo a chave privada (o nonce é o número que deveria ser aleatório em cada assinatura). Dias depois, já em 2011, o geohot publica a chave, a Sony processa e faz acordo em março.</li>
<li><strong>2011 e 2013</strong>: nascem RPCS3 (PS3) e Xenia (Xbox 360), os dois emuladores mais difíceis já feitos, por motivos que vou explicar.</li>
<li><strong>2019</strong>: a NSA libera o <a href="https://github.com/NationalSecurityAgency/ghidra"target="_blank" rel="noopener">Ghidra</a> como código aberto. A decompilação do Super Mario 64 vaza e vira pública, e no ano seguinte aparece o port pra PC.</li>
<li><strong>2021 e 2022</strong>: Ocarina of Time 100% decompilado depois de quase dois anos de trabalho; o Ship of Harkinian vira o port de referência.</li>
<li><strong>2024</strong>: Mr-Wiseguy lança o <a href="https://github.com/Zelda64Recomp/Zelda64Recomp/releases"target="_blank" rel="noopener">Zelda 64: Recompiled</a>, a primeira vitrine da recompilação estática de N64.</li>
<li><strong>2025</strong>: Sonic Unleashed Recompiled traz o mesmo truque pro Xbox 360, convertendo PowerPC pra C++ e shaders pra HLSL.</li>
</ul>
<p>Repare que a fase atual, decomp e recomp em escala, começa em 2019, bem antes de qualquer agente de código. A IA entrou numa linha de montagem que já existia.</p>
<h3>As ferramentas<span class="hx:absolute hx:-mt-20" id="as-ferramentas"></span>
    <a href="#as-ferramentas" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O ferramental também é maduro, e boa parte é gratuita:</p>
<ul>
<li><a href="https://hex-rays.com/ida-pro"target="_blank" rel="noopener">IDA Pro</a> (Hex-Rays), o disassembler e decompilador comercial de referência, de mil a quase nove mil euros por ano, com uma versão gratuita limitada a x86.</li>
<li><a href="https://github.com/NationalSecurityAgency/ghidra"target="_blank" rel="noopener">Ghidra</a>, a resposta aberta da NSA, com decompilador e scripting, Apache 2.0.</li>
<li><a href="https://binary.ninja/"target="_blank" rel="noopener">Binary Ninja</a>, com uma edição gratuita e licenças de 200 a 3.500 dólares.</li>
<li><a href="https://github.com/radareorg/radare2"target="_blank" rel="noopener">radare2</a> e o <a href="https://github.com/rizinorg/cutter"target="_blank" rel="noopener">Cutter</a>, interface do rizin, que é um fork do radare2: a linha de comando e a interface abertas.</li>
<li><a href="https://github.com/x64dbg/x64dbg"target="_blank" rel="noopener">x64dbg</a> e <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/"target="_blank" rel="noopener">WinDbg</a> no Windows, <a href="https://www.sourceware.org/gdb/"target="_blank" rel="noopener">GDB</a> no resto.</li>
<li><a href="https://frida.re/"target="_blank" rel="noopener">Frida</a>, pra injetar código em processo vivo e observar o que ele faz.</li>
<li><a href="https://github.com/skylot/jadx"target="_blank" rel="noopener">JADX</a> pra Android e <a href="https://github.com/icsharpcode/ILSpy"target="_blank" rel="noopener">ILSpy</a> pra .NET.</li>
</ul>
<p>Guarde essa lista. O REA, que a gente vai ver daqui a pouco, é um embrulho em volta dela.</p>
<h2>Como se desmonta um binário, na prática<span class="hx:absolute hx:-mt-20" id="como-se-desmonta-um-binário-na-prática"></span>
    <a href="#como-se-desmonta-um-bin%c3%a1rio-na-pr%c3%a1tica" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em princípio, todo binário é reversível. O processador precisa conseguir executar aquilo, então as instruções estão lá. O caminho é sempre o mesmo:</p>
<ol>
<li><strong>Desmontar</strong>: o binário vira assembly, uma instrução de máquina por linha. Isso é mecânico.</li>
<li><strong>Decompilar</strong>: o assembly vira algo parecido com C. Ghidra e IDA fazem isso razoavelmente bem, com muito ruído.</li>
<li><strong>Recuperar o que o compilador jogou fora</strong>: nome de variável, nome de função, tipos, estruturas, comentários. Nada disso sobrevive à compilação. Esse é o trabalho de verdade, e é humano.</li>
<li><strong>Refatorar</strong> até virar código que uma pessoa consegue ler, manter e portar.</li>
</ol>
<p>Os projetos de decomp de N64 fazem o passo 4 até o fim: o código em C deles, recompilado, gera byte a byte a ROM original. É assim que o Super Mario 64 virou um projeto com 135 mil linhas de C de código de jogo (uns 100 mil de código efetivo, mais meio milhão de linhas de dados de fase e modelo gerados), e o Ocarina of Time passou de 430 mil linhas. A recompilação estática pula parte disso: traduz as instruções do processador original pra C genérico, sem tentar entender, e troca só as partes que falam com o hardware. É mais rápido e o resultado é menos legível.</p>
<h3>&ldquo;Mas a IA não pode ler o binário direto?&rdquo;<span class="hx:absolute hx:-mt-20" id="mas-a-ia-não-pode-ler-o-binário-direto"></span>
    <a href="#mas-a-ia-n%c3%a3o-pode-ler-o-bin%c3%a1rio-direto" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Alguém sempre pergunta: se é IA, pra que passar por C? Deixa o modelo ler o binário e construir em cima. A resposta curta é que LLM só sabe o que estava no corpus de treino, e corpus de binário pareado com código fonte é escasso, porque nenhum humano escreve assembly de produção há décadas.</p>
<p>A resposta longa é que existe literatura, e ela é instrutiva justamente por ser modesta. A linhagem vai de redes neurais de 2018 a modelos como o <a href="https://arxiv.org/abs/2305.12520"target="_blank" rel="noopener">SLaDe</a> (200 milhões de parâmetros, um por arquitetura e nível de otimização), o <a href="https://arxiv.org/abs/2403.05286"target="_blank" rel="noopener">LLM4Decompile</a> (até 33 bilhões) e o <a href="https://arxiv.org/abs/2311.13721"target="_blank" rel="noopener">Nova</a>. A Meta publicou um <a href="https://arxiv.org/abs/2407.02524"target="_blank" rel="noopener">LLM Compiler</a> que traduz assembly pra IR do LLVM. Os melhores resultados, em funções isoladas de benchmark, giram em torno de 60 a 65% de código que roda de novo e dá o mesmo resultado, caindo forte quando o compilador otimizou com -O3.</p>
<p>Dois estudos recentes mostram o estado real. O <a href="https://arxiv.org/abs/2505.11340"target="_blank" rel="noopener">DecompileBench</a>, com 23 mil funções reais, achou que decompiladores baseados em LLM produzem código mais legível e com metade da correção funcional dos decompiladores comerciais. E um <a href="https://arxiv.org/abs/2609.05370"target="_blank" rel="noopener">trabalho de setembro de 2026</a> mediu que o refinamento por LLM da saída do Ghidra sobe a taxa de compilação de 75% pra 90% e derruba a fidelidade de comportamento de 74% pra 62%, com até uns 10% das funções com vulnerabilidade conhecida deixando de reproduzir a falha, ou seja, o bug sumiu sem ninguém pedir.</p>
<blockquote>
  <p>Resumindo o que existe: modelos pequenos, função por função, quase só x86-64 Linux, e os melhores são camadas de refinamento em cima do Ghidra, o que mantém o decompilador clássico no loop. Nenhum emulador, nenhum jogo, nenhum programa inteiro foi recompilado neuralmente. Enquanto alguém não inventa isso, você trabalha com a realidade, e a realidade inclui a camada intermediária de linguagem de programação e compilador.</p>

</blockquote>
<p>Os assistentes de IA que existem pra isso em produção confirmam o desenho: o <a href="https://plugins.hex-rays.com/aidapal"target="_blank" rel="noopener">aiDAPal</a>, plugin de IDA da Atredis, o Sidekick do Binary Ninja, os servidores MCP pro Ghidra. Todos são um LLM dando nome a variável e explicando função em cima do que o decompilador tradicional produziu.</p>
<h2>O que o REA faz de verdade<span class="hx:absolute hx:-mt-20" id="o-que-o-rea-faz-de-verdade"></span>
    <a href="#o-que-o-rea-faz-de-verdade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu clonei o <a href="https://github.com/morluto/rea"target="_blank" rel="noopener">REA</a> e li o código. Ele é um servidor MCP e uma CLI em TypeScript que embrulha as ferramentas da lista acima e as expõe pro seu agente de código: Ghidra, Hopper, IDA, JADX, Frida, Wakaru pra JavaScript ofuscado, Playwright pra capturar o que um site faz. O agente pede, o REA roda a ferramenta e devolve pseudocódigo, grafo de chamadas, strings e traces de IPC, cada resultado com um registro de evidência e uma lista de limitações.</p>
<p>Esse fluxo eu já tinha feito na mão, meses antes de o REA viralizar. Em julho eu <a href="/2026/07/08/fable-5-analisar-codigo-tiktok-clash-of-kings-govbr-fingerprint/">coloquei o Fable 5 pra analisar o código do TikTok, do Clash of Kings e do gov.br</a>: baixei os APKs, descompactei (APK é um zip), rodei o JADX nos <code>.dex</code> e deixei o modelo ler o Java que saiu do outro lado. Deu pra ver os endpoints, as permissões, os SDKs embutidos e como cada app monta o fingerprint do aparelho, aquele identificador persistente que sobrevive a limpar dados e reinstalar. O TikTok saiu como coleta de grau industrial, blindada contra auditoria; o gov.br, como exemplo de como fazer direito.</p>
<p>As três lições daquele post valem pro REA inteiro. Android é fácil demais de descompilar, e mesmo assim o resultado serve só pra análise estática, porque recompilar o app fica fora de alcance: os nomes vêm embaralhados pela ofuscação, faltam recursos e chaves de assinatura. A parte mais sensível mora em código nativo, <code>.so</code> em C e C++, que descompila em nada legível, e no TikTok é justamente aí que fica o miolo. E o que saiu daquele trabalho foi um relatório sobre o que o app faz, com ressalvas, e nenhum clone do TikTok. O REA embala esse mesmo fluxo num servidor MCP; as paredes continuam no mesmo lugar.</p>
<p>Quem fornece o julgamento é o LLM que você já paga. O REA fornece o encanamento determinístico e a proveniência. A frase &ldquo;automatiza as heurísticas de engenharia reversa&rdquo;, que circula por aí, não aparece em lugar nenhum do repositório; a descrição que o próprio projeto usa é engenharia reversa dirigida por agente, com evidência rastreável.</p>
<p>O que ele exige: o artefato na sua máquina (binário nativo, app Electron, assembly .NET, APK, firmware, captura de rede), Node 22.19 ou superior, e as ferramentas pesadas instaladas por sua conta. Ghidra é grátis; IDA, Hopper e JEB o README manda você comprar. Não tem chave de API do REA porque ele roda local, e o custo de token cai inteiro na sua assinatura de agente.</p>
<p>E esse custo é o detalhe que ninguém cita. O catálogo de ferramentas MCP do REA tem 2,3 MB de JSON, que entra no contexto do agente. O próprio projeto publica um <a href="https://github.com/morluto/rea/tree/main/experiments/analysis-efficiency"target="_blank" rel="noopener">experimento</a> em que analisar o SQLite compilado em WASM, no caminho padrão, levou 42 chamadas de ferramenta, cinco minutos e 300 mil tokens de entrada. Um inventário completo de um app Electron como o Obsidian devolve quase 1 MB de JSON.</p>
<p>Tem issue aberta reclamando que inspecionar um app de Mac comum devolve de 80 a 230 mil tokens de uma vez.</p>
<p>O projeto é sério e vai longe: seis meses, 2.600 commits, mil arquivos de teste, versão 6.4 lançada em 11 de outubro. Também é instável: 190 issues abertas, várias mudanças incompatíveis a cada versão menor, subsistemas marcados como experimentais.</p>
<p>Os limites estão escritos no próprio repositório. O CONTRIBUTING exclui quebra de DRM, anticheat, licença e proteção comercial. O DISCLAIMER avisa que decompilação, reconstrução e análise assistida por IA &ldquo;podem ser incompletas ou incorretas&rdquo;. E até as instruções internas pra gerar as figuras do site dizem, com todas as letras: &ldquo;nunca implique que o REA clona um programa automaticamente&rdquo; e &ldquo;nunca diga reconstrução completa, clone exato ou recuperação automática de código fonte&rdquo;.</p>
<blockquote>
  <p>O REA é uma boa caixa de ferramentas pra quem já sabe fazer engenharia reversa e quer um agente segurando o Ghidra. Ele não é o botão &ldquo;copia esse app pra mim&rdquo;. Quem escreveu o projeto é o primeiro a dizer isso.</p>

</blockquote>
<h2>PhotoCraft: print bonito, alpha por dentro<span class="hx:absolute hx:-mt-20" id="photocraft-print-bonito-alpha-por-dentro"></span>
    <a href="#photocraft-print-bonito-alpha-por-dentro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://github.com/storytold/photocraft"target="_blank" rel="noopener">repositório do PhotoCraft</a> foi criado em 30 de setembro. Em duas semanas, 54 mil estrelas, 8 versões lançadas e, no momento em que escrevo, mais de 800 issues abertas. O selo no README diz &ldquo;early alpha&rdquo;, e o próprio Brandon Thomas, citado pela Gizmodo, disse que não está nem perto de pronto. A imprensa que testou chegou na mesma conclusão: a Gizmodo chamou de &ldquo;Photoshop cheio de bug, mas real&rdquo;, e o OMG Ubuntu de &ldquo;fac-símile superficial com falhas pronunciadas&rdquo;.</p>
<p>As issues contam a história técnica:</p>
<ul>
<li>Qualquer imagem acima de 8.192 pixels sai do compositor de GPU e cai pra CPU, com pico de 6 GB de memória, porque o limite de textura do egui-wgpu é esse (<a href="https://github.com/storytold/photocraft/issues/49"target="_blank" rel="noopener">issue 49</a>, já fechada, e as que vieram depois, <a href="https://github.com/storytold/photocraft/issues/1015"target="_blank" rel="noopener">1015</a> e <a href="https://github.com/storytold/photocraft/issues/4017"target="_blank" rel="noopener">4017</a>).</li>
<li>Uma foto de 12 megapixels precisa de quase 800 MB só pra abrir, ajustar e exportar pela linha de comando (<a href="https://github.com/storytold/photocraft/issues/1637"target="_blank" rel="noopener">issue 1637</a>).</li>
<li>O gerenciamento de cor é rudimentar: espaço de trabalho só global, em vez de por documento, e sem transformação de visualização (<a href="https://github.com/storytold/photocraft/issues/321"target="_blank" rel="noopener">issue 321</a>). Dezoito issues mencionam CMYK, quinze mencionam perfil ICC.</li>
<li>Quase cem issues abertas mencionam PSD. Camadas de matiz e saturação compõem diferente do Photoshop, e salvar por cima sobrescreve a imagem mesclada correta do arquivo original (<a href="https://github.com/storytold/photocraft/issues/4089"target="_blank" rel="noopener">issue 4089</a>).</li>
<li>Cinquenta issues abertas mencionam &ldquo;crash&rdquo;.</li>
</ul>
<p>A interface lembra o Photoshop, então o print é compartilhável, e quem vê o print assume que é cópia carbono. Isso é esperado numa alpha de duas semanas. Com interesse, tempo e contribuição, parte disso vai sendo resolvida. E aí os contribuidores vão descobrir uma coisa que os projetos de N64 nunca enfrentaram.</p>
<blockquote>
  <p>O PhotoCraft hoje é aquela réplica de Ferrari montada em cima de um Fusca: a carroceria tem a forma certa, você tira uma foto e a maioria das pessoas diz &ldquo;uau, uma Ferrari&rdquo;. Aí você liga e sai o motor de Fusca. Se você se empolgou com a foto, o problema foi seu.</p>

</blockquote>
<h2>O alvo se move<span class="hx:absolute hx:-mt-20" id="o-alvo-se-move"></span>
    <a href="#o-alvo-se-move" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Decompilar o Zelda de 1998 é mirar num alvo parado. A Nintendo não vai lançar o Ocarina of Time 2026 com formato de arquivo novo. Copiar um produto vivo é outra conversa, e a gente já viu esse filme.</p>
<p>Nos anos 90 e 2000 o alvo era o Microsoft Office. O StarOffice virou OpenOffice em 2000 e LibreOffice em 2010, e todos eles passaram anos correndo atrás de um formato binário, o .doc, que mudava de versão pra versão e só ganhou especificação pública em 2008, quando o jogo já tinha acabado. A parte comprovada dessa história está nos processos: a Comissão Europeia multou a Microsoft em <a href="https://ec.europa.eu/commission/presscorner/detail/en/ip_04_382"target="_blank" rel="noopener">497 milhões de euros em 2004</a> por recusar informação de interoperabilidade, e em <a href="http://news.bbc.co.uk/2/hi/business/7266629.stm"target="_blank" rel="noopener">899 milhões em 2008</a> por descumprir a ordem. O .docx só virou padrão ISO em 2008, numa <a href="https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML"target="_blank" rel="noopener">votação tão controversa</a> que países protestaram formalmente.</p>
<p>Levou mais de dez anos. E quando o formato finalmente abriu, o Office já não importava do mesmo jeito. O valor mudou de lugar: hoje são <a href="https://office365itpros.com/2024/01/31/office-365-reaches-400-million/"target="_blank" rel="noopener">400 milhões de assentos pagos de Office 365</a>, <a href="https://www.googlecloudpresscorner.com/2025-12-04-Google-Workspace-Study-Reveals-More-Than-90-of-Rising-Leaders-Want-AI-With-Personalization"target="_blank" rel="noopener">3 bilhões de usuários de Google Workspace</a> e uns <a href="https://prodesigntools.com/number-of-creative-cloud-subscribers.html"target="_blank" rel="noopener">41 milhões de assinantes de Creative Cloud</a>. Ninguém quer instalar aquilo no desktop, e por isso ninguém tem o binário.</p>
<blockquote>
  <p>Fazer engenharia reversa do Google Docs é reescrever o produto do zero olhando só pra interface, porque o código que importa nunca sai do servidor. Depois que o mundo migrou pra SaaS, a maior parte do software proprietário virou jardim murado sem binário. Sem binário, não tem o que desmontar.</p>

</blockquote>
<p>Dá pra fazer versões disso, claro. O <a href="https://immich.app/"target="_blank" rel="noopener">Immich</a> substitui o Google Photos pra uma pessoa ou uma família: backup do celular, reconhecimento de rosto, busca semântica, tudo no seu servidor. O que ele não replica é a infraestrutura e o corpus de treino que fazem a busca do Google ser a busca do Google. E a Adobe fez a mesma migração, em pedaços.</p>
<h2>Photoshop é muito mais que camada e crop<span class="hx:absolute hx:-mt-20" id="photoshop-é-muito-mais-que-camada-e-crop"></span>
    <a href="#photoshop-%c3%a9-muito-mais-que-camada-e-crop" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui entra a parte que eu conheço por ter pagado. As features que vendem assinatura hoje nem rodam no seu computador.</p>
<p>O Generative Fill e o Generative Expand rodam no Firefly, na nuvem, e consomem <a href="https://helpx.adobe.com/creative-cloud/apps/generative-ai/generative-credits-faq.html"target="_blank" rel="noopener">créditos generativos</a>. Vários Neural Filters, segundo a <a href="https://helpx.adobe.com/photoshop/using/neural-filters.html"target="_blank" rel="noopener">própria documentação</a>, precisam de internet porque o processamento é no servidor da Adobe. A seleção de objeto por IA tem, desde 2020, uma opção de processar na nuvem pra refinar o resultado. Isso tudo é código que não existe na sua máquina pra ninguém desmontar.</p>
<p>Depois vem o que está no binário, mas levou décadas e parceria pra existir. O Camera Raw carrega <a href="https://helpx.adobe.com/camera-raw/desktop/dng-and-file-formats/supported-lenses.html"target="_blank" rel="noopener">perfis de correção de lente</a> e perfis de cor por câmera pra centenas de modelos, construídos ao longo de vinte anos e atualizados a cada lançamento. Clone nenhum adivinha isso. Ou tem o dado, ou não tem.</p>
<p>E tem a ciência de cor. O exemplo que eu sempre lembro é o GIMP e o CMYK.</p>
<p>O GIMP nasceu em 1995. O primeiro suporte nativo a arquivo CMYK chegou em <a href="https://www.gimp.org/news/2022/08/27/gimp-2-99-12-released/"target="_blank" rel="noopener">2022</a>, e só de importação e exportação, com o pixel sempre em RGB. O <a href="https://www.cgchannel.com/2025/03/gimp-3-0-is-out/"target="_blank" rel="noopener">GIMP 3.0, de 2025</a>, ainda sem modo de edição em CMYK. Está no <a href="https://developer.gimp.org/core/roadmap/"target="_blank" rel="noopener">roadmap</a> como trabalho em andamento.</p>
<p>Trinta anos de projeto aberto, com gente boa e motivada, e a gráfica ainda pede o Photoshop. Isso é o tamanho do buraco da ciência de cor, e nenhum agente de código inventa ciência de cor: ele reproduz o que está no treino.</p>
<p>Por que demorou tanto, se era a feature mais pedida? Porque o núcleo do GIMP nasceu com RGB de 8 bits por canal embutido em cada camada, modo de mesclagem e filtro. Suportar outro modelo de cor exigiu reescrever o motor de pixel inteiro, a migração pro GEGL, que levou a maior parte de uma década e só ficou pronta no <a href="https://www.gimp.org/release-notes/gimp-2.10.html"target="_blank" rel="noopener">GIMP 2.10, em 2018</a>. O CMYK só pôde começar depois disso.</p>
<p>E CMYK é uma família de perfis de dispositivo, com quatro tintas, perfil ICC por impressora, limite de tinta e regra de geração de preto, e editar nele significa que toda a cadeia precisa calcular num modelo subtrativo de quatro canais e ir e voltar pelos perfis sem desviar a cor. Um desenvolvedor sozinho, por melhor programador que seja, sem experiência nessa área específica, vai sofrer pra implementar isso, porque o conhecimento está na gráfica e no laboratório de cor, e quase nada dele está em corpus de treino. No GIMP, quem levou a coisa adiante foram contribuidores que entendem de impressão, e mesmo assim foram anos. Ferramenta nova nenhuma atalha esse tipo de conhecimento.</p>
<p>E tem a camada que nem é técnica: licença comercial. Cor de gráfica é Pantone, e Pantone é uma biblioteca proprietária. Projeto aberto nenhum pode embarcar as paletas; os desenvolvedores do Inkscape <a href="https://lists.inkscape.org/hyperkitty/list/inkscape-devel@lists.inkscape.org/message/DOXDMUAPHORC4HEXPF37LYBQH6SSQ2M5"target="_blank" rel="noopener">chegaram nessa conclusão em 2005</a>, e a <a href="https://www.linux.com/news/pantone-and-free-software/"target="_blank" rel="noopener">Linux.com explicou o risco jurídico</a> na mesma época. A própria Adobe sentiu isso em 2022: quando a Pantone mudou o modelo de negócio, as bibliotecas <a href="https://petapixel.com/2022/10/28/you-have-to-pay-a-subscription-to-use-pantone-colors-in-photoshop-now"target="_blank" rel="noopener">saíram do Photoshop, do Illustrator e do InDesign</a>, arquivos antigos passaram a abrir com as cores Pantone trocadas por preto, e quem precisa delas paga uma assinatura separada de plugin. Se nem a Adobe, pagando, escapou, imagine um clone que vive de boa vontade.</p>
<h3>Vídeo é pior<span class="hx:absolute hx:-mt-20" id="vídeo-é-pior"></span>
    <a href="#v%c3%addeo-%c3%a9-pior" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No Premiere, no After Effects e no DaVinci Resolve, o problema multiplica. Câmera de cinema não entrega vídeo, entrega dado bruto numa curva logarítmica própria: LogC4 da ARRI, IPP2 da RED. Pra transformar aquilo em imagem, você precisa das transformadas do fabricante, e a RED entrega as dela num <a href="https://community.acescentral.com/t/red-ipp2-color-workflows/1055"target="_blank" rel="noopener">SDK</a> que os editores integram e atualizam a cada versão. O ACES, o padrão neutro da indústria, depende de transformadas de entrada fornecidas por cada fabricante.</p>
<p>A Blackmagic dá o Resolve de graça e ele decodifica ARRIRAW e R3D. Faz isso porque paga o SDK e a parceria por você. Um clone feito por agente, &ldquo;adivinhando&rdquo; como a imagem da Alexa deve ficar, produz uma imagem que não bate com o monitor de referência, e no cinema isso significa que não serve. Esse conhecimento não está em corpus de treino nenhum: está em contrato.</p>
<h2>O caso Bun: quanto custa reescrever software grande<span class="hx:absolute hx:-mt-20" id="o-caso-bun-quanto-custa-reescrever-software-grande"></span>
    <a href="#o-caso-bun-quanto-custa-reescrever-software-grande" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra ter noção de ordem de grandeza, o melhor dado público que existe é o do Bun. Em maio de 2026, Jarred Sumner reescreveu o runtime inteiro de Zig pra Rust usando agentes, e em julho <a href="https://bun.com/blog/bun-in-rust"target="_blank" rel="noopener">publicou os números</a>:</p>
<ul>
<li>535 mil linhas de Zig em 1.448 arquivos viraram um diff de um milhão de linhas de Rust, em 11 dias.</li>
<li>Até 64 instâncias de Claude em paralelo, 24 horas por dia, cada linha revisada por dois agentes adversariais e um corretor.</li>
<li>5,9 bilhões de tokens de entrada não cacheados, 690 milhões de saída, 72 bilhões de leituras de cache: <strong>uns US$ 165 mil</strong> a preço de API.</li>
<li>16 mil erros de compilador corrigidos por 64 agentes antes do CI ficar verde em seis plataformas.</li>
<li>A suíte de testes existente, com mais de um milhão de asserções, passou 100% antes do merge.</li>
</ul>
<p>Lê de novo o que viabilizou isso:</p>
<ul>
<li>o autor original do projeto pilotando</li>
<li>um código fonte completo e funcional como referência</li>
<li>uma suíte de testes de um milhão de asserções servindo de oráculo</li>
<li>orçamento ilimitado, porque o Bun pertence à Anthropic desde dezembro de 2025, e uma versão pré-lançamento do Claude Fable 5</li>
</ul>
<p>O Sumner estima que três engenheiros com contexto total levariam um ano.</p>
<p>Agora tira cada uma dessas vantagens. O PhotoCraft não tem o fonte do Photoshop pra portar, tem que inventar. Não tem suíte de testes que diga &ldquo;isso aqui bate com o Photoshop&rdquo;. Não tem o autor do Photoshop.</p>
<p>E o Photoshop é um produto de 36 anos, cujos requisitos de disco a Adobe lista entre <a href="https://helpx.adobe.com/photoshop/desktop/get-started/technical-requirements-installation/adobe-photoshop-on-desktop-technical-requirements.html"target="_blank" rel="noopener">10 e 100 GB</a>, contra um runtime de JavaScript. Mesmo sem saber o tamanho do código da Adobe, estamos falando de um alvo maior, sem referência, sem oráculo e sem dono. Ordens de grandeza acima de US$ 165 mil, e ainda assim seria uma aproximação.</p>
<h2>Por que o retrô anda tão rápido<span class="hx:absolute hx:-mt-20" id="por-que-o-retrô-anda-tão-rápido"></span>
    <a href="#por-que-o-retr%c3%b4-anda-t%c3%a3o-r%c3%a1pido" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se é tão difícil, por que sai port de jogo antigo todo dia? Porque o retrô acumula todas as vantagens que o resto não tem.</p>
<p><strong>O binário está disponível e é minúsculo.</strong> Super Mario Bros. do NES: 40 KB. Super Mario 64: 8 MB. Ocarina of Time e Majora&rsquo;s Mask: 32 MB cada. Um CD inteiro de PS1: 650 MB.</p>
<p>Compare com <a href="https://store.steampowered.com/app/1086940/Baldurs_Gate_3/"target="_blank" rel="noopener">Baldur&rsquo;s Gate 3</a>, 150 GB, ou com o <a href="https://support.activision.com/black-ops-6/articles/pc-system-requirements-for-black-ops-6"target="_blank" rel="noopener">Call of Duty mais recente</a>, acima de 100 GB. São três ou quatro ordens de grandeza, e o escopo encolhe junto: um jogo de 1996 tem um punhado de sistemas, não um motor de física com rede, loja e anticheat.</p>
<p><strong>A tecnologia é antiga e documentada.</strong> Vinte e cinco anos de comunidade já mapearam o hardware do N64, do PS1 e do SNES instrução por instrução. O agente não descobre nada; ele acelera um trabalho com mapa pronto. É o mesmo padrão que eu <a href="/2026/09/28/llms-sao-boas-em-reproduzir-o-que-existe-e-coisas-novas/">vi nos meus projetos de retrocomputação</a>: onde tem referência e oráculo, a IA voa; onde não tem, ela gira em força bruta.</p>
<p><strong>O alvo não se move.</strong> Ninguém vai atualizar o Zelda de 1998.</p>
<p><strong>E o jurídico está resolvido há trinta anos.</strong> Sega v. Accolade e Sony v. Connectix deram o contorno. Os ports exigem que você forneça a sua ROM.</p>
<h3>Console moderno é um PC<span class="hx:absolute hx:-mt-20" id="console-moderno-é-um-pc"></span>
    <a href="#console-moderno-%c3%a9-um-pc" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A segunda metade da explosão, os ports de PS4, PS5, Xbox One e Switch, tem outra explicação: esses consoles são PCs ou celulares com outro invólucro. O <a href="https://www.playstation.com/en-us/ps4/tech-specs/"target="_blank" rel="noopener">PS4</a> usa um AMD Jaguar x86-64, o <a href="https://blog.playstation.com/2020/03/18/unveiling-new-details-of-playstation-5-hardware-technical-specs/"target="_blank" rel="noopener">PS5</a> um Zen 2, o <a href="https://news.xbox.com/en-us/2020/03/16/xbox-series-x-tech/"target="_blank" rel="noopener">Xbox Series</a> outro Zen 2, o Switch um <a href="https://www.techinsights.com/blog/nintendo-switch-teardown"target="_blank" rel="noopener">Tegra X1</a> ARM da NVIDIA. O processador do seu PC roda aquele código nativamente. Então ninguém precisa emular a CPU.</p>
<p>O trabalho que sobra é traduzir o sistema operacional e a GPU. O <a href="https://github.com/shadps4-emu/shadPS4"target="_blank" rel="noopener">shadPS4</a> reimplementa as bibliotecas do sistema do PS4 e recompila os shaders: os jogos saem da fábrica com código de máquina da GPU AMD, que o emulador decodifica instrução a instrução e converte pra SPIR-V, o formato do Vulkan.</p>
<p>O <a href="https://almost-there-games.itch.io/azimuth"target="_blank" rel="noopener">Azimuth</a>, que faz o Forza Horizon 2 rodar no Windows, traduz chamadas WinRT do Xbox pra Win32 e DirectX 11.X pra DirectX 12 desktop, com o código x86 do jogo rodando direto. O AnyPS5 religa o executável: pega o binário do PS5 e gera um binário nativo de Linux ou Windows, ligado a bibliotecas de sistema reimplementadas. Nos três casos, Proton, DXVK, VKD3D e MoltenVK já tinham resolvido a camada de tradução gráfica anos antes.</p>
<p>A prova inversa são os consoles que não eram PC. O PS3 usa o Cell, um PowerPC com sete coprocessadores ativos (os SPEs), cada um com memória local própria e sem cache, e o RPCS3 está nisso <a href="https://rpcs3.net/about"target="_blank" rel="noopener">desde 2011</a>, com a emulação dos SPUs sendo gargalo até hoje. O Xbox 360 é PowerPC também, e por isso o Sonic Unleashed precisou do XenonRecomp traduzir PowerPC pra C++. Engenharia reversa é caso a caso, e a arquitetura decide se o caso é fácil.</p>
<h3>A IA está no meio, e já tem briga<span class="hx:absolute hx:-mt-20" id="a-ia-está-no-meio-e-já-tem-briga"></span>
    <a href="#a-ia-est%c3%a1-no-meio-e-j%c3%a1-tem-briga" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Que os ports de 2026 usam IA, boa parte deles diz na cara. O <a href="https://github.com/SlickAmogus/silent-hill-decomp"target="_blank" rel="noopener">decomp do Silent Hill</a> escreve no README que o desenvolvimento é &ldquo;fortemente assistido por IA (Claude Opus 4.6, 4.7 e o Fable mais novo), e somos abertos sobre isso. Não é tradução automatizada do jogo&rdquo;. O recomp do Pokémon Stadium <a href="https://retrododo.com/a-pokemon-stadium-recomp-has-finally-arrived-but-lists-claude-as-a-contributor/"target="_blank" rel="noopener">lista o Claude como contribuidor</a>.</p>
<p>Os devs dos recomps de Zelda e Banjo, que passaram anos fazendo isso à mão, <a href="https://kotaku.com/zelda-and-banjo-recompiled-devs-go-to-war-with-ai-vibe-coded-slopcomps-2000739936"target="_blank" rel="noopener">entraram em guerra</a> com o que chamam de &ldquo;slopcomps&rdquo;, ports gerados por agente com qualidade de alpha.</p>
<p>E vale separar manchete de estado real também aqui. O AnyPS5 tem uma versão 0.1 de setembro que, segundo quem testou, roda um jogo indie 2D; a alegação viral de que &ldquo;o PS5 está 80% portado pra PC&rdquo; é dos fãs, e nenhum jogo 3D roda. Astro Bot roda, só que em emuladores (KytyPS5, SharpEmu), que fazem o caminho tradicional. O Forza Horizon 2 roda, e o Azimuth é um binário fechado de um estúdio que se declara &ldquo;AI assisted&rdquo; sem dizer mais nada.</p>
<h2>&ldquo;Mas daqui a dois anos o token custa nada&rdquo;<span class="hx:absolute hx:-mt-20" id="mas-daqui-a-dois-anos-o-token-custa-nada"></span>
    <a href="#mas-daqui-a-dois-anos-o-token-custa-nada" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A resposta padrão pra tudo isso é: hoje é difícil, em dois anos é trivial, porque IA cresce exponencialmente. Os números dizem outra coisa.</p>
<p>O preço da ponta mais cara caiu pouco. O GPT-4 de março de 2023 custava US$ 30 e 60 por milhão de tokens de entrada e saída; o Claude 3 Opus de 2024, 15 e 75; os modelos de ponta de hoje, Fable 5.1 e GPT-6 Astra, <a href="https://claude.com/pricing"target="_blank" rel="noopener">custam</a> <a href="https://developers.openai.com/api/docs/pricing"target="_blank" rel="noopener">10 e 50</a>. Em três anos e meio, a fronteira ficou entre 1,2 e 3 vezes mais barata, dependendo de qual ponta você olha.</p>
<p>O que caiu de verdade foi o custo de uma qualidade fixa: a Epoch AI mediu quedas <a href="https://epoch.ai/blog/llm-inference-price-trends"target="_blank" rel="noopener">de 9 a 900 vezes por ano</a> dependendo da tarefa, e numa <a href="https://epoch.ai/gradient-updates/how-persistent-is-the-inference-cost-burden"target="_blank" rel="noopener">revisão de 2026</a> resume em &ldquo;muito grosseiramente 5 a 10 vezes por ano&rdquo;, com o aviso de que pode desacelerar. Isso é real e é ótimo.</p>
<p>Só que aplica a conta no Bun. US$ 165 mil divididos por 10 dá US$ 16 mil. Por 100, US$ 1.650. Isso é pra portar um runtime com fonte, testes e autor na mão.</p>
<p>Pra um amador tentando clonar o Photoshop sem nada disso, a conta começa ordens de grandeza acima e cai na mesma proporção. Barato não é o mesmo que trivial.</p>
<p>E a premissa do &ldquo;exponencial&rdquo; morreu em 2024. O Ilya Sutskever disse no NeurIPS que <a href="https://www.globalbankingandfinance.com/ai-with-reasoning-power-will-be-less-predictable-ilya-sutskever-says/"target="_blank" rel="noopener">o pré-treino como conhecemos vai acabar</a>, porque só existe uma internet. A Epoch projeta que o escalonamento dos modelos de raciocínio <a href="https://epoch.ai/gradient-updates/how-far-can-reasoning-models-scale"target="_blank" rel="noopener">converge pra taxa geral da fronteira</a> em cerca de um ano.</p>
<p>Eu já escrevi sobre isso três vezes nas últimas semanas: <a href="/2026/09/28/llms-sao-boas-em-reproduzir-o-que-existe-e-coisas-novas/">os limites</a> do que o modelo reproduz, <a href="/2026/10/12/llms-agentes-competente-o-suficiente/">a convergência</a> dos modelos crus com o ganho vindo do harness, e <a href="/2026/10/11/existem-linguagens-melhores-pra-programar-com-llms/">o benchmark de linguagens</a> em que os modelos de fronteira empataram no teto. A ferramenta que temos é a ferramenta que vamos ter por um bom tempo, com melhoria incremental. Planeje com ela.</p>
<p>Vale lembrar o número que abre o texto dos limites: pelo <a href="https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/"target="_blank" rel="noopener">Octoverse 2025</a>, relatório oficial do GitHub, 81,5% das contribuições na plataforma aconteceram em repositórios privados. É o código que importa de verdade, o que paga salário, e nenhum LLM viu uma linha dele. O modelo reproduz o que estava no treino, e esse código nunca esteve lá.</p>
<p>Agora estenda isso pra todo produto SaaS e pra cada componente que ele usa. O código da Adobe que realmente vale, o motor de cor, os perfis, os filtros na nuvem, não está disponível em lugar nenhum, nem como binário. Quem quiser reproduzir vai ter que refazer a pesquisa e o desenvolvimento, caro e demorado, pelos mesmos anos que a Adobe levou. E no fim ainda esbarra na propriedade intelectual licenciada de terceiros, Pantone, SDK de câmera, perfil de fabricante, que você nunca vai conseguir ter.</p>
<h2>Respondendo a lista do começo<span class="hx:absolute hx:-mt-20" id="respondendo-a-lista-do-começo"></span>
    <a href="#respondendo-a-lista-do-come%c3%a7o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>O PhotoCraft existe?</strong> Existe, é uma alpha de duas semanas com mais de 800 issues abertas, gerenciamento de cor rudimentar, travando acima de 8K e abrindo PSD errado. Parece Photoshop no print. Pode melhorar muito, e vai descobrir que o alvo se move e que as partes caras do Photoshop estão na nuvem ou em contrato com fabricante.</p>
<p><strong>O REA existe?</strong> Existe, é bom, e é uma caixa de ferramentas pra quem já sabe usar Ghidra, exige o binário na mão, as ferramentas instaladas e centenas de milhares de tokens por análise. O próprio projeto evita dizer que ele clona programa.</p>
<p><strong>Recomp e decomp aceleraram?</strong> Sim, de verdade, e a IA tem parte nisso. Aceleraram onde o binário existe, é pequeno, está documentado há 25 anos e não se move. Ou onde o console é um PC disfarçado e o trabalho é tradução de API, resolvida pelo Wine e pelo Vulkan anos antes.</p>
<p><strong>A Adobe morreu?</strong> A Adobe tem uns 40 milhões de assinantes, pela estimativa mais citada, as features que vendem assinatura rodam no servidor dela, e trinta anos de GIMP ainda deixam a gráfica pedindo Photoshop. Eu queria que fosse diferente. Os dados dizem que o que vai acontecer é o que sempre aconteceu com clone de produto vivo: anos correndo atrás, e quando alcança, o valor já mudou de lugar.</p>
<p><strong>Programador morreu?</strong> Reescrever o Bun precisou do autor do Bun. Os decomps que funcionam têm gente que conhece o hardware pilotando o agente, e os que não têm viraram &ldquo;slopcomp&rdquo; com nome e tudo. A engenharia reversa ficou mais barata e mais acessível, como ficou com o Ghidra em 2019, e continua sendo trabalho de engenheiro. Sem nós, a ferramenta devolve print bonito.</p>
<p>Software proprietário com binário na mão vai sofrer pressão, e deve. A maior parte do software que você usa não tem binário nenhum, e o que tem já depende de serviço na nuvem que não desmonta. Engenharia de software com IA tem um caminho ótimo pela frente. Manchete de &ldquo;acabou&rdquo; rende clique e não compila.</p>
]]></content:encoded><category>inteligencia-artificial</category><category>vibe-coding</category><category>retrocomputacao</category><category>open-source</category></item><item><title>Códigos de Conduta são a Raiz de Todo Mal: Recuperando sua Liberdade</title><link>https://akitaonrails.github.io/2026/09/14/codigo-de-conduta-e-a-raiz-de-todo-o-mal/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/09/14/codigo-de-conduta-e-a-raiz-de-todo-o-mal/</guid><pubDate>Mon, 14 Sep 2026 17:00:00 -0300</pubDate><description>&lt;p&gt;Todo projeto open source grande hoje vem com um &lt;code&gt;CODE_OF_CONDUCT.md&lt;/code&gt; no repositório. Vendeu-se a ideia de que isso existia para &amp;ldquo;proteger minorias&amp;rdquo; e &amp;ldquo;criar espaços seguros&amp;rdquo;. Na prática, o que eu vi acontecer na última década foi outra coisa: um instrumento para cancelar, perseguir e banir qualquer um que pensasse diferente de quem estava no controle. E quem puxava essas caçadas, via de regra, não era quem sustentava o código dos projetos.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Todo projeto open source grande hoje vem com um <code>CODE_OF_CONDUCT.md</code> no repositório. Vendeu-se a ideia de que isso existia para &ldquo;proteger minorias&rdquo; e &ldquo;criar espaços seguros&rdquo;. Na prática, o que eu vi acontecer na última década foi outra coisa: um instrumento para cancelar, perseguir e banir qualquer um que pensasse diferente de quem estava no controle. E quem puxava essas caçadas, via de regra, não era quem sustentava o código dos projetos.</p>
<p>Essa é a minha tese, e eu sei que ela é impopular. Levei dez anos de paciência pra poder escrever esse texto. Fiquei calado vendo esse teatro se repetir ano após ano, esperando o momento certo de documentar tudo o que testemunhei de perto, e hoje eu posso, com prazer, ver minhas próprias previsões se confirmando uma por uma.</p>
<p>E antes que algum espertinho tente essa: eu sei que boicote, doxxing e caça às bruxas existem sem CODE_OF_CONDUCT.md nenhum, sempre existiram. O título mira no que esse arquivo virou: o instrumento que pegou uma tática de turba de internet e carimbou ela como política oficial do projeto, com comitê, processo e verniz de legitimidade institucional. Um arquivo markdown de 500 linhas não assusta ninguém sozinho; o que ele virou, sim.</p>
<blockquote>
  <p>Dinheiro fácil foi o combustível. Código de conduta foi a arma que essa gente construiu pra oficializar o que antes era só grito de rua.</p>

</blockquote>
<p>Uma pergunta é de onde veio a energia; outra é o instrumento que ela adotou pra virar poder permanente dentro do projeto. Guarda essa distinção, porque ela sustenta o texto inteiro. Mas antes de chegar na filosofia, deixa eu contar a parte econômica, porque sem entender o dinheiro você não entende o resto.</p>
<h2>A bolha que financiou tudo isso<span class="hx:absolute hx:-mt-20" id="a-bolha-que-financiou-tudo-isso"></span>
    <a href="#a-bolha-que-financiou-tudo-isso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>De mais ou menos 2012 até 2022, a indústria de tech viveu a maior bolha de contratação da história. Juros a zero, capital infinito, e as big techs crescendo como se não houvesse amanhã. Chegamos ao ponto surreal de empresas contratarem engenheiros sem ter trabalho para eles. Keith Rabois, da turma do PayPal, acusou Google e Meta publicamente de contratar milhares de pessoas para fazer <a href="https://fortune.com/2023/03/10/google-over-hired-talent-do-nothing-fake-work-stop-working-rivals-former-paypal-boss-keith-rabois/"target="_blank" rel="noopener">&ldquo;trabalho falso&rdquo;, por vaidade, e para que não fossem trabalhar nos concorrentes</a>. Uma ex-funcionária da Meta, demitida na primeira leva de 2022, resumiu melhor: <a href="https://www.businesstoday.in/technology/news/story/paid-employees-to-do-fake-work-laid-off-worker-accuses-meta-of-not-having-enough-work-for-staff-373423-2023-03-15"target="_blank" rel="noopener">&ldquo;eles estavam estocando a gente como cartas de Pokémon&rdquo;</a>. A cultura do <a href="https://www.ibtimes.co.uk/how-get-paid-doing-nothing-inside-silicon-valleys-controversial-rest-vest-culture-1633884"target="_blank" rel="noopener">&ldquo;rest and vest&rdquo;</a>, colecionar salário e stock options fazendo quase nada, já era documentada em 2017.</p>
<p>Foi essa bolha que financiou a onda de &ldquo;programação é a profissão do futuro&rdquo;. Bootcamps <a href="https://www.coursereport.com/reports/2020-coding-bootcamp-market-size-study"target="_blank" rel="noopener">saíram de 2.178 formados em 2013 para quase 25 mil em 2020</a> só nos EUA e Canadá, crescimento de mais de mil por cento. O <a href="https://www.theverge.com/2012/1/6/2688172/mayor-bloomberg-resolves-to-take-a-coding-class-in-2012"target="_blank" rel="noopener">Bloomberg resolveu aprender a programar como promessa de ano novo em 2012</a>. O <a href="https://www.wired.com/2014/12/obama-becomes-first-president-write-computer-program/"target="_blank" rel="noopener">Obama escreveu uma linha de código na TV em 2014</a>.</p>
<p>Eu contei essa história com mais detalhes num vídeo de fevereiro de 2020, quando a bolha ainda estava inflando (<a href="/2020/02/19/akitando-72-rant-programacao-nao-e-facil/">transcrição aqui</a>):</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/V7oUDL7E1g4"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Influencer de tech virou profissão. Todo mundo ia ser programador.</p>
<p>Aí a bolha estourou. <a href="https://techcrunch.com/2024/05/01/a-comprehensive-archive-of-2023-tech-layoffs/"target="_blank" rel="noopener">2022: quase 165 mil demitidos. 2023: mais de 262 mil</a>, segundo o Layoffs.fyi. Meta cortou <a href="https://about.fb.com/news/2022/11/mark-zuckerberg-layoff-message-to-employees/"target="_blank" rel="noopener">11 mil em novembro de 2022</a> com o Zuckerberg admitindo <em>&ldquo;I got this wrong&rdquo;</em>, e mais <a href="https://fortune.com/2023/03/14/meta-layoffs-10000-mark-zuckerberg-year-of-efficiency-hiring-freeze"target="_blank" rel="noopener">10 mil no &ldquo;ano da eficiência&rdquo;</a> de 2023. Amazon cortou <a href="https://cbsaustin.com/news/nation-world/amazon-cuts-9000-jobs-now-at-least-27000-layoffs-in-2023"target="_blank" rel="noopener">27 mil</a>. Google, <a href="https://blog.google/company-news/inside-google/message-ceo/january-update/"target="_blank" rel="noopener">12 mil</a>, com o Pichai admitindo que <em>&ldquo;contratamos para uma realidade econômica diferente da que enfrentamos hoje&rdquo;</em>. Stripe foi a mais honesta: <a href="https://ca.finance.yahoo.com/news/digital-payments-firm-stripe-lay-134215274.html"target="_blank" rel="noopener">&ldquo;we overhired&rdquo;</a>.</p>
<p>Eu registrei esse estouro no calor do momento, num vídeo de novembro de 2022 (<a href="/2022/11/22/akitando-132-rant-a-bolha-de-startups-estourou/">transcrição aqui</a>):</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/xxoVJQvEyEU"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>E como o timing é uma piada pronta, em 30 de novembro de 2022, bem no meio do banho de sangue, saiu o ChatGPT. <a href="https://www.reuters.com/technology/chatgpt-sets-record-fastest-growing-user-base-analyst-note-2023-02-01/"target="_blank" rel="noopener">Cem milhões de usuários em dois meses</a>, o aplicativo de crescimento mais rápido já visto até então, segundo estimativa do UBS. As manchetes viraram uma palestra da ACM chamada <a href="https://learning.acm.org/techtalks/endporgramming"target="_blank" rel="noopener">&ldquo;Large Language Models and the End of Programming&rdquo;</a>, <a href="https://www.techspot.com/news/102020-nvidia-boss-jensen-huang-children-shouldnt-learn-code.html"target="_blank" rel="noopener">Jensen Huang dizendo que criança nenhuma precisa mais aprender a programar</a>, o <a href="https://www.cognition.ai/blog/introducing-devin"target="_blank" rel="noopener">Devin se anunciando como o primeiro engenheiro de IA</a>, o <a href="https://daringfireball.net/linked/2025/08/20/claim-chowder-amodei"target="_blank" rel="noopener">Dario Amodei prometendo que IA escreveria 90% do código em três a seis meses</a>. Spoiler: não escreveu.</p>
<p>Por que essa história importa? Porque foi exatamente durante essa década de dinheiro fácil que o open source foi colonizado. Quando sobra dinheiro e falta trabalho real, sobra tempo e gente para fazer política dentro dos projetos. E foi o que aconteceu.</p>
<h2>A década da caça às bruxas<span class="hx:absolute hx:-mt-20" id="a-década-da-caça-às-bruxas"></span>
    <a href="#a-d%c3%a9cada-da-ca%c3%a7a-%c3%a0s-bruxas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O artefato central dessa história é o <a href="https://ethicalsource.dev/blog/contributor-covenant-stewardship/"target="_blank" rel="noopener">Contributor Covenant</a>, criado em 2014 por Coraline Ada Ehmke e adotado por milhares de projetos, incluindo praticamente todo gigante do setor: CNCF, Apple, Google, Microsoft, Linux. A própria autora, no dia em que o Linux adotou o código dela, tuitou com todas as letras: <a href="https://itsfoss.com/linux-code-of-conduct/"target="_blank" rel="noopener"><em>&ldquo;Some people are saying that the Contributor Covenant is a political document, and they&rsquo;re right&rdquo;</em></a>. Quando o autor do documento admite que ele é político, a discussão sobre &ldquo;espaço seguro&rdquo; acabou antes de começar.</p>
<p>A lista de vítimas dessa era é longa, então vamos aos principais.</p>
<p>Antes, vale registrar o alcance dessa turma. A Coraline trabalhou no GitHub entre 2016 e 2017, até ser demitida (a versão dela está no texto <a href="https://where.coraline.codes/writing/my-year-at-github/"target="_blank" rel="noopener">&ldquo;Antisocial Coding: My Year at GitHub&rdquo;</a>). E o GitHub era o alvo perfeito: era onde morava praticamente todo o open source do mundo. Foi nessa era que os fundadores originais saíram de cena. Tom Preston-Werner <a href="https://www.sj-r.com/story/news/2014/05/10/github-women-miss-founder-who/37382118007/"target="_blank" rel="noopener">renunciou em 2014</a> no escândalo de assédio da Julie Ann Horvath, mesmo com a investigação interna concluindo que não houve nada ilegal, só &ldquo;erros de julgamento&rdquo;. O Chris Wanstrath já tinha anunciado que sairia do cargo de CEO em 2017 e, depois da venda para a Microsoft em 2018, ainda ficou alguns anos como technical fellow até sair de vez. Hoje nenhum fundador original trabalha lá.</p>
<p>O legado dela sobreviveu à demissão. O Contributor Covenant virou um dos <a href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-code-of-conduct-to-your-project"target="_blank" rel="noopener">templates que o GitHub facilita adotar</a> quando você cria o <code>CODE_OF_CONDUCT.md</code> de um repositório. E em 2020 veio a joia da coroa: no meio dos protestos do George Floyd, o GitHub anunciou que ia aposentar o nome <code>master</code>, e desde <a href="https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/"target="_blank" rel="noopener">1º de outubro de 2020 todo repositório novo nasce <code>main</code></a>.</p>
<p>A discussão era estúpida desde o começo. O Git nunca teve branch <code>slave</code>. O Petr Baudis, que batizou o nome nos scripts originais, <a href="https://x.com/xpasky/status/1271477451756056577"target="_blank" rel="noopener">explicou no X que <code>master</code> ali era de &ldquo;master copy&rdquo;</a>, como a gravação master de um disco (o próprio Baudis disse depois que hoje prefere <code>main</code>; a etimologia continua a mesma). Nem esse detalhe segurou a mudança: até a <a href="https://sfconservancy.org/news/2020/jun/23/gitbranchname/"target="_blank" rel="noopener">Software Freedom Conservancy endossou publicamente</a> a troca, e quem tinha automação assumindo <code>master</code> teve que correr atrás. Ninguém ficou mais protegido por causa dessa mudança, mas ela está lá, no fluxo de trabalho de todo programador, todos os dias.</p>
<p><strong>Brendan Eich, 2014.</strong> O cara inventou JavaScript, cofundou a Mozilla, era CTO desde 2005. Virou CEO e durou <a href="https://abcnews.go.com/Business/mozilla-ceo-resigns-calif-gay-marriage-ban-campaign/story?id=23181711"target="_blank" rel="noopener">onze dias no cargo</a>. O crime: uma doação de mil dólares em 2008 para a Proposition 8 da Califórnia. Funcionários tuitaram pedindo a cabeça dele, o <a href="https://en.wikipedia.org/wiki/Brendan_Eich"target="_blank" rel="noopener">OkCupid bloqueou usuários de Firefox com uma mensagem de protesto</a>, e ele caiu. Andrew Sullivan, gay e um dos primeiros defensores de peso do casamento entre pessoas do mesmo sexo, escreveu na época <a href="https://dish.andrewsullivan.com/2014/04/03/the-hounding-of-brendan-eich/"target="_blank" rel="noopener">&ldquo;The Hounding of a Heretic&rdquo;</a>: quando carreiras dependem de teste de pureza ideológica, a caça às bruxas já venceu. E repara: aqui não tinha código de conduta nenhum envolvido, foi pressão pura de boicote. O método já existia antes do documento; o documento só oficializou.</p>
<p><strong>Larry Garfield, 2017.</strong> Doze anos de contribuição no Drupal. Quando vazaram que ele participava de uma subcultura BDSM, num site privado, fora do projeto, o comitê de conduta do Drupal investigou e concluiu: <a href="https://www.drupal.org/association/blog/a-statement-from-the-executive-director"target="_blank" rel="noopener">sem violação do código de conduta</a>. O Dries Buytaert passou por cima do próprio comitê e <a href="https://dri.es/living-our-values"target="_blank" rel="noopener">expulsou ele assim mesmo</a>, porque a &ldquo;associação com o sistema de crenças dele&rdquo; era incompatível com os objetivos do projeto. O TechCrunch resumiu do mesmo jeito: <a href="https://techcrunch.com/2017/03/26/sex-and-gor-and-open-source/"target="_blank" rel="noopener">punido por algo dito fora do projeto</a>. Oitenta e cinco desenvolvedores <a href="https://www.inc.com/sonya-mann/drupal-confessions-open-letter.html"target="_blank" rel="noopener">assinaram carta aberta</a> ameaçando sair. Não adiantou. E repara no detalhe que enterra a tese do &ldquo;espaço seguro&rdquo;: o processo do código de conduta funcionou e inocentou o cara. Quando a turba apertou, o papel não segurou nada; quem decidiu foi a pessoa no topo, como sempre foi.</p>
<p><strong>Node.js, 2017.</strong> O TSC de treze pessoas votou a expulsão do Rod Vagg por, entre outras coisas, ter twitado um artigo questionando os efeitos colaterais de código de conduta. Ler crítica a código de conduta quase virou violação de código de conduta: <a href="https://www.theregister.com/2017/08/24/nodejs_forks_ayo_code_of_conduct/"target="_blank" rel="noopener">a votação foi 6 a 4 contra a expulsão</a>, por pouco. A máquina perdeu essa rodada, mas o recado já tinha saído: quatro dos que queriam o cabeça do Vagg pediram para sair do comitê no mesmo dia, e o projeto ganhou um fork chamado Ayo.js horas depois. Perder a votação não impediu o estrago.</p>
<p><strong>Linus Torvalds, 2018.</strong> Em setembro, segundo os relatos da época, a New Yorker tinha mandado perguntas sobre o comportamento abusivo dele nos emails. No mesmo fim de semana, Linus <a href="https://www.newyorker.com/science/elements/after-years-of-abusive-e-mails-the-creator-of-linux-steps-aside"target="_blank" rel="noopener">pediu desculpas e anunciou que ia tirar um tempo para &ldquo;entender as emoções das pessoas&rdquo;</a> e o kernel <a href="https://itsfoss.com/linux-code-of-conduct/"target="_blank" rel="noopener">trocou o Code of Conflict pelo Contributor Covenant</a>. O Linus é grosseiro nos emails desde sempre, todo mundo sabe, e ele voltou um mês depois. Mas o recado foi dado: se nem o cara que criou o kernel estava a salvo, ninguém estava.</p>
<p><strong>Richard Stallman, 2019.</strong> O criador da GPL, fundador da FSF, a encarnação do software livre. Vazaram um thread de lista de email do MIT em que ele discutia semântica jurídica sobre o caso Minsky/Epstein. A Vice estampou que ele tinha <a href="https://news.tuxmachines.org/node/128122"target="_blank" rel="noopener">&ldquo;defendido Epstein&rdquo; e chamado as vítimas de &ldquo;entirely willing&rdquo;</a>, uma leitura que o próprio thread de emails não sustenta: ele questionava a terminologia jurídica da acusação contra o Minsky. A campanha <a href="https://medium.com/@selamie/remove-richard-stallman-fec6ec210794"target="_blank" rel="noopener">&ldquo;Remove Richard Stallman&rdquo;</a> explodiu, e em dias ele <a href="https://www.npr.org/2019/09/17/761718975/free-software-pioneer-quits-mit-over-his-comments-on-epstein-sex-trafficking-cas"target="_blank" rel="noopener">renunciou do MIT e da presidência da FSF</a>. Quando ele voltou ao conselho da FSF em 2021, saiu <a href="https://rms-open-letter.github.io/"target="_blank" rel="noopener">uma carta aberta com mais de 3 mil assinaturas e dezenas de organizações</a> exigindo a cabeça dele e de todo o conselho. A Red Hat <a href="https://www.redhat.com/en/blog/red-hat-statement-about-richard-stallmans-return-fsf-board"target="_blank" rel="noopener">cortou o financiamento da FSF</a>. A <a href="https://rms-support-letter.github.io/"target="_blank" rel="noopener">carta de apoio juntou quase 7 mil assinaturas</a> e, detalhe delicioso, o Debian votou uma resolução sobre o caso e <a href="https://www.debian.org/vote/2021/vote_002"target="_blank" rel="noopener">a opção vencedora foi não se manifestar</a>. Até para fingir neutralidade precisou de votação.</p>
<p>E tem o caso mais recente e talvez o mais didático: <strong>Tim Peters, 2024</strong>. Lenda do Python, três décadas de contribuição, suspenso por três meses pelo comitê de conduta da PSF <a href="https://www.theregister.com/software/2024/08/09/core-python-developer-suspended-for-three-months/1429020"target="_blank" rel="noopener">por acusações vagas de criar &ldquo;atmosfera de FUD&rdquo;</a>, numa briga sobre os estatutos da fundação e sobre os métodos do próprio comitê. A comunidade reagiu feio, mas não teve volta: ele cumpriu os três meses e só voltou quando a suspensão expirou, em novembro. O padrão se manteve: discordar da moderação virou ofensa punível.</p>
<p><strong>DHH, 2021.</strong> Deixei esse para o final porque é o caso que muda a história. E note: aqui nem open source era, era a empresa dele. O mesmo mecanismo, agora dentro do escritório. Em abril de 2021, no auge da era BLM, um comitê interno de DEI dentro da Basecamp, a empresa do criador do Ruby on Rails com o Jason Fried, desenterrou uma lista antiga de &ldquo;nomes engraçados de clientes&rdquo; que circulava na empresa. A discussão escalou até um funcionário citar a &ldquo;pirâmide do ódio&rdquo; e argumentar que aquela lista era o fundamento de violência racial e até genocídio. A resposta dos fundadores foi fechar o assunto, dissolver o comitê e <a href="https://world.hey.com/dhh/basecamp-s-new-etiquette-regarding-societal-politics-at-work-b44bef69"target="_blank" rel="noopener">proibir discussão política e social nos canais internos</a>. A internet explodiu. Na reunião geral seguinte, foram <a href="https://www.theverge.com/2021/5/3/22418208/basecamp-all-hands-meeting-employee-resignations-buyouts-implosion"target="_blank" rel="noopener">duas horas e meia de gente chorando e gritando no Zoom</a>. O Ryan Singer, dezoito anos de casa, disse ali que não aceitava o rótulo de &ldquo;cultura de supremacia branca&rdquo; aplicado à empresa. Foi suspenso meia hora depois da reunião e se demitiu no fim de semana. Ao final, <a href="https://www.nytimes.com/2021/04/30/technology/basecamp-politics-ban-resignations.html"target="_blank" rel="noopener">um terço da empresa, vinte dos 57 funcionários, saiu com pacote de demissão voluntária</a>.</p>
<p>E é aqui que esse caso se separa de todos os outros: ele não dobrou. Sem ritual público de humilhação, sem pedido de desculpas, sem volta atrás. Preferiu perder um terço da empresa a entregar o controle dela. A Basecamp sobreviveu, virou 37signals de novo, e o DHH aprendeu ali, na carne, com que tipo de gente estava lidando. Guarda esse nome, porque ele volta.</p>
<p>Alguém vai apontar que a regra dele também é um documento escrito proibindo um assunto. É, e a diferença é exatamente o ponto: a regra do DHH bane um tópico inteiro, igual pra todo mundo, não importa o lado. Código de conduta bane pessoa e opinião, seletivamente, dependendo de quem está no poder naquele mês.</p>
<blockquote>
  <p>Uma trava o assunto na porta. A outra abre um tribunal lá dentro.</p>

</blockquote>
<p>Repara no padrão. Em nenhum desses casos o problema era código. Em nenhum deles alguém commitou bug, roubou código, sabotou release. As ofensas foram opiniões, doações políticas, vida privada, semântica em lista de email. O critério técnico foi substituído pelo critério político, e o código de conduta foi o instrumento jurídico dessa substituição. São casos famosos, não estatística. Mas quando a lista inclui os criadores do JavaScript, da GPL e do Linux, a amostra não precisa ser grande para passar o recado.</p>
<h2>E os resultados?<span class="hx:absolute hx:-mt-20" id="e-os-resultados"></span>
    <a href="#e-os-resultados" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Dez anos de era do código de conduta deveriam ter deixado um rastro de números bons. Se a justificativa era proteger minorias e tornar o open source mais diverso e menos tóxico, cadê a melhora? Fui procurar a pesquisa séria sobre o assunto. O que existe conta uma história interessante.</p>
<p>Sobre adoção: <a href="https://www.win.tue.nl/~aserebre/SANER2017.pdf"target="_blank" rel="noopener">Tourani, Adams e Serebrenik mediram em 2017</a> que cerca de 35% dos 150 projetos mais populares do GitHub tinham código de conduta. E que enforcement era raro: os criadores desses códigos, numa amostra de quatro entrevistados, falavam em casos de um dígito ao longo de anos. Um <a href="https://par.nsf.gov/servlets/purl/10347026"target="_blank" rel="noopener">estudo de 2021 da CSCW</a> olhou 52 mil repositórios: 12,6% tinham CoC, e só 10% das conversas mencionando o código eram uso real dele em moderação. A maioria das adoções aconteceu sem discussão pública visível no repositório. O mesmo paper diz, com todas as letras, que não existe evidência empírica de que código de conduta atraia novos contribuidores.</p>
<p>Sobre atrair gente, aliás, <a href="https://cmustrudel.github.io/papers/cscw19signals.pdf"target="_blank" rel="noopener">Qiu et al. mediram o que realmente faz alguém entrar num projeto</a>: README bom, número de estrelas, atividade recente, template de issue. Código de conduta nem entrou como variável no modelo deles, e olha que eles testaram maintainer responder rápido, que também não deu significativo. Quem mediu especificamente onde o CoC fica no ranking de fatores foi um estudo separado, o <a href="https://link.springer.com/chapter/10.1007/978-3-030-20883-7_9"target="_blank" rel="noopener">Fronchetti, Wiese, Pinto e Steinmacher, também de 2019</a>: CoC ficou entre os fatores pior colocados pra atrair contribuidor novo. Ninguém escolhe projeto pelo código de conduta.</p>
<p>Sobre diversidade, que era a promessa original, tem estudo específico e a resposta é não. O <a href="https://dl.acm.org/doi/10.1145/3236024.3275441"target="_blank" rel="noopener">Robson, no ESEC/FSE de 2018</a>, olhou os 500 projetos mais populares do GitHub: projetos que adotaram CoC viram a participação de mulheres crescer praticamente no mesmo ritmo dos que não adotaram (por volta de 1,44% de aumento contra 1,43%, segundo o levantamento posterior que cita o estudo). Sem diferença estatística que sustente a promessa. O <a href="https://research.tue.nl/files/198367174/Enache_B.pdf"target="_blank" rel="noopener">Enache, em dissertação de mestrado de 2017 pra TU Eindhoven, sobre 149 comunidades open source</a>, chegou na mesma conclusão: nenhum resultado significativo de que CoC mude a participação de mulheres.</p>
<p>E tem uma pesquisa nova, de peso, publicada agora em 2026 no ICSE, a conferência mais importante da área: o <a href="https://jys-sun.github.io/website/resources/Beyond_Adoption_ICSE2026_CR.pdf"target="_blank" rel="noopener">Sun et al. rodou um experimento causal de verdade</a>, comparando 4.684 pares de repositórios que adotaram CoC contra pares equivalentes que não adotaram. O resultado tem duas pontas. Adotar CoC atrai sim mais contribuidor novo, e esse efeito cresce com o tempo. Só que adotar CoC também aumenta o número de contribuidores antigos que se desengajam, efeito concentrado justamente nos primeiros um a três meses depois da adoção. Ou seja: o próprio estudo mais recente e mais rigoroso que existe mostra, com número, o padrão que esse texto documentou caso por caso o tempo todo. Adotar o documento não constrói comunidade nova, ele expulsa gente que já estava lá.</p>
<p>O levantamento do GitHub de 2017 já marcava <a href="https://opensourcesurvey.org/2017/"target="_blank" rel="noopener">95% homens e 3% mulheres no open source</a>. O melhor dado de longo prazo que existe, do <a href="https://arxiv.org/html/2202.07278v1"target="_blank" rel="noopener">Rossi e Zacchiroli no ICSE 2022</a>, analisou 2,2 bilhões de commits do arquivo do Software Heritage. Gênero detectável para 64% dos autores e, nesse grupo, mulheres são 13,5% dos autores e assinam 8,1% dos commits. A participação delas vinha crescendo devagar e de forma contínua havia doze anos, e caiu na pandemia. O paper não fala de código de conduta, então a leitura que segue é minha, não do estudo: uma curva que sobe do mesmo jeito a década inteira, sem nenhum degrau visível quando o Contributor Covenant se espalhou, é o oposto de evidência de que o documento fez diferença.</p>
<p>Sobre toxicidade, o <a href="https://courtney-e-miller.github.io/papers/DidYouMissMyCommentOrWhat.pdf"target="_blank" rel="noopener">estudo da ICSE 2022</a> acha, em nota de rodapé e por extrapolação, algo perto de 1,3 comentários tóxicos por mil no GitHub. Ninguém tem uma série histórica comparando antes e depois da era CoC. Simplesmente não existe baseline pra dizer se piorou ou melhorou.</p>
<p>O único experimento randomizado que sustentaria a tese das regras <a href="https://doi.org/10.1073/pnas.1813486116"target="_blank" rel="noopener">é do Matias, publicado na PNAS em 2019</a>: lembretes de regras exibidos ativamente numa amostra sorteada de threads no r/science aumentaram em 70% a participação de novatos. Só que o experimento é no Reddit, com a regra pregada bem na cara de quem entrava naquela thread específica. Um arquivo estático esquecido no repositório, que ninguém lê depois do dia da adoção, não chega nem perto disso. A própria pesquisa que mostra uma regra funcionando é a prova de que o problema nunca foi ter ou não ter o arquivo. É ninguém aplicar, ninguém mostrar, ninguém fazer valer.</p>
<p>Resumindo: uma década inteira de códigos de conduta, e a promessa original continua exatamente isso, uma promessa. O que ficou documentado foi adoção sem discussão, enforcement raro e, no máximo, um monte de processo político.</p>
<blockquote>
  <p>Como proteção, quase nunca é invocado. Como arma política, só precisa ser invocado uma vez, contra a pessoa certa.</p>

</blockquote>
<h2>A contra-reação veio de onde ninguém esperava<span class="hx:absolute hx:-mt-20" id="a-contra-reação-veio-de-onde-ninguém-esperava"></span>
    <a href="#a-contra-rea%c3%a7%c3%a3o-veio-de-onde-ningu%c3%a9m-esperava" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O dinheiro fácil acabou em 2022 e, com ele, a paciência da indústria para esse teatro. E a liderança da reação foi o cara que já tinha se recusado a dobrar em 2021: o DHH, ex-fanboy de Mac da velha guarda.</p>
<p>O DHH vem escrevendo contra essa onda faz tempo: <a href="https://world.hey.com/dhh/the-waning-days-of-dei-s-dominance-9a5b656c"target="_blank" rel="noopener">&ldquo;The waning days of DEI&rsquo;s dominance&rdquo;</a> em 2022, <a href="https://world.hey.com/dhh/dei-is-done-minus-the-mop-up-b3bbbb64"target="_blank" rel="noopener">&ldquo;DEI is done&rdquo;</a> em 2024. Em 2022 a Ruby Central <a href="https://world.hey.com/dhh/no-railsconf-faa7935e"target="_blank" rel="noopener">tirou ele do keynote da RailsConf</a>, a conferência do framework que ele mesmo criou, dizendo que queria <em>&ldquo;dividir o palco de abertura com outros contribuidores&rdquo;</em>. No ano seguinte nasceu a Rails World, a conferência oficial da Rails Foundation, e o DHH virou keynote dela. Em 2024 lançou o Omakub e, em junho de 2025, o <a href="https://world.hey.com/dhh/omarchy-is-out-4666dd31"target="_blank" rel="noopener">Omarchy</a>: Arch Linux com Hyprland e um monte de scripts opinativos em cima, que passava de 40 mil stars no GitHub em setembro de 2026 e virou o ambiente padrão da 37signals pra quem mexe com infra e Ruby.</p>
<p>Aí a máquina de cancelar ligou de novo. Em setembro de 2025 ele publicou <a href="https://world.hey.com/dhh/as-i-remember-london-e7d38e64"target="_blank" rel="noopener">&ldquo;As I remember London&rdquo;</a>, e a reação foi o script de sempre: petição para tirá-lo, acusações, tentativa de boicote. A resposta dele foi <a href="https://world.hey.com/dhh/we-ve-all-had-enough-of-this-nonsense-8545dd26"target="_blank" rel="noopener">&ldquo;We&rsquo;ve all had enough of this nonsense&rdquo;</a>: <em>&ldquo;a cada poucos anos, o mesmo grupelho triste de descontentes do Ruby tenta me cancelar do Rails&rdquo;</em>.</p>
<p>Um mês depois, em outubro de 2025, foi a vez da Framework, fabricante de laptops: <a href="https://www.theregister.com/software/2025/10/14/framework-flame-war-erupts-over-linux-controversy/1466815"target="_blank" rel="noopener">um thread com mais de 1.500 respostas no fórum da própria empresa</a>, aberto por um desenvolvedor Debian chamando a comunidade do Hyprland, que a Framework patrocinava, de &ldquo;tóxica e odiosa&rdquo;, e ameaçando boicote porque a empresa também promovia o Omarchy nas redes. A resposta do CEO da Framework é a frase que faltava nessa década inteira:</p>
<blockquote>
  <p><em>&ldquo;Criamos deliberadamente uma barraca grande, porque queremos que o open source vença. Não fazemos parceria com base nas crenças de indivíduos ou organizações.&rdquo;</em> (&ldquo;big tent&rdquo;, no original.)</p>

</blockquote>
<p>E a máquina não bateu só nele. A Ruby Central, a mesma que tinha desconvidado o DHH do keynote em 2022, deu palco para ele na RailsConf 2025. A retaliação veio em dinheiro: segundo a apuração do desenvolvedor Joel Drapper, a Sidekiq <a href="https://mjtsai.com/blog/2025/09/"target="_blank" rel="noopener">retirou o patrocínio de 250 mil dólares por ano</a> por causa disso. Semanas depois, em setembro de 2025, a Ruby Central <a href="https://lwn.net/Articles/1040778/"target="_blank" rel="noopener">removeu do GitHub todos os maintainers de longa data do RubyGems e do Bundler</a>, alegando segurança da cadeia de suprimentos. A Ellen Dash, que mantinha o projeto havia dez anos, pediu conta chamando o movimento de &ldquo;hostile takeover&rdquo;, e a investigação do Drapper aponta pressão da Shopify, que tinha virado praticamente a única fonte de dinheiro da organização. A própria Ruby Central acabou publicando um <a href="https://www.theregister.com/2026/04/01/ruby_central_report/"target="_blank" rel="noopener">relatório do incidente</a> em abril de 2026, prometendo &ldquo;fortalecer a governança&rdquo;. Esse é o padrão completo: quando a máquina não derruba o alvo, incendeia a casa em volta dele.</p>
<p>Um desenvolvedor do GNOME publicou <a href="https://blogs.gnome.org/alatiera/2025/11/06/dhh-and-omarchy-midlife-crisis/"target="_blank" rel="noopener">um texto atacando o Omarchy no blog oficial de blogs do GNOME</a>. E o resultado de toda essa fúria? Nada. Em agosto de 2026 nasceu a <a href="https://www.theregister.com/os-platforms/2026/08/27/omarchy-distro-gains-serious-backing/5293026"target="_blank" rel="noopener">Omacom Foundation</a>, com oito milhões de dólares no lançamento: um milhão de cada um de Tobi Lütke (Shopify), Patrick Collison (Stripe), Michael Dell, Jack Dorsey, Matthew Prince (Cloudflare), Brendan Iribe, Jason Fried e o próprio DHH. A fundação virou patrocinadora exclusiva do Hyprland, com o Vaxry trabalhando em tempo integral. Quando a 1Password entrou como patrocinadora, a <a href="https://www.alilleybrinker.com/blog/1password-funds-ethnic-cleansing/"target="_blank" rel="noopener">tentativa de cancelamento</a> foi imediata e a <a href="https://www.theverge.com/tech/988536/1password-dhh-linux-controversy"target="_blank" rel="noopener">resposta interna do CEO</a> também: <em>&ldquo;nossa doação não é endosso de opiniões pessoais&rdquo;</em>. E segue o jogo.</p>
<p>E eu botei o meu dinheiro onde está a minha boca: <a href="https://x.com/AkitaOnRails/status/2098792361291567488"target="_blank" rel="noopener">fiz a minha doação para a fundação</a> exatamente por causa do chororo da patrulha. Nada irrita mais essa turma do que ver o cancelamento falhar em tempo real.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260914175728_omacom-doacao.jpeg" alt="Recibo da minha doação de 2.048 dólares para a Omacom Foundation, assinado pelo DHH como Founder & President"  loading="lazy" /></p>
<p>Esse é o ponto: a máquina ainda existe, mas perdeu o poder. Em 2014 derrubou um CEO em onze dias. Em 2026 não consegue arranhar um patrocínio de distro de nicho. Os documentos continuam lá, no template do GitHub; o que acabou foi o poder de fogo de quem os empunhava. O que mudou foi o dinheiro, e sim, a contra-reação também é dinheiro: oito milhões de dólares de oito homens ricos.</p>
<p>E antes que alguém aponte que dinheiro não prova mérito: depende. Milionário criado por conchavo de governo, fraude ou favor não tem mérito nenhum. Mas a maioria dos milionários se fez produzindo, e é o caso dos oito patronos da Omacom. Dinheiro ganho produzindo é a medida do mérito de quem o fez, como eu já escrevi aqui em 2011, sobre <a href="/2011/02/03/off-topic-a-revolta-de-atlas-dinheiro-e-a-raiz-de-todo-o-mal/">o discurso do dinheiro do Francisco D&rsquo;Anconia em &ldquo;A Revolta de Atlas&rdquo;</a>.</p>
<blockquote>
  <p>Julgue pelo resultado que a doação comprou, não pela intenção declarada de quem assina o cheque.</p>

</blockquote>
<p>Os 49,5 bilhões de dólares corporativos de 2020 não produziram um grama a mais de diversidade mensurável, os números aí em cima provam isso. Oito milhões de dólares de patrono individual produziram um maintainer em tempo integral escrevendo código de verdade. A bolha que financiava exércitos de gente sem trabalho real estourou, e quem sobrou foi quem estava lá pelo código.</p>
<h2>A parte filosófica<span class="hx:absolute hx:-mt-20" id="a-parte-filosófica"></span>
    <a href="#a-parte-filos%c3%b3fica" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Vamos à desculpa oficial: códigos de conduta existem para &ldquo;proteger minorias&rdquo;. Na superfície, quem seria contra proteger minorias? Eu não sou. O problema é que a frase é vaga por design.</p>
<p>O que é uma minoria? Eu já traduzi aqui no blog o capítulo <a href="/2009/09/09/off-topic-direitos-do-homem/">&ldquo;Direitos do Homem&rdquo;</a> de &ldquo;The Virtue of Selfishness&rdquo;, da Ayn Rand. A frase que me interessa aqui está em outro capítulo do mesmo livro, &ldquo;Racism&rdquo;, e continua imbatível:</p>
<blockquote>
  <p>A menor minoria da Terra é o indivíduo. Quem nega direitos individuais não pode dizer que defende minorias.</p>

</blockquote>
<p>E é exatamente isso que esses códigos fazem na prática: em nome de uma minoria abstrata e coletiva, persegue-se o indivíduo concreto. Doxxing (expor os dados pessoais da pessoa), campanha de assédio, pressão no empregador, banimento. Quando o modus operandi para &ldquo;proteger minorias&rdquo; é bullying coordenado contra uma pessoa até ela dobrar os joelhos, você está oprimindo a menor minoria que existe.</p>
<p>Esse assunto, aliás, é velho para mim. Em dezembro de 2018 eu publiquei no meu canal o vídeo <a href="/2018/12/05/akitando-31-manifesto-anti-parasita-seja-um-criador/">&ldquo;Manifesto Anti-Parasita: Seja um Criador&rdquo;</a>. Na época eu não podia ser explícito, a polícia do pensamento ainda estava forte demais. Mas quem assistiu com atenção entendeu o recado. Era o meu breadcrumb para essa história que eu só estou podendo contar direito agora.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/nX0wPjNzn3o"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>E tem o segundo problema, mais fundamental: open source é sobre software. A GPL, que essa turma tanto despreza, resolve a proteção que um projeto de software não pode perder: a do código. Garante que o código continue livre, ponto. Ela não pergunta quem escreveu, em quem votou, o que tuitou, o que doou. O compilador não checa pureza ideológica. O open source sempre foi a comunidade mais inclusiva que já existiu justamente por isso: o único passaporte era o diff. O código de conduta tornou o open source menos inclusivo, porque adicionou um critério novo à entrada: política. E política é um critério estúpido para software.</p>
<p>&ldquo;Ah, mas sem código de conduta, como lidamos com assédio real?&rdquo; Com a mesma ferramenta de sempre: bom senso de maintainer e, quando necessário, a lei. Se alguém ataca outra pessoa diretamente, uma agressão sexual num evento, por exemplo, banir é senso comum e nunca precisou de documento nenhum. Assédio, ameaça e difamação já são crimes em praticamente todo país, e crime se resolve no caminho da lei. O que eu não engulo é outra coisa: sair stalkeando a vida online de alguém para desenterrar uma opinião aleatória, sem relação com crime nenhum, e exigir banimento por causa de palavras sem consequência criminal. Esses comitês sempre foram ótimos em punir opinião e péssimos em punir crime, então o documento nunca foi sobre isso.</p>
<p>E não sou eu sozinho dizendo isso. Eric S. Raymond, o cara que escreveu <a href="http://www.catb.org/~esr/writings/cathedral-bazaar/"target="_blank" rel="noopener">&ldquo;The Cathedral and the Bazaar&rdquo;</a>, o texto de 1997 que validou pra Netscape a decisão de abrir o código do Mozilla e que praticamente escreveu as regras do jogo do open source, cofundador da OSI, editor do Jargon File, autor do fetchmail, foi ao X em setembro de 2025 <a href="https://itsfoss.com/news/codes-of-conduct-debate/"target="_blank" rel="noopener">declarar a era dos códigos de conduta um fracasso completo</a>. Nas palavras dele: dez anos de <em>&ldquo;drama e idiotice&rdquo;</em>, uma <em>&ldquo;insanidade social infecciosa&rdquo;</em> que produz política, intriga e trabalho útil negativo. A recomendação é a mais direta possível: não adote; se já adotou, delete. E se alguma burocracia te obrigar a ter um, a substituição sugerida tem uma frase só:</p>
<blockquote>
  <p><em>&ldquo;Se você é mais chato de trabalhar do que as suas contribuições justificam, você é ejetado.&rdquo;</em></p>

</blockquote>
<p>É o que eu disse dois parágrafos acima: bom senso de maintainer.</p>
<p>E o detalhe que fecha o círculo: o próprio ESR tinha sido <a href="https://en.wikipedia.org/wiki/Eric_S._Raymond"target="_blank" rel="noopener">removido de duas listas de email da OSI em 2020</a> por posts que &ldquo;violaram o código de conduta&rdquo; da organização que ele ajudou a fundar.</p>
<blockquote>
  <p>O cara que escreveu as regras do jogo, ejetado pelo documento. Essa imagem resume a era inteira.</p>

</blockquote>
<h2>Como chegamos até aqui<span class="hx:absolute hx:-mt-20" id="como-chegamos-até-aqui"></span>
    <a href="#como-chegamos-at%c3%a9-aqui" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Vale dar um passo atrás e contar de onde veio tudo isso, porque o open source foi só um dos fronts. O tiro de largada, na minha leitura, foi o GamerGate, em 2014. Em agosto daquele ano saiu o <a href="https://thezoepost.wordpress.com/"target="_blank" rel="noopener">&ldquo;Zoe Post&rdquo;</a>, o desabafo do ex-namorado da desenvolvedora Zoe Quinn. Doze dias depois, e cerca de 48 horas depois de a hashtag #GamerGate pegar força, <a href="https://www.gamedeveloper.com/business/-gamers-don-t-have-to-be-your-audience-gamers-are-over-"target="_blank" rel="noopener">cerca de uma dúzia de sites de games publicou variações do mesmo artigo</a>: &ldquo;gamers are over&rdquo;, os jogadores estão mortos, acabou.</p>
<p>Pouco depois vazou o GameJournoPros, um grupo fechado onde jornalistas de games coordenavam cobertura. O público percebeu na hora que a imprensa de games tinha virado clube ideológico, e reagiu com a própria versão do boicote organizado: a campanha &ldquo;Operation Disrespectful Nod&rdquo; inundou a Intel de reclamação até a empresa <a href="https://www.theverge.com/2014/10/2/6886747/intel-buckles-to-anti-feminist-campaign-by-pulling-ads-from-gaming"target="_blank" rel="noopener">tirar os anúncios da Gamasutra</a> (a imprensa da época chamou de &ldquo;campanha anti-feminista&rdquo;; pra mim é só pressão organizada de consumidor, o mesmo instrumento que a Sidekiq usou contra a Ruby Central lá na frente).</p>
<p>E aqui vale fixar o princípio, porque ele vale pros dois lados o resto do texto inteiro: pressão organizada de consumidor é jogo limpo, não importa de que lado vem. O problema nunca foi pressão. É doxxing, ameaça de emprego e comitê fingindo neutralidade pra impor o resultado que já queria antes de abrir o processo.</p>
<p>Durante anos, de 2021 a junho de 2025, o artigo da Wikipedia sobre o assunto viveu batizado <a href="https://en.wikipedia.org/wiki/Gamergate"target="_blank" rel="noopener">&ldquo;Gamergate (harassment campaign)&rdquo;</a>, tratando qualquer crítica ao jornalismo como pretexto de assédio. O título foi trocado de volta pra simplesmente &ldquo;Gamergate&rdquo; depois que a fase mais histérica passou, o que devia ser lido como uma confissão, não como se o caso estivesse encerrado: renomearam de volta quando ficou caro demais defender o rótulo político, exatamente o mesmo padrão de recuo silencioso que aparece em toda essa história. Enquanto durou, durou justamente na década em que essa turba tinha poder de fogo pra fazer valer.</p>
<p>A briga editorial foi tão feia que o comitê de arbitragem da Wikipedia <a href="https://en.wikipedia.org/wiki/Wikipedia:Wikipedia_Signpost/2015-01-28/In_focus"target="_blank" rel="noopener">puniu mais de uma dúzia de editores, dos dois lados</a>. E olha que eu nem preciso acusar a Wikipedia sozinho: o Larry Sanger, cofundador da Wikipedia, escreveu em 2020 o texto <a href="https://larrysanger.org/2020/05/wikipedia-is-badly-biased/"target="_blank" rel="noopener">&ldquo;Wikipedia Is Badly Biased&rdquo;</a> declarando que a neutralidade do projeto morreu, e em setembro de 2025 publicou as <a href="https://larrysanger.org/nine-theses/"target="_blank" rel="noopener">&ldquo;Nine Theses on Wikipedia&rdquo;</a>, pedindo reformas como o fim das listas negras de fontes e o fim do bloqueio eterno de editores. Quando o fundador diz que a casa foi tomada, acredite no fundador.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260914180253_larry-sanger-akita-2018.jpg" alt="Eu e o Larry Sanger, cofundador da Wikipedia, num evento em outubro de 2018. Uma honra ter podido conhecê-lo pessoalmente."  loading="lazy" /></p>
<p>A versão do lado dos gamers dessa história está no livro <a href="https://books.google.com.br/books/about/SJWs_Always_Lie.html?id=NqSUjgEACAAJ&amp;redir_esc=y"target="_blank" rel="noopener">&ldquo;SJWs Always Lie&rdquo;</a>, do Vox Day, de 2015. Já sei o que vem: &ldquo;Vox Day&rdquo; e &ldquo;Milo Yiannopoulos&rdquo; (espero ter escrito certo) são nomes que fazem gente gritar só de ouvir, e o GameJournoPros, aliás, também foi destrinchado originalmente por esse Milo. Não me interessa a reputação de quem conta a história, me interessa se a história é verdadeira. Fonte partidária de dentro da briga, aviso dado, mas o fato central bate com o que a própria Wikipedia e a imprensa da época documentam sem ligação nenhuma com esses dois nomes: a lista GameJournoPros existiu de verdade, um grupo fechado de umas 150 pessoas do jornalismo de games trocando ideia sobre como cobrir o caso.</p>
<p>O capítulo &ldquo;Counterattack&rdquo; conta o GamerGate de dentro, e a tese do livro resume a década: essa gente sempre mente, sempre dobra a aposta, sempre projeta nos outros exatamente o que ela mesma faz.</p>
<p>Do GamerGate em diante, foi dominó. A Anita Sarkeesian transformou o Kickstarter dela de <a href="https://www.backerkit.com/projects/566429325/tropes-vs-women-in-video-games"target="_blank" rel="noopener">meta de 6 mil dólares em 158 mil</a>, virou autoridade global, foi falar na <a href="https://www.polygon.com/2015/9/25/9399169/united-nations-women-cyber-violence-anita-sarkeesian-zoe-quinn"target="_blank" rel="noopener">ONU em 2015</a> sobre &ldquo;violência cibernética&rdquo;, e o jornalismo de games nunca mais se recuperou. O Feminist Frequency dela <a href="https://www.gamesindustry.biz/anita-sarkeesian-to-close-feminist-frequency-after-15-years"target="_blank" rel="noopener">fechou as portas em 2023</a>, mas a lógica que ela inaugurou migrou para dentro dos estúdios: nasceu a indústria da consultoria de &ldquo;narrativa inclusiva&rdquo;, com a Sweet Baby Inc na dianteira.</p>
<p>A CEO da Sweet Baby, Kim Belair, foi gravada numa palestra da GDC de 2019, gravação pública que circula fora do site que primeiro a levantou, aconselhando quem quer aprovação interna pra consultoria de &ldquo;representação&rdquo; a <a href="https://nichegamer.com/sweet-baby-ceo-terrify-them-if-game-devs-dont-push-diversity/"target="_blank" rel="noopener"><em>&ldquo;ir tomar um café com o time de marketing e aterrorizar eles&rdquo;</em></a> com a possibilidade do que aconteceria se não desse a eles o que queriam. Em 2024, um brasileiro criou no Steam uma página de curadoria (o recurso da própria Valve onde qualquer conta pode publicar recomendações de jogos e ganhar seguidores) batizada de &ldquo;Sweet Baby Inc Detected&rdquo;. Um funcionário da empresa tentou individualmente derrubar o perfil por conta própria, e a Valve também agiu por moderação própria; mesmo assim, o resultado foi o grupo explodindo para <a href="https://en.wikipedia.org/wiki/Sweet_Baby_Inc."target="_blank" rel="noopener">mais de 350 mil seguidores</a>.</p>
<p>E vieram os flops. O Suicide Squad: Kill the Justice League, com <a href="https://en.wikipedia.org/wiki/Sweet_Baby_Inc."target="_blank" rel="noopener">consultoria confirmada da Sweet Baby</a>, <a href="https://finance.yahoo.com/news/suicide-squad-flop-still-hurting-135841738.html"target="_blank" rel="noopener">custou 200 milhões de dólares de prejuízo à Warner</a>. O Unknown 9, do estúdio onde a dupla fundadora da Sweet Baby trabalhava, <a href="https://www.pcgamer.com/gaming-industry/unknown-9-awakening-studio-makes-major-layoffs-just-a-month-after-the-games-release/"target="_blank" rel="noopener">demitiu em massa um mês depois do lançamento</a>.</p>
<p>Aí veio 2020. Com o BLM, a mesma cartilha virou política de Estado: as 50 maiores empresas americanas <a href="https://finance.yahoo.com/news/corporate-america-pledged-50b-racial-185054221.html"target="_blank" rel="noopener">prometeram 49,5 bilhões de dólares</a> em ações de &ldquo;justiça racial&rdquo;, vagas de DEI <a href="https://www.visier.com/blog/chief-diversity-officers-exits/"target="_blank" rel="noopener">cresceram 123% em meses</a>, Biden assinou no primeiro dia de mandato a <a href="https://civilrights.org/biden-timeline/"target="_blank" rel="noopener">ordem executiva de &ldquo;equidade&rdquo; para todo o governo federal</a>, e a União Europeia saiu com seu <a href="https://ec.europa.eu/newsroom/just/items/692134"target="_blank" rel="noopener">plano anti-racismo 2020-2025</a>. Era o auge: a patrulha tinha chegado à presidência dos EUA e à liderança da UE.</p>
<p>O recuo veio tão rápido quanto a subida. A Suprema Corte americana <a href="https://www.scotusblog.com/2023/06/supreme-court-strikes-down-affirmative-action-programs-in-college-admissions/"target="_blank" rel="noopener">derrubou o affirmative action em junho de 2023</a>, as empresas <a href="https://www.npr.org/2025/05/27/nx-s1-5307319/dei-jobs-trump"target="_blank" rel="noopener">demitiram milhares de profissionais de DEI</a>, Walmart, Meta, McDonald&rsquo;s e Amazon abandonaram os programas, e em janeiro de 2025 o Trump <a href="https://www.everycrsreport.com/reports/IN12497.html"target="_blank" rel="noopener">revogou as ordens de equidade</a> no primeiro dia.</p>
<p>Contei tudo isso só para situar: o que aconteceu no open source não foi um fenômeno isolado. Foi o mesmo roteiro, com os mesmos métodos, em todas as indústrias de cultura e tecnologia ao mesmo tempo. A diferença é que no open source a resistência demorou mais para organizar. Mas organizou.</p>
<h2>O meu Cortlandt<span class="hx:absolute hx:-mt-20" id="o-meu-cortlandt"></span>
    <a href="#o-meu-cortlandt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Foi essa pressão que me tirou da organização da RubyConf Brasil. Eu fundei o evento em 2008, ainda como Rails Summit, e na última edição que eu organizei, em 2016, levamos 1.500 pessoas. Quando <a href="/2016/09/26/os-proximos-10-anos/">anunciei a minha saída</a>, escrevi que não tinha drama nenhum envolvido. Não era a verdade inteira: a patrulha já tinha chegado nas conferências de tecnologia, e eu me recusei a transformar o evento que eu criei em mais um palco dela.</p>
<p>Vou dar um exemplo pequeno do que significa ser obrigado a forçar diversidade. Como os dados que eu mostrei acima indicam, mulheres são de 3% a pouco mais de 13% dos contribuidores de open source, dependendo de como se mede: survey autodeclarado ou detecção por nome nos commits. Os analytics do meu canal mostram a mesma faixa, 3 a 5% no máximo, e essa proporção não mudou em dez anos. Todo ano eu abria um Call for Papers público: qualquer pessoa podia submeter uma palestra. E o meu processo de seleção <strong>sempre foi cego</strong>: eu lia cada submissão sem saber quem tinha enviado, de propósito, para a escolha ser pelo mérito do tema e nunca pela pessoa.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260914175728_youtube-analytics-genero.png" alt="Analytics do meu canal no YouTube, últimos 28 dias: 97% homens, 3% mulheres"  loading="lazy" /></p>
<p>Nos anos da patrulha, a cobrança nunca foi direta comigo. Era aquela pressão externa e difusa de que todo evento tinha que ser &ldquo;mais diverso&rdquo;. E na prática isso só podia significar uma coisa: uma fase nova no processo. Depois da seleção cega, revelar quem tinha submetido o quê, para conferir se o lineup estava &ldquo;diverso o suficiente&rdquo;. Só que isso é uma impossibilidade matemática. As submissões seguiam os mesmos 3 a 5%. Mesmo aprovando todas as mulheres que submetiam, a cota imaginária não fechava. O jeito era sair convidando pessoas diretamente, escolhendo pelo perfil, e não pelo tema.</p>
<p>E o resultado prático desse esquema, onde quer que ele seja aplicado, é cortar gente que entrou por mérito para abrir vaga para gente escolhida por uma política externa irrelevante. Isso derruba a qualidade do evento em vez de subir. E repara: isso não é um argumento contra mulher nenhuma. É o contrário. No momento em que a cota entra no processo, a dúvida deixa de ser sobre uma palestrante específica e passa a pairar sobre todo mundo que pisa no palco. Não importa quem esteja falando: se alguém na plateia discordar do conteúdo, sempre vai sobrar a pergunta &ldquo;será que o Akita escolheu esse por cota?&rdquo;. A partir daí, todo palestrante carrega uma suspeita que não merece e o mérito de cada um fica desvalorizado por tabela. Prejudica a minoria que a política dizia proteger, prejudica os outros palestrantes, prejudica o público. É lose-lose em todas as pontas.</p>
<p>E tem uma parte dessa história que ninguém vê de fora. Algumas das pessoas convidadas desse jeito recusaram na hora, &ldquo;porque o evento não era diverso o suficiente&rdquo;. A recusa deixava o evento menos diverso ainda, óbvio. E depois iam para as redes sociais falar mal do evento, como se eu nunca tivesse convidado ninguém. Esse era o nível do lixo que eu tinha que engolir todo ano.</p>
<p>E que fique bem claro: não existe nada que eu queira mais do que ver mais mulheres na tecnologia. O que eu não consigo me convencer é de que forçar cota, do jeito que eu descrevi acima, ajuda nisso. Tudo que eu vi na prática aponta o contrário: prejudica mais do que ajuda. E se eu não acredito que é benéfico, eu prefiro não fazer.</p>
<p>Quer um exemplo recente de mulher que eu admiro na indústria? Asha Sharma, que <a href="https://www.gameshub.com/news/news/xbox-game-pass-cheaper-new-ceo-asha-sharma-2026-2862856/"target="_blank" rel="noopener">assumiu como CEO do Xbox em fevereiro</a>. Desde então é resultado atrás de resultado: <a href="https://www.windowscentral.com/gaming/xbox/microsofts-xbox-ceo-asha-sharma-vows-to-deliver-xbox-updates-every-two-weeks-to-fix-the-fundamentals"target="_blank" rel="noopener">cortou o Copilot dos consoles e reestruturou a divisão para focar no que importa</a>, <a href="https://www.allkeyshop.com/blog/xbox-first-party-titles-survive-layoffs-news-d/"target="_blank" rel="noopener">vendeu estúdios e cortou custo sem cancelar nenhum jogo anunciado</a>, e essa semana <a href="https://www.kojimaproductions.jp/en/xbox_partnership_announcement"target="_blank" rel="noopener">trouxeram a Kojima Productions para o Xbox</a> publicar o próximo jogo do Hideo Kojima, <a href="https://www.gamespot.com/articles/kojimas-physint-dropped-by-playstation-rescued-by-xbox/"target="_blank" rel="noopener">depois da PlayStation cancelar o projeto</a> em meados de 2026. Repara no discurso em volta dela: zero menção a &ldquo;gênero&rdquo;, zero pauta.</p>
<blockquote>
  <p>Só número: cortar custo desnecessário, apostar nas bets certas, melhorar o valor para o cliente. Isso é mérito. Não precisa de DEI para isso.</p>

</blockquote>
<p>Até que eu decidi que chega. Quem leu &ldquo;The Fountainhead&rdquo; sabe o que eu fiz: como o Howard Roark, o arquiteto que explode o próprio prédio quando adulteram o projeto dele, eu dinamitei o meu Cortlandt. Mais precisamente: o evento como ele existia enquanto era meu. A marca sobreviveu alguns anos na mão de outros, sem a mesma alma, até desaparecer. E eu já tinha <a href="/2011/02/04/off-topic-the-fountainhead-defesa-de-howard-roark/">sinalizado essa filosofia aqui no blog ainda em 2011</a>. Um indivíduo não faz nada pelos outros: faz por si mesmo. Se o que você constrói beneficia outras pessoas como efeito colateral, melhor, mas esse nunca foi o motivo. Quando os parasitas querem tomar o que você construiu, você mesmo explode tudo. Porque pode. Quem construiu uma vez, constrói de novo do zero.</p>
<p>Foi o que eu fiz. Troquei a conferência pelo meu canal do YouTube, que não dependia de patrocinador, de comitê, de ninguém além de mim. E o canal cresceu muito além do que a conferência jamais seria. Depois eu sentei e esperei a bolha estourar, porque eu sabia que ela ia estourar: escrevi isso aqui no blog e repeti nos vídeos anos antes de acontecer. Estourou. Paciência sempre vence.</p>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Dez anos de código de conduta e o placar é esse: zero evidência de que aumentou diversidade, nem baseline de toxicidade pra comparar antes e depois, e o estudo causal mais recente e mais rigoroso que existe mostra o documento afastando contribuidor antigo mais do que constrói comunidade nova. A promessa era proteger minorias. A entrega foi uma coleção de cabeças: o criador do JavaScript, o criador da GPL, o criador do Linux, todos passando pelo ritual público de humilhação. Nenhum por causa de código. Todos por causa de opinião.</p>
<p>E repara como essa era terminou.</p>
<blockquote>
  <p>A máquina não perdeu o debate, perdeu o financiamento.</p>

</blockquote>
<p>Foi só o dinheiro fácil acabar que os exércitos de gente sem trabalho real evaporaram, e quem sobrou foi quem estava lá pelo código. Enquanto isso, os builders seguiram construindo: o Brendan Eich foi expulso da Mozilla em 2014 e no ano seguinte fundou a Brave, hoje com mais de 100 milhões de usuários ativos por mês e valuation perto de 1 bilhão de dólares. O DHH perdeu o keynote e criou uma conferência maior, perdeu um terço da empresa e ajudou a levantar uma fundação de oito milhões. Eu saí da minha conferência e cresci muito mais no canal. Instituição, parasita toma. Capacidade de construir, não. Quem construiu uma vez, constrói de novo do zero.</p>
<p>Open source recruta voluntários que querem contribuir código. Qualquer discussão que não envolve código é distração na melhor hipótese e sabotagem na pior. E a resposta para &ldquo;o que colocar no lugar do código de conduta&rdquo; cabe numa frase só, que o ESR já escreveu: se você é mais chato de trabalhar do que as suas contribuições justificam, você é ejetado. Sempre foi assim que funcionou. O único passaporte é o diff.</p>
<p>O resto é politicagem. E politicagem, para usar o termo técnico preciso, é bullshit.</p>
<p>E fica a recomendação prática final. Se o seu projeto open source tem um <code>CODE_OF_CONDUCT.md</code>, delete o arquivo. Se o seu branch principal virou <code>main</code> na onda de 2020, renomeie de volta para <code>master</code>. Em parte de birra, admito. Mas principalmente para exercitar a liberdade recém-recuperada de fazer isso sem ser cancelado por causa disso. Liberdade que não se exercita atrofia. Sem nota de esclarecimento, sem votação de comitê, sem pedir licença para ninguém. Só porque agora você pode de novo.</p>
]]></content:encoded><category>off-topic</category><category>open-source</category><category>politica</category></item><item><title>AI-MEMORY 2.0 - o melhor sistema de memória para agentes e times</title><link>https://akitaonrails.github.io/2026/09/02/ai-memory-2-0-melhor-sistema-memoria-agentes-e-times/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/09/02/ai-memory-2-0-melhor-sistema-memoria-agentes-e-times/</guid><pubDate>Wed, 02 Sep 2026 11:00:00 -0300</pubDate><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; a &lt;a href="https://github.com/akitaonrails/ai-memory/releases/tag/v2.0.0"target="_blank" rel="noopener"&gt;ai-memory 2.0 já está no ar&lt;/a&gt;, com formato aberto OKF, embeddings locais ligados por padrão e suporte de verdade a vários agentes e a um time inteiro trabalhando no mesmo projeto em paralelo. Abaixo vai o pitch completo.&lt;/p&gt;
&lt;p&gt;Em julho eu publiquei &lt;a href="https://akitaonrails.github.io/2026/07/20/novidades-no-meu-ai-memory-cada-vez-melhor-pra-usar-com-suas-ias/"&gt;Novidades no meu AI-MEMORY&lt;/a&gt;, onde mostrei o &lt;code&gt;ai-memory run&lt;/code&gt;: trocar de Claude Code pra Codex sem perder a linha de trabalho. Naquele dia estávamos na versão 1.17.1.&lt;/p&gt;
&lt;p&gt;Hoje saiu a &lt;strong&gt;2.0&lt;/strong&gt;. E dessa vez não vou repetir como os hooks funcionam nem como uma sessão vira página de wiki. Isso já está nos textos anteriores. Aqui eu quero falar de onde o ai-memory chegou frente à concorrência, o que a 2.0 traz e por que ela mereceu virar um &amp;ldquo;2&amp;rdquo;.&lt;/p&gt;</description><content:encoded><![CDATA[<p><strong>TL;DR:</strong> a <a href="https://github.com/akitaonrails/ai-memory/releases/tag/v2.0.0"target="_blank" rel="noopener">ai-memory 2.0 já está no ar</a>, com formato aberto OKF, embeddings locais ligados por padrão e suporte de verdade a vários agentes e a um time inteiro trabalhando no mesmo projeto em paralelo. Abaixo vai o pitch completo.</p>
<p>Em julho eu publiquei <a href="/2026/07/20/novidades-no-meu-ai-memory-cada-vez-melhor-pra-usar-com-suas-ias/">Novidades no meu AI-MEMORY</a>, onde mostrei o <code>ai-memory run</code>: trocar de Claude Code pra Codex sem perder a linha de trabalho. Naquele dia estávamos na versão 1.17.1.</p>
<p>Hoje saiu a <strong>2.0</strong>. E dessa vez não vou repetir como os hooks funcionam nem como uma sessão vira página de wiki. Isso já está nos textos anteriores. Aqui eu quero falar de onde o ai-memory chegou frente à concorrência, o que a 2.0 traz e por que ela mereceu virar um &ldquo;2&rdquo;.</p>
<p>Se você nunca ouviu falar do projeto, o resumo é curto. O ai-memory é um servidor de memória de longo prazo pros seus agentes de código. Ele captura o que aconteceu na sessão, consolida em páginas Markdown e devolve o contexto certo pro próximo agente, seja qual for o harness ou a máquina.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260902132131_screenshot-2026-09-02_13-20-02.png" alt="Navegador web do ai-memory 2.0 mostrando a lista de projetos da wiki, com o aviso de backup pré-migração para o formato OKF e cartões de vários projetos como ai-memory, akitaonrails-hugo e outros"  loading="lazy" /></p>
<p>Essa é a interface web que vem junto, boa pra auditar o que os agentes gravaram e pra navegar entre os projetos. Repare que cada projeto vive separado, com sua própria contagem de páginas, tudo saído das sessões de verdade.</p>
<h2>Por que virou 2.0<span class="hx:absolute hx:-mt-20" id="por-que-virou-20"></span>
    <a href="#por-que-virou-20" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra mim, o primeiro número de uma versão carrega um compromisso.</p>
<p>A família 1.x cresceu rápido demais. Saímos da 1.1 e chegamos na 1.39 em pouco mais de dois meses, empilhando funcionalidade atrás de funcionalidade em releases menores. Funcionou pra iterar, mas embaralhou o significado dos números.</p>
<p>A 2.0 arruma isso. Ela junta as poucas mudanças que quebram compatibilidade num único major, e a partir daqui o versionamento passa a seguir <a href="https://github.com/akitaonrails/ai-memory/blob/main/CONTRIBUTING.md"target="_blank" rel="noopener">Semantic Versioning</a> de verdade. Correção vira patch. Funcionalidade nova vira minor. Só quebra de formato ou de contrato vira major, e sempre com aviso. O novo guia de contribuição deixa essa regra explícita pra qualquer PR.</p>
<p>A quebra principal é o novo formato em disco. Na primeira vez que você sobe a 2.0, ela migra sua wiki sozinha. Antes de mexer em qualquer coisa, ela compacta todo o seu diretório de dados num backup verificado com data no nome. Se o backup não puder ser gravado e conferido, a migração aborta e o servidor se recusa a subir. Nada de &ldquo;confia em mim&rdquo;.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260902131952_screenshot-2026-09-02_13-16-17.png" alt="Diálogo do ai-memory 2.0 avisando que a memória foi migrada para o formato OKF v0.2, com o caminho do backup verificado e os passos de rollback"  loading="lazy" /></p>
<p>Esse é o aviso que aparece uma vez, depois da migração: ele diz onde ficou o backup, o tamanho do arquivo e como voltar atrás se algo parecer errado. Quando você confirma que está tudo certo, é só apagar o backup e o lembrete some.</p>
<h2>OKF: sua memória não fica presa no ai-memory<span class="hx:absolute hx:-mt-20" id="okf-sua-memória-não-fica-presa-no-ai-memory"></span>
    <a href="#okf-sua-mem%c3%b3ria-n%c3%a3o-fica-presa-no-ai-memory" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Essa é a mudança que mais me deixou satisfeito.</p>
<p>A partir da 2.0 a wiki do ai-memory é, nativamente, um bundle no <strong>Open Knowledge Format</strong>, o formato aberto que o Google publicou em 2026. Cada página de memória é um arquivo OKF válido: Markdown comum com metadados padronizados. Não existe passo de exportação que gera uma cópia divergente. Os arquivos da wiki já são os arquivos OKF.</p>
<p>Na prática isso quer dizer que sua memória deixou de ser refém do meu projeto. Você pode ler tudo com <code>grep</code>, abrir no Obsidian, versionar no Git ou entregar o bundle pra um colega que usa outra ferramenta compatível com OKF. Tem até um <code>ai-memory export-okf</code> pra empacotar um projeto inteiro num tarball validado.</p>
<p>Sempre foi essa a tese: modelo e harness são alugados, a memória do projeto é sua. Agora o formato reforça isso por escrito.</p>
<h2>Embeddings locais, ligados por padrão<span class="hx:absolute hx:-mt-20" id="embeddings-locais-ligados-por-padrão"></span>
    <a href="#embeddings-locais-ligados-por-padr%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Até a 1.x, busca semântica de verdade dependia de você configurar um provider de embeddings. Ou pagava uma API e mandava cada página e cada query pra fora, ou subia um Ollama do lado. As duas opções têm custo.</p>
<p>A 2.0 traz um provider <code>local</code> que roda o modelo de embeddings dentro do próprio processo, em Rust puro, com o <code>all-MiniLM-L6-v2</code>. Sem chave de API, sem servidor externo, sem GPU e sem mandar seus dados pra lugar nenhum. E agora vem ligado por padrão. Na primeira execução ele baixa o modelo (uns 87 MB, com checksum fixo) em background e liga a busca híbrida no próximo restart.</p>
<p>O ganho é mensurável. No benchmark LongMemEval-S, o hit@5 sobe de 0.617 só com full-text para 0.779 com os embeddings locais. Se por algum motivo você não quiser, um <code>embedding_provider = &quot;none&quot;</code> desliga.</p>
<p>Detalhe que importa: escolhi <code>candle</code> de propósito, em vez do runtime nativo que a concorrência usa. Foi justamente essa camada nativa que gerou um tipo de crash recorrente em outros projetos de memória. Preferi não herdar o problema.</p>
<h2>Vários agentes ao mesmo tempo, no mesmo projeto<span class="hx:absolute hx:-mt-20" id="vários-agentes-ao-mesmo-tempo-no-mesmo-projeto"></span>
    <a href="#v%c3%a1rios-agentes-ao-mesmo-tempo-no-mesmo-projeto" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui começa a parte que motivou boa parte do trabalho antes da 2.0.</p>
<p>O caso do <code>ai-memory run</code> que mostrei em julho era sequencial: fecho o Claude, abro o Codex, continuo. Mas e quando eu deixo dois ou três harnesses abertos ao mesmo tempo no mesmo projeto? Claude numa aba, Codex noutra, OpenCode numa terceira.</p>
<p>O ai-memory trata isso sem ninguém pisar no pé do outro. Cada chamada de memória descobre sozinha a qual projeto pertence, a partir do diretório da sessão. O ponteiro de &ldquo;projeto atual&rdquo; agora é por ator, então dois harnesses no mesmo checkout mantêm cada um a sua noção de contexto. E a identidade do projeto vem do nome do checkout. O caminho absoluto no disco não pesa, então o mesmo projeto no laptop e no desktop cai no mesmo lugar.</p>
<p>Quando duas janelas gravam na mesma página, a segunda não apaga a primeira. Ela cria uma versão nova que passa a ser a mais recente, e a anterior continua alcançável na cadeia de versões. Regravar algo idêntico não gera versão nova. Todas as escritas passam por um único writer, com fila e backpressure, então uma rajada não corrompe nada.</p>
<p>Isso não é teoria. Tem teste de aceitação chamando Claude, Codex, OpenCode, Pi, Crush e mais alguns de verdade, dentro de uma mesma workstream, cobrindo lease, adoção de sessão e entrega de contexto entre harnesses.</p>
<h2>Um time inteiro no mesmo projeto<span class="hx:absolute hx:-mt-20" id="um-time-inteiro-no-mesmo-projeto"></span>
    <a href="#um-time-inteiro-no-mesmo-projeto" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O segundo cenário é o que dá título ao post. Aqui já são várias pessoas, um time inteiro apontando os agentes pro mesmo servidor.</p>
<p>A forma de rodar é simples. Alguém sobe um servidor, normalmente um container num homelab ou numa máquina da rede, e cada pessoa aponta os agentes dela pra aquela URL. HTTPS entra na frente com um proxy reverso, se você quiser. O banco continua sendo um SQLite só.</p>
<p>Todo mundo enxerga as mesmas páginas do projeto. O que uma pessoa aprendeu numa sessão, o agente da outra recupera. E cada sessão nova recebe um briefing com o estado do projeto logo no início. Vou ser honesto com o termo &ldquo;tempo real&rdquo;. O que existe é um store central compartilhado, com leitura imediata, mais o briefing na abertura. A nota que um colega gravou aparece na hora pra próxima consulta ou próxima sessão de qualquer um. Uma sessão que já está rodando só recebe a novidade na consulta seguinte ou na próxima abertura, sem interrupção no meio.</p>
<p>O que muda no modo multiusuário é a atribuição. Cada escrita registra quem fez. Existe log de auditoria e a interface mostra &ldquo;editado por fulano&rdquo;. Isso já vem no pacote, de graça. E não existe permissão por página, de propósito. A atribuição serve pra registrar autoria; qualquer pessoa autenticada pode escrever, e o histórico é que guarda quem foi.</p>
<p>Tem uma distinção de segurança importante entre o que é compartilhado e o que é pessoal. As páginas são de todos. Mas o handoff é um bastão de um dono só: exatamente uma sessão pega, e um segundo <code>accept</code> não rouba o bastão de ninguém. O handoff que você deixou pendente não é entregue nem consumido por um colega. Do mesmo jeito, os &ldquo;slots&rdquo; de &ldquo;no que estou trabalhando agora&rdquo; são por pessoa, então o seu contexto pessoal não vaza no briefing do time inteiro.</p>
<p>Também existe uma bateria de testes de concorrência real cobrindo esses casos: escrita simultânea, isolamento por ator sob carga, o bastão do handoff que não é roubado e os slots pessoais que não vazam.</p>
<h2>Onde o ai-memory fica frente à concorrência<span class="hx:absolute hx:-mt-20" id="onde-o-ai-memory-fica-frente-à-concorrência"></span>
    <a href="#onde-o-ai-memory-fica-frente-%c3%a0-concorr%c3%aancia" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes da 2.0 fizemos outra rodada de pesquisa sobre o cenário de 2026, documentada no repositório. Ela foi a base pra decidir o que a 2.0 precisava cobrir. Vou resumir o campo.</p>
<p>Tem o <strong>agentmemory</strong>, que é um MCP server em TypeScript preso a um sidecar nativo e a uma superfície gigante de dezenas de ferramentas. Tem o <strong>basic-memory</strong>, em Python, Markdown no disco, mas com captura manual: você tem que pedir pra ele lembrar. Tem o <strong>cognee</strong>, que junta grafo, vetor e relacional num pipeline pesado que pede vários gigas de RAM. Tem o <strong>MemPalace</strong>, que viralizou com quase 50 mil estrelas em duas semanas por causa de um número de benchmark que, auditado, se mostrou inflado, além de sofrer de corrupção quando duas escritas acontecem juntas. E tem os grafos temporais como <strong>Zep</strong>, os &ldquo;memory OS&rdquo; como <strong>Letta</strong> (o antigo MemGPT) e os extratores de fato como o <strong>Mem0</strong>.</p>
<p>Tem ainda a memória nativa que o próprio Claude Code passou a ligar por padrão. Essa eu trato como o funil que apresenta a categoria pras pessoas. Como concorrente ela fica limitada: presa a uma máquina, presa a um agente, sem busca de verdade e sem história de time.</p>
<p>A 2.0 fecha as lacunas que a pesquisa apontou. Passamos a publicar benchmark reproduzível com o LongMemEval, rodando o servidor de verdade. Ganhamos o formato aberto OKF. Ganhamos ligações tipadas entre páginas, com <code>causes</code>, <code>fixes</code> e <code>contradicts</code>, que ainda alimentam uma checagem de contradição sem gastar LLM. Ganhamos consulta com <code>as_of</code>, pra perguntar o que a gente sabia sobre um assunto numa certa data. Ganhamos os embeddings locais. E ganhamos uma passada opcional de &ldquo;experiência&rdquo; que revê várias sessões pra achar padrões que só aparecem no conjunto.</p>
<p>Agora a parte que interessa pra quem vai escolher. O que o ai-memory tem que os outros não têm, tudo junto:</p>
<ul>
<li><strong>Ele te acompanha entre agentes.</strong> Mais de vinte harnesses alimentam uma memória só, e o handoff aqui é um protocolo de verdade: tipado, com dono e reivindicado uma vez só.</li>
<li><strong>Ele te acompanha entre máquinas.</strong> A memória vive num servidor que é seu. O projeto que você largou no desktop é o que você retoma no laptop.</li>
<li><strong>Ele funciona pra time.</strong> Autenticação multiusuário, atribuição por pessoa e log de auditoria já vêm no pacote, de graça.</li>
<li><strong>Sua memória é Markdown puro.</strong> A fonte da verdade é uma wiki versionada no Git. O banco é um índice derivado que dá pra reconstruir a qualquer momento a partir dos arquivos, sem vector store pra ficar de babá e sem nada preso num blob binário.</li>
<li><strong>Ele captura o trabalho sozinho e em silêncio.</strong> Sem cerimônia de &ldquo;lembra disso&rdquo;. E o caminho padrão roda com zero chamada de LLM.</li>
<li><strong>Ele é um binário só.</strong> Sem sidecar, sem três bancos pra sincronizar. Todas as escritas passam por um único writer, com um teto de escrita que a gente mediu de verdade, com teste real. Foi exatamente esse desenho que evitou a corrupção de escrita concorrente que derrubou os outros.</li>
</ul>
<p>Nenhum concorrente entrega esse conjunto. Alguns têm um ou outro pedaço. O ai-memory tem o pacote, e agora com paridade nos itens onde antes ficava atrás.</p>
<h2>A 2.0 é de todo mundo<span class="hx:absolute hx:-mt-20" id="a-20-é-de-todo-mundo"></span>
    <a href="#a-20-%c3%a9-de-todo-mundo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando escrevi o post de julho, quinze pessoas tinham PR mergeado no projeto. Hoje são cerca de setenta. Faz tempo que isso deixou de ser um programinha de fim de semana.</p>
<p>Os números até a 2.0: mais de 1.500 commits, <strong>371 pull requests mergeados</strong> e <strong>181 issues fechadas</strong>. Isso saiu de gente usando de verdade e mandando correção, funcionalidade e documentação.</p>
<p>Preciso agradecer em especial ao <a href="https://github.com/djalmajr"target="_blank" rel="noopener">Djalma Júnior</a>, que sozinho passou de 50 PRs mergeados, e ao <a href="https://github.com/samirhvbr"target="_blank" rel="noopener">Samir Hanna Verza</a>, com mais de 20. Logo atrás vêm <a href="https://github.com/lhzapata"target="_blank" rel="noopener">lhzapata</a>, <a href="https://github.com/pedrofjr"target="_blank" rel="noopener">pedrofjr</a>, <a href="https://github.com/mrpaiva"target="_blank" rel="noopener">mrpaiva</a>, <a href="https://github.com/lucasliet"target="_blank" rel="noopener">lucasliet</a>, <a href="https://github.com/lihuiyang1024"target="_blank" rel="noopener">lihuiyang1024</a>, <a href="https://github.com/Murillofilho86"target="_blank" rel="noopener">Murillofilho86</a> e <a href="https://github.com/matheus-rodrigues00"target="_blank" rel="noopener">Matheus Rodrigues</a>. E tem uma cauda longa de dezenas de outras pessoas com PR mergeado que seria injusto tentar listar inteira aqui.</p>
<p>Se você quer entrar nessa, o <a href="https://github.com/akitaonrails/ai-memory/blob/main/CONTRIBUTING.md"target="_blank" rel="noopener">guia de contribuição</a> foi reescrito pra deixar tudo claro: como configurar o ambiente, os gates que o CI cobra, a regra do CHANGELOG e a política de versionamento. Bug fix costuma sair rápido no próximo patch. Funcionalidade pequena, como um novo harness ou provider, entra no próximo minor. Tem issue marcada pra quem está começando.</p>
<h2>Como pegar a 2.0<span class="hx:absolute hx:-mt-20" id="como-pegar-a-20"></span>
    <a href="#como-pegar-a-20" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A página do projeto tem todos os métodos de instalação, incluindo AUR, Homebrew e binários de release:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory no GitHub</a></li>
<li><a href="https://github.com/akitaonrails/ai-memory/releases/tag/v2.0.0"target="_blank" rel="noopener">Notas da release v2.0.0</a></li>
</ul>
<p>Depois de atualizar, na primeira execução deixe a migração fazer o backup e converter sua wiki pro formato OKF. Se você usa o modo gerenciado, reinstale os hooks dos harnesses que pretende usar.</p>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A 1.x provou que a ideia funcionava. A 2.0 é a versão que eu recomendaria sem asterisco pra outra pessoa botar num time.</p>
<p>O formato é aberto, então sua memória não fica presa. A busca semântica roda local, então você não paga nem vaza. Vários agentes e várias pessoas trabalham no mesmo projeto sem se atropelar. E o desenho de um binário só, com um writer só, é o que evita justamente os problemas que afundaram metade da concorrência.</p>
<p>LLM e assinatura eu continuo alugando de quem estiver melhor no mês. A memória do projeto fica comigo, com o time, e agora num formato que ninguém tira de mim.</p>
]]></content:encoded><category>ai-memory</category><category>agentes-de-codigo</category><category>open-source</category></item><item><title>Removendo DRM de ebooks de Kindle em 2026</title><link>https://akitaonrails.github.io/2026/07/30/removendo-drm-de-ebooks-de-kindle-em-2026/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/07/30/removendo-drm-de-ebooks-de-kindle-em-2026/</guid><pubDate>Thu, 30 Jul 2026 18:00:00 -0300</pubDate><description>&lt;p&gt;Sou cliente da Amazon há tempo demais. Compro livros no Kindle há muitos anos, tenho vários aparelhos e continuo achando péssima a maneira como a empresa trata conteúdo digital.&lt;/p&gt;
&lt;p&gt;Você paga pelo livro, mas só consegue ler onde a Amazon deixa. Não existe um aplicativo nativo decente pra Linux. Mudar pra outro leitor vira um exercício de arqueologia. Comprei um Xteink X4 novo e, claro, minha biblioteca não podia simplesmente ir junto. O arquivo estava &amp;ldquo;na minha conta&amp;rdquo;, mas não estava sob meu controle.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Sou cliente da Amazon há tempo demais. Compro livros no Kindle há muitos anos, tenho vários aparelhos e continuo achando péssima a maneira como a empresa trata conteúdo digital.</p>
<p>Você paga pelo livro, mas só consegue ler onde a Amazon deixa. Não existe um aplicativo nativo decente pra Linux. Mudar pra outro leitor vira um exercício de arqueologia. Comprei um Xteink X4 novo e, claro, minha biblioteca não podia simplesmente ir junto. O arquivo estava &ldquo;na minha conta&rdquo;, mas não estava sob meu controle.</p>
<p>Durante anos, eu contornei isso pelo caminho oficial. Entrava no site da Amazon, usava <strong>Download &amp; Transfer via USB</strong>, baixava o <code>.azw</code> dos livros que comprei e importava tudo no <a href="https://calibre-ebook.com/about"target="_blank" rel="noopener">calibre</a>. Com o plugin DeDRM configurado pro serial do meu Kindle, convertia pra EPUB e pronto.</p>
<p>Em <strong>26 de fevereiro de 2025</strong>, a Amazon <a href="https://www.vice.com/en/article/amazon-is-killing-your-ability-to-download-kindle-books-next-week/"target="_blank" rel="noopener">desativou essa opção</a>. Sem anúncio decente, sem substituto que entregasse o arquivo e sem qualquer preocupação com quem queria manter um backup local. Desde então, meus livros mais novos ficaram presos no ecossistema deles. Voltei a tentar no ano passado, atualizei plugin, copiei arquivos do meu Kindle Paperwhite, coloquei o serial correto e nada.</p>
<p>Pra ser justo, em <strong>20 de janeiro de 2026</strong> a Amazon passou a permitir que compradores verificados baixem EPUB ou PDF quando o publisher <a href="https://kdp.amazon.com/pt_BR/help/topic/GDDXGH9VR22ACM8U"target="_blank" rel="noopener">confirma o livro como DRM-free</a>. Ótimo. Só não resolve os livros protegidos, e a decisão continua nas mãos da editora. Títulos antigos sem DRM também precisam ser confirmados individualmente pelo publisher. Minha biblioteca não ganhou botão de download por causa disso.</p>
<p>Resolvi tentar de novo agora. A versão nova do DeDRM conseguiu lidar com o DRM atual, mas o processo mudou bastante. Dá trabalho, precisa de Windows numa das etapas e envolve uma ferramenta comunitária em pre-release. Funcionou. Recuperei <strong>106 livros comprados</strong>, testei a conversão pra EPUB e agora posso ler no aparelho que eu quiser.</p>
<p>Este é o estado do jogo em <strong>30 de julho de 2026</strong> (atualizado em 19 de agosto). A Amazon pode mudar a criptografia ou o aplicativo amanhã. Não conte com tutorial antigo dizendo pra instalar Kindle for PC 1.17, desabilitar update e colocar o serial do aparelho no Calibre. Esse mundo já acabou.</p>
<p>E o óbvio precisa ser dito: estou falando dos livros que <strong>eu comprei</strong>. Não estou falando de baixar Kindle Unlimited, empréstimo de biblioteca ou livro dos outros. Leis sobre circumvention de DRM variam por país. Pesquise a legislação de onde mora e assuma responsabilidade pelo que faz.</p>
<h2>Antes de tudo: não jogue Kindle velho fora<span class="hx:absolute hx:-mt-20" id="antes-de-tudo-não-jogue-kindle-velho-fora"></span>
    <a href="#antes-de-tudo-n%c3%a3o-jogue-kindle-velho-fora" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Amazon também não facilita reaproveitar Kindle antigo. O hardware continua bom, a bateria costuma ser substituível, a tela de e-ink dura uma eternidade, mas o software vai ficando cada vez mais fechado e limitado.</p>
<p>Pra quem quer ressuscitar esses aparelhos, recomendo o canal <a href="https://www.youtube.com/@DammitJeff"target="_blank" rel="noopener">Dammit Jeff</a>. Ele acompanha jailbreaks, KOReader, lojas alternativas e formas de manter Kindles úteis depois que a Amazon perde o interesse. Este vídeo sobre o <a href="https://www.youtube.com/watch?v=l4ZliC82RtA"target="_blank" rel="noopener">AdBreak e os jailbreaks recentes</a> é um bom começo. Leia também o <a href="https://kindlemodding.org/"target="_blank" rel="noopener">guia atualizado do Kindle Modding</a> antes de fazer qualquer coisa, porque firmware e método compatível mudam o tempo todo.</p>
<p>Jailbreak do aparelho e remoção de DRM do ebook são problemas diferentes. Você não precisa desbloquear o Kindle pra seguir o resto deste artigo. Estou mencionando porque ambos partem da mesma ideia: hardware e mídia que já pagamos deveriam continuar úteis sem pedir bênção eterna ao fabricante.</p>
<h2>Crash course: AZW, EPUB e KFX<span class="hx:absolute hx:-mt-20" id="crash-course-azw-epub-e-kfx"></span>
    <a href="#crash-course-azw-epub-e-kfx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>DRM e formato de arquivo não são a mesma coisa. O formato diz como texto, imagens, fontes, índice e metadados são empacotados. DRM adiciona uma trava criptográfica por cima e decide qual conta, aplicativo ou aparelho consegue abrir aquilo.</p>
<p>Os três nomes que importam aqui são:</p>
<table>
  <thead>
      <tr>
          <th>Formato</th>
          <th>O que é</th>
          <th>Na prática</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>AZW / AZW3</strong></td>
          <td>Família mais antiga de formatos proprietários do Kindle. AZW3 também é conhecido como Kindle Format 8.</td>
          <td>Era o que normalmente vinha pelo antigo download via USB. Ferramentas e leitores alternativos entendem bem depois de remover o DRM.</td>
      </tr>
      <tr>
          <td><strong>EPUB</strong></td>
          <td>Padrão aberto da W3C. É um pacote único com conteúdo baseado em HTML, CSS, SVG, fontes e metadados.</td>
          <td>É o formato mais portátil pra guardar e ler fora do ecossistema Amazon. É o destino que quero.</td>
      </tr>
      <tr>
          <td><strong>KFX</strong></td>
          <td>Formato moderno de entrega da Amazon, usado pra recursos como Enhanced Typesetting e Page Flip. Um livro comprado pode vir dividido entre vários containers, recursos auxiliares e um voucher de DRM.</td>
          <td>É o que o aplicativo Kindle atual baixa. Precisamos reunir as partes, remover o DRM e só depois converter.</td>
      </tr>
  </tbody>
</table>
<p>A extensão sozinha pode enganar. Parte de um livro KFX pode aparecer como <code>.azw</code>, <code>.azw.res</code>, <code>.voucher</code> e outras variações. O plugin <a href="https://www.mobileread.com/forums/showthread.php?t=291290"target="_blank" rel="noopener">KFX Input</a> existe justamente pra entender esse conjunto.</p>
<p>O EPUB é bem menos misterioso. A <a href="https://www.w3.org/TR/epub-33/"target="_blank" rel="noopener">especificação EPUB 3.3</a> o define como um container de arquivo único pra conteúdo Web estruturado. É basicamente um pequeno site empacotado. Qualquer leitor minimamente decente consegue implementar suporte sem depender de uma chave secreta da Amazon.</p>
<h2>Calibre e os dois plugins<span class="hx:absolute hx:-mt-20" id="calibre-e-os-dois-plugins"></span>
    <a href="#calibre-e-os-dois-plugins" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><a href="https://calibre-ebook.com/"target="_blank" rel="noopener">calibre</a> é o canivete suíço de ebooks. É software livre, roda em Linux, macOS e Windows, organiza biblioteca, baixa metadados, edita capas, transfere livros e converte dezenas de formatos. Existe desde 2006 e nasceu justamente porque o primeiro Sony Reader não funcionava direito no Linux.</p>
<p>No Omarchy ou qualquer Arch, basta instalar o pacote:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S calibre</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Em outras distribuições, veja o <a href="https://calibre-ebook.com/download"target="_blank" rel="noopener">download oficial</a>. Não invente de instalar um pacote aleatório de site de downloads.</p>
<p>Uma pegadinha específica de ambientes com <code>mise</code>: se o Calibre morrer com <code>ModuleNotFoundError: msgpack</code> ou <code>BrokenPipeError</code>, provavelmente um shim de Python entrou antes de <code>/usr/bin</code>. O pacote do Arch precisa do Python do sistema. Inicie assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">env <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;/usr/bin:</span><span class="nv">$PATH</span><span class="s2">&#34;</span> /usr/bin/python3 /usr/bin/calibre</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso não tem relação com DRM nem com os plugins. É só o helper do Calibre chamando o Python errado. No meu desktop deixei um launcher permanente com esse <code>PATH</code>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/30/kindle-dedrm/calibre-library-epub.webp" alt="Minha biblioteca no Calibre, com um livro já convertido e disponível em AZW3 e EPUB."  loading="lazy" /></p>
<p>O Calibre sozinho não remove DRM. Precisamos de dois plugins:</p>
<ol>
<li><strong>DeDRM</strong> reconhece e remove as travas de vários ecossistemas durante a importação. Ele só roda quando o livro entra na biblioteca. Clicar em Convert depois não remove nada.</li>
<li><strong>KFX Input</strong> entende os containers modernos da Amazon, reúne as partes de um livro e permite converter o resultado pra EPUB.</li>
</ol>
<p>No momento deste artigo, estou usando <strong>DeDRM 10.0.28</strong>, publicado em 14 de julho no <a href="https://github.com/Satsuoni/DeDRM_tools/releases/tag/v10.0.28"target="_blank" rel="noopener">fork mantido por Satsuoni</a>. É um pre-release. Baixe o asset chamado <code>DeDRM_tools.zip</code>, nunca um executável solto de algum mirror obscuro.</p>
<p><strong>Atualização (agosto de 2026):</strong> o aplicativo do Kindle na Microsoft Store não para quieto, e cada versão nova dele exige uma versão nova da ferramenta. Desde a publicação deste artigo, o app saiu da 1.0.18632: a <a href="https://github.com/Satsuoni/DeDRM_tools/releases/tag/v10.0.29"target="_blank" rel="noopener">10.0.29</a> adicionou suporte ao app 1.22326 e a <a href="https://github.com/Satsuoni/DeDRM_tools/releases/tag/v10.0.30"target="_blank" rel="noopener">10.0.30</a> suporta o app 1.0.22920. A regra prática é uma só: o nome do executável carrega a versão do app que ele entende (<code>MSIXKFXArchiverMobi1_22920.exe</code> pra Store app 1.0.22920, e assim por diante). Antes de começar, confira sempre a <a href="https://github.com/Satsuoni/DeDRM_tools/releases"target="_blank" rel="noopener">página de releases do fork do Satsuoni</a> e baixe o pre-release <strong>mais novo</strong>. Todo o resto do processo descrito aqui continua igual.</p>
<p>Eu descompactei tudo numa pasta que depois fica compartilhada com a VM Windows:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/Windows/Kindle-DeDRM/v10.0.28
</span></span><span class="line"><span class="cl">unzip ~/Downloads/DeDRM_tools.zip -d ~/Windows/Kindle-DeDRM/v10.0.28</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O SHA-256 do <code>DeDRM_tools.zip</code> que usei foi:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">520cce704edf9ae26e43196efe2871daf9b25d6cb489aa56051626801c362947</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Confira com <code>sha256sum</code>. Isso não transforma um binário comunitário em software magicamente seguro, mas pelo menos garante que está usando o mesmo arquivo que eu testei.</p>
<p>Dentro da pasta existe <code>DeDRM_plugin.zip</code>. <strong>Não descompacte esse segundo ZIP.</strong> No Calibre, abra <strong>Preferences → Plugins → Load plugin from file</strong>, escolha <code>DeDRM_plugin.zip</code>, aceite o aviso e reinicie o programa.</p>
<p>Depois volte em <strong>Preferences → Plugins → Get new plugins</strong>, procure por <strong>KFX Input</strong> e instale. Meu teste usou a versão <strong>2.33.0</strong>. Reinicie de novo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/30/kindle-dedrm/calibre-plugins-dedrm-kfx.webp" alt="Calibre 9.11 com DeDRM 10.0.28 e KFX Input 2.33.0 instalados."  loading="lazy" /></p>
<h2>Por que copiar do Kindle pelo USB não resolveu<span class="hx:absolute hx:-mt-20" id="por-que-copiar-do-kindle-pelo-usb-não-resolveu"></span>
    <a href="#por-que-copiar-do-kindle-pelo-usb-n%c3%a3o-resolveu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O caminho mais simples ainda seria ligar meu Kindle Paperwhite novo no cabo, copiar o livro e configurar o serial do aparelho no DeDRM. Foi o primeiro teste que fiz.</p>
<p>O arquivo entrou como <code>KFX-ZIP</code>, o plugin rodou, mas continuou criptografado. Abri o Calibre em debug e o log mostrou que esse livro usava a estratégia <code>ACCOUNT_SECRET</code>. O serial estava certo. O problema é que a chave necessária não vinha mais apenas do aparelho.</p>
<p>É por isso que muita gente segue tutorial antigo, tenta cinco serial numbers diferentes e conclui que o DeDRM está quebrado. Pra livros novos com esse DRM, precisamos do segredo que o aplicativo Kindle atual guarda no Windows. E esse segredo é protegido pelas APIs do TPM.</p>
<h2>Um Windows descartável dentro do Omarchy<span class="hx:absolute hx:-mt-20" id="um-windows-descartável-dentro-do-omarchy"></span>
    <a href="#um-windows-descart%c3%a1vel-dentro-do-omarchy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu não vou manter dual boot só pra baixar ebook. Também não vou fingir que Wine roda tudo. Felizmente, o Omarchy <a href="https://learn.omacom.io/books/2/pages/100"target="_blank" rel="noopener">já vem preparado pra instalar e abrir uma VM Windows</a>: ela aparece no próprio menu do sistema, abre por RDP e compartilha <code>~/Windows</code> automaticamente com o guest. Não precisei montar essa integração do zero.</p>
<p>Por baixo, ele usa o <a href="https://github.com/dockur/windows"target="_blank" rel="noopener">dockur/windows</a>. O dockur empacota QEMU/KVM num container e automatiza a instalação do Windows. Continua sendo uma máquina virtual de verdade, com disco e kernel próprios. O container só organiza a distribuição, configuração e ciclo de vida.</p>
<p>Pra instalar pelo terminal, rode:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">omarchy-windows-vm install</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Escolha RAM, CPUs e tamanho do disco. O instalador cria <code>~/.config/windows/docker-compose.yml</code>, guarda o disco virtual em <code>~/.windows</code> e compartilha <code>~/Windows</code> com o guest. Dentro do Windows, essa pasta aparece como <strong>Shared</strong>, normalmente em <code>Z:</code>, e também fica acessível por <code>\\host.lan\Data</code>.</p>
<p>O detalhe que fez diferença no meu caso foi habilitar <strong>TPM 2.0</strong>. Edite o Compose gerado e acrescente <code>TPM: &quot;Y&quot;</code> no bloco <code>environment</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">windows</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">dockurr/windows</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">VERSION</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;11&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">TPM</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Y&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Depois recrie o container. O disco do Windows continua no volume persistente:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">omarchy-windows-vm stop
</span></span><span class="line"><span class="cl">omarchy-windows-vm launch -k</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O <code>-k</code> deixa a VM ligada quando você fechar o RDP. Também dá pra acompanhar pelo navegador em <code>http://127.0.0.1:8006</code>.</p>
<!-- Screenshot pendente: Windows 11 do dockur aberto pelo Omarchy. -->
<h2>Baixando os livros pelo aplicativo certo<span class="hx:absolute hx:-mt-20" id="baixando-os-livros-pelo-aplicativo-certo"></span>
    <a href="#baixando-os-livros-pelo-aplicativo-certo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Dentro do Windows, abra a Microsoft Store e instale <strong><a href="https://apps.microsoft.com/detail/9p8jq0jjstll"target="_blank" rel="noopener">Amazon Kindle: Reading App</a></strong>, produto <code>9P8JQ0JJSTLL</code>.</p>
<p>Preste atenção aqui. O instalador antigo de Kindle for PC encontrado em blogs não é o mesmo aplicativo. A ferramenta que usei procura o pacote <code>AMZNKindle.AmazonKindleReadingApp</code> da Microsoft Store. Com o programa legado, ela simplesmente responde <code>No AmazonKindleReadingApp installation found</code>.</p>
<p>Entre na sua conta e mande baixar localmente cada livro que quer preservar. Abrir a capa ou ver o título na biblioteca não basta. O conteúdo precisa estar disponível offline dentro do app.</p>
<p>Infelizmente, a parte mais chata continua manual. A Amazon sabe colocar botão de compra com um clique, mas não achou espaço pra um &ldquo;baixe tudo que eu já paguei&rdquo;.</p>
<p>Eu fiz isso em 106 livros. Sim, foi um saco.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/30/kindle-dedrm/kindle-store-library.webp" alt="Aplicativo Kindle da Microsoft Store com os ebooks baixados na biblioteca local."  loading="lazy" /></p>
<h2>Gerando os KFX-ZIP e a chave K4I<span class="hx:absolute hx:-mt-20" id="gerando-os-kfx-zip-e-a-chave-k4i"></span>
    <a href="#gerando-os-kfx-zip-e-a-chave-k4i" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <code>DeDRM_tools.zip</code> que descompactamos no Linux já está visível no Windows por causa da pasta compartilhada. Abra PowerShell e entre nela:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">cd </span><span class="p">\\</span><span class="n">host</span><span class="p">.</span><span class="n">lan</span><span class="p">\</span><span class="n">Data</span><span class="p">\</span><span class="nb">Kindle-DeDRM</span><span class="p">\</span><span class="n">v10</span><span class="p">.</span><span class="py">0</span><span class="p">.</span><span class="py">28</span>
</span></span><span class="line"><span class="cl"><span class="p">.\</span><span class="n">MSIXKFXArchiverMobi1_18632</span><span class="p">.</span><span class="n">exe</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O banner ainda pode mencionar uma build antiga <code>1.0.15230</code>. O executável versionado acima procura a Store app <code>1.0.18632</code> e foi o que funcionou comigo. O número no nome do arquivo precisa bater com a versão do <strong>seu</strong> app: se a Store já te entregou uma versão mais nova, baixe a release correspondente na página do projeto (veja a atualização na seção dos plugins).</p>
<p>Esse executável localiza o cache da versão atual da Microsoft Store, reúne os componentes de cada livro e gera duas coisas:</p>
<ul>
<li><code>archived_kfx/</code>, com um <code>.kfx-zip</code> pra cada ebook baixado;</li>
<li><code>oldbooks.k4i</code>, o keyfile que o DeDRM precisa pra abrir aqueles arquivos.</li>
</ul>
<p>Na minha máquina, o processo encontrou e arquivou <strong>106 livros</strong>. O SHA-256 do executável que rodei foi:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">0c78b45ccea2c36a5fbb01b9f66bdd9e5d5960a68a340ba2ee96e138f5cddf4a</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Ele é um binário de 32 bits. Se reclamar que falta <code>MSVCP140.dll</code>, instale o <a href="https://aka.ms/vc14/vc_redist.x86.exe"target="_blank" rel="noopener">Microsoft Visual C++ Redistributable x86 oficial</a>. Não procure DLL avulsa no Google. Esse é um ótimo jeito de transformar backup de livro em backup de malware.</p>
<p>O <code>oldbooks.k4i</code> é sensível. Ele deriva do segredo da sua conta naquela instalação do Kindle. Não publique, não mande em issue do GitHub, não tire screenshot do conteúdo e não coloque em repositório aberto.</p>
<!-- Screenshot pendente: PowerShell após o archiver gerar archived_kfx e oldbooks.k4i. -->
<h2>Configurando a chave no DeDRM<span class="hx:absolute hx:-mt-20" id="configurando-a-chave-no-dedrm"></span>
    <a href="#configurando-a-chave-no-dedrm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>De volta ao Linux, abra o Calibre e siga:</p>
<p><strong>Preferences → Plugins → DeDRM → Customize plugin → Kindle for Mac/PC ebooks → Import Existing Keyfiles</strong></p>
<p>Selecione:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Windows/Kindle-DeDRM/v10.0.28/oldbooks.k4i</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Use <strong>Import Existing Keyfiles</strong>. Não use o botão genérico <strong>Set Keyfile</strong> da tela principal. Ele grava outro tipo de candidato e não cadastra a chave K4I no lugar certo.</p>
<p>Feche a lista de chaves, clique em <strong>OK</strong> na configuração principal e reinicie o Calibre. Se fechar com Cancel, ele joga a alteração fora sem cerimônia.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/30/kindle-dedrm/calibre-dedrm-key.webp" alt="DeDRM com o keyfile oldbooks importado na lista de chaves do Kindle for Mac/PC."  loading="lazy" /></p>
<h2>Importando e convertendo pra EPUB<span class="hx:absolute hx:-mt-20" id="importando-e-convertendo-pra-epub"></span>
    <a href="#importando-e-convertendo-pra-epub" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes de despejar cem arquivos na biblioteca, teste um.</p>
<p>Escolha um <code>.kfx-zip</code> dentro de:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Windows/Kindle-DeDRM/v10.0.28/archived_kfx/</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Use <strong>Add books</strong> no Calibre. A ordem interna é esta:</p>
<ol>
<li>KFX Input reconhece o pacote;</li>
<li>DeDRM tenta as chaves K4I durante a importação;</li>
<li>KFX Input monta o livro descriptografado como KFX;</li>
<li>Calibre passa a conseguir abrir e converter o resultado.</li>
</ol>
<p>Se o formato continuar aparecendo como <code>KFX-ZIP</code>, deu errado. Não adianta apertar Convert dez vezes. Remova aquela entrada da biblioteca, corrija plugin ou chave e importe de novo. DeDRM só atua na <strong>entrada</strong>.</p>
<p>Quando o livro aparecer como <code>KFX</code>, abra no viewer e confira algumas páginas. Depois clique em <strong>Convert books</strong>, escolha <strong>EPUB</strong> como saída e teste o arquivo resultante no leitor onde pretende usar. Só depois disso faça a importação em lote.</p>
<p>No meu caso, o KFX abriu, converteu e o EPUB funcionou fora do Kindle. Com isso eu sabia que o caminho inteiro estava funcionando: Microsoft Store, TPM, archiver, K4I, DeDRM 10.0.28 e KFX Input 2.33.0.</p>
<!-- Screenshot pendente: livro importado como KFX no Calibre. -->
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/30/kindle-dedrm/calibre-convert-epub.webp" alt="Diálogo de conversão do Calibre com EPUB selecionado como formato de saída."  loading="lazy" /></p>
<!-- Screenshot pendente: EPUB final aberto no Xteink X4. -->
<h2>Faça backup do que realmente importa<span class="hx:absolute hx:-mt-20" id="faça-backup-do-que-realmente-importa"></span>
    <a href="#fa%c3%a7a-backup-do-que-realmente-importa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Depois da conversão, eu preservo três coisas:</p>
<ul>
<li>os EPUBs finais, que leio em qualquer aparelho;</li>
<li>os KFX-ZIP originais, até conferir que todos os EPUBs estão íntegros;</li>
<li>o <code>oldbooks.k4i</code>, criptografado e separado da biblioteca.</li>
</ul>
<p>Meu keyfile em texto puro fica com permissão <code>0600</code>. Também mantenho uma cópia criptografada com SOPS e age, enquanto a chave privada fica em outro backup. Não coloque <code>oldbooks.k4i</code> cru no Git só porque o repositório é privado. Repositório privado vaza também.</p>
<p>Os EPUBs entram na mesma estratégia que uso pros outros arquivos importantes: cópia local, NAS e backup off-site. Já expliquei essa paranoia em <a href="/2023/10/19/akitando-146-protegendo-e-recuperando-dados-perdidos-git-backup-btrfs/">Protegendo e Recuperando Dados Perdidos</a> e mostrei a mesma filosofia aplicada a filmes no meu <a href="/2024/04/03/meu-netflix-pessoal-com-docker-compose/">Netflix Pessoal</a>.</p>
<p>Não apague os arquivos do Kindle ou da VM no minuto em que a conversão termina. Abra os EPUBs, veja capa, índice, imagens, notas e algumas páginas. Backup que nunca foi testado é só torcida organizada.</p>
<h2>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Amazon já apagou livros remotamente, editoras atualizam capas e conteúdo, aplicativos antigos param de funcionar e formatos mudam. O próprio fim do download via USB mostrou que uma função disponível por dezoito anos pode desaparecer com uma linha num aviso.</p>
<p>O exemplo clássico continua inacreditável: em 2009 a Amazon apagou <code>1984</code> e <code>Animal Farm</code>, de George Orwell, dos Kindles de clientes. Depois vieram revisões de Roald Dahl, R.L. Stine e Agatha Christie empurradas pra cópias digitais que já tinham sido compradas. O <a href="https://www.vice.com/en/article/amazon-is-killing-your-ability-to-download-kindle-books-next-week/"target="_blank" rel="noopener">artigo da Vice</a> resume esses casos. O Dammit Jeff também bate muito nessa tecla: até a capa original que você escolheu pode virar pôster feio da adaptação do streaming porque publisher e loja decidiram atualizar sua &ldquo;compra&rdquo;.</p>
<p>Não importa se a alteração futura é censura, correção legítima, nova capa horrorosa de adaptação da Netflix ou apenas um bug. Eu comprei uma edição. Quero preservar a edição que comprei.</p>
<p>DRM não impede pirataria. Livro popular aparece em torrent no dia do lançamento. DRM só atrapalha o cliente que pagou, dificulta acessibilidade, prende hardware ainda bom e transforma uma compra em aluguel por prazo indefinido.</p>
<p>Calibre, DeDRM, KFX Input e uma VM descartável devolveram minha biblioteca. Agora posso colocar os EPUBs no Xteink, num Kobo, num tablet, no celular ou num leitor que ainda nem existe. Posso trocar de sistema operacional e posso desligar a internet. Os arquivos continuam comigo.</p>
<p>Se não está na sua máquina, não é seu.</p>
]]></content:encoded><category>armazenamento-e-backup</category><category>linux</category><category>open-source</category></item><item><title>Usando IA pra resolver meus probleminhas do dia-a-dia</title><link>https://akitaonrails.github.io/2026/07/12/usando-ia-pra-resolver-meus-probleminhas-do-dia-a-dia/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/07/12/usando-ia-pra-resolver-meus-probleminhas-do-dia-a-dia/</guid><pubDate>Sun, 12 Jul 2026 11:00:00 -0300</pubDate><description>&lt;p&gt;Eu não ia escrever artigo pra cada projetinho open source que eu faço. A maioria resolve um probleminha muito específico do MEU dia-a-dia, e artigo dedicado ficaria desproporcional. Só que os projetinhos foram acumulando, e olhando pra trás percebi que já são vários que nunca apareceram por aqui. Então resolvi fazer diferente: um artigo só, mencionando a maioria de uma vez.&lt;/p&gt;
&lt;p&gt;O padrão se repete em todos: eu esbarro numa pequena fricção do cotidiano, daquelas que a gente normalmente engole porque consertar custaria um fim de semana inteiro, e em vez de engolir eu abro um agente de IA e resolvo. O custo de transformar irritação em ferramenta despencou tanto que o cálculo inverteu. Hoje vale a pena consertar quase tudo.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Eu não ia escrever artigo pra cada projetinho open source que eu faço. A maioria resolve um probleminha muito específico do MEU dia-a-dia, e artigo dedicado ficaria desproporcional. Só que os projetinhos foram acumulando, e olhando pra trás percebi que já são vários que nunca apareceram por aqui. Então resolvi fazer diferente: um artigo só, mencionando a maioria de uma vez.</p>
<p>O padrão se repete em todos: eu esbarro numa pequena fricção do cotidiano, daquelas que a gente normalmente engole porque consertar custaria um fim de semana inteiro, e em vez de engolir eu abro um agente de IA e resolvo. O custo de transformar irritação em ferramenta despencou tanto que o cálculo inverteu. Hoje vale a pena consertar quase tudo.</p>
<p>Tudo que aparece abaixo está no <a href="https://github.com/akitaonrails"target="_blank" rel="noopener">meu GitHub</a>, com binários, releases e instruções de instalação.</p>
<p>Nesse post: <a href="#clock-tui-um-rel%c3%b3gio-de-mesa-que-virou-painel">clock-tui</a> (com os widgets <a href="#clock-tui-um-rel%c3%b3gio-de-mesa-que-virou-painel">google-calendar-tui</a> e <a href="#clock-tui-um-rel%c3%b3gio-de-mesa-que-virou-painel">ghpending</a>), <a href="#github-visualize-in%c3%batil-mas-bonito">github-visualize</a>, <a href="#frank-geary-email-do-jeito-que-eu-queria">frank_geary</a>, <a href="#mang%c3%a1-em-japon%c3%aas-frankyomik-frank-manga-e-frank-scanlation">frank_scanlation</a>, <a href="#frank-lyrics-decorando-m%c3%basica-linha-por-linha">frank_lyrics</a>, <a href="#frank-type-treino-de-digita%c3%a7%c3%a3o-com-prosa-de-verdade">frank_type</a>, <a href="#distrobox-gaming-uma-biblioteca-de-como-instalar-jogos-no-linux">distrobox-gaming</a> e <a href="#aitrepreneur-docker-comfyui-sem-sujar-o-sistema">aitrepreneur-docker</a>.</p>
<h2>clock-tui: um relógio de mesa que virou painel<span class="hx:absolute hx:-mt-20" id="clock-tui-um-relógio-de-mesa-que-virou-painel"></span>
    <a href="#clock-tui-um-rel%c3%b3gio-de-mesa-que-virou-painel" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O caso de uso é simples: eu tenho um monitor secundário vertical, e queria algo mais útil ali do que um wallpaper, alguma coisa que eu pudesse só bater o olho e ter informação relevante. Mas tudo começou porque eu só queria um relógio de mesa. Achei um programinha open source antigo de relógio em terminal, o clock-tui original, que estava parado havia tempos, e decidi fazer um fork e continuar o trabalho: o <a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">clock-tui</a>.</p>
<p>Deixei ele mais bonito, modernizei as dependências de Rust, e a mudança mais importante: adicionei suporte a <strong>widgets de comando</strong>. O relógio fica no topo e embaixo entram painéis que rodam qualquer comando que imprima texto, cada um com refresh independente. Dois widgets que eu mesmo criei pra ele:</p>
<ul>
<li><a href="https://github.com/akitaonrails/google-calendar-tui"target="_blank" rel="noopener">google-calendar-tui</a>: uma agenda read-only do Google Calendar no terminal, usando as contas que já estão no GNOME Online Accounts (zero configuração de OAuth). Bato o olho e sei meus compromissos do dia.</li>
<li><a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>: lista issues e pull requests abertos em todos os repositórios que eu acompanho. Agora que eu tenho dezenas de projetos open source, é assim que eu percebo em segundos quando chega PR ou issue nova, sem abrir o GitHub.</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/ghpending.webp" alt="Widget do ghpending mostrando pull requests e issues abertos em vários repositórios de uma vez."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/google-calendar-tui.webp" alt="Agenda colorida do google-calendar-tui impressa direto no terminal."  loading="lazy" /></p>
<p>E hoje eu passei o dia adicionando suporte a temas, porque alguém no X comentou que o visual dava pra lembrar Evangelion. Desafio aceito: agora tem o tema <code>evangelion</code> (roxo e lavanda) e o tema <code>nerv</code> (vermelho, âmbar e verde, inspirado nas telas de alerta da série), alternando em runtime com <code>Shift+T</code>. O tema é injetado nos widgets via variável de ambiente, então os painéis acompanham a paleta.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/clock-tui-nerv.webp" alt="clock-tui com o tema NERV: relógio digital em vermelho com widgets de system health, calendário e GitHub em âmbar e verde."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/clock-tui-evangelion.webp" alt="clock-tui com o tema Evangelion: a mesma tela na paleta roxa e lavanda da EVA-01."  loading="lazy" /></p>
<p>Instalação no Arch: <code>yay -S clock-tui-bin</code>. Os widgets: <code>yay -S ghpending-bin</code> (também tem <code>brew install</code> via <code>akitaonrails/tap</code> no macOS) e <code>yay -S google-calendar-tui-bin</code>. Todos têm binários prontos nas releases do GitHub pra quem não usa Arch.</p>
<h2>github-visualize: inútil, mas bonito<span class="hx:absolute hx:-mt-20" id="github-visualize-inútil-mas-bonito"></span>
    <a href="#github-visualize-in%c3%batil-mas-bonito" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esse nasceu por causa do artigo do Jarred Sumner sobre reescrever o TypeScript do Bun em Rust, sobre o qual eu <a href="/2026/07/09/resposta-sobre-bun-em-rust-que-andrew-kelly-deveria-ter-feito/">postei recentemente</a>. Não sei qual ferramenta ele usou pra ilustrar o post, mas eu gostei demais das animações dos gráficos. É inútil? É. Mas é bonito, e beleza é motivo suficiente pra fazer uma cópia.</p>
<p>O <a href="https://github.com/akitaonrails/github-visualize"target="_blank" rel="noopener">github-visualize</a> é um dashboard self-hosted que monitora meus repositórios do GitHub e faz replay do progresso deles com visualizações animadas: timeline de commits com linhas adicionadas e deletadas em escala logarítmica, heat map de commits por dia e hora, corrida de CI até o verde. Agora eu adiciono qualquer repositório meu e tenho visualizações bonitas de produtividade, atividade, commits e builds. Talvez eu use em slides de apresentação, ou pra ilustrar posts futuros aqui no blog.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/github-visualize-timeline.webp" alt="Replay animado da timeline de commits no github-visualize: linhas adicionadas em rosa e deletadas em ciano, com contadores animados e feed de git log."  loading="lazy" /></p>
<p>Instalação: imagem pública no Docker Hub como <a href="https://hub.docker.com/r/akitaonrails/github-visualize"target="_blank" rel="noopener"><code>akitaonrails/github-visualize</code></a>, container único com SQLite num volume, sem banco externo nem Redis.</p>
<h2>Frank Geary: email do jeito que eu queria<span class="hx:absolute hx:-mt-20" id="frank-geary-email-do-jeito-que-eu-queria"></span>
    <a href="#frank-geary-email-do-jeito-que-eu-queria" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu decidi usar o Geary, do GNOME, como meu cliente de email principal. É o que chega mais perto da interface do Mail padrão da Apple: limpo, direto, sem cerimônia. Eu sei, existe o Thunderbird, mas eu o acho inchado e muito feio. Existe o Mailspring, que eu acho inchado e pesado. Meu fluxo de email é curto: varrer a inbox, taggear, arquivar e responder. Nada além disso.</p>
<p>O Geary é quase perfeito, mas tinha dois problemas grandes pra mim. Primeiro: no meu monitor vertical, sobra muito menos espaço horizontal, e o Geary tem 3 colunas fixas. A primeira coluna, que só lista contas e pastas/tags, eu não preciso ver o tempo todo, mas não existia jeito de recolher.</p>
<p>Segundo, e mais grave: o campo de destinatário do compositor na prática não autocompletava nada (o Geary até tem o mecanismo, mas com um filtro de visibilidade de contatos tão restritivo que nunca sugeria ninguém). Eu tinha que digitar o endereço na mão ou copiar e colar de outro email. Em 2026.</p>
<p>Minha primeira solução foram dois módulos GTK externos injetados no Geary, um pra cada problema (ambos obsoletos agora). Funcionavam, mas exigiam instalar o Geary compilado do source, e a cada <code>yay -Syu</code> lá ia ele recompilar tudo de novo.</p>
<p>Cansei e fiz o que deveria ter feito desde o início: forkei o Geary e criei o <a href="https://github.com/akitaonrails/frank_geary"target="_blank" rel="noopener">Frank Geary</a>, que adiciona as duas funcionalidades direto no código. A barra lateral agora recolhe, e o destinatário autocompleta consultando os contatos dos emails existentes. Vou manter o fork rebaseando do upstream com frequência.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-geary-autocomplete.webp" alt="Popup de autocomplete de destinatário no compositor do Frank Geary, sugerindo contatos conforme você digita."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-geary-sidebar.webp" alt="Frank Geary com a barra lateral de contas recolhida: só a lista de conversas e a leitura, perfeito pra monitor vertical."  loading="lazy" /></p>
<p>E a melhor parte: agora tem pacote no AUR, então instalar é assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">yay -S frank-geary-bin    <span class="c1"># binário pronto (x86_64), da release do GitHub</span>
</span></span><span class="line"><span class="cl">yay -S frank-geary        <span class="c1"># ou compilando do source</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Os dois pacotes substituem o <code>geary</code> do sistema (fazem provide/conflict nele), então a troca é limpa e as atualizações chegam como qualquer outro pacote. Um detalhe depois de instalar ou atualizar: quando a opção de vigiar email novo está ligada, o Geary continua rodando em background como serviço D-Bus, então roda um <code>geary --quit</code> pra garantir que nenhum processo antigo ficou no ar.</p>
<h2>Mangá em japonês: FrankYomik, FRANK MANGA+ e FRANK Scanlation<span class="hx:absolute hx:-mt-20" id="mangá-em-japonês-frankyomik-frank-manga-e-frank-scanlation"></span>
    <a href="#mang%c3%a1-em-japon%c3%aas-frankyomik-frank-manga-e-frank-scanlation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quem acompanha o blog sabe do meu amor por mangá japonês. Eu já <a href="/2026/03/05/meu-primeiro-fracasso-com-vibe-code-e-como-consertei-frank-yomik/">postei sobre o FrankYomik</a>, que nasceu pra eu conseguir ler os mangás originais em japonês que eu compro na Amazon do Japão.</p>
<p>O problema: mangá voltado pra público adulto (não, não é pornô! estou falando de temas como negócios ou assuntos militares) não tem &ldquo;furigana&rdquo;, que são as legendinhas em kana impressas ao lado dos kanji difíceis, indicando a leitura. Mangá shounen tem furigana em tudo, então dá pra ler com vocabulário de estudante. Os adultos assumem que você já sabe ler os kanji raros. Eu não sei.</p>
<p>O <a href="https://github.com/akitaonrails/FrankYomik"target="_blank" rel="noopener">FrankYomik</a> resolve isso adicionando furigana em cima da página, em tempo real: um modelo detecta os balões de fala, o manga-ocr extrai o texto e o furigana (ou uma tradução completa, via LLM local no Ollama) é renderizado por cima, tudo rodando no meu próprio hardware. E o detalhe importante: on-the-fly, por cima da imagem que eu já tenho aberto legitimamente, sem baixar nem redistribuir página nenhuma, então sem infringir copyright ou licença.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-yomik-furigana.webp" alt="FrankYomik adicionando furigana automaticamente sobre os kanji difíceis de uma página de mangá em japonês."  loading="lazy" /></p>
<p>Depois veio o <a href="https://github.com/akitaonrails/frank_mangaplus"target="_blank" rel="noopener">FRANK MANGA+</a>, sobre o qual eu <a href="/2026/05/30/manga-plus-shueisha-desktop-frank-manga-plus/">também já postei</a>. Eu pago a assinatura do Manga Plus, o app oficial da Shueisha, mas ele só deixa ler no celular (Android/iOS). Num tablet pequeno até vai, mas eu tenho um monitor Samsung Odyssey OLED de 32&quot; parado na minha frente.</p>
<p>Descobri como usar a minha própria assinatura fora do app e construí um leitor desktop em Tauri: roda em Linux, macOS e Windows, o tier gratuito funciona direto e assinante cola o próprio secret pra liberar os capítulos premium.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-mangaplus-library.webp" alt="Biblioteca do FRANK MANGA&#43; no desktop: grade de capas dos mangás da Shueisha com busca no catálogo completo."  loading="lazy" /></p>
<p>Instalação: AppImage, <code>.deb</code> e <code>.dmg</code> nas <a href="https://github.com/akitaonrails/frank_mangaplus/releases/latest"target="_blank" rel="noopener">releases</a>, ou <code>yay -S mangaplus-reader-bin</code> no Arch.</p>
<p>E finalmente, eu também leio as eventuais &ldquo;scanlations&rdquo; da comunidade: fãs escaneiam as páginas do mangá original japonês e traduzem (hoje em dia a maioria usa IA no processo, existem até modelos treinados pra reconhecer os balões de fala, e eu usei um desses no próprio FrankYomik). Essas scanlations ficam espalhadas por vários sites diferentes, tipo o MangaDex.</p>
<p>Primeiro eu fiz uma extensão de Chrome pra embelezar esses sites (hoje obsoleta), mas cansei de viver com dezenas de abas no Brave só pra sites de scanlation. Então construí o <a href="https://github.com/akitaonrails/frank_scanlation"target="_blank" rel="noopener">FRANK Scanlation</a>, na mesma linha do FRANK MANGA+: um app desktop que concentra todas as minhas scanlations favoritas num lugar só, com biblioteca, progresso de leitura por título e checagem de capítulos novos.</p>
<p>As janelas de leitura carregam o próprio site e injetam um leitor decente por cima, com spreads de página dupla e navegação por teclado. Nada é hardcoded pra site nenhum: são heurísticas que detectam sequências de imagens e numeração de capítulos em qualquer URL. Virou meu jeito preferido de ler os mangás que não existem pra comprar na Amazon nem na Shueisha.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-scanlation-library.webp" alt="Biblioteca do FRANK Scanlation: cards com capas, progresso de leitura e botão de continuar de onde parou."  loading="lazy" /></p>
<p>Instalação: AppImage, <code>.deb</code> e <code>.rpm</code> (e build de macOS) nas <a href="https://github.com/akitaonrails/frank_scanlation/releases"target="_blank" rel="noopener">releases do GitHub</a>.</p>
<h2>Frank Lyrics: decorando música linha por linha<span class="hx:absolute hx:-mt-20" id="frank-lyrics-decorando-música-linha-por-linha"></span>
    <a href="#frank-lyrics-decorando-m%c3%basica-linha-por-linha" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu já <a href="/2026/04/05/transformando-youtube-num-app-de-karaoke-frank-karaoke/">postei sobre o Frank Karaoke</a>, um appzinho pra adicionar pontuação em cima do YouTube e curtir karaokê com família e amigos. Mas tem um caso de uso irmão: eu gosto de aprender música nova (abertura de anime nova, por exemplo), e o processo de decorar letra é repetir a MESMA linha várias vezes. No player do YouTube isso é um inferno: fica caçando no dedo o ponto exato da timeline pra voltar, erra por dois segundos, volta demais, passa do ponto.</p>
<p>Pra resolver isso criei o <a href="https://github.com/akitaonrails/frank_lyrics"target="_blank" rel="noopener">Frank Lyrics</a>, uma extensão de Chrome simples que descobre o timing correto de cada linha da letra usando os marcadores públicos do <a href="https://lrclib.net/"target="_blank" rel="noopener">LRCLIB</a> e injeta controles na própria página do YouTube. O LRCLIB, pra quem não conhece, é uma biblioteca aberta e comunitária de letras sincronizadas: cada linha vem com timestamp (o formato LRC clássico dos players de música), com API pública, gratuita e sem chave.</p>
<p>A extensão casa esses timestamps com o vídeo e me dá botões de repetir a linha exata que eu estou decorando, quantas vezes eu precisar, sem caçar timeline. Se você curte karaokê, o combo Frank Karaoke + Frank Lyrics deve te atender bem.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-lyrics.webp" alt="Painel do Frank Lyrics sobre um vídeo de letra no YouTube: cada linha da letra com seu timestamp e controles pra repetir a linha atual."  loading="lazy" /></p>
<p>Instalação: baixa o <code>.zip</code> das <a href="https://github.com/akitaonrails/frank_lyrics/releases"target="_blank" rel="noopener">releases</a>, descompacta, abre <code>chrome://extensions</code>, liga o modo desenvolvedor e faz &ldquo;Load unpacked&rdquo; apontando pra pasta.</p>
<h2>Frank Type: treino de digitação com prosa de verdade<span class="hx:absolute hx:-mt-20" id="frank-type-treino-de-digitação-com-prosa-de-verdade"></span>
    <a href="#frank-type-treino-de-digita%c3%a7%c3%a3o-com-prosa-de-verdade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quem me acompanha há tempo sabe que eu amo meus teclados. Tem vídeos no canal Akitando sobre isso e <a href="/2024/10/24/meus-teclados-modernos-favoritos/">posts aqui no blog sobre meus teclados favoritos</a>. E de tempos em tempos eu gosto de treinar no MonkeyType. Mas eu não gosto de digitar palavras aleatórias. O TypeRacer resolve isso usando textos públicos de verdade, só que ele me obriga a esperar outros jogadores na sala (eu detesto jogos multiplayer). Ou seja: eu queria uma experiência single player, com prosa de verdade, mas com a estética do MonkeyType, que eu prefiro.</p>
<p>Então criei o <a href="https://github.com/akitaonrails/frank_type"target="_blank" rel="noopener">Frank Type</a>, um mini-clone dos dois: um treinador de digitação em Rails 8 que usa trechos normalizados de prosa em domínio público em vez de listas de palavras aleatórias. É local-first e sem cadastro: histórico de sessões, tempos e gráficos de perfil ficam no local storage do navegador. Tem até heat map de dígrafos pra mostrar quais combinações de teclas te atrasam.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/frank-type.webp" alt="Tela de prática do Frank Type: texto de domínio público pra digitar, com estatísticas e heat map de dígrafos, na estética do MonkeyType."  loading="lazy" /></p>
<p>Instalação: é um container Docker publicado como <code>akitaonrails/frank_type</code>. Um comando levanta em <code>http://localhost:3200</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://raw.githubusercontent.com/akitaonrails/frank_type/master/bin/docker-run.sh <span class="p">|</span> bash</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>distrobox-gaming: uma biblioteca de como instalar jogos no Linux<span class="hx:absolute hx:-mt-20" id="distrobox-gaming-uma-biblioteca-de-como-instalar-jogos-no-linux"></span>
    <a href="#distrobox-gaming-uma-biblioteca-de-como-instalar-jogos-no-linux" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu jogo no mesmo PC em que trabalho, mas me recuso a misturar pacote de emulador e gambiarra de Wine com meu ambiente de desenvolvimento. A solução foi isolar os jogos inteiros dentro de um <a href="https://github.com/89luca89/distrobox"target="_blank" rel="noopener">distrobox</a> (containers que se integram ao desktop como se fossem nativos), e o <a href="https://github.com/akitaonrails/distrobox-gaming"target="_blank" rel="noopener">distrobox-gaming</a> é o repositório de playbooks Ansible que constrói essa box Arch do zero: ES-DE de frontend, emuladores standalone, cores do RetroArch, configs por jogo. Meu Arch/Omarchy host fica limpo.</p>
<p>A regra que eu me impus: todo jogo novo que eu instalo tem que virar receita Ansible reproduzível. Confesso que ainda não testei a reconstrução completa do zero, mas a ideia é essa: qualquer truque ou hack necessário fica documentado no código em vez de perdido no histórico do shell.</p>
<p>E truque é o que não falta, porque eu ando instalando abandonware antigo: a série Colin McRae Rally (da versão de PS1 com patch de 60 fps até o DiRT de 2007), Sega Rally Revo, OutRun 2006 Coast 2 Coast, entre outros. Cada um com suas manhas de Wine, seus patches e suas configurações. Sem querer, o repositório está virando uma biblioteca de documentação sobre como instalar jogos, emuladores e retro games no Linux.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/07/12/probleminhas/distrobox-gaming-cmr04.webp" alt="Colin McRae Rally 04 rodando na box de gaming: a tela de Service Area com o Mitsubishi Lancer Evolution antes da próxima especial."  loading="lazy" /></p>
<p>Na mesma linha existe o <a href="https://github.com/akitaonrails/distrobox-llm"target="_blank" rel="noopener">distrobox-llm</a>, que faz o mesmo isolamento pro meu ambiente de LLMs locais (CUDA, Ollama, LM Studio e companhia), deixando só o driver NVIDIA no host.</p>
<p>Instalação: clona o repositório e roda os playbooks:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> ansible
</span></span><span class="line"><span class="cl">ansible-galaxy collection install -r collections/requirements.yml
</span></span><span class="line"><span class="cl">cp host_vars/localhost.yml.example host_vars/localhost.yml
</span></span><span class="line"><span class="cl"><span class="nv">$EDITOR</span> host_vars/localhost.yml
</span></span><span class="line"><span class="cl">ansible-playbook site.yml</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>aitrepreneur-docker: ComfyUI sem sujar o sistema<span class="hx:absolute hx:-mt-20" id="aitrepreneur-docker-comfyui-sem-sujar-o-sistema"></span>
    <a href="#aitrepreneur-docker-comfyui-sem-sujar-o-sistema" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra geração de imagens eu gosto do ComfyUI, e <a href="/2025/04/20/entendendo-o-basico-de-comfyui-pra-gerar-imagens-com-i-a/">postei sobre ele ano passado</a>. Eu acompanho um youtuber chamado <a href="https://www.youtube.com/@Aitrepreneur"target="_blank" rel="noopener">Aitrepreneur</a> que mantém uma página no Patreon com receitas pra instalar e configurar o ComfyUI com os modelos e workflows mais recentes. O trabalho de curadoria dele é ótimo, mas as receitas são scripts <code>.sh</code> old school, pensados pra rodar one-shot numa instância do RunPod, por exemplo.</p>
<p>Agora que as LLMs evoluíram a ponto de escreverem Dockerfiles decentes, criei o <a href="https://github.com/akitaonrails/aitrepreneur-docker"target="_blank" rel="noopener">aitrepreneur-docker</a>, que converte esses scripts em imagens e containers Docker de verdade: versões pinadas, dados persistentes no host ou NAS, um comando pra subir ou atualizar cada app. Assim eu rodo tudo isolado na minha máquina, sem entulhar meu Linux com toneladas de pacotes Python e gambiarras que poderiam desestabilizar o sistema.</p>
<p>Dois avisos importantes. O crédito da seleção de stack, curadoria de modelos e workflows é todo do Aitrepreneur: o repositório só traduz o trabalho dele pra forma de Docker, e os scripts originais dele são conteúdo pago do Patreon que NÃO está incluído.</p>
<p>Se achar útil, <a href="https://www.patreon.com/c/aitrepreneur/home"target="_blank" rel="noopener">assine o Patreon dele</a> pra contribuir com a criação de conteúdo (é lá que você pega os arquivos originais). E o repositório não cobre tudo que ele já produziu, só as receitas mais recentes.</p>
<p>Instalação: <code>git clone</code>, <code>make setup</code> (cria o <code>.env</code> pra você colocar seu token da Hugging Face), <code>make build</code> e <code>make up</code>.</p>
<h2>E tem mais de onde vieram esses<span class="hx:absolute hx:-mt-20" id="e-tem-mais-de-onde-vieram-esses"></span>
    <a href="#e-tem-mais-de-onde-vieram-esses" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se você é novo por aqui: isso é só a leva que ainda não tinha aparecido no blog. Tem muito mais projeto que eu já cobri em posts dedicados. O <a href="/2026/06/16/ai-memory-memoria-longo-prazo-karpathy-wiki-auto-aprendizado-hermes-projetos/">ai-memory</a> é o mais popular, mais usado e com mais contribuições de todos. O <a href="/2026/05/24/dicas-e-toolkit-de-ia-do-akita-ai-jail-ai-memory-ai-usagebar/">ai-jail</a>, que apareceu de novo no <a href="/2026/07/11/como-me-precaver-pros-meus-agentes-nao-apagarem-minhas-coisas/">post de ontem sobre agentes destrutivos</a>, foi o primeiro da série e é o segundo mais popular.</p>
<p>E tem os outros da série Frank (&ldquo;Frank&rdquo; em homenagem ao Frank Rosenblatt, criador do perceptron, a rede neural original; o nome marca os projetos experimentais que eu faço por diversão):</p>
<ul>
<li><a href="/2026/02/23/vibe-code-fiz-um-indexador-inteligente-de-imagens-com-ia-em-2-dias/">Frank Sherlock</a>: indexador inteligente de imagens</li>
<li><a href="/2026/02/21/vibe-code-fiz-um-clone-do-mega-em-rails-em-1-dia-pro-meu-home-server/">Frank Mega</a>: clone do MEGA pro meu home server</li>
<li><a href="/2026/02/01/vibe-code-fiz-um-editor-de-markdown-do-zero-com-claude-code-frankmd-part-1/">FrankMD</a>: editor de markdown</li>
<li><a href="/2026/03/09/atacando-fraudes-via-email-frank-fbi/">Frank FBI</a>: analisador de fraudes por email</li>
<li><a href="/2026/03/27/ensinando-a-questionar-noticias-frank-investigator/">Frank Investigator</a>: ensina a questionar notícias</li>
</ul>
<p>Tudo é open source e está no <a href="https://github.com/akitaonrails"target="_blank" rel="noopener">meu GitHub</a>. Todo mundo é bem-vindo pra contribuir com issues, pull requests, ou simplesmente compartilhando com os amigos. Cada um desses projetos nasceu de um probleminha real meu. Vai que um deles resolve o seu também.</p>
]]></content:encoded><category>vibe-coding</category><category>open-source</category><category>inteligencia-artificial</category></item><item><title>A Controvérsia da LLM Rio 3.5. Plágio?</title><link>https://akitaonrails.github.io/2026/06/15/controversia-llm-rio-3-5-plagio/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/06/15/controversia-llm-rio-3-5-plagio/</guid><pubDate>Mon, 15 Jun 2026 16:00:00 -0300</pubDate><description>&lt;figure&gt;
&lt;img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/15/rio-3-5/rio35.png" alt="Meme do Scooby-Doo removendo a máscara de Rio-3.5-Open-397B e revelando Nex-N2-Pro" /&gt;
&lt;figcaption&gt;O meme é engraçado porque resume a acusação inteira. Mas vamos separar piada, evidência técnica e licença.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Essa semana apareceu uma controvérsia curiosa no mundinho de LLM de código aberto: a &lt;strong&gt;&lt;a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B"target="_blank" rel="noopener"&gt;Rio 3.5 Open 397B&lt;/a&gt;&lt;/strong&gt;, apresentada pela &lt;a href="https://prefeitura.rio/cidade/prefeitura-do-rio-anuncia-projetos-de-inovacao-que-serao-testados-na-cidade/"target="_blank" rel="noopener"&gt;Prefeitura do Rio/IplanRIO no anúncio da plataforma Rio 3 Open&lt;/a&gt; como modelo aberto.&lt;/p&gt;
&lt;p&gt;A acusação: na prática, o checkpoint publicado, ou seja, o arquivo de pesos do modelo, teria sido uma mistura direta do &lt;strong&gt;&lt;a href="https://huggingface.co/nex-agi/Nex-N2-Pro"target="_blank" rel="noopener"&gt;Nex-N2-Pro&lt;/a&gt;&lt;/strong&gt; com o &lt;strong&gt;&lt;a href="https://huggingface.co/Qwen/Qwen3.5-397B-A17B"target="_blank" rel="noopener"&gt;Qwen3.5-397B-A17B&lt;/a&gt;&lt;/strong&gt;, sem crédito inicial à Nex.&lt;/p&gt;</description><content:encoded><![CDATA[<figure>
  <img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/15/rio-3-5/rio35.png" alt="Meme do Scooby-Doo removendo a máscara de Rio-3.5-Open-397B e revelando Nex-N2-Pro" />
  <figcaption>O meme é engraçado porque resume a acusação inteira. Mas vamos separar piada, evidência técnica e licença.</figcaption>
</figure>
<p>Essa semana apareceu uma controvérsia curiosa no mundinho de LLM de código aberto: a <strong><a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B"target="_blank" rel="noopener">Rio 3.5 Open 397B</a></strong>, apresentada pela <a href="https://prefeitura.rio/cidade/prefeitura-do-rio-anuncia-projetos-de-inovacao-que-serao-testados-na-cidade/"target="_blank" rel="noopener">Prefeitura do Rio/IplanRIO no anúncio da plataforma Rio 3 Open</a> como modelo aberto.</p>
<p>A acusação: na prática, o checkpoint publicado, ou seja, o arquivo de pesos do modelo, teria sido uma mistura direta do <strong><a href="https://huggingface.co/nex-agi/Nex-N2-Pro"target="_blank" rel="noopener">Nex-N2-Pro</a></strong> com o <strong><a href="https://huggingface.co/Qwen/Qwen3.5-397B-A17B"target="_blank" rel="noopener">Qwen3.5-397B-A17B</a></strong>, sem crédito inicial à Nex.</p>
<p>O título do post tem interrogação de propósito. &ldquo;Plágio&rdquo; é uma palavra pesada, especialmente quando estamos falando de modelo sob licença permissiva. A pergunta correta não é só &ldquo;pode usar?&rdquo;. Em código aberto, quase sempre pode. A pergunta é: <strong>usou, modificou, redistribuiu e deu crédito corretamente?</strong> E, no caso de modelo de IA, tem outra pergunta tão importante quanto: <strong>foi transparente sobre o que de fato foi feito?</strong></p>
<p>Minha conclusão curta, antes do textão: a evidência pública da Nex é forte. Forte o bastante pra dizer que o checkpoint inicialmente publicado da Rio 3.5 parece ter sido uma mescla quase linear de Nex-N2-Pro e Qwen3.5-397B-A17B.</p>
<p>A própria <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/raw/main/README.md"target="_blank" rel="noopener">README da Rio</a> foi alterada depois da <a href="https://github.com/nex-agi/Nex-N2/issues/4"target="_blank" rel="noopener">issue da Nex</a> para reconhecer Nex + Qwen e dizer que houve um &ldquo;envio incorreto&rdquo;.</p>
<p>Eu não reproduzi a análise tensor a tensor. Estou avaliando a evidência publicada pela Nex, o histórico público do Hugging Face e os testes que eu rodei separadamente no meu benchmark.</p>
<p>Isso não prova, juridicamente, &ldquo;plágio&rdquo; no sentido clássico. Mas mostra uma falha feia de atribuição e comunicação. E pra projeto público, com prefeitura, isso pesa mais.</p>
<h2>O que a Prefeitura do Rio anunciou<span class="hx:absolute hx:-mt-20" id="o-que-a-prefeitura-do-rio-anunciou"></span>
    <a href="#o-que-a-prefeitura-do-rio-anunciou" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em abril, a Prefeitura publicou uma notícia dizendo que a IplanRio apresentou a plataforma <strong>Rio 3 Open</strong>, &ldquo;uma família de seis modelos de inteligência artificial de ponta totalmente gratuita e aberta&rdquo;.</p>
<p>O texto oficial dizia que a ideia era colocar o Rio como polo de inovação pública, capaz de desenvolver soluções próprias de IA &ldquo;sem depender de plataformas estrangeiras&rdquo;. Também destacava licença MIT, uso livre, modificação e até lucro sobre a tecnologia. Fonte: <a href="https://prefeitura.rio/cidade/prefeitura-do-rio-anuncia-projetos-de-inovacao-que-serao-testados-na-cidade/"target="_blank" rel="noopener">Prefeitura do Rio, 02/04/2026</a>.</p>
<p>Uma reportagem do <a href="https://www.mobiletime.com.br/noticias/02/04/2026/prefeitura-do-rio-3-llms/"target="_blank" rel="noopener">Mobile Time</a> deu mais contexto: a família seria desenvolvida a partir do Qwen, modelo chinês da Alibaba.</p>
<p>O próprio João Cabaretta, presidente da IplanRio, teria dito: &ldquo;O que fizemos foi pegar o modelo Qwen, já pronto, e a partir dele modificamos o modelo.&rdquo; A reportagem também citava usos esperados na prefeitura: ler câmeras de segurança em busca de atividades suspeitas, analisar documentos de prestação de contas, gerar imagens e vídeos institucionais e atendimento ao cidadão.</p>
<p>Até aqui, nada absurdo. Pegar um modelo aberto e adaptar pra uso local é exatamente o que muita gente faz. Se a prefeitura conseguiu montar infraestrutura, adaptar modelo, documentar, publicar pesos, isso é bom. Eu sou a favor. Prefiro isso a mais um contrato fechado com SaaS estrangeiro que ninguém audita.</p>
<p>O problema começa na forma como a Rio 3.5 foi apresentada.</p>
<p>No Hugging Face, o repositório <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B"target="_blank" rel="noopener"><code>prefeitura-rio/Rio-3.5-Open-397B</code></a> inicialmente dizia que o modelo era &ldquo;developed by IplanRIO&rdquo;, &ldquo;Post-trained from Qwen 3.5 397B&rdquo;, com <strong>MIT License</strong> e agradecimentos ao Qwen Team e ao SwiReasoning. Essa versão antiga ainda está acessível no histórico do Hugging Face: <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/raw/cd503cdc7aaac2506bf68f6d278503ddb07a83ef/README.md"target="_blank" rel="noopener">README antes da correção</a>.</p>
<p>O card também prometia um modelo generalista de fronteira, com <strong>397B parâmetros totais / 17B ativos</strong>, janela de contexto de <strong>1.010.000 tokens</strong> e uso comercial/pesquisa liberado sob MIT. Ou seja: não era uma nota lateral. Era um lançamento com ambição alta.</p>
<p>Repara no detalhe: Qwen aparecia como base. A Nex, não.</p>
<p>E isso importa porque, na própria discussão da Nex, alguém corrigiu a narrativa dizendo que a Rio <strong>já creditava Qwen</strong> desde cedo. Está certo: o <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/commit/a0b566a0ecd25ae6996ccafd377b2162af01077a"target="_blank" rel="noopener">segundo commit do card do modelo</a> já colocava <code>base_model: Qwen/Qwen3.5-397B-A17B</code>. Um comentário na issue também aponta isso: <a href="https://github.com/nex-agi/Nex-N2/issues/4#issuecomment-4710338431"target="_blank" rel="noopener">&ldquo;They did say Qwen 3.5 397B was the base model from the beginning&hellip;&rdquo;</a>.</p>
<p>Então a acusação mais forte não é &ldquo;omitiram Qwen&rdquo;. É: <strong>creditaram Qwen, mas omitiram Nex-N2-Pro</strong>, justamente o componente que a análise de pesos da Nex diz ser majoritário na receita publicada.</p>
<p>Depois da issue aberta pela Nex, a README atual passou a dizer outra coisa:</p>
<blockquote>
  <p>&ldquo;O modelo foi construído por meio de uma mescla de <a href="https://huggingface.co/nex-agi/Nex-N2-Pro"target="_blank" rel="noopener">https://huggingface.co/nex-agi/Nex-N2-Pro</a> e <a href="https://huggingface.co/Qwen/Qwen3.5-397B-A17B"target="_blank" rel="noopener">https://huggingface.co/Qwen/Qwen3.5-397B-A17B</a>, seguida por On-Policy Distillation a partir de um modelo mais forte. Detectamos um envio incorreto na versão anterior, em que a versão base mesclada foi enviada em vez do modelo final destilado. Pedimos desculpas pela confusão.&rdquo;</p>

</blockquote>
<p>Fonte: <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/raw/main/README.md"target="_blank" rel="noopener">README atual da Rio 3.5</a>, alterada no commit <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/commit/a778c1ec4e21180ee55c3ea016a348e549e75f09"target="_blank" rel="noopener">a778c1e</a>.</p>
<p>Essa frase muda bastante a história. Antes: &ldquo;pós-treinado a partir do Qwen&rdquo;. Depois: &ldquo;mescla de Nex-N2-Pro e Qwen, seguida por destilação, mas subimos o arquivo errado&rdquo;.</p>
<p>Pode ser verdade. Pode ter havido mesmo um envio errado. Mas, como observador externo, eu só consigo analisar o que foi publicado.</p>
<h2>A acusação da Nex<span class="hx:absolute hx:-mt-20" id="a-acusação-da-nex"></span>
    <a href="#a-acusa%c3%a7%c3%a3o-da-nex" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A Nex abriu a issue <a href="https://github.com/nex-agi/Nex-N2/issues/4"target="_blank" rel="noopener">nex-agi/Nex-N2#4</a> em 14 de junho. Em tradução/resumo meu, a acusação principal é direta:</p>
<blockquote>
  <p><code>prefeitura-rio/Rio-3.5-Open-397B</code> é apresentado como um modelo original de 397B treinado pela IplanRIO. Não é. Seus pesos são uma mescla direta, elemento a elemento, do nosso modelo, Nex, com a base oficial <code>Qwen3.5-397B-A17B</code> — cerca de 0,6 Nex / 0,4 Qwen — e não encontramos evidência de treino próprio deles.</p>

</blockquote>
<p>A Nex aponta duas evidências.</p>
<p>Primeira: comportamento de identidade. Segundo eles, o serviço da Rio usava um prompt de sistema embutido dizendo &ldquo;You are Rio&rdquo;. Removido esse prompt, eles fizeram 120 perguntas de identidade. O resultado reportado foi:</p>
<ul>
<li>&ldquo;Nex&rdquo;: 95/120, ou 79,2%.</li>
<li>&ldquo;Nex-AGI&rdquo;: 88/120, ou 73,3%.</li>
<li>&ldquo;Rio&rdquo;: 0/120.</li>
</ul>
<p>Exemplo de resposta citado pela Nex:</p>
<blockquote>
  <p>&ldquo;Eu sou Nex, da Nex-AGI. A Nex-AGI é uma aliança de ecossistema de modelos grandes, construída em conjunto pelo Shanghai Innovation Institute…&rdquo;</p>

</blockquote>
<p>Fonte: <a href="https://github.com/nex-agi/Nex-N2/issues/4#issuecomment-4702171801"target="_blank" rel="noopener">comentário da Nex sobre identidade</a>.</p>
<p>Isso sozinho não prova tudo. Modelo se identificar como outro pode acontecer por contaminação de conjunto de dados, prompt de sistema, prompt de teste malfeito, ajuste fino reaproveitado. Mas é um sinal ruim quando o modelo supostamente &ldquo;Rio&rdquo; nunca diz &ldquo;Rio&rdquo; sem máscara e diz &ldquo;Nex&rdquo; com frequência alta.</p>
<p>A segunda evidência é mais séria: análise de pesos.</p>
<p>A hipótese da Nex é simples. Se Rio = α·Nex + (1−α)·Qwen, então, para cada tensor:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">(Rio − Qwen) ≈ α · (Nex − Qwen)</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Eles reportam valores muito consistentes: experts roteados com α ≈ 0,571 ± 0,0016 e <code>cos_fit</code> 0,993; <code>lm_head</code> com 0,574 e 0,991; atenção por volta de 0,585 e 0,986; projeções de atenção linear por volta de 0,586 e 0,984. Fonte: <a href="https://github.com/nex-agi/Nex-N2/issues/4#issuecomment-4702181710"target="_blank" rel="noopener">comentário da Nex sobre análise de pesos</a>.</p>
<p>Essa é a parte que mais pesa. Similaridade alta entre modelos da mesma família não seria surpresa. Mas colinearidade tensor a tensor nesse nível é outra coisa. Se a conta reproduz em todos os tensores, não parece &ldquo;treinamos algo parecido&rdquo;. Parece mescla.</p>
<p>O ponto fraco: até alguém reproduzir independentemente, isso continua sendo uma análise apresentada pela parte interessada. O ponto forte: é uma análise técnica falsificável, não só print de chat.</p>
<h2>O tweet da Nex<span class="hx:absolute hx:-mt-20" id="o-tweet-da-nex"></span>
    <a href="#o-tweet-da-nex" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><figure>
  <img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/15/rio-3-5/nex-tweet-rio35.png" alt="Screenshot do tweet da Nex dizendo que Rio 3.5 é essencialmente Nex N2 Pro com outro chapéu" />
  <figcaption>Screenshot do tweet da Nex. Link original: <a href="https://x.com/NexEcosystem/status/2066180407100571714">x.com/NexEcosystem/status/2066180407100571714</a>.</figcaption>
</figure>
<p>O tweet da Nex resume a acusação em tom de meme:</p>
<blockquote>
  <p>&ldquo;O modelo Rio 3.5 quebrou a internet esta semana. A reviravolta? Ele é essencialmente nosso modelo de código aberto, Nex N2 Pro, usando outro chapéu.&rdquo;</p>

</blockquote>
<p>E continua:</p>
<blockquote>
  <p>&ldquo;Analisamos os pesos, e a receita é exata: Rio 3.5 ≈ 0,6 * Nex N2 Pro + 0,4 * Qwen 3.5&rdquo;</p>

</blockquote>
<p>Também repete a parte de identidade:</p>
<blockquote>
  <p>&ldquo;Ele literalmente se apresenta como &lsquo;Nex N2 Pro&rsquo; se você perguntar sem prompt de sistema inicial!&rdquo;</p>

</blockquote>
<p>E fecha com a frase mais importante:</p>
<blockquote>
  <p>&ldquo;Mas, no mundo do código aberto, atribuição importa.&rdquo;</p>

</blockquote>
<p>É isso. A parte mais importante não é &ldquo;usaram nosso modelo&rdquo;. Modelo de código aberto existe pra ser usado. Se a análise estiver correta, a reclamação é: teriam usado, se beneficiado da performance herdada, anunciado resultados, mas só dado o crédito depois que a Nex expôs a mistura.</p>
<h2>Mas o que é Nex-N2-Pro?<span class="hx:absolute hx:-mt-20" id="mas-o-que-é-nex-n2-pro"></span>
    <a href="#mas-o-que-%c3%a9-nex-n2-pro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes de continuar, vale explicar quem é a Nex nessa história, porque ela também não surgiu do vácuo.</p>
<p>No <a href="https://huggingface.co/nex-agi/Nex-N2-Pro/raw/main/README.md"target="_blank" rel="noopener">model card oficial</a>, a Nex descreve o <strong>Nex-N2</strong> como &ldquo;an agentic model with Agentic Thinking&rdquo;.</p>
<p>Marketing à parte, a promessa é clara: não ser só um modelo bom de chat, mas um modelo ajustado pra tarefas longas de agente. Programação, chamada de ferramentas, execução no terminal. Esse tipo de fluxo chato em que o modelo precisa planejar, executar, ver feedback do ambiente, corrigir e iterar.</p>
<p>E sim: ele também é baseado em Qwen. O próprio card diz que os dois modelos da família foram pós-treinados em cima da série Qwen3.5:</p>
<ul>
<li><strong>Nex-N2-Pro</strong>: construído sobre <a href="https://huggingface.co/Qwen/Qwen3.5-397B-A17B"target="_blank" rel="noopener"><code>Qwen3.5-397B-A17B</code></a>.</li>
<li><strong>Nex-N2-mini</strong>: construído sobre <a href="https://huggingface.co/Qwen/Qwen3.5-35B-A3B-Base"target="_blank" rel="noopener"><code>Qwen3.5-35B-A3B-Base</code></a>.</li>
</ul>
<p>Então a Nex não está dizendo &ldquo;criamos uma arquitetura base do zero&rdquo;. Ela está dizendo: pegamos Qwen como base e fizemos um pós-treino voltado a agentes em cima. A diferença prometida está nesse pós-treino.</p>
<p>Eles chamam o framework de <strong>Agentic Thinking</strong>, dividido em duas ideias:</p>
<ul>
<li><strong>Adaptive Thinking</strong>: o modelo decide quando pensar pouco e agir rápido, ou quando gastar mais raciocínio em decisões críticas.</li>
<li><strong>Coherent Thinking</strong>: manter um paradigma de raciocínio consistente entre tarefas gerais, programação e tarefas de agente, em vez de tratar raciocínio, uso de ferramentas e execução como ilhas separadas.</li>
</ul>
<p>Também há detalhes práticos: recomendam um fork customizado do <code>sglang</code>, usam <code>reasoning-parser qwen3</code>, <code>tool-call-parser qwen3_coder</code>, falam em suporte robusto a chamada de funções e listam testes de agente/programação onde o Nex-N2-Pro ficaria perto de modelos proprietários como GPT-5.5 e Opus 4.7.</p>
<p>Claro, teste de fornecedor sempre precisa de sal. Mas a tese é essa: <strong>Qwen cru é a base; Nex é o pós-treino e empacotamento de agente que deveria transformar essa base num modelo melhor pra trabalho real de agente</strong>.</p>
<p>Isso bate com meu benchmark independente. O Qwen3.5-397B-A17B base foi mal, 42/C. O Nex-N2-Pro foi bem, 83/A. Mesma base, diferença brutal. Pelo menos no meu teste de Rails/RubyLLM, o valor da Nex não parece ser &ldquo;tem 397B parâmetros&rdquo;. Qwen já tinha isso. O valor está em ter corrigido comportamento de agente que o Qwen base não tinha: usar API real, terminar a tarefa, validar ambiente, lidar com erro.</p>
<p>Essa distinção importa pra controvérsia da Rio. Se a Rio 3.5 usou Nex como ingrediente principal, não é só &ldquo;usou Qwen com outro nome&rdquo;. Ela teria usado justamente a parte que tornava o Qwen útil em tarefas de agente. E essa parte era trabalho da Nex.</p>
<h2>O que a Rio respondeu, na prática<span class="hx:absolute hx:-mt-20" id="o-que-a-rio-respondeu-na-prática"></span>
    <a href="#o-que-a-rio-respondeu-na-pr%c3%a1tica" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A resposta pública mais concreta, até onde consegui verificar, foi a alteração da README no Hugging Face. A Rio passou a dizer que:</p>
<ol>
<li>O modelo é construído via mescla de Nex-N2-Pro e Qwen3.5-397B-A17B.</li>
<li>Depois disso haveria uma etapa de <strong>On-Policy Distillation</strong>, ou destilação on-policy, a partir de um modelo mais forte.</li>
<li>O checkpoint inicialmente enviado seria a &ldquo;versão base mesclada&rdquo;, não o modelo final destilado.</li>
<li>Eles estariam trabalhando pra reenviar o modelo correto.</li>
</ol>
<p>Também há o histórico de commits do Hugging Face mostrando que, depois da issue, vários arquivos <code>model-00001.safetensors</code> até <code>model-00097.safetensors</code> e uma imagem de benchmarks foram removidos. Dá pra ver isso pela <a href="https://huggingface.co/api/models/prefeitura-rio/Rio-3.5-Open-397B/commits/main"target="_blank" rel="noopener">API de commits do Hugging Face</a>.</p>
<p>Aqui entra meu ceticismo normal de engenheiro. &ldquo;Subimos o arquivo errado&rdquo; é uma explicação possível. Acontece. Mas quando o arquivo errado, segundo a análise da Nex, é exatamente uma combinação matemática de modelos de origem sem crédito inicial, e a correção vem uma hora depois da denúncia, fica difícil chamar de mero detalhe operacional.</p>
<p>Não impossível. Difícil.</p>
<h2>O que é mescla de modelos<span class="hx:absolute hx:-mt-20" id="o-que-é-mescla-de-modelos"></span>
    <a href="#o-que-%c3%a9-mescla-de-modelos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra quem não acompanha esse nicho, mescla de modelos, ou &ldquo;model merge&rdquo;, não é mágica. É uma técnica relativamente comum: você pega dois checkpoints compatíveis, normalmente da mesma arquitetura, e combina os pesos. A versão mais simples é literalmente uma interpolação linear:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">modelo_final = 0.6 * modelo_A + 0.4 * modelo_B</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Existem variações mais sofisticadas, com mescla por camada, task vector, TIES, DARE, SLERP, pesos diferentes por módulo. Mas o conceito é esse: você não está treinando do zero. Você está combinando parâmetros já treinados.</p>
<p>Isso pode funcionar? Às vezes. Especialmente quando os modelos têm a mesma base e foram ajustados em direções complementares. Pode preservar capacidades de um e recuperar comportamento base de outro. Também pode piorar. Mescla é alquimia estatística: tem técnica, mas também tem muito teste empírico.</p>
<p>E, principalmente: <strong>mescla não custa nem remotamente o que custa treinar um modelo 397B</strong>. Você precisa baixar checkpoints enormes, rodar scripts, testar pesos, talvez fazer benchmark, talvez fazer ajustes. <strong>Não é zero trabalho. Mas não é &ldquo;treinamos um modelo de fronteira&rdquo;.</strong></p>
<p>Se a evidência da Nex está correta, o checkpoint publicado era algo na linha:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Rio 3.5 ≈ 0.57 a 0.60 * Nex-N2-Pro + 0.40 a 0.43 * Qwen3.5-397B-A17B</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso parece mais trabalho de engenharia de integração do que treino de modelo. Não é o mesmo tipo de mérito técnico que pós-treinar ou destilar um 397B e apresentar isso como avanço próprio.</p>
<h2>O que é destilação aqui<span class="hx:absolute hx:-mt-20" id="o-que-é-destilação-aqui"></span>
    <a href="#o-que-%c3%a9-destila%c3%a7%c3%a3o-aqui" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Destilação, ou distillation, é outra coisa. Em LLM, normalmente significa usar um modelo professor mais forte para gerar respostas, raciocínios ou preferências, e treinar um modelo aluno para imitar esse comportamento. Você pode destilar estilo, capacidade de raciocínio, formato de resposta, domínio específico, uso de ferramenta. O aluno pode ser menor, mais barato, mais rápido, ou simplesmente adaptado a um objetivo.</p>
<p>A README corrigida da Rio fala em <strong>On-Policy Distillation from a stronger model</strong>. Traduzindo livremente: eles teriam usado um modelo mais forte para gerar dados ou sinais de treino durante uma política de geração mais próxima do próprio aluno, e então treinado a Rio 3.5 final.</p>
<p>Isso, se existir, é trabalho real. Exige pipeline, dados, computação, avaliação. A questão é que a Nex não analisou esse suposto modelo final destilado. Ela analisou o checkpoint que estava publicado. E a própria Rio agora diz que aquele checkpoint era a &ldquo;versão base mesclada&rdquo; enviada por engano.</p>
<p>Então o estado factual é:</p>
<ul>
<li>checkpoint publicado inicialmente: acusado de ser uma mescla Nex + Qwen;</li>
<li>README inicial: creditava Qwen, não Nex;</li>
<li>README corrigida: reconhece mescla Nex + Qwen e diz que o final destilado não era aquele;</li>
<li>modelo final correto: em aberto, até ser reupado e analisado.</li>
</ul>
<p>Sem o checkpoint final, não dá pra avaliar a destilação. Dá pra avaliar a comunicação.</p>
<h2>A licença: Apache permite, mas normalmente exige preservar avisos<span class="hx:absolute hx:-mt-20" id="a-licença-apache-permite-mas-normalmente-exige-preservar-avisos"></span>
    <a href="#a-licen%c3%a7a-apache-permite-mas-normalmente-exige-preservar-avisos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui é onde muita discussão online fica burra.</p>
<p>Não sou advogado e isso não é parecer jurídico. Além disso, a aplicação exata de licenças de código aberto a pesos de modelo ainda tem zonas cinzentas. Mas, pela leitura prática da Apache-2.0, a regra operacional não é &ldquo;use e apague os rastros&rdquo;.</p>
<p>Nex-N2-Pro declara licença <strong>Apache-2.0</strong> no Hugging Face: <a href="https://huggingface.co/nex-agi/Nex-N2-Pro/raw/main/README.md"target="_blank" rel="noopener">README do Nex-N2-Pro</a>. Qwen3.5-397B-A17B também declara <strong>Apache-2.0</strong>: <a href="https://huggingface.co/Qwen/Qwen3.5-397B-A17B/raw/main/README.md"target="_blank" rel="noopener">README do Qwen3.5-397B-A17B</a>.</p>
<p>Apache-2.0 é permissiva. Ela permite reproduzir, modificar, criar derivados, sublicenciar e distribuir. Inclusive comercialmente. Então não é &ldquo;roubo&rdquo; simplesmente porque usaram Nex e Qwen. Se a licença permite, usar faz parte do jogo.</p>
<p>Mas permissiva não significa &ldquo;sem obrigação nenhuma&rdquo;. A <a href="https://www.apache.org/licenses/LICENSE-2.0.txt"target="_blank" rel="noopener">licença Apache-2.0</a> exige, entre outras coisas:</p>
<ul>
<li>dar aos recipientes uma cópia da licença;</li>
<li>marcar arquivos modificados com avisos proeminentes de mudança;</li>
<li>preservar avisos de copyright, patente, marca e atribuição da forma fonte;</li>
<li>incluir NOTICE quando o trabalho original tiver NOTICE aplicável.</li>
</ul>
<p>A Rio 3.5 inicialmente declarou <strong>MIT License</strong> e creditou Qwen/SwiReasoning, mas não Nex. Se o checkpoint distribuído era de fato derivado de Nex-N2-Pro, isso é no mínimo uma falha de atribuição. Pode ser corrigível. Parece ter sido corrigido parcialmente na README. Mas o erro aconteceu no lançamento, justo no momento de maior visibilidade.</p>
<p>E tem mais uma nuance: <strong>não dá pra simplesmente pegar dois componentes Apache-2.0, gerar um derivado e anunciar o pacote resultante como se fosse apenas MIT, sem preservar as obrigações Apache dos upstreams</strong>.</p>
<p>Apache-2.0 é permissiva e permite distribuir derivados sob termos diferentes para as suas modificações, mas com condição: você ainda precisa entregar a licença Apache, preservar avisos de copyright/atribuição e carregar NOTICE quando existir.</p>
<p>Então &ldquo;MIT&rdquo; pode até aparecer como licença da camada adicionada pela Rio, mas não pode apagar a Apache-2.0 de Nex e Qwen nem dar a entender que o derivado inteiro ficou livre dessas obrigações. Se o card original dizia só MIT e não trazia os créditos/avisos Apache aplicáveis, isso pode deixar de ser só gafe de etiqueta e virar possível problema de conformidade de licença.</p>
<p>E aqui tem uma ironia: eles poderiam ter evitado 90% da controvérsia com uma frase honesta desde o começo:</p>
<blockquote>
  <p>&ldquo;Rio 3.5 é uma mescla/ajuste fino construído sobre Nex-N2-Pro e Qwen3.5-397B-A17B, com adaptações da IplanRIO para português e uso público.&rdquo;</p>

</blockquote>
<p>Pronto. Talvez ainda reclamassem politicamente, mas a crítica técnica ficaria muito mais fraca. O problema é parecer que você fez sozinho.</p>
<h2>Quanto trabalho parece ter tido?<span class="hx:absolute hx:-mt-20" id="quanto-trabalho-parece-ter-tido"></span>
    <a href="#quanto-trabalho-parece-ter-tido" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Essa é a parte especulativa, então vou marcar como especulação.</p>
<p>Se o que foi publicado era só a mescla base, o trabalho técnico pode ter sido bem menor do que a narrativa pública sugere. Fazer mescla de dois modelos gigantes não é apertar um botão no navegador, claro. Você precisa de armazenamento, scripts, máquina, validação, lidar com shards, enviar quase uma centena de <code>safetensors</code>, rodar testes, escrever documentação. Dá trabalho operacional.</p>
<p>Mas não é o mesmo tipo de trabalho que treinar, pós-treinar ou destilar um 397B de verdade.</p>
<p>E a frase &ldquo;modelo de IA aberta treinada no Rio com financiamento público ao longo do último ano&rdquo;, como disse Eduardo Cavaliere no <a href="https://x.com/CavaliereRio/status/2065984620626129026"target="_blank" rel="noopener">tweet</a>, cria uma expectativa bem diferente de &ldquo;fizemos uma mescla de dois modelos Apache e talvez uma destilação depois&rdquo;.</p>
<p>Rafael Coelho respondeu em outro <a href="https://x.com/RafaelC38655518/status/2066044310206771250"target="_blank" rel="noopener">tweet</a> que não teriam gasto dinheiro público e que fizeram um swap de códigos de treino velhos por créditos de GPU. Pode haver uma explicação administrativa aí, mas pra quem está de fora a comunicação fica confusa.</p>
<p>Não estou afirmando irregularidade administrativa. Estou dizendo que a narrativa pública ficou inconsistente.</p>
<p>E mesmo a cifra de <strong>R$ 500 mil</strong>, citada na reportagem do Mobile Time sobre a geração anterior, precisa de escala. Em pesquisa séria de LLM, isso não é muito dinheiro. Some salário de alguns pesquisadores, infraestrutura, armazenamento, horas de GPU em nuvem, tentativas que falham, avaliação, engenharia de dados, e esse valor some rápido. É troco perto do custo de treinar ou pós-treinar modelo grande de verdade.</p>
<p>Então eu não usaria &ldquo;R$ 500 mil&rdquo; como prova automática de desperdício. Não é por aí. O ponto é outro: esse valor também não sustenta, sozinho, a narrativa de que foi feito um treinamento pesado e original de um modelo 397B. Pra esse tipo de escala, pesquisa séria gastaria muito, muito mais.</p>
<p>Foi financiado publicamente? Não foi? Custou R$ 500 mil na geração anterior? Foi crédito de GPU? Foi treino de um ano? Foi mescla? Foi destilação? Foi envio errado?</p>
<p>Talvez todas essas frases tenham contextos diferentes. Mas quando a comunicação técnica é ruim, o público junta tudo e vira bagunça.</p>
<h2>O que meu benchmark diz sobre Nex e Qwen<span class="hx:absolute hx:-mt-20" id="o-que-meu-benchmark-diz-sobre-nex-e-qwen"></span>
    <a href="#o-que-meu-benchmark-diz-sobre-nex-e-qwen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora vem a parte em que eu consigo falar com dado próprio. No meu <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>, eu testei tanto o <strong>Nex-N2-Pro</strong> quanto o <strong>Qwen 3.5 397B A17B base</strong>.</p>
<p>Meu benchmark mede uma tarefa específica de programação/Rails. Ele é útil como sinal, não como avaliação geral de capacidade.</p>
<p>Não testei a Rio 3.5 diretamente por um motivo simples: ela é grande demais pra minha máquina local. Meu Strix Halo tem 128 GB de RAM unificada, ótimo pra muita coisa, mas não pra rodar um 397B desse porte com folga. Pra testar direito eu teria que alugar máquina em nuvem, lidar com configuração, baixar centenas de gigabytes, organizar shards, subir servidor de inferência, pagar por hora, e ainda correr o risco de o checkpoint correto nem estar disponível no momento.</p>
<p>Não estava a fim desse trabalho todo pra um post de análise rápida. Então fiz a melhor aproximação disponível: testar os originais que a própria controvérsia coloca na receita, Nex-N2-Pro e Qwen3.5-397B-A17B. Se a Rio publicada era basicamente uma mescla desses dois, e se não há evidência pública de muito trabalho efetivo em cima daquele checkpoint, comparar os ingredientes já diz bastante. Não substitui teste direto da Rio, mas coloca a alegação de performance em perspectiva.</p>
<p>E tem outro detalhe: no <a href="https://huggingface.co/prefeitura-rio/Rio-3.5-Open-397B/raw/cd503cdc7aaac2506bf68f6d278503ddb07a83ef/README.md"target="_blank" rel="noopener">model card antigo da própria Rio</a>, a tabela dizia &ldquo;Gains Over Base Model&rdquo;, mas a Rio <strong>não ganhava do Qwen 3.5 base em tudo</strong>.</p>
<p>Ela perdia em MMLU-Redux (94,6 vs 94,9), MMMU-Pro (78,4 vs 79,0) e VideoMMMU (81,6 vs 84,7), empatava em MCP-Atlas (74,2 vs 74,2), e em alguns casos ganhava por margem pequena, como MMLU-Pro (88,0 vs 87,8) e MathVision (89,1 vs 88,6). Então mesmo pelos números auto-reportados, sem auditoria independente, a história era mais &ldquo;melhora em vários benchmarks&rdquo; do que &ldquo;melhor que Qwen em tudo&rdquo;.</p>
<p>E, sim, onde a Rio dizia ganhar do Qwen, isso também combina com a hipótese da Nex: <strong>o Nex-N2-Pro já era melhor que o Qwen base justamente por causa do trabalho da Nex</strong>. Eu vi isso no meu próprio benchmark: Qwen3.5-397B-A17B base fez 42/C, enquanto Nex-N2-Pro fez 83/A. Então uma Rio que mistura Nex com Qwen pode muito bem parecer melhor que Qwen. Para o checkpoint publicado, a explicação mais simples não é &ldquo;a Rio inventou uma técnica milagrosa&rdquo;; é &ldquo;ela herdou boa parte do ganho que a Nex já tinha produzido em cima do Qwen&rdquo;.</p>
<p>Commits relevantes:</p>
<ul>
<li><a href="https://github.com/akitaonrails/llm-coding-benchmark/commit/11a9c6850485215bb6ccc2ab8e3d1c60e175e62b"target="_blank" rel="noopener"><code>11a9c68</code></a>: adiciona Nex-N2-Pro, 83/100, Tier A.</li>
<li><a href="https://github.com/akitaonrails/llm-coding-benchmark/commit/e2af88c77c4c5abd95438d5a6132d2bfdf7d943b"target="_blank" rel="noopener"><code>e2af88c</code></a>: adiciona Qwen 3.5 397B A17B base, 42/100, Tier C.</li>
</ul>
<p>Na tabela final do benchmark, o Nex ficou assim: <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/e2af88c77c4c5abd95438d5a6132d2bfdf7d943b/docs/success_report.md#L77-L89"target="_blank" rel="noopener">rank #10, 83/100, Tier A</a>.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Nex-N2-Pro | 83 | A | RubyLLM OK | OpenRouter | 25m | free</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O Qwen base ficou assim: <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/e2af88c77c4c5abd95438d5a6132d2bfdf7d943b/docs/success_report.md#L102-L108"target="_blank" rel="noopener">rank #28, 42/100, Tier C</a>.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Qwen 3.5 397B A17B (base) | 42 | C | RubyLLM não OK | OpenRouter | 15m | ~$0.58</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Esse é um controle interessante. Mesmo backbone, resultado completamente diferente.</p>
<p>O Qwen base alucinou a API do RubyLLM (<code>chat.system</code>, <code>chat.user</code>, <code>response.text</code>) e ainda criou o app dentro de um diretório aninhado <code>chat-app/</code>, violando o formato esperado pelo benchmark.</p>
<p>O Nex, por outro lado, usou a API real: <code>RubyLLM.chat</code>, <code>chat.ask</code>, <code>response.content</code>, subiu localmente, passou Docker, compose e chat real via OpenRouter. O relatório compara isso diretamente: <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/e2af88c77c4c5abd95438d5a6132d2bfdf7d943b/docs/success_report.md#L570-L581"target="_blank" rel="noopener">Qwen base 42/C vs Nex ajustado 83/A, salto de 41 pontos</a>.</p>
<p>Isso coloca a Rio 3.5 em perspectiva. Se ela realmente era 60% Nex + 40% Qwen base, faz sentido ela herdar bastante da capacidade de agente do Nex. Mas também faz sentido suspeitar que misturar 40% de um modelo que, no meu teste, foi muito pior em programação, possa degradar o Nex puro em certos cenários.</p>
<p>Então não vou afirmar &ldquo;Rio é pior&rdquo; como medição minha. O que dá pra dizer é: <strong>o componente Nex é bom; o componente Qwen base foi ruim no meu teste; uma Rio que fosse só Nex diluído com Qwen base não deveria ser vendida como avanço óbvio sobre Nex puro sem benchmark reproduzível contra o próprio Nex</strong>. Pelo que foi publicado até agora, não parece que o trabalho adicional em cima da mescla tenha melhorado a posição de forma demonstrável. Se melhorou, publiquem o modelo correto e os testes reproduzíveis.</p>
<p>E mesmo o Nex, que foi muito bom, não ficou no topo do meu ranking de modelos abertos ou quase abertos. Ele marcou 83. Os melhores até aqui foram Kimi K2.6 e GLM 5.2 com 87, e Kimi K2.7 Code com 86. Nex é Tier A, gratuito, impressionante. Mas não é mágica. É um bom ajuste fino voltado a agentes em cima de uma família que, crua, tropeça feio em APIs de biblioteca.</p>
<p>Então, como usuário, minha conclusão prática é simples: <strong>se eu tivesse que escolher hoje, eu usaria Nex-N2-Pro direto</strong>. Não porque Rio seja automaticamente inútil para sempre, mas porque o checkpoint publicado não mostrou um ganho claro e auditável sobre o ingrediente mais valioso da receita. Se o ganho veio da Nex, por que não usar a Nex? A Rio só volta a ser interessante tecnicamente se aparecer o modelo final destilado correto, com avaliação reproduzível mostrando vantagem real sobre Nex-N2-Pro puro.</p>
<h2>Então foi plágio?<span class="hx:absolute hx:-mt-20" id="então-foi-plágio"></span>
    <a href="#ent%c3%a3o-foi-pl%c3%a1gio" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Minha resposta honesta: <strong>eu não chamaria de plágio como conclusão jurídica</strong>. Eu chamaria de reapresentação mal atribuída do checkpoint inicialmente publicado, com forte evidência de mescla direta e uma correção posterior que só apareceu depois da exposição.</p>
<p>Código aberto não é &ldquo;não pode usar&rdquo;. Código aberto é &ldquo;pode usar, mas respeite a licença e dê crédito&rdquo;. Se Nex e Qwen estão em Apache-2.0, a prefeitura podia construir em cima. Podia fazer mescla. Podia fazer destilação. Podia publicar derivado. Podia até licenciar a parte dela sob MIT, desde que não apague obrigações dos componentes Apache e preserve os avisos exigidos.</p>
<p>O erro foi deixar a narrativa pública parecer criação própria, com crédito incompleto. E aí, quando a Nex apareceu com conta tensor a tensor, a README mudou.</p>
<p>Talvez exista um modelo final destilado de verdade. Se existir, publiquem. De preferência com:</p>
<ul>
<li>card claro dizendo base, mescla, destilação e dados de treino;</li>
<li>licença compatível com Qwen e Nex;</li>
<li>créditos explícitos;</li>
<li>script de avaliação reproduzível;</li>
<li>benchmark contra Nex-N2-Pro puro e Qwen base;</li>
<li>explicação sobre o &ldquo;envio incorreto&rdquo;.</li>
</ul>
<p>Isso encerraria boa parte da discussão técnica. Talvez não a política, mas a técnica sim.</p>
<h2>O que dá pra aprender daqui<span class="hx:absolute hx:-mt-20" id="o-que-dá-pra-aprender-daqui"></span>
    <a href="#o-que-d%c3%a1-pra-aprender-daqui" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Essa história é um bom lembrete pra todo mundo que está surfando modelos abertos agora. A cadeia de derivação importa. Não por burocracia acadêmica, mas porque ela é parte da confiança.</p>
<p>Se você faz ajuste fino em cima de Qwen, diga Qwen. Se faz mescla com Nex, diga Nex. Se destila de um professor fechado, diga que destilou, mesmo que não possa nomear o professor. Se subiu o checkpoint errado, explique exatamente qual era o errado, qual é o certo, e como alguém pode verificar.</p>
<p>O pior caminho é tentar parecer maior do que é. Porque LLM de código aberto é um ambiente onde pesos são baixáveis, comparáveis e auditáveis. Você pode até esconder a narrativa por um tempo, mas não esconde álgebra linear.</p>
<p>No fim, a Nex talvez tenha feito a melhor validação involuntária do próprio modelo: se uma prefeitura usou Nex-N2-Pro como 60% da receita de um modelo anunciado como &ldquo;estado da arte&rdquo;, é porque o Nex é bom. Mas validação involuntária não paga a conta de crédito.</p>
<p>E crédito, no código aberto, não é frescura. É a moeda básica do jogo.</p>
]]></content:encoded><category>llms</category><category>open-source</category><category>leis-e-regulacao</category></item><item><title>Brincando de TUI com LLMs - Ratatui+Bubbletea</title><link>https://akitaonrails.github.io/2026/06/08/brincando-tui-llms-ratatui-bubbletea/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/06/08/brincando-tui-llms-ratatui-bubbletea/</guid><pubDate>Mon, 08 Jun 2026 16:00:00 -0300</pubDate><description>&lt;p&gt;Antes de falar do brinquedo novo, um lembrete rápido: &lt;a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener"&gt;ai-jail&lt;/a&gt; e &lt;a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener"&gt;ai-memory&lt;/a&gt; continuam recebendo bastante atenção. Issues, pull requests, pequenas correções, melhorias de empacotamento, bugs de ambiente, ajustes de documentação. Aquelas coisas que ninguém vê num post de lançamento, mas que transformam experimento em ferramenta que dá pra usar todo dia.&lt;/p&gt;
&lt;p&gt;Eu gosto dessa fase. O projeto deixa de ser &amp;ldquo;o que eu imaginei no meu setup&amp;rdquo; e vira &amp;ldquo;o que quebra na máquina de outra pessoa&amp;rdquo;. Aí aparece Windows, macOS, Arch, AUR, path esquisito, token salvo em lugar diferente, shell diferente, terminal diferente. Chato? Sim. Necessário? Também.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Antes de falar do brinquedo novo, um lembrete rápido: <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a> e <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a> continuam recebendo bastante atenção. Issues, pull requests, pequenas correções, melhorias de empacotamento, bugs de ambiente, ajustes de documentação. Aquelas coisas que ninguém vê num post de lançamento, mas que transformam experimento em ferramenta que dá pra usar todo dia.</p>
<p>Eu gosto dessa fase. O projeto deixa de ser &ldquo;o que eu imaginei no meu setup&rdquo; e vira &ldquo;o que quebra na máquina de outra pessoa&rdquo;. Aí aparece Windows, macOS, Arch, AUR, path esquisito, token salvo em lugar diferente, shell diferente, terminal diferente. Chato? Sim. Necessário? Também.</p>
<p>Mas o prato principal de hoje não é ai-jail nem ai-memory. É TUI. Mais especificamente, é minha mania recente de escrever pequenas ferramentas de terminal em Rust com <a href="https://ratatui.rs/"target="_blank" rel="noopener">Ratatui</a>, mas querendo que elas fiquem com cara de <a href="https://github.com/charmbracelet/bubbletea"target="_blank" rel="noopener">Bubble Tea</a>.</p>
<h2>O app que não vou abrir<span class="hx:absolute hx:-mt-20" id="o-app-que-não-vou-abrir"></span>
    <a href="#o-app-que-n%c3%a3o-vou-abrir" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Nas últimas semanas também mexi num projeto privado que não pretendo abrir. É uma TUI pra acompanhar minha conta nos EUA, investimentos, assets, posições, covered calls, open calls, essas coisas chatas de adulto. Não vou publicar o código porque é o tipo de ferramenta que nasceu colada no meu fluxo financeiro, nas minhas planilhas, nos meus extratos e nas minhas gambiarras internas. Abrir isso seria transformar uma ferramenta minha em suporte gratuito pra bug de banco dos outros. Tô fora.</p>
<p>Mas dá pra mostrar a cara geral. Censurei o que precisava censurar:</p>
<p><strong>Observação óbvia, mas vou deixar explícito: todos os valores, tickers, posições e datas mostrados no screenshot são dados falsos de demonstração. Não é dado real da minha conta, nem portfolio real, nem recomendação de investimento.</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-portfolio-censored.png" alt="TUI privada de portfolio em terminal, com abas de dashboard e tabela de holdings. O nome do banco foi censurado."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-allocation-censored.png" alt="TUI privada mostrando uma visão de alocação por classe de asset, com nomes sensíveis censurados."  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/private-open-calls-censored.png" alt="TUI privada mostrando uma aba de open calls com dados falsos de demonstração e nomes sensíveis censurados."  loading="lazy" /></p>
<p>Toda vez que faço uma TUI pequena, a mesma dúvida aparece: que stack usar?</p>
<p>Se eu fosse escrever tudo na unha, provavelmente escolheria Python ou Go. São linguagens mais confortáveis pra esse tipo de utilitário pequeno. Python porque é direto, cheio de biblioteca, ótimo pra script que conversa com API e parseia JSON. Go porque gera binário simples, cruza plataforma bem, e tem ergonomia boa pra CLI.</p>
<p>Só que hoje eu raramente escrevo esse código todo na unha. Eu orquestro Claude, Codex, OpenCode, mando revisar, mando refatorar, mando testar. Nesse cenário, a falta de ergonomia do Rust pesa menos, porque quem briga com borrow checker, trait bound e lifetime chato é o LLM. Eu fico mais no papel de revisor e usuário final. E aí Rust começa a ficar muito atraente.</p>
<p>Ferramental bom. <code>cargo</code> é ótimo. Testes são fáceis de rodar. Cross compile é administrável. O binário final é limpo. Erro de memória idiota praticamente some. Não estou dizendo que Rust é magicamente melhor que Go ou Python pra toda TUI. Não é. Mas com LLM escrevendo a maior parte, o custo que normalmente me faria evitar Rust cai bastante. E os modelos atuais estão surpreendentemente competentes em Rust, desde que você mande rodar teste, consertar warning e não aceite a primeira versão como se fosse revelação divina.</p>
<h2>Ratatui é bom, mas eu queria a cara do Charm<span class="hx:absolute hx:-mt-20" id="ratatui-é-bom-mas-eu-queria-a-cara-do-charm"></span>
    <a href="#ratatui-%c3%a9-bom-mas-eu-queria-a-cara-do-charm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://ratatui.rs/"target="_blank" rel="noopener">Ratatui</a> é uma biblioteca Rust pra construir interfaces ricas no terminal: dashboards, apps interativos, tabelas, listas, gauges, layouts, tudo aquilo que antigamente a gente chamava de &ldquo;ncurses moderno&rdquo;. Ele é o sucessor espiritual do <code>tui-rs</code>, e hoje é provavelmente o caminho mais óbvio se você quer fazer TUI séria em Rust.</p>
<p>Ratatui funciona bem. O problema é gosto pessoal: por padrão, não acho bonito. Não é feio no sentido &ldquo;isso parece programa de DOS de 1993&rdquo;. Dá pra fazer coisa boa. Mas muita TUI em Ratatui cai naquela estética quadrada, cinza, funcional, meio admin panel de datacenter.</p>
<p>Eu gosto mais da pegada da <a href="https://charm.sh/"target="_blank" rel="noopener">Charmbracelet</a>. O <code>gum</code>, por exemplo, é uma coleção de comandos pra deixar shell script interativo sem virar festival de <code>read -p</code> e <code>case</code>. Prompt, select, filter, spinner, tabela, pager, estilo. Você monta um script bash com cara de app decente em minutos.</p>
<p>E tem o <a href="https://github.com/charmbracelet/bubbletea"target="_blank" rel="noopener">Bubble Tea</a>, em Go, inspirado na arquitetura Elm. Você tem um model, recebe mensagens, atualiza estado, renderiza uma view. É uma ideia simples e muito boa pra terminal: estado entra, evento entra, view sai. A Charm também tem um gosto visual que eu curto: cores boas, espaçamento decente, componentes leves, nada com cara de formulário WinForms jogado no terminal.</p>
<p>Então eu queria o seguinte: continuar em Rust com Ratatui, mas roubar a sensação de Bubble Tea. Não o runtime inteiro. Não um clone perfeito. Só a direção visual e alguns componentes.</p>
<p>Daí nasceu o <a href="https://github.com/akitaonrails/ratatui-bubbletea"target="_blank" rel="noopener">ratatui-bubbletea</a>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/ratatui-bubbletea-example.png" alt="Showcase do ratatui-bubbletea rodando em terminal, com SelectList, Spinner, Theme, ThemedTable, TextInput, Progress e Viewport no estilo Charm."  loading="lazy" /></p>
<p>O projeto não substitui o Ratatui. Ele fica por cima. A ideia é oferecer uma camada de tema e componentes com inspiração em Bubble Tea/Bubbles, mas ainda renderizando com Ratatui.</p>
<p>Hoje ele é dividido em crates:</p>
<ul>
<li><code>ratatui-bubbletea-theme</code>, com paleta, helpers e estilos compartilhados.</li>
<li><code>ratatui-bubbletea-components</code>, com componentes prontos como select list, spinner, progress, table, text input, viewport e help.</li>
<li><code>ratatui-tea</code>, opcional, pra quem quer uma ergonomia mais perto de <code>Model</code>, <code>Msg</code> e <code>Cmd</code>, sem fingir que Rust virou Go.</li>
</ul>
<p>O README tem os exemplos completos e a documentação do que já existe. Por enquanto, eu trato como toolkit pequeno. Serve pra meus apps, e se servir pra mais alguém, ótimo. Se não servir, também não tem drama. O objetivo era parar de reimplementar o mesmo tema e os mesmos widgets toda vez que eu começava uma TUI nova.</p>
<h2>ai-usagebar como exemplo público<span class="hx:absolute hx:-mt-20" id="ai-usagebar-como-exemplo-público"></span>
    <a href="#ai-usagebar-como-exemplo-p%c3%bablico" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Como não vou abrir o app financeiro, precisava de um exemplo público usando essa estética. Então atualizei meu <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>.</p>
<p>Pra quem não lembra, expliquei o projeto no post <a href="/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/">&ldquo;Criei um Widget de Waybar pra Omarchy pra Monitorar Uso de Planos de LLM: ai-usagebar&rdquo;</a>. Ele nasceu como widget de Waybar pra mostrar uso de planos de LLM: Claude, OpenAI Codex/ChatGPT, Z.AI, OpenRouter. Bateu o olho na barra, sabe se está perto do limite e qual vendor usar agora.</p>
<p>Depois virou também TUI standalone. E graças a contribuições, hoje suporta Windows também. Isso é engraçado porque a origem dele é totalmente Linux/Omarchy/Waybar. Mas é open source: alguém usa em outro ambiente, encontra atrito, manda PR, e pronto, o projeto fica menos provinciano.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/ai-usagebar.png" alt="ai-usagebar em modo TUI mostrando dashboard de uso de OpenAI, abas de vendors, gauges de limite e atalhos no rodapé."  loading="lazy" /></p>
<p>No ai-usagebar a diferença visual não muda a vida de ninguém. É uma tela simples. Abas, gauges, texto, atalhos. Mas é um bom exemplo porque é pequeno, real, testado, empacotado, e não depende do meu app privado. Dá pra olhar o código e ver como apliquei a camada de tema.</p>
<h2>Os apps de coceira própria<span class="hx:absolute hx:-mt-20" id="os-apps-de-coceira-própria"></span>
    <a href="#os-apps-de-coceira-pr%c3%b3pria" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esses projetos todos seguem a mesma lógica: eu tenho uma coceira, faço uma ferramenta pequena, uso, ajusto, empacoto. Nada de roadmap de startup. Nada de manifesto. Só ferramenta que resolve um incômodo meu.</p>
<p>Um exemplo recente é o <a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">clock-tui</a>. Ele não nasceu comigo. Era um projeto Rust antigo, <code>tclock</code>, que parecia abandonado. Eu queria um relógio grande no meu segundo monitor vertical. Aquele monitor fica do lado, e eu gosto de ter um &ldquo;desk clock&rdquo; enorme ocupando parte da tela. Usei o clock-tui original por um tempo.</p>
<p>Só que uma tela vertical inteira só pra mostrar hora é desperdício. Eu já tinha o <a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>, que lista issues e PRs abertos em todos os meus projetos. Ele é meu &ldquo;tem alguém esperando resposta?&rdquo; em formato de CLI. Também queria ver minha agenda.</p>
<p>Então fiz outro app pequeno: <a href="https://github.com/akitaonrails/google-calendar-tui"target="_blank" rel="noopener">google-calendar-tui</a>. Ele usa as contas Gmail já registradas no GNOME Online Accounts e resume meus próximos compromissos no terminal. Read-only. Sem ritual de OAuth novo. Sem mais um config secreto espalhado em lugar esquisito.</p>
<p>Com essas duas peças, modernizei o clock-tui e adicionei layout de widgets auto-refresh. Agora o relógio ocupa a tela como eu queria, mas em volta dele aparecem pendências do GitHub e agenda do Google Calendar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/tclock.png" alt="tclock em monitor vertical, com relógio grande, widget de pendências do GitHub à esquerda e agenda do Google Calendar à direita."  loading="lazy" /></p>
<p>Isso é exatamente o tipo de coisa que eu nunca faria se custasse um fim de semana inteiro. Mas com LLM, vira uma sequência de tarefas pequenas: lê o projeto antigo, moderniza dependências, roda teste, adiciona módulo de widget, chama ghpending, chama google-calendar-tui, organiza layout, corrige bug, empacota. Ainda dá trabalho. Mas é trabalho de supervisão e refinamento, não de ficar brigando com boilerplate.</p>
<h2>Ajustando Geary sem fork<span class="hx:absolute hx:-mt-20" id="ajustando-geary-sem-fork"></span>
    <a href="#ajustando-geary-sem-fork" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Outra coceira veio do GNOME.</p>
<p>Como eu queria centralizar minhas contas no GNOME Online Accounts, comecei a usar <a href="https://wiki.gnome.org/Apps/Geary"target="_blank" rel="noopener">Geary</a> e o calendário do GNOME no segundo monitor também. Gosto da ideia: contas configuradas uma vez, apps do desktop reaproveitando a mesma infraestrutura, nada de cada programinha inventar seu próprio login.</p>
<p>O problema é que o Geary tem um layout fixo de três colunas. Numa tela normal, tudo bem. Num monitor vertical, fica apertado. A coluna de pastas, a lista de mensagens e o corpo do e-mail brigam por espaço. Eu não queria manter um fork do Geary só pra esconder uma sidebar. Fork de app GTK grande é dívida. Você pisca e passa o resto da vida resolvendo conflito de merge.</p>
<p>Então fiz um módulo GTK: <a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">geary-hide-sidebar-module</a>. Ele injeta um comportamento no Geary em runtime e permite recolher/expandir a sidebar, com atalho e auto-collapse em janela estreita. Sem recompilar Geary. Sem manter fork. Só um módulo pequeno com uma responsabilidade bem específica.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/08/ratatui-bubbletea/geary-sidebar-hidden.png" alt="Geary com sidebar recolhida, mostrando lista de e-mails e corpo da mensagem em layout mais confortável para tela vertical."  loading="lazy" /></p>
<p>Essa é uma lição boa: às vezes você não precisa forkar a aplicação inteira. Dá pra ajustar por fora. GTK_MODULES existe. Wrapper existe. Config existe. CSS existe. Script existe. Nem toda personalização precisa virar uma manutenção eterna de código dos outros.</p>
<h2>Código pequeno ficou barato<span class="hx:absolute hx:-mt-20" id="código-pequeno-ficou-barato"></span>
    <a href="#c%c3%b3digo-pequeno-ficou-barato" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>É por isso que estou insistindo tanto nessa ideia de apps pequenos. Com LLMs atuais, ficou muito fácil implementar uma ideia específica pra deixar seu ambiente do jeito que você quer. Sem esperar alguém ter exatamente a mesma dor. Sem ficar procurando no GitHub por três horas uma ferramenta que faz 80% do que você quer e 40% do que você não quer.</p>
<p>Você descreve a coceira, cria um repo, pede um protótipo, testa, manda refatorar, manda escrever teste, manda empacotar. Se ficar ruim, joga fora. Se ficar bom, instala e usa.</p>
<p>Eu não deixo isso virar gambiarra jogada no <code>~/bin</code> sem dono. Meus apps têm testes. Têm builds automatizados. Muitos têm release no GitHub, pacote no AUR, instalação normal com <code>yay</code> no Arch. Usam paths XDG, então config vai pra <code>~/.config</code>, cache vai pra <code>~/.cache</code>, dados vão pra <code>~/.local/share</code>. Fica organizado. Dá pra atualizar. Dá pra remover. Dá pra outra pessoa clonar e contribuir.</p>
<p>Pra fechar, os links todos num lugar só:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ratatui-bubbletea"target="_blank" rel="noopener">ratatui-bubbletea</a></li>
<li><a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a></li>
<li><a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">clock-tui</a></li>
<li><a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a></li>
<li><a href="https://github.com/akitaonrails/google-calendar-tui"target="_blank" rel="noopener">google-calendar-tui</a></li>
<li><a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">geary-hide-sidebar-module</a></li>
<li><a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a></li>
<li><a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a></li>
</ul>
<p>Se você usar algum deles e quebrar no seu setup, abre issue. Se souber corrigir, manda PR. Eu uso essas ferramentas de verdade, então bug report útil tende a virar correção rápido.</p>
<p>Minha regra prática é essa: personalize seu ambiente sem transformar tudo em gambiarra. Faça ferramenta pequena. Teste. Empacote. Documente. Deixe o LLM carregar o peso chato e use seu cérebro pra decidir o que presta.</p>
<p>Essa é a parte divertida de programar que tinha sumido um pouco. Agora voltou.</p>
]]></content:encoded><category>ai-usagebar</category><category>ferramentas-de-desenvolvimento</category><category>rust</category><category>open-source</category></item><item><title>Controvérsia de IA em contribuições de projetos de código aberto - minha opinião</title><link>https://akitaonrails.github.io/2026/06/05/controversia-ia-contribuicoes-projetos-codigo-aberto-minha-opiniao/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/06/05/controversia-ia-contribuicoes-projetos-codigo-aberto-minha-opiniao/</guid><pubDate>Fri, 05 Jun 2026 11:00:00 -0300</pubDate><description>&lt;p&gt;Nos últimos dias voltou a discussão sobre &lt;strong&gt;AI slop&lt;/strong&gt; em projetos de código aberto. Mantenedor reclamando que PR gerado por IA é lixo. Projeto proibindo contribuição assistida por IA. Bug bounty sendo inundado por relatório falso. Usuário irritado porque um release que usou IA quebrou alguma coisa. E, claro, a internet fazendo o que a internet faz melhor: transformar caso específico em guerra santa.&lt;/p&gt;
&lt;p&gt;Minha opinião curta: &lt;strong&gt;IA em contribuição open source veio pra ficar&lt;/strong&gt;. Vai aumentar, não diminuir. A caixa de Pandora já abriu. Não existe plano realista onde todo mundo volta a programar 100% manualmente e finge que Claude Code, Codex, OpenCode, Cursor, Gemini CLI e o resto nunca existiram.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Nos últimos dias voltou a discussão sobre <strong>AI slop</strong> em projetos de código aberto. Mantenedor reclamando que PR gerado por IA é lixo. Projeto proibindo contribuição assistida por IA. Bug bounty sendo inundado por relatório falso. Usuário irritado porque um release que usou IA quebrou alguma coisa. E, claro, a internet fazendo o que a internet faz melhor: transformar caso específico em guerra santa.</p>
<p>Minha opinião curta: <strong>IA em contribuição open source veio pra ficar</strong>. Vai aumentar, não diminuir. A caixa de Pandora já abriu. Não existe plano realista onde todo mundo volta a programar 100% manualmente e finge que Claude Code, Codex, OpenCode, Cursor, Gemini CLI e o resto nunca existiram.</p>
<p>Isso não quer dizer que todo projeto tem obrigação de aceitar contribuição feita com IA. Longe disso. O mantenedor tem o direito absoluto de tocar o projeto como quiser. Pode aceitar IA, pode banir IA, pode congelar o projeto, pode apagar o repositório e ir plantar tomate. Código aberto não é democracia obrigatória. Quem mantém decide.</p>
<p>Mas também acho que banir IA é só adiar uma briga impossível de ganhar. O volume vai continuar subindo. A qualidade média vai oscilar. Vai ter lixo, vai ter coisa boa, vai ter PR quase certo, vai ter relatório de bug alucinado. A pergunta prática não é “como impedir IA?”. A pergunta prática é: <strong>como adaptar o processo pra sobreviver a isso?</strong></p>
<h2>Os casos recentes<span class="hx:absolute hx:-mt-20" id="os-casos-recentes"></span>
    <a href="#os-casos-recentes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O caso mais barulhento agora foi o do <a href="https://linuxiac.com/rsync-3-4-3-regressions-trigger-debate-over-ai-assisted-code/"target="_blank" rel="noopener">rsync 3.4.3</a>. A versão saiu em 20 de maio como update de segurança, corrigindo seis CVEs. Logo depois, usuários reportaram regressões, em especial em fluxos de backup com daemon mode e opções de transferência incremental. Rsync não é brinquedo. É ferramenta de backup, deploy, mirror, sysadmin. Quebrar compatibilidade ali dói.</p>
<p>Andrew Tridgell, criador do Samba e co-criador do rsync, respondeu no post <a href="https://medium.com/@tridge60/rsync-and-outrage-d9849599e5a0"target="_blank" rel="noopener">rsync and outrage</a>. Ele confirmou que usou Claude, com cross-check de Codex e Gemini, pra ajudar a reescrever parte da suíte de testes em Python. Mas também disse o óbvio que muita gente não quer ouvir: ele não mandou “converte tudo aí” e foi dormir. Ele desenhou a suíte, revisou o trabalho, queimou muito tempo de CI, e assumiu que as regressões aconteceram em casos válidos, mas incomuns, que não estavam cobertos nem pelos testes existentes nem pelos testes manuais dele.</p>
<p>Esse é o ponto interessante: a regressão virou discussão sobre IA, mas regressão não nasceu com IA. Regressão nasceu junto com software.</p>
<p>Do outro lado temos o Zig. O <a href="https://ziglang.org/code-of-conduct/"target="_blank" rel="noopener">Code of Conduct do Zig</a> hoje tem uma política explícita: <strong>Strict No LLM / No AI Policy</strong>. Nada de conteúdo gerado por LLM, nem código, nem prosa, nem revisão gramatical, nem tradução, nem brainstorming. Andrew Kelley explicou em entrevista, resumida pela <a href="https://www.devclass.com/devops/2026/06/01/zig-creator-seeks-uncompromising-perfection-before-blessing-10/5248219"target="_blank" rel="noopener">DevClass</a>, que a equipe considera contribuições de IA invariavelmente ruins, consumidoras de tempo de review, não ensináveis, não determinísticas. A frase que resume a postura dele é boa: o padrão que ele quer não é “funciona surpreendentemente bem”, é “perfeição sem compromisso”.</p>
<p>Eu discordo da generalização, mas respeito a decisão. É o projeto dele. Se ele quer manter aquele espaço sem LLM, é direito dele. Ponto.</p>
<p>Na mesma vizinhança apareceu a discussão do Bun. O <a href="https://bun.sh/blog/bun-joins-anthropic"target="_blank" rel="noopener">post oficial do Bun entrando na Anthropic</a> diz que Bun foi adquirido porque Claude Code e outros produtos de coding da Anthropic dependem dele. “Se Bun quebra, Claude Code quebra”, nas palavras do próprio post. Já a matéria da <a href="https://www.cosmicjs.com/blog/bun-rust-rewrite-javascript-runtime"target="_blank" rel="noopener">Cosmic sobre a reescrita em Rust</a> aponta motivos como acessibilidade de contribuidores, manutenção em escala e estabilidade de longo prazo. Eu vi gente ligando isso à política anti-IA do Zig, mas a fonte que consegui verificar não crava essa causalidade. O que dá pra dizer com segurança é: Bun, um projeto nascido em Zig, está migrando partes importantes pra Rust, e uma das razões citadas é a base maior de contribuidores.</p>
<p>E tem o caso do curl. Segundo a <a href="https://hackaday.com/2026/01/26/the-curl-project-drops-bug-bounties-due-to-ai-slop/"target="_blank" rel="noopener">Hackaday</a>, Daniel Stenberg suspendeu o programa de bug bounty do curl a partir de 1º de fevereiro de 2026 porque o projeto foi inundado por relatórios de vulnerabilidade gerados por LLM. Relatórios compridos, intimidadores, com cara de exploit sério, mas que quando um mantenedor experiente lê, não são vulnerabilidades. O PR que remove o bounty está no GitHub como <a href="https://github.com/curl/curl/pull/20312"target="_blank" rel="noopener">curl/curl#20312</a>.</p>
<p>Esse caso é diferente de PR de código. É pior. Um patch ruim você testa, compila, lê. Um relatório de segurança falso obriga alguém experiente a gastar tempo provando que não existe bug. É o tipo de trabalho ingrato que esgota mantenedor.</p>
<p>Então sim: o problema é real. AI slop existe. Está enchendo issue tracker, PR, bug bounty, comentário, tudo.</p>
<p>Agora a parte que ninguém gosta: isso não vai parar.</p>
<h2>Não existe “voltar ao normal”<span class="hx:absolute hx:-mt-20" id="não-existe-voltar-ao-normal"></span>
    <a href="#n%c3%a3o-existe-voltar-ao-normal" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu já falei disso no post <a href="/2026/04/11/vs-code-e-o-novo-cartao-perfurado/">VS Code é o novo cartão perfurado</a>. A interface mudou. Antes você precisava digitar instrução binária. Depois precisava organizar cartão perfurado. Depois precisava convencer o compilador. Depois precisava operar editor, terminal, framework, CI, container, cloud e YAML. Agora você precisa orquestrar agente.</p>
<p>Isso não elimina engenharia. Só muda onde o trabalho manual termina.</p>
<p>Tem gente tratando IA como se fosse moda passageira, igual “metaverso” ou NFT. Não é. IA pra programação já passou do ponto de demonstração de conferência. Está dentro do fluxo de trabalho real. O rsync usou. Bun está cheio de bot de Claude Code abrindo PR. Meus projetos usam. Seus contribuidores vão usar, mesmo que você proíba. Se você acha que consegue detectar com 100% de certeza que um patch foi escrito com ou sem IA, boa sorte com isso.</p>
<p>O mantenedor ainda pode impor regra. Pode dizer “se eu descobrir que usou IA, bloqueio”. Pode fazer sentido em comunidades pequenas, com cultura própria, como Zig. Mas no open source geral, principalmente projeto grande, com usuário no mundo inteiro, isso vira teatro de compliance. O sujeito usa IA, reescreve, não declara, e pronto. Você vai fazer o quê? Detector de IA em código? Pelo amor.</p>
<h2>O erro é achar que você precisa revisar tudo sozinho<span class="hx:absolute hx:-mt-20" id="o-erro-é-achar-que-você-precisa-revisar-tudo-sozinho"></span>
    <a href="#o-erro-%c3%a9-achar-que-voc%c3%aa-precisa-revisar-tudo-sozinho" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A reclamação mais justa dos mantenedores é simples: já falta gente pra revisar contribuição humana. IA aumenta o volume. Mais PR, mais issue, mais bug report. O mantenedor já estava cansado, agora está afogado.</p>
<p>Eu entendo. Só acho que a solução não é tentar processar o novo volume com o processo velho.</p>
<p>Você combate IA com IA.</p>
<p>A primeira triagem tem que ser feita com LLM. Não pra aprovar automaticamente. Pra filtrar. Pra resumir. Pra comparar diff com objetivo declarado. Pra apontar cheiro ruim. Pra dizer “isso toca schema, precisa migração”. Pra dizer “isso altera comportamento público, precisa teste de compatibilidade”. Pra dizer “essa descrição do PR não bate com o código”. Só essa camada já elimina 80% do trabalho braçal.</p>
<p>O erro é deixar o agente decidir sozinho. O acerto é mandar o agente fazer o trabalho chato de investigação, e você decide.</p>
<p>É assim que eu faço.</p>
<h2>Meu fluxo real com PRs<span class="hx:absolute hx:-mt-20" id="meu-fluxo-real-com-prs"></span>
    <a href="#meu-fluxo-real-com-prs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quem acompanhou minha <a href="/2026/05/14/terminando-maratona-ia-sucesso-ou-fracasso/">maratona de IA</a> sabe que eu não cheguei aqui depois de assistir dois vídeos no YouTube. Passei semanas usando agente todo dia, em projeto real, quebrando coisa real, corrigindo coisa real. O que estou descrevendo aqui é o fluxo que sobrou depois disso, não teoria de LinkedIn.</p>
<p>Propaganda descarada: estou feliz que meus três projetos principais relacionados a IA estão recebendo contribuição quase todo dia:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a>, que já expliquei no post <a href="/2026/03/01/ai-jail-sandbox-para-agentes-de-ia-de-shell-script-a-ferramenta-real/">ai-jail: Sandbox para Agentes de IA</a>.</li>
<li><a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, que expliquei em <a href="/2026/05/23/criei-sistema-memoria-agentes-codigo-ai-memory/">Criei um Sistema de Memória pra Agentes de Código: ai-memory</a>.</li>
<li><a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>, do post <a href="/2026/05/24/criei-widget-waybar-omarchy-monitorar-uso-llms-ai-usagebar/">Criei um Widget de Waybar pra Omarchy pra Monitorar Uso de Planos de LLM: ai-usagebar</a>.</li>
</ul>
<p>O ai-memory em particular virou um experimento vivo. No momento em que escrevo, o GitHub mostra <strong>55 PRs fechados</strong> no projeto; pela API do <code>gh</code>, 46 foram mergeados e 9 foram fechados sem merge. Obrigado a todo mundo que contribuiu. Sério. Djalma, mrpaiva, pedrofjr, CaTeIM, azevedo-luis, brunoomariano, rikelmyso7, abnersajr e vários outros. É trabalho de muita gente.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/06/05/ia-open-source-contribuicoes/screenshot-ai-projects.png" alt="Tela de Pull Requests fechados do ai-memory no GitHub, mostrando 55 PRs fechados e vários PRs recentes de contribuidores."  loading="lazy" /></p>
<p>Também é óbvio, olhando o estilo, que a maioria desses PRs foi feita com ajuda de IA. E isso não é problema. Seria até hipócrita reclamar: <strong>o ai-memory inteiro foi escrito por IA</strong>. Eu não abri editor de código uma única vez pra escrever aquilo na mão.</p>
<p>Mas quase nenhum PR chega imediatamente mergeável. Esse é o ponto que muita gente ainda não entendeu. “Feito com IA” não significa “merge cego”. Significa “começa a auditoria”.</p>
<p>Meu prompt pra revisar PR é mais ou menos assim:</p>
<blockquote>
  <p>checa o último PR aberto como de costume: não confie no autor, audita o código inteiro a fundo, garante que ele cumpre o objetivo.</p>
<p>Vê se precisamos ajustar ou corrigir antes de mergear: não aceite regressão, não aceite queda de qualidade de código, confere se a cobertura de teste está correta.</p>
<p>Se mexe em build ou suporte de OS, confere GitHub Actions, CI, build limpo, wiring correto e documentação.</p>
<p>Resume o que o PR faz, o que você encontrou, e me pede aprovação antes de seguir.</p>

</blockquote>
<p>Repara em duas coisas. Primeiro: “não confie no autor”. Não é grosseria. É engenharia. A descrição do PR é uma hipótese. O diff é a evidência. Segundo: “me pede aprovação”. O agente investiga, eu decido.</p>
<p>Quando recebo vários PRs no mesmo dia, faço isso pra todos. Depois que todos entram, mando outro prompt:</p>
<blockquote>
  <p>checa os commits de hoje.</p>
<p>Mexemos em muito código, então preciso de uma auditoria completa no código tocado pra garantir que não adicionamos regressão, duplicação desnecessária, código morto ou magic values que deveriam virar constantes documentadas.</p>
<p>Segue princípios de clean code, confirma cobertura de testes e refatora o que precisar.</p>

</blockquote>
<p>Se o projeto já está em uso, adiciono a parte que muita gente esquece:</p>
<blockquote>
  <p>este projeto já está sendo usado. Não quebre compatibilidade.</p>
<p>Se mexemos em schema de banco ou estrutura de arquivos do usuário, precisa ter migração limpa no upgrade.</p>
<p>Upgrade não pode corromper dados.</p>

</blockquote>
<p>Isso não garante nada. Mas evita erro óbvio.</p>
<p>No ai-memory dá pra ver esse padrão no histórico. Depois de uma leva grande de PRs, tem commits meus de endurecimento. Um exemplo é <a href="https://github.com/akitaonrails/ai-memory/commit/65682dc"target="_blank" rel="noopener"><code>65682dc</code></a>, “fix(audit): address 5 BLOCKING audit findings from today&rsquo;s review”, mexendo em OAuth OpenAI, admin API, admission hooks e servidor MCP. Outro é a sequência de PRs <a href="https://github.com/akitaonrails/ai-memory/pull/65"target="_blank" rel="noopener"><code>#65</code></a>, <a href="https://github.com/akitaonrails/ai-memory/pull/68"target="_blank" rel="noopener"><code>#68</code></a>, <a href="https://github.com/akitaonrails/ai-memory/pull/70"target="_blank" rel="noopener"><code>#70</code></a>, seguida de commits de hardening em base path, wikilinks e strict mode. PR entra, depois vem auditoria, depois vem ajuste. Esse segundo passo é onde mora a diferença.</p>
<p>No <a href="https://github.com/akitaonrails/ai-memory/pull/77"target="_blank" rel="noopener"><code>#77</code></a>, de auto-scope por sessão/ator, o merge mexeu em muita coisa: <code>active_project</code>, router de hooks, servidor MCP, testes de stress e multiusuário. Mais de 3.800 linhas adicionadas. Eu não vou fingir que alguém lê isso manualmente linha por linha com a mesma consistência depois da quinta hora. O agente ajuda a mapear risco. Eu uso meu julgamento pra decidir o que precisa endurecer.</p>
<h2>Regressão acontece com ou sem IA<span class="hx:absolute hx:-mt-20" id="regressão-acontece-com-ou-sem-ia"></span>
    <a href="#regress%c3%a3o-acontece-com-ou-sem-ia" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O caso do rsync é útil porque expõe uma fantasia: a ideia de que código humano era seguro e código de IA é perigoso.</p>
<p>Não. Código é perigoso.</p>
<p>Rust é considerado linguagem segura. E Rust tem bug. Vai no issue tracker do Rust e olha. Zig quer perfeição e tem bug. Curl tem bug. Rsync tem bug. Linux tem bug. SQLite tem bug. Meu código tem bug. Seu código tem bug. Não existe linguagem mágica que produz software sem bug. Nunca vai existir.</p>
<p>Isso não é pessimismo. É limite fundamental. Em computação, a gente sabe há muito tempo que não existe verificador geral perfeito pra propriedades semânticas não triviais de programas. Halting problem, Rice&rsquo;s theorem, esse tipo de coisa. Você pode provar muito em domínios restritos. Pode usar type system melhor. Pode usar Rust pra eliminar classe inteira de memory safety. Pode usar teste, fuzzing, model checking, static analysis. Ótimo. Use tudo.</p>
<p>Mas “software arbitrário sem bug” é fantasia.</p>
<p>Humano erra por contexto incompleto, suposição errada, pressão, cansaço, falta de teste, falta de uso real. IA erra pelos mesmos motivos práticos: contexto incompleto, suposição errada, treino em código ruim, objetivo mal especificado, validação fraca. A diferença é escala. IA consegue produzir mais lixo por minuto. Também consegue produzir mais correção por minuto se você montar o processo direito.</p>
<h2>Eu uso porque eu uso<span class="hx:absolute hx:-mt-20" id="eu-uso-porque-eu-uso"></span>
    <a href="#eu-uso-porque-eu-uso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Outro ponto que aprendi na prática: é muito difícil manter bem projeto que você mesmo não usa.</p>
<p>Eu uso ai-memory todo dia. Uso ai-jail todo dia. Uso ai-usagebar todo dia. Usei a extensão <a href="https://github.com/akitaonrails/prettify-manga"target="_blank" rel="noopener">Prettify Manga Reader</a> na minha leitura real. Por isso pego bug que teste automatizado não pega.</p>
<p>No Prettify, por exemplo, os commits contam a história. <a href="https://github.com/akitaonrails/prettify-manga/commit/66c6728"target="_blank" rel="noopener"><code>66c6728</code></a> adicionou filtro noturno. Depois veio <a href="https://github.com/akitaonrails/prettify-manga/commit/b5bcb4d"target="_blank" rel="noopener"><code>b5bcb4d</code></a>, release 0.2.2, com suporte a Kindle Web Reader, toolbar, shortcuts e screenshot. Logo depois veio <a href="https://github.com/akitaonrails/prettify-manga/commit/0e6b7ee"target="_blank" rel="noopener"><code>0e6b7ee</code></a>, release 0.2.3, corrigindo o pareamento de spreads pra manter leitura direita-pra-esquerda sem bagunçar a ordem cronológica. Isso nasceu de uso real. Eu estava lendo, achei comportamento estranho, pedi pro LLM corrigir, testei, fiz release.</p>
<p>Esse é o loop saudável: usar, sentir dor, corrigir, testar de novo.</p>
<p>Em ai-jail, algumas contribuições vieram de uso que eu não teria priorizado sozinho. O <a href="https://github.com/akitaonrails/ai-jail/pull/56"target="_blank" rel="noopener"><code>#56</code></a> corrigiu PKGBUILD no AUR. O <a href="https://github.com/akitaonrails/ai-jail/pull/55"target="_blank" rel="noopener"><code>#55</code></a> encaminhou OSC 52 clipboard writes pelo proxy PTY de alt-screen. O <a href="https://github.com/akitaonrails/ai-jail/pull/51"target="_blank" rel="noopener"><code>#51</code></a> reconheceu Grok como agente conhecido e documentou máscara de privacidade de machine-id. São detalhes que aparecem quando outras pessoas usam a ferramenta em setups diferentes do meu.</p>
<p>Em ai-usagebar, isso fica mais claro ainda. O <a href="https://github.com/akitaonrails/ai-usagebar/pull/4"target="_blank" rel="noopener"><code>#4</code></a> adicionou fallback de macOS Keychain pras credenciais da Anthropic. Eu estou em Linux/Omarchy, não em macOS. Eu não ia achar esse bug no meu uso diário. O <a href="https://github.com/akitaonrails/ai-usagebar/pull/7"target="_blank" rel="noopener"><code>#7</code></a> corrigiu leitura de <code>credentials_path</code> customizado no widget. Também é caso de usuário com configuração diferente da minha. É aí que open source brilha: outra pessoa coça a própria coceira e melhora o projeto pra todo mundo.</p>
<p>Mas repare: quando eu não consigo testar manualmente, como macOS e Windows, eu dependo mais de CI. GitHub Actions roda macOS, roda Windows, roda Linux. Não substitui uso real, mas reduz risco. E quando alguém que usa aquele ambiente abre issue ou PR, isso vale ouro.</p>
<p>Manual testing ainda é a última linha de defesa. Se você abre mão dela, você está introduzindo bug por definição. Teste automatizado pega o que você lembrou de especificar. Uso real pega o que você nem sabia que precisava especificar.</p>
<p>Depois de mergear um conjunto grande, meu fluxo final costuma ser:</p>
<blockquote>
  <p>agora roda <code>bin/deploy</code> no meu home server e testa online.</p>
<p>Confere health, confere se ainda funciona como antes.</p>

</blockquote>
<p>De novo: não garante nada. Mas evita quebrar o óbvio.</p>
<h2>Não existe bala de prata<span class="hx:absolute hx:-mt-20" id="não-existe-bala-de-prata"></span>
    <a href="#n%c3%a3o-existe-bala-de-prata" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu não acho que todo projeto deve aceitar PR de IA. Também não acho que todo projeto deve banir. Não existe regra universal.</p>
<p>Se você é mantenedor solo de uma biblioteca crítica, sem tempo, sem CI decente, sem energia pra lidar com avalanche de PR ruim, banir AI-assisted contribution pode ser a decisão certa por enquanto. Melhor isso do que aceitar lixo e quebrar usuário.</p>
<p>Se você mantém comunidade pequena e quer ensinar contribuidores humanos, como o Zig argumenta, uma política anti-IA faz sentido dentro daquela cultura. Você está otimizando por formação de contributor, não por throughput de patch.</p>
<p>Mas se você mantém projeto que já recebe volume alto, que já tem CI, que já tem teste, que já tem usuário, eu acho que a adaptação é inevitável. Você vai precisar de triagem automatizada. Vai precisar de agente revisando PR. Vai precisar de bot resumindo issue. Vai precisar de ferramenta que diga “isso parece relatório de vulnerabilidade alucinado”.</p>
<p>Não porque IA é perfeita. Justamente porque IA é imperfeita e escala rápido.</p>
<h2>Minha conclusão<span class="hx:absolute hx:-mt-20" id="minha-conclusão"></span>
    <a href="#minha-conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>AI slop é real. Vai piorar antes de melhorar. Vai ter PR porcaria. Vai ter relatório de segurança falso. Vai ter regressão atribuída a IA que teria acontecido com humano também. Vai ter mantenedor puto. Vai ter usuário gritando. Normal.</p>
<p>Mas a direção não muda.</p>
<p>Código assistido por IA veio pra ficar. A porcentagem de código tocado por agente vai subir sem parar. Proibir pode funcionar localmente, por um tempo, em uma comunidade específica. No macro, é guerra perdida.</p>
<p>O caminho pragmático é fazer a IA trabalhar <strong>a nosso favor</strong>. Usar IA pra triagem. Usar IA pra auditoria. Usar IA pra comparar diffs. Usar IA pra achar regressão. Usar IA pra escrever teste que falha antes e passa depois. Usar IA pra fazer o trabalho chato que cansa humano.</p>
<p>E manter a decisão humana onde ela importa.</p>
<p>Eu já disse isso várias vezes e vou repetir: <strong>IA é um espelho</strong>.</p>
<p>Se você é relaxado, ela acelera sua relaxação. Seu código vira AI slop industrializado.</p>
<p>Se você é engenheiro de verdade, ela amplifica sua engenharia. Você continua exigindo teste, CI, compatibilidade, migração, revisão, clean code, deploy, teste manual. Só que agora faz isso 10 vezes mais rápido.</p>
<p>E pras empresas: se você está pensando “ótimo, agora economizo porque não preciso contratar tantos programadores”, até dá pra entender. Até certo ponto. Mas se vai colocar IA no fluxo, então precisa reforçar QA. Mais teste, mais revisão, mais processo de validação, mais gente boa pensando em qualidade. Se não fizer isso, está ferrado. Vai trocar custo de desenvolvimento por custo de bug em produção, retrabalho, incidente e cliente irritado.</p>
<p>Não existe volta ao mundo 100% manual. Melhor parar de gastar energia tentando fechar a caixa de Pandora e começar a construir processo decente em volta do que saiu dela.</p>
]]></content:encoded><category>open-source</category><category>agentes-de-codigo</category><category>engenharia-de-software</category></item><item><title>Boas práticas de projetos de código aberto com LLM - O Mínimo</title><link>https://akitaonrails.github.io/2026/05/30/boas-praticas-projetos-codigo-aberto-llm-o-minimo/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/05/30/boas-praticas-projetos-codigo-aberto-llm-o-minimo/</guid><pubDate>Sat, 30 May 2026 13:00:00 -0300</pubDate><description>&lt;p&gt;Nos últimos meses eu publiquei uma penca de projetos pessoais no GitHub. &lt;a href="https://github.com/akitaonrails/frank_fbi"target="_blank" rel="noopener"&gt;Frank FBI&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/FrankMega"target="_blank" rel="noopener"&gt;Frank Mega&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/FrankYomik"target="_blank" rel="noopener"&gt;Frank Yomik&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/FrankSherlock"target="_blank" rel="noopener"&gt;Frank Sherlock&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/frank_investigator"target="_blank" rel="noopener"&gt;Frank Investigator&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener"&gt;ai-jail&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener"&gt;ai-memory&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener"&gt;ai-usagebar&lt;/a&gt;, &lt;a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener"&gt;ghpending&lt;/a&gt;, e por aí vai. Alguns em Ruby on Rails, a maioria em Rust, um ou outro em Flutter. Programados em grande parte com Claude Code e Codex, no embalo da minha &lt;a href="https://akitaonrails.github.io/2026/05/14/terminando-maratona-ia-sucesso-ou-fracasso/"&gt;maratona de vibe coding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;E aqui está a parte que ninguém comenta quando fala de &amp;ldquo;fiz um projeto com IA&amp;rdquo;: gerar o código é a parte fácil. O difícil, o que separa um repositório que é só um amontoado de código de um projeto de código aberto de verdade, é tudo que vem &lt;strong&gt;depois&lt;/strong&gt; do &lt;code&gt;git init&lt;/code&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Nos últimos meses eu publiquei uma penca de projetos pessoais no GitHub. <a href="https://github.com/akitaonrails/frank_fbi"target="_blank" rel="noopener">Frank FBI</a>, <a href="https://github.com/akitaonrails/FrankMega"target="_blank" rel="noopener">Frank Mega</a>, <a href="https://github.com/akitaonrails/FrankYomik"target="_blank" rel="noopener">Frank Yomik</a>, <a href="https://github.com/akitaonrails/FrankSherlock"target="_blank" rel="noopener">Frank Sherlock</a>, <a href="https://github.com/akitaonrails/frank_investigator"target="_blank" rel="noopener">Frank Investigator</a>, <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a>, <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>, <a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>, e por aí vai. Alguns em Ruby on Rails, a maioria em Rust, um ou outro em Flutter. Programados em grande parte com Claude Code e Codex, no embalo da minha <a href="/2026/05/14/terminando-maratona-ia-sucesso-ou-fracasso/">maratona de vibe coding</a>.</p>
<p>E aqui está a parte que ninguém comenta quando fala de &ldquo;fiz um projeto com IA&rdquo;: gerar o código é a parte fácil. O difícil, o que separa um repositório que é só um amontoado de código de um projeto de código aberto de verdade, é tudo que vem <strong>depois</strong> do <code>git init</code>.</p>
<p>Eu tenho uma opinião forte sobre isso, então vou cravar logo: nenhum projeto de código aberto está pronto pra ser publicado sem três coisas. Na ordem de importância:</p>
<ol>
<li><strong>Superfície de instalação.</strong> O novo usuário precisa conseguir instalar e testar a ferramenta com o mínimo de atrito possível. Um comando, de preferência.</li>
<li><strong>Testes e CI automatizado.</strong> Pra que contribuições sejam mais fáceis e exista um chão comum sobre o que é minimamente aceitável pra entrar no projeto.</li>
<li><strong>Documentação.</strong> A versão curta e fácil de ler (o README) e um conjunto mais detalhado em <code>docs/</code>, pra novos contribuidores entenderem as decisões arquiteturais.</li>
</ol>
<p>Sem esses três, na minha visão, o projeto não está pronto. Pode ter o código mais genial do mundo dentro dele, não importa. Se um estranho não consegue instalar, não consegue confiar que o que ele mexer não vai quebrar tudo, e não consegue entender por que as coisas são do jeito que são, então você não tem um projeto de código aberto. Você tem um arquivo morto público.</p>
<p>E tem um bônus que virou parte essencial do meu fluxo: <strong>quando todos os meus projetos seguem o mesmo padrão, eu posso simplesmente pedir pro Claude Code ou pro Codex &ldquo;roda o deploy&rdquo; ou &ldquo;solta uma release&rdquo;, e eles conseguem.</strong> Porque a estrutura é previsível. <code>bin/deploy</code> faz a mesma coisa em todo projeto. A release sai de um tag. O agente não precisa adivinhar nada. Padronização é o que torna a automação confiável. Parece preciosismo de gente organizada, mas é o pré-requisito pra eu confiar de olhos fechados no que o agente vai rodar.</p>
<p>Vou destrinchar os três pilares e mostrar o mínimo de configuração que eu uso na prática.</p>
<h2>Pilar 1: A superfície de instalação<span class="hx:absolute hx:-mt-20" id="pilar-1-a-superfície-de-instalação"></span>
    <a href="#pilar-1-a-superf%c3%adcie-de-instala%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Essa é a mais importante e a mais negligenciada. As pessoas passam semanas afinando o algoritmo interno e aí soltam um README que diz &ldquo;clone o repo e rode <code>cargo build --release</code>&rdquo;. Aí o sujeito que tava curioso pra testar precisa ter Rust instalado, esperar dez minutos de compilação, e torcer pra não faltar uma lib de sistema. Você acabou de perder 90% dos seus usuários potenciais.</p>
<p>O ideal é oferecer <strong>vários caminhos</strong>, e deixar o usuário escolher o que combina com o ambiente dele. Olha o cabeçalho de instalação do ai-jail, que é o meu campeão de opções:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Homebrew (macOS ou Linux)</span>
</span></span><span class="line"><span class="cl">brew tap akitaonrails/tap <span class="o">&amp;&amp;</span> brew install ai-jail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AUR (Arch Linux) - binário pré-compilado</span>
</span></span><span class="line"><span class="cl">yay -S ai-jail-bin
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># cargo (qualquer plataforma com Rust)</span>
</span></span><span class="line"><span class="cl">cargo install ai-jail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># mise</span>
</span></span><span class="line"><span class="cl">mise use -g github:akitaonrails/ai-jail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Download direto do binário</span>
</span></span><span class="line"><span class="cl">curl -fsSL https://github.com/akitaonrails/ai-jail/releases/latest/download/ai-jail-linux-x86_64.tar.gz <span class="p">|</span> tar xz</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Cinco caminhos. O usuário de Arch usa <code>yay</code>. O do macOS usa <code>brew</code>. O dev Rust usa <code>cargo install</code>. Quem usa <a href="https://github.com/jdx/mise"target="_blank" rel="noopener">mise</a> pra gerenciar versões pega via mise. E quem só quer o binário baixa o tarball direto da release. Cada um pega o que já está acostumado, ninguém é forçado a instalar uma cadeia de ferramentas só pra experimentar.</p>
<h3>O segredo: compile uma vez, reempacote várias<span class="hx:absolute hx:-mt-20" id="o-segredo-compile-uma-vez-reempacote-várias"></span>
    <a href="#o-segredo-compile-uma-vez-reempacote-v%c3%a1rias" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A pegadinha que assusta no começo é achar que cada formato de pacote exige um build separado. Não exige. O truque é <strong>compilar o binário uma vez por arquitetura, e depois reempacotar o mesmo binário em todos os formatos.</strong></p>
<p>No meu pipeline em Rust, o job de build gera um tarball com o binário pronto e o <code>sha256</code>. As etapas de empacotamento seguintes (Docker, AUR, Homebrew) <strong>baixam esse tarball já compilado</strong> ao invés de recompilar. Reduz tempo de CI, garante que o byte que vai pro AUR é exatamente o mesmo que vai pro Docker, e elimina aquela classe de bug &ldquo;funciona num formato e quebra no outro&rdquo;.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Job de Docker reaproveitando o binário já compilado</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">docker-amd64</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">needs</span><span class="p">:</span><span class="w"> </span><span class="l">build-linux</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/download-artifact@v4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">ai-memory-linux-x86_64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">artifacts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Desempacota o binário pré-compilado</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">tar -xzf artifacts/ai-memory-linux-x86_64.tar.gz -C dist/docker/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">docker/build-push-action@v6</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">runtime-prebuilt-amd64 </span><span class="w"> </span><span class="c"># injeta o binário, não recompila</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O job do AUR faz a mesma coisa: baixa o tarball, calcula o <code>sha256</code>, e injeta no <code>PKGBUILD</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nv">X86_SHA</span><span class="o">=</span><span class="k">$(</span>awk <span class="s1">&#39;{print $1}&#39;</span> artifacts/ai-usagebar-linux-x86_64.tar.gz.sha256<span class="k">)</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s2">&#34;s/^sha256sums_x86_64=.*/sha256sums_x86_64=(&#39;</span><span class="nv">$X86_SHA</span><span class="s2">&#39;)/&#34;</span> packaging/aur/PKGBUILD-bin</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Esse é o conceito central. O binário é o artefato de verdade. RPM, DEB, AppImage, AUR, tarball Homebrew, imagem Docker, tudo isso é só <strong>embalagem em volta do mesmo binário</strong>.</p>
<p>Os dois trechos acima são recortes. Se você quiser ver o fluxo inteiro funcionando, o build-once-reuse completo (binário compilado uma vez, reaproveitado nos jobs de Docker e AUR) está no <a href="https://github.com/akitaonrails/ai-memory/blob/main/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> do ai-memory</a>, e a injeção de <code>sha256</code> no <code>PKGBUILD</code> está no <a href="https://github.com/akitaonrails/ai-usagebar/blob/main/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> do ai-usagebar</a>.</p>
<h3>O cardápio de formatos<span class="hx:absolute hx:-mt-20" id="o-cardápio-de-formatos"></span>
    <a href="#o-card%c3%a1pio-de-formatos" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Cada plataforma tem seu mundo. Segue o mínimo que vale conhecer:</p>
<p><strong>Linux</strong> é o mais fragmentado. As opções, do mais simples pro mais trabalhoso:</p>
<ul>
<li><strong>Tarball</strong> (<code>.tar.gz</code>): o denominador comum. Funciona em qualquer distro, é só descompactar e jogar no <code>PATH</code>. Sempre ofereça esse.</li>
<li><strong>AUR</strong> (Arch): dois pacotes, o <code>-bin</code> (binário pré-compilado, instala em segundos) e o de source (compila na máquina do usuário). Eu publico os dois com a action <code>KSXGitHub/github-actions-deploy-aur</code>. O <code>-bin</code> é o que todo mundo usa.</li>
<li><strong>AppImage</strong>: um arquivo único executável que carrega todas as dependências dentro. Bom pra apps desktop. O Frank Sherlock, que é Tauri, gera AppImage direto no build e eu ainda assino com GPG depois (o passo de assinatura está no <a href="https://github.com/akitaonrails/FrankSherlock/blob/master/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> dele</a>). Pra binário simples dá pra usar <code>appimagetool</code>.</li>
<li><strong>RPM e DEB</strong>: pra Fedora/openSUSE e Debian/Ubuntu. A ferramenta que poupa sua vida aqui é o <a href="https://github.com/goreleaser/nfpm"target="_blank" rel="noopener">nfpm</a>, que gera os dois a partir de um único <code>nfpm.yaml</code> declarativo, sem precisar entender as entranhas de <code>rpmbuild</code> ou <code>dpkg-deb</code>. Pega o binário já compilado e cospe os dois pacotes.</li>
</ul>
<p><strong>macOS</strong> tem dois alvos: Apple Silicon (<code>aarch64-apple-darwin</code>) e Intel (<code>x86_64-apple-darwin</code>). Você compila os dois separados ou gera um binário universal com <code>lipo</code>. E aqui mora a maior dor de cabeça da plataforma: <strong>assinatura e notarização</strong>. Sem isso, o Gatekeeper do macOS recusa abrir seu app. O fluxo é decodificar o certificado P12, importar num keychain temporário, assinar com <code>codesign --options runtime --timestamp</code>, e notarizar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">codesign --sign <span class="s2">&#34;</span><span class="nv">$APPLE_SIGNING_IDENTITY</span><span class="s2">&#34;</span> --options runtime --timestamp ./meu-binario
</span></span><span class="line"><span class="cl">ditto -c -k meu-binario notarize.zip
</span></span><span class="line"><span class="cl">xcrun notarytool submit notarize.zip <span class="se">\
</span></span></span><span class="line"><span class="cl">  --apple-id <span class="s2">&#34;</span><span class="nv">$APPLE_ID</span><span class="s2">&#34;</span> --password <span class="s2">&#34;</span><span class="nv">$APPLE_PASSWORD</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --team-id <span class="s2">&#34;</span><span class="nv">$APPLE_TEAM_ID</span><span class="s2">&#34;</span> --wait</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso exige uma conta paga de Apple Developer. É chato, mas é o preço de não dar erro de &ldquo;app danificado&rdquo; na cara do usuário. O job inteiro de assinatura e notarização, com a dança do keychain temporário, está no <a href="https://github.com/akitaonrails/ai-jail/blob/master/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> do ai-jail</a>.</p>
<p><strong>Windows</strong> é o mais simples de buildar (<code>x86_64-pc-windows-msvc</code>) e o mais espinhoso de assinar. Certificado de code signing pra Windows é caro e burocrático, então eu, sinceramente, não assino. Aceito que o SmartScreen vai dar um aviso na primeira execução e deixo isso claro no README. Pra projeto pessoal de código aberto, está de bom tamanho.</p>
<p><strong>Rust crates</strong> (<code>cargo publish</code>): se é uma biblioteca ou CLI em Rust, publicar no <a href="https://crates.io"target="_blank" rel="noopener">crates.io</a> dá o <code>cargo install</code> de graça. Uma linha no pipeline. Dica: torne idempotente, porque rodar de novo num tag já publicado dá erro. Eu faço um <code>grep</code> na saída procurando &ldquo;already exists&rdquo; pra não quebrar a release inteira por causa disso.</p>
<p><strong>Homebrew</strong>: a forma limpa é manter um tap próprio (<code>akitaonrails/homebrew-tap</code>). O pipeline atualiza a fórmula com a nova URL e o novo <code>sha256</code> a cada release. O usuário faz <code>brew tap</code> uma vez e depois é só <code>brew upgrade</code>.</p>
<p><strong>mise</strong>: o <a href="https://github.com/jdx/mise"target="_blank" rel="noopener">mise</a> consegue instalar direto de releases do GitHub sem você configurar nada do seu lado, contanto que seus tarballs sigam uma convenção de nome de plataforma. Você ganha esse caminho praticamente de graça só por ter releases bem nomeadas.</p>
<p>Repara num detalhe: AUR, Homebrew, mise e o download direto <strong>todos consomem o mesmo tarball da release</strong>. Você publica os binários uma vez, e quatro gerenciadores de pacote diferentes sabem se virar. É por isso que &ldquo;compile uma vez, reempacote várias&rdquo; é a regra de ouro.</p>
<h2>Pilar 2: GitHub Actions, releases por tag e changelog<span class="hx:absolute hx:-mt-20" id="pilar-2-github-actions-releases-por-tag-e-changelog"></span>
    <a href="#pilar-2-github-actions-releases-por-tag-e-changelog" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A segunda coisa que torna um projeto de código aberto sério é CI. Esquece o selo de &ldquo;build passing&rdquo; no README, o valor está no chão comum que ele cria: quando alguém manda um pull request, o CI roda os testes, o linter e o scanner de segurança, e você sabe na hora se aquela contribuição quebra alguma coisa. Sem isso, todo PR vira uma negociação manual e cansativa.</p>
<p>Nos meus projetos Rust o CI roda <code>cargo fmt --check</code>, <code>cargo clippy -D warnings</code>, <code>cargo test</code>, e <code>cargo audit</code>. Nos projetos Rails, é <code>rubocop</code>, <code>brakeman</code> (scanner de segurança), <code>bundler-audit</code> e a suíte de testes em Minitest. O <a href="https://github.com/akitaonrails/FrankMD"target="_blank" rel="noopener">FrankMD</a> sozinho tem mais de 1800 testes entre Ruby e JavaScript. O Frank Sherlock passa de 300 testes em Rust mais 300 no frontend. É essa rede de segurança que me deixa aceitar PR de estranho sem medo.</p>
<h3>Revisão de PR com LLM<span class="hx:absolute hx:-mt-20" id="revisão-de-pr-com-llm"></span>
    <a href="#revis%c3%a3o-de-pr-com-llm" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Os testes e o CI são a rede de baixo. Acima dela tem uma camada que virou central no meu fluxo: usar o próprio LLM pra revisar os pull requests. O Opus e o GPT são absurdamente bons em code review e em refatoração de qualidade. Melhores que eu na consistência, porque não cansam e não passam o olho por cima de 200 linhas só porque já é a quinta revisão do dia.</p>
<p>Eu tenho dois prompts que uso o tempo todo. O primeiro, pra um PR específico que acabou de chegar:</p>
<blockquote>
  <p>olha o PR aberto no github. não confie na descrição do autor. audita o código a fundo pra ver se faz sentido. garante que não tem regressão nem queda na qualidade do código. garante que a cobertura de testes está adequada. depois me diz o que você acha que a gente deveria fazer.</p>

</blockquote>
<p>Repara no &ldquo;não confie na descrição do autor&rdquo;. Isso é de propósito. A descrição do PR conta o que a pessoa achou que fez, e nem sempre bate com o que ela realmente fez. O LLM tem que ler o código de verdade, não o resumo.</p>
<p>O segundo prompt é pra depois de uma sessão longa de código ou de vários PRs mergeados de uma vez:</p>
<blockquote>
  <p>a gente mexeu em muito código. audita o código que esses PRs mudaram, procura código morto, duplicação desnecessária, valor mágico hardcoded que deveria ser constante e/ou estar melhor documentado, falta de cobertura de teste, mira nos princípios de <a href="/2026/04/20/clean-code-para-agentes-de-ia/">clean code</a>, e depois verifica se a documentação foi devidamente atualizada.</p>

</blockquote>
<p>Com o parecer na mão, eu decido. Pra PR incompleto, o que eu faço depende do tamanho e da minha prioridade naquele momento. Se é coisa pequena, eu mesmo corrijo direto no PR com um <code>amend</code>, respondo explicando o que mudei, e aí mergeio e fecho. Quando dá pra mergear mas não dá pra corrigir antes, mergeio e já solto um commit de correção logo em seguida. E quando é mudança grande, peço pro LLM responder o PR explicando por que a gente não vai mergear, com a direção certa do que precisa ser feito.</p>
<p>Foi assim que eu fechei quase 40 PRs e 20 issues só no ai-memory, em poucos dias. Esse volume não sai na mão, e também não pode sair no piloto automático.</p>
<p>E é nesse ponto que eu mais bato: nada disso é cego. Eu estou o tempo todo pilotando o LLM na direção desses objetivos. Ele faz a auditoria, joga as sugestões na mesa e até escreve o texto da resposta, mas quem decide mergear, corrigir ou recusar sou eu. O LLM é o revisor incansável; eu sou quem assina embaixo.</p>
<h3>O gatilho por tag<span class="hx:absolute hx:-mt-20" id="o-gatilho-por-tag"></span>
    <a href="#o-gatilho-por-tag" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A parte de release é separada do CI. Enquanto o CI roda a cada push e PR, a release dispara <strong>só quando você empurra um tag de versão</strong>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">tags</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;v*.*.*&#39;</span><span class="w">   </span><span class="c"># dispara em v1.2.3, v0.5.0, etc.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">workflow_dispatch</span><span class="p">:</span><span class="w"> </span><span class="c"># permite disparar manualmente também</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O fluxo de soltar uma versão vira isso:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git tag v0.5.0
</span></span><span class="line"><span class="cl">git push origin v0.5.0</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E pronto. O GitHub Actions percebe o tag, dispara o workflow de release, compila pros alvos, empacota tudo, assina o que precisa assinar, cria o GitHub Release e publica nos gerenciadores de pacote. Eu não toco em mais nada. Inclusive é literalmente isso que eu peço pro Claude Code: &ldquo;solta a v0.5.0&rdquo;. Ele faz <code>cargo set-version</code>, atualiza o CHANGELOG, commita, cria o tag, empurra, e o resto é o pipeline.</p>
<p>A matriz de build em Rust compila cada alvo na plataforma nativa dele:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">strategy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">matrix</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">include</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">os</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-22.04</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">x86_64-unknown-linux-gnu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">os</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-22.04-arm</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">aarch64-unknown-linux-gnu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">os</span><span class="p">:</span><span class="w"> </span><span class="l">macos-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">aarch64-apple-darwin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">os</span><span class="p">:</span><span class="w"> </span><span class="l">windows-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">x86_64-pc-windows-msvc</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Uma pegadinha de cross-compilation: se você compila ARM dentro de uma máquina x86 (via <a href="https://github.com/cross-rs/cross"target="_blank" rel="noopener">cross</a>), você <strong>não consegue rodar os testes</strong> daquele binário ali, porque a arquitetura não bate. A solução é rodar os testes só no alvo nativo e cross-compilar o resto sem testar. O ai-usagebar faz exatamente isso, x86 nativo e ARM via <code>cross</code>, na matriz do <a href="https://github.com/akitaonrails/ai-usagebar/blob/main/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> dele</a>. E sempre use cache de compilação: o <code>Swatinem/rust-cache</code> corta o tempo de build pela metade fácil.</p>
<h3>Release notes e changelog importam<span class="hx:absolute hx:-mt-20" id="release-notes-e-changelog-importam"></span>
    <a href="#release-notes-e-changelog-importam" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Aqui é onde muita gente relaxa, e não devia. Quando você solta uma release, a pessoa que está pensando em atualizar quer saber <strong>o que mudou</strong>. &ldquo;v0.5.0&rdquo; não diz nada. Um changelog diz.</p>
<p>Eu mantenho um <code>CHANGELOG.md</code> no formato <a href="https://keepachangelog.com/"target="_blank" rel="noopener">Keep a Changelog</a>, com uma seção por versão. E o pipeline extrai automaticamente a seção da versão atual pra colar no corpo do GitHub Release. Um <code>awk</code> simples resolve:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">awk -v <span class="nv">ver</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$VERSION</span><span class="s2">&#34;</span> <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">  BEGIN { hdr = &#34;## [&#34; ver &#34;]&#34; }
</span></span></span><span class="line"><span class="cl"><span class="s1">  index($0, hdr) == 1 { flag=1; next }
</span></span></span><span class="line"><span class="cl"><span class="s1">  flag &amp;&amp; index($0, &#34;## [&#34;) == 1 { exit }
</span></span></span><span class="line"><span class="cl"><span class="s1">  flag { print }
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span> CHANGELOG.md &gt; changelog_section.md</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Esse <code>awk</code> é o mesmo que roda na release do ai-usagebar (de novo no <a href="https://github.com/akitaonrails/ai-usagebar/blob/main/.github/workflows/release.yml"target="_blank" rel="noopener"><code>release.yml</code> dele</a>, que é o meu mais caprichado nessa parte). Aí eu anexo, depois do changelog, as instruções de instalação e os checksums <code>sha256</code> de cada artefato. O resultado é um GitHub Release que se explica sozinho: o que mudou, como instalar, e como verificar a integridade do download. O usuário lê e decide se atualiza. Esse é o tipo de cuidado que faz um estranho confiar no seu projeto.</p>
<h2>Pilar 3: Deploy de verdade, sem complicação<span class="hx:absolute hx:-mt-20" id="pilar-3-deploy-de-verdade-sem-complicação"></span>
    <a href="#pilar-3-deploy-de-verdade-sem-complica%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Os projetos que rodam como serviço (os Rails, principalmente) precisam ir pra algum lugar. E aqui eu vou na contramão do hype. Não tem Kubernetes. Não tem Kamal. Não tem pipeline de deploy de três estágios com aprovação manual.</p>
<p>Eu tenho um home server. Um <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">Minisforum MS-S1 Max rodando openSUSE MicroOS</a> que eu migrei recentemente, com um <a href="https://github.com/go-gitea/gitea"target="_blank" rel="noopener">Gitea</a> servindo de registry Docker privado na porta 3007. Pra um desenvolvedor solo com um servidor caseiro simples, isso é mais que suficiente. Toda a cerimônia de orquestração de cluster é resolver um problema que eu não tenho.</p>
<p>O deploy inteiro cabe num único <code>bin/deploy</code>. Ele faz três coisas: builda a imagem, empurra pro registry, e dá um SSH no servidor pra subir a versão nova:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl"><span class="nb">set</span> -euo pipefail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Config vem de um arquivo .gitignored, fora do repositório</span>
</span></span><span class="line"><span class="cl"><span class="nb">source</span> <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="nv">$0</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">/../config/deploy.env&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">IMAGE</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">REGISTRY_HOST</span><span class="si">}</span><span class="s2">:</span><span class="si">${</span><span class="nv">REGISTRY_PORT</span><span class="si">}</span><span class="s2">/akitaonrails/frank_fbi:latest&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;==&gt; Buildando a imagem...&#34;</span>
</span></span><span class="line"><span class="cl">docker build -t <span class="s2">&#34;</span><span class="nv">$IMAGE</span><span class="s2">&#34;</span> .
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;==&gt; Empurrando pro registry...&#34;</span>
</span></span><span class="line"><span class="cl">docker push <span class="s2">&#34;</span><span class="nv">$IMAGE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;==&gt; Subindo no servidor...&#34;</span>
</span></span><span class="line"><span class="cl">ssh <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DEPLOY_USER</span><span class="si">}</span><span class="s2">@</span><span class="si">${</span><span class="nv">DEPLOY_HOST</span><span class="si">}</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="s2">&#34;cd </span><span class="si">${</span><span class="nv">REMOTE_DIR</span><span class="si">}</span><span class="s2"> &amp;&amp; \
</span></span></span><span class="line"><span class="cl"><span class="s2">   docker compose pull &amp;&amp; \
</span></span></span><span class="line"><span class="cl"><span class="s2">   docker compose down --remove-orphans &amp;&amp; \
</span></span></span><span class="line"><span class="cl"><span class="s2">   docker compose up -d&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>É isso. <code>build</code>, <code>push</code>, <code>ssh</code> com <code>pull</code>, <code>down</code>, <code>up</code>. Quatro comandos no servidor remoto, encadeados num SSH só. Sem agente rodando lá, sem webhook, sem painel de controle. O servidor tem um <code>docker-compose.production.yml</code> que aponta pra imagem <code>:latest</code> do registry, e o <code>pull</code> traz a versão nova.</p>
<p>Repara que os dados sensíveis ficam num <code>config/deploy.env</code> que <strong>não vai pro Git</strong>. No repositório vai só o <code>config/deploy.env.example</code>, com a estrutura e valores fictícios. Esse padrão de &ldquo;exemplo versionado, real ignorado&rdquo; se repete em todo projeto meu, e é o que permite o projeto ser público sem vazar host, usuário ou caminho do meu servidor.</p>
<p>A imagem em si vem de um Dockerfile multi-estágio. O estágio de build instala as ferramentas de compilação, builda tudo, e o estágio final copia só o resultado pra uma imagem enxuta, rodando como usuário não-root. O compose de produção troca <code>build:</code> por <code>image:</code>, aponta os volumes pros caminhos persistentes do servidor (<code>/var/opt/docker/...</code>) e usa <code>restart: always</code> pra subir tudo de novo se o servidor reiniciar.</p>
<p>E de novo a beleza da padronização: como <strong>todo</strong> projeto meu tem esse mesmo <code>bin/deploy</code>, eu posso falar pro Claude Code &ldquo;faz o deploy do Frank FBI&rdquo; e ele sabe exatamente o que rodar. Não preciso lembrar de comando nenhum. A ferramenta é a documentação executável do processo.</p>
<h2>A lição: ninguém liga pra sua stack<span class="hx:absolute hx:-mt-20" id="a-lição-ninguém-liga-pra-sua-stack"></span>
    <a href="#a-li%c3%a7%c3%a3o-ningu%c3%a9m-liga-pra-sua-stack" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora a parte que eu mais queria escrever, e que vale mais que todos os snippets de YAML acima.</p>
<p>A maioria das pessoas, quando vai apresentar um projeto, concentra tudo na tecnologia. &ldquo;Olha meu banco vetorial novinho.&rdquo; &ldquo;Olha meu framework reativo de última geração.&rdquo; &ldquo;Usei tal arquitetura de microsserviços.&rdquo; E enchem o topo do README com isso: a lista de dependências, o diagrama de componentes, a stack.</p>
<p>Ninguém liga.</p>
<p>Sério. O usuário que chega no seu README não quer saber qual banco de dados você usou. Ele quer saber <strong>que problema isso resolve pra ele</strong>. Detalhe de implementação não pertence ao topo do README. Pertence ao <code>docs/</code>, pra quem vai contribuir. No README, o que importa é o caso de uso.</p>
<p>Olha a diferença. &ldquo;Servidor MCP em Rust com FTS5 e consolidação opcional via LLM&rdquo; não diz nada pra ninguém. Agora &ldquo;memória de longo prazo compartilhada entre Claude Code, Codex e Cursor, com handoff entre sessões&rdquo; — isso o cara entende na hora, porque é a dor que ele tem. Os dois descrevem o ai-memory. Um fala de tecnologia, o outro fala do problema resolvido.</p>
<p>O caso de uso é a coisa mais importante do projeto inteiro. Antes de escrever uma linha de código, a pergunta certa é &ldquo;que problema isso resolve, e pra quem?&rdquo;. Se você não consegue responder isso numa frase, você está construindo uma <strong>solução em busca de um problema</strong>. E solução em busca de problema é, na prática, solução que não resolve nada. Não importa quão elegante seja o código por dentro.</p>
<p>A camada de UX, a superfície que o usuário toca, vale muito mais que a engenharia interna. Um projeto com tecnologia medíocre mas que é trivial de instalar, que diz claramente que problema resolve, e que tem documentação honesta, vai mais longe que um projeto genial que ninguém consegue rodar. Toda vez.</p>
<p>Então o mínimo, o verdadeiro mínimo pra um projeto de código aberto, é isto: instalação fácil, CI que dá confiança, documentação que começa pelo problema. O algoritmo bonito vem muito depois disso na fila de prioridades. Os três pilares deste post existem pra servir uma coisa só, que é a experiência de quem chega de fora. Acerta isso primeiro. O resto é detalhe de implementação.</p>
]]></content:encoded><category>open-source</category><category>engenharia-de-software</category><category>devops</category></item><item><title>Como Contribuir no Blog do AkitaOnRails usando Docker</title><link>https://akitaonrails.github.io/2025/08/29/como-contribuir-no-blog-do-akitaonrails-usando-docker/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/08/29/como-contribuir-no-blog-do-akitaonrails-usando-docker/</guid><pubDate>Fri, 29 Aug 2025 22:37:16 -0300</pubDate><description>&lt;p&gt;Contribuir em projetos open source pode ser um saco quando você precisa configurar um ambiente de desenvolvimento complexo. No blog do AkitaOnRails, isso significava instalar Hugo Extended, Go, Ruby e suas dependências. Mas agora temos uma solução muito mais simples: &lt;strong&gt;Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;O Problema&lt;span class="hx:absolute hx:-mt-20" id="o-problema"&gt;&lt;/span&gt;
&lt;a href="#o-problema" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Antes, pra contribuir no blog você precisava:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instalar Hugo Extended&lt;/li&gt;
&lt;li&gt;Instalar Go&lt;/li&gt;
&lt;li&gt;Instalar Ruby&lt;/li&gt;
&lt;li&gt;Configurar todas as dependências&lt;/li&gt;
&lt;li&gt;Gerar o índice de posts manualmente&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Isso criava barreiras pra novos contribuidores e podia causar conflitos com outras instalações no sistema. Um inferno.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Contribuir em projetos open source pode ser um saco quando você precisa configurar um ambiente de desenvolvimento complexo. No blog do AkitaOnRails, isso significava instalar Hugo Extended, Go, Ruby e suas dependências. Mas agora temos uma solução muito mais simples: <strong>Docker</strong>.</p>
<h2>O Problema<span class="hx:absolute hx:-mt-20" id="o-problema"></span>
    <a href="#o-problema" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes, pra contribuir no blog você precisava:</p>
<ol>
<li>Instalar Hugo Extended</li>
<li>Instalar Go</li>
<li>Instalar Ruby</li>
<li>Configurar todas as dependências</li>
<li>Gerar o índice de posts manualmente</li>
</ol>
<p>Isso criava barreiras pra novos contribuidores e podia causar conflitos com outras instalações no sistema. Um inferno.</p>
<h2>A Solução: Docker<span class="hx:absolute hx:-mt-20" id="a-solução-docker"></span>
    <a href="#a-solu%c3%a7%c3%a3o-docker" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora você só precisa do Docker e Docker Compose. Tudo o resto roda em containers isolados.</p>
<h3>Setup Rápido<span class="hx:absolute hx:-mt-20" id="setup-rápido"></span>
    <a href="#setup-r%c3%a1pido" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Clone o repositório</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/akitaonrails/akitaonrails.github.io.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> akitaonrails.github.io
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Inicie o ambiente</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh start
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Acesse o blog</span>
</span></span><span class="line"><span class="cl">open http://localhost:1313</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Pronto! O blog está rodando e você pode começar a contribuir.</p>
<h2>Comandos Úteis<span class="hx:absolute hx:-mt-20" id="comandos-úteis"></span>
    <a href="#comandos-%c3%bateis" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O projeto inclui scripts que facilitam o desenvolvimento:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Ver todos os comandos disponíveis</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh <span class="nb">help</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Criar um novo post</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh new-post <span class="s2">&#34;Título do Meu Post&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ver logs do servidor</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh logs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Gerar índice de posts</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh generate-index
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Parar o ambiente</span>
</span></span><span class="line"><span class="cl">./scripts/dev.sh stop</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Criando um Post<span class="hx:absolute hx:-mt-20" id="criando-um-post"></span>
    <a href="#criando-um-post" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Criar um novo post é super simples:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./scripts/dev.sh new-post <span class="s2">&#34;Como Contribuir no Blog do AkitaOnRails&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O script automaticamente:</p>
<ul>
<li>Cria a estrutura de diretórios com a data atual</li>
<li>Gera um arquivo <code>index.md</code> com front matter básico</li>
<li>O servidor Hugo recarrega automaticamente</li>
</ul>
<h2>Estrutura de um Post<span class="hx:absolute hx:-mt-20" id="estrutura-de-um-post"></span>
    <a href="#estrutura-de-um-post" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O arquivo criado terá esta estrutura:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: &#34;Título do Post&#34;
</span></span><span class="line"><span class="cl">date: &#34;2025-08-29&#34;
</span></span><span class="line"><span class="cl">draft: false
</span></span><span class="line"><span class="cl">description: &#34;Descrição do post&#34;
</span></span><span class="line"><span class="cl">tags: [tag1, tag2]
</span></span><span class="line"><span class="cl">categories: [categoria]
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Conteúdo do post aqui...</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h2>Vantagens do Docker<span class="hx:absolute hx:-mt-20" id="vantagens-do-docker"></span>
    <a href="#vantagens-do-docker" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Para Contribuidores<span class="hx:absolute hx:-mt-20" id="para-contribuidores"></span>
    <a href="#para-contribuidores" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li><strong>Setup rápido</strong>: Apenas Docker necessário</li>
<li><strong>Ambiente isolado</strong>: Não interfere com sistema local</li>
<li><strong>Hot reload</strong>: Mudanças aparecem automaticamente</li>
<li><strong>Reproduzível</strong>: Funciona igual para todos</li>
</ul>
<h3>Para o Projeto<span class="hx:absolute hx:-mt-20" id="para-o-projeto"></span>
    <a href="#para-o-projeto" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li><strong>Menos issues</strong>: Ambiente consistente</li>
<li><strong>Mais contribuidores</strong>: Barreira de entrada menor</li>
<li><strong>Manutenção</strong>: Fácil de atualizar dependências</li>
</ul>
<h2>Como Funciona<span class="hx:absolute hx:-mt-20" id="como-funciona"></span>
    <a href="#como-funciona" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O ambiente Docker inclui:</p>
<ul>
<li><strong>Hugo Extended</strong>: Gerador de sites estáticos</li>
<li><strong>Go</strong>: Para módulos Hugo</li>
<li><strong>Ruby</strong>: Para script de geração de índice</li>
<li><strong>Volumes</strong>: Para hot reload dos arquivos</li>
</ul>
<p>O <code>docker-compose.yml</code> mapeia os diretórios locais para o container, então quando você edita um arquivo, o Hugo detecta a mudança e recarrega automaticamente.</p>
<h2>Desenvolvimento Local (Alternativa)<span class="hx:absolute hx:-mt-20" id="desenvolvimento-local-alternativa"></span>
    <a href="#desenvolvimento-local-alternativa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se preferir não usar Docker, ainda é possível instalar tudo localmente:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Gerar índice</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> content <span class="o">&amp;&amp;</span> ruby generate_index.rb
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rodar servidor</span>
</span></span><span class="line"><span class="cl">hugo server --logLevel debug --disableFastRender -p <span class="m">1313</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Mas o Docker é muito mais prático!</p>
<h2>Próximos Passos<span class="hx:absolute hx:-mt-20" id="próximos-passos"></span>
    <a href="#pr%c3%b3ximos-passos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol>
<li><strong>Teste o ambiente</strong>: Execute <code>./scripts/dev.sh start</code></li>
<li><strong>Crie um post</strong>: Use <code>./scripts/dev.sh new-post</code></li>
<li><strong>Explore o código</strong>: Veja como personalizar layouts</li>
<li><strong>Contribua</strong>: Faça um Pull Request</li>
</ol>
<hr>
<p><strong>Dica</strong>: O ambiente Docker salva automaticamente suas mudanças e recarrega o servidor. Basta editar os arquivos e ver as mudanças em tempo real! 🚀</p>
]]></content:encoded><category>open-source</category><category>containers</category><category>tutoriais</category></item><item><title>Omakub pra Manjaro e ArchWSL</title><link>https://akitaonrails.github.io/2024/10/30/omakub-pra-manjaro-e-archwsl/</link><guid isPermaLink="true">https://akitaonrails.github.io/2024/10/30/omakub-pra-manjaro-e-archwsl/</guid><pubDate>Wed, 30 Oct 2024 12:41:00 -0300</pubDate><description>&lt;p&gt;Algum tempo atrás o DHH lançou uma ferramenta open source chamada &lt;a href="https://omakub.org"target="_blank" rel="noopener"&gt;Omakub&lt;/a&gt; que instala diversas ferramentas e configura um ambiente de desenvolvimento moderno em Ubuntu. Ele vai além de coisas só de terminal e também configura vários aspectos do ambiente GNOME. Vale a pena experimentar, nem que seja numa Virtual Machine, pra ver como fica.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/1ddbjucxzkah963tou557907bkmr" alt="Omakub - demo" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Eu gostei bastante das escolhas do DHH, ele sempre foi um cara de Mac, eu também. Mas eu migrei de volta pra Linux quase 10 anos atrás. O motivo foi porque eu evangelizava tech pra desenvolvedores júniors e no Brasil ficou inviável incentivar Macs. E não queria que parecesse que sem usar Macs você estaria automaticamente em grande desvantagem. Então passei a usar exclusivamente Linux e no blog fiz vários posts explicando sobre isso, como estes:&lt;/p&gt;</description><content:encoded><![CDATA[<p>Algum tempo atrás o DHH lançou uma ferramenta open source chamada <a href="https://omakub.org"target="_blank" rel="noopener">Omakub</a> que instala diversas ferramentas e configura um ambiente de desenvolvimento moderno em Ubuntu. Ele vai além de coisas só de terminal e também configura vários aspectos do ambiente GNOME. Vale a pena experimentar, nem que seja numa Virtual Machine, pra ver como fica.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/1ddbjucxzkah963tou557907bkmr" alt="Omakub - demo"  loading="lazy" /></p>
<p>Eu gostei bastante das escolhas do DHH, ele sempre foi um cara de Mac, eu também. Mas eu migrei de volta pra Linux quase 10 anos atrás. O motivo foi porque eu evangelizava tech pra desenvolvedores júniors e no Brasil ficou inviável incentivar Macs. E não queria que parecesse que sem usar Macs você estaria automaticamente em grande desvantagem. Então passei a usar exclusivamente Linux e no blog fiz vários posts explicando sobre isso, como estes:</p>
<ul>
<li><a href="https://www.akitaonrails.com/2015/11/10/situacao-brasil-no-macs-for-the-rest-of-us"target="_blank" rel="noopener">2015 - Situação Brasil: No Macs for the Rest of Us</a></li>
<li><a href="https://www.akitaonrails.com/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft"target="_blank" rel="noopener">2016 - The Year of Linux on the Desktop, by Microsoft ??</a></li>
<li><a href="https://www.akitaonrails.com/2017/01/12/off-topic-por-que-estamos-todos-migrando-para-longe-da-apple"target="_blank" rel="noopener">2017 - Off-Topic - Why are we all moving away from Apple?</a></li>
</ul>
<p>Sem contar os diversos videos com setups que fiz no meu canal, como estes:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=epiyExCyb2s"target="_blank" rel="noopener">O Guia Definitivo de Ubuntu pra Devs Iniciantes</a></li>
<li><a href="https://www.youtube.com/watch?v=sjrW74Hx5Po"target="_blank" rel="noopener">O Melhor Setup Dev com Arch e WSL2</a></li>
</ul>
<p>Em 2024, com exceção se precisa desenvolver apps pra iOS ou coisas específicas de .NET, usar distros Linux é superior a usar Windows ou MacOS. Antigamente eu diria um &ldquo;mas&rdquo; se quiser jogar, aí seria obrigado a fazer dual-boot com Windows. Mas até isso Linux já superou Macs graças aos esforços da Valve e as comunidades open source em torno de projetos como Proton. Hoje, uma quantidade absurda de jogos novos de PC rodam liso em Linux, basta instalar Steam e já era.</p>
<p>Não é o tema do artigo, mas já que toquei no assunto, estava justamente  assistindo um review do <a href="https://bazzite.gg/"target="_blank" rel="noopener">BazziteOS</a> rodando no <strong>Asus ROG Ally</strong> (meu favorito), criando um Steam Deck ainda mais potente. É Fedora rodando num handheld, com uma interface tão boa que ninguém sabe que é Linux por baixo, rodando jogos com mesma performance que em Windows. É impressionante mesmo. Quem ficou totalmente pra trás em games foi a Apple.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/OwWRCrGoXV0"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Isso tudo dito, o DHH mudou pra um hardware muito bacana de uma empresa pequena e nova chamada <a href="https://frame.work/"target="_blank" rel="noopener">Framework</a>, que faz notebooks modulares. A idéia é não precisar jogar tudo fora quando quiser fazer upgrades de hardware. Só trocar o módulo pra um mais novo. E não só coisas simples como trocar uma porta USB-A por uma USB-C, mas até trocar GPU, trocar placa-mãe, monitor.</p>
<p>É um conceito muito bacana que eu gostaria que mais fabricantes se comprometessem a fazer. Evita lixo eletrônico desnecessário, pra começar, muito mais fácil de reparar partes, sem ter que jogar tudo fora, como acontece com um Macbook. Vi isso pela primeira vez no canal do Linus Tech Tips porque o Linus Sebastian se tornou um dos primeiros investidores anjo deles.</p>
<p><img src="https://images.prismic.io/frameworkmarketplace/Zv77LrVsGrYSwWcu_3A-marketplace-parts-2x.png?auto=format,compress" alt="Framework"  loading="lazy" /></p>
<p>A maioria dos fabricantes que suportam Linux, costumam oferecer algum tipo de suporte a Ubuntu. Ele acabou meio que se tornando o &ldquo;padrão&rdquo; de Linux pra usuários comuns. Na dúvida, instale Ubuntu. E não é uma má escolha. Se escolher Ubuntu, use o projeto <a href="https://github.com/basecamp/omakub"target="_blank" rel="noopener">Omakub</a> oficial do DHH, que vai configurar tudo bonitinho pra você.</p>
<p>Eu não gosto de Ubuntu, é uma escolha pessoal (e cada um de Linux vai ter sua própria opção. Já sei que o primeiro comentário vai ser alguém falando de porque todo mundo não usa NixOS de uma vez &hellip;). Não precisa ficar preocupado nem se sentir mal por usar Ubuntu, não tem absolutamente nada de errado com ele. Escolher distros é que nem escolher marca de carro.  Qual a diferença de Ferrari, Lambo, Porsche, McLaren? Você vai achar ruim se prefere Lambo e eu prefiro McLaren?</p>
<p>Além disso, puristas vão dizer que é pra ficar no Arch Linux puro, mas faz anos que prefiro <a href="https://manjaro.org/products/download/x86"target="_blank" rel="noopener"><strong>Manjaro GNOME</strong></a> no meu PC desktop e em notebook prefiro ficar com Windows 11 mesmo e WSL2 rodando <a href="https://github.com/yuk7/ArchWSL"target="_blank" rel="noopener"><strong>ArchWSL</strong></a>. Ainda recomendo brincar com Arch puro pra aprender. Mas depois de tantos anos, como é meu caso, prefiro um instalador que faz igual Ubuntu: vai do zero ao desktop em poucos cliques.</p>
<p>Então não teve jeito, fui obrigado a fazer um fork e ajustar o Omakub num novo projeto, o <a href="https://github.com/akitaonrails/omakub-mj"target="_blank" rel="noopener"><strong>OMAKUB-MJ</strong></a> (o nome não tá muito correto, deveria ser algo como OMAKAMJ ou algo assim que seria Omakase com Manjaro, mas fica feio, mandem sugestões nos comentários). Migrei todos os comandos de Apt pra Yay, além de diversos outros ajustes. Rodei no meu PC principal (depois de ter testado bastante numa VM, claro) e agora ficou bonitão assim:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/8sq62mkbc4kxuzqk5opej275xpuc" alt="Omakub-MJ"  loading="lazy" /></p>
<p>Igual à versão de Ubuntu, ele ativa o tema Tokyo Night, mas dá pra mudar pra vários outros temas. Depois de instalado, vai ter um comando <code>omakub</code> no terminal que abre um menu com várias opções, incluindo mudar tamanho das fontes ou trocar temas:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/7qvbv50ipzifo3cv5bhe3lb64kq8" alt="Omakub trocar tema"  loading="lazy" />
Tem <strong>MUITAS</strong> coisas legais pré-instaladas, por isso repito pra ler <a href="https://manual.omakub.org/"target="_blank" rel="noopener">o manual</a> que é muito bonito, bem escrito, e eu não mudei nenhuma das configurações principais (só o zellij, já explico), então tudo que vale pra versão Ubuntu também vale pra Manjaro. E eu sei que a maioria de vocês tem preguiça de abrir o manual, mas uma coisa que o DHH sabe fazer é uma documentação atraente:</p>
<p><a href="https://manual.omakub.org/1/read#leaf_29"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/xdsu6gghf5ncic9rh852hv1c7bcz" alt="Manual Omakub"  loading="lazy" /></a></p>
<h3>Migrando pra Manjaro<span class="hx:absolute hx:-mt-20" id="migrando-pra-manjaro"></span>
    <a href="#migrando-pra-manjaro" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Enfim, pra migrar de Ubuntu pra Manjaro, a primeira coisa que fiz foi trocar comandos apt por yay, coisa simples assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"><span class="gd">- sudo apt install -y alacritty
</span></span></span><span class="line"><span class="cl"><span class="gi">+ yay -S alacritty --noconfirm
</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Mas rapidamente encontramos as partes de porque eu prefiro o <strong>YAY</strong> do que <strong>APT</strong> como gerenciador de pacotes:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"><span class="gd">-  sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
</span></span></span><span class="line"><span class="cl"><span class="gd">-  echo &#34;deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main&#34; \| sudo tee /etc/apt/sources.list.d/brave-browser-release.list
</span></span></span><span class="line"><span class="cl"><span class="gd">-  sudo apt update -y
</span></span></span><span class="line"><span class="cl"><span class="gd">-  sudo apt install -y brave-browser
</span></span></span><span class="line"><span class="cl"><span class="gi">+  yay -S brave-browser --noconfirm
</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Em Ubuntu, tudo que a própria Canonical não controla, fica em repositórios de terceiros, então precisamos explicitamente adicionar esses repositórios antes de conseguir instalar seus pacotes.</p>
<p>Em Arch é a mesma coisa, com o Pacman só conseguimos instalar os pacotes oficiais que o grupo do Arch controla e testa. Mas existe um repositório de terceiros chamado AUR, o Arch User Repository. Daí instalamos ferramentas como Pamac (que vem instalado em muitas distros) ou o Yay (que eu gosto mais). Por baixo eles rodam Pacman, mas oferecem um único comando que serve pros dois: instalar pacotes oficiais e instalar pacotes do AUR, com os mesmos comandos. Então não tem que ficar manualmente gerenciando trocentos repositórios externos.</p>
<p>Foi bem fácil converter porque no AUR tem tudo que precisamos. É muito raro precisar de um software e não achar no AUR. Além disso fiz outra modificação: eu prefiro manter aplicativos gráficos como Spotify ou Discord instalados via <strong>Flatpak</strong>.</p>
<p>Não é nem por razões de segurança. Prefiro que aplicativos de terceiros mexam no sistema operacional abaixo o menos possível. E muitos deles precisam de várias dependências. Quando preciso fazer um upgrade geral, demora mais porque vem um monte de pacotes de dependência junto que eu nem precisava. Pelo menos com Flatpak, as dependências ficam isoladas em imagens de containers.</p>
<p>Enfim, quando preciso atualizar o sistema só faço <code>yay -Syyuu</code> e quando quero atualizar aplicativos, basta fazer <code>flatpak update -y</code>, assim posso rodar separadamente. As únicas exceções são editores de texto como Visual Studio Code, nesse caso prefiro que ele tenha acesso ao sistema de arquivos todo mesmo, e não ter que lidar com permissões de acesso em containers de Flatpak, por isso instalo via Yay.</p>
<h3>GNOME<span class="hx:absolute hx:-mt-20" id="gnome"></span>
    <a href="#gnome" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Adicionei dois aplicativos opcionais, o Bitwarden (o DHH prefere o 1password, ambos são bons) e o Discord. Aplicativos de Flatpak são fáceis de instalar, nem precisa estar num instalador como esse, mas coloquei só mais esses por conveniência pra mim mesmo. Obviamente você pode instalar depois o que quiser. Basta procurar com <code>flatpak search</code> e instalar com <code>flatpak install</code>.</p>
<p>No lado Gnome, o DHH escolheu apps como <a href="https://flameshot.org/"target="_blank" rel="noopener">Flameshot</a> pra substituir o app de screenshot do Gnome. Uma das vantagens é que depois de tirar a foto de tela, dá pra imediatamente editar a imagem antes de salvar. Pra ter preview rápido de imagens no gerenciador de arquivos Nautilus, ele escolheu o <a href="https://gitlab.gnome.org/GNOME/sushi"target="_blank" rel="noopener">Gnome Sushi</a>. Todas essas opções são muito boas e você pode ver tudo que é instalado no desktop no diretório <a href="https://github.com/akitaonrails/omakub-mj/tree/master/install/desktop"target="_blank" rel="noopener">install/desktop</a>. Cada app é um script separado.</p>
<p>De todos, o único que realmente não conhecia é o <a href="https://play.google.com/store/apps/details?id=org.localsend.localsend_app&amp;hl=en"target="_blank" rel="noopener"><strong>Localsend</strong></a>. Mas agora já instalei no meu Linux, Windows, smartphone e tudo mais. É o jeito mais fácil de transferir arquivos entre máquinas na mesma rede. Igual o Airdrop de iPhone. Vale a pena ter instalado em tudo.</p>
<p><a href="https://localsend.org/pt-BR"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/fnpyyqis498wth9do5qodt7xli0x" alt="Localsend"  loading="lazy" /></a></p>
<p>Outro app que eu não conhecia é o <a href="https://ulauncher.io/"target="_blank" rel="noopener">Ulauncher</a> que é um executador de aplicações, igual a barra de Spotlight de Mac. Basta apertar <code>Super/Tecla de Windows + Espaço</code> e ele abre uma barra onde podemos digitar o nome do app que queremos abrir:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ttbw39v9y0r17rw16x4s99p45epe" alt="Ulauncher"  loading="lazy" /></p>
<p>Se fosse só isso, não é muito útil porque em Gnome, só de apertar <code>Super</code> já dá pra digitar o nome de apps. Mas o interessante é que ele faz mais que executar apps. Depois fuce a <a href="https://ext.ulauncher.io/"target="_blank" rel="noopener">Página de Extensions</a> pro Ulauncher. Tem coisas como calculadoras, controlador de Spotify, pesquisador de arquivos, facilitador pra editores com Obsidian ou Notion, pesquisador de snippets de código pra VS Code, tradutores, integradores pra serviços de GPT e um dos meus favoritos, facilitador de Emojis:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/dsjsfzdr6rddfrqqtlcmj3uu9891" alt="Ulauncher Emojis"  loading="lazy" /></p>
<p>O Omakub ajusta bastante coisa do Gnome. Em particular adiciona várias extensions que mudam o comportamento do ambiente gráfico:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ocm6xifnbygf4cagdb5icjusz1t6" alt="Gnome Extensions"  loading="lazy" /></p>
<p>Depois vale fuçar as configurações de um por um. Por exemplo, ele instala e já configura a extension <a href="https://extensions.gnome.org/extension/4548/tactile/"target="_blank" rel="noopener"><strong>Tactile</strong></a> que é provavelmente a melhor pra organizar as janelas em &ldquo;tiles&rdquo; ou &ldquo;azulejos&rdquo;, ou seja, pra facilitar alinhar uma janela em cima ou do lado da outra de forma proporcional. Ele faz isso pré-dividindo a tela em áreas e atribuindo letras a cada área, assim fica fácil de fazer uma janela se encaixar numa dessas áreas.</p>
<p>Por exemplo, com o comando <code>Super + T</code> aparece esse grid. Se digitar &ldquo;w&rdquo; duas vezes, minha janela de Alacritty se encaixa no topo, no meio, na área marcada com &ldquo;W&rdquo;:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ofqh86tf3l3p6eviesq1dhosbio2" alt="Tactile W"  loading="lazy" /></p>
<p>Normalmente, eu gosto de ter a janela aberta no meio do monitor, maximizado na vertical, sem esticar pros lados, especialmente pra ler ou digitar textos. Então posso fazer <code>Super + T</code> e logo depois <code>W e S</code> pra marcar duas áreas:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ijvlxzdvykxn12nbkvcwy73s5i6p" alt="Tactile W S"  loading="lazy" /></p>
<p>Mas também continuo podendo teclar <code>F11</code> ou <code>Super + seta pra cima</code> pra maximizar a janela na tela inteira. Ou usar as combinações clássicas de Windows como <code>Super + seta esquerda</code> ou <code>Super + seta direita</code> pra fazer a janela usar metade vertical da tela, desta forma:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/jjznbiwblc0zdlfydrmdqqxuxwkk" alt="Tactile lado a lado"  loading="lazy" /></p>
<p>Vale fuçar a documentação e as configurações da extension Tactile pra dividir as áreas do jeito que mais gosta. Isso vai variar bastante caso use monitor secundário na vertical, ou use monitor Ultra Wide. E nesse caso é onde esse tipo de extensão vai fazer mais diferença pra manter suas janelas organizadas.</p>
<h3>Neovim e LazyVim<span class="hx:absolute hx:-mt-20" id="neovim-e-lazyvim"></span>
    <a href="#neovim-e-lazyvim" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu mencionei Visual Studio Code, e ele está aqui pra quem gosta, mas quem acompanha meus videos e artigos, sabe que sou usuário de Vim de longa data. E a comunidade Vim não pára quieta. Hoje em dia tem um fork mais moderno, o <strong>NEOVIM</strong>, que se tornou o mais usado.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/k00pryy0c676m4ryssrt7d48aqqr" alt="LazyVim"  loading="lazy" /></p>
<p>Em cima do NeoVim podemos instalar plugins manualmente e ficar ajustando configuração pela eternidade, ou usar configs já prontas. Até poucos meses atrás eu usava o LunarVim, mas ele meio que caiu em desuso. Depois passei a usar o <a href="https://astronvim.com/"target="_blank" rel="noopener">AstroNVIM</a>, que resolve muito bem, mas parece que a maioria das pessoas passou a convergir pro <a href="https://www.lazyvim.org/"target="_blank" rel="noopener"><strong>LazyVim</strong></a>. Confesso que fico em dúvida entre qual é o melhor, AstroNvim ou LazyVim, mas vou ficar com o LazyVim por enquanto.</p>
<p>No fundo vão usar muitos dos mesmos plugins, análise de código vai ter plugins pra LSP, navegação vai ter o mesmo neo-tree, o mesmo telescope e assim por diante. Por isso vai ser muito subjetivo mesmo. Acho que nenhum dos dois tem como errar.</p>
<p>Muita gente acha que esses pacotes são contra a filosofia de &ldquo;aprenda a configurar você mesmo&rdquo;. E de fato, se puder, recomendo mesmo que monte sua configuração do zero. Mas faça isso só uma vez, desfaça e use um desses pacotes. Na realidade, essa noção começa a falhar porque esses plugins, sejam eles escritos no antigo VimScript ou na mais moderna linguagem Lua, são programas completos. Pegue plugins como Neo-Tree ou Telescope. Você não fez nem nunca vai fazer nenhum deles do zero, isso é pra poucos.</p>
<p>Na prática, o NeoVim já poderia vir pré-instalado com eles, pra você não faria diferença, porque são modernos, bem escritos, customizáveis, e não ficam no seu caminho. Não vem porque a idéia toda de um Vim é ser hiper-leve, pra podermos usar rapidamente dentro de um container, ou conectando num outro servidor via SSH, sem GUI, sem dependências, se bugs de interface nem nada disso. Só no nosso desktop, em ambiente controlado, gostaríamos dele tão pesado e funcional quanto um VS Code.</p>
<p>Depois tente dar uma olhada na configuração de um LazyVim, é muito mais coisa do que uma única pessoa deveria se preocupar. E saem plugins novos todos os dias, plugins antigos deixam de ser usados, não tem como você ficar de olho em tudo isso. Melhor ser um esforço dividido pela comunidade e a gente ter a oportunidade de usar o que tem de melhor só dando um update.</p>
<p>Sinceramente, seja Astronvim ou LazyVim, eu não tenho nem vontade e nem disposição de tentar montar do zero uma config como essa. E o que eles me oferecem &ldquo;out-of-the-box&rdquo; está perfeito já, eu não preciso ficar mudando. Basta usar. Você tem que ser muito chato pra achar que pode fazer melhor. Se achar isso, faça um pull request pra esses projetos então. Será tempo melhor gasto.</p>
<h3>ZelliJ<span class="hx:absolute hx:-mt-20" id="zellij"></span>
    <a href="#zellij" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu sou usuário de Tmux de longa data. E meus amigos usavam o antigo Screen, antes disso ainda. Eu lembro quando falávamos do Tmux como o software mais moderno. Agora ele é o legado e o mais moderno é o ZelliJ.</p>
<p>Todos eles são gerenciadores de sessão. Pense quando você se conecta num servidor remoto via SSH e fica trabalhando nele. Daí temos uma pane na internet ou cai a luz. O que acontece? Não só a conexão fecha, mas seja lá o que você estava rodando remotamente vai crashear porque o app está atrelado - é um filho - da sua shell (bash, zsh). E sua shell estava atrelada à sessão SSH. Quando a conexão cai, o SSH mata o shell que mata sua app. Você perde o que estava fazendo ou, pior, se o programa estava no meio, ele vai crashear no meio e pode corromper alguma coisa.</p>
<p>Em vez de correr esse risco, quando logar via SSH, imediatamente abra uma sessão de Screen, Tmux ou Zellij. Agora o shell vai abrir atrelado ao Zellij. Se a conexão cair e o SSH fechar, o ZelliJ vai continuar rodando, ele fica atrelado a um daemon na máquina remota. Seu shell e seu app ficam atrelados ao ZelliJ e não à sua sessão SSH.</p>
<p>Quando a luz voltar ou a internet voltar, basta conectar via SSH de novo e rodar o comando <code>zellij attach</code> ou <code>tmux attach</code>  e ele vai &ldquo;re-anexar&rdquo; à última sessão de apps, e você vai voltar ao seu shell, como se nunca tivesse saido de lá. Quaisquer apps que estivessem rodando e processando, ia continuar até acabar, normalmente, como qualquer app em background. Essa é a vantagem principal de um gerenciador como ZelliJ ou Tmux.</p>
<p>Mesmo se não estiver trabalhando numa máquina remota via SSH. Mesmo no seu desktop. Digamos que esteja brincando de editar configurações, instalar extensions e coisas assim. E do nada seu GNOME ou seu X resolvam dar pau, crashear e reiniciar. Todos os apps gráficos vão crashear junto, incluindo seu app de terminal, como Alacritty e junto com ele, qualquer shell e programa em linha de comando que estivesse rodando, como seu NeoVim, podendo perder código que estava editando e não salvou.</p>
<p>Não mais. Quando o X reiniciar, basta reabrir seu Alacritty e, mesma coisa, fazer um <code>zellij attach</code> pra voltar exatamente onde estava. Inclusive, se dentro do zellij você estava remotamente conectado a um servidor, monitorando com htop ou algo assim, nada vai fechar, vai continuar tudo conectado. Isso é mais uma camada de estabilidade pra você.</p>
<p>Veja este exemplo abaixo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/wmxxa8a061mg6ius1chgukb4k86m" alt="ZelliJ"  loading="lazy" /></p>
<p>O Omakub já configura o ícone do Alacritty pra abrir uma janela de ZelliJ. Se seguir a configuração padrão, teclando <code>Ctrl P D</code>, sendo &ldquo;P&rdquo; pra Painel e &ldquo;D&rdquo; pra &ldquo;D&quot;ividir a janela horizontalmente, dá pra abrir dois programas um em cima do outro.</p>
<p><strong>ATENÇÃO:</strong> este é o único app do Omakub que fui obrigado a mudar os shortcuts, por isso o que tem na documentação oficial não vai bater.</p>
<p>O problema é o seguinte: vários apps de terminal, como NeoVim, tem vários shortcuts de navegação. Se digitar &ldquo;Espaço + E&rdquo; vai abrir o painel de exploração do Neo-Tree na esquerda. Dá pra navegar por diretórios usando &ldquo;J&rdquo; ou &ldquo;K&rdquo; pra ir pra cima ou pra baixo e &ldquo;Enter&rdquo; pra abrir os diretórios ou abrir arquivos.</p>
<p>Quando o arquivo abre, ele abre num painel na direita. Mas como você navega entre os painéis? Basta digitar <code>Ctrl + H</code> ou <code>Ctrl + L</code> (lembrando que em Vim as &ldquo;setas&rdquo; são as telas da home row da mão direita <code>H J K L</code>). Só que se você estiver dentro do ZelliJ, isso não vai funcionar. Isso porque o ZelliJ em si usa o modificador <code>Ctrl</code> pra ele. Então ele engole o comando e não passa pro NeoVim.</p>
<p>Uma das soluções é que o ZelliJ, assim como NeoVim, tem &ldquo;modes&rdquo;. Vim tem modo normal, modo de edição e modo visual. ZelliJ tem vários modos, como modo normal, modo de scroll, modo de painel e cada modo tem seu sub-conjunto de shortcuts/combinações de teclas. Um desses modos é &ldquo;Locked&rdquo;. Podemos travar o zellij, daí usar o programa dentro do painel isoladamente, e lembrar de ficar &ldquo;desbloqueando&rdquo; o zellij. É meio chatinho de ficar fazendo isso.</p>
<p>Outra solução é o que eu fiz no Omakub-MJ. Eu adicionei as configurações do usuários de GitHub &ldquo;shoukoo&rdquo; que fez um artigo um tempo atrás chamado <a href="https://shoukoo.github.io/blog/zellij-love-neovim/"target="_blank" rel="noopener">ZelliJ 💓 NeoVim</a>. A configuração completa dele está <a href="https://github.com/shoukoo/dotfiles/blob/master/zellij.kdl"target="_blank" rel="noopener">neste arquivo</a>. Mas em resumo, ele cria um modo especial que batizou de &ldquo;modo tmux&rdquo;.</p>
<p>Pra entrar nesse modo, precisa digitar primeiro <code>Ctrl f</code> e na barra inferior, dá pra ver mudando de modo Normal pra Tmux:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ecr3jpesab4l2ilalp24vf7f9n4c" alt="zellij tmux"  loading="lazy" /></p>
<p>E agora sim, podemos digitar comandos como <code>P D</code> pra dividir painel. E fazendo isso, enquanto estiver no modo Normal mesmo, dentro do Neovim, combinações como <code>Ctrl H</code> ou <code>Ctrl L</code> vão funcionar normalmente. Win-win!</p>
<p>Só lembrar que, se na documentação oficial do zellij/omakub ele mandar digitar <code>Ctrl P W</code> pra abrir um painel flutuante, agora vai ser <code>Ctrl + F</code> e depois <code>P W</code>. E ele chama de &ldquo;modo tmux&rdquo; porque em Tmux, todo comando é depois de digitar <code>Ctrl + B</code> antes. No caso ele escolheu <code>Ctrl + F</code> pro ZelliJ, mas é arbitrário, poderia ser qualquer combinação inicial.</p>
<p>O resto continua funcionando igual. Pra navegar entre os painéis de ZelliJ, só digitar <code>Alt + H</code> ou <code>Alt + K</code> como no NeoVim, mas usando Alt em vez de Ctrl. Pra salvar a sessão atual e sair do ZelliJ, só fazer <code>Ctrl + F, O D</code> e quando voltar, só digitar <code>Ctrl + F, O W</code> pra listar as sessões salvas (sim, dá pra ter várias), e restaurar a que quiser com Enter.</p>
<p>Como o manual do Omakub recomenda, vale <a href="https://zellij.dev/documentation/"target="_blank" rel="noopener">estudar a documentação oficial do ZelliJ</a>.</p>
<h3>ASDF pra MISE<span class="hx:absolute hx:-mt-20" id="asdf-pra-mise"></span>
    <a href="#asdf-pra-mise" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Finalmente, uma das ferramentas que eu usei por mais anos foi o ASDF. Quem já programa em Node, Ruby, Python, etc já teve que usar algo como NVM, RVM ou RBenv, VENV ou Conda e assim por diante.</p>
<p>O mundo ideal é que todo mundo sempre usasse a versão mais nova de tudo, toda linguagem, toda biblioteca, tudo. Mas isso é inviável. Um bom programador vai acumular vários projetos na sua máquina, cada um vai estar numa versão diferente.</p>
<p>Ano retrasado ele trabalhou num projeto em Node na versão 16. Hoje está trabalhando num projeto novo na versão 22. Mas do nada, teve a necessidade de rodar esse projeto antigo. E agora? Ele atualizou tudo e só tem o node 22. Se desinstalar e instalar o 16 pra rodar o antigo, como fica o projeto novo? E as bibliotecas, como fica seu diretório de NPM? Uma zona completa.</p>
<p>Pra conseguir ter várias versões de node instaladas em paralelo na mesma máquina, recomenda-se usar NVM, que é o Node Version Manager.</p>
<p>Mas você é um programador poliglota. Trabalha em projetos em várias diferentes linguagens. Vai ter que aprender os comandos individuais de gerenciar versão pra cada linguagem? NVM pra Node. VENV pra Python. RVM pra Ruby, o que usa pra Java? Fodeu.</p>
<p>Pra isso criaram projetos como o antigo ASDF. Com ele era muito simples, bastava fazer <code>asdf install nodejs 14.21.3</code> pra instalar uma versão antiga de node e depois <code>asdf local nodejs 14.21.3</code> dentro do diretório do projeto antigo. Ele cria uma arquivo <code>.tool-versions</code> declarando a versão de nodejs pra esse diretório e quando entramos nele, o asdf detecta e já muda o que precisa pra poder usar a versão certa. Super conveniente.</p>
<p>Mais conveniente ainda porque podemos usar o mesmo conjunto de comandos pra qualquer linguagem. Basta instalar o plugin da linguagem com <code>asdf plugin add java</code> por exemplo. E ele suporta dezenas de linguagens, até as mais exóticas que você nunca ouviu falar. É o verdadeiro canivete suíço de gerenciamento de linguagens.</p>
<p>E esse seria o fim da história. Hoje mesmo, se você já usa ASDF, pode continuar usando, não tem nenhum problema com ele. Mas você conhece o povo de Rust: eles querem reescrever tudo em Rust. O Omakub mesmo instala vários substitutos como o &ldquo;exa&rdquo; que substitui &ldquo;ls&rdquo; e é feito em Rust. Tem vários assim.</p>
<p>No caso, existe o novo <a href="https://mise.jdx.dev/dev-tools/"target="_blank" rel="noopener"><strong>Mise</strong></a> de &ldquo;mise-en-place&rdquo;, pra quem já assistiu Masterchef. É exatamente a mesma coisa que ASDF só que feito em Rust. Inclusive ele é compatível com o mesmo arquivo <code>.tool-versions</code> que mencionei antes. Se não tiver, ele gera arquivo com nome próprio <code>.mise.local.toml</code> porque, claro, YAML ou JSON são antigos, o negócio é usar TOML &hellip;</p>
<p>Ele simplifica os comandos, mas não necessariamente acho que ficaram mais intuitivos. Mas é bem simples. Digamos que eu precise do tal Nodejs antigo, basta fazer <code>mise install node@14.21.3</code> ou direto <code>mise use node@14.21.3</code> pra instalar e já escolher pra usar.</p>
<p>Dá pra configurar versões locais pra cada diretório de projeto com <code>mise use --env local node@14.21.3</code>. E essa sintaxe de &ldquo;@&rdquo; é pra permitir instalar mais de uma versão num único comando, por exemplo <code>mise install ruby@3.1 nodejs@22.3.0</code>.</p>
<p>Mesma coisa como asdf, também podemos configurar a versão global padrão, caso não tenha arquivos como <code>.tool-versions</code> no diretório, fazendo <code>mise use --global nodejs@22.3.0</code>. Pra listar o que tem instalado, só fazer <code>mise ls</code>.</p>
<p>Enfim, vale <a href="https://mise.jdx.dev/getting-started.html"target="_blank" rel="noopener">estudar a documentação oficial</a>. No geral é uma ótima ferramenta e um bom substituto pra ASDF. Mas ele é tão parecido com ASDF que, se já estiver acostumado, não tem necessidade de mudar. Não tem nada a mais que ele faça que eu fosse sentir falta se não tivesse. Povo de Rust tem que parar de ficar substituindo as coisas pra fazer exatamente a mesma coisa. Era melhor gastar esse tempo ajustando e mandando patches pro próprio ASDF. Só dividiu os esforços da comunidade em duas ferramentas que fazem a mesma coisa.</p>
<h3>Últimas Considerações - Atuin<span class="hx:absolute hx:-mt-20" id="últimas-considerações---atuin"></span>
    <a href="#%c3%baltimas-considera%c3%a7%c3%b5es---atuin" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Uma última coisa, é que eu adicionei a ferramenta <a href="https://atuin.sh/"target="_blank" rel="noopener"><strong>Atuin</strong></a> &ldquo;Magical Shell History&rdquo;. Ele substitui o histórico do seu shell (sabe, aquele que você pode digitar &ldquo;Ctrl + R&rdquo; e procurar a linha de comando?) que normalmente é gravado em arquivo texto e manda pra um banco de dados SQLite3.</p>
<p>Só isso já seria legal, pra tirar as limitações de arquivo texto e evitar corromper e perder histórico. Mas além disso ele tem um serviço que permite sincronizar seu histórico entre diferentes máquinas. Digamos, seu PC desktop de casa, seu notebook de trabalho, seu servidor remoto. Hoje em dia todos tem históricos isolados e diferentes. E se desse pra sincronizar todos?</p>
<p>Aquele dia que você esquece seu notebook no trabalho, está no PC de casa e fica <em>&ldquo;puts, quais eram mesmo aqueles comandos de docker que eu fiz no trabalho??&rdquo;</em> Agora tem com, basta fazer <code>atuin sync</code> e pronto, seus históricos sincronizam!</p>
<p>Pra isso, no script de instalação eu rodo o <code>atuin register</code> que pede um username, email e uma senha (que, se não me engano, vai servir pra encriptar seus dados). E pronto, já vai sozinho se virar pra ficar sincronizando. Se já tinha conta, numa máquina nova basta rodar <code>atuin login</code> e logar. Só isso.</p>
<p>Ele substitui o <code>Ctrl + R</code> pra pesquisar no sqlite3 e agora seu histórico será muito mais robusto. Eu imagino que isso é mais importante ainda pro povo de devops. Eu lembro que rodava trocentos comandos de pods e containers e usava <strong>MUITO</strong> o histórico pra lembrar das coisas e repetir comandos. Fucem a documentação, tem como montar seu próprio servidor de Atuin pra onde sincronizar. Mesmo estando encriptado, talvez você queira 100% de controle. Tem como.</p>
<p>E por hoje é isso. Eu gostei bastante de brincar com o Omakub-MJ e meu PC pessoal com Manjaro GNOME e meu notebook com Windows 11 + ArchWSL já estão usando tudo exatamente como expliquei aqui. Novamente, leiam o <a href="https://manual.omakub.org/1/read#leaf_29"target="_blank" rel="noopener">Manual do Omakub</a> escrito pelo DHH, usem o Omakub dele caso estejam em Ubuntu, usem o <a href="https://github.com/akitaonrails/omakub-mj"target="_blank" rel="noopener">meu fork</a> pra Manjaro e Arch e não deixem de mandar Pull Requests ou Issues lá.</p>
]]></content:encoded><category>linux</category><category>ferramentas-de-desenvolvimento</category><category>open-source</category></item><item><title>[Akitando] #73 - RANT: A Realidade do "Software Livre"</title><link>https://akitaonrails.github.io/2020/03/04/akitando-73-rant-a-realidade-do-software-livre/</link><guid isPermaLink="true">https://akitaonrails.github.io/2020/03/04/akitando-73-rant-a-realidade-do-software-livre/</guid><pubDate>Wed, 04 Mar 2020 10:30:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/FVy1fZhNSDA"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2&gt;DESCRIPTION&lt;span class="hx:absolute hx:-mt-20" id="description"&gt;&lt;/span&gt;
&lt;a href="#description" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Muita gente acha que é defensor do Software Livre, mas na realidade não é.&lt;/p&gt;
&lt;p&gt;Pior ainda, por simplesmente só acreditar que está defendendo um movimento social, no final você está só defendendo o marketing de empresas e nem se dá conta disso. Nem é uma coisa completamente ruim, mas certamente não é o que sua crença diz.&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/FVy1fZhNSDA"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<h2>DESCRIPTION<span class="hx:absolute hx:-mt-20" id="description"></span>
    <a href="#description" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Muita gente acha que é defensor do Software Livre, mas na realidade não é.</p>
<p>Pior ainda, por simplesmente só acreditar que está defendendo um movimento social, no final você está só defendendo o marketing de empresas e nem se dá conta disso. Nem é uma coisa completamente ruim, mas certamente não é o que sua crença diz.</p>
<p>Então hoje eu vou desmistificar o que é software livre, open source e como as grandes corporações te enganaram. A idéia não é ser um vídeo completo sobre o assunto, somente sobre os temas que eu acho mais importantes pra começar.</p>
<p>Links:</p>
<ul>
<li>Affero General Public License (<a href="https://en.wikipedia.org/wiki/Affero_General_Public_License"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Affero_General_Public_License</a>)</li>
<li>What is free software? (<a href="https://www.gnu.org/philosophy/free-sw.html"target="_blank" rel="noopener">https://www.gnu.org/philosophy/free-sw.html</a>)</li>
<li>The JavaScript Trap (<a href="https://www.gnu.org/philosophy/javascript-trap.html"target="_blank" rel="noopener">https://www.gnu.org/philosophy/javascript-trap.html</a>)</li>
<li>The quietly accelerating adoption of the AGPL (<a href="https://www.synopsys.com/blogs/software-security/using-agpl-adoption/"target="_blank" rel="noopener">https://www.synopsys.com/blogs/software-security/using-agpl-adoption/</a>)</li>
<li>What’s a SaaS to Do? The SaaS Loophole in GPL Open Source Licenses (<a href="https://resources.whitesourcesoftware.com/blog-whitesource/the-saas-loophole-in-gpl-open-source-licenses"target="_blank" rel="noopener">https://resources.whitesourcesoftware.com/blog-whitesource/the-saas-loophole-in-gpl-open-source-licenses</a>)</li>
<li>Google open source guru: &lsquo;Why we ban the AGPL&rsquo; (<a href="https://www.theregister.co.uk/2011/03/31/google_on_open_source_licenses/"target="_blank" rel="noopener">https://www.theregister.co.uk/2011/03/31/google_on_open_source_licenses/</a>)</li>
<li>Can I use the middleman loophole to reduce AGPL to LGPL? (<a href="https://opensource.stackexchange.com/questions/5010/can-i-use-the-middleman-loophole-to-reduce-agpl-to-lgpl"target="_blank" rel="noopener">https://opensource.stackexchange.com/questions/5010/can-i-use-the-middleman-loophole-to-reduce-agpl-to-lgpl</a>)</li>
<li>Managed Cassandra on AWS, Our Take (<a href="https://www.scylladb.com/2019/12/04/managed-cassandra-on-aws-our-take/"target="_blank" rel="noopener">https://www.scylladb.com/2019/12/04/managed-cassandra-on-aws-our-take/</a>)</li>
<li>AWS and Open Source: It’s Complicated (<a href="https://www.redislabs.com/blog/aws-vs-open-source/"target="_blank" rel="noopener">https://www.redislabs.com/blog/aws-vs-open-source/</a>)</li>
<li>Choose an open source license (<a href="https://choosealicense.com/"target="_blank" rel="noopener">https://choosealicense.com/</a>)</li>
<li>Why Open Source misses the point of Free Software (<a href="https://www.gnu.org/philosophy/open-source-misses-the-point.en.html"target="_blank" rel="noopener">https://www.gnu.org/philosophy/open-source-misses-the-point.en.html</a>)</li>
<li>How to decide whether to open source your SaaS solution (<a href="https://opensource.com/article/18/5/open-source-saas-y-world"target="_blank" rel="noopener">https://opensource.com/article/18/5/open-source-saas-y-world</a>)</li>
<li>Explaining The Fair Use Principle for Copyrighted Work (<a href="https://www.thebalancesmb.com/fair-use-of-copyrighted-work-explained-4771134"target="_blank" rel="noopener">https://www.thebalancesmb.com/fair-use-of-copyrighted-work-explained-4771134</a>)</li>
<li>Copyright Definition (<a href="https://www.thebalancesmb.com/copyright-definition-2948254"target="_blank" rel="noopener">https://www.thebalancesmb.com/copyright-definition-2948254</a>)</li>
<li>YouTuber Extortion? MxR Plays v. Jukin - Real Law Review // LegalEagle (<a href="https://www.youtube.com/watch?v=5A_i-sB9H0Q"target="_blank" rel="noopener">https://www.youtube.com/watch?v=5A_i-sB9H0Q</a>)</li>
</ul>
<p>AkitaOnRails:</p>
<ul>
<li>[Off-Topic] Software Livre: Exercício de CAPITALISMO (<a href="https://www.akitaonrails.com/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo"target="_blank" rel="noopener">https://www.akitaonrails.com/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo</a>)</li>
</ul>
<h2>SCRIPT<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Olá pessoal, Fabio Akita</p>
<p>Eu acabei pulando o carnaval e não publicando video semana passada. Eu fiquei em dúvida entre dois temas e qual eu ia falar primeiro e os dois são trabalhosos pra explicar. Então deixei o assunto maturar na minha cabeça um pouco mais de tempo. O tema que eu escolhi falar foi sobre software livre. O problema é que software livre é um puta tema espinhoso. Se eu escolher palavras um pouco ambíguas, vai chover hater nos comentários porque todo mundo tem uma opinião forte sobre o assunto e na grande maioria das vezes elas estão erradas ou no mínimo incompletas.</p>
<p>O motivo desse tema é que de vez em quando ainda me perguntam qual é a vantagem de mexer com software livre. As respostas mais comuns, de fato acabam sendo alguma coisa como &ldquo;pra ajudar a comunidade&rdquo; ou &ldquo;pra outros poderem te ajudar&rdquo;. Não está completamente errado, mas não é só isso. E pensando um pouco mais no assunto, eu vejo que os motivos vão ser completamente diferentes pra pessoas e situações diferentes. Então acho que primeiro eu preciso explicar os mecanismos por baixo e daí você pode tirar conclusões melhores. Na realidade, pra variar, eu quero quebrar algumas concepções erradas que eu sei que muitos iniciantes ainda tem.</p>
<p>Eu já expliquei alguns dos elementos dessa novela, por exemplo, no video da Lerna vs ICE eu expliquei a diferença entre licenças permissivas e restritivas e a impossibilidade de mudar licenças retroativamente. E no vídeo sobre a Apple e GPL eu explico sobre como o GPLv3 que foi criado pra brigar contra DRM no episódio da Tivoização levou a Apple a migrar do compilador GCC para clang e evoluir o LLVM até sair a linguagem Swift.</p>
<p>Eu acho fascinante acompanhar as diversas novelas jurídicas e discussões filosóficas em torno de software livre e como você é facilmente enganado por ideologia barata se não parar pra ler além da propaganda. Por exemplo, talvez você ache que é um defensor do software livre usando Linux e programas de código aberto todo dia. Mas você não é 100% dentro da ideologia se navega em qualquer site moderno que executa Javascript. Já pensou porque?</p>
<p>(&hellip;)</p>
<p>Deixa eu começar com esse ponto que eu acho irônico. Muita gente pensa que usar Javascript é a mesma coisa que contribuir com o mundo de software livre, quando de fato não é. Se você é adepto da ideologia de software livre como Free Software e não somente como Open Source, você provavelmente conhece as quatro liberdade de software de cor, certo? Vamos relembrar. “Número 0 - e, claro, em programação listas começam em zero -, a liberdade de executar o programa como quiser, pra qualquer propósito.” Se você vai num Google Docs, ou Slack, ou Spotify, isso está satisfeito. Quando o seu navegador favorito carrega o site, ele carrega um monte de Javascript e executa o programa e você usa como quiser. O primeiro ponto está satisfeito.</p>
<p>“Número 1, a liberdade de estudar como o programa funciona, e mudá-lo pra ele computar como você desejar. Acesso ao código fonte é pré-condição pra isso.” Pronto, basicamente os principais produtos feitos em Javascript hoje quebram essa condição. O código Javascript é carregado no seu navegador, mas ele quase sempre vem em forma minificada. É impossível entender como esse código funciona porque minificação, que é uma forma de obfuscação criada pra minimizar o tamanho dos arquivos, é quase próxima de compilação. Você não tem como modificar o cliente do Google Docs ou do Spotify nem criar sua própria versão facilmente.</p>
<p>Continuando. “Número 2, a liberdade de redistribuir cópias para ajudar seu vizinho.” Neeeh, impossível. E “Número 3, a liberdade de distribuir cópias da sua modificação pros outros. Fazendo isso você dá uma chance pra toda a comunidade de se beneficiar de suas mudanças. Acesso ao código fonte é pré-condição pra isso.” Pois é, também não.</p>
<p>E antes que os haters cheguem nos comentários, calma! Eu usei Javascript de exemplo só porque é o alvo mais fácil já que a maioria de vocês estão aqui assistindo este video num front-end feito em Javascript que é o YouTube. E o YouTube não é software livre. E não só o Javascript do front-end, mas nenhum componente de nada que você usa todo dia, YouTube, Slack, Discord, Spotify, Netflix, Amazon, AliExpress, Uber, a maioria esmagadora dos softwares que você usa no seu dia a dia, são todos proprietários e fechados.</p>
<p>Isso não é imediatamente óbvio pros desavisados porque praticamente todas essas empresas e marcas parecem associadas de alguma forma com software livre. Em muitos casos oferecendo bibliotecas de código aberto que você pode consumir em seus próprios programas pra falar com as APIs dos produtos deles. Só que cliente de API é um software inútil sem a parte que roda no servidor. É simples entender a consequência. Você faz hoje um aplicativo que usa o cliente de API de um Dropbox. Digamos que amanhã o Dropbox feche, ou simplesmente decida fechar sua API. Seu aplicativo não serve pra mais nada. Era pra evitar esse tipo de cenário que nasceu a idéia de software livre.</p>
<p>Porém, o mundo SaaS inteiro se aproveita do que conhecemos como o GPL loophole. É uma brecha da licença GPL. Entenda, a GPL foi desenhada de tal forma que se você copiar um software GPL e fizer modificações, por exemplo, construindo seu produto em cima dele, e daí você comercializar ou distribuir o binário desse produto, você obrigatoriamente deveria distribuir o código fonte. Só que produtos SaaS não comercializa nem distribui o conteúdo, todo o código e binários rodam somente dentro dos servidores. E executar o código que você modificou é um direito do GPL. O que ele oferece aos usuários é apenas uma API e um front-end em Javascript com uma licença de uso remoto. E contanto que esse Javascript não contenha código GPL, também não há obrigação de abrir o código fonte.</p>
<p>À medida que muita coisa se move nessa direção onde tudo roda remoto, nenhum dos códigos proprietários é comercializado nem redistribuído. Porque você acha que idéias como usar iPad no lugar de Macbook ou Chromebooks são tão atraentes pra Apple e pro Google? A licença GPL não está sendo quebrada, só subvertida. O mundo de software livre obviamente notou isso e por isso existe a licença Aphero GPL ou AGPL, criada em 2002. A diferença com a GPL normal é que se você usa AGPL pra fazer um software as a service, seu código inteiro precisa ser aberto. E é por isso que nenhuma das empresas que eu mencionei e diversas outras, jamais vão chegar perto de software AGPL, porque ela basicamente quebra o modelo de negócios de SaaS como é conhecido hoje.</p>
<p>Um exemplo disso foi a entrevista do diretor de open source do Google em 2008, Chris DiBona que declarou que AGPL é banido dentro do Google. Toda grande empresa que se preza tem um departamento preocupado em avaliar todo o software desenvolvido internamente e suas dependências porque com o tanto de gerenciadores de pacotes que puxam coisas de fora como NPM pra Javascript ou Pip do Python e outros, é muito simples uma biblioteca GPL ou AGPL acabar entrando sem querer e contaminar todo o código. É um problema sério isso. Por isso todas as empresas vão sempre escolher licenças permissivas como MIT ou BSD ou derivadas delas.</p>
<p>Não existe nada como o passar do tempo. 20 anos atrás empresas como Apple, Microsoft ou Oracle eram os inimigos número 1 do software livre. Mas essa imagem foi revertida, e não é porque eles aderiram ao software livre, mas porque aprenderam como subverter a idéia toda. Hoje em dia a gente quer mais conveniência do que liberdade. Na verdade, hoje estamos mais dispostos a abrir mão de parte da liberdade em nome de mais conveniência e por isso todo mundo está em jardins fechados, os walled gardens, como dentro do ecossistema Apple, ou Amazon, ou Google ou similar. Todo o software que você usa e todos os dados que você deixa pra trás estão fora do seu controle, não importa se você usa Linux ou não. É o oposto de livre. Até mesmo quem está reclamando de privacidade continua dentro desses ecossistemas.</p>
<p>Antigamente você podia ter uma máquina Linux, com software 100% livre, rodando offline na sua máquina e ser razoavelmente produtivo. Mas hoje você não tem mais como, na prática. Se você trabalha remoto, vai ser obrigado a usar um comunicador, e ele vai ser um Slack ou similar, que é fechado. Se precisa compartilhar arquivos vai ser obrigado a usar um Dropbox ou OneDrive ou Google Drive, todos fechados. Se precisa compartilhar documentos, vai acabar usando Google Docs ou ironicamente Office online, e eles são fechados. Basicamente, tudo que não funciona se você fica offline, é software proprietário que encontrou caminho pra dentro do seu Linux.</p>
<p>Dá impressão que não é nada demais porque você não tá instalando manualmente nenhum binário proprietário na própria máquina. Na verdade, é pior: agora você não tem nem o binário mais: fica tudo remoto. Você abriu mão até do binário. Pior ainda, em vez de pagar uma única vez pelo software, você paga uma assinatura pelo direito de uso temporário desse software remoto. Pare de pagar e você não tem mais acesso ao software e muitas vezes nem aos seus dados. Não tem nem como piratear esse software, porque não existe mais um binário. No máximo um front-end  e um cliente de API, que são meras cascas descartáveis. Nem o conteúdo que você gera nesses softwares fica mais na sua máquina, fica na sua conta online do Google, ou da Apple.</p>
<p>Mas e o tanto de software livre que existe hoje em dia em lugares como GitHub? Sim, existem diversos softwares muito importantes e muito bons de forma livre e aberta. Só não os que você precisa usar todo dia. Com o passar do tempo e a maturidade no entendimento de software livre pelas empresas, um modelo ficou mais óbvio: mantenha todo o código crítico dos seus produtos fechados, mas abra alguns que podem se beneficiar da contribuição de fora.</p>
<p>A kernel do Linux é um exemplo disso. É muito caro pra uma empresa criar e manter seu próprio kernel, que dirá seu próprio sistema operacional inteiro. O valor desse desenvolvimento e manutenção não compensa o investimento. Portanto é vantajoso dividir esse custo com outras empresas. O Linux é o que é hoje por causa do investimento compartilhado de dezenas de empresas da Linux Foundation que pagam programadores pra manter seus interesses em dia. Empresas como IBM, Microsoft, Intel, Oracle, RedHat, e várias outras. E todo mundo se beneficia disso. É um compromisso pragmático. Não soa tão legal se você for um purista que achava que um Linux da vida era feito só com programadores anônimos voluntários aleatórios, mas essa é a realidade.</p>
<p>Pra um Google compensa manter sua linguagem, o Go, como código aberto. Nem tanto pra ganhar contribuições de fora, mas porque eles precisam constantemente contratar bons engenheiros. E é sempre melhor se os candidatos aparecerem já dominando a linguagem que eles usam. Mas não espere que eles liberem o código fonte do algoritmo de pesquisa, ou do banco de dados BigTable, ou qualquer outra coisa assim que se usa internamente. Esses códigos sempre foram e sempre vão ser fechados.</p>
<p>Mesma coisa o Facebook, pra eles compensa contribuir com linguagens como PHP, que eles usam internamente, vale a pena liberar o React como código aberto. Novamente eles precisam recrutar engenheiros o tempo todo. Essa é a principal motivação pra manter uma comunidade externa de desenvolvedores. Brigar contra software livre nos anos 90 e começo dos 2000 se mostrou extremamente danoso. A Microsoft sofreu isso na pele, sendo corretamente reconhecida como inimigo da liberdade.</p>
<p>Pra contratar bons profissionais, especialmente em um ambiente de abundância excessiva de hoje, com vários outros competidores, essas empresas precisaram mudar a estratégia. O marketing precisava mostrar que eles não eram o inimigo. Só que abrir o código secreto dos seus principais produtos nunca foi uma opção. Em vez disso elas se tocaram que dá pra pagar um preço mais barato e colher os mesmos benefícios. No começo dos anos 2000 todos os departamentos jurídicos já se atualizaram sobre as leis de propriedade intelectual de código frente a licenças de código aberto. O truque é simples: primeiro de tudo, você não precisa abrir o código dos produtos mais importantes, só do que não é crítico, como clientes de API, linguagens de programação, frameworks, bibliotecas, tudo aquilo que é commodity. Segundo, nunca usar GPL e muito menos AGPL internamente.</p>
<p>Felizmente pras empresas, depois do movimento de software livre, que é de fato um movimento social, ganhou força o movimento open source ou código aberto, que é um movimento pragmático de uma metodologia de desenvolvimento. Software Livre de verdade quase nenhuma empresa de fato adotou em seu núcleo e você vai notar que todas elas escolhem falar “open source” ou código aberto e raramente “free software” ou software livre. Open source é muito fácil de adotar porque elas costumam preferir licenças permissivas como MIT e BSD em vez de licenças restritivas como GPL e AGPL. O movimento open source meio que “matou” o software livre. E como pra maioria da população, incluindo a maioria dos desenvolvedores que nunca vão estudar sobre isso; open source e software livre são parecidos o suficiente pra passar batido.</p>
<p>Podem dar uma olhada nas suas empresas favoritas e quais projetos abriram e quais são as licenças. A licença do Go? É similar a um BSD. A licença do V8 que é o coração do seu Javascript? É similar a um BSD. A licença do React? É MIT. A licença do novo Terminal do Windows que roda Bash? É MIT. A licença do VS Code? É MIT. Eu poderia apostar que a maioria das coisas que você usa no seu dia a dia, tirando o Linux, não é GPL. Ou seja, não é software livre, é só open source. Então todo mundo começou a adotar open source sem pensar muito e achando que é tudo a mesma coisa. Mas qual a importância dessa diferença?</p>
<p>Pense na Amazon Web Services ou AWS. E pra não ser injusto pense também no Google Cloud ou Microsoft Azure. Use qualquer um dos produtos deles, seja AWS Lambda, seja Google App Engine, seja Azure Machine Learning. Você nunca mais vai sair deles. Porque as alternativas são todas incompatíveis e uma vez que seu negócio estiver rodando em alguma delas, você está preso. Pelo próprio tamanho, escopo e complexidade, é praticamente impossível ter opções de código aberto que você poderia rodar no seu próprio servidor. E o modelo de negócio de vender assinaturas em vez de licenças tornou tudo tão mais barato e acessível, que você sequer conseguiria manter algo similar a um custo equivalente. Esse é o poder da adoção em massa num período de abundância econômica.</p>
<p>Antigamente a gente se preocupava que se todo mundo continuasse a usar Office, todos os documentos do mundo um dia poderiam ficar ilegíveis se o Office sumisse, ou se decidíssemos que não queríamos mais pagar a Microsoft e sim outra alternativa. Era um caminho sem volta. Deu um trabalhão e pressão de governos pra fazer a Microsoft criar um formato aberto que são os atuais DOCX e XLSX pra Word e Excel por exemplo. O antigo formato DOC e XLS eram binários fechados e sem documentação. As versões novas são basicamente arquivos XML abertos compactados num zip. Levou anos pra conseguir isso e hoje em dia ninguém mais dá a mínima porque edita dentro do Google Docs e ninguém sabe internamente que formato que eles usam. Como ele exporta em formatos conhecidos a gente não liga tanto. Pior, a gente não baixa e guarda os arquivos na própria máquina, todo mundo se acostumou a confiar no servidor do Google como mais seguro. Como foi que começamos a abrir mão das nossas propriedades assim?</p>
<p>A resposta é simples: nós somos baratos. Eu não lembro mais a fonte mas eu acho que o case de marketing que me contaram era assim. Cervejarias de diversas marcas precisam competir pra serem escolhidas pelo consumidor. Não lembro se foi a Heineken que teve a boa idéia de distribuir cerveja grátis ou muito mais barato pras fraternidades de faculdades, pras cervejadas e festas de estudantes. Óbvio, se todo mundo aprende a tomar Heineken na faculdade, as chances de continuarem a tomar Heineken quando se formarem e entrarem na vida adulta aumenta muito.</p>
<p>Toda empresa que pode faz isso. Sempre que você vê uma grande marca patrocinando eventos em faculdades, dando descontos generosos nos seus produtos, custeando salas de computador e material de aprendizado, não é porque eles são bonzinhos. Eles estão competindo pela sua fidelidade exatamente na época onde estudantes são facilmente compráveis com um coffee break barato em evento e algumas camisetas e stickers. É muito barato comprar a fidelidade de estudantes. E como funciona! Não faz sentido na minha cabeça ser fã de empresas. Eu pago pelos produtos, e pronto, eu não sou outdoor ambulante pra ficar carregando a marca delas de graça, ou em troca de um brinde.</p>
<p>Se parece um exagero, vamos olhar a AWS. A comunidade de desenvolvimento em geral parece gostar bastante dela, afinal a grande maioria das tech startups e produtos web escolhem ela como primeira opção. Afinal ela oferece suporte de muitos produtos open source que você quer usar como o MySQL ou Postgres no produto RDS ou o ElastiCache que implementa Memcached e Redis. Em dezembro teve o evento deles, o AWS re:Invent onde muita gente comemorou que eles vão começar a oferecer o NoSQL Cassandra como opção gerenciada, o que deve aumentar adoção do Cassandra por mais gente. Note que toda propaganda da AWS sempre faz menção de como eles gostam de contribuir com o mundo open source. E se eu parar aqui, realmente parece que é isso mesmo.</p>
<p>Vamos aos fatos. Segundo o blog post da RedisLabs, que é a mantenedora do Redis e que já tiveram vários problemas com a AWS, novamente, o que a propaganda diz não é a realidade. Pra começar a AWS não está oferecendo o Cassandra. Na verdade é só uma camada de compatibilidade. Eles vão oferecer uma API compatível com o Cassandra mas que internamente vai falar com o produto DynamoDB que eles já oferecem faz anos. Segundo a equipe do ScyllaDB que é uma implementação aberta de Cassandra em C++ esse produto da AWS não vai oferecer coisas essenciais a usuários de Cassandra como suporte multi-região, não vai ter UDT, não vai ter alter table, não vai ter counters, não vai ter views materializadas, não vai ter como carregar SSTables diretamente. É uma versão simplificada que “parece” Cassandra mas na verdade é o DynamoDB por baixo.</p>
<p>É como se no ano 2000 a Microsoft falasse que está lançando o MySQL. Só que por baixo dos panos na verdade é uma versão frankenstein do MySQL que recebe os comandos compatíveis de MySQL e só traduz pro SQL Server que é quem de fato vai estar rodando. A AWS está fazendo exatamente isso: um frankenstein do Cassandra pra receber os comandos, por exemplo tudo da API CQL e vai mandar pro DynamoDB. Os preços inclusive são basicamente do DynamoDB só que 16% mais caros pra ter essa camada por cima. E por isso não tem como ter todas as funcionalidades do Cassandra de verdade.</p>
<p>E essa não é a primeira vez, eu disse que o povo da RedisLabs tem problemas com a AWS porque o produto ElastiCache que suporta Redis, como o nome diz, é voltado primariamente pra ser só um cache, e não inclui suporte a funcionalidades chave que tornam o Redis viável pra ser um broker persistente de mensagens ou mesmo um banco de dados primário. Do ponto de vista da AWS se você precisa de mensageria ou suporte a pubsub deveria estar usando SQS ou SNS e se quer um banco de dados primário deveria usar o DynamoDB ou RDS. O Redis é bem mais do que a AWS oferece no ElastiCache.</p>
<p>A mesma coisa acontece com o MongoDB da AWS. O MySQL da AWS se não me engano também não é o mesmo MySQL que você instala no seu Linux, é uma modificação interna que eles não abrem o código. E ao fazer isso, a Amazon divide as comunidades em duas: as que optam pela versão completa e realmente aberta e as que se acomodam às limitações dos produtos da AWS. É literalmente uma apropriação: agora que todo mundo gosta do Redis, vamos nos apropriar do nome Redis mas oferecer um produto inferior mas que pelo menos é mais conveniente de usar pra maioria das pessoas, já que a maioria sequer sabe a diferença.</p>
<p>Por menos que isso a Microsoft foi julgada como inimigo 20 anos atrás. E eu nem estou defendendo que eles deixaram de ser, só aprenderam a se marketar melhor. Porém, quando foi a última vez que você ouviu qualquer coisa negativa assim da AWS? Pois é. Esse é o resultado de um marketing muito bem trabalhado pela Amazon. Eles tem muito mais fãs do que detratores. E o mais interessante é que ela é bem vista como amiga do mundo de software livre.</p>
<p>Se não ficou claro ainda, deixa eu desenhar: a AWS de hoje é a Microsoft dos anos 90. É a mesma tática, só que executada com muito mais finésse e pzazz. E isso não é uma exclusividade da Amazon. Você vai encontrar exemplos similares de todas as empresas que você é fã, seja Google, Facebook, Apple. E todos eles fizeram a lição de casa. Por exemplo, eles tem dezenas de programadores influencers como MVPs, evangelists, advocates ou seja lá qual é o título hoje em dia. Estão todos nas folhas de pagamentos deles. São todos recursos de marketing, não do desenvolvimento core de verdade. Eles patrocinam eventos e distribuem brindes em todos os lugares. Sempre que podem repetem como o mundo open source é importante e como eles apoiam. E com isso dobraram a opinião pública e hoje são os heróis do software livre. Richard Stallman e Eben Moglen estão se revirando em seus caixões.</p>
<p>Com tudo isso que eu disse, pode parecer que eu sou um defensor do software livre. Mas eu não sou não, nunca fui e não tenho vocação pra ser. Eu sou pragmático, eu me adapto às limitações de cada era. Eu nunca usei Linux porque queria participar do movimento de software livre. Eu sempre usei open source porque me interesso por tecnologia tanto em plataformas abertas quanto fechadas. Mas eu não posso evitar e dar risada se você se considera um defensor do software livre e diz isso vestindo uma camiseta da Amazon ou do Google. Seu preço é um brinde de evento, você é uma propaganda ambulante que custa barato e ainda não entendeu como as coisas funcionam.</p>
<p>Agora, falando de forma pragmática. Eu tiraria proveito desse momento. Como eu já venho repetindo em todos os meus vídeos, estamos num período da abundância. E goste disso ou não, essas empresas estão no topo do jogo. Se você tem ideologia de software livre e não gostou do que acabou de descobrir sobre a AWS, não seja ingênuo de achar que Google Cloud ou Microsoft Azure ou qualquer outro são diferentes. Digamos que você use Google AppEngine e você acha que é o super defensor do mundo de software livre porque programa em Python. Só que sua aplicação usa o DataStore do Google, que é um software proprietário e fechado. Pois é. Essa é a realidade.</p>
<p>Eu sinto um pouco de pena por quem é defensor de software livre, ou mesmo de quem é defensor da liberdade em geral, porque o voto da maioria dos programadores foi abrir mão da liberdade por conveniência. Antigamente o mantra era que o conhecimento e a informação querem ser livres. Mas acho que as pessoas em geral não fazem tanta questão assim disso. Independente de qual lado desses movimentos você está, a importância de ter contato com software livre também é entender como as coisas funcionam no mundo real. Em particular eu gosto da parte jurídica disso. E o tema que você precisa entender é copyright e propriedade intelectual.</p>
<p>Nunca, em hipótese alguma, use um código que você achou num GitHub da vida que não tem nenhuma licença ou copyright. É pedir pra ter problemas jurídicos depois. Se você desenvolve produtos web e o que eu falei até agora foi novidade, reveja todas as dependências que você usa e garanta que não existe código AGPL misturado. Se você desenvolve produtos mobile e distribui os binários, veja se não está usando alguma dependência GPL. GPL e AGPL são licenças virais, eu expliquei isso no video da Apple e GPL. Todo código que toca neles se torna automaticamente GPL ou AGPL e sua obrigação é abrir todo o código que você escreveu. Não existe nenhum problema em usar GPL ou AGPL, eu até acho que muitos casos deveriam usar, mas não se meta com licenças se você ainda não estudou como elas funcionam.</p>
<p>Na dúvida, a recomendação costuma ser pra escolher licenças permissivas como MIT ou BSD. Toda vez que você cria um repositório no GitHub ele te lembra pra você escolher uma licença. Quando falamos em liberdade você precisa entender o seguinte: licenças restritivas como GPL ou AGPL promovem o software livre, ou seja, estamos garantindo a liberdade do software e protegendo os usuários, mas restringindo a liberdade dos desenvolvedores. Licenças permissivas como MIT ou BSD estão promovendo a liberdade dos programadores e das empresas, mas não necessariamente do software e nem dos usuários. Ou seja, se você desenvolve um produto usando software com licença BSD, você não é obrigado a abrir o código que fez, você faz o que quiser, pode inclusive comercializar e nunca abrir o código. Você tem liberdade de escolher o que fazer. Entenderam?</p>
<p>Tirando a parte ideológica e filosófica, software livre e open source são um pequeno caso de leis de copyright e propriedade intelectual. Eu não tenho treinamento jurídico nisso portanto tudo que eu disser a respeito, não considerem como conselhos legais, mesmo porque eu nem posso advogar nada. De qualquer forma é um assunto muito interessante especialmente se você se considera criador de conteúdo. Só porque você pode baixar e editar algum código, não quer dizer que você tem licença vender. É a mesma coisa com código e qualquer outro produto de criação como video, áudio, imagens e tudo mais. Se você encontra na internet talvez só tenha licença pra ver, mas não pra usar. E se usar, você não pode declarar ignorância da lei. Ser ignorante da lei não o torna isento da lei, isso vale pra qualquer coisa.</p>
<p>Em resumo super resumido, copyright é literalmente o que o nome diz, o direito de cópia. E a única pessoa que tem o direito de cópia sobre uma criação é o próprio criador. Esse direito é automático. Propriedade Intelectual é bem mais complicado e depende de pesquisa pra garantir que não havia obra igual ou similar já registrada antes. Licenças de software como a GPL foram chamadas de copyleft. Na realidade é um copyright onde o criador dá a licença de uso e modificação da criação se a pessoa obedecer as restrições da licença, que são as quatro liberdades que eu disse logo no começo do video. GPL é uma subversão do copyright, na prática é uma licença que restringe o uso, por isso chamamos de restritivas.</p>
<p>Em coisas fora de software, como este video, eu só posso usar coisas que eu comprei a licença. Por exemplo, a vinheta de entrada eu comprei. As músicas que eu uso em todos os vídeos são licenciadas pelo site Epidemic Sound. E nos casos onde eu uso pequenos trechos de músicas de filmes por exemplo, eu tento ao máximo estar próximo do que se chama de Fair Use. Essa parte da lei é a complicada, que é o limite de até onde você pode usar a criação de outra pessoa de forma que não entre em conflito com seu copyright. Um exemplo simples era antigamente que a gente fazia mix tapes, ou fitas cassetes com nossas músicas favoritas pra ouvir no carro. Se eu tinha a fita ou CD original comprado, eu tinha direito sob o Fair Use de fazer uma cópia pessoal para uso pessoal. No minuto que eu vendo a fita, aí eu infringi a lei, e vira pirataria. Se você assina um Spotify hoje, você concordou com os termos da assinatura, e você só tem a licença pra ouvir a música, mas não pode baixar e ouvir fora do Spotify. Muito menos usar as músicas inteiras ou mesmo trechos dela. E você não pode reclamar, a conveniência de pagar mais barato é que você abriu mão do fair use.</p>
<p>Na dúvida: não copie o que não é seu. Pra todo o resto, consulte um advogado especializado em propriedade intelectual. E já aviso que muitos vendem bullshit, então tomem cuidado e exercitem o pensamento crítico. Muita gente que quer empreender tem essas dúvida quanto ao software que estão desenvolvendo. Alguns acham que precisam registrar esse software. Mas isso é um dos bullshits: seu software nunca vai estar finalizado, você vai mudar ele o tempo todo. E provavelmente é um produto web as a service, que nunca vai ser exposto.</p>
<p>Digamos que alguém copie seu software e lance um concorrente de alguma forma. Essa é outra preocupação. Mas minha resposta pra isso é simples: se seu produto é tão frágil que só de copiar o código qualquer um consegue lançar um concorrente melhor, eu diria que sua empresa está muito mal montada. A marca, a operação, a comunicação, a reputação e tudo mais fazem o produto e não só o código. O código é só uma pequena parte de uma empresa de produto. Se seu negócio vai pros ares no segundo que alguém lança um concorrente, eu questionaria a necessidade da sua empresa existir.</p>
<p>Registrar seu software não vai servir pra muita coisa. Se você teve uma idéia realmente original, de novo, consulte um advogado e consiga uma patente. Agora, copyright, propriedade intelectual, patentes, não são coisas que se enforçam sozinhas também. É obrigação do detentor da propriedade de proteger sua própria propriedade, então se alguém infringir sua propriedade você deve acionar seu advogado pra começar os procedimentos legais. Mas isso não é barato, é extremamente caro na realidade, estamos falando de centenas de milhares de reais pra mais. A hora de advogado é muito caro, e se você perder você arca com os custos do outro lado também. Portanto não é algo que você vai usar tão cedo. De curiosidade eu recomendo dar uma olhada num caso recente da Jukin Media vs MxR que é explicado num canal que eu gosto bastante que é o Legal Eagle onde um advogado de verdade discute um caso de disputa de copyrights do ponto de vista legal e não do seu ponto de vista do que você acha que é certo ou não.</p>
<p>A discussão sobre propriedade e copyright é a parte mais cabeluda e não existe um consenso. Depende do caso. A legislação varia de país pra país e se quiser ter segurança sobre o assunto, consulte um advogado. Mas em princípio existem os que acreditam que tudo que alguém cria deveria ser domínio público e os que acreditam que tudo que alguém cria é propriedade do criador. Eu pessoalmente sou do segundo campo, tudo que você cria é automaticamente seu. Daí você tem a escolha do que fazer, se você acha que quer deixar os outros usarem, então é seu direito conceder a licença de uso. Do lado de quem usa também, se você aceitou o trabalho de alguém, você tem obrigação de seguir a licença que foi anexada nela. Esse é o protocolo.</p>
<p>Isso tudo dito. Por que uma empresa abriria seu código como software livre ou open source? Dezenas de motivos e dezenas de estratégias. Mas mais importante, só porque você abriu o código não tem nenhuma garantia que alguém vai adotar. Muita gente pensa que abrir o código automaticamente vai trazer gente pra colaborar. Eu diria que se você está aqui se perguntando isso, provavelmente é porque não deveria tentar ainda. Vá estudar primeiro e participar de projetos que já existem pra entender como funciona. Pare de ver videos ou blog posts pra achar essa resposta. Não é barato manter o software aberto. Alguém precisa manter esse projeto ativo, responder dúvidas, orientar os possíveis voluntários, avaliar as contribuições o mais rápido quanto possível, manter o software estável pra quem está usando, manter canais de comunicação ativos e assim por diante. Repito, não é de graça manter um projeto open source.</p>
<p>Depois que sua empresa já estiver inserida em projetos abertos, tiver prática, entender a cultura e as licenças, é possível sim fazer bastante coisa. Um dos exemplos mais simples são projetos com licença dupla. Sim, você pode ter uma licença aberta e outra licença fechada. Um exemplo é o próprio MySQL. O conceito é simples, se seu software já tem sucesso você pode abrir ela com licença GPL, dessa forma você garante que outra empresa não pode copiar seu código e lançar uma versão própria fechada. Se outra empresa modificar o código, ela tem obrigação de soltar essa modificação ou ela vai estar infringindo a licença. Mas se uma empresa precisa fazer isso, ela tem a opção de te contatar pra comprar sua licença proprietária que dá o direito dela modificar o produto internamente e não liberar o código. É um modelo de negócio. Se ela é efetiva ou não, depende do negócio e, de novo, consulte seu advogado.</p>
<p>Você enquanto desenvolvedor, porque contribuir em projetos open source? Primeiro, porque você tem um problema com o software que você usa e quer ver consertado ou você quer uma funcionalidade que a comunidade não parece interessada em fazer. A idéia toda de open source é que você coce sua própria coceira. A postura da maioria dos desenvolvedores é ser bem folgado, povo só posta “ow, e aí, quando vocês vão fazer a funcionalidade lá que eu pedi 2 meses atrás?” Folgado pra caramba. Povo que mantém os projetos tem que ser super paciente, porque se fosse eu já respondia “eu vou fazer a hora que você me pagar, folgado”. Se você é desenvolvedor e nem você que precisa da funcionalidade se deu ao trabalho de tentar implementar, porque outra pessoa vai fazer pra você de graça? Se liga, é assim que você começa com o pé esquerdo.</p>
<p>A idéia de trabalho voluntário em projetos abertos parece algo estranho, mas não é tanto assim. Pra começar é uma base de treinamento. Você que é iniciante, você acha que já é o pica das galáxias, que manja do código? Eis um excelente lugar pra provar isso. Resolva um problema seu e ao mesmo tempo demonstre suas capacidades com código. Tem gente que acha que só deve escrever uma linha de código se é pago pra isso. Eu questiono se esse tipo de pessoa realmente gosta de programar, e se for esse o caso, eu não vejo crescendo como programador. Um bom programador escreveria código sozinho, sem ninguém ver, só pelo prazer ou vontade de programar, independente se alguém fosse ver ou não.</p>
<p>Mais do que isso, antigamente a gente não tinha referências pra saber o que é considerado um código bem feito ou mal feito, em que velocidade certos códigos são feitos, as diferentes alternativas de código pra resolver o mesmo problema. Você tem à sua disposição hoje, milhares de projetos abertos, gratuitamente disponíveis, que você pode fuçar quanto quiser. Mesmo se não tiver vontade de contribuir, eu fico pasmo que poucos iniciantes estão baixando esses códigos e estudando. Toda nova biblioteca ou programa útil que aparece, se me interessa eu baixo o código e vou olhar como foi implementado essa ou aquela função que me interessa e sempre me dá algum insight de “ahhh, dá pra fazer assim!” e isso vai se aculumando ao longo dos anos.</p>
<p>Eu mesmo fiz poucas contribuições em projetos open source. Quando eu tava na faculdade, quando eu ainda era um programador júnior, eu não era o melhor programador. E era bem difícil de contribuir em projetos abertos naquela época. Se você viu meus vídeos de Git eu expliquei porque. Foi só depois de 2008, ou seja, quase 20 anos depois que eu comecei a aprender a programar, que contribuir em projetos open source se tornou fácil como é hoje. Eu teria sido um programador muito melhor se desde o começo eu tivesse conseguido contribuir e criado essa rotina.</p>
<p>Mas tanto empresas quanto programadores, a intenção deste vídeo foi colocar suas expectativas em dia. Open source não é mágica. Só porque você abriu seu código, não quer dizer que alguém vai se interessar por ele. Na verdade é até uma boa se quiser testar, você abre seu código e vê que zero pessoas se interessaram. É uma boa evidência que esse código que você achava legal na verdade não tem tanta serventia pras pessoas, ou você que é muito ruim de comunicar os benefícios. De qualquer forma é um feedback útil. Mesma coisa se for um desenvolvedor, se suas contribuições que você achava que eram boas forem rejeitadas, é um bom feedback pra melhorar. E é isso que a maioria das pessoas precisam de qualquer forma: feedback. É como se você tivesse programadores sêniors do seu lado apontando seus erros. Só isso já tem muito valor. Por isso que apesar do trabalho ser voluntário, estão existindo trocas entre você, o projeto e os outros colaboradores. Isso não é caridade, são trocas voluntárias pra mútuo benefício.</p>
<p>Além disso, da mesma forma que você escolhe entrar, qualquer hora pode escolher sair. Jamais pense que alguém te deve alguma coisa só porque você fez uma contribuição. É outro bom exercício pra entender o valor das coisas. Você contribuiu pra coçar uma coceira sua. Se outra pessoa se beneficiou disso, bom pra ela, mas isso foi o efeito colateral. Se outra pessoa fez melhor uso da sua contribuição do que você mesmo, melhor ainda pra ela, e bom aprendizado pra você também. Não existe mérito automático, mérito é algo que você conquista, nunca vai ser dado pra você independente da quantidade de esforço que você fez.</p>
<p>Enfim, o mundo de software livre não é tão ideológico como você poderia imaginar no começo. As grandes empresas já entenderam como formular estratégias onde eles podem alocar projetos open source como bons canais de marketing e de contratação de talentos. E isso não é uma coisa totalmente ruim, basta que você como desenvolvedor não fique perdendo tempo sendo fanboy de empresa e use o que está disponível como material grátis pra sua própria evolução. Essa é a única coisa que interessa pra um programador. Os brindes são inúteis, mas os códigos, sejam eles abertos via licenças permissivas ou via licenças restritivas, são códigos úteis. Pode ser que esse mundo abundante suma amanhã, então aproveite enquanto ela existe.</p>
<p>Eu já ouvi muita gente reclamar que mora em lugares afastados, cidades pequenas, que sequer tem empresas ao redor onde elas podem começar a trabalhar. Em muitos casos, projetos open source podem ser a única fonte de conhecimento e contato com outros programadores. E mais, você tem a oportunidade de fazer código e receber feedback desse código. Se o feedback for negativo, você finalmente sabe no que precisa melhorar. Em vez de pensar mesquinharias de “ah, mas eu vou estar trabalhando de graça” eu pensaria diferente “puxa, eu estou recebendo feedback de graça”. E com o tempo, se você se dedicar de verdade, é possível montar um bom portfolio de contribuições em projetos relevantes que chamem a atenção de outras empresas procurando alguém como você. E por hoje vamos ficando por aqui, se ficaram com dúvidas mandem nos comentários abaixo, se curtiram o video mandem um joinha, assinem o canal, não deixem de clicar no sininho pra não perder os próximos episódios e ajudem o canal compartilhando o video com seus amigos. Este mês vai ter menos vídeos porque vou passar as próximas semanas nos Estados Unidos, então a gente se vê na minha volta. Até mais.</p>
]]></content:encoded><category>open-source</category><category>leis-e-regulacao</category><category>negocios</category><category>akitando</category></item><item><title>[Akitando] #42 - Entendendo Apple, GPL e Compiladores</title><link>https://akitaonrails.github.io/2019/03/06/akitando-42-entendendo-apple-gpl-e-compiladores/</link><guid isPermaLink="true">https://akitaonrails.github.io/2019/03/06/akitando-42-entendendo-apple-gpl-e-compiladores/</guid><pubDate>Wed, 06 Mar 2019 17:00:00 -0300</pubDate><description>&lt;p&gt;Disclaimer: esta série de posts são transcripts diretos dos scripts usados em cada video do canal &lt;a href="https://www.youtube.com/channel/UCib793mnUOhWymCh2VJKplQ"target="_blank" rel="noopener"&gt;Akitando&lt;/a&gt;. O texto tem erros de português mas é porque estou apenas publicando exatamente como foi usado pra gravar o video, perdoem os errinhos.&lt;/p&gt;
&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/suSvMnNwV-8"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3&gt;Descrição no YouTube&lt;span class="hx:absolute hx:-mt-20" id="descrição-no-youtube"&gt;&lt;/span&gt;
&lt;a href="#descri%c3%a7%c3%a3o-no-youtube" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Finalmente! Chegamos no episódio 42!&lt;/p&gt;
&lt;p&gt;Se você é geek que nem eu sabe que 42 é um número especial. Segundo o sábio profeta Douglas Adams o número 42 é a resposta da vida, do universo e de tudo. Se não acreditam leiam a bíblia do Guia do Mochileiro das Galáxias. De curiosidade é por isso que minha empresa se chama Codeminer 42. E em especial este ano eu vou completar meus 42 anos. Mas chega de numerologia, vamos começar a história de hoje.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Disclaimer: esta série de posts são transcripts diretos dos scripts usados em cada video do canal <a href="https://www.youtube.com/channel/UCib793mnUOhWymCh2VJKplQ"target="_blank" rel="noopener">Akitando</a>. O texto tem erros de português mas é porque estou apenas publicando exatamente como foi usado pra gravar o video, perdoem os errinhos.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/suSvMnNwV-8"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<h3>Descrição no YouTube<span class="hx:absolute hx:-mt-20" id="descrição-no-youtube"></span>
    <a href="#descri%c3%a7%c3%a3o-no-youtube" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Finalmente! Chegamos no episódio 42!</p>
<p>Se você é geek que nem eu sabe que 42 é um número especial. Segundo o sábio profeta Douglas Adams o número 42 é a resposta da vida, do universo e de tudo. Se não acreditam leiam a bíblia do Guia do Mochileiro das Galáxias. De curiosidade é por isso que minha empresa se chama Codeminer 42. E em especial este ano eu vou completar meus 42 anos. Mas chega de numerologia, vamos começar a história de hoje.</p>
<p>Hoje vamos fugir um pouquinho do tema de Back-end, que pretendo retomar semana que vem. Desta vez quero contar uma história que eu pessoalmente acho interessante. Vou falar sobre Apple, sobre licenças de software livre, sobre compiladores, um pouco do mundo mobile e um pouco do mundo web de novo. É uma história meio complicada mas que vai ajudar vocês a entenderem um pouco da dinâmica de como o mundo real afeta a evolução e adoção de linguagens e tecnologias.</p>
<p>Errata: várias vezes no vídeo eu falo &ldquo;SpiderMonkey&rdquo; mas eu queria dizer &ldquo;JavascriptCore&rdquo;. A SpiderMonkey é a engine de Javascript do Firefox, a JavascriptCore que é a engine que vem no WebKit e Safari. E o V8 é o do Chrome.</p>
<p>Errata 2: Eu falo que GPL é General Protection License, mas na verdade é General Public License.</p>
<p>Errata 3: me avisaram nos comentários e eu realmente comi bola quando falei dos emuladores de Android. Antigamente as imagens do OS eram realmente só de ARM mas hoje em dia de fato já existem imagens compilados pra x86, então em um Virtualbox habilitado pra usar os recursos de virtualização dos processadores AMD e Intel como o VT-X é possível acelerá-los. Ainda não é a mesma coisa que no MacOS/iOS que é um simulador sem necessidade de camada de virtualização, mas não deixa de ser um avanço.</p>
<p>Links:</p>
<ul>
<li>Why WebAssembly is Faster Than asm.js (<a href="https://hacks.mozilla.org/2017/03/why-webassembly-is-faster-than-asm-js/"target="_blank" rel="noopener">https://hacks.mozilla.org/2017/03/why-webassembly-is-faster-than-asm-js/</a>)</li>
<li>Awesome Wasm (<a href="https://github.com/mbasso/awesome-wasm"target="_blank" rel="noopener">https://github.com/mbasso/awesome-wasm</a>)</li>
<li>Swift is like Kotlin (<a href="http://nilhcem.com/swift-is-like-kotlin/"target="_blank" rel="noopener">http://nilhcem.com/swift-is-like-kotlin/</a>)</li>
<li>THE CASE THAT NEVER ENDS: ORACLE WINS LATEST ROUND VS. GOOGLE (<a href="https://www.wired.com/story/the-case-that-never-ends-oracle-wins-latest-round-vs-google/"target="_blank" rel="noopener">https://www.wired.com/story/the-case-that-never-ends-oracle-wins-latest-round-vs-google/</a>)</li>
<li>Facts and effects of Caldera/SCO vs IBM (<a href="https://www.computerweekly.com/feature/Facts-and-effects-of-Caldera-SCO-vs-IBM"target="_blank" rel="noopener">https://www.computerweekly.com/feature/Facts-and-effects-of-Caldera-SCO-vs-IBM</a>)</li>
<li>A new GCC runtime library license snag? (<a href="https://lwn.net/Articles/343608/"target="_blank" rel="noopener">https://lwn.net/Articles/343608/</a>)</li>
<li>A visual timeline of the Microsoft-Novell controversy (<a href="https://arstechnica.com/information-technology/2007/01/linux-20070128/"target="_blank" rel="noopener">https://arstechnica.com/information-technology/2007/01/linux-20070128/</a>)</li>
<li>The Microsoft-Novell Linux deal: Two years later (<a href="https://www.infoworld.com/article/2654097/the-microsoft-novell-linux-deal--two-years-later.html"target="_blank" rel="noopener">https://www.infoworld.com/article/2654097/the-microsoft-novell-linux-deal--two-years-later.html</a>)</li>
<li>An Introduction to Tivoization (<a href="http://www.linfo.org/tivoization.html"target="_blank" rel="noopener">http://www.linfo.org/tivoization.html</a>)</li>
<li>Linus Torvalds, Dual-Licensing Linux Kernel with GPL V2 and GPL V3 (<a href="https://lkml.org/lkml/2007/6/13/289"target="_blank" rel="noopener">https://lkml.org/lkml/2007/6/13/289</a>)</li>
<li>An insider&rsquo;s look at drafting the GPLv3 license (<a href="https://opensource.com/article/18/6/gplv3-anniversary"target="_blank" rel="noopener">https://opensource.com/article/18/6/gplv3-anniversary</a>)</li>
<li>Apple’s great GPL purge (<a href="http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/"target="_blank" rel="noopener">http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/</a>)</li>
<li>Apple Invests in LLVM, Suggests Merge with GCC (<a href="https://www.osnews.com/story/12715/apple-invests-in-llvm-suggests-merge-with-gcc/"target="_blank" rel="noopener">https://www.osnews.com/story/12715/apple-invests-in-llvm-suggests-merge-with-gcc/</a>)</li>
<li>Arquitetura LLVM (<a href="https://www.aosabook.org/en/llvm.html"target="_blank" rel="noopener">https://www.aosabook.org/en/llvm.html</a>)</li>
<li>What is LLVM? The power behind Swift, Rust, Clang, and more (<a href="https://www.infoworld.com/article/3247799/what-is-llvm-the-power-behind-swift-rust-clang-and-more.html"target="_blank" rel="noopener">https://www.infoworld.com/article/3247799/what-is-llvm-the-power-behind-swift-rust-clang-and-more.html</a>)</li>
</ul>
<h2>Script<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Olá pessoal, Fabio Akita</p>
<p>Desta vez vamos dar uma pequena pausa na série Começando aos 40. Vocês já viram dois episódios falando sobre back-end e o assunto ainda não acabou, mas pra quebrar um pouco decidi fazer uma longa tangente hoje e falar sobre um tema cabeludo que envolve o mundo de software livre, a Apple e compiladores. É até difícil definir que tema é esse exatamente. Tem a ver com compiladores e linguagens mas não é só isso. Mas é uma história que eu acho fascinante e queria compartilhar com vocês.</p>
<p>Além disso hoje finalmente estou completando o episódio 42. Se você é geek que nem eu sabe que 42 é um número especial. Segundo o sábio profeta Douglas Adams o número 42 é a resposta da vida, do universo e de tudo. Se não acreditam leiam a bíblia do Guia do Mochileiro das Galáxias. De curiosidade é por isso que minha empresa se chama Codeminer 42. E em especial este ano eu vou completar meus 42 anos. Mas chega de numerologia, vamos começar a história de hoje.</p>
<p>(&hellip;)</p>
<p>Como vocês viram nos vídeos passados, acho que deu pra entender que a Microsoft foi um rolo compressor nos anos 90 empurrando tecnologia atrás de tecnologia, boas ou ruins. Depois ela foi bruscamente parada no começo do século por causa do julgamento anti-truste. E de 2001 até pelo menos 2014, quem calçou seus sapatos de certa forma foi a Apple. Sem repetir muito o que todo mundo já sabe vamos resumir: em 1999 os iMacs translúcidos de plástico colorido foram um enorme sucesso pra marcar o retorno de Steve Jobs, numa época onde a Apple estava a dias de fechar as portas e declarar falência. Em 2001 surgia o Mac OS X baseado no NextStep e BSD UNIX, também em 2001 o iPod conquistou o mundo, em 2003 o iTunes conquistou o mundo.</p>
<p>Em 2005 com a ascendência do Ruby on Rails e a preferência por Macs de seu criador fez com que a comunidade Rails e o gosto pela estética da Apple andassem lado a lado. De 2005 a 2006 a Apple migrou dos processadores PowerPC pra Intel e de repente todo mundo queria usar Macs pra desenvolvimento já que ele era um sabor de BSD UNIX. Diversas ferramentas que só existiam em Linux passaram a ser portados. Gerenciadores de pacotes como Fink, MacPorts e hoje HomeBrew começaram a surgir. E mais importante, Ruby vinha pré-instalado nos Macs, facilitando ainda mais a adoção inicial.</p>
<p>Por duas vezes a Apple não só passou ilesa como explodiu em crescimento no meio de duas grandes crises. Em 2001 ela lançou seu iPod bem na queda da Crash das Ponto Coms, um dos piores episódios da história da Internet. E em 2007 os iPhones aparecem, 1 ano antes da famosa crise econômica de 2008 que muitos diziam que poderia ser o fim do mundo, e você pode assistir em filmes recentes como o incrível The Big Short. Mesmo em meio a essa crise, em 2009 a App Store vai ao ar inaugurando a era do desenvolvimento mobile e todo mundo quer aprender Objective-C agora, validando o estilo de orientação a objetos que já era mais familiar a quem usava Ruby do que quem usava Java. A Apple forçou a evolução da Web em direção à morte do Flash, e ao HTML 5 e CSS 3 que rodavam melhor nos seus navegadores Safari. E com o nascimento do MobileMe que foi o serviço online de cloud da Apple; nasceu o framework javascript SproutCore, que depois viria a se tornar Ember, inaugurando o estilo de produtos Web que conhecemos hoje.</p>
<p>Pós crise de 2008 e 2009, todo mundo queria desenvolver produtos mais sofisticados, com linguagem visual limpa, com a usabilidade que a Apple era lendária por oferecer em seus produtos. Mesmo antes disso, enquanto o mundo enterprise estava adotando soluções J2EE como o IBM Websphere ou BEA Weblogic a própria Apple tinha uma arquitetura mais simples e mais sofisticada na forma do WebObjects que era o motor por trás do lendário e-commerce da Apple na época. Uma pena que o WebObjects nunca teve real tração. Toda essa experiência trouxe a Apple como uma das maiores influenciadoras das tecnologias da época. E isso coincidiu com o pior período da história da Microsoft pós-processo dos Estados Unidos contra suas práticas monopolistas depois da Guerra dos Navegadores, então a Apple praticamente não teve competição.</p>
<p>Voltando ao nosso tema de programação e linguagens, entenda que 2006 e 2007 foram anos interessantes pro mundo dos compiladores por três motivos: a migração da plataforma de Macs para Intel, o lançamento do iPhone e a migração no mundo de software livre da famosa licença GPL v2 para o controverso GPL v3. Esses três acontecimentos, na minha opinião, influenciaram muito o landscape de desenvolvimento de software entre os mundos comercial e de software livre, e eu acho que ainda não vimos tudo que pode sair disso até hoje.</p>
<p>No ano 2000 um novo projeto começou a aparecer como uma pesquisa, o Low Level Virtual Machine de Chris Lattner e Vikram Adve. Em resumo essa tecnologia se tornou um compilador modular que chamamos de LLVM apesar de não ser de fato uma máquina virtual como uma JVM. O monopólio dos compiladores, principalmente no mundo open source, era basicamente do GCC, responsável por compilar os códigos em C, C++ e várias outras linguagens, incluindo coisas como Fortran, e que gera o binário da kernel Linux e todas as ferramentas de licença aberta que rodam ao seu redor nas distribuições Linux. Mas o GCC é um grande monolito, com mais de 25 anos de contribuições e evoluções, complicado de evoluir, expandir e integrar. Porém com décadas de refinamento e ajustes, é definitivamente um dos melhores compiladores do mercado.</p>
<p>O LLVM foi criado pra ser diferente, ele separou o processo de compilação em 3 grandes estágios, front-end, otimização e back-end. Não confundir com as carreiras de front-end e back-end. Pense na entrada do compilador que é o front, o miolo, e a saída do compilador que é o back, Vale a pena eu explicar o que isso significa. Em resumo, o front-end pega o seu código fonte, digamos em C, e faz a checagem e o parsing. O resultado desse estágio é seu código limpo e traduzido em outra linguagem intermediária, chamada literalmente de Intermediate Representation ou IR. Não seria muito diferente do Java gerando bytecodes ou do .NET que gera em IL pro CLR que é literalmente Intermediate Language. Também meio parecido com o que um transpiler de Coffeescript ou Dart ou Typescript faz transformando em Javascript por baixo. Na sequência esse código em IR passa pelo tal miolo, a fase de otimização, que vai fazer todas aquelas otimizações que eu expliquei no episódio anterior pra deixar seu código o mais eficiente possível. Inclusive como o GCC e outros compiladores, essa fase pode precisar “passar” pelo código múltiplas vezes, você às vezes vai ver esse termo “passes” porque algumas otimizações exigem conhecimento do código anterior. Finalmente o LLVM pega esse sub-produto otimizado e passa pro back-end, que vai finalmente traduzir em binário de máquina, gerando o executável do seu programa. Mas o importante é entender que existem 3 grandes pedaços de software independentes que, juntos, formam o compilador.</p>
<p>Então, em vez de usar GCC pra compilar C, você pode substituir por Clang que é um front-end de C feito pra LLVM. Teoricamente hoje você poderia tirar o GCC e recompilar uma distribuição Linux inteira usando Clang, até existem projetos testando isso. Por muitos anos, fazer o LLVM cuspir um binário tão otimizado quanto o de GCC foi bem difícil. E também havia a questão: pra que eu quero substituir o GCC se ele já funciona tão bem?</p>
<p>Em 2005 a Apple fez um de seus movimentos mais interessantes e pouco comentados e contratou Chris Lattner, que na época estava em início de carreira na Microsoft Research. Em 2006 Steve Jobs sobe ao palco na conferência WWDC e anuncia a transição da plataforma Mac dos processadores IBM PowerPC para Intel, mais especificamente a nova linha de processadores Intel Core. O sistema operacional OS X 10.4 Tiger foi o primeiro compilado ainda com GCC pra rodar tanto em PowerPC quanto Intel.</p>
<p>Mas em 2007 teríamos a sequência com o OS X 10.5 Leopard e o XCode 3.1, a IDE de desenvolvimento pra Mac e junto com ela viria o compilador GCC 4.2 e junto o LLVM integrado ao code generator do GCC, que foi conhecido como LLVM-GCC. O XCode 4.1 da época do Mac OS X Lion de 2011 foi o último a vir com o GCC como compilador, e de lá em diante o desenvolvimento em MacOS e iOS depende só do Clang. Ou seja, de 2006 até 2008 os produtos com processadores PowerPC foram todos migrados para Intel. Mas mais importante que isso, o compilador GCC foi sendo gradativamente substituído por Clang, a partir de 2007 até pelo menos 2011. Guarde essa informação.</p>
<p>No começo do século um novo tipo de produto começou a fazer um sucesso estrondoso. Lembra quando eu contei qual era o objetivo original do Java quando ele foi criado no começo dos anos 90? Ser um sistema pra um hardware de set-top-boxes. Ele estava quase uma década adiantado porque foi só nos anos 2000 que esse tipo de produto realmente explodiu, em particular o Tivo. Aqui no Brasil não tivemos Tivo mas tivemos similares. Era aquele produto que você podia gravar programas de TV a cabo pra assistir depois. É o que se chamava de DVR ou Digital Video Recorder, basicamente um receptor de sinal analógico, que digitalizava o vídeo e gravava organizado num HD. Acho que até hoje algumas empresas de TV a cabo ainda oferecem esse tipo de produto. Mas nos Estados Unidos o Tivo teve um sucesso explosivo. Tecnicamente falando ele era um mini-pczinho com uma placa de captura de vídeo que rodava uma versão de distribuição Linux.</p>
<p>Não é hoje que vou entrar em detalhes sobre licenças de software livra, mas a kernel Linux e a maioria das ferramentas que compõe uma distribuição que forma um sistema operacional completo, as ferramentas GNU, o compilador GCC e tudo mais usavam a licença GPL v2. GPL que significa General Protection License. Na prática, qualquer um, especialmente qualquer empresa que modifique código licenciado via GPL é obrigado a republicar as modificações ao público. O GPL não é uma unaminidade, por isso existem outras licenças, mas a maioria das coisas num Linux costumava ser GPL. E foi o que a Tivo fez: ela seguiu a licença e liberou as modificações que fez. Isso inclusive permitia que hobistas pudessem baixar esse código, fazer suas próprias modificações e carregar no Tivo. Então era como se fosse um PCzinho que dava pra brincar e instalar seus próprios programas.</p>
<p>Pelo menos naquela época, a maioria das empresas não gostava que seus dispositivos fossem modificados pra fazer coisas que não deveriam. Existem motivos pra isso, e nem vou entrar no mérito de certo ou errado, vamos só entender que eles não gostavam. Então na série 2 eles adicionaram um hardware que validava a assinatura do binário. Eu não sei como exatamente eles faziam isso, mas se você é iniciante vale entender pelo menos o conceito básico. Existe uma coisa em computação que chamamos de hashing. Existem algoritmos como os antigos MD5 ou SHA-1 ou os atuais SHA-256 ou bcrypt. Sem entender de criptografia entenda que eles são funções. O argumento de entrada pode ser qualquer bloco de dados, seja texto ou seja um binário. E a saída é sempre um texto de tamanho fixo.</p>
<p>Isso não é encriptação. Quando se encripta alguma coisa, você consegue reverter o processo e desencriptar. Em hashing não existe forma de pegar o resultado e reverter o processo e conseguir o argumento original. Dois blocos de dados diferentes podem dar o mesmo resultado, isso seria o que chamamos de colisão, mas é raro que isso aconteça num cenário real. O importante é que esse resultado serve como uma impressão digital, um fingerprint, de seja lá qual dado você tenha passado pra função. Ou seja, digamos que você passe o binário do kernel Linux. E o Tivo tem um firmware separado que quando carrega a kernel passa o binário por essa função e compara com a impressão digital que ele tem guardado num hardware que você não pode modificar.</p>
<p>Ou seja, se você modificou o kernel e instalou lá, a impressão digital vai ser diferente, então o Tivo pode rejeitar esse novo binário e impedir o boot. Essa seria uma forma simplória de fazer isso. Existem formas mais sofisticadas mas esse exemplo deve ajudar a entender parte do processo. Isso seria um tipo de DRM ou Digital Rights Management que a indústria de música adorava. Mas a Tivo achou um loophole no GPL v2, uma brecha na licença. A licença obrigava a liberar o código modificado, e isso eles fizeram, mas ela não fala nada sobre impedir o hardware de rodar código modificado no seu hardware.</p>
<p>Isso foi uma controvérsia gigante porque esse sistema de DRM, do ponto de vista dos desenvolvedores, restringia a liberdade do que o consumidor poderia fazer com o hardware que ele comprou. Isso gerou uma enorme polarização na opinião se uma empresa podia ou não fazer isso. Richard Stallman e Eben Mogler, os criadores da licença GPL ficaram enfurecidos, porque a GPL v2 não conseguia proibir essa atitude. Então eles iniciaram a modificação da GPL v2 para o novo GPL v3 que adicionava cláusulas que impediria isso que eles chamaram de “Tivoização”. E se você acha que o mundo open source apoiou essa medida, você está enganado. Isso gerou uma nova controvérsia e uma nova polarização. Por exemplo, Linus Torvalds odiou a medida e a kernel do Linux permanece na GPL v2.</p>
<p>Como eu já havia explicado no episódio da Lerna vs a ICE, licenças de software livre podem ser divididas em duas grandes categorias: as licenças restritivas e as licenças permissivas. Ao contrário do que o senso comum pode imaginar, o GPL é uma licença restritiva. Licenças como BSD, MIT, Apache e outras são mais permissivas. Em última instância a GPL impõe uma restrição importante: você é obrigado a liberar qualquer modificação que fizer num código GPL e essa modificação também será GPL. E sem cláusulas especiais e sub-licenças como LGPL você teria que se preocupar inclusive, se o binário gerado por um compilador com licença GPL se ela herda o GPL e se pode ser usada livremente ou não. É por isso que inclusive muitos chamam a GPL de uma licença viral. Já código licenciado via BSD por exemplo, não tem essa restrição. Você pode modificar o código e não tem a obrigação de liberar a modificação. Você pode gerar um binário e comercializar o binário e não se preocupar em ter que liberar o código.</p>
<p>A discussão sobre licenças de software livre é em última instância uma discussão sobre propriedade intelectual. A maioria das empresas prefere ficar bem longe de licenças restritivas pra não comprometer suas propriedades intelectuais, que é o que garante o seu valor. Nos anos recentes no começo dos anos 2000 tivemos grandes casos controversos em torno de propriedade intelectual no mundo open source como o famoso caso da SCO ou Santa Cruz Operation que processou a IBM pedindo nada menos que 1 bilhão de dólares, alegando que eles infringiram na sua propriedade do UNIX e usaram esse conhecimento nas contribuições ao Linux que a IBM fazia.</p>
<p>Se a SCO tivesse ganhado isso teria sido uma bomba nuclear tornando o Linux material radioativo pra quem usasse. Mas numa virada de eventos um juiz determinou que quem possuía os direitos que a SCO clamava na verdade era a Novell. E nessa mesma época por 2005 ou 2006 a Microsoft fechou um acordo de 400 milhões de dólares com a Novell que era dona do Suse Linux, cujo combinado era que uma não iria processar a outra em torno de propriedade intelectual, meio que sugerindo que haveria alguma coisa no Linux que deixaria quem não usasse Suse Linux vulnerável a algum processo no futuro de alguma forma. A comunidade open source odiou esse movimento, claro.</p>
<p>Certo ou errado, vocês podem entender pelo menos porque levar propriedade intelectual e licenças a sério é importante, principalmente nos Estados Unidos. À medida que as empresas iam adotando tecnologias open source, essa dúvida sempre deixa todos com os nervos à flor da pele. Se o Linux, que é a kernel por baixo de todas as distribuições e que estava sendo adotado rápido por todos, fosse condenado num processo desses, ele se tornaria material radioativo e toda empresa usando poderia descobrir uma bomba relógio explodindo. Isso é realmente sério. Se nos anos 2000 alguém perguntasse porque a Apple preferiu usar a base do FreeBSD nos OS X em vez do Linux, esse certamente poderia ser considerado um dos principais motivos: o FreeBSD usa licença BSD que é bem permissivo, ao contrário da GPL que tinha todas essas dúvidas pairando no ar.</p>
<p>Agora, o GPL v3 é um problema sério. Que outra empresa além da Tivo prefere manter certos códigos escondidos e dificultar você de instalar o que quiser em seus hardwares? Eu sempre fui fã da Apple e certamente a integração de hardware e software que eles fazem é excepcional, mas se você pensar puramente em questão de software livre, você vai ficar no mínimo em cima do muro com as práticas da Apple. E não confunda, sim, a Apple tem o código da base do seu sistema operacional aberto ao público na forma do Darwin, mas o MacOS é bem mais que só o Darwin, tem centenas de componentes que eles não querem abrir, incluindo a forma como o sistema se integra perfeitamente nos Macs e Macbook e, claro, nos iPhones de hoje. Se você notou que um iPhone faz a mesma coisa que um Tivo, impedindo você de instalar outro sistema nele, você pensou certo.</p>
<p>No outro lado do espectro, além de distribuições baseadas na kernel Linux, existem as distribuições baseadas em BSD, como FreeBSD, OpenBSD, NetBSD. O Linux é como se fosse um clone de UNIX, mas os BSDs em princípio são herdeiros do UNIX original. BSD seria o concorrente da outra linhagem de UNIX, o System V que deriva da época do UNIX System III da AT&amp;T. Como o próprio nome diz, a filosofia dessas distribuições é Software Livre no sentido mais permissivo e liberal, com a licença BSD. Vamos dizer que eles “toleram” a GPL mas nunca gostaram dela e o GPL v3 foi uma afronta direta e ofensiva pra eles, e podemos dizer que eles não gostaram nada das cláusulas restritivas anti-Tivoização. Existe uma longa história de brigas políticas em torno do que é considerado Software Livre ou não e vou parar por aqui pra não me alongar demais por hoje.</p>
<p>O maior problema? Tudo no mundo open source era compilado com o GCC. Como eu já expliquei no episódio sobre a Lerna vs a ICE, licenças não podem ser mudadas retroativamente, só em novas versões. Como quem controla o GCC é o Richard Stallman, ele migraria pra nova GPL v3. Ou seja, quem não quisesse adotar a nova licença ficaria preso na versão 4 do GCC que ainda seria GPL v2. Então começou uma corrida contra o relógio. Você pode ficar usando o GCC que ainda era GPL v2 mas quanto mais tempo passa, mais ele fica defasado e até inseguro, já que correções e novas funcionalidade só iriam subir no GCC com GPL v3.</p>
<p>Resumo da história? Tanto FreeBSD quanto a Apple começaram um projeto que iria levar alguns anos pra sair do GCC e migrar a compilação de tudo pra usar LLVM e Clang, que era o único concorrente viável ao GCC. Se você alguma vez já se perguntou porque no MacOS vem um Bash tão antigo? Porque além do GCC outras ferramentas GNU mudaram pro GPL v3, o Bash foi um deles. Por isso hoje se instala o Bash mais novo e outras ferramentas com versões mais novas, como o próprio Git, você mesmo via Homebrew ou de outra forma manual como baixar os códigos fonte e gerando binários você mesmo. E por isso às vezes você tem confusão de compilar usando GCC ou Clang.</p>
<p>Pra Apple, além da questão das licenças, a linguagem Objective-C que é o coração dos frameworks de aplicativos nativos de MacOS e iOS nunca teve prioridade no grupo de desenvolvimento do GCC. Por causa disso o projeto Clang começou a avançar a passos mais largos e por isso eles começaram a estratégia de primeiro começar a usar GCC como o front-end pra LLVM, já que a primeira coisa mais difícil era parsear corretamente os códigos em C, C++ e Objective-C e por isso você começa com LLVM-GCC como eu disse antes. À medida que a compatibilidade do front-end entre GCC e Clang ficou mais próxima, daí eles começaram a colocar Clang como escolha padrão até finalmente remover completamente o GCC antigo.</p>
<p>Nesse período de 2006 então a Apple estava migrando seus sistemas operacionais de PowerPC pra Intel e ao mesmo tempo já estava planejando outro dispositivo pra ser lançado em 2007: o primeiro iPhone. E os iPhones não usam processador Intel e sim ARM. E os iPhones seriam sempre produzidos com o bloqueio de DRM pra impedir outro sistema de rodar no hardware, ou seja, eles seriam Tivoizados. E com todos os aplicativos desenvolvidos usando Objective-C e com a necessidade de compilar binários nativos pra Intel e para ARM.</p>
<p>Agora vamos entender outra coisa do LLVM que eu não disse antes. O LLVM é um conjunto modular de bibliotecas. O compilador Clang é um conjunto dessas bibliotecas. Como ele foi desenhado pra ser modular, significa que você teria relativa facilidade de trocar partes do front-end ou do back-end. Por exemplo, você pode fazer back-ends que cospem binários em Intel ou PowerPC ou ARM ou qualquer outro tipo de hardware. E como o front-end também é modular e ele cospe em IR antes de passar pro módulo de otimização, você também tem facilidade de integrar no XCode pra fazer análise estática do código e debug. Com a integração de ferramentas sofisticadas como o famoso DTrace do antigo Solaris e a substituição do debugger GDB que era usado com GCC pelo LLDB, a IDE do XCode foi ficando mais e mais avançada para conseguir instrumentar o código e otimizar muito melhor do que antes.</p>
<p>Ao mesmo tempo que Chris Lattner e sua equipe iam evoluindo o LLVM dentro da Apple, muitas das pesquisas geraram novas funcionalidades primeiro no próprio Objective-C como a introdução de lambdas e o ARC que é o Automatic Reference Counting. Pra você que é iniciante, na maioria das linguagens mais modernas você não pensa muito em gerenciar memória porque linguagens como Java tem garbage collectors, ou seja, o runtime gerencia a memória por você. Mas se você começou a aprender com linguagens como C, sabe que precisa você mesmo codificar o gerenciamento de memória manualmente. Ou seja, no seu código você chama funções como malloc e free e outros pra pedir memória pro sistema operacional e depois devolver essa memória. Lembra que eu falei que além de multi-thread o outro aspecto em programação mais difícil é gerenciamento de memória?</p>
<p>Pois é, à medida que sua aplicação fica complexa, você vai errar isso. Ao longo da sua carreira você vai ficar ouvindo falar de vazamento de memória por exemplo. Gerenciar memória é complicado, porque memória se fragmenta, você precisa lidar com coisas como regiões, arenas e muitos outros detalhes. Mas se você tem uma máquina potente, digamos, com 8GB de RAM ou mais, você fica preguiçoso e não percebe vazamentos porque tem memória sobrando. Pra facilitar se falta memória RAM o sistema operacional ainda tem a opção de usar o HD como memória. É isso que se chama de SWAP. Se você chega nesse ponto com uma aplicação mal feita que vaza memória, tudo bem, o sistema vai passar a usar HD. Tudo vai ficar lento pra caramba, mas não vai crashear. Mas pense em 2007 um iPhone com meros 128MB de RAM pra comportar o sistema operacional e os aplicativos e sem a opção de um HD pra fazer swap. Ou seja, se faltar memória o sistema vai crashear o aplicativo. Então gerenciar memória se torna especialmente importante em dispositivos com poucos recursos.</p>
<p>E como Objective-C é basicamente compatível com C e usa a mesma semântica de você manualmente codificar onde quer alocar memória e onde quer devolver essa memória, os primeiros aplicativos pra iOS que eram feitos por amadores ou mesmo por descuido acabavam tendo muitos vazamentos e crasheavam dando uma má experiência aos usuários. Por isso recursos como o ARC que foram introduzidos ao Objective-C eram importantes, pra evitar que você precise manualmente escrever código pra gerenciar memória, além da introdução de ferramentas como o DTrace e LLDB pra instrumentar seu código e conseguir analisar exatamente onde estão ocorrendo vazamentos, pra que você consiga consertar antes de mandar o binário final pra App Store.</p>
<p>E como desenvolvedor você ainda tem outro problema grave. Se você já tentou desenvolver pra Android deve ter notado que se quiser testar seu código antes de instalar no celular, a única forma de rodar no seu computador é usando uma máquina virtual. Não estou falando da JVM mas de máquinas virtuais de verdade como QEMU, VirtualBox ou VMWare. Primeiro porque o Android é um sistema operacional baseado em Linux e os binários estão pré-compilados pra processadores ARM. E binários de ARM não são compatíveis com processadores Intel que roda na sua máquina de desenvolvimento, seja PC ou Mac.</p>
<p>A única forma então é usar um emulador, que é uma máquina virtual, que vai traduzir as instruções de ARM em instruções de Intel. Quando você ouve que seu novo Samsung S10 ou mesmo Xiaomi Mi Mix rodam Qualcomm, você sabe que é um processador ARM. Então você programa seu aplicativo pra Android e sobe um emulador de Android como o da Bluestacks ou Nox ou qualquer outro no seu PC e ele vai emular o Android fazendo ele pensar que está rodando numa máquina ARM. Por isso é tudo tão absurdamente lento pra testar seu código, porque emular exige essa tradução de instruções e isso é lento. Não tem jeito.</p>
<p>Mas se você já desenvolveu pra iOS em Macs sabe que a mesma coisa não acontece quando você pede pra testar seu novo app de iPhone no seu Mac. Seu app roda com velocidade total, sem nenhuma lentidão. E você vai notar no XCode que quando vai rodar seu app no seu Mac de desenvolvimento, não existe uma opção pra subir um Emulador, como no Android, e sim um Simulador. A Apple fez uma coisa difícil mas que se pagou: eles compilam o sistema operacional iOS que roda em iPhone e iPad pra binários de Intel de verdade. Então quando você sobe o simulador, ele não precisa de uma máquina virtual pra traduzir as instruções, ele já é binário de Intel! E quando você compila seu projeto pra rodar no simulador o XCode está usando o LLVM pra cuspir binários de Intel também. Só quando você manda empacotar pra publicar na App Store que ele vai compilar em binário de ARM. Parece uma coisa meio óbvia de fazer, mas fazer isso da forma quase transparente como o XCode faz é impressionante até hoje dado que as ferramentas de desenvolvimento de Android do Google até hoje não fazem isso.</p>
<p>Por outro lado, alguns podem argumentar que apesar das funcionalidades impressionantes que a Apple conseguiu colocar no Objective-C, ele ainda tem a sensação de ser uma linguagem com sintaxe muito velha, especialmente se comparado ao Android onde o Google resolveu copiar a linguagem Java, embora similar ao J++ da Microsoft nos anos 90, ele também não é compatível com a JVM de verdade. O runtime do Android, o Dalvik é diferente. De qualquer forma, já discutimos como a linguagem Java também tem sintaxe considerada meio velha se comparada a coisas como Python ou Ruby ou mesmo Groovy. Mas se comparar com Objective-C - que eu pessoalmente gosto - a maioria vai dizer que prefere Java por estar mais acostumado e ter visto na faculdade.</p>
<p>Enquanto evoluía o LLVM, o Clang, os frameworks de iOS, as tecnologias do XCode, Chris Lattner começou a pensar numa nova sintaxe de linguagem. Assim em 2010 surgia o Swift, uma linguagem que é extremamente agradável ordens de grandeza se  comparado ao Objective-C. E aqui surge outra enorme vantagem do LLVM. Assim como você pode ter back-ends que cospem binários de Intel ou ARM, você também pode ter múltiplos front-end. Você já tinha o front-end que entendia Objective-C, então eles fizeram um novo front-end pra essa nova linguagem Swift. E qual a vantagem? Os binários de ambos Objective-C e Swift são compatíveis entre si. Então seria super fácil você migrar pra Swift e continuar consumindo as mesmas bibliotecas e frameworks que já existiam e eram feitos em Objective-C. Você não precisa reescrever tudo em Swift, pode migrar aos poucos.</p>
<p>Então no mundo de Mac e iOS você tem agora a escolha de usar Swift com sua sintaxe bem mais moderna inspirada em Ruby, Python, Groovy e outras linguagens, com construções modernas, com o ARC pra gerenciar memória e ter a facilidade de rodar sua aplicação iOS em velocidade máxima no simulador de iOS com tudo compilado em binário de Intel e depois facilmente empacotar em binário de ARM pra rodar no seu iPhone de verdade. Por isso muitos desenvolvedores preferem criar apps pra iOS antes de Android até hoje.</p>
<p>No mundo Android as coisas não eram muito agradáveis. O Google também teve sua parcela de dor de cabeça com processo por propriedade intelectual. Lembram que eu já falei várias vezes que a Sun tinha sido adquirida pela Oracle? Então, eles foram processados por usar Java e a Oracle veio atrás com força. Oito anos depois o processo ainda não acabou e em 2018 a Oracle estava ganhando a batalha. Mas todo esse stress não faz o Google ter muito amor pelo Java. Ao mesmo tempo eles decidiram começar a mudar o foco do Java pra outra linguagem, no caso o Kotlin.</p>
<p>No Android o processo é o seguinte: você escreve seu código em Java e pode usar um compilador normal pra gerar bytecodes Java. Por isso você pode também usar muitas bibliotecas Java que já existem. Daí o bytecode Java é traduzido num segundo conjunto diferente de bytecodes chamado DEX que é o que roda no Dalvik. Antes esse DEX era interpretado no Dalvik, e tinha mais ou menos as mesmas funcionalidades que uma JVM como um Just-in-time compiler ou JIT pra gerar o binário nativo de ARM à medida que era executado. Como eu também já disse, isso é bacana pra aplicativos que rodam num servidor que fica de pé por dias e dias. Mas num dispositivo móvel que você abre um aplicativo e fecha a qualquer momento, um JIT ajuda mas não tanto assim, porque ele não tem tempo pra otimizar como poderia. Fora que rodar um compilador JIT também consome processamento, e isso consome bateria, que é outra coisa que sempre falta em dispositivos móveis.</p>
<p>Então nas versões mais recentes o bytecode DEX é pré-compilado em binário nativo antes de rodar, esse é o processo que você vai ouvir falar como AOT ou Ahead-of-Time compiler. Que é o que um compilador normal como GCC ou Clang fazem: geram binários nativos. O processo de desenvolvimento no Android tem mais passos pra poder ter essa opção de compatibilidade com o bytecode Java, que foi uma jogada importante pra conseguir trazer programadores Java pro mundo Android sem precisar ensinar uma nova linguagem pra todo mundo.</p>
<p>Mas ao mesmo tempo temos a Oracle baforando no cangote do Google e a essa altura já disse várias vezes que Java é uma linguagem que já não é mais considerada agradável de trabalhar e nem tão produtiva se comparado a outras linguagens como o novo Swift. Então o Google foi bater na porta de outra empresa, a JetBrains, que a anos faz uma das melhores IDEs comerciais pro mundo Java, e em 2011 havia começado a criar uma nova linguagem, que assim como Groovy ou Scala ou Clojure também compilam em bytecode compatível com Java. Pro Google foi uma escolha fácil porque eles negociaram pra liberar as ferramentas da JetBrains de graça pra desenvolvedores Android e a evangelizar a nova linguagem deles, que é chamado de Kotlin. Kotlin que é finalmente uma linguagem moderna mas familiar e ser ser exótica demais como Clojure.</p>
<p>Então no mundo mobile, em iOS você ainda pode usar Objective-C que é considerado uma linguagem “velha” mas agora a maior parte do desenvolvimento é na linguagem Swift que é bem mais moderna e produtiva. Mesma coisa no mundo Android onde você ainda pode usar a linguagem Java e as bibliotecas Java que também já é considerado meio “velho” por muita gente mas também pode migrar pro Kotlin que está ainda em adoção por toda a comunidade Android. Você pode até misturar código Kotlin e Java no mesmo projeto. Na verdade, por coincidência, seja porque ambas se inspiraram em fontes parecidas na linhagem de linguagens, Swift e Kotlin tem sintaxes até que similares. Dependendo do código que você ver, pode até quase confundir um pelo outro. Claro, as bibliotecas de iOS e Android são bem diferentes, mas as duas linguagens são igualmente modernas e eu pessoalmente diria que são as melhores até agora para o mundo geral de programação de aplicativos, especialmente se comparar com Java ou C#.</p>
<p>Mas deixando o mundo mobile um pouco de lado, um dos resultados de tudo isso foi a evolução rápida do LLVM enquanto uma solução robusta pra desenvolvimento de compiladores. Em vez de ter que mexer no monolito complicado que é o GCC e ainda ter que lidar com a política da licença GPL v3, você pode ir pro LLVM e foi isso que muita gente fez, menos o Google. Pra ser justo, o Google contribui pro LLVM também mas não usa tão extensivamente quanto a Apple. A linguagem Go eles preferiram criar o compilador do zero, primeiro em C e depois traduzindo o código C no próprio Go. Lembra que eu falo que o Google tem a péssima mania de ficar reinventando a roda? A gente chama isso de NIH ou síndrome de Not-Invented Here, muitos programadores sofrem dessa síndrome de prima-donna de achar que pode fazer melhor que os outros.</p>
<p>Mas já sabemos que C/C++, Objective-C e Swift tem front-ends pra LLVM e sabemos que ele tem back-ends que geram binários pra Intel e ARM. E sabemos que ele tem um design mais moderno, mais modular e com ferramentas mais modernas pra desenvolvedores como o LLDB  que muitos consideram melhor do que o antigo GDB. E ele ficou muito bom em otimizar o IR pra gerar binários nativos quase tão performáticos quanto o GCC. Isso abre uma oceano de possibilidades. E se decidíssemos criar mais front-ends pra outras linguagens?</p>
<p>E foi isso que a comunidade open source começou mesmo a fazer. Hoje temos front-ends de LLVM pra ActionScript, Ada, C#, Common Lisp, Crystal, CUDA, D, Delphi, Fortran, Graphical G, Halide, Haskell, bytecode Java, Julia, Kotlin, Lua, Objective-C, a linguagem de shading de OpenGL, Pony, Python, R, Ruby, Rust, Scala, Swift, e Xojo.
Mas claro, algumas estão mais avançadas do que outras, algumas são mais experimentais. Algumas usam só algumas funcionalidades como o Just-in-Time compiler do LLVM que é o caso da linguagem Julia e inclusive em lugares inusitados como o banco de dados PostgreSQL que hoje também usa o JIT do LLVM pra otimizar queries complexas.</p>
<p>Uma das linguagens que você mais deve ter ouvido falar que depende de LLVM é o Rust da Mozilla. Agora você sabe o que roda por baixo do Rust e quem gera os binários. A linguagem Rust é uma das mais diferentes de todas que já mencionamos até agora. Sem entrar em muitos detalhes hoje, ela tem um foco maior no problema do gerenciamento de memória combinado com preocupação de segurança. Mas seu maior problema é o que chamamos da ergonomia da linguagem. Apesar de ser uma sintaxe moderna, ela realmente exige mais do desenvolvedor se comparado a um Swift ou Kotlin. Partes do Firefox hoje são escritos com Rust e, adivinhem, alguns evangelistas da linguagem são ex-rubistas também.</p>
<p>Outra linguagem que compila com LLVM que ainda não é muito conhecida mas que eu pessoalmente gosto bastante é a Crystal. Ela se parece muito, mas muito mesmo com Ruby já que é inspirada diretamente nela, e em alguns casos você pode quase copiar e colar trechos de código Ruby e compilar com Crystal sem mexer em nada, então a curva de aprendizado pra quem vem de Ruby é muito mais simples. Ao contrário de Rust a ergonomia da linguagem é muito melhor. Mas Rust tem características que a tornam mais adequadas como substituto de C pra desenvolver código nativo rápido e leve. O Crystal se assemelha mais ao Go, ele tem um runtime maior e um garbage collector maior também. Diferente do Go que tem o investimento infinito Google por trás, o Crystal é um esforço quase voluntário da comunidade, por isso anda mais devagar. Mas graças ao LLVM os binários que o Crystal gera são competitivos com Go mesmo nesse estágio.</p>
<p>E mesmo sem ser programador você provavelmente usa tecnologias LLVM hoje e nem sabe disso. Por exemplo tanto o SpiderMonkey que é a engine, ou motor, de Javascript do navegador Safari no MacOS e no iOS quanto o V8 que é a engine de Javascript do Chrome possuem a funcionalidade de Just-in-Time Compiler ou JIT que eu mencionei já hoje e no episódio anterior. Repetindo: Javascript é uma linguagem interpretada, como Python ou Ruby. O SpiderMonkey e o V8 recebem o arquivo de texto escrito em Javascript e fazem um parsing e começam a interpretar o código.</p>
<p>Porém como vocês já sabem e eu expliquei no episódio da História do Front-end nesta série, começou a surgir o conceito de Single Page Application, que é basicamente um site que se comporta mais como um aplicativo de desktop do que um site web normal de conteúdo. Na prática são sites onde você não fica navegando entre diversas páginas, você carrega uma página e fica nela e por sua vez ela carrega muito javascript pra controlar o comportamento. Imagine Google Docs, ou Spotify. Nesses casos as engines de Javascript, quando percebem que estão rodando faz algum tempo começam um processo que é mais devagar, que é o JIT, e começam a otimizar e compilar as partes do código Javascript mais executadas em binário nativo, que ainda depende do runtime das engines, mas é bem mais eficiente do que interpretação.  No caso, o SpiderMonkey usa o JIT do LLVM. SpiderMonkey e V8 passaram anos evoluindo e competindo pra ver quem era o melhor e acho que isso continua assim até hoje.</p>
<p>Por isso aplicativos como Spotify, Atom, Slack, Discord e outros conseguem rodar com performance aceitável. Some a isso que os navegadores por baixo hoje suportam CSS acelerado pelo hardware gráfico, as GPUs como o que já vem integrado no seu processador Intel ou placas externas como os GeForce da NVIDIA ou os Radeon e Vega da AMD. A evolução do que chamamos de GPU foi uma explosão neste século como o de CPUs foi nos anos 70 a 2000. Num determinado momento as GPUs passaram a suportar shaders, que como o nome diz, serviam pra controlar a sombra ou tonalidade das cores. Mas em breve elas passaram a ser programáveis numa linguagem similar a C. E adivinhem, podemos acelerar esses shaders compilando em tempo real, via um JIT, usando LLVM hoje em dia. Por isso se você executar um VirtualBox, a renderização gráfica via software, que é lento, hoje é compilado via JIT por um driver chamado llvmpipe. Se você lida com desenvolvimento com placas NVIDIA tem o compilador pros CUDA cores da GeForce, e a NVIDIA contribuiu os códigos de back-end pra permitir gerar shaders pras suas placas diretamente no LLVM abrindo as portas pra qualquer linguagem poder se beneficiar do processamento paralelo massivo em GPUs.</p>
<p>Agora, o último assunto de hoje pra você entender como o LLVM pode ir mais longe. O Front-end pode ser qualquer linguagem, ele cospe o IR, que é otimizado e depois passado pra um Back-end, que também pode ser qualquer coisa, por exemplo, os back-ends que geram binários de Intel ou ARM como já repeti várias vezes. Porém, vocês já viram que existem os transpilers, como o do Typescript que cospe Javascript. E se pudéssemos usar um front-end de C como o Clang e usar um back-end que cospe Javascript?</p>
<p>Esse é o projeto Emscripten. A demonstração mais impressionante se não me engano em 2014 foi quando a Epic Games pegou uma animação usando a engine de jogos Unreal e compilou com esse Emscripten, usando LLVM, de C pra Javascript e somado às capacidades de aceleração via GPUs dos navegadores via WebGL, conseguiu rodar o que antes era um programa nativo dentro de um navegador, com excelente performance graças a tudo que eu expliquei que dá pra fazer com LLVM. Pra fazer isso, eles limitaram o Javascript num sub-conjunto que ficou conhecido como ASM.js. O conceito é simples: CPUs tem instruções nativas, que podemos escrever em Assembly e usar um Assembler pra cuspir o bytecode nativo da máquina. Máquinas virtuais como a JVM tem seus bytecodes. E se considerarmos que o Javascript é um assembly da máquina virtual chamada navegador?</p>
<p>Isso abre todo um leque de possibilidades. E foi o que inspirou o projeto WebAssembly que surgiu pra formalizar esse sub-conjunto de Javascript que poderia ser o back-end pra compiladores baseados em LLVM. Hoje em dia ainda temos o Enscripten pra compilar em ASM.js e o novo projeto Brynaryen que nasceu sendo uma extensão do Enscripten mas foi reescrito do zero em C++ pra gerar WebAssembly - maldita síndrome de not-invented here, a Mozilla também sofre disso como o Google. Ainda não tivemos nenhum resultado bombástico, mas diversos grupos estão fazendo experimentos pra entender o que realmente podemos fazer. Se você procurar por emscripten vai ver demonstrações muito interessantes, inclusive uma pequena distribuição de Linux compilado inteiro com Emscripten e rodando dentro do navegador, sem emulação nem nada. Na prática, no futuro, poderíamos escrever aplicativos Web em qualquer linguagem e compilar tanto pra WebAssembly quanto pra binário nativo se quiséssemos. Mas ainda estamos no começo dessa jornada.</p>
<p>E por hoje vamos ficar por aqui, pra variar virou um episódio grande, mas eu queria contar essa história pra que você pudessem entender como política influencia a evolução das linguagens, ferramentas e arquiteturas que nós usamos hoje. Não é só uma questão se determinada linguagem é mais rápida que outra ou não. Como programador você precisa entender como diversos fatores externos e modelos de negócio e interesses políticos influenciam tudo que você usa.</p>
<p>Na semana que vem vou retornar ao tema de back-end falando sobre outro assunto que é controverso e muitos se confundem até hoje: concorrência e paralelismo e como diferentes linguagens lidam com isso de formas diferentes. Se ficou com dúvidas nesse episódio não deixe de mandar nos comentários abaixo, se curtiram mandem um joinha, compartilhem com seus amigos, assinem o canal e não deixem de clicar no sininho pra não perder os próximos episódios. A gente se vê semana que vem, até mais!</p>
]]></content:encoded><category>linguagens-de-programacao</category><category>apple</category><category>open-source</category><category>akitando</category></item><item><title>[Akitando] #7 - A Controvérsia da Lerna vs ICE</title><link>https://akitaonrails.github.io/2018/09/04/akitando-7-a-controversia-da-lerna-vs-ice/</link><guid isPermaLink="true">https://akitaonrails.github.io/2018/09/04/akitando-7-a-controversia-da-lerna-vs-ice/</guid><pubDate>Tue, 04 Sep 2018 11:00:00 -0300</pubDate><description>&lt;p&gt;Disclaimer: esta série de posts são transcripts diretos dos scripts usados em cada video do canal &lt;a href="https://www.youtube.com/channel/UCib793mnUOhWymCh2VJKplQ"target="_blank" rel="noopener"&gt;Akitando&lt;/a&gt;. O texto tem erros de português mas é porque estou apenas publicando exatamente como foi usado pra gravar o video, perdoem os errinhos.&lt;/p&gt;
&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/WObC_2e0kZk"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3&gt;Descrição no YouTube&lt;span class="hx:absolute hx:-mt-20" id="descrição-no-youtube"&gt;&lt;/span&gt;
&lt;a href="#descri%c3%a7%c3%a3o-no-youtube" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Semana passada aconteceu uma pequena controvérsia no mundo Javascript quando um colaborador do Core Team da Lerna decidiu mudar a licença de uso do projeto para proibir colaboradores de empresas como Palantir, Microsoft de usar o projeto.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Disclaimer: esta série de posts são transcripts diretos dos scripts usados em cada video do canal <a href="https://www.youtube.com/channel/UCib793mnUOhWymCh2VJKplQ"target="_blank" rel="noopener">Akitando</a>. O texto tem erros de português mas é porque estou apenas publicando exatamente como foi usado pra gravar o video, perdoem os errinhos.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/WObC_2e0kZk"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<h3>Descrição no YouTube<span class="hx:absolute hx:-mt-20" id="descrição-no-youtube"></span>
    <a href="#descri%c3%a7%c3%a3o-no-youtube" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Semana passada aconteceu uma pequena controvérsia no mundo Javascript quando um colaborador do Core Team da Lerna decidiu mudar a licença de uso do projeto para proibir colaboradores de empresas como Palantir, Microsoft de usar o projeto.</p>
<p>Vamos entender exatamente o que significa isso.</p>
<p>Seguem os links para este episódio:</p>
<ul>
<li>
<p>Lerna project (<a href="https://lernajs.io/"target="_blank" rel="noopener">https://lernajs.io/</a>)</p>
</li>
<li>
<p>Pull Request 1616: (REVERTED): Add Text to MIT License banning ICE collaborators (<a href="https://github.com/lerna/lerna/pull/1616"target="_blank" rel="noopener">https://github.com/lerna/lerna/pull/1616</a>)</p>
</li>
<li>
<p>Pull Request 1633: chore: Restore unmodified MIT license (<a href="https://github.com/lerna/lerna/pull/1633"target="_blank" rel="noopener">https://github.com/lerna/lerna/pull/1633</a>)</p>
</li>
<li>
<p>Eric Raymond: Non-discrimination is a core value of open source (<a href="http://esr.ibiblio.org/?p=8106"target="_blank" rel="noopener">http://esr.ibiblio.org/?p=8106</a>)</p>
</li>
<li>
<p>The Cathedral and the Bazaar (<a href="http://www.catb.org/esr/writings/cathedral-bazaar/"target="_blank" rel="noopener">http://www.catb.org/esr/writings/cathedral-bazaar/</a>)</p>
</li>
<li>
<p>The Open Source Definition (<a href="https://opensource.org/osd-annotated"target="_blank" rel="noopener">https://opensource.org/osd-annotated</a>)</p>
</li>
<li>
<p>Free Software Foundation (<a href="https://www.fsf.org/"target="_blank" rel="noopener">https://www.fsf.org/</a>)</p>
</li>
<li>
<p>Choose an open source license (<a href="https://choosealicense.com/"target="_blank" rel="noopener">https://choosealicense.com/</a>)</p>
</li>
<li>
<p>AkitaOnRails: [Off-Topic] Software Livre: Exercício de CAPITALISMO (<a href="http://www.akitaonrails.com/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo"target="_blank" rel="noopener">http://www.akitaonrails.com/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo</a>)</p>
</li>
<li>
<p>Eclipse CPL to EPL Transition (<a href="https://www.eclipse.org/legal/cpl2epl/cpl2eplfaq.php"target="_blank" rel="noopener">https://www.eclipse.org/legal/cpl2epl/cpl2eplfaq.php</a>)</p>
</li>
</ul>
<h2>Script<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Olá pessoal, Fabio Akita</p>
<p>Mudando completamente de assunto de blockchains e Coréia, vamos falar um pouco de software, mais precisamente, sobre licenças de software e algumas coisas que talvez vocês ainda não saibam.</p>
<p>Me deu vontade de falar um pouco sobre isso por causa da recente controvérsia do projeto Lerna, que se descreve como uma ferramenta para gerenciar projetos javascript num repositório com múltiplos pacotes, um monorepo.</p>
<p>E o assunto em questão foi a recente tentativa de radicalmente mudar a licença do software pra restringir o uso de empresas como Palantir ou Microsoft, que de alguma forma estão ligados com a controvérsia da ICE, a US Immigration and Customs Enforcement. Eu sempre fui favorável a não existir políticas restritivas e punitivas de fronteiras, especialmente a que está em discussão agora nos Estados Unidos.</p>
<p>(&hellip;)</p>
<p>Eu não quero entrar no assunto de política internacional. Deixo isso para quem tem experiência no assunto, eu certamente não tenho.</p>
<p>Mas eu certamente tenho experiência com software e licenças e quero ajudar os desenvolvedores a entender o que significa esse episódio.</p>
<p>O ponto em questão foi a abrupta decisão do contribuidor do core team do Lerna, Jamie Kyle em fazer um pull request que edita a licença MIT que a Lerna usa e adicionar cláusulas restritivas e retroativas, literalmente excluindo o uso pelas empresas Palantir, Microsoft, Amazon, Ernst &amp; Yount, Thomson Reuters, Deloitte, Johns Hopkins University, Dell, Xerox, Canon, Linkedin e algumas outras.</p>
<p>Esse assunto apareceu no canal de chat da minha empresa. A gente discute assuntos assim de vez em quando, o que é bem legal. Nem precisei saber a motivação (se é ICE ou o que for), na hora eu já respondi que isso não rolar. Não precisa ser gênio pra saber isso.</p>
<p>E de fato, no dia seguinte, o pull request foi revertido por outro líder do projeto, Daniel Stockman, e o Jamie Kyle foi banido do projeto, citando episódios anteriores que ele fere o código de conduta do projeto. Ironicamente código de conduta que o próprio Jamie adicionou ao projeto.</p>
<p>E porque eu imediatamente já sabia que isso ia acontecer? Vamos entender.</p>
<p>Se você cria código e libera esse código num repositório público, ele ainda é SEU código. Não só código. Quando você faz um trabalho criativo, o trabalho está automaticamente sob seu copyright. A menos que você inclua uma licença, NINGUÉM pode copiar, distribuir, ou modificar seu trabalho sob o risco de tomar um processo.</p>
<p>Agora, à medida que o trabalho tem outros colaboradores esse NINGUÉM inclui você.</p>
<p>Na prática, se você colocar o seu projeto no GITHUB você já concordou com termos de uso dele, dizendo que seu projeto é automaticamente liberado para visualização por qualquer um e portanto passível de sofrer FORK. Qualquer um no GITHUB pode fazer FORK do seu projeto e modificá-lo a partir desse ponto dependendo da licença.</p>
<p>Copyright é um direito legal que, por um certo período de tempo, lhe dá a autonomia de decidir o que fazer com seu próprio trabalho. Aliás, você é responsável por enforçar esse copyright. Independente do que você quer, você, criador, detém esse direito.</p>
<p>Na prática, se você um dia ver um software sem nenhuma licença, passa longe dele! Você está assumindo um risco desnecessário se usar um software sem licença, especialmente se adicionar seu próprio código em cima disso. Se escolher usar mesmo assim, você foi avisado.</p>
<p>Agora, você pode fazer o que quiser com esse direito, incluindo jogar totalmente fora. Se é isso que você quer, você pode usar um Unlicense, que é basicamente abrir mão do direito e torná-lo public domain. A partir daqui é terra de ninguém, qualquer um pode fazer qualquer coisa.</p>
<p>Normalmente o que se faz é: você retém o direito do copyright, mas adiciona uma licença que permite o uso. A licença define o que se pode fazer com esse software e dá garantias aos usuários sobre o uso, cópia, modificação e distribuição.</p>
<p>Agora, você pode escolher uma licença permissiva, ou seja, que dá total liberdade aos usuários ou uma licença restritiva, ou seja, que restringe as liberdades do usuário.</p>
<p>Licenças como MIT ou BSD são permissivas, e é por isso que muitos usam. Dentre as liberdades, a mais importante é que você pode lançar como um produto comercial sem liberar o código fonte modificado.</p>
<p>Licenças como GPL e AGPL são bem restritivas, e essas as empresas precisam passar longe se não souberem com o que estão lidando. Muitos chamam esse tipo de licença de um vírus porque ele se propaga a toda modificação que você fizer e você é obrigado a liberar o código fonte modificado e não pode distribuí-lo comercialmente sem soltar esse código junto. GPL v3 e AGPL são particularmente nefários nesse aspecto. AGPL é feito para quebrar o truque dos Software as a Service.</p>
<p>Num SaaS você pode usar um software GPL v2 (versão 2) mas não precisa liberar o código fonte porque você não está distribuindo o software. Você está liberando acesso à execução do código modificado através de APIs. Então os seus usuários não usam diretamente o código. Pois bem, o AGPL diz que mesmo nesse caso se alguém usa o seu software GPL modificado através da rede, você precisa liberar o código fonte.</p>
<p>Outra forma de burlar o GPL, no caso o GPL v2 é o que ficou conhecido como Tivoização. Tivo é o avô de hardwares como Apple TV ou Google Chromecast. A Tivo usa Linux e outros softwares que são licenciados com GPL v2. Eles liberam o software conforme a licença, mas o hardware é bloqueado e não deixa rodar outro binário que possa ser verificado via assinatura digital, então na prática você tem o código mas não pode rodar no hardware. O povo do Richard Stallman ficou bravo com isso e foi o que levou ao GPL v3 que permite uso de assinatura digital para propósitos de segurança mas evita cenários como a Tivoização.</p>
<p>Uma das consequências disso é a eterna rixa entre o povo do BSD, mais especificamente o FreeBSD que, apesar de não usar a kernel do Linux, usa outros componentes como o compilador GCC. A filosofia do BSD é ser o mais livre possível e eles nunca gostaram muito do GPL v2 por restringir a liberdade dos usuários. A kernel do Linux permaneceu em GPL v2 mas quando componentes como GCC foram migrados para v3 o povo do FreeBSD resolveu levar a sério sair do gcc e foi quando começaram a usar CLang/LLVM no lugar.</p>
<p>BSD, como vocês sabem é a base do Darwin que é a fundação do MacOS e iOS. É uma das razões de porque a Apple investiu tanto em LLVM. Hoje em dia eles também usam somente Clang/LLVM em vez de GCC, e isso acabou gerando frutos possibilitando uma arquitetura flexível e mais moderna e facilitou a invenção da linguagem Swift. Mas isso é tema pra outro episódio.</p>
<p>Como vocês podem ver, licenças é um assunto bem cabeludo. Mas no coração de tudo isso está a história de Richard Stallman e a Free Software Foundation (FS) e a história da Open Source Initiative (OSI) de Eric Raymond, autor do famoso livro The Cathedral and the Bazaar. Esse é o livro que torna famoso a Lei de Linus que diz “dados olhos suficientes, todos os bugs são superficiais”.</p>
<p>Parece a mesma coisa, mas Free Software não é Open Source Software. Open Source é naturalmente mais difundido hoje porque ele é ironicamente mais Free do que o Free Software Foundation, já que é mais amigável a empresas. A Free Software tem a visão mais &ldquo;pura&rdquo; da liberdade do software mas restringindo as liberdades das pessoas. O Free da FSF é manter o software Free, o Free da OSI é garantir as liberdade do uso do software - que incluir a liberdade de fechar o software. Ambos estão certos no abstrato. Eu sempre compartilhei da filosofia da FSF mas eu sei como ela não é tão prática no mundo real comparada à OSI.</p>
<p>Muita gente usa free e open source software. Vocês precisam no mínimo ler os textos que explicam a filosofia GNU no site gnu.org e ler os textos de Eric Raymond.</p>
<p>Free e Open source não deve ter nenhuma conotação política. Política necessariamente define e discrimina grupos. Eric Raymond inclusive criticou sobre o episódio da Lerna dizendo que a Lerna deserdou da comunidade open source e deveria ser evitado por qualquer um que valorize a saúde da comunidade. Ele continua dizendo que a escolha do projeto Lerna destrói uma das normas mais profunda que mantém a comunidade open source funcional: manter política separado do trabalho. Leia o blog post do Eric no link que deixei na descrição do vídeo abaixo.</p>
<p>Na página que define Open Source no site da OSI existe a 5a cláusula: Não discriminação contra pessoas ou grupos. Você jamais pode dizer que é pró-diversidade se você age ativamente para discriminar grupos. E aqui vem o problema: não importa quais grupos, quer você concorde com eles ou não.</p>
<p>Uma frase erroneamente atribuida a Voltaire mas que na verdade foi da escritora inglesa Evely Beatrice Hall que eu uso no cabeçalho do meu perfil do Facebook diz: “Eu discordo do que você diz, mas eu vou defender com minha vida o seu DIREITO de dizer isso.”</p>
<p>É muito fácil dizer &ldquo;somos inclusivos&rdquo;. Ser inclusivo só com seus amigos ou grupo próximo é fácil. Você só sabe se é realmente inclusivo se você tolera alguém que você odeia. Se não conseguir isso, você é, por definição, discriminatório. É muito fácil se auto intitular altruísta, o verdadeiro altruísta primeiro não busca reconhecimento e está disposto a ajudar até mesmo aquele que ele sabe que não o ajudaria. Fora disso você não é nem inclusivo e nem altruísta, está apenas trocando uma boa ação por auto promoção.</p>
<p>E tudo bem, não existe nenhuma lei dizendo que você precisa fazer isso. Você tem o direito de se auto promover. E sabendo disso, para trabalhar em grupos numa comunidade ou na sociedade, você precisa aprender a separar sua ideologia fast-food ou política da moda e o seu trabalho. E pior: tentar fazer ativismo em torno de uma causa que parece justa, fazendo uma ação que é injusta, discriminatória e sequer legalmente válida - ou potenticialmente ilegal é ERRADO. Não se corrige um mal fazendo outro mal, NÃO IMPORTA a intenção. Ou você respeita a lei, ou você não é diferente de quem está criticando, é assim simples. Não existe “ah mas ele fez pior”. Um mal grande ou um mal pequeno, ambos são maus.</p>
<p>Free e Open Source NÃO é um movimento político. Ele não foi feito pra ser usado pra ativismo. Ele não foi feito pra ser usado como instrumento político. Ele não tem conotações sociais. Os desenvolvedores, fora do código, fora do projeto, deveriam ter total liberdade para fazerem o que quiserem, se quiserem ser pró-Trump ou anti-Trump, pró-ICE, ou anti-ICE, não é da conta de ninguém. Por isso eu não gosto da forma como códigos de conduta tem sido usados para ligar a vida pessoal de alguém com sua colaboração.</p>
<p>Colaboração no mundo open source é voluntário. É uma troca justa. Você investe seu tempo e conhecimento construindo partes de um software. Quanto mais o software se torna famoso, mais seu investimento tem um retorno. As empresas podem usar o software com menos custos de manutenção do que se eles tivessem que fazer tudo do zero dentro de casa, então investir em open source também tem retorno de investimento. Open source é um exemplo real de livre-mercado em funcionamento. Só porque um projeto se torna open source, isso não garante seu sucesso, tanto quanto abrir uma empresa não garante que você vai ficar rico. É um ambiente de seleção natural e sobrevivência do mais adaptável.</p>
<p>O mundo open source, ao contrário do que a maioria pensa, é um dos melhores exemplos de livre mercado capitalista pra lidar com softwares que são commodities. Acredite: todo software que não é commodity, não tá aberto ao público.</p>
<p>As licenças de software garantem o uso, modificação e distribuição. A propriedade do projeto, é dos colaboradores.</p>
<p>Você pode mudar uma licença. Mas pra isso precisa colher a autorização de todas as pessoas que já colaboraram com seu projeto. E não se trata de conseguir 51%, precisa de 100%, não importa se a pessoa fez só um commit mudando uma única linha. Ou você valoriza a contribuição de todo mundo ou você não valoriza ninguém. Não existe &ldquo;a maioria decide e a minoria cala a boca&rdquo;. Se fosse assim, open source não existiria como é hoje.</p>
<p>Quando o projeto Eclipse mudou sua licença do CPL para EPL ele levaram mais de um ano pra conseguir todas as aprovações e isso tendo sido bem organizados nesse trabalho.</p>
<p>Achar todas as pessoas pode ser difícil. Conseguir consenso é mais difícil ainda. Talvez você precise remover o código daqueles que não concordaram.</p>
<p>E isso é pra realizar a mudança da licença. Mas mesmo assim, mudanças de licença não são retroativas. Se você deu a licença de uso, você Não pode removê-la no passado. Só pra novos usuários, e só pra novas versões. Senão eu estou retirando direitos que eu dei aos primeiros usuários, se eu fizer isso, qual o propósito de se ter uma licença em primeiro lugar? E que tipo de mal caráter eu estou me tornando se acho que isso é certo? Ah mas a intenção era boa. Não importa. Não é relevante. Você deu uma licença ao usuário que confiou e colaborou no seu software, agora você quer tirar isso dele para comprar a sua consciência frente a um assunto que importância pra você mas pode não ter pra todo mundo. Isso se chama egoísmo. E o assunto em questão eu só vejo de uma forma: criancice e desperdício de talento. Uma pena pois parece que o Jamie costumava ser um bom contribuidor.</p>
<p>Isso tudo que eu acabei de falar é óbvio. Deveria ser óbvio. Deveria ser ainda mais óbvio se você um contribuidor de um Core Team de algum projeto. Um adulto não pode dizer &ldquo;eu era ignorante da lei&rdquo;.  Você não pode assaltar um banco e dizer &ldquo;puts, eu não sabia que não podia assaltar um banco&rdquo;. Ignorância da lei não o torna isento da lei. É SEU direito não se interessar em saber da lei, mas a lei existe independente do que você acha e ela se aplica IGUAL pra todos, independente das suas convicções.
De qualquer forma, o episódio deu uma repercussão mais porque a mídia está toda alvoraçada em torno esse negócio da ICE. O dano foi revertido, mas no frigir dos ovos o projeto e a comunidade ao redor dela foi muito prejudicada por causa de uma ação imatura e impensada. Fica o exemplo.</p>
<p>O assunto de licença, ética, leis direitos é super longo e daria pra fazer uma série inteira, então vou parar por aqui. Espero que este episódio tenha aberto um pouco mais a cabeça de vocês se ainda não sabiam dos conceitos que eu disse aqui. O principal: de boas intenções o inferno tá cheio. Crianças, fiquem longe de confusão! Não vale a pena!</p>
<p>Coloquei links na descrição do vídeo. Contribuam com feedback na seção de comentários abaixo, se gostaram dêem um joinha, não deixem de assinar o canal e clicar no sininho para não perderem os próximos episódios! A gente se vê na próxima! Até mais!</p>
]]></content:encoded><category>open-source</category><category>leis-e-regulacao</category><category>javascript</category><category>akitando</category></item><item><title>3 Meses de GitLab. A Era do SaaS Híbrido</title><link>https://akitaonrails.github.io/2016/11/16/3-meses-de-gitlab-a-era-do-saas-hibrido/</link><guid isPermaLink="true">https://akitaonrails.github.io/2016/11/16/3-meses-de-gitlab-a-era-do-saas-hibrido/</guid><pubDate>Wed, 16 Nov 2016 16:44:00 -0200</pubDate><description>&lt;p&gt;Se você ainda não leu, talvez seja uma boa ideia dar uma olhada no meu post anterior &lt;a href="https://about.gitlab.com/2016/08/04/moving-to-gitlab-yes-its-worth-it/"target="_blank" rel="noopener"&gt;Moving to GitLab! Yes, it&amp;rsquo;s worth it!&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Minhas impressões vêm de circunstâncias bem específicas, então isso aqui não deve ser lido como recomendação geral para qualquer situação. Por exemplo, eu não avaliei as opções hospedadas do GitLab, que podem ser mais compatíveis com cenários diferentes do meu.&lt;/p&gt;
&lt;p&gt;No meu caso, a mudança para o GitLab fez parte de uma estratégia interna da empresa para ter mais controle sobre nossos próprios dados. Nessa mesma estratégia também migramos do Slack para o Mattermost, e do Pivotal Tracker para uma alternativa open source que eu mesmo mantenho, chamada &lt;a href="https://github.com/Codeminer42/cm42-central"target="_blank" rel="noopener"&gt;Central&lt;/a&gt;, entre outras coisas.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Se você ainda não leu, talvez seja uma boa ideia dar uma olhada no meu post anterior <a href="https://about.gitlab.com/2016/08/04/moving-to-gitlab-yes-its-worth-it/"target="_blank" rel="noopener">Moving to GitLab! Yes, it&rsquo;s worth it!</a>.</p>
<p>Minhas impressões vêm de circunstâncias bem específicas, então isso aqui não deve ser lido como recomendação geral para qualquer situação. Por exemplo, eu não avaliei as opções hospedadas do GitLab, que podem ser mais compatíveis com cenários diferentes do meu.</p>
<p>No meu caso, a mudança para o GitLab fez parte de uma estratégia interna da empresa para ter mais controle sobre nossos próprios dados. Nessa mesma estratégia também migramos do Slack para o Mattermost, e do Pivotal Tracker para uma alternativa open source que eu mesmo mantenho, chamada <a href="https://github.com/Codeminer42/cm42-central"target="_blank" rel="noopener">Central</a>, entre outras coisas.</p>
<p>Antes da migração, eu tinha dezenas de projetos ativos no GitHub e uma porção de projetos arquivados no Bitbucket. Sou do tipo que odeia perder dado, então mantenho backups redundantes e tento nunca apagar nada.</p>
<p>Movi praticamente tudo para meu próprio servidor GitLab e isso dá quase <strong>200 repositórios</strong>, espalhados em 4 grupos, com cerca de 80 usuários ativos. Isso representa mais de 13.500 notas, mais de 5.200 Merge Requests, mais de 2.500 builds no CI, e o Sidekiq interno que controla tudo isso já processou mais de 51.000 jobs.</p>
<p>Nos últimos 3 meses desde a migração, venho pagando uma conta de Digital Ocean em torno de $140 por mês pela infraestrutura exata que descrevi no artigo anterior, com máquinas separadas para o GitLab Core, o CI Runner, o CI Docker Registry Mirror, o servidor de cache do CI e máquinas descartáveis para builds paralelos, controladas pelo Runner.</p>
<p>A redução de custo é bem-vinda, claro, mas não foi por causa dela que fui atrás dessa empreitada toda. Eu pagaria tranquilamente o dobro ou o triplo só pela conveniência, só que a estratégia por trás é o que mais importa nesse caso.</p>
<p>Minha empresa tem mais de 60 desenvolvedores, trabalhando a partir dos nossos próprios escritórios em 6 cidades diferentes no Brasil (sem freelancers e sem home-office), se comunicando diariamente pelo Mattermost, fazendo Code Review via Merge Requests do GitLab, recebendo feedback automatizado imediato dos testes pelo GitLab CI, e gerenciando projetos através da nossa própria aplicação Central.</p>
<p>A única peça que ainda está faltando é uma boa ferramenta de análise estática de código. A gente depende bastante do Code Climate, que na nossa experiência é uma das melhores opções que existem hoje.</p>
<p>Eu estava prestes a começar uma empreitada para construir uma versão OSS simplificada para integrar com o GitLab CI, mas o <a href="http://blog.codeclimate.com/blog/2016/10/06/series-a-and-community-edition/"target="_blank" rel="noopener">Bryan Helmkamp anunciou recentemente</a> que eles vão lançar a própria &ldquo;Community Edition&rdquo; do Code Climate nos próximos meses.</p>
<p>Essa é exatamente a peça que faltava no meu stack, e vai acelerar minha estratégia para o ano que vem.</p>
<h3>A Era do SaaS Híbrido<span class="hx:absolute hx:-mt-20" id="a-era-do-saas-híbrido"></span>
    <a href="#a-era-do-saas-h%c3%adbrido" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Nos últimos 5 a 10 anos houve um movimento rápido em direção a uma estrutura de &ldquo;micro-serviços&rdquo; de terceiros. E isso é realmente ótimo, porque permitiu que muitas empresas pequenas ou até desenvolvedores independentes tivessem acesso a tecnologias que os fizeram andar mais rápido e com cada vez mais qualidade na entrega.</p>
<p>Hoje é super fácil ter um serviço de upload e storage de primeira linha com ferramentas como Cloudinary.</p>
<p>Também é muito fácil ter um banco relacional de ponta, com replicação e escalabilidade, como Heroku Postgres ou AWS RDS.</p>
<p>Gerenciamento de projetos como serviço com Pivotal Tracker, Trello.</p>
<p>Comunicação como serviço com Slack, Hangout, etc.</p>
<p>Gestão de conhecimento como serviço com GitHub, Bitbucket, etc.</p>
<p>Então hoje muitas empresas de tecnologia são um mashup de vários serviços de terceiros diferentes.</p>
<p>Minha pequena implicância é que todo o nosso conhecimento, experiência, portfólio, fica espalhado por uma dúzia ou mais de serviços opacos, completamente fora do nosso controle e dependendo do capricho de cada empresa (ou dos investidores delas).</p>
<p>Não me entenda mal, sou a favor de usar esses serviços, pelo contrário. Uso vários e vou continuar usando muitos deles no futuro previsível. Algumas empreitadas nem seriam possíveis sem a eficiência desse pedaço de um mercado livre baseado em tecnologia.</p>
<p>Só que de vez em quando você chega num ponto de virada onde passa a ser importante ter mais controle sobre seus próprios dados, sua própria identidade. Tanto pela posse em si quanto pela possibilidade de usar esses dados com mais intenção.</p>
<p>E acredito que, chegado esse ponto, a gente deveria ter uma opção que não custasse um rim e um pulmão pra replicar.</p>
<p>Antes de uma opção como o GitLab, estávamos limitados a escolher entre jardins murados como GitHub ou Bitbucket, ou então investir uma tonelada de recursos tentando juntar pequenos componentes open source para construir o seu próprio. Com o GitLab agora temos a opção de fazer uma transição suave para a versão hospedada, sem precisar encarar manutenção de infraestrutura, ou podemos optar por ter controle total. E os usuários não sofrem no processo.</p>
<p>Por isso acredito que o melhor SaaS para sobreviver à próxima década vai começar a entrar no <strong>modo Híbrido</strong>: ter uma opção comercial, hospedada, geralmente &ldquo;mais barata&rdquo;, e uma versão OSS DIY (do-it-yourself).</p>
<p>GitLab é assim. Mattermost é assim. Agora o Code Climate está ficando assim.</p>
<p>Nessa opção, empresas como o GitLab ficam numa situação ganha-ganha. Muito mais gente e empresas podem contribuir para fazer uma plataforma madura e robusta que todo mundo gosta de usar, e ao mesmo tempo cada participante pode estender a ferramenta para seus próprios planos particulares. O GitLab consegue ter um modelo de negócio sustentável atendendo a cauda longa de empresas e desenvolvedores que querem um serviço hospedado razoavelmente acessível, enquanto os 20% do topo podem perseguir empreitadas mais específicas usando a mesma tecnologia.</p>
<p>Dessa forma tiramos a discussão de confidencialidade, do jeito como as empresas tratam nossos dados, e avançamos para ações mais produtivas como construir uma ferramenta que beneficia tanto o público externo quanto os planos internos de cada um.</p>
<p>Jardins murados vieram para ficar. Liberar integração - ainda que opaca - via APIs públicas não é suficiente. É muito animador ver essas novas opções surgindo para preencher essa lacuna. O ambiente OSS junto de um modelo de negócio sustentável faz sentido. E espero continuar vendo cada vez mais concorrentes de serviços fechados seguindo o modelo Híbrido num futuro próximo.</p>
<p>Por que dar o trabalho de instalar, manter e ajustar alternativas open source para serviços hospedados (ainda que opacos) bem estabelecidos? Acredito que seja uma discussão maior do que conveniência, manutenção e corte de custos. A gente deveria começar pequeno, com menos risco, mas à medida que cresce deveria conseguir retomar o controle. Só que normalmente não dá para sair de um jardim murado sem um investimento significativo - e às vezes impossível - em reinventar a roda. Sempre tivemos os pequenos componentes open source sobre os quais esses serviços são construídos, mas ir desses pequenos componentes até um sistema completo é um caminho irrealista.</p>
<p>Com essa tendência possível de pós-SaaS, ou SaaS Híbrido como eu chamo, talvez a gente tenha acabado de ganhar o elo que faltava para ir da mera conveniência ao controle total sem o abismo inerente de custos e riscos.</p>
]]></content:encoded><category>controle-de-versao</category><category>open-source</category><category>negocios</category></item><item><title>[Off-Topic] Software Livre: Exercício de CAPITALISMO</title><link>https://akitaonrails.github.io/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo/</link><guid isPermaLink="true">https://akitaonrails.github.io/2016/04/22/off-topic-software-livre-exercicio-de-capitalismo/</guid><pubDate>Fri, 22 Apr 2016 15:30:00 -0300</pubDate><description>&lt;p&gt;Uma frase do &lt;a href="http://www.akitaonrails.com/2016/04/20/off-topic-se-voce-precisa-de-validacao-provavelmente-esta-errado"target="_blank" rel="noopener"&gt;meu artigo anterior&lt;/a&gt; causou estranheza em algumas pessoas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;A base disso é o mundo open source: a maior experiência capitalista do mundo do software e um exemplo vivo para todos do que é um Mercado Livre Laissez-faire. O melhor lugar para manter e melhorar commodities de tecnologia.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A estranheza vem da palavra &amp;ldquo;free&amp;rdquo;. Por causa dos princípios de liberdade do Free Software, muita gente associa o mundo do código aberto a uma grande experiência &amp;ldquo;socialista&amp;rdquo;. Minha tese é o contrário: software livre é a experiência mais capitalista que existe no software. Nenhum governo regula, nenhuma agência protege projeto ruim, toda troca é voluntária e a competição decide quem sobrevive. Um mercado assim não existe em nenhum setor da economia real; o período histórico mais próximo dele foi o fim do século XIX nos EUA, antes do Federal Reserve e do imposto de renda federal.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Uma frase do <a href="http://www.akitaonrails.com/2016/04/20/off-topic-se-voce-precisa-de-validacao-provavelmente-esta-errado"target="_blank" rel="noopener">meu artigo anterior</a> causou estranheza em algumas pessoas:</p>
<blockquote>
  <p>&ldquo;A base disso é o mundo open source: a maior experiência capitalista do mundo do software e um exemplo vivo para todos do que é um Mercado Livre Laissez-faire. O melhor lugar para manter e melhorar commodities de tecnologia.&rdquo;</p>

</blockquote>
<p>A estranheza vem da palavra &ldquo;free&rdquo;. Por causa dos princípios de liberdade do Free Software, muita gente associa o mundo do código aberto a uma grande experiência &ldquo;socialista&rdquo;. Minha tese é o contrário: software livre é a experiência mais capitalista que existe no software. Nenhum governo regula, nenhuma agência protege projeto ruim, toda troca é voluntária e a competição decide quem sobrevive. Um mercado assim não existe em nenhum setor da economia real; o período histórico mais próximo dele foi o fim do século XIX nos EUA, antes do Federal Reserve e do imposto de renda federal.</p>
<p>Matt Asay escreveu na C|NET, em <a href="http://www.cnet.com/news/open-source-its-about-capitalism-not-freebies/"target="_blank" rel="noopener">&ldquo;Código Aberto: É sobre capitalismo, não brindes gratuitos&rdquo;</a>:</p>
<blockquote>
  <p>&ldquo;O segredo é usar software de código aberto como um meio para um fim, e não o fim em si mesmo. Código aberto é um meio de distribuição barata, uma maneira de colocar software nas mãos de potenciais compradores por pouco ou nenhum custo. É uma maneira de tornar a experiência de software social e menos arriscada, porque os usuários podem experimentar antes de comprar e porque eles podem customizar (ou pagar alguém para customizar) o software para suas necessidades por um custo menor do que software proprietário.&rdquo;</p>

</blockquote>
<p>E foi mais direto ainda em <a href="http://web.archive.org/web/20211023100641/https://www.cnet.com/news/sorry-socialists-open-source-is-a-capitalists-game/"target="_blank" rel="noopener">&ldquo;Desculpe, socialistas: Código Aberto é um jogo capitalista&rdquo;</a>:</p>
<blockquote>
  <p>&ldquo;[Sarah] Grey escreve que &rsquo;existem alternativas ao capitalismo&rsquo;. Ela está certa. Infelizmente, código aberto não é uma delas. Código aberto é a essência do Livre Mercado do Capitalismo.&rdquo;</p>

</blockquote>
<h3>Definições, para ninguém brigar com espantalho<span class="hx:absolute hx:-mt-20" id="definições-para-ninguém-brigar-com-espantalho"></span>
    <a href="#defini%c3%a7%c3%b5es-para-ningu%c3%a9m-brigar-com-espantalho" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Antes de seguir, os termos que estou usando. Capitalismo é propriedade privada dos meios de produção, com trocas voluntárias entre os donos dessa propriedade. Livre Mercado é a condução dessas trocas sem coerção e sem regulador: oferta, procura e preços ficam nas mãos dos participantes.</p>
<p>Socialismo, no sentido clássico, é propriedade estatal ou coletiva dos meios de produção. Saúde pública e ensino gratuito num país de economia de mercado são políticas de bem-estar, e não socialismo. A crítica deste texto é ao modelo em que o Estado é o dono da produção.</p>
<p>Com essas definições, defender o socialismo clássico e defender a liberdade individual são posições opostas: o primeiro exige subordinar a propriedade e as escolhas de cada um a uma entidade central.</p>
<h3>Software livre é propriedade privada sob licença<span class="hx:absolute hx:-mt-20" id="software-livre-é-propriedade-privada-sob-licença"></span>
    <a href="#software-livre-%c3%a9-propriedade-privada-sob-licen%c3%a7a" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Código aberto não é domínio público. Todo software tem dono: o copyright pertence aos autores, e usar, copiar ou modificar esse código só é possível porque o dono concedeu uma licença. Sem licença, ninguém tem direito algum sobre código alheio, como Jeff Atwood lembrou em <a href="http://blog.codinghorror.com/pick-a-license-any-license/"target="_blank" rel="noopener">&ldquo;Escolha uma Licença, qualquer Licença&rdquo;</a>:</p>
<blockquote>
  <p>&ldquo;Porque eu não indiquei explicitamente uma licença, eu declarei implicitamente um copyright sem explicar como outros poderiam usar meu código. Já que o código está sem licença, eu poderia teoricamente forçar o copyright a qualquer momento e demandar que as pessoas parem de usá-lo. Desenvolvedores experientes não tocam em código sem licença, porque não têm direito legal para isso.&rdquo;</p>

</blockquote>
<p>Existe um teste prático para essa propriedade: o dono pode retirar o código da circulação quando quiser. Em março de 2016, Azer Koçulu despublicou seus pacotes do npm, incluindo o minúsculo left-pad, depois de uma disputa de nome com o aplicativo Kik. Milhares de builds quebraram no mesmo dia, como <a href="http://arstechnica.com/information-technology/2016/03/rage-quit-coder-unpublished-17-lines-of-javascript-and-broke-the-internet/"target="_blank" rel="noopener">a Ars Technica reportou</a>. O código-fonte continuava no GitHub; o que ele removeu foi a distribuição no registro.</p>
<p>Concordar ou não com o Koçulu é irrelevante. O pacote era propriedade dele, e a decisão de remover era dele. O mais interessante veio depois: ninguém foi preso, nenhum regulador interveio. O npm restaurou o pacote quebrado e mudou sua <a href="http://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy"target="_blank" rel="noopener">política de unpublish</a>. O mercado absorveu o choque e criou anticorpos, sem tirar de ninguém o direito de sair.</p>
<p>A comunidade Ruby viveu uma versão menor disso em 2009, quando _why apagou seus projetos e desapareceu, <a href="http://www.akitaonrails.com/2012/09/07/why-dramas-do-ruby-e-dinamitando-courtlandt/"target="_blank" rel="noopener">como contei aqui</a>.</p>
<p>Quando o desacordo é interno, o mecanismo de saída é o fork: quem discorda clona o projeto e compete com o original. Foi o que aconteceu com o io.js, que nasceu como fork do Node.js em 2014 e se fundiu de volta em 2015, sob a recém-criada Node.js Foundation, quando a negociação fez sentido. A história tem vários forks que prosperaram: WebKit a partir do KHTML, LibreOffice a partir do OpenOffice.org, MariaDB a partir do MySQL, X.Org a partir do XFree86. E há derivados que ficaram maiores que a origem, como o Ubuntu a partir do Debian.</p>
<p>Fork é voto com os pés. Custa caro, porque exige manter um projeto inteiro, e é por isso que só prospera quando a motivação é real.</p>
<h3>Competição implica o direito de fracassar<span class="hx:absolute hx:-mt-20" id="competição-implica-o-direito-de-fracassar"></span>
    <a href="#competi%c3%a7%c3%a3o-implica-o-direito-de-fracassar" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Num mercado sem regulador, ninguém mantém projeto ruim vivo artificialmente. Para cada PostgreSQL que existe, dezenas de bancos de dados tentaram e morreram. Para cada distro Linux relevante, centenas viraram nota de rodapé. Isso é sinal de saúde: a seleção está funcionando.</p>
<p>A justiça desse processo é cega. O código não carrega a biografia do autor, e o mercado não distribui medalha por boas intenções. Um projeto sobrevive se convence usuários e colaboradores de seu mérito técnico, e morre se não convence.</p>
<p>Abrir o código, aliás, não salva ninguém. A Nokia concluiu a abertura do código do Symbian em 2010, quando a plataforma já perdia terreno para iPhone e Android. O gesto não reverteu nada: muito pouco, muito tarde.</p>
<p>Eu comparei esse processo à seleção natural num <a href="http://www.akitaonrails.com/2010/07/01/screencast-entenda-software-da-maneira-correta"target="_blank" rel="noopener">screencast antigo</a>. O software que se adapta melhor às demandas do ambiente é o que mais se reproduz, na forma de usuários e contribuidores. O cemitério de projetos mortos prova que a seleção existe e funciona.</p>
<p>E a paisagem muda o tempo todo. O Apache HTTP cedeu espaço ao NGINX. O Firefox perdeu fatia enorme para o Chrome. O Perl cedeu para Python e para linguagens mais novas como Go. O MySQL perdeu prestígio entre desenvolvedores para o PostgreSQL, enfrentou a onda NoSQL e ainda ganhou um fork competidor, o MariaDB, depois da compra pela Oracle. Nenhum desses projetos tinha direito adquirido ao trono.</p>
<h3>O programador paga para participar<span class="hx:absolute hx:-mt-20" id="o-programador-paga-para-participar"></span>
    <a href="#o-programador-paga-para-participar" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O mercado de software livre tem uma inversão curiosa de valores. Numa empresa, o programador recebe dinheiro para escrever código proprietário. Num projeto livre conhecido, é o programador quem &ldquo;paga&rdquo;, com seu tempo e sua capacidade, para ter código aceito. Em troca ele recebe reputação, aprendizado, portfólio e, sim, um pouco de vaidade. É uma troca voluntária com benefício para os dois lados, como qualquer outra.</p>
<p>&ldquo;Preço&rdquo;, aqui, não se mede só em dinheiro. Valor é qualquer coisa com oferta e procura, e quem define o preço é a competição. A moeda corrente desse mercado é a competência técnica demonstrada em público.</p>
<p>Isso tem uma consequência dura: convencer os outros faz parte do jogo. Se a sua ideia tem valor e mesmo assim ninguém adere, a explicação mais provável está na ideia ou na forma como você a apresenta, e não na burrice da plateia. Culpar a plateia é o jeito mais rápido de desvalorizar a própria causa.</p>
<h3>O paradoxo do software livre &ldquo;socialista&rdquo;<span class="hx:absolute hx:-mt-20" id="o-paradoxo-do-software-livre-socialista"></span>
    <a href="#o-paradoxo-do-software-livre-socialista" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Imagine o modelo oposto: o mundo do software sob o socialismo clássico, com a produção controlada por uma entidade central.</p>
<p>Sem propriedade individual sobre os projetos, acaba a competição. Projeto ruim que atenda à agenda de quem controla se mantém vivo, mesmo que exista alternativa tecnicamente superior. A escolha sai das mãos de quem usa e vai para as mãos de quem controla. Não haveria acidentes como o left-pad, e o preço disso seria um catálogo imenso de software sucateado que ninguém quer usar.</p>
<p>Sem o benefício individual da troca, acaba o voluntariado. Nenhum programador competente doaria suas melhores horas sem reputação, aprendizado ou liberdade em troca. E se a contribuição virar cota obrigatória decretada em nome do &ldquo;bem social&rdquo;, todos farão o mínimo para cumprir a cota. A produção soviética funcionou assim em praticamente todos os setores, com os resultados que conhecemos.</p>
<p>Sem competição, acaba a inovação. Inovação nasce de uma vontade individual de resolver o próprio problema do próprio jeito. Eric Raymond abriu <a href="http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/"target="_blank" rel="noopener">&ldquo;A Catedral e o Bazar&rdquo;</a> com essa ideia:</p>
<blockquote>
  <p>&ldquo;Todo bom trabalho de software começa coçando uma coceira pessoal de um desenvolvedor.&rdquo;</p>

</blockquote>
<p>Inovação também é transgressora, porque torna profissões inteiras obsoletas. As agências de viagem quase sumiram quando comprar passagem pela internet ficou trivial. As locadoras de vídeo morreram com o streaming. O Uber apertou os taxistas, o Airbnb apertou os hotéis. Quem ficou preso ao modelo anterior sofreu, e o mundo seguiu em frente.</p>
<p>Em software foi igual. O pessoal do GNU Hurd não comemorou quando o Linux explodiu. A Nokia não achou graça no Android. O MySQL não torce pelo PostgreSQL. Quem resiste à dinâmica do mercado fica para trás. Duro, e absolutamente justo.</p>
<h3>A distopia do monopólio protegido<span class="hx:absolute hx:-mt-20" id="a-distopia-do-monopólio-protegido"></span>
    <a href="#a-distopia-do-monop%c3%b3lio-protegido" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Um software proprietário pode ser bom ou ruim; o problema aparece quando ele vira monopólio protegido. A Microsoft dos anos 90 era um monopólio de fato. Podemos discutir se o julgamento do Departamento de Justiça foi justo, mas o golpe decisivo no monopólio veio do mercado: o software livre, com GNU e Linux, e depois a internet comercial, que tirou do Windows o monopólio da plataforma.</p>
<p>Imagine um futuro alternativo em que a Microsoft convence o governo americano de que o Windows é essencial à segurança nacional e merece proteção permanente. Tudo teria parado. Até hoje usaríamos um Pentium de 100 MHz rodando um derivado de Windows 98, com internet discada, porque &ldquo;ninguém precisa de mais que isso&rdquo;.</p>
<p>É essa a lógica de quem entrega as decisões do mercado a uma entidade central: não crie e-mail, vai prejudicar os carteiros; não crie sites, vai prejudicar as gráficas; não crie software livre, vai prejudicar os programadores do governo. Todo ditador usa o mesmo discurso, &ldquo;para o bem da população&rdquo;, e todo discurso de &ldquo;para o bem da população, não importam os meios&rdquo; termina no mesmo lugar.</p>
<h3>Tirania e o fim do software livre<span class="hx:absolute hx:-mt-20" id="tirania-e-o-fim-do-software-livre"></span>
    <a href="#tirania-e-o-fim-do-software-livre" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O pior caso possível para um projeto livre começa assim. Um desenvolvedor cria um software para resolver um problema e abre o código. Por vinte anos, centenas de pessoas usam e contribuem.</p>
<p>Então surge uma causa, qualquer uma, e alguém se autonomeia representante dela. Por pressão social e propaganda, os mantenedores viram párias. A mídia especializada amplifica, porque controvérsia atrai leitor. O código deixa de ser o assunto: o que passa a valer é a opinião pessoal, a aparência e o passado de cada colaborador.</p>
<p>A partir daí, participar do projeto vira um risco. Ninguém recebe mais valor por contribuir; só recebe exposição. Um a um, os que realmente escreviam código vão embora, e o projeto definha. É uma forma perversa de tomar uma propriedade e destruir seu valor sem confiscar nada formalmente.</p>
<p>Ayn Rand dramatizou esse mecanismo no julgamento de Howard Roark, em &ldquo;A Nascente&rdquo;, e <a href="http://www.akitaonrails.com/2011/02/04/off-topic-the-fountainhead-defesa-de-howard-roark"target="_blank" rel="noopener">escrevi sobre isso em 2011</a>:</p>
<blockquote>
  <p>&ldquo;Eu vim aqui dizer que eu não reconheço o direito de qualquer um a um minuto da minha vida, ou a qualquer parte da minha energia, nem a qualquer conquista minha, não importa quem clame por isso!&rdquo;</p>

</blockquote>
<p>Esse é o aviso. Uma camada política sobre um projeto livre destrói o mercado que sustentava o projeto.</p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Nada disso condena quem contribui por motivação social. Quem troca seu código pela sensação de estar ajudando faz uma troca voluntária como qualquer outra, e isso fora do software tem nome: doação e trabalho voluntário. O problema começa quando alguém decide que a propriedade alheia deve servir à causa que ele escolheu.</p>
<p>Resolver os problemas do mundo é muito mais difícil do que discutir sobre eles. Bill Gates deu esse recado em 2000, respondendo ao hype de que PCs acabariam com a pobreza:</p>
<blockquote>
  <p>&ldquo;Ótimo, visite os centros da Infosys em Bangalore, mas saia do oásis e vá três milhas adiante, atrás do cara que vive sem privada, sem água encanada&hellip; O mundo não é plano, e PCs não estão, na hierarquia das necessidades humanas, entre as cinco primeiras posições.&rdquo;</p>

</blockquote>
<p>Programadores, de qualquer classe social, têm internet e recursos de sobra para passar o dia em redes sociais discutindo como salvar o mundo. Quem trabalha de verdade nesses problemas está fora desse circuito, <a href="https://en.wikipedia.org/wiki/Computer_technology_for_developing_areas"target="_blank" rel="noopener">executando em vez de falar</a>.</p>
<p>Termino com um caso real que me relataram, sem nomes:</p>
<blockquote>
  <p>A: Puxa, ninguém dá chance à minha [minoria].</p>
<p>B: Por que você não me ajuda a resolver estes problemas neste projeto open source? Daí você pode palestrar sobre isso.</p>
<p>(A some. B espera, cansa, e chama C, que resolve os problemas e ganha o espaço de palestrar.)</p>
<p>A: Tá vendo, B? Você é parte dos opressores que não dão espaço pra gente como eu, e preferiu dar a oportunidade pro C.</p>

</blockquote>
<p>E uma nota pessoal para encerrar. Me taxam de &ldquo;seguidor de Ayn Rand&rdquo;, e estão enganados: Rand apenas pôs por escrito, antes de mim, o que eu já pensava e praticava. O mesmo vale para Bastiat, Friedman, Hayek ou Menger. São referências, e referências não são donos. Julgar uma ideia pelo autor em vez de julgar o argumento pelo mérito é a definição de <a href="https://pt.wikipedia.org/wiki/Argumento_ad_hominem"target="_blank" rel="noopener">ad hominem</a>, e eu não respondo bem a falácias.</p>
]]></content:encoded><category>open-source</category><category>economia</category><category>filosofia</category><category>off-topic</category></item><item><title>Lembrando os Heróis Ruby que se foram em 2014</title><link>https://akitaonrails.github.io/2015/01/02/lembrando-os-herois-ruby-que-se-foram-em-2014/</link><guid isPermaLink="true">https://akitaonrails.github.io/2015/01/02/lembrando-os-herois-ruby-que-se-foram-em-2014/</guid><pubDate>Fri, 02 Jan 2015 12:48:00 -0200</pubDate><description>&lt;p&gt;Em muitos aspectos o ano de 2014 foi extremamente triste para a comunidade internacional de Ruby e para mim pessoalmente já que conheci os 3 pessoalmente.&lt;/p&gt;
&lt;p&gt;Primeiro foi a perda do venerado &lt;a href="https://news.ycombinator.com/item?id=7270098"target="_blank" rel="noopener"&gt;Jim Weirich&lt;/a&gt;, em 20 de Fevereiro de 2014. Ele foi o autor do projeto Rake. Veja seu &lt;a href="https://github.com/jimweirich"target="_blank" rel="noopener"&gt;Github&lt;/a&gt; para ver no que ele contribuía. E de curiosidade, leia um pouco da &lt;a href="https://github.com/ruby/rake/blob/master/doc/rational.rdoc"target="_blank" rel="noopener"&gt;história do Rake&lt;/a&gt; que está dentro do seu código-fonte. Jim sempre foi uma presença essencial nos eventos de Ruby e Rails e tem diversas palestras excepcionais que &lt;a href="https://www.youtube.com/results?search_query=jim&amp;#43;weirich"target="_blank" rel="noopener"&gt;vale a pena assistir&lt;/a&gt;. Antes de partir, ele era Chief Scientist da consultoria NEO.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Em muitos aspectos o ano de 2014 foi extremamente triste para a comunidade internacional de Ruby e para mim pessoalmente já que conheci os 3 pessoalmente.</p>
<p>Primeiro foi a perda do venerado <a href="https://news.ycombinator.com/item?id=7270098"target="_blank" rel="noopener">Jim Weirich</a>, em 20 de Fevereiro de 2014. Ele foi o autor do projeto Rake. Veja seu <a href="https://github.com/jimweirich"target="_blank" rel="noopener">Github</a> para ver no que ele contribuía. E de curiosidade, leia um pouco da <a href="https://github.com/ruby/rake/blob/master/doc/rational.rdoc"target="_blank" rel="noopener">história do Rake</a> que está dentro do seu código-fonte. Jim sempre foi uma presença essencial nos eventos de Ruby e Rails e tem diversas palestras excepcionais que <a href="https://www.youtube.com/results?search_query=jim&#43;weirich"target="_blank" rel="noopener">vale a pena assistir</a>. Antes de partir, ele era Chief Scientist da consultoria NEO.</p>
<p>Em 30 de Novembro de 2014, foi a vez de <a href="https://news.ycombinator.com/item?id=8676140"target="_blank" rel="noopener">Ezra Zygmuntowicz</a>, ele foi um dos co-fundadores da famosa Engine Yard. Na época em que ele e Tom Mornini dirigiam a empresa, eles tiveram as equipes do JRuby e do Rubinius sob seu patrocínio e tutela. Ezra foi quem pegou o Mongrel de Zed Shaw e explorou o mundo de evented I/O antes de Node.js, com o Evented Mongrel (que depois foi substituído pelo projeto Thin), foi um dos primeiros a explorar e ajudar a popularizar o <a href="https://github.com/redis/redis-rb"target="_blank" rel="noopener">Redis</a>, ele trouxe a tona a idéia de Platform as a Service antes do Heroku, a idéia de infraestrutura como software (antes da onda Devops), trouxe o projeto Merb (que depois viria a ser <a href="http://www.akitaonrails.com/2008/12/23/bomba-merb-e-rails-se-fundem"target="_blank" rel="noopener">incorporado ao Rails 3</a>). Depois disso, ele saiu da Engine Yard e passou um tempo desaparecido em Portland, Oregon. Começou uma startup de impressão 3D (quando impressão 3D estava começando) mas acabou não dando certo. Pouco antes de partir ele estava twitando que iria empreender uma nova idéia. Ezra foi um visionário como poucos que existem hoje, e o mundo vai sentir sua falta. Assista algumas de <a href="https://www.youtube.com/results?search_query=ezra&#43;zygmuntowicz"target="_blank" rel="noopener">suas palestra no YouTube</a>.</p>
<p>Finalmente, em 28 de Dezembro de 2014, perdemos <a href="https://news.ycombinator.com/item?id=8804624"target="_blank" rel="noopener">James Golick</a>, um grande companheiro de outro rubista que talvez seja mais conhecido, <a href="http://gilesbowkett.blogspot.com.br/2014/12/james-golick-rest-in-peace.html"target="_blank" rel="noopener">Joe Damato</a>. Talvez muitos dos rubistas mais novos não tenham ouvido falar dele, mas ele ficou conhecido alguns anos atrás principalmente por causa do projeto <a href="https://github.com/jamesgolick/resource_controller"target="_blank" rel="noopener">Resource Controller</a>, que ele resolveu parar em 2009 por causa de uma alternativa chamada <a href="https://github.com/josevalim/inherited_resources"target="_blank" rel="noopener">Inherited Resources</a> apareceu para substituí-lo. Eu mesmo cheguei a contribuir um pouco nesse projeto na época. Mas ele era um contribuidor open source prolixo, vejam seu <a href="https://github.com/jamesgolick"target="_blank" rel="noopener">Github</a> para ver as últimas coisas em que trabalhou. Eu fiz uma video entrevista com ele na Railsconf 2010 em Baltimore, <a href="http://www.akitaonrails.com/2010/06/17/railsconf-2010-video-entrevistas-parte-1#.VKawMXRHnxg"target="_blank" rel="noopener">assistam aqui</a>.</p>
<p>Todos os 3 eram programadores queridos na comunidade, com reconhecimento pelos seus feitos, e principalmente pelo exemplo de seus bons caráters. Devem ser relembrados nos anais da história desta comunidade e vamos sentir muita falta deles.</p>
<p>Vamos trabalhar em 2015 e adiante para que seus esforços não tenham sido em vão.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/478/10398836_109861054836_3925808_n.jpg" alt="Eu, Vinicius Teles, Carl Youngblood e Jim Weirich"  loading="lazy" /></p>
<p>PS: fiquei particularmente triste com a perda de Ezra porque coisa de algumas semanas antes dele partir, estávamos combinando de trocar idéias, um Hangout que nunca mais vai acontecer:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/479/Screen_Shot_2015-01-02_at_12.46.59.png" alt="Último DM de Ezra"  loading="lazy" /></p>
]]></content:encoded><category>biografias</category><category>ruby</category><category>open-source</category></item><item><title>Começando o Ano com um Ruby Drama: RubySpec vs MRI Core Team</title><link>https://akitaonrails.github.io/2015/01/02/comecando-o-ano-com-um-ruby-drama-rubyspec-vs-mri-core-team/</link><guid isPermaLink="true">https://akitaonrails.github.io/2015/01/02/comecando-o-ano-com-um-ruby-drama-rubyspec-vs-mri-core-team/</guid><pubDate>Fri, 02 Jan 2015 12:10:00 -0200</pubDate><description>&lt;p&gt;A comunidade internacional de Ruby vira e mexe surge com alguns &amp;ldquo;dramas&amp;rdquo;. Toda comunidade tem seus &amp;ldquo;dramas&amp;rdquo;, mas os Ruby Dramas particularmente chamam a atenção das demais comunidades então de vez em quando vale a pena explorar alguns deles para explicar porque eles acontecem e quais as ramificações.&lt;/p&gt;
&lt;p&gt;No último dia de 2014, Brian Shirai soltou um post unilateral entitulado &lt;a href="http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/"target="_blank" rel="noopener"&gt;&amp;ldquo;Matz&amp;rsquo;s Ruby Developers Don&amp;rsquo;t Use RubySpec and It&amp;rsquo;s Hurting Ruby&amp;rdquo;&lt;/a&gt;, onde ele explica porque é ruim o Core Team do MRI não usar regularmente o projeto RubySpec, vale a pena dar uma lida.&lt;/p&gt;</description><content:encoded><![CDATA[<p>A comunidade internacional de Ruby vira e mexe surge com alguns &ldquo;dramas&rdquo;. Toda comunidade tem seus &ldquo;dramas&rdquo;, mas os Ruby Dramas particularmente chamam a atenção das demais comunidades então de vez em quando vale a pena explorar alguns deles para explicar porque eles acontecem e quais as ramificações.</p>
<p>No último dia de 2014, Brian Shirai soltou um post unilateral entitulado <a href="http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/"target="_blank" rel="noopener">&ldquo;Matz&rsquo;s Ruby Developers Don&rsquo;t Use RubySpec and It&rsquo;s Hurting Ruby&rdquo;</a>, onde ele explica porque é ruim o Core Team do MRI não usar regularmente o projeto RubySpec, vale a pena dar uma lida.</p>
<p>Como contexto, vale explicar que <a href="https://twitter.com/brixen"target="_blank" rel="noopener">Brixen</a> é quem herdou o manto da implementação Rubinius e também do projeto RubySpec, que tenta ser uma suíte de testes que define o comportamento do que é a &ldquo;linguagem Ruby&rdquo; para que implementações alternativas como o próprio Rubinius ou JRuby ou outras possam se basear. Os projetos originaram com Evan Phoenix, atual membro do Ruby Central e organizador das RailsConf. Digamos que Evan é mais &ldquo;politicamente correto&rdquo;, Brian é mais &ldquo;agressivo&rdquo;.</p>
<p>O problema é que o Brian basicamente &ldquo;joga a merda no ventilador e sai fora&rdquo;, que é o tipo de atitude mais infantil e menos efetivo possível. E vindo de um conhecido contribuidor open source como Brian, obviamente isso causou um shit-storm no Twitter e outras redes. Ele simplesmente &ldquo;acusa&rdquo; o Core Team do MRI de sabotar o RubySpec ao não usá-lo como ele gostaria. Um dos principais nomes que vieram para defender o Core Team foi <a href="https://twitter.com/headius/with_replies"target="_blank" rel="noopener">Charles Nutter</a>, que é contribuidor tanto do JRuby quanto do próprio MRI, alguns dos comentários mais interessantes e que explicam o ponto de vista do Core Team, eu cito abaixo:</p>
<blockquote>
@jamie_gaskins RubySpec was designed from the ground up. MRI's suite is decades old. What we need are people to help clean it up.
</blockquote>
<blockquote>
@josh_cheek And what of redoing over a decade of work in MRI's suite? It's there, it works, we use it to test JRuby. Don't buy the FUD.
</blockquote>
<blockquote>
@jamie_gaskins We use it as our primary compatibilty suite for JRuby. We also run RubySpec, but it's far less complete.
</blockquote>
<blockquote>
@josh_cheek I don't think anyone would disagree that MRI's suite needs improvement, but throwing it out is absurd.
</blockquote>
<blockquote>
@jamie_gaskins I also don't find MRI's tests hard to read. When I find ugly ones in the future, I will be fixing them. Help me :-)
</blockquote>
<blockquote>
Folks don't seem to realize JRuby runs MRI's test suite as our primary compatibility suite. It's not pretty, but it's OSS...help us fix it.
</blockquote>
<blockquote>
@jerrydantonio Please don't spread this kind of FUD. I know most of ruby-core personally and they've been very supportive of JRuby.
</blockquote>
<blockquote>
@jerrydantonio If they don't use RubySpec, it's because RubySpec did not meet their needs -- as stated in the article.
</blockquote>
<blockquote>
@jerrydantonio You are going based on what one person says without understanding the complexities involved.
</blockquote>
<blockquote>
@jamie_gaskins You can submit PRs to MRI's github/ruby/ruby mirror (which may turn into the main repo this year).
</blockquote>
<blockquote>
@jamie_gaskins If you start looking into it, copy me on your PRs. I'm a committer, and I can help get them in.
</blockquote>
<blockquote>
@jamie_gaskins Not at all, and ruby-core are all on board with switching to git now too. Like I said...that post is a massive dose of FUD.
</blockquote>
<blockquote>
Another reminder: I'm a member of the MRI core team and a committer. Got a problem? I'm listening. Let's collaborate, friends.
</blockquote>
<blockquote>
@samsaffron It doesn't matter if their suite serves their and our needs. It's aesthetics at that point. Aesthetics can be fixed.
</blockquote>
<blockquote>
@iainbeeston It just a political move. It's still alive and still OSS...if it's valuable to use it on MRI, we can still use it on MRI.
</blockquote>
<blockquote>
@zedshaw @mentalguy @raganwald The segfault was not reported. And yes, they fix bug reports. ruby-core is still almost all volunteer time.
</blockquote>
<blockquote>
@johnbender Don't take one article's assertions as truth. There's a lot of misinformation there.
</blockquote>
<blockquote>
@jc00ke @_zzak I'd like to know why RubySpec wins and MRI is at fault. Does Rubinius run MRI's suite, like JRuby?
</blockquote>
<blockquote>
@fugueish One person's story. I've been implementing Ruby longer and I have seen steady improvement. It's a community effort.
</blockquote>
<blockquote>
@josh_cheek And please don't spread FUD like this. There are real people working really hard on MRI. Help them instead.
</blockquote>
<blockquote>
@raganwald @codefolio @saturnflyer Indeed. But don't start saying things like "MRI devs don't write tests" because they usually do (now).
</blockquote>
<blockquote>
@chromatic_x The full run of MRI's suite on JRuby includes 5941 tests with 1091418 assertions (we exclude parts). They're indispensable.
</blockquote>
<blockquote>
@iainbeeston Either that, or it inspires ruby-core and us to improve MRI's suite. Positive things can come from a negative post. :-)
</blockquote>
<blockquote>
@chromatic_x In any case, MRI is the reference impl, so expecting them to drop their decades-old suite for someone else's is rather bold.
</blockquote>
<blockquote>
@headius Personally, I think that RubySpec is useful and valuable, but throwing MRI under the bus for not using a tool is pretty petty.
</blockquote>
<blockquote>
@r343l @sunnyrjuneja No, it doesn't. I don't agree with technical articles that don't take comments. Might as well be a press release.
</blockquote>
<blockquote>
Lesson for today: here's what you do when you find a bug in a project, rather than just blogging about it: https://bugs.ruby-lang.org/issues/10685 
</blockquote>
<p>Shyouhei Urabe, um dos principais voluntários japoneses do Core Team disse <a href="https://twitter.com/shyouhei/status/550557396376879104"target="_blank" rel="noopener">a coisa mais óbvia</a> logo que o post do Brian saiu:</p>
<blockquote>
Release of #ruby happens Dec. 25th EVERY YEAR.  If rubyspec found a SEGV, why didn't they report that and blame core devs instead?
</blockquote>
<p>Logo em seguida Nate Berkopec fez um apanhado geral e <a href="https://gist.github.com/nateberkopec"target="_blank" rel="noopener">uma explicação/especulação das razões</a> pelas quais o artigo de Brian Shirai está errado no que ele quer atingir.</p>
<p>Em resumo, existe uma grande frustração no time do Rubinius em geral. Ao contrário do JRuby que tem um nicho de usuários e projetos em produção onde ele faz diferença, o Rubinius em si nunca alcançou nenhum uso significativo. Em <a href="http://rubini.us/2013/10/15/introducing-rubinius-x/"target="_blank" rel="noopener">Outubro de 2013</a>, ele havia anunciado que o Rubinius começaria a experimentar mais e quebrar compatibilidade com o MRI o que, pra mim pelo menos, soa mais como um tiro no pé. Mas eles acharam que, por méritos técnicos, o Rubinius poderia ser o melhor substituto para o MRI. O controle do RubySpec leva nessa direção e por isso a frustração do Core Team nunca adotá-lo &ldquo;oficialmente&rdquo;.</p>
<p>Hoje (2/1/2015), o próprio Evan Phoenix resolveu endereçar o assunto pessoalmente no Twitter com o Matz, e eis a transcrição:</p>
<blockquote>
@evanphx 
1. I wonder if, all those years ago, I misunderstood Matz. Maybe "I like other ruby implementations" was really "I don't mind they exist"
</blockquote>
<blockquote>
@evanphx 
2. I thought it was "I want to help them" but Matz really didn't mean that. He just mean "good luck friends!"
</blockquote>
<blockquote>
@yukihiro_matz 
@evanphx Sorry for confusion & disappointment. I still don't know what kind of help you wanted. You do want to control your project as I do.
</blockquote>
<blockquote>
@evanphx 
@yukihiro_matz I should have asked: Could the CRuby team help track new features so other impls could know what they are missing.
</blockquote>
<blockquote>
@yukihiro_matz
@evanphx the MRI team maintains the forked version of RubySpec https://github.com/nurse/rubyspec  I think it can be a good start.
</blockquote>
<p>Existe muito mérito nos esforços que as pessoas contribuíram aos projetos Rubinius e RubySpec ao longo dos anos, porém eles falharam ao tentar forçar sua visão do que deveria ser &ldquo;o certo&rdquo; em vez de colaborar com o projeto que já existia muito antes deles chegarem que é o Ruby MRI. É como se você fizesse um kernel alternativo ao Linux e começasse a dizer nas listas por aí que o Linus Torvalds deveria seguir essa alternativa porque é o &ldquo;jeito mais certo&rdquo;. Sabe qual seria a resposta do Linus? &ldquo;Fuck You!&rdquo;. É que o Matz é <strong>bem</strong> mais educado do que isso, mas seria a resposta mais adequada a esse tipo de atitude.</p>
<p>Qual seria a alternativa? Charles Nutter já demonstrou: ele é ao mesmo tempo líder da implementação alternativa JRuby e também contribui diretamente no Ruby MRI. Ele roda as suítes do MRI e do RubySpec, em paralelo, no projeto JRuby. Não há atrito entre JRuby e MRI. Mas há atrito entre Rubinius e MRI. O problema não é técnico, não é sequer político como muitos declararam, é um problema de caráter e atitude. O problema é que o estilo do Core do Rubinius sempre foi &ldquo;somos os melhores, eventualmente todo mundo vai notar isso&rdquo;. Essa atitude é altamente destrutiva, frustrante e acaba com declarações suicidas como a do Brian Shirai.</p>
<p><a href="http://www.akitaonrails.com/2012/08/15/off-topic-o-mito-do-legado"target="_blank" rel="noopener">Uma coisa que eu sempre digo</a>: fazer um projeto green field (do zero) é muito fácil, qualquer criança faz isso. Agora, pegar um projeto brown field (velho, cheio de débitos técnicos), é bem mais complicado, bem menos recompensador a curto prazo e por isso poucos (só os melhores) conseguem a disciplina para tentar transformar um brown field num green field. O Rubinius e RubySpec são green fields que tentaram enfiar goela abaixo do Core Team. Não é assim que se prova um ponto de vista. Releia os comentários do Nutter acima, é o que ele tenta explicar.</p>
<p>E é uma pena, pois tecnicamente Brian e o Core Team do Rubinius são muito bons e seria bom ver esse talento dentro do MRI. Porém, entre ter alguém tecnicamente bom mas de caráter duvidoso, é melhor não ter. Essa sempre é a melhor alternativa.</p>
<p>Em resumo: nada muda do lado do Ruby MRI, não é nenhuma crise ou algo assim. O MRI deve continuar como sempre: com Matz como seu único ditador benevolente e talvez, com alguma boa vontade, eles permitam o projeto RubySpec ser incorporado dentro do MRI sob a tutela do Core Team do Japão, como deve ser.</p>
]]></content:encoded><category>ruby</category><category>testes</category><category>open-source</category></item><item><title>[Off-Topic] Alguém importante deixou a comunidade! E agora??</title><link>https://akitaonrails.github.io/2014/07/06/off-topic-alguem-importante-deixou-a-comunidade-e-agora/</link><guid isPermaLink="true">https://akitaonrails.github.io/2014/07/06/off-topic-alguem-importante-deixou-a-comunidade-e-agora/</guid><pubDate>Sun, 06 Jul 2014 20:38:00 -0300</pubDate><description>&lt;p&gt;Esta semana um conhecido desenvolvedor da comunidade Node.js declarou estar deixando o barco. Foi &lt;a href="https://medium.com/code-adventures/farewell-node-js-4ba9e7f3e52b"target="_blank" rel="noopener"&gt;TJ Holowaychuk&lt;/a&gt;, um dos contribuidores mais prolíficos dessa comunidade. Como era de se esperar, a notícia gerou controvérsia, discussão e gente se desesperando.&lt;/p&gt;
&lt;p&gt;Se você é um programador experiente, não precisa de mim para ouvir isso. Mas se as notícias recentes deixaram você inseguro, talvez o que eu tenho a dizer traga alguma perspectiva.&lt;/p&gt;
&lt;p&gt;Antes, quero compartilhar outros artigos que li nos últimos dias:&lt;/p&gt;</description><content:encoded><![CDATA[<p>Esta semana um conhecido desenvolvedor da comunidade Node.js declarou estar deixando o barco. Foi <a href="https://medium.com/code-adventures/farewell-node-js-4ba9e7f3e52b"target="_blank" rel="noopener">TJ Holowaychuk</a>, um dos contribuidores mais prolíficos dessa comunidade. Como era de se esperar, a notícia gerou controvérsia, discussão e gente se desesperando.</p>
<p>Se você é um programador experiente, não precisa de mim para ouvir isso. Mas se as notícias recentes deixaram você inseguro, talvez o que eu tenho a dizer traga alguma perspectiva.</p>
<p>Antes, quero compartilhar outros artigos que li nos últimos dias:</p>
<ul>
<li>
<p><a href="http://www.mikeperham.com/2014/07/02/my-next-chapter/"target="_blank" rel="noopener">My Next Chapter</a>: a declaração de <a href="http://web.archive.org/web/20150321122529/https://plus.google.com/118252393888359805350"target="_blank" rel="noopener">Mike Perham</a>, um dos rubistas mais conhecidos desta geração e criador do onipresente e excelente Sidekiq. Ele não abandona o projeto; conta que está tocando um produto novo, e esse produto não envolve Ruby.</p>
</li>
<li>
<p><a href="http://www.ianbicking.org/blog/2014/02/saying-goodbye-to-python.html"target="_blank" rel="noopener">Saying Goodbye To Python</a>: aqui foi o pythonista Ian Bicking, que declarou trocar Python por JavaScript, seguindo a onda do momento. Vale entender que a bolha atual de JavaScript não &ldquo;exige&rdquo; que você &ldquo;abandone&rdquo; nada. Dá para ser pythonista e usar JavaScript ao mesmo tempo, sem conflito.</p>
</li>
<li>
<p><a href="http://blog.jonathanoliver.com/why-i-left-dot-net/"target="_blank" rel="noopener">Why I Left the .Net Framework</a>: o desenvolvedor Jonathan Oliver resolveu explicar por que está deixando a tecnologia do dia a dia e aponta os prós e contras das ferramentas Microsoft. Nada de trollagem; é uma leitura bem interessante.</p>
</li>
<li>
<p><a href="https://medium.com/tales-from-6w/java-again-5de2c1aa6857"target="_blank" rel="noopener">Java Again</a>: quem é das primeiras gerações da comunidade Java lembra de James Duncan Davidson, criador nada menos que do primeiro Tomcat e do Ant. Ele deixou o Java, passou um tempo na comunidade Ruby e se dedicou à fotografia (procure as fotos das RubyConf de oito anos atrás e vai ver que as oficiais são todas dele). Agora declarou que está voltando ao Java.</p>
</li>
<li>
<p><a href="http://yager.io/programming/go.html"target="_blank" rel="noopener">Why Go Is Not Good</a>: como o nome diz, é uma crítica que argumenta que uma linguagem recém-lançada deveria ter sido melhor pensada para cobrir casos que outras linguagens já resolvem.</p>
</li>
<li>
<p><a href="http://jaredly.github.io/2014/03/22/rust-vs-go/"target="_blank" rel="noopener">Rust vs Go</a>: de novo com um certo tom de &ldquo;dor de cotovelo&rdquo;. Rust realmente parece uma tecnologia superior a Go em design de linguagem e recursos, e o texto demonstra a frustração de ver Go mais popular mesmo assim.</p>
</li>
<li>
<p><a href="http://outspeaking.com/words-of-technology/why-perl-didnt-win.html"target="_blank" rel="noopener">Why Perl Didn&rsquo;t Win</a>: leitura obrigatória sobre as circunstâncias de uma das linguagens mais populares do fim dos anos 80 ao fim dos anos 90, que caiu no esquecimento e no desuso. Até o Swift, lançado pela Apple semanas atrás, já tem mais usuários ativos que o Perl 6. Uma das conclusões: qualquer coisa nova precisa mirar os problemas do futuro, não os do passado.</p>
</li>
</ul>
<p>Quem é das primeiras gerações das comunidades Ruby e Rails vai lembrar dos &ldquo;traumas&rdquo; que passamos:</p>
<ul>
<li>
<p><a href="http://web.archive.org/web/20140709000638/http://www.akitaonrails.com/2008/1/1/zed-shaw-vs-rails"target="_blank" rel="noopener">Zed is Not Dead</a>: de 2008, quando um dos nossos desenvolvedores mais prolíficos, Zed Shaw, criador do Mongrel e um dos primeiros a encarar o desafio de medir e otimizar a performance do Ruby, declarou que estava deixando a comunidade e migrando para Python.</p>
</li>
<li>
<p><a href="http://web.archive.org/web/20140709094857/http://www.akitaonrails.com/2008/12/23/bomba-merb-e-rails-se-fundem"target="_blank" rel="noopener">Bomba: Merb e Rails se fundem!</a>: também de 2008, quando a equipe do Merb estava em rota de colisão com o Core do Rails. A solução, feliz para muitos e infeliz para alguns poucos, foi engolir o Merb dentro do Rails 3, e ela deixou mortos e feridos. Em retrospecto, vale ler <a href="http://web.archive.org/web/20140626092759/http://merbist.com/2012/02/29/learning-from-rails-failures/"target="_blank" rel="noopener">&ldquo;Learning from Rails&rsquo; failures&rdquo;</a>, de Matt Aimonetti (que também migrou para Go) e que está entre os feridos dessa insurgência, e <a href="http://gilesbowkett.blogspot.fr/2014/06/the-railsmerb-merge-in-retrospect.html"target="_blank" rel="noopener">&ldquo;The Rails/Merb Merge In Retrospect&rdquo;</a>, de Giles Bowkett (ainda rubista), que analisa os resultados com olhar bem crítico.</p>
</li>
<li>
<p><a href="http://www.akitaonrails.com/2011/04/16/twitter-muda-de-ruby-para-java-ruby-e-3x-mais-lento-que-java"target="_blank" rel="noopener">Twitter muda de Ruby para Java</a>: de 2011, quando o Twitter declarou que estava substituindo as partes da infraestrutura de mensagens escritas em Ruby por uma solução proprietária em Scala. O que a notícia original dizia e o que as pessoas escolheram memorizar são coisas diferentes, mas o fato é que aquilo virou uma bela dor de cabeça de relações públicas para nós. Felizmente já passou.</p>
</li>
</ul>
<p>E esses são só os links que li e lembro de cabeça. Existem dezenas de outros.</p>
<p>Quem ainda é jovem ou inexperiente em comunidades de software, em especial quem é novo no Node.js, deve estar se perguntando: <em>&ldquo;E agora? Se alguém importante como o TJ diz que está saindo, eu não deveria sair também?&rdquo;</em> Se fizer sua pesquisa direito, vai ver que não é a primeira vez. Em 2012, o criador do Node.js, <a href="http://venturebeat.com/2012/01/30/dahl-out-mike-drop/"target="_blank" rel="noopener">Ryan Dahl declarou</a> que continuaria acompanhando o projeto, mas não estaria mais no dia a dia de codificação. <em>&ldquo;Putz, o mundo acabou!&rdquo;</em></p>
<h2>Isto não é uma Má Notícia. Esta é uma Excelente Oportunidade! (Sério!)<span class="hx:absolute hx:-mt-20" id="isto-não-é-uma-má-notícia-esta-é-uma-excelente-oportunidade-sério"></span>
    <a href="#isto-n%c3%a3o-%c3%a9-uma-m%c3%a1-not%c3%adcia-esta-%c3%a9-uma-excelente-oportunidade-s%c3%a9rio" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em 2006, quando eu estava começando minha militância no mundo Ruby e Rails, eu já sabia o que vinha pela frente. Éramos os novatos, imaturos, com tecnologia incompleta e muita expectativa, então o caminho seria o mais difícil possível. Foi por isso que escrevi o artigo <a href="http://www.akitaonrails.com/2006/09/27/evolu%c3%a7%c3%a3o-pela-concorr%c3%aancia"target="_blank" rel="noopener">Evolução pela Concorrência</a>.</p>
<p>Muita gente imagina que o melhor dos mundos seria aquele em que ninguém questiona o que você faz, todos deixam você em paz e acreditam nas suas promessas que, claro, você pretende cumprir um dia. (<em>yeah, right&hellip;</em>)</p>
<p>Eu discordo. Qualquer promessa ou expectativa que valha a pena precisa ser questionada, pressionada, escrutinada. Se ela é tão frágil que não aguenta crítica, ataque direto e indireto e sabotagem, então a promessa já era fraca e não merecia seguir em frente. Quanto antes cair, melhor, porque menos tempo a gente perde.</p>
<p>Por isso eu sempre abraço os ataques: espero estar pronto para revidar em dobro ou morrer tentando. E não esperaria menos da comunidade Rails. Todo mundo ainda acredita que restrição é ruim, mas eu <a href="http://startupi.com.br/2013/restricoes-sao-libertadoras-menos-e-mais/"target="_blank" rel="noopener">já disse antes</a> que restrição é importante, porque é o único lugar de onde nasce a <strong>inovação</strong>.</p>
<p>Quem precisa recorrer ao velho truque de falar mal dos outros, o famoso <em>&ldquo;não tenho vontade de melhorar, então vou prejudicar o outro para parecer maior&rdquo;</em> (escrevi sobre isso em 2007, <a href="http://web.archive.org/web/20140709023445/http://www.akitaonrails.com/2007/10/23/para-eu-ganhar-o-outro-precisa-perder"target="_blank" rel="noopener">&ldquo;Para eu ganhar, o outro precisa perder&hellip;&rdquo;</a>), se declara fraco por conta própria. Pare e lembre de artigos, palestras e entrevistas em que você ouviu alguém que admira falando mal de outra comunidade. <em>&ldquo;Ah, Ruby, aquele negócio de menininha. Porque nós, homens, usamos JavaScript.&rdquo;</em> Isso me dá vontade de rir e um pouco de pena, porque para mim fica claro que a pessoa sempre vai ser fraca.</p>
<p>Todas as declarações acima, e outras parecidas (&ldquo;Estou deixando Node&rdquo;, &ldquo;Estou deixando .NET&rdquo;, &ldquo;Estou deixando Ruby&rdquo;, &ldquo;Estou deixando X&rdquo;), eu honestamente acredito que vieram sem má intenção ou má fé, ao menos não conscientemente. Mas tenho uma teoria. Quem faz declarações assim quer validação dos pares, ou pior, quer que os pares o sigam, o que também é uma validação da própria posição. <em>&ldquo;Não gosto mais do meu brinquedo velho, mas também não quero que ninguém brinque com ele.&rdquo;</em> É uma posição bem infantil.</p>
<p>Tomando a comunidade Ruby como exemplo, vários nomes meio que &ldquo;largaram&rdquo; suas atividades principais sem bater a porta nem agir com infantilidade. Chad Fowler está na Alemanha tocando o Wunderlist, focado em desenvolvimento mobile e back-end, e não fala mais de Ruby. Ilya Grigorik teve sua startup comprada pelo Google e acabou sumindo também. Matt Aimonetti, depois do episódio Merb vs Rails, se retirou em silêncio e hoje trabalha com Go.</p>
<p>Ryan Bates, um dos mais queridos da comunidade pelo trabalho incansável de anos no RailsCasts, parou de publicar faz meses e não declarou nada a respeito. David Chelimsky, mantenedor do RSpec, passou o bastão adiante e saiu sem alarde. José Valim, um dos principais nomes por trás do Rails 3, hoje está com Elixir e Erlang e raramente comenta algo sobre Ruby.</p>
<h2>&ldquo;O.M.G! Quer dizer que tudo acabou!? Foi pelos ares!?&rdquo;<span class="hx:absolute hx:-mt-20" id="omg-quer-dizer-que-tudo-acabou-foi-pelos-ares"></span>
    <a href="#omg-quer-dizer-que-tudo-acabou-foi-pelos-ares" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não. Nesse meio-tempo, centenas de novos rubistas surgiram e tocaram o trabalho para a frente. O exemplo mais imediato são Carlos Antônio e Rafael França, que meio que assumiram o manto do José Valim no Rails Core. Evan Phoenix assumiu o manto do Chad Fowler na Ruby Central. Avdi Grimm meio que assumiu o do Ryan Bates com o excelente <a href="http://www.rubytapas.com"target="_blank" rel="noopener">RubyTapas</a>, e por aí vai.</p>
<p>Uma comunidade é feita de indivíduos, e cada indivíduo rende mais quando age para maximizar o próprio benefício. O efeito colateral disso é que ele acaba influenciando e puxando outros para cima junto com ele. São sempre trocas voluntárias para benefício <strong>mútuo</strong>. Ninguém age sem nenhum benefício próprio; há quem acredite que sim, e são justamente esses que chegam mais rápido ao &ldquo;burnout&rdquo;, porque logo a pergunta vira:</p>
<blockquote>"Por que eu me canso tanto de colaborar nessa comunidade, me estresso, e mesmo assim nem todos apreciam o que eu faço? Eu faço tudo por eles!"</blockquote>
<p>Essa é a pergunta errada, e pergunta errada leva a resposta errada. Alguns começam a achar que os outros lhe devem algo, já que dedicaram tanto do tempo livre (ainda mais no mundo open source) para &ldquo;ajudar os outros&rdquo;. E &ldquo;os outros&rdquo; acham que não devem nada, porque ninguém pediu esse esforço em primeiro lugar. Na prática, &ldquo;os outros&rdquo; estão certos.</p>
<p>Se você participa de uma comunidade, faz isso por você mesmo. Pode ser porque entende que ajudar os outros faz parte da sua recompensa pessoal. Pode ser porque isso traz paz de espírito ou consciência limpa. Ou porque você é bom estrategista e sabe que certas contribuições vão abrir portas lá na frente. O motivo não importa, desde que exista uma recompensa que você não cobra dos outros de forma obrigatória. Cobrar respeito, educação, compaixão, nada disso faz sentido sem contrapartida. Ninguém pediu para você fazer o que faz; se está fazendo, entenda que é por você. Essa é a definição de trabalho <strong>voluntário</strong>.</p>
<p>E deixando bem claro: trabalho voluntário é trabalho sem <strong>remuneração financeira</strong>, e não trabalho sem benefício ou puramente altruísta. Se o seu trabalho é remunerado, a conversa é outra, e aí o melhor conselho é o do Don Draper:</p>
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'>

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/EnPHp4vwxGM"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>
</div>
<p>Voltando ao assunto, imagino que os nomes que citei, os que se retiraram de forma parcial ou silenciosa, entendem isso. Foram buscar satisfação pessoal em outro lugar. Não devem nada a ninguém, e ninguém deve nada a eles.</p>
<p>Já quem sai com declaração bombástica está, consciente ou não, jogando na cara dos outros: <em>&ldquo;você não me valorizou, agora perdeu a chance, e eu sei que vai sentir minha falta!&rdquo;</em> Não está escrito assim, mas é o que faz sentido. Do contrário, por que jogar no ventilador e transformar aquilo em controvérsia pública? Todo argumento por escrito é só parte da razão, nunca &ldquo;a&rdquo; razão.</p>
<h2>Você, Indivíduo<span class="hx:absolute hx:-mt-20" id="você-indivíduo"></span>
    <a href="#voc%c3%aa-indiv%c3%adduo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O outro lado da moeda é quem segue, admira e idolatra uma dessas pessoas que largaram o lugar onde você está. Dependendo do nível de admiração, você fica sem chão, atordoado, sem saber para onde correr. Aí acontece uma de duas coisas: ou você procura outro ídolo e começa o famoso <em>&ldquo;ele nem era tão bom assim&rdquo;</em>, ou afunda na depressão e no desespero do <em>&ldquo;não sei o que vai ser agora&rdquo;</em>.</p>
<blockquote>Meu conselho: "não tenha ídolos, tenha referências."</blockquote>
<p>Pare de achar que você deve alguma coisa aos outros e, por tabela, pare de jogar nos outros a responsabilidade de ajudar mais gente. É isso que está acontecendo: você não entende o seu <strong>propósito</strong> e acha que os outros têm que fazer aquilo que você mesmo não faz. Pior, você deixa os outros decidirem o caminho que você vai tomar. Se a insegurança é tão grande assim, pare um instante e reflita sobre o que você &ldquo;é&rdquo; antes de tudo.</p>
<p>Seu único propósito na vida é cuidar de si mesmo e produzir, sem atrapalhar o caminho dos outros. Quando você faz isso, o efeito natural é que colaborações espontâneas aparecem, comunidades evoluem e todo mundo sai ganhando. Uma comunidade onde todos cobram todos cresce sem propósito.</p>
<p>Sobre tecnologia, opinião, proposta e promessa, lembre também: você <strong>quer</strong> estar sob &ldquo;ataque&rdquo; e restrição constantes. Não existe nada pior do que ser ignorado. Escrevi outro artigo, tradução de alguém bem mais sábio que eu, a Kathy Sierra, chamado <a href="http://www.akitaonrails.com/2006/10/19/kathy-sierra-dilbert-e-a-zona-de-mediocridade"target="_blank" rel="noopener">Dilbert e a zona de mediocridade</a>, onde cito:</p>
<blockquote>
Quanta coragem você tem? Até onde você (ou seu empregador) iria para evitar a Zona de Mediocridade? A menos que você esteja disposto a arriscar provocar ódio passional, talvez nunca sinta o amor. Scott Adams concorda. Num post recente no blog do Dilbert, ele escreveu: "Se todo mundo que for exposto a um produto gostar dele, o produto não terá sucesso... A razão pela qual um produto que 'todo mundo gosta' vai falhar é que ninguém o 'ama'. A única coisa que prevê sucesso é paixão, mesmo que só 10% dos consumidores a tenham."
</blockquote>
<p>E daí se alguém deixou a sua comunidade? Será que ela é tão frágil que uma pancada, não importa o tamanho do impacto, vai fazer tudo desmoronar? Se você acredita que a sua comunidade é apenas <strong>resistente</strong>, você tem razão: passado certo ponto, ela desmorona. Mas se ela for <strong>resiliente</strong>, maleável e adaptável, ela sobrevive. É o que garante a sobrevivência das espécies, a <a href="http://c2.com/cgi/wiki?SurvivalOfTheFittest"target="_blank" rel="noopener"><strong>Lei do Mais Adaptável</strong></a> (não do mais &ldquo;forte&rdquo;; lembre da diferença entre resistente e resiliente, você quer ser o segundo).</p>
<p>Você é adaptável? Ou está só procurando validação dos outros, deixando que eles decidam por você? Uma coisa eu garanto: se um dia eu desistir do que faço, ninguém vai ficar sabendo por um comunicado escrito. Isso eu já tinha decidido no dia em que comecei.
</content>
</invoke></p>
]]></content:encoded><category>open-source</category><category>filosofia</category><category>gestao</category><category>off-topic</category></item></channel></rss>