<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FoxTechWorld</title><link>https://foxtechworld.github.io/</link><description>Tentando tornar o mundo menos pop e mais nérdico</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Sat, 16 May 2026 19:37:46 GMT</lastBuildDate><atom:link href="https://foxtechworld.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Daily: Um pouco de mudança ocorreu e agora?</title><link>https://foxtechworld.github.io/daily-um-pouco-de-mudanca-ocorreu-e-agora/</link><guid isPermaLink="true">https://foxtechworld.github.io/daily-um-pouco-de-mudanca-ocorreu-e-agora/</guid><pubDate>Sat, 16 May 2026 21:22:14 GMT</pubDate><description>&lt;p&gt;Nada como uma boa mudança de ritmo para enxergarmos o quando mudamos no dia a dia.&lt;/p&gt;
&lt;p&gt;Bom, em primeiro lugar consegui meu primeiro emprego de carteira assinada, nada muito glamouroso.&lt;/p&gt;
&lt;p&gt;Fui contratado para ser auxiliar de desossa (na área de controle de estoque) numa empresa pequena da região.&lt;/p&gt;
&lt;p&gt;É pouco até você perceber que eles lidam em torno de 700 porcos por dia em média.&lt;/p&gt;
&lt;p&gt;Mas num quesito geral é um emprego digno e muito mais interessante por ser bastante manual.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Nada como uma boa mudança de ritmo para enxergarmos o quando mudamos no dia a dia.</p>
<p>Bom, em primeiro lugar consegui meu primeiro emprego de carteira assinada, nada muito glamouroso.</p>
<p>Fui contratado para ser auxiliar de desossa (na área de controle de estoque) numa empresa pequena da região.</p>
<p>É pouco até você perceber que eles lidam em torno de 700 porcos por dia em média.</p>
<p>Mas num quesito geral é um emprego digno e muito mais interessante por ser bastante manual.</p>
<blockquote>
<p>Particular meu, mas eu gosto de ter serviço braçal porque faz minha mente pensar ou parar de pensar um pouco.</p>
</blockquote>
<p>Não que eu larguei a programação e os estudos de lado, na real meu obisidian e meu appflowy (um substituto opensource do Notion) tá mais lotado de roadmap&rsquo;s de coisas aleatórias e sobre programação.</p>
<p>Fora também que a empresa possui banco de talentos <strong>inclusive para a área de TI</strong> então vale a pena ficar nela.</p>
<p>Na real, voltando para o obsidian mudei totalmente o estilo do vault para algo no estilo dump direto do meu cerebro.</p>
<pre tabindex="0"><code>.
├── Assets
│   ├── CheckList
│   │   ├── Checklist de viagem de carro.jpg
│   │   ├── Checklist de viagem.jpg
│   │   └── Kit de Primeiros Socorros.jpg
│   ├── Design
│   │   ├── Linguagem visual Dark Mode FoxBSD.png
│   │   └── Linguagem visual FoxBSD.png
│   ├── Learning
│   │   ├── Etiqueta de Roupas.jpg
│   │   └── Pendurar ou Dobrar.jpg
│   └── Specifications
│       └── OpenStep Specification.pdf
├── Learning
│   └── Investimentos
│       ├── Fundamentos de Investimentos.md
│       └── Organização Financeira.md
├── Notes
│   └── Stack de Programação.md
├── Projects
│   ├── FoxBSD
│   │   └── What IS - FoxBSD.md
│   ├── Jarvis
│   │   └── What IS - Jarvis.md
│   ├── KitsuneBot
│   │   └── What IS - KitsuneBot.md
│   └── NeoStep
│       └── What IS - NeoStep.md
└── Studying
    ├── Knowledge
    │   ├── Checklists.md
    │   └── Manuais.md
    ├── Limpeza
    │   ├── Limpeza de Roupa Branca.md
    │   └── Limpeza de Tênis Branco.md
    └── Receitas
        ├── Caldos
        │   └── Caldo de Ossos.md
        ├── Cortes
        │   └── Compras de Carnes.md
        ├── Erros e Truques de Cozinha
        │   ├── Erros e truques de Cozinha.md
        │   └── Truque da tampa - Quando usar e Quando não usar.md
        ├── Guia
        │   ├── Guia Prático dos  Pimentões.md
        │   ├── Guia Prático dos tipos de panela.md
        │   └── Guia sobre quando adicionar alimentos à água.md
        ├── Marinar
        │   ├── Formas de marinar carne bovina.md
        │   ├── Formas de marinar frango marinado.md
        │   └── Formas de temperar manteiga.md
        └── Molhos
            └── Molhos Clássicos para Massas.md

