{
  "version": "https://jsonfeed.org/version/1",
  "title": "marcelo.txt",
  "home_page_url": "https://blog.marcelomaga.space",
  "feed_url": "https://blog.marcelomaga.space/author-editorial.json",
  "description": "Posts sobre software, sistemas e arquitetura.",
  "items": [
    {
      "id": "https://blog.marcelomaga.space/atk-z1-ultimate-v2.html",
      "url": "https://blog.marcelomaga.space/atk-z1-ultimate-v2.html",
      "title": "ATK Z1 Ultimate V2",
      "content_html": "<h1 id=\"como-tudo-começou\">Como tudo começou...<a href=\"#como-tudo-começou\" aria-label=\"Link to heading 'Como tudo começou...'\" data-heading-content=\"Como tudo começou...\" class=\"anchor\"></a></h1>\n<p>Bom tudo começou um belo dia quando meu antigo mouse Rappo VT3 PRO V1 decidiu que com 6 meses de vida ele não ia mas se conectar com o dongle, me deixando na mão em uma plena quinta feira véspera de feriado.\nDecidido a mudar de vida fiz um ato de terrorismo financeiro, peguei um mouse de 500 reais pra ver qual que é.</p>\n<p>E ca estamos trazendo essa linda review nada técnica</p>\n<h2 id=\"unboxing-meninass\">Unboxing meninass<a href=\"#unboxing-meninass\" aria-label=\"Link to heading 'Unboxing meninass'\" data-heading-content=\"Unboxing meninass\" class=\"anchor\"></a></h2>\n<p>Acho que essa foi a primeira grande diferença, o capricho com que a ATK fez com esse mouse é bizarro, a caixa é muito premium, vou deixar uma sequencia de fotos aqui pra vocês darem uma olhada, mas tudo com um toque muito bom, afinal de contas é um mouse caro</p>\n<p><figure><img src=\"midia/20261022_115839.jpg\" alt=\"20261022_115839\" /></figure></p>\n<p><figure><img src=\"midia/20261022_115855.jpg\" alt=\"20261022_115855\" /></figure></p>\n<p><figure><img src=\"midia/20261022_115917.jpg\" alt=\"20261022_115917\" /></figure></p>\n<h3 id=\"acessórios\">Acessórios<a href=\"#acessórios\" aria-label=\"Link to heading 'Acessórios'\" data-heading-content=\"Acessórios\" class=\"anchor\"></a></h3>\n<p>Aqui não achei nada demais, e acho que n tem muito pra onde correr, veio um jogo de feets extra, um cabo paracord muito mas muito bom mesmo, já tinha usado alguns mas esse é verdadeiramente leve e maleável chega a ser bizarro comparado com o do Rappo e griptapes na cor do mouse (que eu não uso)</p>\n<p><figure><img src=\"midia/20261022_115927.jpg\" alt=\"20261022_115927\" /></figure></p>\n<p><figure><img src=\"midia/20261022_115959.jpg\" alt=\"20261022_115959\" /></figure></p>\n<h2 id=\"shape\">Shape<a href=\"#shape\" aria-label=\"Link to heading 'Shape'\" data-heading-content=\"Shape\" class=\"anchor\"></a></h2>\n<p>Eu tenho um certo fetiche por mouses com a pegada do EC2 da Zowie, o Rappo já tinha essa mesma ideia e não queria mudar, nesse período que fiquei sem meu mouse principal voltei a usar o meu G403, e puta que me pariu, que mouse pesado e pra piorar o sensor estava meio estranho, nesse rolo peguei emprestado um DeathAdder Essential com meu mano Pratinho pra tapar o galho e poder continuar jogando...</p>\n<p><figure><img src=\"midia/Screenshot_20261016_202418_Chrome.jpg\" alt=\"Screenshot_20261016_202418_Chrome\" /></figure></p>\n<p>Enquanto isso meu mouse passava por uma sub-trama sinistra na China pra chegar ao Brasil, o medo tomou conta de mim, o Correios entrou em greve e já tinha certeza que nunca mais ia ver meu querido Z1, porem ele chegou, tudo certo ainda bem!</p>\n<h1 id=\"agora-o-principal\">Agora o principal<a href=\"#agora-o-principal\" aria-label=\"Link to heading 'Agora o principal'\" data-heading-content=\"Agora o principal\" class=\"anchor\"></a></h1>\n<p>Bom depois de tudo isso, enfim uma analise sincera do mouse, não entendo absolutamente nada mas vou dar uma comparação com o meu antigo Rappo, por mais que não seja a mesma proposta é oque tem pra hoje!</p>\n<h2 id=\"coating\">Coating<a href=\"#coating\" aria-label=\"Link to heading 'Coating'\" data-heading-content=\"Coating\" class=\"anchor\"></a></h2>\n<p>Bom essa foi de fato a primeira coisa que notei ao tocar no Z1, puta que pariu, ele passa um sensação muito gostosa, quase que aveludada ao relar nele, o VT3 já tinha algo assim, mas ainda sentia que era um plástico, no Z1 isso parece que foi algo levado a serio</p>\n<h2 id=\"peso\">Peso<a href=\"#peso\" aria-label=\"Link to heading 'Peso'\" data-heading-content=\"Peso\" class=\"anchor\"></a></h2>\n<p>Outra diferença foi o peso, nossa como 5g possam fazer tanta diferença? mas acho que esse nem é o ponto, como o peso é bem distribuído pelo mouse, parece ser até mais leve em movimentos rápidos e facilita um pouco na hora de parar o mouse no pad</p>\n<h2 id=\"sensor\">Sensor<a href=\"#sensor\" aria-label=\"Link to heading 'Sensor'\" data-heading-content=\"Sensor\" class=\"anchor\"></a></h2>\n<p>Como não sou um completo maluco, não consigo sentir muita diferença, o Rappo já entregava um ótimo tracking pra mim, então não notei absolutamente nada ate que liguei os ...</p>\n<h3 id=\"8k-de-polling-rate\">8k de polling rate<a href=\"#8k-de-polling-rate\" aria-label=\"Link to heading '8k de polling rate'\" data-heading-content=\"8k de polling rate\" class=\"anchor\"></a></h3>\n<p>Bizarro, no CS2 parece que o mouse flutua na mesa, não é algo que de uma vantagem extraordinária (ainda mais nos 19k do premier) mas a sensação de fluidez foi algo completamente novo, pena que a bateria simplesmente some depois de 2 partidas</p>\n<h2 id=\"switches\">Switches<a href=\"#switches\" aria-label=\"Link to heading 'Switches'\" data-heading-content=\"Switches\" class=\"anchor\"></a></h2>\n<p>Senti uma leve diferença, parecem mais duros, como se fossem de teclados, sentia muito desconforto ao apertar e segurar o mouse1 no VT3, parecia sambar na carcaça dele, com o Z1 isso não acontece</p>\n<h1 id=\"considerações-finais\">Considerações finais<a href=\"#considerações-finais\" aria-label=\"Link to heading 'Considerações finais'\" data-heading-content=\"Considerações finais\" class=\"anchor\"></a></h1>\n<p>Não acho que tudo isso seja justificável, é um puta mouse bom, mas sla, não gastaria esse valor de novo, acho que provavelmente temos no mercado Chines, opções parecidas por um valor mais alto. bom é isso!</p>\n",
      "summary": "\"Minha experiência com meu novo mouse!\"",
      "date_published": "2026-10-16T00:00:00-00:00",
      "image": "midia/20261022_115839.jpg",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "periferico",
        "review"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/blog-novo.html",
      "url": "https://blog.marcelomaga.space/blog-novo.html",
      "title": "Blog novo (quase isso)",
      "content_html": "<h1 id=\"introdução\">Introdução<a href=\"#introdução\" aria-label=\"Link to heading 'Introdução'\" data-heading-content=\"Introdução\" class=\"anchor\"></a></h1>\n<p>Quanto tempo, aconteceu tanta coisa desde do ultimo artigo que nem sei oque dizer, deixei esse projetin aqui abandonado (igual todos os outros) e hoje no meio do trampo me deu uma vontade de voltar a atualizar isso aqui! bom e aqui estamos, tava meio desanimado com a forma que algumas coisas estavam sendo feitas aqui, então resolvi dar uma repaginada, mudar o visual pra algo mais proximo do meu gosto pessoal mesmo (estou obcecado pela cor laranja!) e tentar dar um simplificada, esse post aqui será apenas isso mesmo, em breve vou tentar terminar o <a href=\"super-minigrep.html\" data-wikilink=\"true\">Super minigrep</a> e tbm tentar colocar alumas review de alguns produtinhos que venho adquirindo e testando.</p>\n<p>é isso ai tudo numa linha só e marcha tmj pjl lili cantara!</p>\n",
      "summary": "\"Anunciando as mudanças ao blog\"",
      "date_published": "2026-10-16T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "chore"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/arrumando-a-casa.html",
      "url": "https://blog.marcelomaga.space/arrumando-a-casa.html",
      "title": "Arrumando a Casa",
      "content_html": "<p>Não, eu não quero ajudar você a organizar seu quarto!</p>\n<h1 id=\"introdução\">Introdução<a href=\"#introdução\" aria-label=\"Link to heading 'Introdução'\" data-heading-content=\"Introdução\" class=\"anchor\"></a></h1>\n<p>Bom, como eu avia dito no artigo anterior tava querendo fazer esse projetinho do grep do Rust e aplicar algumas melhorias nele, e acho que a primeira coisa que devemos fazer quando pensamos em fazer uma refatoração do nível que comentei no artigo anterior (que esta aqui ó: <a href=\"super-minigrep.html\" data-wikilink=\"true\">Super minigrep</a>) é uma organização clara e objetiva, para que assim novos desenvolvedores possam entrar no projeto, e não terem que lidar com arquivos enormes (na medida do possível)</p>\n<h1 id=\"código-atual\">Código atual<a href=\"#código-atual\" aria-label=\"Link to heading 'Código atual'\" data-heading-content=\"Código atual\" class=\"anchor\"></a></h1>\n<p>Deixei uma <a href=\"https://github.com/Marcelo-maga/super-minigrep/tree/feature/book_code\">Branch</a> criada dentro do repositório mas aqui esta uma fotografia digital do estado atual que quero dizer\n<figure><img src=\"midia/super-minigrep/%7B1%7D.png\" alt=\"Estrutura atual do repo\" /></figure></p>\n<p>Consegue ver?? como as pessoas vão conseguir trabalhar aqui?? me fala!!! não tem como, então vamos primeiro aplicar melhorias na organização do projeto para ai sim, aplicar melhorias verdadeiras.</p>\n<h1 id=\"arquivos-que-gritam-seus-nomes\">Arquivos que gritam seus nomes<a href=\"#arquivos-que-gritam-seus-nomes\" aria-label=\"Link to heading 'Arquivos que gritam seus nomes'\" data-heading-content=\"Arquivos que gritam seus nomes\" class=\"anchor\"></a></h1>\n<p>É ISSO QUE NOS QUEREMOS! ARQUIVOS QUE GRITEM SEUS NOMES, SEU CANTO DE GUERRA, PRONTOS PARA A BATALHA!</p>\n<p>Se você já leu o capitulo 2 de Clean Code (☝️🤓) sabe oque eu quero dizer aqui, os nomes devem revelar o seu proposito, e creio fielmente nisso, então vamos começar com isso antes de qualquer coisa, sem alterar profundamente o código, isso tem que ficar para depois, para facilitar as mentes mais lentas (eu) e criar até mesmo um histórico de alterações mais tangível e real.</p>\n<h2 id=\"config\">Config<a href=\"#config\" aria-label=\"Link to heading 'Config'\" data-heading-content=\"Config\" class=\"anchor\"></a></h2>\n<p>Então vamos começar com a configuração, ela é a nossa porta de entrada, crie um arquivo '<em>config.rs</em>' e remova toda a parte de configuração e parâmetros da nossa mini CLI de dentro do <em>lib.rs</em>, teremos algo assim (caso você não tenha ansiedade e já começou a implementar algo):</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>use</a-k> std<a-p>::</a-p>env<a-p>;</a-p>\n\n<a-k>pub</a-k> <a-k>struct</a-k> <a-t>Config</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-pr>query</a-pr><a-p>:</a-p> <a-t>String</a-t><a-p>,</a-p>\n    <a-k>pub</a-k> <a-pr>filename</a-pr><a-p>:</a-p> <a-t>String</a-t><a-p>,</a-p>\n    <a-k>pub</a-k> <a-pr>case_sensitive</a-pr><a-p>:</a-p> <a-t>bool</a-t><a-p>,</a-p>\n<a-p>}</a-p>\n\n<a-k>impl</a-k> <a-t>Config</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>new</a-f><a-p>(</a-p><a-v>args</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-p>[</a-p><a-t>String</a-t><a-p>])</a-p> -&gt; <a-t>Result</a-t><a-p>&lt;</a-p><a-t>Config</a-t><a-p>,</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> case_sensitive = <a-co>false</a-co><a-p>;</a-p>\n        <a-k>if</a-k> <a-p>(</a-p>args<a-p>.</a-p><a-f>len</a-f><a-p>()</a-p> == <a-co>4</a-co><a-p>)</a-p> &amp;&amp; <a-p>(</a-p>args<a-p>[</a-p><a-co>3</a-co><a-p>]</a-p> == <a-s>&quot;--case-sensitive&quot;</a-s><a-p>)</a-p> <a-p>{</a-p>\n            case_sensitive = <a-co>true</a-co><a-p>;</a-p>\n        <a-p>}</a-p>\n        <a-k>if</a-k> args<a-p>.</a-p><a-f>len</a-f><a-p>()</a-p> &lt; <a-co>3</a-co> <a-p>{</a-p>\n            <a-k>return</a-k> <a-f>Err</a-f><a-p>(</a-p><a-s>&quot;not enough arguments&quot;</a-s><a-p>);</a-p>\n        <a-p>}</a-p>\n\n        <a-k>let</a-k> query = args<a-p>[</a-p><a-co>1</a-co><a-p>].</a-p><a-f>clone</a-f><a-p>();</a-p>\n        <a-k>let</a-k> filename = args<a-p>[</a-p><a-co>2</a-co><a-p>].</a-p><a-f>clone</a-f><a-p>();</a-p>\n\n        <a-k>if</a-k> !case_sensitive <a-p>{</a-p>\n            case_sensitive = !env<a-p>::</a-p><a-f>var</a-f><a-p>(</a-p><a-s>&quot;CASE_SENSITIVE&quot;</a-s><a-p>).</a-p><a-f>is_err</a-f><a-p>();</a-p>\n        <a-p>}</a-p>\n\n        <a-f>Ok</a-f><a-p>(</a-p><a-t>Config</a-t> <a-p>{</a-p>\n            query<a-p>,</a-p>\n            filename<a-p>,</a-p>\n            case_sensitive<a-p>,</a-p>\n        <a-p>})</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Com isso temos um arquivo com toda a regra de validação dos argumentos fornecidos pelo nosso usuário, etapa importante para nosso projetos, nossas ideias são enormes para esse projeto, uma CLI precisa de um bom parser de argumentos. (sim sim sim, eu sei que poderíamos estar utilizando <a href=\"https://crates.io/crates/clap\">Clap</a> para reduzir tudo isso em meras configurações triviais, mas para manter a magia da coisa, vamos manter dessa forma)</p>\n<h2 id=\"finder\">Finder<a href=\"#finder\" aria-label=\"Link to heading 'Finder'\" data-heading-content=\"Finder\" class=\"anchor\"></a></h2>\n<p>Sim, eu sei que sou péssimo com nomes (ficou claro com o nome desse projeto), mas acho que esse vai passar bem a vibes que desejamos aqui, um buscador, um achador (é isso ai, kkkk)</p>\n<p>Então já sabemos oque temos que fazer, crie um arquivo '<em>finder.rs</em>' e vamos encapsular as duas funções de busca que nos foram ensinadas dentro de um struct de mesmo nome, dessa forma nas nossas melhorias futuras tudo vai fazer sentido, tudo! se você tiver um pouco de conhecimento em Rust, deve ter chegado em algo parecido com isso:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>pub</a-k> <a-k>struct</a-k> <a-t>Finder</a-t><a-p>;</a-p>\n\n<a-k>impl</a-k> <a-t>Finder</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>search</a-f><a-p>&lt;</a-p><a-o>&#39;</a-o><a-l>a</a-l><a-p>&gt;(</a-p><a-v>query</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>,</a-p> <a-v>contents</a-v><a-p>:</a-p> <a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>)</a-p> -&gt; <a-t>Vec</a-t><a-p>&lt;</a-p><a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> result = <a-t>Vec</a-t><a-p>::</a-p><a-f>new</a-f><a-p>();</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> contents<a-p>.</a-p><a-f>lines</a-f><a-p>()</a-p> <a-p>{</a-p>\n            <a-k>if</a-k> line<a-p>.</a-p><a-f>contains</a-f><a-p>(</a-p>query<a-p>)</a-p> <a-p>{</a-p>\n                result<a-p>.</a-p><a-f>push</a-f><a-p>(</a-p>line<a-p>);</a-p>\n            <a-p>}</a-p>\n        <a-p>}</a-p>\n        result\n    <a-p>}</a-p>\n\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>search_case_insensitive</a-f><a-p>&lt;</a-p><a-o>&#39;</a-o><a-l>a</a-l><a-p>&gt;(</a-p><a-v>query</a-v><a-p>:</a-p> <a-o>&amp;</a-o><a-t>str</a-t><a-p>,</a-p> <a-v>contents</a-v><a-p>:</a-p> <a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>)</a-p> -&gt; <a-t>Vec</a-t><a-p>&lt;</a-p><a-o>&amp;&#39;</a-o><a-l>a</a-l> <a-t>str</a-t><a-p>&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> <a-k>mut</a-k> result = <a-t>Vec</a-t><a-p>::</a-p><a-f>new</a-f><a-p>();</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> contents<a-p>.</a-p><a-f>lines</a-f><a-p>()</a-p> <a-p>{</a-p>\n            <a-k>if</a-k> line<a-p>.</a-p><a-f>to_lowercase</a-f><a-p>().</a-p><a-f>contains</a-f><a-p>(</a-p><a-o>&amp;</a-o>query<a-p>.</a-p><a-f>to_lowercase</a-f><a-p>())</a-p> <a-p>{</a-p>\n                result<a-p>.</a-p><a-f>push</a-f><a-p>(</a-p>line<a-p>);</a-p>\n            <a-p>}</a-p>\n        <a-p>}</a-p>\n        result\n    <a-p>}</a-p>\n<a-p>}</a-p>\n\n<a-at>#</a-at><a-p>[</a-p><a-at>cfg</a-at><a-p>(</a-p><a-at>test</a-at><a-p>)]</a-p>\n<a-k>mod</a-k> tests <a-p>{</a-p>\n    <a-k>use</a-k> <a-k>super</a-k><a-p>::</a-p><a-o>*</a-o><a-p>;</a-p>\n\n    <a-at>#</a-at><a-p>[</a-p><a-at>test</a-at><a-p>]</a-p>\n    <a-k>fn</a-k> <a-f>case_sensitive</a-f><a-p>()</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> query = <a-s>&quot;duct&quot;</a-s><a-p>;</a-p>\n        <a-k>let</a-k> contents = <a-s>&quot;\\\nRust:\nsafe, fast, productive.\nPick three.\nDuct Tape.&quot;</a-s><a-p>;</a-p>\n        <a-m>assert_eq!</a-m><a-p>(</a-p>\n            <a-m>vec!</a-m><a-p>[</a-p><a-s>&quot;safe, fast, productive.&quot;</a-s><a-p>],</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search</a-f><a-p>(</a-p>query<a-p>,</a-p> contents<a-p>)</a-p>\n        <a-p>);</a-p>\n    <a-p>}</a-p>\n\n    <a-at>#</a-at><a-p>[</a-p><a-at>test</a-at><a-p>]</a-p>\n    <a-k>fn</a-k> <a-f>case_insensitive</a-f><a-p>()</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> query = <a-s>&quot;rUsT&quot;</a-s><a-p>;</a-p>\n        <a-k>let</a-k> contents = <a-s>&quot;\\\nRust:\nsafe, fast, productive.\nPick three.\nTrust me.&quot;</a-s><a-p>;</a-p>\n        <a-m>assert_eq!</a-m><a-p>(</a-p>\n            <a-m>vec!</a-m><a-p>[</a-p><a-s>&quot;Rust:&quot;</a-s><a-p>,</a-p> <a-s>&quot;Trust me.&quot;</a-s><a-p>],</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search_case_insensitive</a-f><a-p>(</a-p>query<a-p>,</a-p> contents<a-p>)</a-p>\n        <a-p>);</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Nossos amigos do livro já deixaram testes feitos, lembra deles? pois então, em Rust deixamos os testes unitários dentro dos próprios arquivos, la em baixo, pode copiar e adaptar pra funcionar com suas próprias structs.</p>\n<h2 id=\"lib\">Lib<a href=\"#lib\" aria-label=\"Link to heading 'Lib'\" data-heading-content=\"Lib\" class=\"anchor\"></a></h2>\n<p>Bom se tudo deu certo ai, vamos precisar arrumar aqui também, o coração da CLI vive aqui, onde vamos expor nossas regras de negocio para que seja usavel pelo programa compilado, eu criei um struct chamada <em>SuperMiniGrep</em> dentro de '<em>lib.rs</em>' e joguei a função <em>run</em> dentro dela e arrumei os imports e tudo mais, ficou assim:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>pub</a-k> <a-k>mod</a-k> config<a-p>;</a-p>\n<a-k>mod</a-k> finder<a-p>;</a-p>\n\n<a-k>use</a-k> <a-k>crate</a-k><a-p>::</a-p>config<a-p>::</a-p><a-cr>Config</a-cr><a-p>;</a-p>\n<a-k>use</a-k> <a-k>crate</a-k><a-p>::</a-p>finder<a-p>::</a-p><a-cr>Finder</a-cr><a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>error<a-p>::</a-p><a-cr>Error</a-cr><a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>fs<a-p>;</a-p>\n\n<a-k>pub</a-k> <a-k>struct</a-k> <a-t>SuperMiniGrep</a-t><a-p>;</a-p>\n\n<a-k>impl</a-k> <a-t>SuperMiniGrep</a-t> <a-p>{</a-p>\n    <a-k>pub</a-k> <a-k>fn</a-k> <a-f>run</a-f><a-p>(</a-p><a-v>config</a-v><a-p>:</a-p> <a-t>Config</a-t><a-p>)</a-p> -&gt; <a-t>Result</a-t><a-p>&lt;(),</a-p> <a-t>Box</a-t><a-p>&lt;</a-p><a-k>dyn</a-k> <a-t>Error</a-t><a-p>&gt;&gt;</a-p> <a-p>{</a-p>\n        <a-k>let</a-k> contents = fs<a-p>::</a-p><a-f>read_to_string</a-f><a-p>(</a-p>config<a-p>.</a-p><a-pr>filename</a-pr><a-p>)</a-p>?<a-p>;</a-p>\n\n        <a-k>let</a-k> result = <a-k>if</a-k> config<a-p>.</a-p><a-pr>case_sensitive</a-pr> <a-p>{</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search</a-f><a-p>(</a-p><a-o>&amp;</a-o>config<a-p>.</a-p><a-pr>query</a-pr><a-p>,</a-p> <a-o>&amp;</a-o>contents<a-p>)</a-p>\n        <a-p>}</a-p> <a-k>else</a-k> <a-p>{</a-p>\n            <a-t>Finder</a-t><a-p>::</a-p><a-f>search_case_insensitive</a-f><a-p>(</a-p><a-o>&amp;</a-o>config<a-p>.</a-p><a-pr>query</a-pr><a-p>,</a-p> <a-o>&amp;</a-o>contents<a-p>)</a-p>\n        <a-p>};</a-p>\n        <a-k>for</a-k> line <a-k>in</a-k> result <a-p>{</a-p>\n            <a-m>println!</a-m><a-p>(</a-p><a-s>&quot;{}&quot;</a-s><a-p>,</a-p> line<a-p>);</a-p>\n        <a-p>}</a-p>\n\n        <a-f>Ok</a-f><a-p>(())</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<p>Com tudo isso feito, nossa cli já deve compilar, mas primeiros vamos rodar os testes e ver se ta tudo passando né:</p>\n<p><figure><img src=\"midia/super-minigrep/%7B2%7D.png\" alt=\"Testes passando tudo OK\" /></figure></p>\n<p>Tudo certo, nossas alterações não quebraram a CLI no meio, um grande avanço para nós não acha?</p>\n<p>e com tudo isso nossa <em>main.rs</em> fica muito parecida, quase que intocada, porem os benefícios vão ser visíveis a longo prazo!</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-rust\"><a-k>use</a-k> std<a-p>::</a-p>env<a-p>;</a-p>\n<a-k>use</a-k> std<a-p>::</a-p>process<a-p>;</a-p>\n\n<a-k>use</a-k> super_minigrep<a-p>::{</a-p><a-cr>SuperMiniGrep</a-cr><a-p>,</a-p> config<a-p>::</a-p><a-cr>Config</a-cr><a-p>};</a-p>\n\n<a-k>fn</a-k> <a-f>main</a-f><a-p>()</a-p> <a-p>{</a-p>\n    <a-k>let</a-k> args<a-p>:</a-p> <a-t>Vec</a-t><a-p>&lt;</a-p><a-t>String</a-t><a-p>&gt;</a-p> = env<a-p>::</a-p><a-f>args</a-f><a-p>().</a-p><a-f>collect</a-f><a-p>();</a-p>\n\n    <a-k>let</a-k> config = <a-t>Config</a-t><a-p>::</a-p><a-f>new</a-f><a-p>(</a-p><a-o>&amp;</a-o>args<a-p>).</a-p><a-f>unwrap_or_else</a-f><a-p>(</a-p>|err| <a-p>{</a-p>\n        <a-m>eprintln!</a-m><a-p>(</a-p><a-s>&quot;Problem parsing arguments: {}&quot;</a-s><a-p>,</a-p> err<a-p>);</a-p>\n        process<a-p>::</a-p><a-f>exit</a-f><a-p>(</a-p><a-co>1</a-co><a-p>);</a-p>\n    <a-p>});</a-p>\n\n    <a-k>if</a-k> <a-k>let</a-k> <a-cr>Err</a-cr><a-p>(</a-p>e<a-p>)</a-p> = <a-t>SuperMiniGrep</a-t><a-p>::</a-p><a-f>run</a-f><a-p>(</a-p>config<a-p>)</a-p> <a-p>{</a-p>\n        <a-m>eprintln!</a-m><a-p>(</a-p><a-s>&quot;Application error: {}&quot;</a-s><a-p>,</a-p> e<a-p>);</a-p>\n        process<a-p>::</a-p><a-f>exit</a-f><a-p>(</a-p><a-co>1</a-co><a-p>);</a-p>\n    <a-p>}</a-p>\n<a-p>}</a-p></code></pre>\n<h1 id=\"conclusão\">Conclusão<a href=\"#conclusão\" aria-label=\"Link to heading 'Conclusão'\" data-heading-content=\"Conclusão\" class=\"anchor\"></a></h1>\n<p>Bom isso aqui ficou maior do que eu esperava, sei que prometi no artigo anterior já fazer melhorias no código em si, mas acho que foi um passo importante para o soberania do super-minigrep.</p>\n<p>e foi assim que ficou a estrutura do projeto, podemos fazer muitas outras melhorias, mas com o tempo se tudo ir se encaminhando bem, vamos aplicando elas (como o Cargo Workspaces)</p>\n<p><figure><img src=\"midia/super-minigrep/%7B3%7D.png\" alt=\"Estrutura Final\" /></figure></p>\n<p>Então aqui dou um tchau, beijos!</p>\n",
      "summary": "",
      "date_published": "2026-05-30T00:00:00-00:00",
      "image": "midia/super-minigrep/%7B1%7D.png",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "rust"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/super-minigrep.html",
      "url": "https://blog.marcelomaga.space/super-minigrep.html",
      "title": "Super minigrep",
      "content_html": "<p>Eitchaa 2 posts em uma semana, sou uma maquina...</p>\n<h1 id=\"pq-estamos-aqui\">Pq estamos aqui?<a href=\"#pq-estamos-aqui\" aria-label=\"Link to heading 'Pq estamos aqui?'\" data-heading-content=\"Pq estamos aqui?\" class=\"anchor\"></a></h1>\n<p>Estava aqui agora 22:10 da noite pensando em como eu poderia aplicar tudo que eu andei falando/escrevendo aqui (<a href=\"cognitive-offloading.html\" data-wikilink=\"true\">Cognitive Offloading</a>) e tentando achar algo interessante que me desse a vontade necessária de construir fora do meu horário de trabalho. E ontem (20/05) e hoje (21/05) foram dias super produtivos lá, onde tive a oportunidade (rsrs) de construir basicamente um fazedor (isso ai que você leu!) de relatórios, onde basicamente, recebo as mensagens em uma fila RabbitMQ e crio o arquivo PDF, através de mágica e chromium, e envio o buffer para ser armazenado no sistema de arquivos da organização do usuário. O detalhe interessante disso tudo é que o worker que faz os PDF é escrito em uma beldade chamada <a href=\"https://rust-lang.org/\">Rust</a>.</p>\n<p>O que me acendeu uma vontade imensa de fazer alguma coisa minha aqui na minha casinha, mas tenho uma certa preguiça de desenvolver sistemas web quando o assunto é projetos pessoais, nunca gostei, sempre preferi criar aplicativos desktops</p>\n<p>(que inclusive penso em escrever um pouco sobre <a href=\"https://v2.tauri.app/\">Tauri</a> que bizzaramente tenho muita experiencia e historia pra contar do que eu já passei com esse framework maravilhoso)</p>\n<p>E outro mundo da programação que sempre adorei foram as CLI, e revisitando <a href=\"https://doc.rust-lang.org/book/\">O Livro</a> lembrei de um mini projeto que temos para aprender certos conceitos que aprendemos até aquele momento na leitura, o minigrep. O grep é um comando para pesquisar por padrões de texto em arquivos ou em qualquer coisa que tenha stdout no terminal, muito utilizado quando o desespero bate e voce esta dentro de um SSH com o seu chefe aos prantos por conta da API que caiu e você tem ideia de qual foi o console.log que foi adicionado no ultimo PR que travou o event loop do NodeJS.</p>\n<h1 id=\"a-ideia\">A ideia<a href=\"#a-ideia\" aria-label=\"Link to heading 'A ideia'\" data-heading-content=\"A ideia\" class=\"anchor\"></a></h1>\n<p>enfim, porque não melhorar ele??? então por aqui nas próximas semanas vão ser bem movimentado, a priore eu pensei em torno de 4 artigos seguindo uma completa refatoração do projeto minigrep para transforma ele em... (adivinha o nome super criativo) um super-minigrep.</p>\n<p>pensei em aceitar regex (o inferno nos aguarda), múltiplos arquivos sendo processados simultaneamente (Tokio vai ser necessário), um e error handling digno de cinema com anyhow e thiserror e maneiras pintar o terminal para ficar bem legal.</p>\n<p>Spolier: O primeiro artigo quero fazer uma analise (pouco aprofundada) do código que temos ao seguir o livro e já começar com pequenas melhorias!</p>\n<h1 id=\"conclusão\">Conclusão<a href=\"#conclusão\" aria-label=\"Link to heading 'Conclusão'\" data-heading-content=\"Conclusão\" class=\"anchor\"></a></h1>\n<p>Já deixei um repositório no <a href=\"https://github.com/Marcelo-maga/super-minigrep\">Github</a> pronto para começar</p>\n<p>conforme for criando os artigos vou usando esse aqui como um indexador para que seja facilmente localizado nesse mar de texto que vai virar isso aqui!!</p>\n<h2 id=\"sumario\">Sumario<a href=\"#sumario\" aria-label=\"Link to heading 'Sumario'\" data-heading-content=\"Sumario\" class=\"anchor\"></a></h2>\n<p>1 - <a href=\"arrumando-a-casa.html\" data-wikilink=\"true\">Arrumando a Casa</a></p>\n",
      "summary": "",
      "date_published": "2026-05-21T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "rust"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/cognitive-offloading.html",
      "url": "https://blog.marcelomaga.space/cognitive-offloading.html",
      "title": "Cognitive Offloading",
      "content_html": "<h1 id=\"introdução\">Introdução<a href=\"#introdução\" aria-label=\"Link to heading 'Introdução'\" data-heading-content=\"Introdução\" class=\"anchor\"></a></h1>\n<p>Com o desenvolvimento da IA e vídeos curtos, eu venho sentindo uma seria desmotivação em me concentrar e evoluir em tópicos que antes me pareciam um universo de fantasia, o brio, aquela vontade de entender como certas partes do nosso universo e da minha área de atuação foi simplesmente sumindo... sei que provavelmente não é apenas por culpas desses 2 novos vilões da humanidade (provavelmente a falta de sol e vitaminas também é um fator critico, pensando agora na minha rotina e alimentação)</p>\n<h1 id=\"como-nos-aceitamos-ficar-burros\">Como nos aceitamos ficar burros?<a href=\"#como-nos-aceitamos-ficar-burros\" aria-label=\"Link to heading 'Como nos aceitamos ficar burros?'\" data-heading-content=\"Como nos aceitamos ficar burros?\" class=\"anchor\"></a></h1>\n<p>Eu claramente nao sou nenhum especialista na área (assim como em nenhuma outra área) mas venho crendo fielmente que a utilização de inteligência artificial vem nos deixando mais burros, completamente idiotas e preguiçosos (e quando eu digo <code>nos</code> no plural eu digo sobre mim, mesmo que em uma perspectiva fictícia para que eu nao me sinta tão mal)</p>\n<p>Decisões que antes era simples ponderar os pros e contras, se tornaram quase que uma tortura psicológica, precisando da validação de um negocio que eu acho que nao tem sentimentos nem consciência, assuntos que a 3 anos atrás eu me sentia completamente confortável, hoje se vierem em uma conversa casual eu simplesmente travo e entro em desespero.</p>\n<p>Alguns de nosso colegas mais experientes podem tratar isso como uma síndrome do impostor, mas eu sempre tentei lidar com ela e creio que sempre consegui me sair muito bem, saber os meus limites, meus gaps de aprendizados e onde eu deveria me concentrar para estudar, onde eu queria chegar e conhecer, mas depois que o Claude Code foi implementado e quase que evangelizado na empresa em que trabalho, hoje 19/05/2026 eu posso afirmar que estou sofrendo de cognitive offloading (e não de amor!!)</p>\n<h1 id=\"\">?<a href=\"#\" aria-label=\"Link to heading '?'\" data-heading-content=\"?\" class=\"anchor\"></a></h1>\n<p>É isso ai meu camarada, cognitive offloading, a ação de delegar a sua capacidade cognitiva para uma inteligência artificial, aparentemente é uma área de estudo bem recente, como tudo envolvendo IA moderna, mas super interessante, que eu acredito fielmente que vale pelo menos uma sessão de vídeos e anotações de uma noite que não tiver nada pra fazer.</p>\n<h1 id=\"como-planejo-sair-disso\">Como planejo sair disso?<a href=\"#como-planejo-sair-disso\" aria-label=\"Link to heading 'Como planejo sair disso?'\" data-heading-content=\"Como planejo sair disso?\" class=\"anchor\"></a></h1>\n<p>Bom a primeira etapa do vicio provavelmente e admitir que você esta viciado né? correto? não sei nunca fui um, mas creio que deve ser por ai a ideia central, e esses dias andando por uma IDE nova o <a href=\"https://zed.dev/\">Zed</a> achei uma opção muito interessante, desabilitar todos os recursos de IA. É essa é a minha ideia, forçar um grande Rollback, para que a área de estudos principal (depois de Counter-Strike é claro) da minha vida e carreira possa voltar a se desenvolver de maneira natural</p>\n<p><figure><img src=\"midia/%7BB727BA46-E8E1-43DB-A3F0-1B0461B83C3F%7D.png\" alt=\"Zed com recursos de IA desativados\" /></figure></p>\n<p>Não espero que seja fácil, provavelmente terei recaídas, mas acho que essa vai ser a melhor forma de voltar a ter controle e confiança que tinha a 2 anos atrás. Logicamente que não vou fazer isso na empresa, pois ainda sim acima do meu conhecimento, a produtividade que a IA trás é sim verdadeira (não é 10x como falam, mas ajuda sim), então em cenários e ambientes que eu preciso utilizar para aumentar a minha produtividade, vou utilizar sim! mas claro, agora com um pouco mais de confiança e certeza doque eu estou fazendo e desenvolvendo.</p>\n<h1 id=\"conclusão\">Conclusão<a href=\"#conclusão\" aria-label=\"Link to heading 'Conclusão'\" data-heading-content=\"Conclusão\" class=\"anchor\"></a></h1>\n<p>Vale ressaltar que não vai ser apenas ativar aquele switch ali em cima que todos os meus (e seus) problemas vão estar resolvidos, creio que para voltar num nível próximo de proficiência de como era antes da IA, vai levar ai pelo menos 1 ano de pratica novamente, estou pensando em como voltar a fazer isso, mas acho que é tópico para outro texto por aqui.</p>\n<p>Vale ressaltar que esse texto aqui foi escrito 100% sem IA, como já parte do meu treinamento de não ser dominado por maquinas!</p>\n<p>Muito obrigado por ler até aqui e sinta-se livre para escrever ai em baixo, beijos!</p>\n",
      "summary": "",
      "date_published": "2026-05-19T00:00:00-00:00",
      "image": "midia/%7BB727BA46-E8E1-43DB-A3F0-1B0461B83C3F%7D.png",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "ia"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/devops.html",
      "url": "https://blog.marcelomaga.space/devops.html",
      "title": "DevOps",
      "content_html": "<p>Escalabilidade\nAlta Disponibilidade\nResiliência\nTolerância a Falhas\nLoad Balancers\nCI &amp; CD\nKubernetes</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "devops"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/terraform.html",
      "url": "https://blog.marcelomaga.space/terraform.html",
      "title": "Terraform",
      "content_html": "<h1 id=\"aula-1---introdução-ao-terraform\">Aula 1 - Introdução ao Terraform<a href=\"#aula-1---introdução-ao-terraform\" aria-label=\"Link to heading 'Aula 1 - Introdução ao Terraform'\" data-heading-content=\"Aula 1 - Introdução ao Terraform\" class=\"anchor\"></a></h1>\n<p>Terraform funciona totalmente com a Cloud</p>\n<h3 id=\"linguagem-hcl\">Linguagem HCL<a href=\"#linguagem-hcl\" aria-label=\"Link to heading 'Linguagem HCL'\" data-heading-content=\"Linguagem HCL\" class=\"anchor\"></a></h3>\n<p>Hashicortp Configuration Language</p>\n<p>HCL -&gt; é simples</p>\n<p>Uma mistura de json e yml</p>\n<p><a href=\"https://registry.terraform.io/providers/hashicorp/aws/latest/docs\">https://registry.terraform.io/providers/hashicorp/aws/latest/docs</a></p>\n<p>De acordo com a cloud, algumas cosias podem mudar, porem a ideia é ser  o mínimo diferente possível</p>\n<h1 id=\"aula-2---providers-e-backend\">Aula 2 - Providers e Backend<a href=\"#aula-2---providers-e-backend\" aria-label=\"Link to heading 'Aula 2 - Providers e Backend'\" data-heading-content=\"Aula 2 - Providers e Backend\" class=\"anchor\"></a></h1>\n<p>Provider -&gt; São APIs do provedores de cloud, como a AWS e Azure\nBaixa um SDK para executar comandos da cloud selecionada</p>\n<p>Resources -&gt; Manifesto k8s -&gt; Cluster</p>\n<p>State -&gt; O coração do terraform, terraform.tfstate, o arquivo de estado, com os dados sensíveis da infra, se o arquivo for corrompido, ele vai criar tudo do zero</p>\n<p>bakend -&gt; armazena o state de maneira segura, pode ser um S3 que armazena os arquivos</p>\n<h1 id=\"aula-3---principais-comandos\">Aula 3 - Principais Comandos<a href=\"#aula-3---principais-comandos\" aria-label=\"Link to heading 'Aula 3 - Principais Comandos'\" data-heading-content=\"Aula 3 - Principais Comandos\" class=\"anchor\"></a></h1>\n<p>terraform init -&gt; iniciamos o repositório baixando todos os pacotes</p>\n<p>terraform plan -&gt; simula a criação, mostra oque sera criado, sem executar, fica na pipeline CI</p>\n<p>terraform apply -&gt; cria a infra de vdd</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "devops"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/ci-e-cd.html",
      "url": "https://blog.marcelomaga.space/ci-e-cd.html",
      "title": "CI & CD",
      "content_html": "<h1 id=\"principais-conceitos\">Principais Conceitos<a href=\"#principais-conceitos\" aria-label=\"Link to heading 'Principais Conceitos'\" data-heading-content=\"Principais Conceitos\" class=\"anchor\"></a></h1>\n<p>O termo DevOps foi criado por Patrick Debois em uma hashtag do Twitter, e a principal ideia é aproximar o desenvolvedor da infraestrutura.</p>\n<p>DevOps é uma cultura</p>\n<p>CI -&gt; Pratica adotada para executar testes de integração e build da aplicação e enviada para alguma plataforma de armazenamento de artefatos.</p>\n<p>Quando o fonte chega no repositório, o CI deve validar se aquele código esta saudável e estável para a release.</p>\n<p>Continuous Delivery -&gt; Tudo e criado testado e preparado automaticamente para a liberação em produção</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "devops"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/programacao-de-baixo-nivel.html",
      "url": "https://blog.marcelomaga.space/programacao-de-baixo-nivel.html",
      "title": "Programação de Baixo Nível",
      "content_html": "<p>A programação de baixo nível é uma nomenclatura utilizada para programação que nos permite uma manipulação mais macro do sistema, hardware.</p>\n<p>As linguagens comuns são:\nC\nC++\n<a href=\"https://www.rust-lang.org/\">Rust</a>\nZig</p>\n<p>Essas linguagens nos permite um controle de alguns conceitos importantes, como threads, memoria e afins.</p>\n<p>Aqui os Fundamentos de programação são extremamente importantes!!!</p>\n<p>Sistemas embarcados\nSistemas Críticos</p>\n<h3 id=\"arquitetura-e-organização-de-computadores\">Arquitetura e Organização de Computadores<a href=\"#arquitetura-e-organização-de-computadores\" aria-label=\"Link to heading 'Arquitetura e Organização de Computadores'\" data-heading-content=\"Arquitetura e Organização de Computadores\" class=\"anchor\"></a></h3>\n<p>Arquitetura de Von Neumann</p>\n<h3 id=\"como-praticar\">Como Praticar<a href=\"#como-praticar\" aria-label=\"Link to heading 'Como Praticar'\" data-heading-content=\"Como Praticar\" class=\"anchor\"></a></h3>\n<p>Criar um Sistema Operacional, <a href=\"https://wiki.inf.ufpr.br/maziero/doku.php?id=start\">Professor Maziero, como criar SO</a>\nProgramar um driver para Arduino</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/estrutura-de-dados.html",
      "url": "https://blog.marcelomaga.space/estrutura-de-dados.html",
      "title": "Estrutura de dados",
      "content_html": "<p>Playlist para estudar</p>\n<p><a href=\"https://www.youtube.com/watch?v=y0B-vQI6Tiw&amp;list=PLxI8Can9yAHf8k8LrUePyj0y3lLpigGcl&amp;index=28&amp;ab_channel=UNIVESP\">UNIVESP</a></p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "fundamentos"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/paradigmas-de-programacao.html",
      "url": "https://blog.marcelomaga.space/paradigmas-de-programacao.html",
      "title": "Paradigmas de Programação",
      "content_html": "<p>Programação Orientada a Objetos\nProgramação Funcional\nProgramação Procedural</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "fundamentos"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/arquitetura-hexagonal.html",
      "url": "https://blog.marcelomaga.space/arquitetura-hexagonal.html",
      "title": "Arquitetura Hexagonal",
      "content_html": "<p>Um padrão de arquitetura que permite desacoplar a aplicação do ambiente, através do conceito de Portas e Adaptadores. E sua principal utilidade é solucionar o problema de Acoplamento das aplicações modernas, através do Design Pattern de Inversão de Dependência</p>\n<h2 id=\"objetivos\">Objetivos<a href=\"#objetivos\" aria-label=\"Link to heading 'Objetivos'\" data-heading-content=\"Objetivos\" class=\"anchor\"></a></h2>\n<p>Organizar o código em camadas, tal qual um cebola, cada camada tem sua responsabilidade.</p>\n<h2 id=\"camadas\">Camadas<a href=\"#camadas\" aria-label=\"Link to heading 'Camadas'\" data-heading-content=\"Camadas\" class=\"anchor\"></a></h2>\n<p>cada camada é completamente autocontida e isolada do mundo externo e se comunica com outras camadas a partir do conceito de porta e adaptadores.</p>\n<p>A ideia é criar portas de entrada, que são definidas por interfaces genéricas que precisam ser implementadas por adaptadores.</p>\n<h2 id=\"exemplo\">Exemplo<a href=\"#exemplo\" aria-label=\"Link to heading 'Exemplo'\" data-heading-content=\"Exemplo\" class=\"anchor\"></a></h2>\n<p>O carregador é um componente que precisa se adaptar o plug de entrada da tomada, que é a Regra de Negocio (Domínio).</p>\n<p>Um carregador brasileiro, implementa a tomada brasileira, mas caso preciso utilizar em uma tomara europeia, será necessário um adaptador</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "arquitetura-de-software"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/arquitetura-limpa.html",
      "url": "https://blog.marcelomaga.space/arquitetura-limpa.html",
      "title": "Arquitetura Limpa",
      "content_html": "<p>A Arquitetura Limpa (Clean Architecture) é um padrão proposto por Robert Cecil Martin com o intuito de promover o <a href=\"solid.html\" data-wikilink=\"true\">SOLID</a>, reusabilidade de código e testabilidade.\nPode se encaixar nas Arquiteturas em Camadas.\n<figure><img src=\"midia/arquitetura-limpa-novo.svg\" alt=\"arquitetura-limpa-novo.svg\" /></figure></p>\n<h1 id=\"camadas\">Camadas<a href=\"#camadas\" aria-label=\"Link to heading 'Camadas'\" data-heading-content=\"Camadas\" class=\"anchor\"></a></h1>\n<p>Como dito anteriormente, pode ser considerada uma arquitetura em camadas, por cada coisa em sua composição ser separado e ter um responsabilidade única.</p>\n<h2 id=\"entidades-e-casos-de-usos\">Entidades e Casos de Usos<a href=\"#entidades-e-casos-de-usos\" aria-label=\"Link to heading 'Entidades e Casos de Usos'\" data-heading-content=\"Entidades e Casos de Usos\" class=\"anchor\"></a></h2>\n<p>Ao centro temos a camada de <strong>Entidades</strong>, responsável por conter toda a regra de negocio, são classes comuns entre sistema de varias empresas. com regras de negócio genéricas para aquela classe.</p>\n<p>Já os <strong>Casos de Uso</strong> definem regras de negocio especificas para o negocio de um sistema.</p>\n<h2 id=\"adaptadores\">Adaptadores<a href=\"#adaptadores\" aria-label=\"Link to heading 'Adaptadores'\" data-heading-content=\"Adaptadores\" class=\"anchor\"></a></h2>\n<p>Os adaptadores tem a responsabilidade de mediar a comunicação entre as camada externas com as camada internas. por exemplo, uma API REST, recebe a solicitação, converte para os objetos para o body desejado, e ao contrario, do body da persistência para JSON para a API responder.</p>\n<h2 id=\"frameworks-externos\">Frameworks Externos<a href=\"#frameworks-externos\" aria-label=\"Link to heading 'Frameworks Externos'\" data-heading-content=\"Frameworks Externos\" class=\"anchor\"></a></h2>\n<p>Essa camada é responsável por conter todos as classes de bibliotecas, frameworks e persistência em bancos de dados, provedores de pagamento, envio de notificação.</p>\n<blockquote>\n<p>Todos os detalhes ficam na camada de frameworks e drivers. A Web é um detalhe. O banco de dados é um detalhe. Mantemos essas tecnologias na camada mais externa porque é onde elas podem fazer menos mal.</p>\n</blockquote>\n<h2 id=\"regra-de-dependência\">Regra de Dependência<a href=\"#regra-de-dependência\" aria-label=\"Link to heading 'Regra de Dependência'\" data-heading-content=\"Regra de Dependência\" class=\"anchor\"></a></h2>\n<p>Classes X não devem conhecer nenhuma classe da camada Y, Uncle Bob diz:</p>\n<blockquote>\n<p>O nome de um elemento declarado em uma camada externa não deve ser mencionado pelo código de uma camada interna. Isso inclui funções, classes, variáveis e qualquer outro elemento de código.</p>\n</blockquote>\n<p>Dessa maneira as camadas internas são menos modificadas.</p>\n<p>A Regra de Dependência garante que Entidades e Casos de Usos são classes limpas e análoga a tecnologia (Framework) e serviços externos.</p>\n<h2 id=\"invertendo-o-fluxo-de-controle\">Invertendo o Fluxo de Controle<a href=\"#invertendo-o-fluxo-de-controle\" aria-label=\"Link to heading 'Invertendo o Fluxo de Controle'\" data-heading-content=\"Invertendo o Fluxo de Controle\" class=\"anchor\"></a></h2>\n<p>Uma camada externa Y pode criar um objeto da camada X e utilizar os métodos\nEm alguns casos é possível uma classe mais interna utilizar classes de uma camada mais externa</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "midia/arquitetura-limpa-novo.svg",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "arquitetura-de-software"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/arquitetura-de-software.html",
      "url": "https://blog.marcelomaga.space/arquitetura-de-software.html",
      "title": "Arquitetura de Software",
      "content_html": "<p>Micro-serviços\nArquitetura Orientada a Eventos\nArquiteturas Monolíticas\nMensageria\nTécnicas de Cache\nArquitetura Hexagonal</p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "arquitetura-de-software"
      ],
      "language": "pt-BR"
    },
    {
      "id": "https://blog.marcelomaga.space/fundamentos.html",
      "url": "https://blog.marcelomaga.space/fundamentos.html",
      "title": "Fundamentos",
      "content_html": "<p>Os fundamentos são algo extremamente necessários e importante.</p>\n<p>Estrutura de dados\nAlgoritmos</p>\n<p>Referencias para estudos:</p>\n<p><a href=\"https://www.amazon.com.br/Entendendo-Algoritmos-Ilustrado-Programadores-Curiosos/dp/8575225634\">Entendendo Algoritimos</a></p>\n",
      "summary": "",
      "date_published": "2026-04-25T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Marcelo Magalhães",
          "url": "https://github.com/Marcelo-maga",
          "avatar": "https://github.com/Marcelo-maga.png"
        }
      ],
      "tags": [
        "fundamentos"
      ],
      "language": "pt-BR"
    }
  ]
}