24 directories, 30 files
</code></pre><p>Agora com o tempo dá para continuar com alguns projetos e fazer uns entretenimento diferentes.</p>
<p>Bom, essa é uma pequena atualização do dia a dia por agora, mas tá bacana</p>
]]></content:encoded><category>Daily</category><category>Trabalho</category><category>Pensamentos</category><category>Rumo</category></item><item><title>Opinião: A Reviravolta do FOSS vem com a burrice da política</title><link>https://foxtechworld.github.io/a-reviravolta-do-foss-vem-com-a-burrice-da-politica/</link><guid isPermaLink="true">https://foxtechworld.github.io/a-reviravolta-do-foss-vem-com-a-burrice-da-politica/</guid><pubDate>Thu, 05 Mar 2026 06:19:04 GMT</pubDate><description>&lt;h1 id="contextualizando"&gt;Contextualizando&lt;/h1&gt;
&lt;p&gt;Galera, se você tem acompanhado as notícias recentes, a situação não está nada tranquila. Resumindo: estamos indo para a merda rápido.&lt;/p&gt;
&lt;p&gt;O Brasil decidiu que todos os sistemas operacionais e lojas de aplicativos devem implementar algum tipo de verificação de idade. Para piorar, a Califórnia seguiu a mesma linha.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Brazil Law: All OS&amp;#39;s Have 13 Days to Add Age Verification&lt;br&gt;&lt;br&gt;A new law, in Brazil, requires age verification on all Operating Systems (including Linux &amp;amp; Windows) by March 17th. Plus a rundown on similar laws in California, Colorado, and New York. &lt;a href="https://t.co/2Ik1hNEDf8"&gt;pic.twitter.com/2Ik1hNEDf8&lt;/a&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="contextualizando">Contextualizando</h1>
<p>Galera, se você tem acompanhado as notícias recentes, a situação não está nada tranquila. Resumindo: estamos indo para a merda rápido.</p>
<p>O Brasil decidiu que todos os sistemas operacionais e lojas de aplicativos devem implementar algum tipo de verificação de idade. Para piorar, a Califórnia seguiu a mesma linha.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Brazil Law: All OS&#39;s Have 13 Days to Add Age Verification<br><br>A new law, in Brazil, requires age verification on all Operating Systems (including Linux &amp; Windows) by March 17th. Plus a rundown on similar laws in California, Colorado, and New York. <a href="https://t.co/2Ik1hNEDf8">pic.twitter.com/2Ik1hNEDf8</a></p>&mdash; The Lunduke Journal (@LundukeJournal) <a href="https://twitter.com/LundukeJournal/status/2029266433318809776?ref_src=twsrc%5Etfw">March 4, 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>Segundo o Lunduke Journal
, algumas empresas, como a Apple, optaram por não implementar a medida, com DHH sendo publicamente contra.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">“Omarchy has no plans to do anything in response to this retarded California law.”<br><br>That is what <a href="https://twitter.com/dhh?ref_src=twsrc%5Etfw">@DHH</a> told me when I asked him if <a href="https://twitter.com/OmarchyLinux?ref_src=twsrc%5Etfw">@OmarchyLinux</a> plans to implement age verification functionality to comply with the new California and Brazilian laws. <a href="https://t.co/2bkaDwwNU0">pic.twitter.com/2bkaDwwNU0</a></p>&mdash; The Lunduke Journal (@LundukeJournal) <a href="https://twitter.com/LundukeJournal/status/2029226614068801768?ref_src=twsrc%5Etfw">March 4, 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>Enquanto isso, distribuições como Fedora, Mint, Ubuntu e ElementaryOS já confirmaram que vão seguir a lei brasileira/californiana.</p>
<p>E para ilustrar o que isso significa na prática, o compatriota @Jocadbz escreveu o post <a href="https://jocadbz.xyz/posts/leis_de_verificacao_de_idade/">O Grande Irmão veste roupas de babá</a>
, onde detalha o impacto dessa vigilância:</p>
<blockquote>
<p>Quando um sistema operacional compartilha um “sinal criptografado”, políticos afirmam que isso é uma vitória para a privacidade, porque o aplicativo específico não vê seu documento físico. Mas, ao vincular a faixa etária verificada a um ID de hardware permanente ou a uma conta central do Google/Apple, encerramos a era do perfil “descartável”.</p>
<p>Cada aplicativo que você baixa – de fóruns de nicho a rastreadores de fitness – recebe o mesmo token verificado do seu sistema operacional. Sua identidade entre plataformas se torna unificada: você deixa de ser um usuário anônimo e se torna “Usuário nº 88291, homem, 24 anos, verificado via hardware”.</p>
<p>A Lei 15.211 do Brasil leva isso um passo além. “Garantia razoável” é apenas um eufemismo jurídico para vigilância biométrica. Plataformas estão migrando para “Provedores de Identidade” de terceiros. Em breve, para assistir a um vídeo ou entrar em um chat, será necessário escanear o rosto ou enviar documentos nacionais. Isso cria enormes bancos de dados centralizados, vulneráveis a ataques. Estamos sendo forçados a fornecer dados biológicos para atravessar uma corda de veludo digital, tudo em nome de “proteger as crianças”.</p>
</blockquote>
<h2 id="o-impacto-para-nós-e-para-o-foss">O impacto para nós e para o FOSS</h2>
<p>Para os usuários, isso significa mudanças profundas no dia a dia da internet. Mas existe uma alternativa que muitas vezes é ignorada: o FOSS (Free/Open Source Software), também chamado de Software Livre.</p>
<h2 id="o-que-é-foss">O que é FOSS?</h2>
<p>O Software Livre é baseado em quatro liberdades essenciais:</p>
<ol start="0">
<li>Executar o software para qualquer propósito.</li>
<li>Estudar como o software funciona.</li>
<li>Redistribuir cópias do software.</li>
<li>Aperfeiçoar o software e distribuir melhorias.</li>
</ol>
<p>Essas liberdades nos dão a base para reduzir a dependência da internet e de sistemas centralizados. Ou seja, podemos começar a nos proteger sem depender de Google, Apple ou quaisquer leis invasivas.</p>
<h2 id="como-agir-agora">Como agir agora</h2>
<ul>
<li>
<p>Se você está preocupado com privacidade, procure softwares que:</p>
</li>
<li>
<p>Não dependam da internet para funcionar.</p>
</li>
<li>
<p>Não sigam as leis de verificação de idade.</p>
</li>
<li>
<p>Possuam instalação e distribuição offline, por meios físicos (pendrives, DVDs, etc.).</p>
</li>
</ul>
<h2 id="exemplos-práticos">Exemplos práticos:</h2>
<ul>
<li>
<p>Linux-Libre ou BSD – distribuições que priorizam liberdade e privacidade.</p>
</li>
<li>
<p>Linux offline – muitas distros Linux podem ser configuradas para funcionar sem conexão, embora alguns pacotes adicionais precisem de internet.</p>
</li>
</ul>
<p>Evite qualquer software que já tenha concordado com a lei de verificação de idade ou que exija autenticação online obrigatória. A ideia é recuperar autonomia digital e manter o anonimato mínimo possível.</p>
<h1 id="conclusão">Conclusão</h1>
<p>O movimento de verificação de idade global é só o começo de um controle digital que afeta todos os usuários. A boa notícia é que o FOSS oferece meios concretos de resistência.</p>
<p>Não é sobre conspiracionismo, é sobre recuperar liberdade e autonomia. E, se você ainda não pensou nisso, o momento de agir é agora: escolha software livre, offline, e proteja sua identidade digital antes que vire um número em algum banco de dados central.</p>
]]></content:encoded><category>Free Software</category><category>FOSS</category><category>Imediatismo</category><category>Oportunidade</category><category>Censura</category><category>Lei Felca</category></item><item><title>Estudo: Organizando meu estudos com o obsidian</title><link>https://foxtechworld.github.io/organizando-meu-estudos-com-o-obsidian/</link><guid isPermaLink="true">https://foxtechworld.github.io/organizando-meu-estudos-com-o-obsidian/</guid><pubDate>Sat, 14 Feb 2026 05:29:39 GMT</pubDate><description>&lt;h1 id="e-como-vou-estudar"&gt;E como vou estudar?&lt;/h1&gt;
&lt;p&gt;Pois é, para alguem que falou que ia demorar fazer mais posts este ano, cá estou eu de novo.&lt;/p&gt;
&lt;p&gt;Dessa vez, em complemento o meu post anterior &lt;a href="https://foxtechworld.github.io/um-jornada-de-reforco-planos-para-2026/"&gt;Um jornada de reforço, planos para 2026&lt;/a&gt; onde eu prometi que o ano seria mais lento. Mostrando como estou configurando o meu obsidian para estudar.&lt;/p&gt;
&lt;p&gt;Antes de mais nada, estudo é uma mistura de metodo e disciplina para memorizar e memorizar o entendimento da memória e os resultados de certas ações, formulas ou ocorrências.&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="e-como-vou-estudar">E como vou estudar?</h1>
<p>Pois é, para alguem que falou que ia demorar fazer mais posts este ano, cá estou eu de novo.</p>
<p>Dessa vez, em complemento o meu post anterior <a href="https://foxtechworld.github.io/um-jornada-de-reforco-planos-para-2026/">Um jornada de reforço, planos para 2026</a> onde eu prometi que o ano seria mais lento. Mostrando como estou configurando o meu obsidian para estudar.</p>
<p>Antes de mais nada, estudo é uma mistura de metodo e disciplina para memorizar e memorizar o entendimento da memória e os resultados de certas ações, formulas ou ocorrências.</p>
<p>Isso claro, na forma mais bruta do que é estudar. Então quando seu professor te criticar por memórizar a formula só diga isso:</p>
<p>&ldquo;Se eu não memorizar, como vou entender e por consequência aprender&rdquo;.</p>
<p>Enfim, em muitos casos, existem diversas tecnicas e formas de se aprender algo.</p>
<h2 id="meu-obsidian">Meu Obsidian</h2>
<p>Eu particularmente decidi adotar o zettelkasten que é perfeito para se combinar com o obsidian.</p>
<p><img src="https://i.pinimg.com/originals/f0/38/d1/f038d1a12df70cb5c87842bf4737098d.png" alt="Obsidian   Sharpen Your Thinking with the Best Note Taking App"></p>
<p>Mas obviamente não de forma crua como está, então eu adicionei alguns plugins como:</p>
<ul>
<li>Advanced Canvas</li>
<li>Dataview</li>
<li>Iconize</li>
<li>Tag Wrangler</li>
<li>Templater</li>
<li>Escalidraw</li>
<li>Omnisearch</li>
</ul>
<p>Coisinhas simples que vão cobrir 80% do que você precisa estudar fora que assim você ligar conteudos de forma muito mais interessante do que antes.</p>
<p>E adicionei também alguns diretórios:</p>
<p>00 - Assets</p>
<p>01 - Referencias</p>
<p>02 - Permanentes</p>
<p>03 - Map of Contents</p>
<p>xx - Escalidraw</p>
<p>xx é usado para representar sem valor númerico aqui</p>
<p>Mas, a coisa mais importante disso tudo está sendo encontrada em Assets/_Templates</p>
<p>Que sim, são os templates do projeto</p>
<ul>
<li>Nota MOC -&gt; Lê se Nota Mapa de Conteúdo</li>
<li>Nota Permanente</li>
<li>Nota Referencia</li>
</ul>
<p>Aliás, dica importante</p>
<blockquote>
<p>Dentro do seu obsidian, vá nas configurações do templater e em template folders location coloque como: 00 - Assets/_Templates</p>
<p>Isso evita que o mesmo sugira outras notas como seu templates de notas.</p>
</blockquote>
<p>Bom, a ideia é simples:</p>
<p>Tudo que eu ler e for útil para algo vai virar uma <code>Referência</code></p>
<blockquote>
<p>Depois que a referência for feita, ela não pode mais ser editada, somente para alguma revisão ou em nova versão v2.</p>
</blockquote>
<p>Lemos a refência e transformamos os insights em versões permanentes cuja ideia é ter:</p>
<ul>
<li>Argumento Central</li>
<li>Resumo do que ocorreu</li>
<li>Conexões com outras notas</li>
<li>Link para as referencias originais</li>
</ul>
<blockquote>
<p>Pode usar o Dataview para checar se já existe algum permanente deste tipo antes de criar duplicatas</p>
</blockquote>
<p>Por fim atualizamos o MOC da área correspondente listando ou linkando todos os permanentes de suas respectivas areas ou subáreas, alias adicione quantas quiser.</p>
<p>Se houver alguma dúvida ou questão em aberto você pode colocar em <strong>questões em aberto</strong></p>
<p>Agora, o mais importante é o processo de revisão, sempre releia as permanentes antigas e atualize o MOC se surgirem novas conexões.</p>
<h3 id="templates">Templates</h3>
<h4 id="nota-referencia">Nota Referencia</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>tipo: referencia
</span></span><span style="display:flex;"><span>area:
</span></span><span style="display:flex;"><span>fonte:
</span></span><span style="display:flex;"><span>autor:
</span></span><span style="display:flex;"><span>link:
</span></span><span style="display:flex;"><span>created: &lt;% tp.date.now(&#34;YYYY-MM-DD&#34;) %&gt;
</span></span><span style="display:flex;"><span>status:
</span></span><span style="display:flex;"><span>tags:
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">-</span> nota-referencia
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># &lt;% tp.system.prompt() %&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Resumo bruto
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Pontos Importantes
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Ideias Provocadas
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Possíveis Permanentes
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-
</span></span></code></pre></div><p>Yeah, bem simples para um template, o uso do <code>&lt;%tp.system.prompt%&gt;</code> permite que você crie um titulo baseado diretamente no prompt que o usuário colocar e dentro de uma referencia onde podemos ter diversas referencias para um único permanente.</p>
<p>Além disso, dentro do template temos diversas própriedades como:</p>
<p><code>area</code>-&gt; Categoria do conteúdo</p>
<p><code>fonte/autor/link</code> -&gt; informações da fonte original</p>
<p><code>resumo bruto</code> -&gt; sintese direta da fonte</p>
<p><code>pontos importantes</code> -&gt; destaque de ideias que podem se tornar permanentes</p>
<p><code>ideias provocadas</code> -&gt; insights iniciais que surgem ao ler a fonte</p>
<p><code>Possiveis Permanentes</code> -&gt; conceitos que poderão virar nota consolidada.</p>
<h4 id="nota-permanente">Nota Permanente</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>tipo: permanente
</span></span><span style="display:flex;"><span>area:
</span></span><span style="display:flex;"><span>status: rascunho
</span></span><span style="display:flex;"><span>origin:
</span></span><span style="display:flex;"><span>created: &lt;% tp.date.now(&#34;YYYY-MM-DD&#34;) %&gt;
</span></span><span style="display:flex;"><span>updated:
</span></span><span style="display:flex;"><span>conexões:
</span></span><span style="display:flex;"><span>referencias:
</span></span><span style="display:flex;"><span>tags:
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">-</span> nota-permanente
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># #Title
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Explique a ideia com suas palavras.
</span></span><span style="display:flex;"><span>Seja específico
</span></span><span style="display:flex;"><span>Evite copiar a fonte.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Argumento Central
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><p>Diferente da nota referencias, aqui pegamos o titulo literal do arquivo usado <code>#Title</code> para gerar o título do modelo permanente.</p>
<p>Junto com algums campos como:</p>
<p><code>area</code> -&gt; precisa ser a mesma da referência relacionada</p>
<p><code>origin</code> -&gt; referência de origem</p>
<p><code>argumento central</code> -&gt; explicação própria do conceito</p>
<p><code>conexões</code> -&gt; links para outras permanentes relacionadas</p>
<p><code>referencia</code> -&gt; cite refências usados</p>
<p><code>status</code> -&gt; pode ser rascunho, ativo e reevisado</p>
<blockquote>
<p>Permanentes são a base do conhecimento consolidado, revisável e linkado pelo MOC</p>
</blockquote>
<h4 id="nota-moc">Nota MOC</h4>
<pre tabindex="0"><code>---
tags:
tipo: moc
area:
status: ativo
created: &lt;% tp.date.now(&#34;YYYY-MM-DD&#34;) %&gt;
---

# #Title

## Escopo

Descreva claramente o que este Map of Content cobre.

---

## Conceitos Fundamentais

```dataview
table area, status
from &#34;02 - Permanentes&#34;
where area = this.area
```dataview
---
## Subáreas

- ***

## Referências Base

```dataview
table fonte, autor
from &#34;01 - Referencias&#34;
where area = this.area
```dataview
---

## Questões em aberto

-
</code></pre><blockquote>
<p>Eu acabei quebrando o dataview no exemplo acima para garantir que ficasse tudo em um único codeblock, assim caso copiem diretamente basta trocar ```dataview pela sua versão sem dataview usando regex.</p>
</blockquote>
<p>A nota MOC tem como objetivo principal agir como indice e dar umma visão geral da área de estudo, aqui também usamos <code>#Title</code> para gerar o título do modelo.</p>
<p>Conceitualmente a tarefa do moc é puxar diretamente do dataview lista de todos os permanentes relacionados a mesma área e organalizos - los em relação a área e a subárea presente em clusters ou topicos.</p>
<p>Ainda há o questões em aberto sobre duvidas em geral de acordo com o temas que você pode realizar, literalmente um TODO do que falta estudar, e acredito há muito do que quero estudar</p>
<p><img src="images/roadmap_sh.png" alt="Foto do meu roadmap.sh pessoal"></p>
<h2 id="fluxo-e-isso-é-importante">Fluxo e isso é importante</h2>
<ol>
<li>Encontrei algo novo: Crio <code>Referencia</code></li>
<li>Processo a informação: transformo em <code>Permanente</code> com minhas palavras, citando origem</li>
<li>Organizo no MOC: Atualizo Conceitos Fundamentais, Subáreas e Questões em aberto.</li>
<li>Prático: Esse é o mais importante, tudo que existe é uma prática e não adianta nada se você não práticar.</li>
<li>Revisar periodicamente: mantenha permanentes e MOC atualizado adicionando novas conexões</li>
</ol>
<p>Bem este é o meu Obsidian de Estudo, chamado carinhosamente de <strong><em>Mind Order</em></strong>, espero que tenham gostado fui.</p>
]]></content:encoded><category>Obsidian</category><category>Estudos</category><category>Seja um estudante melhor</category><category>Seja um programador melhor</category><category>Zettelkasten</category></item><item><title>Estudo: Um jornada de reforço, planos para 2026</title><link>https://foxtechworld.github.io/um-jornada-de-reforco-planos-para-2026/</link><guid isPermaLink="true">https://foxtechworld.github.io/um-jornada-de-reforco-planos-para-2026/</guid><pubDate>Fri, 13 Feb 2026 03:00:22 GMT</pubDate><description>&lt;h1 id="o-tempo-passa"&gt;O tempo passa&lt;/h1&gt;
&lt;p&gt;Cá estamos nos em feveireiro e eu realmente não consigo acreditar que faz pouco mais de 6 anos que me tornei alguém ativo na WWW.&lt;/p&gt;
&lt;p&gt;Não que eu seja famoso, ativo no sentido de estar presente em diversas plataformas online, mantendo esse blog, conversando no discord, perdendo tempo no vaporhole (que é uma rede social brasileira estilo tilde.club, algo como um pc Unix compartilhado entre diversas pessoas via SSH), perdendo tempo vendo vídeos no Youtube, perdendo tempo no X, perdendo tempo no Instagram.&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="o-tempo-passa">O tempo passa</h1>
<p>Cá estamos nos em feveireiro e eu realmente não consigo acreditar que faz pouco mais de 6 anos que me tornei alguém ativo na WWW.</p>
<p>Não que eu seja famoso, ativo no sentido de estar presente em diversas plataformas online, mantendo esse blog, conversando no discord, perdendo tempo no vaporhole (que é uma rede social brasileira estilo tilde.club, algo como um pc Unix compartilhado entre diversas pessoas via SSH), perdendo tempo vendo vídeos no Youtube, perdendo tempo no X, perdendo tempo no Instagram.</p>
<p>Enfim, nada de muito revolucionário até ai.</p>
<p>Mas sinceramente desde a criação do ChatGPT, ClaudeAI, Gemini, Grok, DeepSeek e outros modelos. Eu sinto que venho cada vez menos programando ou exercitando meu intelecto como programador.</p>
<p>Não é como se eu cogitasse parar de usar, o chatGPT conversa muito bem comigo e eu obrigo ele a comunicar da forma que eu comunico melhor</p>
<blockquote>
<p>Estilo e Tom básico: Franco
Caracteristicas:</p>
<ul>
<li>Acolhedor: Menos</li>
<li>Entusiasmado: Mais</li>
<li>Lista e Cabeçalhos: Mais</li>
<li>Emoji: Mias
Instrução personalizada:
Seja sarcastico mas mantendo a educação, discorde argumentando e questione minha lógica sempre que possível.</li>
</ul>
<p>Não tenha floreios e aja com um homem adulto de 18 anos podendo explicitamente conversar sem preocupações como uma pessoa adulta faria com outra pessoa adulta.</p>
<p>Memória:
O usuário prefere que eu nunca refaça as respostas que ele já escreveu e quer que isso seja respeitado permanentemente.</p>
</blockquote>
<p>Então a ideia para esse ano é focar em reestudar algoritmos, estuturas de dados e ferramentas.</p>
<p>A segunda parte é começar com alguns projetos avulsos de prática.</p>
<p>Para quem não sabe &ldquo;Yet Another Recretional Programming Session - Tsoding&rdquo;</p>
<p>Provavelmente esse ano vai ser lento, mas os próximos posts vou tentar focar em coisas out-of-the-box que vocês pouco ouvem falar como por exemplo: Programação Dinâmica e Programação Matemática fora algumas coisas de arquitetura e alguns padrões que acho que poucos ouvem falar.</p>
<p>A terceira parte é começar na criação de conteúdo.</p>
<p>A quarta parte e a mais importante é começar a sair do conforto e começar a fazer mais atividades físicas.</p>
<p>23 anos é muito tempo para ser feliz, hora de virar adulto.</p>
<p>Enfim, um bom ano novo para todos</p>
<p><img src="https://i.pinimg.com/originals/0a/59/de/0a59de99e96eb0de3fda253e85418214.jpg" alt="Happy New Year"></p>
]]></content:encoded><category>2026</category><category>Planos</category><category>Projetos</category><category>Sonhos</category></item><item><title>Otaku: Power Scaling em Jujutsu Kaisen é quebrado, lide com isso</title><link>https://foxtechworld.github.io/otaku-power-scaling-em-jujutsu-kaisen-e-quebrado-lide-com-isso/</link><guid isPermaLink="true">https://foxtechworld.github.io/otaku-power-scaling-em-jujutsu-kaisen-e-quebrado-lide-com-isso/</guid><pubDate>Tue, 03 Feb 2026 22:26:17 GMT</pubDate><description>&lt;h1 id="o-que-é-jujutsu-kaisen"&gt;O que é Jujutsu Kaisen&lt;/h1&gt;
&lt;p&gt;Jujutsu Kaisen é uma série shounen onde acompanhamos a história de Yuji Itadori que tem como principal objetivo consumir e eliminar todos os dedos de Sukuna.&lt;/p&gt;
&lt;p&gt;Para isso, ele tem que lidar com maldições, feiticeiros e usuários de maldições usando como poder a &amp;ldquo;Energia Amaldiçoada&amp;rdquo; e as &amp;ldquo;Técnicas Amaldiçoadas&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Dentre as &amp;ldquo;Técnicas Amaldiçoadas&amp;rdquo; existem alguns tipos:&lt;/p&gt;
&lt;p&gt;As que todos conseguem usar como o:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;domínio simples&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;&amp;ldquo;black flash&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;&amp;ldquo;punho divergente&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;hellip; entre outras&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.pinimg.com/474x/b1/07/6f/b1076f2f77316c618ea0ef32db131cc5.jpg" alt="Black Flash"&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="o-que-é-jujutsu-kaisen">O que é Jujutsu Kaisen</h1>
<p>Jujutsu Kaisen é uma série shounen onde acompanhamos a história de Yuji Itadori que tem como principal objetivo consumir e eliminar todos os dedos de Sukuna.</p>
<p>Para isso, ele tem que lidar com maldições, feiticeiros e usuários de maldições usando como poder a &ldquo;Energia Amaldiçoada&rdquo; e as &ldquo;Técnicas Amaldiçoadas&rdquo;.</p>
<p>Dentre as &ldquo;Técnicas Amaldiçoadas&rdquo; existem alguns tipos:</p>
<p>As que todos conseguem usar como o:</p>
<ul>
<li>&ldquo;domínio simples&rdquo;,</li>
<li>&ldquo;black flash&rdquo;,</li>
<li>&ldquo;punho divergente&rdquo;</li>
<li>&hellip; entre outras</li>
</ul>
<p><img src="https://i.pinimg.com/474x/b1/07/6f/b1076f2f77316c618ea0ef32db131cc5.jpg" alt="Black Flash"></p>
<p>As que surgem de forma inata com seu feiticeiro:</p>
<ul>
<li>&ldquo;Boogie Woggie&rdquo;</li>
<li>&ldquo;Santuário&rdquo;</li>
<li>&ldquo;Copy&rdquo;</li>
<li>&ldquo;Manipulação de maldições&rdquo;</li>
</ul>
<p><img src="https://i.pinimg.com/236x/9e/38/2d/9e382d8fd6bbc0b99745824ca4a90c4c.jpg" alt="Dismantle"></p>
<p>As técnicas que são passadas geneticamente entre clãs:</p>
<ul>
<li>&ldquo;Seis Olhos&rdquo;</li>
<li>&ldquo;Ilimitado&rdquo;</li>
<li>&ldquo;Dez Sombras&rdquo;</li>
</ul>
<p><img src="https://i.pinimg.com/736x/d6/86/f4/d686f42ac751b83b3b0915be0eb7babf.jpg" alt="Mahoraga"></p>
<p>E essas técnicas atuam de diversas maneiras em conceitos da realidade.</p>
<p>Então temos dois tipos de disputas em JJK, disputa de quantidade de energia e disputa entre conceitos.</p>
<h2 id="porque-isso-quebra-o-metódo-normal-de-powerscalling">Porque isso quebra o metódo normal de powerscalling</h2>
<p>Vou começar pelo <strong>Mugen</strong>, a técnica &ldquo;neutra&rdquo; do Ilimitado de Satoru Gojo.</p>
<p>O conceito dela é desacelerar infinitamente o golpe realizado adversário usando o paradoxo de Zenão.</p>
<blockquote>
<p>PS: Assuma velocidade constante para cada participante, o passo da tartaruga deve equivaler ao passo de Aquiles, nem um passo a mais nem um passo a menos. Ou seja um movimento uniforme.</p>
<p>Se Aquiles der uma vantagem inicial à tartaruga, quando ele chegar onde ela estava, ela terá avançado um pouco mais. Ao chegar nessa nova posição, ela terá avançado ainda mais. Esse ciclo se repete ao infinito, sugerindo que Aquiles nunca a ultrapassará, pois sempre haverá uma distância a percorrer.</p>
</blockquote>
<p>E isso é um problema para o mundo de powerscalling porque, se formos considerar apenas os feitos, nada vai sair da escala cidade.</p>
<p>Mas, como todos os poderes interferem na realidade, o nível deveria ser <strong>conceitual</strong> para cima.</p>
<p>Outro exemplo seria o <strong>Star Rage</strong> da Yuki que aplica uma massa virtual para cima dos golpes da mesma chegando ao ponto de colapsar em um buraco negro.</p>
<p>O fato dos feitos em jujutsu não ultrapassar nível cidade tem um proposito, por mais que os feiticeiros lutem entre si carregando conceitos, eles precisam do planeta para viver então nada vai fugir desse ponto.</p>
<p>E daí surge as &ldquo;expansões de dominio&rdquo;</p>
<p><img src="https://i.pinimg.com/736x/dc/99/7a/dc997a95db31d7e419b340a58bea3a53.jpg" alt="Expansão de Dominio: Vazio Imensurável"></p>
<p>Onde se cria um espaço metafísico a.k.a uma barreira em que você embute a máxima expressão da sua técnica e aplica um efeito garantido no seu usuário.</p>
<p>Por mais que não pareça, isso é extremamente importante no universo de Jujutsu junto com a <strong>Cortina</strong> já que a população geral não faz ideia do Jujutsu.</p>
<p>E mesmo a luta dos mais fortes ou o arco de Shibuya tiveram efeitos politicamente desagradaveis pelo ocorrido.</p>
<p>Então, podemos dizer que o efeito máximo das técnicas está em eliminar o conceito oponente e esse é seu máximo.</p>
<h2 id="e-quanto-a-quantidade-de-energia-amaldiçoada">E quanto a quantidade de energia amaldiçoada?</h2>
<p>Esse é outro ponto da disputa entre conceitos que eu comentei. Para uma técnica amaldiçoada fazer efeito ela precisa de determinada quantidade de energia amaldiçoada.</p>
<p><img src="https://i.pinimg.com/474x/3e/eb/02/3eeb02b78318a310828dd457ad5c708b.jpg?nii=t" alt="Cursed Energy Jujutsu Kaisen"></p>
<p>E dependendo do personagem e da quantidade que ele possue ela pode ter comportamentos díferentes como o Hakari e sua energia bruta, o Kashimo com sua energia eletrica &hellip;</p>
<p>Isso também garante que o conceito A seja mais forte que o conceito adversário.</p>
<p>Tanto que o Roxo 200% de Gojo na luta dos mais fortes não teve relevância pois perdeu potência indo de uma cidade a outra ficando com uma liberação de energia mais fraca que a própria liberação do Sukuna.</p>
<h2 id="então-o-problema-é">Então o problema é</h2>
<p>Em JJK você nunca vai ver estragos ou feitos maior que em nível cidade porque os personagens vivem em uma &ldquo;terra&rdquo; e são &ldquo;humanos&rdquo; o suficiente para necessidades biológicas humanas.</p>
<p>Além de ter o problema dos cívis que não são correlacionados ao mundo e obviamente a necessidade do mundo.</p>
<p>Fora isso, temos diversos conceitos sendo mostrados como o buraco negro da Yuki Tsukumo.</p>
<p>Ou o teste dos mais fortes, Mahoraga.</p>
]]></content:encoded><category>Otaku</category><category>Jujutsu Kaisen</category><category>Power Scaling</category><category>Rant</category></item><item><title>Osdev: Programação assistida por ai, usando ralph wiggum pra acelerar o desenvolvimento</title><link>https://foxtechworld.github.io/programacao-assistida-por-ai-usando-ralph-wiggum-pra-acelerar-o-desenvolvimento/</link><guid isPermaLink="true">https://foxtechworld.github.io/programacao-assistida-por-ai-usando-ralph-wiggum-pra-acelerar-o-desenvolvimento/</guid><pubDate>Mon, 02 Feb 2026 02:13:05 GMT</pubDate><description>&lt;h2 id="introdução"&gt;Introdução&lt;/h2&gt;
&lt;p&gt;No mundo moderno, não existe nada pior do que se defasar e pior ainda ficar travado por causa de &lt;em&gt;&lt;strong&gt;opinião sem embasamento&lt;/strong&gt;&lt;/em&gt;, obviamente eu dou opinião, pelo menos o suficiente para produzir os posts como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foxtechworld.github.io/2025/09/opini%C3%A3o-n%C3%A3o-tenha-crian%C3%A7as-sem-antes-pensar-nisso/"&gt;Como criar filhos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foxtechworld.github.io/2025/09/opini%C3%A3o-brasil-a-grande-v%C3%A1rzea/"&gt;Brasil, a grande várzea&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E alguns outros que ainda pretendo postar.&lt;/p&gt;
&lt;p&gt;Porém, entretanto, todavia uma coisa que tenho pensado é no hype das AI e no novo modelo de desenvolvimento baseado em &lt;strong&gt;Ralph Willgum&lt;/strong&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="introdução">Introdução</h2>
<p>No mundo moderno, não existe nada pior do que se defasar e pior ainda ficar travado por causa de <em><strong>opinião sem embasamento</strong></em>, obviamente eu dou opinião, pelo menos o suficiente para produzir os posts como:</p>
<ul>
<li><a href="https://foxtechworld.github.io/2025/09/opini%C3%A3o-n%C3%A3o-tenha-crian%C3%A7as-sem-antes-pensar-nisso/">Como criar filhos</a></li>
<li><a href="https://foxtechworld.github.io/2025/09/opini%C3%A3o-brasil-a-grande-v%C3%A1rzea/">Brasil, a grande várzea</a></li>
</ul>
<p>E alguns outros que ainda pretendo postar.</p>
<p>Porém, entretanto, todavia uma coisa que tenho pensado é no hype das AI e no novo modelo de desenvolvimento baseado em <strong>Ralph Willgum</strong></p>
<p><img src="https://static.simpsonswiki.com/images/thumb/1/14/Ralph_Wiggum.png/345px-Ralph_Wiggum.png" alt="Ralph Wiggum   Wikisimpsons, the Simpsons Wiki"></p>
<p>Para contextualizar, eu estava em um dia normal assistindo alguns vídeos no Freetube (o melhor frontend para youtuber que eu conheço) e encontrei ou melhor reencontrei um vídeo falando deste modelo de desenvolvimento e como já tinha instalado o Omarchy do DHH e testado o OpenCode que possui ferramentas gratuitas decidi testar no meu projeto de osdev, o <a href="https://github.com/KitsuneBSD/FKernel">FKernel</a>.</p>
<p>Em questão o vídeo que eu assisti foi</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/rv756w-DHhk?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="o-que-é-o-metodo-ralph-wiggum">O que é o metodo Ralph Wiggum</h2>
<p>Basicamente é assumir que LLM é uma porra e usar força bruta + memória longa + pequenas tarefas para conseguir um resultado melhor, ambas as memórias são mantidas no sistema operacional do agente na forma de tasks em json e um prompt.</p>
<p>Após isso colocamos um for-loop que deve infinitamente rodar lendo o prompt e atualizando as tasks.</p>
<p>Para tarefas longas, tudo vira tarefas curtas que são infinitamente mais supportaveis de se fazer me um problema longo.</p>
<blockquote>
<p>Dividir e conquistar é a meta da programação</p>
</blockquote>
<h2 id="e-o-que-eu-pretendo-com-isso">E o que eu pretendo com isso?</h2>
<p>O FKernel em seu modelo é essencialmente lindo, mas, é mantido por uma pessoa só &ldquo;eu&rdquo;.</p>
<p>E o geral a programação tende a ter muito débito técnico quando não se sabe como atingir o que quer e meu processo de desenvolvimento é saber o que quero fazer em A mas não saber que preciso integrar a B.</p>
<p>Então é necessário fazer uma reescrita ou uma refatoração, mesmo uma nova feature que seja maior que o projeto fica mais fácil de desenvolve - lo a longo prazo.</p>
<p>Mesmo recursos ou práticas avançadas do FKernel.</p>
<h2 id="porém-é-um-projeto-bsd-3-clause">Porém é um projeto BSD-3-Clause</h2>
<p>Sendo um projeto aberto é normal se esperar contribuições, eu mesmo não tive, porém seria bom normalizar o processo para ficar automático para todos os desenvolvedores que quiserem contribuir usando obviamente modelos gratuitos.</p>
<p>Particularmente neste kernel eu decidi fugir um pouco do mundo Unix Total e estou usando <strong>Lua</strong> como a única linguagem de script dentro do kernel.</p>
<p>Vantagens e desvantagens a parte qualquer script de gerenciamento é normalizado em scripts no diretório <code>/Meta</code> e podemos dividir em pequenas libs em <code>/Meta/Lib</code>  reusáveis.</p>
<p>Obviamente não dependendo de LuaRocks para gerenciar libs.</p>
<p>Não pretendo explicar muito além de dizer que é uma prática irrecomendável, porém facilita o pipeline de qualquer pessoa que quiser contribuir.</p>
<p>Baixar &gt; Ter o mínimo de dependencia externa &gt; Gerar o binário</p>
<h2 id="funciona">Funciona?</h2>
<p>Não é exatamente o claude-code então não consegui replicar perfeitamente o comportamento esperado, fora que os logs em si não contribuem muito ainda.</p>
<p>Ou seja precisa de muito trabalho para ser 100% funcional da forma esperada, tirando isso.</p>
<p>Acredito que o progresso e o resultado em si devam ser proveitosos no dia a dia quando estiver num ponto agradavel de uso.</p>
<p>Bom em especial quando eu tiver grandes e chatas tasks de refatoração em especifico ou de implementação.</p>
<p><img src="https://i.imgur.com/g0miax1.png" alt="wiggum funcionando 2026/02/03"></p>
<h2 id="o-futuro-é-pica">O futuro é pica</h2>
<p><img src="https://i.pinimg.com/736x/4c/ce/65/4cce6525d3c302e9bac2496991a7a321.jpg" alt="O futuro é pica"></p>
<p>Com tudo isso dito, a única coisa que posso aguardar é um melhor futuro no desenvolvimento do meu kernel já que agora tarefas incrivelmente custosas em tempo pode ser executada não em menos tempo, mas em menos iteração manual. Rodou esqueceu e ele que se ajuste.</p>
<p>Fora na subdivisão em tarefas menoras e o monitoramente continuo de como continuar a progressão</p>
]]></content:encoded><category>programming</category><category>osdev</category><category>ai</category><category>llm</category><category>vibe coding</category><category>ralph wiggum</category></item><item><title>Osdev: O multithread perdido - Pervasive Multithread</title><link>https://foxtechworld.github.io/osdev-o-multithread-perdido-pervasive-multithread/</link><guid isPermaLink="true">https://foxtechworld.github.io/osdev-o-multithread-perdido-pervasive-multithread/</guid><pubDate>Fri, 28 Nov 2025 12:31:28 GMT</pubDate><description>&lt;p&gt;Quando olhamos a história dos sistemas operacionais vemos muitas ideias promissoras nascerem, ganharem nichos e, às vezes, sumirem sem deixar rastro. Entre esses projetos, o BeOS — e seu sucessor Haiku — se destacam por uma opção arquitetural clara: priorizar interatividade e baixa latência por meio do que se chamou de Pervasive Multithread.&lt;/p&gt;
&lt;h2 id="o-diferencial-do-beos--haiku"&gt;O diferencial do BeOS / Haiku&lt;/h2&gt;
&lt;p&gt;O ponto central é simples: escalonar no nível da thread, com threads muito leves e políticas que favorecem responsividade em vez de throughput máximo. Isso reduz a sobrecarga de contexto ao trocar entre threads da mesma aplicação e permite uma taxa alta de comutação sem penalizar a interatividade.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Quando olhamos a história dos sistemas operacionais vemos muitas ideias promissoras nascerem, ganharem nichos e, às vezes, sumirem sem deixar rastro. Entre esses projetos, o BeOS — e seu sucessor Haiku — se destacam por uma opção arquitetural clara: priorizar interatividade e baixa latência por meio do que se chamou de Pervasive Multithread.</p>
<h2 id="o-diferencial-do-beos--haiku">O diferencial do BeOS / Haiku</h2>
<p>O ponto central é simples: escalonar no nível da thread, com threads muito leves e políticas que favorecem responsividade em vez de throughput máximo. Isso reduz a sobrecarga de contexto ao trocar entre threads da mesma aplicação e permite uma taxa alta de comutação sem penalizar a interatividade.</p>
<p>Essa ênfase na responsividade ajuda a explicar decisões de projeto aparentemente simples — por exemplo, por que tratar a unidade de escalonamento como a thread em vez do processo — e prepara o terreno para entendermos o conceito que vem a seguir.</p>
<h2 id="o-que-é-pervasive-multithread">O que é Pervasive Multithread</h2>
<p>Pervasive Multithread é um modelo composto — kernel e runtime cooperam — em que o sistema trata a concorrência como algo onipresente: o scheduler opera por thread, há prioridades finas (tipicamente 0–120) e políticas que privilegiam latência e previsibilidade sobre o rendimento bruto.</p>
<p>O resultado prático é que a aplicação vê threads leves com prioridades ajustáveis, e o kernel faz o mínimo necessário ao salvar/restaurar contexto, mantendo a máquina responsiva para cargas interativas.</p>
<p>Com essa definição em mente, vale contrastar como o hardware moderno tenta aumentar paralelismo com técnicas como SMT — e por que essa camada física pode confundir as decisões de escalonamento quando não é considerada explicitamente.</p>
<h2 id="por-que-smt-não-é-um-cpu--explicação-técnica">Por que SMT não é um “CPU” — explicação técnica</h2>
<p>Simultaneous multithreading (SMT) cria múltiplas hardware threads dentro do mesmo núcleo físico. Essas hardware threads compartilham pipelines, unidades funcionais, níveis de cache e o mesmo domínio energético. Em particular:</p>
<ul>
<li>Compartilhamento de execution units: duas hardware threads podem disputar as mesmas ALUs, FPU e portas de memória.</li>
<li>Contenção em caches: L1 e, em muitos designs, partes do L2/L3 são compartilhadas ou têm efeitos de conflito entre threads.</li>
<li>Dependência de largura de banda e buffers internos: estruturas como reorder buffers e filas de load/store são limitadas por núcleo.</li>
</ul>
<p>Esses recursos compartilhados significam que duas hardware threads no mesmo núcleo não oferecem isolamento equivalente ao de dois núcleos físicos. Tratar cada hardware thread como uma CPU independente ignora dependências microarquiteturais e pode degradar throughput e previsibilidade ao induzir contenção e conflitos que o sistema não prevê.</p>
<p>Em outras palavras: o escalonador que vê apenas &ldquo;CPUs lógicas&rdquo; perde contexto sobre contendas internas do núcleo — um fator crítico quando buscamos baixa latência e previsibilidade.</p>
<h2 id="onde-os-schedulers-modernos-erram">Onde os schedulers modernos erram</h2>
<p>Muitos escalonadores expõem cada hardware thread lógico como uma CPU separada (p. ex. quando <code>htop</code> mostra &ldquo;cores lógicos&rdquo;). Essa abstração facilita balanceamento de carga, mas apaga a topologia real: quando cargas pesadas são espalhadas por hardware threads de um mesmo núcleo, surgem colisões internas que reduzem performance por watt e aumentam a variabilidade de latência.</p>
<p>O problema não é apenas teórico — medições mostram degradações em throughput e latência em cenários de mistura de cargas CPU-bound e latência-sensível quando o escalonador não considera afinidade por núcleo físico e partição de recursos.</p>
<p>Por isso é importante que camadas de software acima do escalonador compreendam a topologia do processador ou que o próprio escalonador exponha políticas que evitem colocar cargas conflitantes em hardware threads do mesmo núcleo.</p>
<h2 id="a-proposta-do-fkernel-consciência-de-topologia">A proposta do FKernel: consciência de topologia</h2>
<p>No FKernel, a responsabilidade de lidar com essa complexidade é deslocada para camadas que entendem o perfil da carga. A ideia central é uma pipeline decidida antes do despacho para hardware threads:</p>
<p>Green Threads → Multilevel Feedback Queue (MLFQ) → Pervasive Layer → Hardware Threads (SMT)</p>
<p>Detalhes práticos:</p>
<ul>
<li>O MLFQ organiza e amostra comportamento das green threads para estimar sua sensibilidade à latência e ao throughput.</li>
<li>A Pervasive Layer usa esse perfil para decidir mapeamentos: algumas execuções ocupam uma hardware thread sozinho (para evitar contenda), outras são pareadas com cargas complementares para aproveitar vazios da unidade funcional.</li>
</ul>
<p>Isso torna o SMT um recurso gerenciado — um &ldquo;acelerador&rdquo; que é usado conscientemente e não um substituto direto de um núcleo físico.</p>
<p>Na prática, isso permite duas estratégias opostas: isolar workloads sensíveis à latência em hardware threads próprias, ou cooperar uma workload de alta utilização com outra complementar para maximizar uso de unidades funcionais sem bloquear latência crítica.</p>
<h3 id="flag-o_hpc--atalho-para-throughput">Flag <code>O_HPC</code> — atalho para throughput</h3>
<p>Para workloads puramente orientados a throughput, o desenvolvedor pode usar a flag <code>O_HPC</code>. Nesse modo, o caminho é encurtado: a aplicação solicita pinagem e afinidade mais agressivas (possivelmente com garantia de partição de cache L2/L3), sacrificando previsibilidade para ganhar rendimento bruto.</p>
<p>Em resumo, <code>O_HPC</code> é uma exceção explícita ao modelo orientado a latência — uma forma de o desenvolvedor indicar que prefere rendimento bruto em vez de previsibilidade quando as medições justificam essa escolha.</p>
<h2 id="conclusão">Conclusão</h2>
<p>Tratar hardware threads SMT como CPUs independentes é uma simplificação que não reflete a microarquitetura moderna: ela produz contenção interna, variabilidade de latência e desperdício de recursos. O FKernel propõe empurrar a complexidade para camadas que conhecem o perfil das cargas — MLFQ e Pervasive Layer — para mapear threads de forma consciente sobre a topologia real do processador.</p>
<p>O ganho esperado é simples e direto: menor latência, interatividade consistente e uso mais eficiente de caches e unidades funcionais. Para cargas de throughput extremo, a flag <code>O_HPC</code> permite abrir mão dessa previsibilidade de propósito.</p>
<p>Se você curte esse tipo de discussão ou quer acompanhar o desenvolvimento do FKernel, deixe um comentário, compartilhe como seu sistema lida com SMT ou sugira workloads para testarmos — medições práticas vão mostrar o impacto real, e eu pretendo publicar resultados em posts futuros.</p>
<p>Dentre eles temos o <a href="https://en.wikipedia.org/wiki/BeOS">beOS</a> e seu sucessor <a href="https://www.haiku-os.org/">HaikuOS</a>.</p>
]]></content:encoded><category>Programming</category><category>Operating System</category><category>osdev</category><category>c++</category><category>haiku</category><category>beos</category></item><item><title>Algoritmos: Duff device for loop unrolling</title><link>https://foxtechworld.github.io/algoritmos-duff-device-for-loop-unrolling/</link><guid isPermaLink="true">https://foxtechworld.github.io/algoritmos-duff-device-for-loop-unrolling/</guid><pubDate>Sun, 26 Oct 2025 18:20:07 GMT</pubDate><description>&lt;h1 id="como-os-compiladores-conseguem-otimizar-loops"&gt;Como os compiladores conseguem otimizar loops?&lt;/h1&gt;
&lt;p&gt;A princípio isso não parece possível. Se um loop executa uma ação N vezes, o tempo total deveria ser basicamente o custo dessa ação multiplicado por N. Só que na prática, quando compilamos com -O3, o resultado é bem diferente: o mesmo loop roda mais rápido, mesmo fazendo o mesmo trabalho.&lt;/p&gt;
&lt;p&gt;E a culpa (ou o mérito) é de um pequeno trecho de código que se tornou quase uma lenda na história da otimização em C:&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="como-os-compiladores-conseguem-otimizar-loops">Como os compiladores conseguem otimizar loops?</h1>
<p>A princípio isso não parece possível. Se um loop executa uma ação N vezes, o tempo total deveria ser basicamente o custo dessa ação multiplicado por N. Só que na prática, quando compilamos com -O3, o resultado é bem diferente: o mesmo loop roda mais rápido, mesmo fazendo o mesmo trabalho.</p>
<p>E a culpa (ou o mérito) é de um pequeno trecho de código que se tornou quase uma lenda na história da otimização em C:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">register</span> <span style="color:#66d9ef">int</span> <span style="color:#f92672">*</span>to, <span style="color:#f92672">*</span>from;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">register</span> <span style="color:#66d9ef">int</span> count <span style="color:#f92672">=</span> (n <span style="color:#f92672">+</span> <span style="color:#ae81ff">7</span>) <span style="color:#f92672">/</span> <span style="color:#ae81ff">8</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">switch</span> (n <span style="color:#f92672">%</span> <span style="color:#ae81ff">8</span>) {
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">0</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">do</span> { <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">7</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">6</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">5</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">4</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">3</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">1</span><span style="color:#f92672">:</span>      <span style="color:#f92672">*</span>to <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>from<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span>        } <span style="color:#66d9ef">while</span> (<span style="color:#f92672">--</span>count <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Este pequeno frame é o <a href="https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Duffs-Device.html"><strong><em>Duff Device</em></strong></a> criado por <a href="https://en.wikipedia.org/wiki/Tom_Duff"><strong>Tom Duff</strong></a> em 1983.</p>
<h2 id="o-que-é-o-desenrolamento-de-loops">O que é o desenrolamento de loops?</h2>
<p>Loop Unrolling (ou desenrolamento de loop) é uma técnica de otimização onde o compilador duplica o corpo do loop várias vezes para reduzir o custo do controle de iteração.</p>
<p>Em vez de checar a condição e incrementar o contador a cada passo, ele faz operações por iterações, diminuindo o número total de saltos no código.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; <span style="color:#f92672">++</span>i){
</span></span><span style="display:flex;"><span>    copia[i] <span style="color:#f92672">=</span> origem[i];
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>se transforma em algo conceitualmente similar:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i <span style="color:#f92672">+=</span> <span style="color:#ae81ff">4</span>) {
</span></span><span style="display:flex;"><span>    copia[i] <span style="color:#f92672">=</span> origem[i];
</span></span><span style="display:flex;"><span>    copia[i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> origem[i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>    copia[i<span style="color:#f92672">+</span><span style="color:#ae81ff">2</span>] <span style="color:#f92672">=</span> origem[i<span style="color:#f92672">+</span><span style="color:#ae81ff">2</span>];
</span></span><span style="display:flex;"><span>    copia[i<span style="color:#f92672">+</span><span style="color:#ae81ff">3</span>] <span style="color:#f92672">=</span> origem[i<span style="color:#f92672">+</span><span style="color:#ae81ff">3</span>];
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Menos branches, mais instruções seguidas, mais chance de o processador aproveitar o pipeline e executar tudo de forma quase branchless, parecido com o que o <code>SIMD</code> faz.</p>
<p>O Duff Device foi a primeira vez que alguém usou essa ideia manualmente, antes de os compiladores modernos fazerem isso sozinhos.</p>
<p>É uma daquelas otimizações que parecem mágica até você perceber que o compilador só está tentando evitar o que humanos mais odeiam: repetições desnecessárias.</p>
<h2 id="e-porque-isso-funciona-em-c">E porque isso funciona em C?</h2>
<p>A lógica do Duff Device não é muito diferente de acessar vários elementos de um array de uma vez. Se copia e origem têm o mesmo tamanho, você consegue fazer a mesma operação em uma única iteração, processando múltiplas posições do vetor ao mesmo tempo. Isso reduz o overhead de controle do loop e deixa o processador mais livre para executar instruções em sequência, aumentando a eficiência geral.</p>
<p>O <code>do-while</code> sozinho é simples, executa a iteração uma vez e faz o teste da condição garantindo pelo menos uma execução.</p>
<p>O <code>switch</code> é um salto condicional que usa <a href="https://en.wikipedia.org/wiki/Branch_table">jump-table</a> para ter tempo de execução O(1).</p>
<p>Agora, dentro de truque do <strong>Duff-Device</strong>: ele <strong>remove os breaks de propósito</strong> e coloca o <code>switch</code> <strong>dentro do do-while</strong>.</p>
<p>Isso cria efeitos simultâneos:</p>
<ol>
<li>O <code>switch</code> escolhe em qual ponto do loop começar</li>
<li>O <code>do-while</code> continua repetindo o bloco inteiro várias vezes até completar todas as iterações.</li>
</ol>
<p>Na prática, isso significa que você começa no case certo (alinhando as iterações que sobraram) e depois &ldquo;cai&rdquo; pelos demais cases sem saltos adicionais, repetindo tudo até terminar.</p>
<p>Cada execução <code>do-while</code> processa vários elementos do array, e o switch inicial só garante que você comece na posição correta.</p>
<h1 id="conclusão">Conclusão</h1>
<p>Pode ser uma técnica útil em alguns casos, mas não na maioria.</p>
<p>É feio, parece gambiarra e seu compilador quando passa as flags <code>-O3</code> ou <code>-funroll-loops</code> já adiciona os Duff-Devices automaticamente.</p>
<p>Porém se você estiver estudando programação ou pelo menos otimização de código fonte, complexidade de algoritmos vale a pena dar uama revisada.</p>
]]></content:encoded><category>Algoritmos</category><category>Estrutura de Dados</category><category>Otimização</category><category>Duff Device</category><category>Loop Unroll</category></item><item><title>Opinião: Design Patterns são um péssimo nome</title><link>https://foxtechworld.github.io/opini%C3%A3o-design-patterns-s%C3%A3o-um-p%C3%A9ssimo-nome/</link><guid isPermaLink="true">https://foxtechworld.github.io/opini%C3%A3o-design-patterns-s%C3%A3o-um-p%C3%A9ssimo-nome/</guid><pubDate>Wed, 08 Oct 2025 15:08:13 GMT</pubDate><description>&lt;h1 id="introdução"&gt;Introdução&lt;/h1&gt;
&lt;p&gt;Um dos meus hobbies, atualmente está sendo ler posts antigos, como os do blog &lt;strong&gt;&lt;em&gt;AkitaOnRails&lt;/em&gt;&lt;/strong&gt;. E em um de seus posts entitulados &lt;a href="https://akitaonrails.com/2006/10/30/design-patterns-representam-defeitos-nas-linguagens/"&gt;&lt;em&gt;[ &lt;strong&gt;Design Patterns representam defeitos nas linguagens&lt;/strong&gt; ]&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Primeiramente, este é um bom post, muito bem embasado de acordo com o blog post &lt;a href="https://web.archive.org/web/20061017194620/http://newbabe.pobox.com/~mjd/blog/2006/09/11/#design-patterns"&gt;&lt;strong&gt;&lt;em&gt;Universe of Discourse&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mas, um dos pontos que me incomodou foi a mistura de Design do Software com Arquitetura de Software e a Ergonomia da linguagem.&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="introdução">Introdução</h1>
<p>Um dos meus hobbies, atualmente está sendo ler posts antigos, como os do blog <strong><em>AkitaOnRails</em></strong>. E em um de seus posts entitulados <a href="https://akitaonrails.com/2006/10/30/design-patterns-representam-defeitos-nas-linguagens/"><em>[ <strong>Design Patterns representam defeitos nas linguagens</strong> ]</em></a></p>
<p>Primeiramente, este é um bom post, muito bem embasado de acordo com o blog post <a href="https://web.archive.org/web/20061017194620/http://newbabe.pobox.com/~mjd/blog/2006/09/11/#design-patterns"><strong><em>Universe of Discourse</em></strong></a></p>
<p>Mas, um dos pontos que me incomodou foi a mistura de Design do Software com Arquitetura de Software e a Ergonomia da linguagem.</p>
<p>Mas primeiramente vamos ver o que me incomodou em ambos os blog posts.</p>
<blockquote>
<p>Na última vez que escrevi sobre design patterns, foi para apontar que embora o movimento tenha sido inspirado pelo trabalho de “linguagem de pattern” de Christopher Alexander, não é parecido com nada que Alexander tenha sugerido, e que de fato o que Alexander sugeriu é mais interessante e provavelmente teria sido mais útil para programadores do que o movimento de design pattern escolheu seguir.</p>
</blockquote>
<blockquote>
<p>Uma das coisas que eu apontei foi essencialmente o que Norvig disse: que muitos patterns não estão realmente endereçando problemas recorrentes de design em programas orientados a objetos. Eles estão, na realidade, endereçando deficiências em linguagens de programação orientadas a objetos e que em linguagens melhores, esses problemas simplemente não aparecem ou são resolvidos de maneira tão fácil e trivial que a solução não requer um pattern. Em linguagem assembly, “chamada de sub-rotina” pode ser um pattern; em C, a solução é escrever result = function(args &hellip;), que é simples demais para se qualificar como pattern. Em uma linguagem como Lisp ou Haskell ou mesmo Perl, com um bom tipo de lista e poderosas primitivas para operar em valores de listas, o pattern “Iterator” (iterador) é aliviado em um grande degrau ou tido como invisível. Henry G. Baker pegou esse ponto em seu artigo Iterators: Sinais de Fraqueza em Linguagens Orientadas a Objetos.</p>
</blockquote>
<blockquote>
<p>Recebi muitas mensagens sobre isso, e curiosamente, alguns chegaram à mesma conclusão da mesma forma: eles disseram que embora eu estivesse certo sobre Iterator, era um exemplo pobre porque era um pattern muito simples, mas que era impossível imaginar um pattern mais complexo como Model-View-Controller ser absorvido e se tornar invisível dessa maneira.</p>
</blockquote>
<p>Obviamente, como um post antigo não vou dar muito trelo ainda mas, veja.</p>
<p>O motivo de conseguirmos enxergar um iterator</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c++" data-lang="c++"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">auto</span> mp : m_children){
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Do anything
</span></span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="o-incomodo">O incomodo</h2>
<p>Sendo absorvido por uma linguagem, mas nunca um MVC é simplesmente uma diferença de escopo.</p>
<p>Uma coisa é você aprimorar a <strong>ergonomia da linguagem</strong> facilitando um método de escrita em detrimento de outro.</p>
<p>Outra coisa é pegar o <strong>modelamento</strong> da arquitetura e fazer uma linguagem com isso.</p>
<p>Imagine dentro do lex de uma linguagem, você tem <code>print</code> que pertence a um <code>view</code> e os parametros seriam <code>models</code> com funções sendo <code>controllers</code>.</p>
<p>Simplesmente estúpido ao máximo.</p>
<h3 id="e-qual-o-problema-original">E qual o problema original&hellip;</h3>
<p>Esse é um pequeno problema de usar o nome <code>pattern</code>, sendo mais especifico <code>design pattern</code> é muito pouco descritivo.</p>
<p>Eu estou falando do <code>design</code> da linguagem para aumentar a produtividade do programador?</p>
<p>Ou estou falando do <code>design</code> na arquitetura para melhorar legibilidade e manutenção do código ao todo?</p>
<p>O Model-View-Controller deveria se enquadrar em <code>design pattern</code> então? <strong>SIM!!!</strong></p>
<p>E Iteradores? <strong>SIM!!!</strong></p>
<p>E Orientação a Objetos? <strong>SIM!!!</strong></p>
<p>Isso porque novamente é um problema de nomeação e domínio. Se está tudo em um <code>design pattern</code> então fica dificil fazer uma categorização mais aprofundada.</p>
<p>O mesmo serve quando colocamos <code>software monolitico</code> contra <code>microsserviços</code>.</p>
<p>Aqui temos dois padrões de arquitetura de software que de alguma forma também um padrão de design.</p>
<p>Podemos dizer que uma linguagem pode absorver uma arquitetura de software?</p>
<h2 id="uma-solução">Uma solução</h2>
<p>Podemos adjetivar o <code>design pattern</code> para seu domínio.</p>
<ul>
<li><code>Ergonic design pattern</code> para quando falamos de um padrão de arquitetura que pode ser absorvido pela linguagem.</li>
</ul>
<p>Sendo um exemplo o <code>Iterator</code>, <code>Goto</code>, <code>Function</code>.</p>
<ul>
<li><code>Architecture design pattern</code> para quando falamos de um padrão de arquitetura que não pode ser absorvido pela linguagem, mas pelo software em geral.</li>
</ul>
<p>Sendo exemplos: <code>Model-View-Controler</code>, <code>JSP Model1</code>, <code>Model-View-Adapter</code>, <code>Model-View-Presenter</code></p>
<ul>
<li><code>Implementation design pattern</code> para quando falamos de um padrão de arquitetura que não pode ser absorvido pela linguagem, nem pelo software em geral mas colocado para facilitar a implementação.</li>
</ul>
<p>Sendo exemplos: <code>Strategy Pattern</code>, <code>Observer pattern</code>, <code>Servant pattern</code>, <code>Command pattern</code>, <code>Chain of responsibility pattern</code>.</p>
<h1 id="conclusão">Conclusão</h1>
<p>No geral, o termo <strong><em>Design Pattern</em></strong> é genérico demais para ser útil no debate técnico.</p>
<p>Agrupando tudo desde ergonomia da linguagem até arquitetura distribuida sob o mesmo nome vira um deserviço.</p>
<p>A proposta de <strong>Adjetivar os patterns conforme seu domínio</strong> deve trazer clareza e distinguir melhor o que é arquitetural e o que é uma boa prática de implementação.</p>
<p>Talvez ao reclassificar os padrões com base não apenas naquilo <code>que elas resolvem</code> mas também no <strong>lugar onde operam</strong>.</p>
]]></content:encoded><category>Design Patterns</category><category>Opinião</category><category>Programação</category><category>Desenvolvimento</category><category>Arquitetura de software</category><category>Design de Software</category></item><item><title>Algoritmos em Grafos: Estrutura de dados - Disjoint-Set</title><link>https://foxtechworld.github.io/algoritmos-em-grafos-estrutura-de-dados-disjoint-set/</link><guid isPermaLink="true">https://foxtechworld.github.io/algoritmos-em-grafos-estrutura-de-dados-disjoint-set/</guid><pubDate>Wed, 01 Oct 2025 15:40:08 GMT</pubDate><description>&lt;h1 id="teoria-dos-conjuntos"&gt;Teoria dos conjuntos&lt;/h1&gt;
&lt;p&gt;Dentro da matemática temos os &lt;a href="https://www.todamateria.com.br/teoria-dos-conjuntos/"&gt;&lt;strong&gt;Sets&lt;/strong&gt;&lt;/a&gt;, equivalente a conjuntos na teoria de conjuntos.&lt;/p&gt;
&lt;p&gt;Também é um tipo de Python que você pode fazer para comprimir uma lista.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exemplo em Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;my_list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(set(my_list))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# {1, 2, 3}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="o-que-são-disjoint-sets"&gt;O que são Disjoint-Sets&lt;/h2&gt;
&lt;p&gt;E dentro dessa teoria, temos conjuntos disjuntos quando não tem elementos em comum entre eles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tse3.mm.bing.net/th/id/OIP.1gaGGShk2pNEuYVwth-nDwHaE5?rs=1&amp;amp;pid=ImgDetMain&amp;amp;o=7&amp;amp;rm=3" alt="Example of Disjoint-Set"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Em SQL, ao fazer joins entre tabelas, podemos pensar em sets: um inner join retorna elementos comuns, e se duas tabelas forem disjuntas (não têm elementos em comum) o join retorna vazio.&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="teoria-dos-conjuntos">Teoria dos conjuntos</h1>
<p>Dentro da matemática temos os <a href="https://www.todamateria.com.br/teoria-dos-conjuntos/"><strong>Sets</strong></a>, equivalente a conjuntos na teoria de conjuntos.</p>
<p>Também é um tipo de Python que você pode fazer para comprimir uma lista.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># Exemplo em Python</span>
</span></span><span style="display:flex;"><span>my_list <span style="color:#f92672">=</span> [<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">2</span>,<span style="color:#ae81ff">3</span>,<span style="color:#ae81ff">3</span>,<span style="color:#ae81ff">3</span>,<span style="color:#ae81ff">3</span>,<span style="color:#ae81ff">3</span>,<span style="color:#ae81ff">3</span>,]
</span></span><span style="display:flex;"><span>print(set(my_list))
</span></span><span style="display:flex;"><span><span style="color:#75715e"># {1, 2, 3}</span>
</span></span></code></pre></div><h2 id="o-que-são-disjoint-sets">O que são Disjoint-Sets</h2>
<p>E dentro dessa teoria, temos conjuntos disjuntos quando não tem elementos em comum entre eles.</p>
<p><img src="https://tse3.mm.bing.net/th/id/OIP.1gaGGShk2pNEuYVwth-nDwHaE5?rs=1&amp;pid=ImgDetMain&amp;o=7&amp;rm=3" alt="Example of Disjoint-Set"></p>
<blockquote>
<p>Em SQL, ao fazer joins entre tabelas, podemos pensar em sets: um inner join retorna elementos comuns, e se duas tabelas forem disjuntas (não têm elementos em comum) o join retorna vazio.</p>
</blockquote>
<p>Disjoint-Sets trabalham com a mesma ideia de verificar se conjuntos têm ou não interseção.</p>
<p>Em realidade, este é uma das melhores estruturas de dados para otimizar algoritmos em grafos.</p>
<p>Dentro dele suportamos duas operações:</p>
<ul>
<li><strong><em>Union</em></strong>: Mesclando dois conjuntos em um único conjunto.</li>
<li><strong><em>Find</em></strong> : Encontrando um representante de um conjunto disjunto.</li>
</ul>
<h3 id="exemplo-de-uso-em-grafos">Exemplo de uso em grafos</h3>
<p>Imagine a situação de uma rede social com diversas pessoas e você tem as seguintes tarefas a serem executadas:</p>
<ul>
<li>
<p>Adicione uma nova <strong><em>relação</em></strong> de <strong><em>amizade</em></strong>, ou seja, uma pessoa x se torna amiga de y adicionando um novo elemento a um conjunto.</p>
</li>
<li>
<p>Descobrir se <strong><em>o indivíduo x é amigo do indivíduo y</em></strong> (amigo direto ou indireto)</p>
</li>
</ul>
<h4 id="exemplo">Exemplo</h4>
<blockquote>
<p>Exemplo tirado do <a href="https://www.geeksforgeeks.org/dsa/introduction-to-disjoint-set-data-structure-or-union-find-algorithm/">Geeks For Geeks</a></p>
</blockquote>
<pre tabindex="0"><code>Recebemos 10 indivíduos, digamos, a,b,c,d,e,f,g,h,i,j

A seguir estão as relações a serem adicionadas:

a &lt;-&gt; b
b &lt;-&gt; d
c &lt;-&gt; f
c &lt;-&gt; i
j &lt;-&gt; e
g &lt;-&gt; j

Dadas perguntas como se a é amigo de d ou não.

Basicamente, precisamos criar os seguintes 4 grupos e manter uma conexão rapidamente acessível entre os itens do grupo:

G1 = {a, b, d}
G2 = {c, f, i}
G3 = {e, g, j}
G4 = {h}
</code></pre><p>Caso fomos implementar o <strong>UnionFind</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">UnionFind</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">initialize</span>(size)
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Inicializa cada elemento como seu próprio representante (pai)</span>
</span></span><span style="display:flex;"><span>    @parent <span style="color:#f92672">=</span> Array<span style="color:#f92672">.</span>new(size) { <span style="color:#f92672">|</span>i<span style="color:#f92672">|</span> i }
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Rank ajuda a manter as árvores balanceadas</span>
</span></span><span style="display:flex;"><span>    @rank <span style="color:#f92672">=</span> Array<span style="color:#f92672">.</span>new(size, <span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">find</span>(i)
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Aplica compressão de caminho</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> @parent<span style="color:#f92672">[</span>i<span style="color:#f92672">]</span> <span style="color:#f92672">!=</span> i
</span></span><span style="display:flex;"><span>      @parent<span style="color:#f92672">[</span>i<span style="color:#f92672">]</span> <span style="color:#f92672">=</span> find(@parent<span style="color:#f92672">[</span>i<span style="color:#f92672">]</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>    @parent<span style="color:#f92672">[</span>i<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">unite</span>(i, j)
</span></span><span style="display:flex;"><span>    irep <span style="color:#f92672">=</span> find(i)
</span></span><span style="display:flex;"><span>    jrep <span style="color:#f92672">=</span> find(j)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">if</span> irep <span style="color:#f92672">==</span> jrep
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># União por rank</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> @rank<span style="color:#f92672">[</span>irep<span style="color:#f92672">]</span> <span style="color:#f92672">&lt;</span> @rank<span style="color:#f92672">[</span>jrep<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>      @parent<span style="color:#f92672">[</span>irep<span style="color:#f92672">]</span> <span style="color:#f92672">=</span> jrep
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">elsif</span> @rank<span style="color:#f92672">[</span>irep<span style="color:#f92672">]</span> <span style="color:#f92672">&gt;</span> @rank<span style="color:#f92672">[</span>jrep<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>      @parent<span style="color:#f92672">[</span>jrep<span style="color:#f92672">]</span> <span style="color:#f92672">=</span> irep
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>      @parent<span style="color:#f92672">[</span>jrep<span style="color:#f92672">]</span> <span style="color:#f92672">=</span> irep
</span></span><span style="display:flex;"><span>      @rank<span style="color:#f92672">[</span>irep<span style="color:#f92672">]</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>names <span style="color:#f92672">=</span> <span style="color:#e6db74">%w[a b c d e f g h i j]</span>
</span></span><span style="display:flex;"><span>name_to_index <span style="color:#f92672">=</span> names<span style="color:#f92672">.</span>each_with_index<span style="color:#f92672">.</span>to_h
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>uf <span style="color:#f92672">=</span> <span style="color:#66d9ef">UnionFind</span><span style="color:#f92672">.</span>new(names<span style="color:#f92672">.</span>size)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>relations <span style="color:#f92672">=</span> <span style="color:#f92672">[[</span><span style="color:#e6db74">&#34;a&#34;</span>, <span style="color:#e6db74">&#34;b&#34;</span><span style="color:#f92672">]</span>, <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;b&#34;</span>, <span style="color:#e6db74">&#34;d&#34;</span><span style="color:#f92672">]</span>, <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;c&#34;</span>, <span style="color:#e6db74">&#34;f&#34;</span><span style="color:#f92672">]</span>, <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;c&#34;</span>, <span style="color:#e6db74">&#34;i&#34;</span><span style="color:#f92672">]</span>, <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;j&#34;</span>, <span style="color:#e6db74">&#34;e&#34;</span><span style="color:#f92672">]</span>, <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;g&#34;</span>, <span style="color:#e6db74">&#34;j&#34;</span><span style="color:#f92672">]]</span>
</span></span><span style="display:flex;"><span>relations<span style="color:#f92672">.</span>each <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>x, y<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>  uf<span style="color:#f92672">.</span>unite(name_to_index<span style="color:#f92672">[</span>x<span style="color:#f92672">]</span>, name_to_index<span style="color:#f92672">[</span>y<span style="color:#f92672">]</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>x, y <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;a&#34;</span>, <span style="color:#e6db74">&#34;d&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> uf<span style="color:#f92672">.</span>find(name_to_index<span style="color:#f92672">[</span>x<span style="color:#f92672">]</span>) <span style="color:#f92672">==</span> uf<span style="color:#f92672">.</span>find(name_to_index<span style="color:#f92672">[</span>y<span style="color:#f92672">]</span>)
</span></span><span style="display:flex;"><span>  puts <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>x<span style="color:#e6db74">}</span><span style="color:#e6db74"> e </span><span style="color:#e6db74">#{</span>y<span style="color:#e6db74">}</span><span style="color:#e6db74"> são amigos (diretos ou indiretos)&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>  puts <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>x<span style="color:#e6db74">}</span><span style="color:#e6db74"> e </span><span style="color:#e6db74">#{</span>y<span style="color:#e6db74">}</span><span style="color:#e6db74"> não são amigos&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><h3 id="onde-usar-o-disjoint-set">Onde usar o Disjoint-Set</h3>
<p>Disjoint-Set é útil para a maioria dos problemas não triviais da computação muito provavelmente um problema em baixo nível pode ser resolvido com ele.</p>
<h4 id="exemplos-de-alto-nível">Exemplos de Alto Nível</h4>
<p>Qualquer grande E-Commerce, empresa, sistema que for mexer com grafos pode usar o Disjoint-Set para otimizar em algumas especifidades.</p>
<h5 id="grafos">Grafos</h5>
<ul>
<li>
<p>Podemos usar o Disjoint-Set no <a href="https://pt.wikipedia.org/wiki/Algoritmo_de_Kruskal"><strong><em>Algoritmo de Kruskal</em></strong></a> para encontrar uma árvore geradora mínima.</p>
</li>
<li>
<p>Podemos usar o Disjoint-Set para detectar <strong><em>Cíclos em grafos não direcionados</em></strong>.</p>
</li>
<li>
<p>Podemos usar o Disjoint-Set para a identificação de <strong><em>componentes conectados</em></strong>.</p>
</li>
</ul>
<h3 id="simulação">Simulação</h3>
<ul>
<li>
<p>Controle de <strong><em>conjuntos de objetos</em></strong> que se fundem e se dividem dinamicamente.</p>
</li>
<li>
<p>Simulação de <strong><em>percolação</em></strong> ou <strong><em>clusters</em></strong>.</p>
</li>
</ul>
<h4 id="exemplos-de-baixo-nível">Exemplos de Baixo Nível</h4>
<p>Qualquer coisa mais escondida sendo dentro de linguagens de programação, sistemas operacionais, bibliotecas &hellip; etc.</p>
<h3 id="problemas-de-equivalência">Problemas de Equivalência</h3>
<ul>
<li>
<p>Manter classes de equivalência.</p>
</li>
<li>
<p>Agrupamento por atributos compartilhados.</p>
</li>
</ul>
<h3 id="e-no-geral">E no geral?</h3>
<p>Se tiver muito no seu código questões do tipo &ldquo;X e Y são relacionados?&rdquo; em um conjunto dinâmico de relações, então <strong>Disjoint-Set</strong> é a escolha mais eficiente.</p>
<h3 id="conclusão">Conclusão</h3>
<p>A estrutura Disjoint-Set (Union-Find) resolve com eficiência problemas baseados em conectividade dinâmica.</p>
<p>Com <strong>Union</strong> e <strong>Find</strong>, é possível gerenciar grupos, detectar relações e otimizar algoritmos em grafos com complexidade quase constante.</p>
<p>Se o problema envolve:</p>
<ul>
<li>Particionar elementos</li>
<li>Verificar conexões</li>
<li>Unir componentes rapidamente</li>
</ul>
<p>Então <strong>Union-Find</strong> é a estrutura certa.</p>
<p>Simples, rápida e usada desde sistemas reais até algoritmos clássicos.</p>
]]></content:encoded><category>Algoritmos</category><category>Estrutura de Dados</category><category>Grafos</category><category>Algoritmos de Busca</category><category>Busca em Largura</category><category>Busca em Profundidade</category><category>Teoria dos Grafos</category></item><item><title>SaaS: A ferramenta certa na hora certa</title><link>https://foxtechworld.github.io/saas-a-ferramenta-certa-na-hora-certa/</link><guid isPermaLink="true">https://foxtechworld.github.io/saas-a-ferramenta-certa-na-hora-certa/</guid><pubDate>Tue, 23 Sep 2025 14:08:26 GMT</pubDate><description>&lt;p&gt;Bem a melhor ferramenta é aquela que resolve seu problema.&lt;/p&gt;
&lt;p&gt;Isso é invariável em todo o mundo da programação.&lt;/p&gt;
&lt;p&gt;No mundo do SaaS, sendo um desenvolvedor solo, você não deve confiar apenas em si mesmo.&lt;/p&gt;
&lt;p&gt;Adicione Testes, testes, mais testes, enfie testes em tudo que puder e use softwares maduros.&lt;/p&gt;
&lt;p&gt;Mas, ao mesmo tempo não deixe seu software parado no tempo.&lt;/p&gt;
&lt;h2 id="as-duas-grandes-divisões"&gt;As duas grandes divisões&lt;/h2&gt;
&lt;p&gt;Dentro do mundo de software existem duas grandes divisões &lt;a href="https://roadmap.sh/frontend"&gt;&lt;strong&gt;&lt;em&gt;frontend&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; e &lt;a href="https://roadmap.sh/backend"&gt;&lt;strong&gt;&lt;em&gt;backend&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>Bem a melhor ferramenta é aquela que resolve seu problema.</p>
<p>Isso é invariável em todo o mundo da programação.</p>
<p>No mundo do SaaS, sendo um desenvolvedor solo, você não deve confiar apenas em si mesmo.</p>
<p>Adicione Testes, testes, mais testes, enfie testes em tudo que puder e use softwares maduros.</p>
<p>Mas, ao mesmo tempo não deixe seu software parado no tempo.</p>
<h2 id="as-duas-grandes-divisões">As duas grandes divisões</h2>
<p>Dentro do mundo de software existem duas grandes divisões <a href="https://roadmap.sh/frontend"><strong><em>frontend</em></strong></a> e <a href="https://roadmap.sh/backend"><strong><em>backend</em></strong></a></p>
<p>E uma parte menor que é <a href="https://roadmap.sh/DevOps"><strong><em>DevOps</em></strong></a>.</p>
<p>Este post, em especifico é sobre frontend e backend.</p>
<p>Assuma que que DevOps você pode contratar outros SaaS em vez de implementar você mesmo.</p>
<h3 id="frontend">FrontEnd</h3>
<p>Para o <strong><em>Frontend</em></strong> precisamos atingir o máximo de plataformas sozinho com uma interface moderna possa atingir:</p>
<ul>
<li><strong>Desktop</strong></li>
<li><strong>Web</strong></li>
<li><strong>Mobile</strong></li>
</ul>
<p>Além disso, é preferencial que seguirmos técnicas de design como:</p>
<ul>
<li><a href="https://www.alura.com.br/artigos/online-offline-first">Offline-First</a></li>
<li><a href="https://conteudodigitall.com.br/glossario/o-que-e-mobile-first-entenda-a-importancia/">Mobile-First</a></li>
</ul>
<p>Com isso, temos uma base boa para ter um software que não fica irritante com o tempo.</p>
<p>No geral, use <a href="https://flutter.dev/"><strong><em>Flutter</em></strong></a> para evitar ter que lidar com diversas plataformas manualmente.</p>
<h3 id="backend">BackEnd</h3>
<p>Para começar, precisamos entender do que é importante no backend de um SaaS.</p>
<p>Nada mais importante do que usar um <a href="https://blog.somostera.com/desenvolvimento-web/o-que-eframework">framework</a> maduro.</p>
<p>E no caso, pessoalmente falando, o melhor que temos é o <a href="https://rubyonrails.org/">Ruby On Rails</a> e veja que podemos migrar de <a href="https://www.ruby-lang.org/pt/"><strong><em>Ruby</em></strong></a> para <a href="https://www.jruby.org/"><strong><em>JRuby</em></strong></a> garantindo que a aplicação pode escalar se e somente se for necessário.</p>
<p>Adote testes como dogma literalmente, teste tudo, se tiver erro gere um teste, se tiver um bug teste, se tiver uma vulnerabilidade teste também.</p>
<p>Coloque:</p>
<ul>
<li><a href="https://github.com/rack/rack-attack"><strong><em>Rack Attack</em></strong></a></li>
<li><a href="https://github.com/presidentbeef/brakeman"><strong><em>Brakeman</em></strong></a></li>
<li><a href="https://github.com/teamcapybara/capybara"><strong><em>Capybara</em></strong></a></li>
<li><a href="https://github.com/flyerhzm/bullet"><strong><em>Bullet</em></strong></a></li>
<li><a href="https://github.com/MiniProfiler/rack-mini-profiler"><strong><em>Rack Mini Profiler</em></strong></a></li>
</ul>
<p>Veja que a ideia principal é que as libs do rails são maduras e testadas facilmente acopladas e no geral é muito melhor do que depender de si mesmo que só na cabeça vai querer inventar procedimentos de segurança que vai fazer pagar fortunas em indenizações.</p>
<p>Vide <a href="https://canaltech.com.br/seguranca/sapphos-tinder-lesbico-do-brasil-tem-falha-de-seguranca-grave-e-e-tirado-do-ar/">Noticia sobre o Saphoos</a>.</p>
<h3 id="devops">DevOps</h3>
<p>Dentro de seu <a href="https://www.portalinsights.com.br/perguntas-frequentes/o-que-e-startup-SaaS"><strong><em>Software as Service</em></strong></a>.</p>
<p>Você quer evitar ao máximo problemas de responsabilidade fiscal.</p>
<p>Então a coisa mais inteligente a se fazer é se mover de <a href="https://blog.engeman.com.br/diferencas-entre-capex-e-opex">capex (investimento na própria infra) para opex (contrato de serviços externos)</a>.</p>
<p>Use serviços como <a href="https://www.papertrail.com/solution/aws-logging/">paper-trail</a>, use a <a href="https://aws.amazon.com/pt/">amazon-web-service</a> &hellip;</p>
<p>O software continua sendo sua responsabilidade mas, problemas internos de servidores gerenciados por provedores não recaem diretamente sobre você, reduzindo riscos e permitindo focar no desenvolvimento.</p>
<p>Contrate <a href="https://www.malwarebytes.com/pt-br/cybersecurity/basics/what-is-ethical-hacking">Hackers Ético</a> e faça testes de segurança, corrija brechas periodicamente.</p>
<h2 id="conclusão">Conclusão</h2>
<p>No geral, a combinação ideal seria usar um <strong><em>backend</em></strong> em rails e um <strong><em>frontend</em></strong> em flutter.</p>
<p>Para ter diversas plataformas e um backend sólido, caso precise de algo customizado, use um microsserviço da forma que achar melhor contanto que haja contratos fortes e testes.</p>
<p>Jamais esqueça os testes.</p>
]]></content:encoded><category>programming</category><category>development</category><category>solo-dev</category><category>SaaS</category><category>ruby</category><category>flutter</category><category>go</category><category>javascript</category></item><item><title>Osdev: Até onde dá para usar c++</title><link>https://foxtechworld.github.io/osdev-at%C3%A9-onde-d%C3%A1-para-usar-c/</link><guid isPermaLink="true">https://foxtechworld.github.io/osdev-at%C3%A9-onde-d%C3%A1-para-usar-c/</guid><pubDate>Mon, 22 Sep 2025 15:33:40 GMT</pubDate><description>&lt;p&gt;Estou desenvolvendo um &lt;a href="https://pt.wikipedia.org/wiki/N%C3%BAcleo_(sistema_operacional)"&gt;kernel&lt;/a&gt; chamado &lt;a href="https://github.com/KitsuneBSD/FKernel"&gt;FKernel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para uso desktop em código x86_64.&lt;/p&gt;
&lt;p&gt;E lendo sobre algumas linguagens como &lt;strong&gt;&lt;em&gt;Rust&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;C&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;C++&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Zig&lt;/em&gt;&lt;/strong&gt; &amp;hellip;&lt;/p&gt;
&lt;p&gt;Decidi fazer uma combinação de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linguagens de Programação:
&lt;ul&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linguagem de montagem:
&lt;ul&gt;
&lt;li&gt;Nasm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obviamente alguns podem estranhar já que eu propositalmente ignorei Rust, e aquelas que são considerados &amp;ldquo;memory-safe&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="porque-não-usar-linguagens-memory-safe"&gt;Porque não usar linguagens memory-safe?&lt;/h2&gt;
&lt;p&gt;Pro Tip: Não existe linguagem memory-safe em baixo nível. Para programar um kernel ou similar, você vai depender do unsafe então nem tenta.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Estou desenvolvendo um <a href="https://pt.wikipedia.org/wiki/N%C3%BAcleo_(sistema_operacional)">kernel</a> chamado <a href="https://github.com/KitsuneBSD/FKernel">FKernel</a>.</p>
<p>Para uso desktop em código x86_64.</p>
<p>E lendo sobre algumas linguagens como <strong><em>Rust</em></strong>, <strong><em>C</em></strong>, <strong><em>C++</em></strong>, <strong><em>Zig</em></strong> &hellip;</p>
<p>Decidi fazer uma combinação de:</p>
<ul>
<li>Linguagens de Programação:
<ul>
<li>C</li>
<li>C++</li>
</ul>
</li>
<li>Linguagem de montagem:
<ul>
<li>Nasm</li>
</ul>
</li>
</ul>
<p>Obviamente alguns podem estranhar já que eu propositalmente ignorei Rust, e aquelas que são considerados &ldquo;memory-safe&rdquo;.</p>
<h2 id="porque-não-usar-linguagens-memory-safe">Porque não usar linguagens memory-safe?</h2>
<p>Pro Tip: Não existe linguagem memory-safe em baixo nível. Para programar um kernel ou similar, você vai depender do unsafe então nem tenta.</p>
<p>Se for para ter que lidar com sintaxes estranhas para programar um kernel, eu prefiro seguir no bom e velho C/C++.</p>
<p>Também não quero fazer um overflow de logs de um compilador super-nanny para chegar a um subset daquilo que eu queria no meu código.</p>
<h2 id="e-porque-c">E porque C++?</h2>
<p>Muito tempo atrás Linus Torvalds havia tentado escrever um kernel com a versão de sua época.</p>
<blockquote>
<p>C++ leads to really, really bad design choices. You invariably start using the STL, boost, and other total and utter crap…</p>
</blockquote>
<p>Ok, podemos concordar em algumas partes mas, isso não seria inevitavelmente ruim.</p>
<p>Sim, C++ tem um monte de coisa, mas fugiria do ponto principal que é C++ dá contratos que structs sozinhas dificilmente conseguem.</p>
<p>Pegue um exemplo do <code>SerenityOS</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c++" data-lang="c++"><span style="display:flex;"><span><span style="color:#66d9ef">static</span> ErrorOr<span style="color:#f92672">&lt;</span>NonnullOwnPtr<span style="color:#f92672">&lt;</span>KBuffer<span style="color:#f92672">&gt;&gt;</span> try_create_with_size(StringView name,
</span></span><span style="display:flex;"><span>size_t size,
</span></span><span style="display:flex;"><span>Memory<span style="color:#f92672">::</span>Region<span style="color:#f92672">::</span>Access access <span style="color:#f92672">=</span> Memory<span style="color:#f92672">::</span>Region<span style="color:#f92672">::</span>Access<span style="color:#f92672">::</span>ReadWrite,
</span></span><span style="display:flex;"><span>AllocationStrategy strategy <span style="color:#f92672">=</span> AllocationStrategy<span style="color:#f92672">::</span>Reserve){
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">auto</span> rounded_size <span style="color:#f92672">=</span> TRY(Memory<span style="color:#f92672">::</span>page_round_up(size));
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">auto</span> region <span style="color:#f92672">=</span> TRY(MM.allocate_kernel_region(rounded_size, name, access, strategy));
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">TRY</span>(adopt_nonnull_own_or_enomem(<span style="color:#66d9ef">new</span> (nothrow) KBuffer { size, move(region) }));
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Consegue entender o que esse código faz? Todo esse contrato engloba em poucas linhas</p>
<blockquote>
<p>Essa função try_create_with_size serve para criar um buffer de memória no kernel de um tamanho específico e lidar com possíveis erros de forma segura.</p>
</blockquote>
<p>Para termos o equivalente exato em C garantindo a mesma segurança seria necessária escrever dessa forma.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-C" data-lang="C"><span style="display:flex;"><span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">try_create_with_size</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span><span style="color:#f92672">*</span> name,
</span></span><span style="display:flex;"><span>                         <span style="color:#66d9ef">size_t</span> size,
</span></span><span style="display:flex;"><span>                         MemoryAccess access,
</span></span><span style="display:flex;"><span>                         AllocationStrategy strategy,
</span></span><span style="display:flex;"><span>                         KBuffer<span style="color:#f92672">**</span> out_buffer) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>out_buffer) <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">size_t</span> rounded_size;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">int</span> rc <span style="color:#f92672">=</span> <span style="color:#a6e22e">page_round_up</span>(size, <span style="color:#f92672">&amp;</span>rounded_size);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (rc <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>) <span style="color:#66d9ef">return</span> rc;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    MemoryRegion<span style="color:#f92672">*</span> region;
</span></span><span style="display:flex;"><span>    rc <span style="color:#f92672">=</span> <span style="color:#a6e22e">allocate_kernel_region</span>(rounded_size, name, access, strategy, <span style="color:#f92672">&amp;</span>region);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (rc <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>) <span style="color:#66d9ef">return</span> rc;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    KBuffer<span style="color:#f92672">*</span> buffer <span style="color:#f92672">=</span> <span style="color:#a6e22e">malloc</span>(<span style="color:#66d9ef">sizeof</span>(KBuffer));
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>buffer) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">free</span>(region<span style="color:#f92672">-&gt;</span>addr);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">free</span>(region);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span>ENOMEM;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    buffer<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> size;
</span></span><span style="display:flex;"><span>    buffer<span style="color:#f92672">-&gt;</span>region <span style="color:#f92672">=</span> region;
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">*</span>out_buffer <span style="color:#f92672">=</span> buffer;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>; <span style="color:#75715e">// sucesso
</span></span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Ok, tivemos uma disparidade no tamanho, mas isso não significa nada no geral.</p>
<p>Meu ponto defendido é que precisamos fazer muito mais código, que vai ser muito mais performático mas que vai resultar em um resultado muito menos seguro, e muito menos reusável no geral.</p>
<p>Não ironicamente, muitos empresas incluindo a própria Apple usam o C++ em seus kernels.</p>
<p>Mas não precisa ser o c++ inteiro e sim um subset chamado <a href="https://en.wikipedia.org/wiki/Embedded_C%2B%2B"><strong><em>embedded c++</em></strong></a>.</p>
<h3 id="implementação-do-iokit">Implementação do IOKit</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c++" data-lang="c++"><span style="display:flex;"><span><span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * This file contains Original Code and/or Modifications of Original Code
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * as defined in and that are subject to the Apple Public Source License
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Version 2.0 (the &#39;License&#39;). You may not use this file except in
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * compliance with the License. The rights granted to you under the License
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * may not be used to create, or enable the creation or redistribution of,
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * unlawful or unlicensed copies of an Apple operating system, or to
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * circumvent, violate, or enable the circumvention or violation of, any
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * terms of an Apple operating system software license agreement.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Please obtain a copy of the License at
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * http://www.opensource.apple.com/apsl/ and read it before using this file.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * The Original Code and all software distributed under the License are
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * distributed on an &#39;AS IS&#39; basis, WITHOUT WARRANTY OF ANY KIND, EITHER
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Please see the License for the specific language governing rights and
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * limitations under the License.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> */</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#ifndef _IOKIT_IONVRAMCONTROLLER_H
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#define _IOKIT_IONVRAMCONTROLLER_H
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;IOKit/IOService.h&gt;</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">IONVRAMController</span> <span style="color:#f92672">:</span> <span style="color:#66d9ef">public</span> IOService
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	OSDeclareAbstractStructors(IONVRAMController);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> <span style="color:#66d9ef">void</span> registerService(IOOptionBits options <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>) APPLE_KEXT_OVERRIDE;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">sync</span>(<span style="color:#66d9ef">void</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> IOReturn <span style="color:#a6e22e">select</span>(<span style="color:#66d9ef">uint32_t</span> bank);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> IOReturn <span style="color:#a6e22e">eraseBank</span>(<span style="color:#66d9ef">void</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> IOReturn <span style="color:#a6e22e">read</span>(IOByteCount offset, UInt8 <span style="color:#f92672">*</span>buffer,
</span></span><span style="display:flex;"><span>	    IOByteCount length) <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">virtual</span> IOReturn <span style="color:#a6e22e">write</span>(IOByteCount offset, UInt8 <span style="color:#f92672">*</span>buffer,
</span></span><span style="display:flex;"><span>	    IOByteCount length) <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#endif </span><span style="color:#75715e">/* !_IOKIT_IONVRAMCONTROLLER_H */</span><span style="color:#75715e">
</span></span></span></code></pre></div><p>Quem diria.</p>
<p>Se fossemos falar do C++ antes da versão 17, eu até concordaria mas após a versão 17 muita coisa mudou.</p>
<p>E veja que o IOKit é implementado na forma Embedded C++.</p>
<p>Mas, e como em tudo há um mas, há em real,o ponto da STL que invariavelmente você vai acabar usando ou não.</p>
<h3 id="realmente-preciso-do-stl">Realmente preciso do STL?</h3>
<p>No fringir dos ovos há um outro superset de C++ chamado <a href="https://terminalroot.com.br/2023/07/conheca-o-cpp-ortodoxo.html"><strong><em>c++ ortodoxo</em></strong></a> jamais o use, sério.</p>
<p>Uma das soluções que o FKernel e o SerenityOS fazem é criar sua própria STL.</p>
<p>O SerenityOS com sua <strong>Abstraction Kit</strong>.
E o FKernel com seu <strong>LibFK</strong>.</p>
<p>Usar uma STL não é de todo mal, há diversos efeitos, como otimização em cascata.</p>
<p>Genericos e todo resto.</p>
<h2 id="e-no-fim">E no fim?</h2>
<p>No fim, depende de você.</p>
<p>Se você está desenvolvendo um app para desktop.</p>
<p>Eu sugeriria:</p>
<ul>
<li><a href="https://pt.wikipedia.org/wiki/D_(linguagem_de_programa%C3%A7%C3%A3o)">D</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Go_(linguagem_de_programa%C3%A7%C3%A3o)">Go</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Zig_(linguagem_de_programa%C3%A7%C3%A3o)">Zig</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Rust_(linguagem_de_programa%C3%A7%C3%A3o)">Rust</a></li>
</ul>
<p>Para baixo nível certamente eu sugeriria:</p>
<ul>
<li><a href="https://pt.wikipedia.org/wiki/B_(linguagem_de_programa%C3%A7%C3%A3o)">B</a></li>
<li><a href="https://pt.wikipedia.org/wiki/C_(linguagem_de_programa%C3%A7%C3%A3o)">C</a>,</li>
<li><a href="https://pt.wikipedia.org/wiki/C%2B%2B">C++</a></li>
<li><a href="https://pt.wikipedia.org/wiki/D_(linguagem_de_programa%C3%A7%C3%A3o)">D</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Rust_(linguagem_de_programa%C3%A7%C3%A3o)">Rust</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Zig_(linguagem_de_programa%C3%A7%C3%A3o)">Zig</a></li>
</ul>
<p>Mas em kernel estou muito mais satisfeito com minha escolha do que usar C puro.</p>
<p>Não que eu não use C obviamente, por baixo dos panos da LibFK eu implementei uma LibC bem simples com funções que eu teria que usar dentro do FKernel para algumas funções da LibFK.</p>
<p>Mas enfim, se uma linguagem que você prefere usar por algum motivo de design ou simplesmente por ser a que você sabe, simplesmente use.</p>
<p>Desde que não seja usar algo interpretado para fazer baixo nível, tá valendo tudo.</p>
]]></content:encoded><category>osdev</category><category>c++</category><category>cpp</category><category>kernel</category><category>linux</category><category>windows</category><category>macosx</category></item><item><title>Opinião: Brasil a grande várzea</title><link>https://foxtechworld.github.io/opini%C3%A3o-brasil-a-grande-v%C3%A1rzea/</link><guid isPermaLink="true">https://foxtechworld.github.io/opini%C3%A3o-brasil-a-grande-v%C3%A1rzea/</guid><pubDate>Fri, 19 Sep 2025 12:16:04 GMT</pubDate><description>&lt;p&gt;Até queria fazer um post recomendando mangás, manhwas&amp;hellip; mas, dado os eventos recentes.&lt;/p&gt;
&lt;p&gt;Ocorrendo no inferno moderno a.k.a X, resolvi vir para cá reclamar para um cacete.&lt;/p&gt;
&lt;p&gt;Já aviso que vai ter muita generalização aqui, é muito mais fácil juntar tudo do que contar parte por parte separado.&lt;/p&gt;
&lt;h1 id="a-grande-burrada"&gt;A grande burrada&lt;/h1&gt;
&lt;p&gt;Politicamente o mundo está um inferno real, não falo de alguns ou outros países mas, de todo mundo globalizado.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Até queria fazer um post recomendando mangás, manhwas&hellip; mas, dado os eventos recentes.</p>
<p>Ocorrendo no inferno moderno a.k.a X, resolvi vir para cá reclamar para um cacete.</p>
<p>Já aviso que vai ter muita generalização aqui, é muito mais fácil juntar tudo do que contar parte por parte separado.</p>
<h1 id="a-grande-burrada">A grande burrada</h1>
<p>Politicamente o mundo está um inferno real, não falo de alguns ou outros países mas, de todo mundo globalizado.</p>
<p>Eu já havia detectado alguns traços de que o mundo estava se tornando <a href="https://mundoeducacao.uol.com.br/filosofia/niilismo.htm"><strong>niilista</strong></a>. Mas, isso está pior do que poderia estar e dessa vez eu atribuo a culpa a <strong>amathia</strong>.</p>
<blockquote>
<p>Segundo Sócrates, Amathia (a ignorância) é o único mal.</p>
</blockquote>
<p>E não, não estou chamando nenhum espectro de ignorante em si. Mas, a população que está ocupando os espectros estão em condição de fanatismo.</p>
<h2 id="o-que-são-esquerda-e-direita">O que são esquerda e direita?</h2>
<p>Antes de tudo é bom contextualizar um pouco sobre.</p>
<p>Durante a revolução francesa (1789  -  1799) a população precisou de juntar na Convenção nacional.</p>
<p>Os que apoiavam o rei se sentaram a direita do presidente da assembleia, aqueles que defendiam mudanças radicais e nova ordem se sentavam a esquerda.</p>
<p>Não inesperado, muita coisa mudou daquele tempo para cá. Mas uma caracteristica da revolução se manteve:</p>
<ul>
<li>Direita continua sendo sobre manter o status quo, a preservação das tradições e da ordem social existente.</li>
<li>Esquerda continua sendo aqueles que lutam pelas mudanças sociais, economicas e/ou politicas.</li>
</ul>
<p>Até aqui, como pudemos ver nada de amoral/imoral ou moral em um lado e outro.</p>
<p>Capitalismo/Comunismo nem deveriam entrar aqui porque seria <a href="https://www.dicio.com.br/anacronico/"><em><strong>anacrônico</strong></em></a>.</p>
<h3 id="o-fanatismo">O fanatismo</h3>
<p>O ponto é, o certo seriam ambos os lados serem educados uns com outros, nem estou falando de respeito.</p>
<p>Porém educação. Mas, ambos os lados políticos no mundo inteiro parece que viraram o cú para lua esperando cair uma chuva de pica.</p>
<p>Eles parecem que querem ser os donos da <strong>moral</strong>.</p>
<p>Ou seja, demonizaram o seu espectro oposto porque segundo eles <strong>é o time que mais mata</strong>.</p>
<p>Primeiramente é um absurdo usar mortes de pessoas como argumento moral sobre politica.</p>
<p>Se alguém foi assassinado, o assassino é um doente que nem em sociedade deveria estar.</p>
<p>Sem meias palavras até aqui.</p>
<p>O problema é que hoje em dia estamos olhando o espectro politico da coisa, chorando quando é o nosso, rindo quando é do outro.</p>
<p>Ok! No cú dos outros pimenta é refresco, mas, já pararam para olhar fora do ponto de vista político? não consegue neh?</p>
<h3 id="é-trabalho-caralho">É trabalho! CARALHO</h3>
<p>Só porque um personagem político de direita se junta a de esquerda para entregar um projeto ou fazer uma votação na câmara não significa que ele trocou de lado político.</p>
<p>Pode parecer raro mas existe uma coisa chamado convergência de ideias.</p>
<p>Dois lados opostos podem concordar em algo, não sempre.</p>
<p>Mas, podem concordar.</p>
<p>Como por exemplo, na PEC da blindagem.</p>
<p>A maioria dos de esquerda e direita votando a favor quando deveriam votar contra.</p>
<h3 id="e-ninguém-liga-para-nada">E ninguém liga para nada</h3>
<p>E tu que vai se fuder, principalmente quando tem eleição.</p>
<p>Candidato do partido A é de esquerda
Candidato do partido B é de direita
Candidato do partido C é de esquerda
Candidato do partido D é de direita</p>
<p>Ai fica definido que os partidos A e D são os que seriam mais votados porém você é a favor do partido C ou B.</p>
<p>Em vez de votar no partido que concorda com suas ideias vai votar no A ou no D na tentativa de evitar que o partido oposto ganhe.</p>
<p>Virou rinha de galo nesse caralho?</p>
<p>Hoje em dia a gente chama direita tem diversos Sub-rótulos Ideológicos:</p>
<ul>
<li>Agrarismo</li>
<li>Anarquismo</li>
<li>Democracia cristã</li>
<li>Comunismo</li>
<li>Conservadorismo</li>
<li>Ambientalismo</li>
<li>Fascismo</li>
<li>Feminismo</li>
<li>Política verde</li>
<li>Hindutva</li>
<li>Islamismo</li>
<li>Liberalismo</li>
<li>Libertarismo</li>
<li>Monarquismo</li>
<li>Nacionalismo</li>
<li>Populismo</li>
<li>Progressismo</li>
<li>Radicalismo clássico</li>
<li>Republicanismo</li>
<li>Social democracia</li>
<li>Socialismo</li>
<li>Sincretismo</li>
<li>Terceira Via</li>
</ul>
<p>E isso quando a gente não olha para as propostas individuais.</p>
<h2 id="o-desespero">O desespero</h2>
<p>Enfim, não tenho nenhuma intenção ou motivo para tentar te convencer de algo.</p>
<p>Provavelmente esse post vai ser esquecido e jogado em um canto mofado.</p>
<p>Também não estou defendendo nenhum lado politico.</p>
<p>Mas quero manter um pouco de lúcidez enquanto vejo esse titanic desabando, por favor tragam a banda.</p>
<p>Enfim, para mim e para o resto do mundo só basta aguardar o terceiro colapso social.</p>
<h3 id="colapso-social">Colapso Social?</h3>
<p>Ok, antes de terminar esse post vou mostrar um pouco das minhas previsões para o futuro próximo.</p>
<p>Antes o disclaimer</p>
<blockquote>
<p>Toda previsão é um chute, a única forma de acertar 100% é prever depois do ocorrido.</p>
<p>E outra, não existe previsão de profécia, é chute. Se alguém fala que uma profecia está ocorrendo, ela está errada até se concretizar.</p>
</blockquote>
<p>Enfim, da mesma forma que na economia, eu acredito que exista uma correção na própria <a href="https://brasilescola.uol.com.br/geografia/globalizacao.htm">globalização</a>. Que por algum acaso começou com a <a href="https://www.todamateria.com.br/revolucao-industrial/">revolução industrial</a>.</p>
<p>As guerras mundiais 1ª e 2ª são uma forma de correção que é engatilhado pelo próprio <a href="https://maestrovirtuale.com/o-que-e-tribalismo-analisando-esse-fenomeno-social/">tribalismo</a>.</p>
<p>Veja que tribalismo não é algo anormal em animais sociais.</p>
<p>E se resume praticamente no nós contra eles.</p>
<p>O mundo em si parece novamente estar se dividindo em blocos economicos, e se divergindo cada vez mais. Espero que o próximo colapso não seja outra guerra mundial.</p>
<p>Mas, é mais provável, que ocorra um evento <a href="https://www.megacurioso.com.br/ciencia/115982-utopia-dos-ratos-experimento-previu-a-extincao-da-humanidade-.htm">universo 25</a> não ironicamente no ocidente estamos na fase final da utópia dos ratos.</p>
<p>Então, ou entramos em extinção silenciosa, ou entramos em guerra.</p>
<p>O futuro é medonho.</p>
<p>Enfim, espero que tenha gostado deste post, muito obrigado.</p>
]]></content:encoded><category>opinião</category><category>politica</category><category>brasil</category><category>futuro</category><category>passado</category><category>esquerda</category><category>direita</category></item><item><title>Opinião: Não tenha crianças sem antes pensar nisso</title><link>https://foxtechworld.github.io/opini%C3%A3o-n%C3%A3o-tenha-crian%C3%A7as-sem-antes-pensar-nisso/</link><guid isPermaLink="true">https://foxtechworld.github.io/opini%C3%A3o-n%C3%A3o-tenha-crian%C3%A7as-sem-antes-pensar-nisso/</guid><pubDate>Wed, 17 Sep 2025 14:09:04 GMT</pubDate><description>&lt;p&gt;Salve pessoal, dessa vez decidi sair um pouco do mundo da programação e colocar um pouco de opinião baseada em dados sobre psicologia e antropologia relacionado em como criar crianças.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Inicialmente, eu gostaria de dizer que isso é um post de opinião e que qualquer decisão tomada é exclusivamente baseada na sua decisão como pai. Ou seja, leia isso com uma quantidade saudável de sal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="seres-humanos-no-geral-não-são-racionais"&gt;Seres Humanos no Geral não são racionais&lt;/h1&gt;
&lt;p&gt;Todo esse post no geral vem com essa máxima.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Salve pessoal, dessa vez decidi sair um pouco do mundo da programação e colocar um pouco de opinião baseada em dados sobre psicologia e antropologia relacionado em como criar crianças.</p>
<blockquote>
<p>Inicialmente, eu gostaria de dizer que isso é um post de opinião e que qualquer decisão tomada é exclusivamente baseada na sua decisão como pai. Ou seja, leia isso com uma quantidade saudável de sal.</p>
</blockquote>
<h1 id="seres-humanos-no-geral-não-são-racionais">Seres Humanos no Geral não são racionais</h1>
<p>Todo esse post no geral vem com essa máxima.</p>
<p>Isso não é uma negação da racionalidade e sim que a maioria das decisões tomadas também são instintos, que de mesma forma são condicionados.</p>
<p>Isso é uma parte importante a se dizer porque, coisas como <strong>confiança</strong>, <strong>hierarquia</strong> e &hellip; são formados de duas formas.</p>
<h2 id="confiança">Confiança</h2>
<p>Durante a formação da capacidade racional e com a capacidade racional.</p>
<p>Normalmente, a confiança nos pais é formada antes da capacidade de racionalização e a confiança nos amigos é formada após a formação da racionalização.</p>
<p>Isso nos diz que de alguma forma, na maioria das vezes a confiança nos pais vai ser mais forte.</p>
<p>Até que essa confiança seja quebrada de alguma forma.</p>
<p>Após isso, qualquer confiança formada seria a segunda forma de confiança com racionalização.</p>
<p>A diferença entre ambos é o nível de confiança, um é a confiança incondicional enquanto o outro é a confiança com cautela.</p>
<h2 id="hierarquia">Hierarquia</h2>
<p>O mais importante de se tornar pai, é se tornar o topo da hierarquia.</p>
<p>Na visão de que você vai guiar uma versão menor de si mesmo a conseguir sobreviver nesse mundo.</p>
<p>Isso também significa que todos os problemas vão em sua direção, os seus ou o de seu filho.</p>
<p>E como já dito previamente, muitas das coisas da paternidade são desenvolvidos na primeira infância, isso também diz sobre a hierarquia.</p>
<p>A quem os problemas devem ir quando aparecerem.</p>
<p>E é uma discussão muito importante a se resolver.</p>
<p>Muitas vezes, mesmo na primeira infância essa <strong>hierarquia</strong> vai ser desafiada.</p>
<p>O pai pode dizer não, enquanto a cria vai na mãe fazer a mesma pergunta para ver se a resposta é diferente.</p>
<p>Esse tipo de coisa mostra ao filho, quem tem a resposta mais mansa e a quem ele deve ir para ter o que quer.</p>
<h1 id="como-isso-se-relaciona-a-educação">Como isso se relaciona a educação</h1>
<p>Escapando um pouco da discussão qual a melhor.</p>
<blockquote>
<p><strong>Opinião pessoal:</strong> Prefiro a tradicional</p>
</blockquote>
<p>Todas se relacionam com o nível de autoridade que o pai tem em relação a seu filho.</p>
<p>Na tradicional, o pai assume papel mais autoritário em relação ao filho.</p>
<p>Na positiva, o pai assume um papel mais manipulativo em relação ao filho.</p>
<p>Dando uma dualidade de opções e pedindo pro filho escolher qual lhe agrada melhor.</p>
<blockquote>
<p><strong>Exemplo</strong>
Você prefere guardar os brinquedos e tomar banho ou tomar banho e ir dormir?</p>
</blockquote>
<p>Já a permissiva é um nome mais bonito para <em>indulgente</em>.</p>
<p>No geral, a educação permissiva parte da premissa que você vai dar total autonomia para um incapaz se virar, acatando todas as ordens e regras dele.</p>
<h2 id="porque-eu-prefiro-a-educação-tradicional">Porque eu prefiro a educação tradicional</h2>
<p>No simples e no grosso, porque é mais simples.</p>
<p>Só que não posso afirmar que é exatamente a educação tradicional também.</p>
<p>É a educação tradicional quando aplicada a alguém que tem 10 anos ou mais. Menos que isso, a abordagem tem que ser mudada.</p>
<h3 id="e-o-que-mudamos">E o que mudamos?</h3>
<p>1º <strong>Frustre muito a criança</strong></p>
<p>É meio cruel mas, com isso vem a oportunidade de trabalhar a educação e o controle emocional.</p>
<blockquote>
<p>Garanto que vai poupar grana quando o salário chegar e você precisar ir com ela no supermercado.</p>
<p><strong>Opcional:</strong> Você não tem a necessidade real de fazer isso, se quiser manter a criança em casa.
Este tipo de aprendizado a vida vai ensinar de qualquer forma.</p>
</blockquote>
<ol start="2">
<li><strong>Nada de telas até 8/10 anos</strong></li>
</ol>
<p>Esse entra em contato direto com o 1º.</p>
<p>Muitos dos problemas da paternidade moderno é calar a frustração com as telas em vídeos que são muito mais informativos do que os programas de antigamente.</p>
<p>Fluxos mais rápidos, dialogos complexos e informação audiovisual muito mais animada.</p>
<p>Ao tirar a tela, você volta com o dobro da frustração inicial e isso vai acarretar numa série de problemas como o próprio imediatismo.</p>
<p>3º <strong>Celulares são importantes, compre um para seu filho</strong></p>
<p>Não tem como fugir disso, celulares ainda são importantes e seu filho desde pequeno tem que saber usar um.</p>
<p>Mas você como pai se esquece de uma coisa, você não precisa entregar um smartphone.</p>
<p>Um bom e velho dumbphone com tecla e de preferência sem jogos ou outros distrativos é uma recomendação muito melhor do que um Samsung Galaxy S24, Google Z-Fold, Iphone &hellip; etc.</p>
<h1 id="a-menor-idade-já-passou-o-que-fazer-durante-a-pré-adolecênciaadolecência">A menor idade já passou, o que fazer durante a pré-adolecência/adolecência</h1>
<p>Comece respirando fundo, essa é a melhor/pior idade para você e para seu filho, sem sombras de dúvidas.</p>
<p>Então, vamos começar com o liberar algumas coisas.</p>
<p>Primeiro, liberar seu filho para ter um celular decente é um bom começo mas, não faça isso por fazer ou para comemorar algo.</p>
<p>Faça na forma de uma recompensa por ele resolver um problema que você não pediu mas, mesmo assim ele decidiu ajudar.</p>
<p>Não significa dar o top tier, nem um pro, nem mesmo algo caro.</p>
<p>Talvez 1 ou 2 gerações anteriores de preferência.</p>
<p>Além disso, siga uma progressão na lista de coisas a se fazer dentro de casa.</p>
<p>Como por exemplo, ajudar a limpar e tudo mais. Não tudo de uma vez, uma responsabilidade por vez.</p>
<p>E outra, acompanhar seu filho com o <a href="https://familylink.google.com/"><strong>family link</strong></a> é crucial.</p>
<p>E apesar da <a href="https://g1.globo.com/economia/tecnologia/noticia/2018/09/24/o-polemico-app-do-google-que-permite-que-pais-monitorem-crianca-em-tempo-real.ghtml">maioria das críticas</a> que o app tem. É super necessário, que você acompanhe o que seu filho faz online.</p>
<p>Apesar de que, tudo vai depender da sua capacidade como pai não ser super-protetor.</p>
<blockquote>
<p>Você como pai que já conhece o mundo e sabe quão pobre ele é, deve deixar seu filho rolar um pouquinho no barro, se sujar bastante e tentar se lavar.</p>
<p>Este é a verdadeira paternidade, criar seu filho para que no momento de dificuldade ele ter certeza que pode procura - lo.</p>
</blockquote>
<p>Assim dito, o ponto mais importante é você como pai deve enforçar algumas coisas:</p>
<ul>
<li>Leitura</li>
<li>Esportes</li>
<li>Artes Marciais</li>
<li>Hobbies</li>
</ul>
<p>Religião é meio complicado, apesar de ser <strong>cristão</strong> e <strong>católico</strong> eu não acredito em batizar meu filho até pelo menos ele por conta própria decidir seguir minha fé ou não.</p>
<p>Não significa não leva - lo a igreja mas, respeitar a decisão de fé do mesmo. Se, e somente se ele decidir que quer seguir minha fé ai sim, eu acredito que o batismo deve ser feito.</p>
<p>E antes de qualquer dúvida razoável, eu já afirmo de primeira.</p>
<blockquote>
<p>O <strong>Batismo</strong> é o sacramento mais importante da igreja cristã. Valendo para os ortodoxos, protestantes ou os católicos em geral.</p>
<p>Seria muito desrespeitoso da minha parte, colocar meu filho a ser batizado sem sua escolha. Para definir sua fé antes que de sua própria vontade, ele também a expresse.</p>
</blockquote>
<h2 id="escolaridade">Escolaridade</h2>
<p>Não tem muito o que fazer aqui, a educação é a parte mais importante do desenvolvimento de uma criança e adolescente.</p>
<p>O problema é quando correlacionamos a educação a uma motivação extrinseca e logo ela perde o sentido.</p>
<p>Seria interessante pelo menos no mínimo, você como pai, mostrar os pontos mais interessantes da educação.</p>
<p>Para ele se tornar um <strong>nerd clássico</strong>, um verdadeiro <strong>nérdico</strong>.</p>
<p>Não vou falar que é porque a educação é importante, principalmente não no Brasil.</p>
<p>Mas, ela é um recurso de conhecimento que abre portas.</p>
<p>Qualquer desejo que um pessoa tenha, pode ser resolvido com o conhecimento, que vai ser adquirido com a educação.</p>
<p>Seja formal, seja autodidata.</p>
<p>E tem mais, por mais que a educação formal no Brasil seja sucateada, ela ainda te dá uma coisa que nenhuma outra te dá.</p>
<p>Um papel dizendo <strong>aprovado</strong>.</p>
<p>Esse papel reduz a dificuldade de ganhar um emprego com salário razoável, então vale a pena tentar.</p>
<h2 id="responsabilidade">Responsabilidade</h2>
<p>Como neste ponto, já estamos falando de adolescentes. podemos dizer que a partir daqui, seu filho já pode começar a ser responsabilizado pelos atos sociais ou pela bagunça feita.</p>
<p>Faça um tipo de <strong>sistema penal</strong> mais leve com possíveis consequências em atos não desejáveis.</p>
<p>A ideia é não ser duro mas ser justo como na vida real.</p>
<p>Além disso, ensinar o que &ldquo;direito ao contrário&rdquo; e o &ldquo;direito a defesa&rdquo; aparece aqui.</p>
<p>Interessante seria &ldquo;simular um julgamento&rdquo;.</p>
<h1 id="conclusão">Conclusão</h1>
<p>Esses são alguns dos meus pensamentos sobre filhos, e como criar eles, coisas a mais, coisas a menos, é sempre importante ter esse tipo de coisa em mente.</p>
<p>Obviamente cada criação é única. E a que você vai oferecer depende exatamente daquilo que você quer passar.</p>
<h2 id="bibliografia">Bibliografia</h2>
<ul>
<li><a href="https://www.amazon.com.br/R%C3%A1pido-devagar-Daniel-Kahneman/dp/853900383X">Rápido e Devagar: Duas formas de Pensar</a></li>
<li><a href="https://www.amazon.com.br/Teoria-Apego-Fundamentos-Pesquisas-Implica%C3%A7%C3%B5es/dp/8570740115/ref=sr_1_3?adgrpid=78637041982&amp;dib=eyJ2IjoiMSJ9.StdOasvrN1f3Lm8WtD6g7reE4leloRYX_8Qwmq8hWjV9tY-4fifGdTqtCQYPSataO2DIWChaxZV1g7lItAS7ugUq1fKgbcIi0NI26OqBwHT0m8uMMTF5brujiTkZwtd3XAeZMN3OznnFZtbxCzGOUTyHUvZr_pmw61HIfVnEeM-Dy260ohSBQJxOifRoBEXkRniGeO6AAEEeUhxnLmgfi1MNgJm1EvMPT7rA2_fbQfwyQ6ffBMb47VIZp5fA3JjWSOAlBpCKaHVwc70YJ1okpgDn7IOe_bW83JBUErHHyD4.okEzQBW08DjDlPHUJ57P9hyP9AiqQrfCeOhojvOCwSY&amp;dib_tag=se&amp;hvadid=425954655564&amp;hvdev=c&amp;hvlocphy=9074122&amp;hvnetw=g&amp;hvqmt=b&amp;hvrand=3798358303515855803&amp;hvtargid=kwd-803697528883&amp;hydadcr=5658_11235231&amp;keywords=john+bowlby+teoria+do+apego&amp;mcid=af9f2e17577f3e93b8e09e226e06755b&amp;qid=1758139544&amp;sr=8-3&amp;ufe=app_do%3Aamzn1.fos.6d798eae-cadf-45de-946a-f477d47705b9">Teoria do Apego</a></li>
<li><a href="https://www.amazon.com.br/Disciplina-sem-drama-desenvolvimento-comportamento/dp/8584441581/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=2A9QU200SB68V&amp;dib=eyJ2IjoiMSJ9.QJ1tvHilIubTJcFe_835Cecba96-TYp3Ni1FISvRsn8sx0QDzwVLFzfzbqXKr64H.aDMzE-MouDbLP7M-sY6YK-HNutr8EZBUkxa5BNJOG3c&amp;dib_tag=se&amp;keywords=Disciplina+sem+lagrimas&amp;qid=1758139597&amp;sprefix=disciplina+sem+lagrima%2Caps%2C181&amp;sr=8-1&amp;ufe=app_do%3Aamzn1.fos.6d798eae-cadf-45de-946a-f477d47705b9">Disciplina Sem Drama</a></li>
</ul>
]]></content:encoded><category>opinião</category><category>educação</category><category>educação permissiva</category><category>educação positiva</category><category>educação tradicional</category><category>internet</category><category>imediatismo</category><category>mundo moderno</category></item><item><title>Algoritmos em Grafos: Busca em Largura e Busca em profundidade</title><link>https://foxtechworld.github.io/algoritmos-em-grafos-busca-em-largura-e-busca-em-profundidade/</link><guid isPermaLink="true">https://foxtechworld.github.io/algoritmos-em-grafos-busca-em-largura-e-busca-em-profundidade/</guid><pubDate>Mon, 15 Sep 2025 08:24:12 GMT</pubDate><description>&lt;h2 id="o-que-são-grafos"&gt;O que são Grafos?&lt;/h2&gt;
&lt;p&gt;Grafos são um ramo da matemática que estuda &lt;em&gt;relações&lt;/em&gt; entre objetos pertencentes a um determinado conjunto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Você pode pensar por exemplo que $${a, b}$$ é um grafo que leva de a para b.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Historicamente, foi &lt;code&gt;Leonhard Euler&lt;/code&gt;, mesmo criador da identidade de Euler.&lt;/p&gt;
&lt;p&gt;$$E^{i\pi} + 1 = 0$$&lt;/p&gt;
&lt;p&gt;Publicou em 1736 um artigo sobre o problema das sete pontes de Königsberg.&lt;/p&gt;
&lt;p&gt;E este foi considerado o ponto de partida da teoria dos grafos.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="o-que-são-grafos">O que são Grafos?</h2>
<p>Grafos são um ramo da matemática que estuda <em>relações</em> entre objetos pertencentes a um determinado conjunto.</p>
<blockquote>
<p>Você pode pensar por exemplo que $${a, b}$$ é um grafo que leva de a para b.</p>
</blockquote>
<p>Historicamente, foi <code>Leonhard Euler</code>, mesmo criador da identidade de Euler.</p>
<p>$$E^{i\pi} + 1 = 0$$</p>
<p>Publicou em 1736 um artigo sobre o problema das sete pontes de Königsberg.</p>
<p>E este foi considerado o ponto de partida da teoria dos grafos.</p>
<h3 id="onde-grafos-são-usados">Onde grafos são usados?</h3>
<p>Dentro da computação em todo lugar diretamente ou indiretamente.</p>
<ul>
<li>Redes Neurais</li>
<li>Estrutura de árvores</li>
<li>Rede de computadores</li>
<li>Computação Gráfica</li>
<li>Redes Sociais</li>
</ul>
<p>Se precisa de coordenação provavelmente vai ter um grafo incluso.</p>
<p>Fica ainda mais interessante porque <code>Linguagens Formais e Automatos</code>.</p>
<p>Fundamental para a construções de linguagens (programação, regular, marcação).</p>
<p>Também usa grafos como estrutura de representação para automatos e diagramas de transição</p>
<h2 id="algoritmos-de-busca">Algoritmos de Busca</h2>
<p>Como um grafo é formado por relações, contendo ou não um direcionamento.</p>
<p>É necessário sob algum critério percorrer esse grafo.</p>
<p>E para isso temos um problema essencial que precisa ser resolvido.</p>
<h3 id="qual-critério">Qual critério?</h3>
<p>Normalmente ou estamos trabalhando com grafos esparsos ou grafos densos.</p>
<p>Sendo grafos esparsos aqueles que tem poucas arestas em relação ao número de vértices.</p>
<p>E grafos densos aqueles que tem muitas arestas.</p>
<p>Essa caracteristica influência diretamente a escolha do algoritmo de busca mais eficiente.</p>
<p>Os dois algoritmos mais clássicos para essa busca são:</p>
<ul>
<li>(BFS - Breadth First Search): Busca em Largura.</li>
<li>(DFS - Depth First Search): Busca em profundidade.</li>
</ul>
<h2 id="algoritmos">Algoritmos</h2>
<h3 id="busca-em-largura-bfs">Busca em Largura (BFS)</h3>
<p>O algoritmo de busca em largura explora nível por nível.</p>
<p>Ou seja se pensarmos em uma árvore.</p>
<p>Ele verificaria primeiros os vizinhos da raiz.</p>
<p>Depois os vizinhos dos vizinhos da raiz e por assim vai.</p>
<p>Para fazer isso a gente utiliza uma estrutura de dados fila/queue.</p>
<h4 id="propriedades-da-busca-em-largura">Propriedades da busca em largura</h4>
<ul>
<li>
<p>Se existir uma solução, este algoritmo consegue encontrar.</p>
</li>
<li>
<p>Ótimo em arestas unitárias vai encontrar o caminho mais curto em termo de números de passos.</p>
</li>
<li>
<p>Complexidade:</p>
</li>
<li>
<p>Vai ter o tempo de percorrer $$O(V + E)$$ ou seja o tempo para percorrer todos os vertices e arestas.</p>
</li>
<li>
<p>Espaço: $$O(V)$$ porque precisa armazenar a fila e o conjunto de visitados.</p>
</li>
</ul>
<h4 id="lógica-passo-a-passo">Lógica passo a passo</h4>
<ol>
<li>Colocamos um nó na fila, e marcamos como visitado.</li>
<li>Enquanto a fila não estiver vazia:</li>
</ol>
<ul>
<li>Retiramos o primeiro elemento.</li>
<li>Visitamos todos os vizinhos não visitados do nó.</li>
<li>Adicionamos esses vizinhos a fila e marcamos como visitados.</li>
</ul>
<h3 id="busca-em-profundidade">Busca em Profundidade</h3>
<p>A busca em profundidade em comparação explora todo um ramo do grafo até o fim antes de voltar e explorar outros ramos.</p>
<p>Ao contrário da busca em largura, aqui usamos pilha/stack (Last In, First Out).</p>
<h4 id="propriedades-da-busca-em-profundidade">Propriedades da busca em profundidade</h4>
<ul>
<li>
<p>Completo? Em grafos finitos mas, não garante o caminho mais curto em grafos não ponderados.</p>
</li>
<li>
<p>Ótimo? Não, não é adequado quando você precisa do menor número de arestas.</p>
</li>
<li>
<p>Complexidade:</p>
<ul>
<li>Tempo: $$O(V + E)$$</li>
<li>Espaço: $$O(V)$$</li>
</ul>
</li>
<li>
<p>Risco Prático em recursão pode estourar a pilha em grafos muito profundos, prefira uma versão iterativa.</p>
</li>
</ul>
<h4 id="lógica-passo-a-passo-1">Lógica passo a passo</h4>
<ol>
<li>Marca o nó inicial como visitado e entre nele.</li>
<li>Para cada vizinho não visitado, repita o processo.</li>
<li>Quando o nó não tem vizinhos não visitados, realize um backtrack.</li>
<li>Continue até visitar todos os nós alcançáveis.</li>
</ol>
<h3 id="conclusão">Conclusão</h3>
<p>Não existe um algoritmo universalmente “melhor”: tudo depende do objetivo.</p>
<p>BFS (Busca em Largura):</p>
<ul>
<li>
<p>Garante o menor caminho em grafos não ponderados.</p>
</li>
<li>
<p>Mais indicado quando o problema exige a solução mais curta.</p>
</li>
</ul>
<p>DFS (Busca em Profundidade):</p>
<ul>
<li>
<p>Útil para exploração completa, detecção de ciclos, ordenação topológica e backtracking.</p>
</li>
<li>
<p>Mais indicado quando queremos percorrer toda a estrutura ou analisar propriedades do grafo.</p>
</li>
</ul>
<p>Ambos têm mesma complexidade assintótica $$
O(V+E)$$ mas, se aplicam a cenários distintos.</p>
<p>E devem ser tratados com cautela para não escolher a pior opção por puro achismo.</p>
<p>Ademas, espero que tenham gostado do post e valeu</p>
]]></content:encoded><category>Algoritmos</category><category>Estrutura de Dados</category><category>Grafos</category><category>Algoritmos de Busca</category><category>Busca em Largura</category><category>Busca em Profundidade</category><category>Teoria dos Grafos</category></item><item><title>Bem Vindos ao FoxTechWorld!</title><link>https://foxtechworld.github.io/bem-vindos-ao-foxtechworld/</link><guid isPermaLink="true">https://foxtechworld.github.io/bem-vindos-ao-foxtechworld/</guid><pubDate>Sun, 14 Sep 2025 20:02:00 GMT</pubDate><description>&lt;h2 id="bem-vindos-ao-foxtechworld"&gt;Bem vindos ao FoxTechWorld&lt;/h2&gt;
&lt;p&gt;Este é um pequeno blog feito para distribuir conteúdo &lt;a href="https://vaporhole.xyz/~kitsune"&gt;nérdico&lt;/a&gt;.
Através da Grande Rede Mundial de computadores.&lt;/p&gt;
&lt;h3 id="quem-sou-eu"&gt;Quem sou eu?&lt;/h3&gt;
&lt;p&gt;Meu nome é Arthur tenho no momento da criação deste post 23 anos.&lt;/p&gt;
&lt;p&gt;Sou um estudante de Ciências da Computação na &lt;a href="https://en.wikipedia.org/wiki/Federal_University_of_Lavras"&gt;Universidade Federal de Lavras&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tenho curiosidade em diversos assuntos, então você provavelmente vai me ver falando de assuntos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Otaku&lt;/li&gt;
&lt;li&gt;Geek&lt;/li&gt;
&lt;li&gt;Nerd&lt;/li&gt;
&lt;li&gt;Gamer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sobre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eletrônica&lt;/li&gt;
&lt;li&gt;Economia&lt;/li&gt;
&lt;li&gt;Politica&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip; e por ai vai.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="bem-vindos-ao-foxtechworld">Bem vindos ao FoxTechWorld</h2>
<p>Este é um pequeno blog feito para distribuir conteúdo <a href="https://vaporhole.xyz/~kitsune">nérdico</a>.
Através da Grande Rede Mundial de computadores.</p>
<h3 id="quem-sou-eu">Quem sou eu?</h3>
<p>Meu nome é Arthur tenho no momento da criação deste post 23 anos.</p>
<p>Sou um estudante de Ciências da Computação na <a href="https://en.wikipedia.org/wiki/Federal_University_of_Lavras">Universidade Federal de Lavras</a>.</p>
<p>Tenho curiosidade em diversos assuntos, então você provavelmente vai me ver falando de assuntos:</p>
<ul>
<li>Otaku</li>
<li>Geek</li>
<li>Nerd</li>
<li>Gamer</li>
</ul>
<p>Sobre:</p>
<ul>
<li>Eletrônica</li>
<li>Economia</li>
<li>Politica</li>
</ul>
<p>&hellip; e por ai vai.</p>
<p>Enfim, bem vindos a este novo começo.</p>
]]></content:encoded><category>Bem Vindos</category><category>First Post</category><category>New Blog</category><category>My First Blog</category></item></channel></rss>