<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog do Dunossauro</title><link>https://blog.dunossauro.com/</link><description>Blog do Dunossauro</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><managingEditor>mail@dunossauro.com
(dunossauro)</managingEditor><lastBuildDate>Mon, 19 Jan 2026 19:26:17 -0300</lastBuildDate><atom:link href="/feed.xml" rel="self" type="application/rss+xml"/><item><title>Meu ambiente/setup de programação em 2026</title><link>https://blog.dunossauro.com/posts/setup-2026/</link><pubDate>Mon, 19 Jan 2026 19:26:17 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/setup-2026/</guid><description>&lt;figure>&lt;img src="https://blog.dunossauro.com/images/setup_2026_thumb.png"/>&lt;figcaption>
&lt;h4>Thumbnail usada para a live no youtube!&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>O objetivo desse post (que também é um roteiro de uma live de Python) é contar um pouco sobre o setup que tenho usado atualmente. Tanto para trabalhar quanto para codar no meu tempo livre. A única intenção é mostrar ferramentas que talvez ainda não façam parte do seu dia a dia.&lt;/p>
&lt;blockquote>
&lt;p>Nesse momento ele é um material de apoio em tópicos pra live. Em alguns dias vou ajustando a fluidez do texto e ele vira um post de verdade :)&lt;/p>
&lt;/blockquote>
&lt;p>Quero dividir o conteúdo em frentes distintas, para ficar mais fácil de encontrar e enumerar.&lt;/p>
&lt;p>Ah&amp;hellip; só mais uma coisa&amp;hellip; Quando falo em setup, estou falando da parte lógica: sistema, ferramentas, automações e fluxo de trabalho, não de hardware.&lt;/p>
&lt;h2 id="tópicos" >
&lt;div>
&lt;a href="#t%c3%b3picos">
#
&lt;/a>
Tópicos
&lt;/div>
&lt;/h2>
&lt;ol>
&lt;li>Ambiente geral: coisas relacionadas às minhas configurações do ambiente e ferramentas que me auxiliam&lt;/li>
&lt;li>Ambiente Python: coisas que instalo globalmente com Python e também uso para gerenciar o python&lt;/li>
&lt;li>Ferramental de projetos: coisas que uso e não necessariamente são dos códigos de produção (linters, task runners, &amp;hellip;)&lt;/li>
&lt;li>Escolhas para programar: minhas ferramentas de escolha no código, bibliotecas, frameworks, etc.&lt;/li>
&lt;/ol>
&lt;h2 id="1-ambiente-geral" >
&lt;div>
&lt;a href="#1-ambiente-geral">
#
&lt;/a>
1. Ambiente geral
&lt;/div>
&lt;/h2>
&lt;p>Bom, não é tão difícil ver que tenho usado GNU/Linux em todos os vídeos desse canal. Atualmente, uso &lt;a href="https://endeavouros.com/">EndeavourOS&lt;/a> variando entre dois ambientes gráficos. &lt;a href="https://i3wm.org/">I3WM&lt;/a> e &lt;a href="https://qtile.org/">Qtile&lt;/a> e meu tema para todas as coisas é o &lt;a href="https://catppuccin.com/">Catppuccin&lt;/a> Mocha.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/setup_2026_tema.png"/>&lt;figcaption>
&lt;h4>captura de tela de todo o tema convergindo no sistema&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Bom&amp;hellip; vamos às coisas importantes para programar:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Ferramenta&lt;/th>
&lt;th>Qual?&lt;/th>
&lt;th>Pra quê?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Editor de texto&lt;/td>
&lt;td>&lt;a href="https://www.gnu.org/software/emacs/">GNU/Emacs&lt;/a>&lt;/td>
&lt;td>Programar, escrever, organizar a vida e basicamente viver dentro dele&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Editor de texto (2)&lt;/td>
&lt;td>&lt;a href="https://kate-editor.org/">Kate&lt;/a>&lt;/td>
&lt;td>Quando, por algum motivo, quero escrever em outro lugar ou no win&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Shell&lt;/td>
&lt;td>&lt;a href="https://www.gnu.org/software/bash/">GNU/Bash&lt;/a>&lt;/td>
&lt;td>Shell padrão do sistema e scripts mais portáveis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Shell (2)&lt;/td>
&lt;td>&lt;a href="https://xon.sh/">Xonsh&lt;/a>&lt;/td>
&lt;td>Shell interativo usando Python como linguagem principal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Terminal&lt;/td>
&lt;td>&lt;a href="https://gnome-terminator.org/">Terminator&lt;/a>&lt;/td>
&lt;td>Emulador de terminal com splits, profiles e workflows complexos&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ambiente limpo&lt;/td>
&lt;td>&lt;a href="https://lima-vm.io/">LiMa&lt;/a>&lt;/td>
&lt;td>Criar VMs leves para testar ambientes sem poluir o sistema&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Containers&lt;/td>
&lt;td>&lt;a href="https://podman.io/">Podman&lt;/a>&lt;/td>
&lt;td>Gerenciar containers sem daemon e compatível com Docker&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>dotfiles&lt;/td>
&lt;td>&lt;a href="https://dotdrop.readthedocs.io/">dotdrop&lt;/a>&lt;/td>
&lt;td>Gerenciar e versionar dotfiles de forma reproduzível&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Provisionamento&lt;/td>
&lt;td>&lt;a href="https://docs.ansible.com/">Ansible&lt;/a>&lt;/td>
&lt;td>Automatizar setup de máquinas e ambientes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Documentação offline&lt;/td>
&lt;td>&lt;a href="https://zealdocs.org/">Zeal&lt;/a>&lt;/td>
&lt;td>Consultar a documentação sem a necessidade de abrir o browser&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="coisas-interessantes-no-editor-de-texto" >
&lt;div>
&lt;a href="#coisas-interessantes-no-editor-de-texto">
##
&lt;/a>
Coisas interessantes no editor de texto
&lt;/div>
&lt;/h3>
&lt;p>É onde acontecem as partes mais importantes do meu fluxo de trabalho. Onde basicamente escrevo código, as aulas, slides e as postagens no blog. Talvez, uma das coisas mais importantes para o nosso contexto, seja um pouco do que uso para programar aqui.&lt;/p>
&lt;h4 id="servidores-de-linguagem" >
&lt;div>
&lt;a href="#servidores-de-linguagem">
###
&lt;/a>
Servidores de linguagem
&lt;/div>
&lt;/h4>
&lt;p>Para me acompanhar durante a escrita de texto e de código, tenho usado alguns &lt;a href="https://en.wikipedia.org/wiki/Language_Server_Protocol">servidores de linguagem&lt;/a>. Uma forma de ter autocomplete + correções durante a escrita.&lt;/p>
&lt;p>Para gerenciar os servidores de linguagem, uso o &lt;a href="https://mason-registry.dev/">mason-registry&lt;/a> via &lt;a href="https://github.com/deirn/mason.el">mason.el&lt;/a>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> e coloco o diretório de downloads dele no PATH para poder usar nos dois editores.&lt;/p>
&lt;p>Não tenho conectado diretamente nos servidores, pois em alguns casos gosto de usar mais de um LSP para uma mesma linguagem, o que nem sempre é possível em um mesmo editor. Por isso uso o &lt;a href="https://github.com/joaotavora/rassumfrassum">rassumfrassum&lt;/a>.&lt;/p>
&lt;pre class="mermaid">flowchart LR
Eglot &lt;--> rassumfrassum
rassumfrassum &lt;--> python
rassumfrassum &lt;--> markdown
subgraph python
lsp-A
lsp-B
lsp-C
end
subgraph markdown
lsp-D
lsp-E
end
&lt;/pre>
&lt;p>Ele funciona como um servidor de &amp;ldquo;proxy&amp;rdquo;, repassando as requisições para os servidores configurados e concatenando as respostas, que são devolvidas de forma síncrona ao editor.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic"># .config/rassumfrassum/markdown.py&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cba6f7">def&lt;/span> &lt;span style="color:#89b4fa">servers&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">return&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e3a1">&amp;#39;marksman&amp;#39;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e3a1">&amp;#39;ltex-ls-plus&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Isso me permite tratar LSPs como ferramentas especializadas, em vez de depender de um único servidor “generalista” por linguagem.&lt;/p>
&lt;p>Para Python tenho usado:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://zubanls.com/">zuban&lt;/a>: faz checagem de tipos, goto, referências e rename&lt;/li>
&lt;li>&lt;a href="https://docs.astral.sh/ruff/editors/setup/">ruff&lt;/a>: busca por erros de estilo de código&lt;/li>
&lt;li>&lt;a href="https://github.com/tekumara/typos-lsp">typos&lt;/a>: levanta erros gramaticais (inglês) [uso ele em todos os modos de programação]&lt;/li>
&lt;/ul>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/setup_2026_lsps.png"/>&lt;figcaption>
&lt;h4>Captura de tela do Emacs mostrando erros de código via LSPs&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Para Markdown (o que uso para os slides, blog e textos em geral):&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/artempyanykh/marksman">marksman&lt;/a>: cria referências entre arquivos e goto&lt;/li>
&lt;li>&lt;a href="https://github.com/ltex-plus/ltex-ls-plus">ltex-ls-plus&lt;/a>: checagem gramatical via languagetool&lt;/li>
&lt;/ul>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/setup_2026_lsps2.png"/>&lt;figcaption>
&lt;h4>Captura de tela do Emacs mostrando erros de grafia no modo markdown&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;blockquote>
&lt;p>Esse assunto por ele mesmo é tão complexo que merecia um blog post só pra ele. Será?&lt;/p>
&lt;/blockquote>
&lt;h4 id="documentação" >
&lt;div>
&lt;a href="#documenta%c3%a7%c3%a3o">
###
&lt;/a>
Documentação
&lt;/div>
&lt;/h4>
&lt;p>Geralmente, quando estou programando, abrir o browser, digitar na busca, ir até a página, buscar pelo que quero é trabalhoso. Aqui entra o Zeal em conjunto com meu editor.&lt;/p>
&lt;p>&lt;code>M+x zeal-at-point&lt;/code>, se eu tiver a documentação, ele vai até o ponto e me mostra do que tem lá. O LSP me mostra a docstring, mas às vezes preciso de mais do que isso. Preciso realmente acessar a documentação.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/setup_2026_emacs_zeal_docs.png"/>&lt;figcaption>
&lt;h4>Captura de tela do Emacs direcionando a documentação ao Zeal&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Isso reduz bastante a troca de contexto (context-switching) durante a programação, o que, para mim, faz muita diferença no fluxo. Essas trocas fazem meu foco ir na lua e voltar. hahaha (mesmo ainda estando fora do tema&amp;hellip;)&lt;/p>
&lt;h4 id="extra-citações" >
&lt;div>
&lt;a href="#extra-cita%c3%a7%c3%b5es">
###
&lt;/a>
Extra: Citações
&lt;/div>
&lt;/h4>
&lt;p>Outra coisa que me ajuda muito no editor, nessa de ficar mudando de lá pra cá, é o &lt;a href="https://github.com/emacs-citar/citar">Citar&lt;/a>, um pacote do Emacs, para citações da minha coleção bibliográfica no &lt;a href="https://www.zotero.org/">Zotero&lt;/a>. Quando preciso referenciar algo, com um pequeno comando, insiro a referência lá.&lt;/p>
&lt;p>PS: não pense em algo como ABNT ou formatação acadêmica. A ideia aqui é simplesmente não precisar lembrar nomes de papers, subtítulos de livros, PEPs por nome ou número, ou qualquer outro detalhe que quebra o fluxo de escrita.&lt;/p>
&lt;h3 id="reprodução-do-ambiente" >
&lt;div>
&lt;a href="#reprodu%c3%a7%c3%a3o-do-ambiente">
##
&lt;/a>
Reprodução do ambiente
&lt;/div>
&lt;/h3>
&lt;p>Umas das coisas que tenho em mente e que faz parte integral do meu ambiente e a &amp;ldquo;reprodutibilidade&amp;rdquo; dele. Deixo essas dicas aqui, pois quem está começando pode não ter esse domínio em construir e manter o próprio ambiente.&lt;/p>
&lt;h4 id="dotfiles" >
&lt;div>
&lt;a href="#dotfiles">
###
&lt;/a>
Dotfiles
&lt;/div>
&lt;/h4>
&lt;p>Dotfiles são arquivos de configuração, que guardam preferências e ajustes das ferramentas que você usa no dia a dia, como terminal, editor de código e Git. Para quem está começando, eles costumam passar despercebidos, mas fazem muita diferença na produtividade e na consistência do ambiente como um todo, não somente de desenvolvimento.&lt;/p>
&lt;p>Uma &amp;ldquo;barra&amp;rdquo; pesada que a gente enfrenta de tempos em tempos é ter de transferir nossas configurações de um &amp;ldquo;computador&amp;rdquo; para outro. Veja que coloquei entre aspas, porque às vezes o computador é o mesmo, mas tivemos que formatar por algum motivo. Ou vamos mudar de pc, ou temos que usar um pc nosso e um do trabalho&amp;hellip; São inúmeras possibilidades aqui.&lt;/p>
&lt;p>Por exemplo, eu uso &lt;a href="https://www.gnu.org/software/bash/">GNU/Bash&lt;/a> como shell. E ele tem um arquivo base de configuração, o &lt;code>.bashrc&lt;/code>. Nesse arquivo, posso colocar variáveis de ambiente, alias para comandos, setar algumas configurações, etc. Se eu perder esse arquivo por qualquer motivo que seja, eu vou ter que reconfigurar tudo de novo. Correndo o risco de esquecer algo ou até mesmo não conseguir reproduzir a configuração anterior. Vezes porque procurei uma coisa na internet, &amp;ldquo;copiei e colei&amp;rdquo; e nunca mais vou achar o link, ou porque alguém me ajudou com uma configuração e vou ter que aporrinhar essa pessoa de novo.&lt;/p>
&lt;p>Uma das técnicas para fugir disso é versionar todos esses arquivos de configuração em um repositório (por exemplo, no Git) para que você possa recriar seu ambiente facilmente em outra máquina, evitar perder configurações importantes e acompanhar mudanças ao longo do tempo.&lt;/p>
&lt;p>Um dos problemas de fazer isso é ter que manter os arquivos sempre sincronizados com o repositório. Eu fui futricando na configuração e esqueci de adicionar ao repositório e fazer isso muitas vezes, o tempo todo, é chato. Aí entra uma ferramenta que uso sempre, feita em Python, o &lt;a href="https://dotdrop.readthedocs.io">dotdrop&lt;/a>. Com um simples comando como &lt;code>dotdrop compare&lt;/code> ele me diz se meus arquivos estão diferentes do repositório e com &lt;code>dotdrop update&lt;/code> ele copia suas configurações atuais para o repositório. Se estiver em outro ambiente, pode rodar um &lt;code>dotdrop install&lt;/code> e ele vai colocar todos os seus arquivos de configuração do repositório na máquina.&lt;/p>
&lt;blockquote>
&lt;p>Caso queira ver meus dotfiles, eles estão aqui: &lt;a href="https://dunossauro.com/dotfiles">https://dunossauro.com/dotfiles&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h4 id="provisionamento" >
&lt;div>
&lt;a href="#provisionamento">
###
&lt;/a>
Provisionamento
&lt;/div>
&lt;/h4>
&lt;p>Além de manter as configurações, claro, precisamos instalar os softwares que usamos nessa nova instalação. É aí que entra o provisionamento.&lt;/p>
&lt;p>Provisionamento é o processo de preparar automaticamente um ambiente, instalando pacotes, ferramentas e configurações necessárias para trabalhar ou executar uma aplicação. Para quem está começando, isso ajuda a evitar configurações manuais repetitivas e erros difíceis de reproduzir. Ao versionar esse processo, você registra como o ambiente deve ser montado, possibilitando recriá-lo em outra máquina com poucos comandos.&lt;/p>
&lt;p>Tenho usado o &lt;a href="https://docs.ansible.com/">Ansible&lt;/a> para essa função. Escrevemos arquivos declarativos (em yaml) descrevendo todos os softwares que queremos instalar e comandos que queremos executar:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fab387">---&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#cba6f7">name&lt;/span>: Exemplo de configuração
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">hosts&lt;/span>: localhost
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">tasks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#cba6f7">name&lt;/span>: Instalação GNU/Emacs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">become&lt;/span>: &lt;span style="color:#fab387">yes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">package&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">name&lt;/span>: emacs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">state&lt;/span>: present
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#cba6f7">name&lt;/span>: Instalação terminator
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">become&lt;/span>: &lt;span style="color:#fab387">yes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">package&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">name&lt;/span>: terminator
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">state&lt;/span>: present
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#cba6f7">name&lt;/span>: Cópia dotfiles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">git&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">repo&lt;/span>: https://codeberg.org/dunossauro/dotfiles.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">dest&lt;/span>: ~/git/dotfiles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#cba6f7">name&lt;/span>: configura dotfiles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">shell&lt;/span>: dotdrop --cfg=~/git/dotfiles/config.yaml install -f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6c7086;font-style:italic"># ...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Fizemos uma live de ansible no passado &lt;a href="https://ansible.dunossauro.com">https://ansible.dunossauro.com&lt;/a> pode ser que ela te ajude a montar sua configuração.&lt;/p>
&lt;/blockquote>
&lt;h4 id="extra-ambiente-limpo" >
&lt;div>
&lt;a href="#extra-ambiente-limpo">
###
&lt;/a>
Extra: Ambiente limpo
&lt;/div>
&lt;/h4>
&lt;p>Uma das coisas que me fazia passar um perrengue antigamente era ter um &amp;ldquo;ambiente limpo&amp;rdquo; para testar as coisas. Seja porque eu precisava reproduzir um erro de alguém em um sistema que é diferente do meu. Outra distro linux, outro sistema operacional, outro shell. Ou então, porque eu queria usar algo que claramente mudaria minhas configurações do ambiente. Coisas como trocar o sistema de notificação ou trocar toda uma configuração do meu editor&amp;hellip; Coisas desse gênero. Ou ainda, testar como meu código performaria em produção, que &lt;strong>geralmente&lt;/strong> tem uma máquina limpa.&lt;/p>
&lt;p>Nesse caso, algumas ferramentas me ajudam &lt;strong>muito&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.qemu.org/">QEMU&lt;/a> + &lt;a href="https://linux-kvm.org/">KVM&lt;/a>: virtualização completa quando preciso testar sistemas operacionais ou comportamentos mais próximos do hardware real.&lt;/li>
&lt;li>&lt;a href="https://lima-vm.io/">LiMa&lt;/a>: máquinas Linux leves e rápidas para testes pontuais de ambiente e reprodução de problemas (usa QEMU como base)&lt;/li>
&lt;li>&lt;a href="https://developer.hashicorp.com/vagrant">Vagrant&lt;/a> + &lt;a href="https://libvirt.org/">libvirt&lt;/a>: ambientes completos e reproduzíveis a partir de imagens prontas, úteis para testar outras distros ou sistemas.&lt;/li>
&lt;li>&lt;a href="https://podman.io/">Podman&lt;/a>: containers para isolar serviços e dependências durante o desenvolvimento, sem necessidade de uma VM inteira.&lt;/li>
&lt;/ul>
&lt;p>Quando uso cada coisa? Se preciso de uma máquina simples, mas completa, geralmente uso o LiMa (que usa como base o QEMU). Se preciso rodar outro sistema, como Windows, costumo baixar essas imagens com Vagrant via libvirt, que baixa uma imagem completa do sistema pronta para ser executada.&lt;/p>
&lt;p>Agora, durante o desenvolvimento, se preciso subir um banco de dados, um cache, ou mesmo isolar a minha aplicação, uso containers via podman.&lt;/p>
&lt;p>No fim das contas, cada ferramenta resolve um tipo de problema diferente. O importante, para mim, não é escolher &amp;ldquo;a melhor&amp;rdquo;, mas saber quando usar cada uma.&lt;/p>
&lt;blockquote>
&lt;p>Sobre o LiMa, já conversei sobre esse tópico &lt;a href="https://blog.dunossauro.com/posts/conhecendo-o-lima/">nesse&lt;/a> blog post&lt;/p>
&lt;/blockquote>
&lt;h2 id="2-ambiente-python" >
&lt;div>
&lt;a href="#2-ambiente-python">
#
&lt;/a>
2. Ambiente Python
&lt;/div>
&lt;/h2>
&lt;p>Bom, como somos a live de Python, nada mais óbvio que programamos Python&amp;hellip; Então, vamos ao meu ambiente global de Python. Por global aqui, entenda que o Python é como parte do meu ambiente e ferramentas que uso no sistema, não em projetos.&lt;/p>
&lt;h3 id="trabalhando-com-versões-diferentes-do-python" >
&lt;div>
&lt;a href="#trabalhando-com-vers%c3%b5es-diferentes-do-python">
##
&lt;/a>
Trabalhando com versões diferentes do Python
&lt;/div>
&lt;/h3>
&lt;p>Um dos pontos principais de usar GNU/Linux e programar Python é entender a máxima primordial do universo &lt;strong>Não, em hipótese alguma, use o Python do sistema&lt;/strong>. Existem várias formas de lidar com isso. A forma que prefiro gerenciar é via &lt;a href="https://github.com/pyenv/pyenv">Pyenv&lt;/a>.&lt;/p>
&lt;p>Embora eu tenha no sistema gerenciadores de projeto que também fazem isso, como Poetry, PDM e UV, pensando no meu sistema, gosto de testar flags de compilação do python em diferentes versões e mantê-las no meu sistema. Por exemplo, uma com o JIT habilitado, outra com o JIT em modo &lt;code>interpreter&lt;/code>, uma free thread, &amp;hellip; Embora os gerenciadores de projeto possam manipular versões, eles usam pre-compilações e eu gosto de futricar exatamente nesse lugar.&lt;/p>
&lt;h3 id="ferramentas-em-python" >
&lt;div>
&lt;a href="#ferramentas-em-python">
##
&lt;/a>
Ferramentas em Python
&lt;/div>
&lt;/h3>
&lt;p>Para evitar instalar coisas globalmente, ou no meu shim do pyenv, eu uso o &lt;a href="https://pipx.pypa.io/">pipx&lt;/a>. O Pipx é basicamente uma ferramenta para instalar/executar aplicações em python que são disponibilizadas via pypi em um ambiente virtual isolado e que pode ser acessado via PATH. Ele faz esse trabalho sozinho. Além de também ter comandos interessantes como &lt;code>pipx upgrade-all&lt;/code>. Que atualiza toda a sua base de aplicações.&lt;/p>
&lt;p>Algumas coisas que tenho instaladas por lá:&lt;/p>
&lt;ul>
&lt;li>Gerenciadores de projeto: Poetry, PDM, Hatch, UV, Briefcase &amp;hellip; Cada projeto por onde a gente passa acaba deixando sua marca no sistema&lt;/li>
&lt;li>Ferramentas TUI:
&lt;ul>
&lt;li>&lt;a href="https://harlequin.sh/">Harlequin&lt;/a>: um cliente para banco de dados SQL&lt;/li>
&lt;li>&lt;a href="https://posting.sh/">Posting&lt;/a>: um cliente de APIs&lt;/li>
&lt;li>&lt;a href="https://github.com/textualize/toolong">toolong&lt;/a>: uma forma de ler, buscar e organizar arquivos. (uso para ler logs)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://foxdot.org/">Foxdot&lt;/a> e &lt;a href="https://sardine.raphaelforment.fr/">Sardine&lt;/a>: porque fazer música com programação é incrível!&lt;/li>
&lt;li>Ferramentas de CLI:
&lt;ul>
&lt;li>&lt;a href="https://github.com/hugovk/pepotron">pepotron&lt;/a>: ferramenta que abre as peps pelo número&lt;/li>
&lt;li>&lt;a href="https://segno.readthedocs.io/">segno&lt;/a>: gerador de QR codes&lt;/li>
&lt;li>&lt;a href="https://doc2dash.hynek.me/">doc2dash&lt;/a>: conversor de mkdocs/sphinx para o formato do zeal&lt;/li>
&lt;li>&lt;a href="https://httpie.io/">httpie&lt;/a>: alternativa para curl&lt;/li>
&lt;li>&lt;a href="https://github.com/danielgatis/rembg">rembg&lt;/a>: removedor de fundo de images&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Muitas dessas ferramentas eu poderia instalar pelo próprio gerenciador de pacotes da minha distribuição. Mas acho que a proximidade com a linguagem me faz instalar as coisas por aqui. hahaha&lt;/p>
&lt;h2 id="3-ferramental-de-projetos" >
&lt;div>
&lt;a href="#3-ferramental-de-projetos">
#
&lt;/a>
3. Ferramental de projetos
&lt;/div>
&lt;/h2>
&lt;p>Agora falamos um pouco sobre meu ambiente em geral. Chegou a hora de falar sobre os projetos em si. Como tenho organizado e criado os ambientes dos meus projetos.&lt;/p>
&lt;p>Vale a pena dizer que, talvez, somente talvez, essa gere mais controvérsias por aqui. Como projetos costumam envolver mais pessoas do que somente eu. Umas coisas gosto, outras nem tanto. Mas&amp;hellip; vamos lá.&lt;/p>
&lt;blockquote>
&lt;p>PS: Muitas dessas configurações em ação podem ser vistas em conjunto no curso de &lt;a href="https://fastapidozero.dunossauro.com/">FastAPI&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h3 id="além-do-código" >
&lt;div>
&lt;a href="#al%c3%a9m-do-c%c3%b3digo">
##
&lt;/a>
Além do código
&lt;/div>
&lt;/h3>
&lt;p>Muitas decisões sobre um projeto são tomadas fora do código. Como a escolha do ferramental que vai gerir esse código. Atualmente, uso o &lt;a href="https://python-poetry.org/">poetry&lt;/a> como gerenciador de projeto e de versões do Python nos projetos. E junto da flexibilidade do &lt;code>pyproject&lt;/code> tenho combinado algumas ferramentas:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.astral.sh/ruff/">ruff&lt;/a>: analisador estático de código. Para procurar por &amp;ldquo;erros&amp;rdquo;, em geral. Também formata o código.&lt;/li>
&lt;li>&lt;a href="https://github.com/taskipy/taskipy">taskipy&lt;/a>: um executor de tasks complementar. Para coisas como &lt;code>task test&lt;/code>, &lt;code>task lint&lt;/code>&lt;/li>
&lt;li>&lt;a href="https://poethepoet.natn.io/index.html">poethepoet&lt;/a>: o mesmo que o &lt;code>taskipy&lt;/code>, mas uso quando as coisas precisam ser mais bem &amp;ldquo;azeitadas&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://zubanls.com/">zuban&lt;/a>: checador de tipos, uma alternativa ao mypy, mas com mais funcionalidades e mais rápido.&lt;/li>
&lt;li>&lt;a href="https://github.com/akaihola/darker">darker&lt;/a>: Ferramenta para formatação de código que aplica as coisas somente aos diffs do git. Ou seja, somente no que alterei, sem formatar lugares que não têm relação nenhuma com o código atual.&lt;/li>
&lt;/ul>
&lt;p>Também temos aquelas coisas que fazem parte do projeto, mas não estão alinhadas com o &lt;code>pyproject&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://prek.j178.dev/">prek&lt;/a>: Uma ferramenta que gerencia hooks de pre-commits no git. Ajuda a validar formatação de arquivos, linhas em branco, ver se não tem um teste quebrando etc.&lt;/li>
&lt;li>&lt;a href="https://pre-commit.com/">pre-commit&lt;/a>: A ferramenta na qual o &lt;code>prek&lt;/code> foi baseada, em alguns projetos ela ainda está lá.&lt;/li>
&lt;li>&lt;a href="https://www.pyinvoke.org/">invoke&lt;/a>: Invoke também é um task runner, como o taskipy e o poethepoet, mas ele é programável. Escrevo em python as devs e ele cria automaticamente as tasks em um cli.&lt;/li>
&lt;li>&lt;a href="https://github.com/crate-ci/typos">typos&lt;/a>: analisador estático que busca por erros de digitação em inglês.&lt;/li>
&lt;li>&lt;a href="https://tox.wiki/">tox&lt;/a>: ferramenta para executar testes (um test runner) que permite executar os testes em N versões do python e de bibliotecas.&lt;/li>
&lt;/ul>
&lt;p>Nem todos os projetos usam todas essas ferramentas, inclusive algumas fazem o mesmo ou beiram as responsabilidades de outras. Mas, é o que uso em projetos diversos. Algumas delas são repetidas com o que uso no editor, mas executar no pre-commit ou em CI é muito importante também.&lt;/p>
&lt;blockquote>
&lt;p>O editor ajuda enquanto escrevo, o pre-commit quando esqueço xD&lt;/p>
&lt;/blockquote>
&lt;h3 id="containers" >
&lt;div>
&lt;a href="#containers">
##
&lt;/a>
Containers
&lt;/div>
&lt;/h3>
&lt;p>Para criar e gerir meus containers durante o desenvolvimento, tenho usado &lt;a href="https://podman.io/">podman&lt;/a> e &lt;a href="https://github.com/containers/podman-compose">podman-compose&lt;/a>.&lt;/p>
&lt;p>Para gerir as dependências dos containers em testes de aplicações, uso o &lt;a href="https://testcontainers.com/">testcontainers&lt;/a>&lt;/p>
&lt;p>Por que não docker? Às vezes subo ele no LiMa, mas as licenças do docker e o fato de não ser mais &amp;ldquo;igual em todos os sistemas&amp;rdquo;, eu tenho evitado.&lt;/p>
&lt;p>Outra coisa relacionada a isso é que ando testando as imagens da &lt;a href="https://images.chainguard.dev/">chainguard&lt;/a> nos meus projetinhos de casa e que aprendi recentemente no trabalho&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> :). São imagens menores, pensadas para produção e com foco em segurança (menos problemas relacionados a &lt;a href="https://www.cve.org/">CVEs&lt;/a>).&lt;/p>
&lt;h2 id="4-escolhas-para-programar" >
&lt;div>
&lt;a href="#4-escolhas-para-programar">
#
&lt;/a>
4. Escolhas para programar
&lt;/div>
&lt;/h2>
&lt;p>Até aqui, falei bastante de ambiente, ferramentas e processos. Agora chegamos ao ponto onde tudo isso se encontra: o código em si. Aqui estão algumas das escolhas que tenho feito quando estou programando projetos em Python hoje.&lt;/p>
&lt;p>&lt;strong>Vale reforçar&lt;/strong>: não são escolhas universais, nem definitivas. São ferramentas que têm funcionado bem no meu fluxo atual e que resolvem problemas que aparecem no meu dia a dia.&lt;/p>
&lt;h3 id="aplicações-de-terminal" >
&lt;div>
&lt;a href="#aplica%c3%a7%c3%b5es-de-terminal">
##
&lt;/a>
Aplicações de terminal
&lt;/div>
&lt;/h3>
&lt;p>Para CLIs, tenho usado &lt;a href="https://cyclopts.readthedocs.io/">Cyclopts&lt;/a> com &lt;a href="https://rich.readthedocs.io/">Rich&lt;/a>. O cyclopts me dá parsing de argumentos simples, bem tipado e com pouco &amp;ldquo;boilerplate&amp;rdquo;. O Rich entra para melhorar a experiência no terminal. Cores, tabelas, blocos, texto rico, barras de progresso.&lt;/p>
&lt;p>Outra coisa que uso menos do que gostaria, mas tenho usado, é o &lt;a href="https://inquirerpy.readthedocs.io/">inquirerpy&lt;/a>. Uma biblioteca que fornece inputs dinâmicos. Se a ferramenta vive no terminal, ela precisa ser agradável de usar.&lt;/p>
&lt;p>Mais uma coisa que uso menos do que deveria é o &lt;a href="https://textual.textualize.io/">textual&lt;/a>, uma biblioteca para construir TUIs. Proporcionando uma experiência completamente diferente, suporte a mouse, imagens, async, &amp;hellip; (pra quem usa ferramentas beeware para GUIs, quase tudo é suportado via Toga).&lt;/p>
&lt;h3 id="aplicações-web" >
&lt;div>
&lt;a href="#aplica%c3%a7%c3%b5es-web">
##
&lt;/a>
Aplicações web
&lt;/div>
&lt;/h3>
&lt;p>Para aplicações web, tenho gostado bastante de usar o &lt;a href="https://fastapi.tiangolo.com/">FastAPI&lt;/a>, principalmente pela simplicidade. Ele me deixa focar no que importa sem brigar com o framework. Apesar disso, confesso que de tempos em tempos acabo namorando o &lt;a href="https://pgjones.gitlab.io/quart/">Quart&lt;/a>, o flask-style, vive dentro de mim xD&lt;/p>
&lt;p>Para ORM, falem o que falarem, o &lt;a href="https://www.sqlalchemy.org/">SQLAlchemy&lt;/a> continua sendo minha escolha. Como já disse o criador do &lt;a href="http://docs.peewee-orm.com/">Peewee&lt;/a>, ele é o &lt;em>estado da arte&lt;/em> dos ORMs em Python. Não é o mais simples, mas é extremamente flexível e me permite crescer o projeto sem precisar trocar tudo depois.&lt;/p>
&lt;p>Quando preciso renderizar &lt;strong>HTML&lt;/strong>, costumo usar o &lt;a href="https://jinja.palletsprojects.com/">Jinja&lt;/a>. Não é algo que aparece em todo projeto, mas quando aparece, ele resolve bem o problema sem adicionar complexidade desnecessária.&lt;/p>
&lt;p>Do outro lado da web, como cliente HTTP, tenho usado o &lt;a href="https://www.python-httpx.org/">HTTPX&lt;/a>, principalmente pela API consistente e pelo suporte a async quando faz sentido.&lt;/p>
&lt;h3 id="testes" >
&lt;div>
&lt;a href="#testes">
##
&lt;/a>
Testes
&lt;/div>
&lt;/h3>
&lt;p>Para testes, uso principalmente o &lt;a href="https://docs.pytest.org/">pytest&lt;/a>, que combina simplicidade e versatilidade. Gosto especialmente da &lt;strong>parametrização&lt;/strong> e dos &lt;strong>markers&lt;/strong>, que tornam os testes mais expressivos e fáceis de organizar. Além disso, ele suporta testes escritos com o estilo clássico do &lt;code>unittest&lt;/code>, facilitando migrar ou integrar código antigo.&lt;/p>
&lt;p>Quando preciso de paralelismo ou mocks, adiciono &lt;a href="https://pypi.org/project/pytest-xdist/">pytest-xdist&lt;/a> e &lt;a href="https://pypi.org/project/pytest-mock/">pytest-mock&lt;/a>. Para gerar dados falsos e cenários de teste realistas, uso &lt;a href="https://faker.readthedocs.io/">Faker&lt;/a> e &lt;a href="https://factoryboy.readthedocs.io/">factory_boy&lt;/a>.&lt;/p>
&lt;p>Para &lt;strong>testes baseados em propriedades&lt;/strong>, uso &lt;a href="https://hypothesis.readthedocs.io/">Hypothesis&lt;/a>, que explora automaticamente combinações de entradas para encontrar casos extremos, e, quando estou testando APIs, uso &lt;a href="https://schemathesis.readthedocs.io/">Schemathesis&lt;/a> em conjunto com ele, garantindo que minhas rotas e esquemas OpenAPI se comportem como esperado. Ambos em conjunto com seus plugins do pytest.&lt;/p>
&lt;p>Quando preciso mockar requisições HTTP de forma controlada, recorro ao &lt;a href="https://respx.readthedocs.io/">respx&lt;/a>, já que quase sempre uso o HTTPX.&lt;/p>
&lt;p>Essa combinação cobre bem desde &lt;strong>testes unitários simples&lt;/strong> até &lt;strong>cenários de integração e APIs mais complexas&lt;/strong>, mantendo tudo previsível e fácil de manter.&lt;/p>
&lt;h3 id="outras-ferramentas" >
&lt;div>
&lt;a href="#outras-ferramentas">
##
&lt;/a>
Outras ferramentas
&lt;/div>
&lt;/h3>
&lt;p>Algumas ferramentas acabam aparecendo em praticamente todo projeto:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://loguru.readthedocs.io">loguru&lt;/a>: para logging com menos atrito inicial&lt;/li>
&lt;li>&lt;a href="https://github.com/gotcha/ipdb">ipdb&lt;/a>: para debug interativo quando preciso parar e entender o estado do programa&lt;/li>
&lt;li>&lt;a href="https://www.mkdocs.org/">mkdocs&lt;/a>: para documentação&lt;/li>
&lt;li>&lt;a href="https://towncrier.readthedocs.io/">towncrier&lt;/a>: para manter changelogs organizados ao longo do tempo&lt;/li>
&lt;/ul>
&lt;p>São ferramentas pequenas, mas que ajudam bastante a manter o projeto saudável no médio e longo prazo.&lt;/p>
&lt;h2 id="pequena-conclusão" >
&lt;div>
&lt;a href="#pequena-conclus%c3%a3o">
#
&lt;/a>
Pequena conclusão
&lt;/div>
&lt;/h2>
&lt;p>Ao longo desse post, mostrei meu setup em 2026: desde o sistema operacional, passando por editores, shell, ferramentas globais de Python, até o ferramental que uso nos projetos e minhas escolhas de bibliotecas. Para ser bem sincero, dizer que esse setup é o de “2026” é muito estranho. Por que, provavelmente em algumas semanas, algumas coisas vão acabar mudando por aqui.&lt;/p>
&lt;p>Construir um ambiente é uma coisa que leva a vida toda, é praticamente um passatempo. A gente experimenta coisas novas sempre e vai trocando, às vezes volta pra antigas e tá tudo bem.&lt;/p>
&lt;p>Meu ponto aqui está longe de ser uma “verdade” como “o que é certo”, não tem FOMO. O objetivo é apresentar como as coisas estão agora, como eu me sinto confortável com meu ambiente e apresentar um monte de coisas que você já poderia conhecer, ou até descobrir coisas novas e testar no seu fluxo de trabalho.&lt;/p>
&lt;p>Cada ferramenta tem um propósito: algumas para facilitar a escrita, outras para reduzir context-switching, algumas para garantir consistência e qualidade, e outras só para se divertir um pouco (sim, tocar música com Python é válido).&lt;/p>
&lt;p>No fim das contas, o setup ideal é aquele que some do caminho, que deixa você focar no que você quer construir, sem se perder em configurações e ferramentas. Embora isso pareça impossível, com esse tanto de coisas. hahaha&lt;/p>
&lt;p>Espero que isso ajude você a pensar com mais carinho em tudo que usa por aí. Um abraço!&lt;/p>
&lt;p>Ah… Antes de ir, me conta. O que tem usado por aí?&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Dica incrível do Krisque&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Dica do Luiz e do Abreu&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Forward de E-mail</title><link>https://blog.dunossauro.com/posts/forward-de-e-mail/</link><pubDate>Sun, 11 Jan 2026 13:27:40 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/forward-de-e-mail/</guid><description>&lt;p>No meu pequeno &lt;a href="https://en.wikipedia.org/wiki/DeGoogle">degoogle&lt;/a> de cada dia, tenho feito alguns testes em diferentes empresas de e-mail. Testei coisas como o &lt;a href="https://tuta.com/">tuta&lt;/a>, o &lt;a href="https://proton.me/">proton&lt;/a>, o &lt;a href="www.zoho.com">zoho&lt;/a>, o &lt;a href="https://www.fastmail.com/">fast&lt;/a>.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>O grande problema disso é que testar significa que vou usar essa conta de e-mail por algum tempo. Mas é praticamente impossível migrar de contas de e-mail quando as pessoas têm &lt;strong>a porcaria&lt;/strong> da minha conta de e-mail vinculada a uma empresa. Como faço pra quem tem meu endereço na empresa x &amp;ldquo;atualizar&amp;rdquo; a lista dele para me mandar na empresa Y?&lt;/p>
&lt;p>Tudo bem&amp;hellip; alguém vai dizer que eu poderia enviar meus e-mails automaticamente de uma conta pra outra. E de fato eu poderia. Mas, no final das contas, tudo fica inviável. Principalmente se eu cometer o erro de cadastrar meu e-mail em algum serviço e tiver que lembrar em qual porcaria de e-mail criei a conta lá.&lt;/p>
&lt;p>Bom&amp;hellip; eu já tenho um domínio, esse que vos fala, o &lt;a href="https://dunossauro.com">dunossauro.com&lt;/a>. Por que não me aproveitar disso? E, de fato, eu posso. Assim, sempre que alguém precisar falar comigo, eu poderia enviar meu e-mail pessoal, usando meu domínio. Uma coisa que provavelmente não vai mudar&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>.&lt;/p>
&lt;p>Comecei a procurar algumas alternativas para fazer o redirecionamento do meu domínio para qualquer e-mail X que eu esteja usando. Nisso acabei encontrando o &lt;a href="https://forwardemail.net">forwardemail&lt;/a>. Uma solução gratuita para encaminhamento, de &lt;a href="https://github.com/forwardemail/forwardemail.net">código aberto&lt;/a>. E que, se quiser, pagar também pode&lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>!&lt;/p>
&lt;p>Que me permite, via DNS, onde quer que se encontre o meu domínio, redirecionar o tráfego para onde quer que eu esteja usando o e-mail. Com uma belíssima solução:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Priority&lt;/th>
&lt;th>Answer / Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>@&lt;/td>
&lt;td>MX&lt;/td>
&lt;td>10&lt;/td>
&lt;td>mx1.forwardemail.net&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>@&lt;/td>
&lt;td>MX&lt;/td>
&lt;td>10&lt;/td>
&lt;td>mx2.forwardemail.net&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>@&lt;/td>
&lt;td>TXT&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="mailto:forward-email=seuemail@onde.quiser.com">forward-email=seuemail@onde.quiser.com&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Pronto! Agora, posso usar qualquer serviço de e-mail sem me preocupar em passar meu endereço de e-mail nesse serviço.&lt;/p>
&lt;p>Uma das coisas legais nisso é que posso ter uma quantidade infinita &lt;em>alias&lt;/em> de e-mails malucos e redirecionar todos para o mesmo.&lt;/p>
&lt;ul>
&lt;li>&lt;code>span@dunossauro.com&lt;/code>&lt;/li>
&lt;li>&lt;code>aplicaoxpto@dunossauro.com&lt;/code>&lt;/li>
&lt;li>&lt;code>email@dunossauro.com&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Mas é isso&amp;hellip; problema resolvido. Se você também tiver um domínio, pode ser bastante interessante. Por alguns motivos:&lt;/p>
&lt;ol>
&lt;li>Ninguém precisa saber onde você hospeda seu e-mail&lt;/li>
&lt;li>Você pode mudar de provedor quando quiser&lt;/li>
&lt;li>Pode criar alias malucos para qualquer e-mail maluco que tiver na cabeça&lt;/li>
&lt;li>É muito mais legal passar o e-mail do seu domínio do que fazer propaganda pra uma empresa qualquer :)&lt;/li>
&lt;/ol>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Sim&amp;hellip; eu não me odeio o suficiente, &lt;strong>ainda&lt;/strong>, pra fazer hosting do meu próprio e-mail.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Claro, eu poderia parar de pagar o domínio e tudo isso vir por água abaixo. Mas até então, qualquer domínio de empresa poderia cair também.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>O que pode acontecer no futuro se eu quiser também responder com emails do dunossauro.com&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Entre o sagrado e o profano!</title><link>https://blog.dunossauro.com/posts/sagrado-e-profano/</link><pubDate>Sun, 14 Dec 2025 12:52:54 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/sagrado-e-profano/</guid><description>&lt;p>Dei uma sumida, eu sei&amp;hellip; Esse mês foi foda. Em diversos aspectos. Escrever esse texto é uma forma de tentar organizar os meus pensamentos da forma mais aberta possível&amp;hellip;&lt;/p>
&lt;p>Estamos há um mês sem Lives de Python, ao mesmo tempo em que essa semana fez um mês que voltei a trabalhar formalmente. Essas coisas estão relacionadas? Obviamente sim, mas não da forma em que parece mais evidente.&lt;/p>
&lt;h2 id="o-balde-furado" >
&lt;div>
&lt;a href="#o-balde-furado">
#
&lt;/a>
O balde furado
&lt;/div>
&lt;/h2>
&lt;p>Qualquer pessoa que se envolva com algo relacionado a &amp;ldquo;&amp;ldquo;&amp;ldquo;educação&amp;rdquo;&amp;rdquo;&amp;rdquo;, sabe que esse é um assunto delicado. E esperar qualquer tipo de retorno financeiro sobre isso não é uma coisa sã. Claro, você pode esperar&amp;hellip; Mas quando você alinha isso à ética, só se você for um professor universitário com anos de estrada. Caso contrário&amp;hellip; tá&amp;hellip; você entendeu&amp;hellip; Não estou dizendo que não existem pessoas éticas vendendo conteúdo, elas existem. Mas&amp;hellip; na grande parte do tempo, você sabe&amp;hellip;&lt;/p>
&lt;p>Tenho um ideal de que as coisas devem ser &lt;strong>gratuitas&lt;/strong> ao consumo, você pode discordar e entendo vários pontos sobre isso. Mas, pra mim, quando eu olho o dunossauro do passado, se algo custasse 20 conto, ele não poderia pagar. E tudo que eu faço tem isso por trás. Você colabora se quiser e, claro, se puder. Por isso temos a &lt;a href="https://apoia.se/livedepython">campanha de financiamento coletivo&lt;/a>.&lt;/p>
&lt;p>Mas isso tem dois lados que não combinam entre si. De um lado, o belo ideal sagrado que me move, do outro, as contas a pagar. O que me coloca sempre no limite de continuar fazendo, mas quando acontece qualquer imprevisto&amp;hellip; Bom, os boletos não param, o aluguel não para, a saúde não é a mesma todo mês.&lt;/p>
&lt;p>Ano passado, mais ou menos nessa época, tive o &lt;a href="https://blog.dunossauro.com/posts/golden-slumbers/">maior imprevisto de todos os tempos&lt;/a>. Ele me cortou de muitas formas. A financeira foi grande, mas acredito que tenha sido a menor. Seguido disso, tive o devastador de qualquer encomia que ainda me restava, um canal&amp;hellip; Como dentistas são caros&amp;hellip; E ainda me sobraram os sisos!&lt;/p>
&lt;h2 id="uma-jornada-pela-live-de-python-em-2025" >
&lt;div>
&lt;a href="#uma-jornada-pela-live-de-python-em-2025">
#
&lt;/a>
Uma jornada pela live de python em 2025
&lt;/div>
&lt;/h2>
&lt;p>Dito tudo isso, sou um escravo do youtube. Sim&amp;hellip; Se você é uma pessoa minimamente informada, vivendo no mundo real, sabe que depender de plataformas é o PIOR negócio que você pode fazer na vida. Nesse último ano, as coisas foram caindo, caindo, caindo&amp;hellip;&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/youtube_24_25.png"
alt="Views diárias entre 24 e 25"/>&lt;figcaption>
&lt;p>Views diárias entre 24 e 25&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Nesse gráfico, você pode ver no eixo X todo o ano de 2024 e o de 2025 (até a data de hoje). Por mais incrível que pareça, o ano de 2024 tinha sido o &lt;strong>pior&lt;/strong> ano de todos, desde que comecei a me dedicar exclusivamente a isso. Mas, perto de 2025 ele parece incrivelmente bom.&lt;/p>
&lt;p>É tão óbvio quanto parece, as pessoas não assistiram às lives de 2025.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/youtube_24_25_semanal.png"
alt="Views semanais sobrepostas de 24 e 25"/>&lt;figcaption>
&lt;p>Views semanais sobrepostas de 24 e 25&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>O pico da semana mais vista em 2025 (azul) é menor que a média de 2024 (roxo). E sim&amp;hellip; isso é assustador, partindo do ponto da dependência exclusiva de renda vindo disso. Isso contando com o fato de eu não ter feito lives em nov e dezembro de 2024, mas&amp;hellip; já falei sobre isso&amp;hellip;&lt;/p>
&lt;p>Com isso, precisei parar para pensar sobre esses dados. Alguma ação minha resultou nesses dados? Foram os temas? Será que fiz algo deplorável na internet? Todo mundo agora só quer IA?&lt;/p>
&lt;h3 id="analisando-os-temas-de-2025" >
&lt;div>
&lt;a href="#analisando-os-temas-de-2025">
##
&lt;/a>
Analisando os temas de 2025
&lt;/div>
&lt;/h3>
&lt;ul>
&lt;li>Testes: falamos sobre randomização. Faker, factory-boy e hypotesis.&lt;/li>
&lt;li>Arquitetura: padrões de projeto (prototype), arquitetura de eventos, arquitetura de microkernel, SGI, módulos&lt;/li>
&lt;li>Python puro: desempacotamento, gerenciadores de contexto, ifs, módulos, 3.14&lt;/li>
&lt;li>Ferramentas: changelogs com towncrier&lt;/li>
&lt;li>Tradução: duas lives sobre i18n&lt;/li>
&lt;li>Segunda edição do curso de FastAPI&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>As lives com pessoas que vieram como convidadas no canal não contam nessa análise.&lt;/p>
&lt;/blockquote>
&lt;p>Acredito que nada esteja muito fora da realidade aqui. São temáticas &amp;ldquo;normais&amp;rdquo; no canal. Mas, alguma coisa errada aconteceu e não consigo entender. A única live de 2025 entre as 10 mais vistas do meu canal é a live do 3.14 e é uma live de outubro. Logo&amp;hellip; Algo de errado não está certo. Caso você esteja se perguntando qual a segunda live mais vista desse ano, a de arquitetura de eventos com FastStream, na décima oitava posição. Seguida pela de módulos na décima nona.&lt;/p>
&lt;p>Embora os temas não estejam fora do normal, a interação das pessoas caiu vertiginosamente esse ano. De forma geral, só uma live deu errado. A segunda parte de i18n é a live que tem menos views de toda a história do canal.&lt;/p>
&lt;p>Acredito que a segunda apresentação do curso de FastAPI, por mais coisas que tenham sido adicionadas e melhoradas, também não tenha sido uma boa jogada, ao nível de youtube. Claro, eu &lt;a href="https://blog.dunossauro.com/posts/fastapi-post-mortem/">me cobrei intensamente por isso&lt;/a> e foi importante ter acontecido de fato.&lt;/p>
&lt;h3 id="sobre-a-campanha-de-financiamento-coletivo" >
&lt;div>
&lt;a href="#sobre-a-campanha-de-financiamento-coletivo">
##
&lt;/a>
Sobre a campanha de financiamento coletivo
&lt;/div>
&lt;/h3>
&lt;p>Junto a isso, a campanha no apoia-se, o qual é o único dinheiro &amp;ldquo;fixo&amp;rdquo; que posso contar. É a certeza de que eu vou conseguir pagar o aluguel e as contas básicas caiu 723 reais mensais entre janeiro e dezembro. Começamos o ano com &lt;code>2.669&lt;/code> e atualmente temos &lt;code>1.937&lt;/code>. Mesmo sem saber o quanto eu pago de aluguel, você deve imaginar que a coisa ficou complicada&amp;hellip;&lt;/p>
&lt;h3 id="mas-por-que-essa-pausa" >
&lt;div>
&lt;a href="#mas-por-que-essa-pausa">
##
&lt;/a>
Mas por que essa pausa?
&lt;/div>
&lt;/h3>
&lt;p>Por mais incrível que pareça, a pausa nem tem muita relação com os números assustadores. Claro, eles me deixam MEGA ansioso? Sim&amp;hellip; Mas, o meu problema real foram duas lives quase que consecutivas que deram errado. Quem acompanha as coisas mais de perto, tipo &lt;a href="https://www.twitch.tv/dunossauro">diariamente na twitch&lt;/a>, onde faço stream preparando material, acompanhou a saga do &amp;ldquo;Object storage&amp;rdquo; ou a &amp;ldquo;live de minio&amp;rdquo;&lt;/p>
&lt;p>O tema simplesmente não aconteceu. Fui andando, escrevi sobre, os slides estavam andando, as referências. Mas, quando pegamos o minio, ele está tão capado que decidi de última hora fazer outro tema, pra dar tempo de estudar outros storages. No meio disso, eu me apressei pra fazer outra live na mesma semana.&lt;/p>
&lt;p>Nas semanas seguintes, eu sentei a bunda pra fazer um &amp;ldquo;tacadão&amp;rdquo; sobre NoSQL e a live não deu certo também. Nessa semana, eu não consegui preparar outra live às pressas. A ansiedade bateu forte, fiquei em &amp;ldquo;posição fetal&amp;rdquo; por uns dois dias. Acho que minha cabeça estava juntando tudo que contei aqui e o gatilho foi o tema não ter dado certo.&lt;/p>
&lt;p>Resolvi que precisava dar uma repensada nas coisas. Conversamos sobre isso no &lt;a href="https://t.me/livepython">grupo da live no telegram&lt;/a>.&lt;/p>
&lt;h2 id="algo-tinha-ou-tem-que-ser-feito" >
&lt;div>
&lt;a href="#algo-tinha-ou-tem-que-ser-feito">
#
&lt;/a>
Algo tinha (ou tem) que ser feito
&lt;/div>
&lt;/h2>
&lt;p>Bom&amp;hellip; no meio dessa confusão, era extremamente necessário pagar as contas. As dores de dente intermináveis, a minha reserva de emergência tinha menos de 2.000 reais. Me vi com duas opções: voltar para um emprego formal ou fazer outra grande campanha de financiamento, como a do curso de FastAPI.&lt;/p>
&lt;p>Pensei muito sobre isso. Mas, &lt;strong>MUITO MESMO&lt;/strong>. A campanha anterior não tinha sido &lt;a href="https://blog.dunossauro.com/posts/fastapi-post-mortem/">muito boa pra minha saúde mental&lt;/a>. Mas&amp;hellip; o que é saúde mental perto de não conseguir pagar as contas?&lt;/p>
&lt;p>Eu até pensei no tema do curso novo, na verdade, foi uma sugestão do Renan Santos. Um &amp;ldquo;pytest do zero&amp;rdquo;. Nos mesmos moldes do curso de FastAPI, mas com foco em ensinar testes. Acredito que no futuro isso possa rolar ainda. Até porque aprendi &lt;strong>TANTA&lt;/strong> coisa do que &lt;strong>não fazer&lt;/strong> no material de FastAPI, que acredito que tudo seria mais fácil. Mas, acho que ainda não é a hora de passar por isso de novo. Embora eu tenha &lt;a href="https://pytestdozero.dunossauro.com/">esboçado isso aqui&lt;/a>, talvez no futuro a gente toque isso.&lt;/p>
&lt;p>No meio disso, acabei recebendo uma proposta legal de emprego. Montar um time de &lt;a href="https://en.wikipedia.org/wiki/Quality_engineering">engenharia de qualidade&lt;/a> em uma empresa brasileira, com produtos para o público brasileiro. O desafio era tão interessante que provavelmente eu teria aceitado mesmo que não estivesse nessa &amp;ldquo;pindaíba&amp;rdquo;. Um salário legal, formar um time legal&amp;hellip; Por que não? (isso parece que tem tudo pra virar outro post)&lt;/p>
&lt;h3 id="a-volta-das-lives" >
&lt;div>
&lt;a href="#a-volta-das-lives">
##
&lt;/a>
A volta das lives
&lt;/div>
&lt;/h3>
&lt;p>Agora que posso me dar ao luxo de não tentar acertar todas as semanas, quero fazer alguns testes em 2026. Na realidade, quero fazer exatamente 3 teses durante os 4/5 primeiros meses do ano. Voltar inicialmente quinzenalmente e depois retomar o ritmo.&lt;/p>
&lt;p>Pelo meu conhecimento limitado no analytics do youtube, parece que o maior impacto que temos atualmente é a &amp;ldquo;falta de pessoas ao vivo&amp;rdquo;. Isso tem impactado diretamente no desempenho dos VODs&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>. O vídeo chega com uma performance comprometida do ao vivo e tende a ser menos recomendado (taxa de impressões menor, por consequência, taxa de cliques menor).&lt;/p>
&lt;p>Com isso, quero fazer uma coisa que me pedem há anos, fazer mais cedo. As lives ficaram às 22:00 porque eu chegava das aulas do mestrado às 20:00 e precisava comer algo correndo. Isso não acontece mais há anos, mas o horário continuou. Então, meu primeiro teste vai ser fazer às 21:00. Sei que ainda pode parecer tarde. Mas algo me diz que acabar às 23 é melhor que às 00.&lt;/p>
&lt;p>Como um segundo teste, depois do primeiro, quero diminuir um pouco o tempo das lives. Normalmente elas duram duas horas, quero tentar fazer uma hora e meia. Tentar correr um pouco mais na abertura (os slides padrões de todas as lives) e aproveitar melhor o tempo. O que fariam as lives acabarem às 22:30. Bom&amp;hellip; quem precisa dormir cedo, consegue acompanhar melhor do que acabar às 00.&lt;/p>
&lt;p>E no terceiro teste, quero elencar melhor os temas. Acho que vou montar um formulário para ter uma base do que as pessoas inscritas no canal gostariam de me ver falando (já sei que vão pedir toneladas de IA, mas não vou ceder xD). E com essas sugestões, montar planejamentos que tenham somente uma live mensal escolhida por mim, até porque não sou de ferro.&lt;/p>
&lt;p>Com isso, pretendo voltar com as lives no dia 05/01 com uma live de pergunte o que quiser, às 21 e soltar o formulário. Elencar os temas das próximas lives na semana seguinte e voltar no dia 19/01 com o primeiro tema.&lt;/p>
&lt;p>Espero que as coisas sejam melhores que em 2025. Se você leu até aqui, espero que tenha boas festas e espero te ver por aqui, e obviamente lá no youtube em 2026 &amp;lt;3&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Video On Demand. Como o vídeo é apresentado após o final da live.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Curso de FastAPI, post-mortem: como foi a minha experiência criando material financiado coletivamente</title><link>https://blog.dunossauro.com/posts/fastapi-post-mortem/</link><pubDate>Tue, 23 Sep 2025 00:04:14 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/fastapi-post-mortem/</guid><description>&lt;p>Faz uns poucos meses que o &lt;a href="https://fastapidozero.dunossauro.com/estavel/">curso de FastAPI&lt;/a> acabou. Meu objetivo com esse texto é repensar um pouco sobre tudo que aconteceu. Os pontos positivos, negativos, os aprendizados e claro&amp;hellip; sobre a dor que foi passar por um período de 3 anos de cobranças internas excessivas.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/fast_api_anim_frame.png"/>&lt;figcaption>
&lt;h4>Um frame da animação de abertura dos vídeos que nunca foram lançados&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>O resultado foi muito positivo, o curso foi um sucesso, o material virou meu xodó e motivo de orgulho. Mas&amp;hellip; foram tempos sombrios!&lt;/p>
&lt;h2 id="um-pouco-de-história" >
&lt;div>
&lt;a href="#um-pouco-de-hist%c3%b3ria">
#
&lt;/a>
Um pouco de história
&lt;/div>
&lt;/h2>
&lt;p>No segundo semestre de 2021, pensei: &amp;ldquo;que tal fazer um curso de FastAPI?&amp;rdquo; e mais do que isso, &amp;ldquo;por que não ensinar de uma forma que englobe o python mais moderno e os &amp;lsquo;agregados&amp;rsquo; como banco de dados, testes, CI, deploy&amp;hellip;?&amp;rdquo;.&lt;/p>
&lt;p>Lembro de ter dito algo parecido com isso para minha parceira:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Acho que se eu trabalhar umas 10 horas por semana, eu devo conseguir preparar todo esse material em uns 3 meses&amp;hellip; Aí eu tiro uma semana e gravo todos os vídeos e vou editando por demanda&amp;hellip;&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>&lt;em>ps: a resposta dela paira mais perto da realidade do que aconteceu.&lt;/em>&lt;/p>
&lt;p>Spoiler, estou escrevendo esse texto no dia 21 de setembro de 2025. Bom&amp;hellip; o objetivo desse texto é desbravar essa jornada que teve um final feliz, tanto quanto traumático.&lt;/p>
&lt;h3 id="linha-do-tempo-dos-acontecimentos" >
&lt;div>
&lt;a href="#linha-do-tempo-dos-acontecimentos">
##
&lt;/a>
Linha do tempo dos acontecimentos
&lt;/div>
&lt;/h3>
&lt;p>Uma das coisas que mais me ajudou a escrever esse texto e entender meus sentimentos mistos, talvez, quem sabe, fazer com que não seja tão duro comigo mesmo, foi escrever uma linha do tempo. Por esse motivo, vou deixar ela aqui:&lt;/p>
&lt;ul>
&lt;li>13 de dezembro de 2021: começo a escrever a estrutura do curso&lt;/li>
&lt;li>14 de janeiro de 2022: início dos trabalhos de assets 3d para usar na campanha&lt;/li>
&lt;li>9 de fevereiro de 2022: foi lançada a &lt;a href="https://apoia.se/fastapi">campanha de financiamento coletivo&lt;/a>&lt;/li>
&lt;li>11 de fevereiro de 2022: a meta de 12k foi batida&lt;/li>
&lt;li>9 de março de 2022: A campanha se encerra com quase 200% do valor inicial&lt;/li>
&lt;li>31 de março de 2022: Definida a estrutura inicial do curso em vídeo (&lt;a href="https://github.com/dunossauro/curso-fastAPI/commit/2a8df440d1514bd2942683a566a078853bbfeffc">link&lt;/a>)&lt;/li>
&lt;li>29 de abril de 2022: início da escrita do material de apoio (typing + async)&lt;/li>
&lt;li>4 de junho de 2022: início da gravação da primeira aula&lt;/li>
&lt;li>06 de julho de 2022: faço upload das primeiras quatro aulas gravadas de forma privada&lt;/li>
&lt;li>10 de julho de 2022: &lt;a href="https://pydantic.dev/articles/pydantic-v2">anuncio da versão 2.0 do pydantic&lt;/a> com quebra de retrocompatibilidade, planejada para outubro&lt;/li>
&lt;li>11 de julho de 2022: choro no banho a primeira vez&lt;/li>
&lt;li>12 de setembro de 2022: a mensagem &lt;strong>maldita&lt;/strong> foi pinada no grupo do telegram&lt;/li>
&lt;li>13 de outubro de 2022: iniciado o processo de lançamento do sqlalchemy 2.0&lt;/li>
&lt;li>26 de janeiro de 2023: lançada a versão 2.0 do sqlalchemy&lt;/li>
&lt;li>30 de junho de 2023: lançada a versão 2.0 do pydantic (planejada para 2022)&lt;/li>
&lt;li>1 de julho de 2023: o &lt;strong>caos&lt;/strong> foi instaurado na minha mente&lt;/li>
&lt;li>7 de julho de 2023: fastapi adiciona suporte ao pydantic v2 (v0.100)&lt;/li>
&lt;li>13 de julho de 2023: &lt;a href="https://github.com/dunossauro/fastapi-do-zero/commit/5f9cd643f93237574b3f7ecf18484aa7e3332ace">commit inicial&lt;/a> do material de &lt;a href="https://fastapidozero.dunossauro.com/">texto&lt;/a>&lt;/li>
&lt;li>17 de julho de 2024: Apresento publicamente a página do curso em texto&lt;/li>
&lt;li>23 de novembro de 2023: &amp;ldquo;Desisto&amp;rdquo; de escrever o material de apoio (typing + async)&lt;/li>
&lt;li>8 de junho de 2024: Lançada a &lt;a href="https://github.com/dunossauro/fastapi-do-zero/releases/tag/v1.0">v1&lt;/a> do material de texto&lt;/li>
&lt;li>11 de junho de 2024: Foi feita a live da &lt;a href="https://youtu.be/QShMRcicxnE">aula de abertura&lt;/a>&lt;/li>
&lt;li>6 de outubro de 2024: &lt;a href="https://github.com/dunossauro/fastapi-do-zero/releases/tag/v2.0">v2&lt;/a> do material de texto. Com merge das ideias principais sobre async do material de apoio&lt;/li>
&lt;li>29 de janeiro de 2025: Foi iniciado o &lt;a href="https://github.com/dunossauro/fastapi-do-zero/commit/cca25c14b46ba2a3d1868eae1ba0d6c2ec33c1ec">changelog&lt;/a> no texto&lt;/li>
&lt;li>2 de fevereiro de 2025: &lt;a href="https://github.com/dunossauro/fastapi-do-zero/releases/tag/v3.0.0">v3&lt;/a> do material de texto&lt;/li>
&lt;li>6 de maio de 2025: Foi feita a live da &lt;a href="https://youtu.be/ImhYlISeWPQ">aula de abertura&lt;/a>&lt;/li>
&lt;li>12 de março de 2025: Lançamento da &lt;a href="https://github.com/dunossauro/fastapi-do-zero/releases/tag/v4.0">v4&lt;/a> do material de texto&lt;/li>
&lt;/ul>
&lt;h2 id="a-campanha" >
&lt;div>
&lt;a href="#a-campanha">
#
&lt;/a>
A campanha
&lt;/div>
&lt;/h2>
&lt;p>A forma que encontrei para viabilizar a criação desse material foi por meio da campanha de &lt;a href="https://apoia.se/fastapi">financiamento coletivo&lt;/a>. Uma campanha tudo ou nada, ou seja, se a meta fosse atingida, eu focaria energias para produzir o material, caso contrário, nada aconteceria.&lt;/p>
&lt;p>Embora eu mantenha há anos a campanha da &lt;a href="https://apoia.se/livedepython">live de python&lt;/a>, para ser bem sincero, eu não acreditei que em um mês a meta de 12k fosse atingida. Pra minha surpresa, não só foi atingida, como isso aconteceu em 26 horas!&lt;/p>
&lt;h3 id="o-dinheiro" >
&lt;div>
&lt;a href="#o-dinheiro">
##
&lt;/a>
O dinheiro
&lt;/div>
&lt;/h3>
&lt;p>Meu trabalho em tempo integral é produzir o material semanal da live de python. O que me toma cerca de 40/50 horas por semana. Entre o levantamento do tema, referências, testes, o estudo, a criação do material, a parte gráfica e a apresentação da live na segunda-feira.&lt;/p>
&lt;p>Parar de produzir as lives por um período, ou diminuir o ritmo, faria meu canal ser penalizado pelo youtube, o que diminuiria significativamente a minha renda durante a produção do material. Pensei que esse valor seria o suficiente para cobrir a não entrada de grana do youtube num período máximo de 7 meses&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/p>
&lt;h3 id="a-receptividade" >
&lt;div>
&lt;a href="#a-receptividade">
##
&lt;/a>
A receptividade
&lt;/div>
&lt;/h3>
&lt;p>O quanto as pessoas engajaram na causa e ficaram felizes pela produção desse material mexeu tanto comigo, de uma forma positiva. Me mostrou que as pessoas confiam na qualidade do meu trabalho e também confiaram que eu entregaria algo de valor.&lt;/p>
&lt;p>Foi espetacular e um prazer inenarrável ver o quanto sou bem quisto pela nossa comunidade! De verdade, isso foi tão lindo. Durante as partes difíceis do processo, reli algumas mensagens que as pessoas me mandaram, alguns comentários que foram deixados e isso me ajudou &lt;strong>MUITO&lt;/strong>.&lt;/p>
&lt;h3 id="a-responsabilidade" >
&lt;div>
&lt;a href="#a-responsabilidade">
##
&lt;/a>
A responsabilidade
&lt;/div>
&lt;/h3>
&lt;blockquote>
&lt;p>O diabo mora nos detalhes&amp;hellip;&lt;/p>
&lt;/blockquote>
&lt;p>Bom, com a excelente receptividade, logo veio um senso de cobrança &lt;strong>insano&lt;/strong>. Onde tudo deveria estar perfeito, calculado, nos mínimos detalhes, absurdamente correto, com direito a APIs internas sendo debruçadas.&lt;/p>
&lt;p>Com isso, comecei a escrever um material de apoio profundo, aquele tipo de coisa que quem conhece meu trabalho mais de perto sabe como funciona. Eu estava debatendo comigo e escrevendo sobre o fato do interpretado reconhecer uma chamada na pilha e fazer o processo de quickening&amp;hellip;&lt;/p>
&lt;p>Onde estava o FastAPI? Não sei&amp;hellip; eu me perdi na escrita do material de apoio logo no início. Acho que isso vem de uma frustração anterior, como o &lt;a href="https://selenium.dunossauro.com/">curso de selenium&lt;/a>, que não teve o aprofundamento teórico necessário&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>.&lt;/p>
&lt;p>Depois de escrever algumas semanas em que dormi quase nada, um material que não teve nenhum aproveitamento&amp;hellip;&lt;/p>
&lt;h3 id="a-cobrança-interna" >
&lt;div>
&lt;a href="#a-cobran%c3%a7a-interna">
##
&lt;/a>
A cobrança interna
&lt;/div>
&lt;/h3>
&lt;p>Bateu na minha cabeça uma pira de que eu deveria entregar isso de outra forma, como prometido na campanha. Um curso em vídeo, não um material extenso de texto com noias perfectionistas que só dizem respeito a minha ansiedade.&lt;/p>
&lt;p>Montei e desmontei toda a fotografia/iluminação. Montei da forma mais &amp;ldquo;perfeita&amp;rdquo; que consegui. Anotei todos os parâmetros, fiz os slides com alguns roteiros anteriores e fui gravar. Durante algumas semanas, fui fazendo isso. Gravando, editando e postando de forma privada.&lt;/p>
&lt;p>Por que isso não virou público? Não é óbvio? A sabotagem de não ser o incrível perfeito aprofundado e bitolado pomposo e cheio de referências podia me fazer deletar tudo sem ninguém saber que isso tinha começado a ser feito.&lt;/p>
&lt;h2 id="a-maldição-das-majors" >
&lt;div>
&lt;a href="#a-maldi%c3%a7%c3%a3o-das-majors">
#
&lt;/a>
A maldição das majors
&lt;/div>
&lt;/h2>
&lt;p>Quando achei que tudo tinha começado a andar rumo ao que foi prometido&amp;hellip;&lt;/p>
&lt;h3 id="pydantic-2" >
&lt;div>
&lt;a href="#pydantic-2">
##
&lt;/a>
Pydantic 2
&lt;/div>
&lt;/h3>
&lt;p>Em 10 de julho de 2022 o Pydantic, componente central no curso e no FastAPI &lt;a href="https://pydantic.dev/articles/pydantic-v2">anuncia a 2.0&lt;/a> com quebra de retrocompatibilidade, reescrita em Rust.&lt;/p>
&lt;p>Eu, como um bom &lt;a href="https://blog.dunossauro.com/posts/descentralizacao-de-consumo-na-internet/">leitor de feeds&lt;/a>, li isso no mesmo dia em que sentei para iniciar a gravação da aula 05. O que me fez repensar sobre tudo que tinha sido feito até ali. A previsão inicial de lançamento era para outubro, no mais tardar ao fim do ano.&lt;/p>
&lt;p>Isso inviabilizaria o produto final do curso. Sendo &lt;strong>bem positivo&lt;/strong>&lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup> com as datas, se eu continuasse gravando e postasse tudo, provavelmente os lançamentos das últimas aulas &lt;em>combariam&lt;/em> com o lançamento do pydantic, o que, &lt;strong>exclusivamente na minha cabeça&lt;/strong>, faria todo o projeto estar desatualizado no momento em que estava sendo lançado.&lt;/p>
&lt;p>Com esse turbilhão na cabeça, postei a mensagem mais estranha do mundo no grupo do telegram do curso:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Galera, o curso ainda não tem data. Estou trabalhando nele diariamente. Quando tiver alguma evolução significativa. Vou avisar aqui no grupo. No momento estou trabalhando nisso em tempo integral. Fiquem em paz, que logo menos as coisas acontecem.&lt;/p>
&lt;p>Estou trabalhando nos módulos iniciais ainda. O FastAPI está passando por algumas manutenções. Estou acompanhando de perto as novas mudanças do pydantic.&lt;/p>
&lt;p>Sei que as pessoas aqui já estão cansadas de ouvir isso. Mas estou trabalhando. Estou mandando de novo essa mensagem pois toda hora entra alguém no grupo e pergunta de novo e a minha mensagem se perde. Então vou fixar essa mensagem.&lt;/p>
&lt;p>Tô trabalhando bastante, tô ficando bastante feliz com o que está rolando. Em breve novidades, sem datas. Afinal, não temos datas nem para release do pydantic, que foi planejada de maneira otimista para dezembro.
Estou aproveitando para trabalhar melhor e mais profundamente nos módulos iniciais. Prefiro postergar um pouco mais, do que deixar o curso com aulas desatualizadas.&lt;/p>
&lt;/blockquote>
&lt;p>Isso me fez retomar a escrita do material teórico, aquele aprofundado em nuances, &amp;hellip; Sim, aquele delírio insano da minha mente.&lt;/p>
&lt;p>Ah&amp;hellip; e sobre a versão 2, ela foi lançada em 30 de junho de 2023. Esperar por ela foi complicado.&lt;/p>
&lt;h3 id="sqlalchemy-2" >
&lt;div>
&lt;a href="#sqlalchemy-2">
##
&lt;/a>
SQLAlchemy 2
&lt;/div>
&lt;/h3>
&lt;p>Nesse material &amp;ldquo;&amp;ldquo;&amp;ldquo;incrível&amp;rdquo;&amp;rdquo;&amp;rdquo; que estava escrevendo, fugindo totalmente do escopo inicial, passei grande parte trabalhando na interação do AsyncIO com o SQLAlchemy. Recém saído na versão 1.4.&lt;/p>
&lt;p>No dia 13 de outubro de 2022, outro tombo. É anunciada a nova major do SQLAlchemy, a 2.0 (que acabou saindo em janeiro do ano seguinte). O que fez com que grande parte do material que trabalhei durante os meses estivesse obsoleta. Novas coisas foram inseridas, o suporte ao async melhorou, a integração com o typing estava incrível. Mas isso não me fez ter menos retrabalho&amp;hellip;&lt;/p>
&lt;p>O que me fez entrar em pânico novamente!&lt;/p>
&lt;p>Embora tenha sido trabalhoso, acabou não sendo em vão, estar &amp;ldquo;acompanhando&amp;rdquo; cada commit e modificação originou uma das lives de python que eu mais gosto e considero uma das mais importantes que fiz no canal: &lt;a href="https://youtu.be/t4C1c62Z4Ag">&amp;ldquo;SQLAlchemy: conceitos básicos, uma introdução a versão 2&amp;rdquo;&lt;/a> e parte integral da v2 do texto do curso, quando o AsyncIO foi incluído.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/t4C1c62Z4Ag" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3 id="fastapi-0100" >
&lt;div>
&lt;a href="#fastapi-0100">
##
&lt;/a>
FastAPI 0.100
&lt;/div>
&lt;/h3>
&lt;p>Em julho de 2023, o FastAPI adiciona o suporte ao pydantic v2. O que não demorou muito em relação ao lançamento da v2.&lt;/p>
&lt;h2 id="saúde-mental" >
&lt;div>
&lt;a href="#sa%c3%bade-mental">
#
&lt;/a>
Saúde mental
&lt;/div>
&lt;/h2>
&lt;p>Com toda a demora, &amp;ldquo;futurologia&amp;rdquo; e trabalhando na &amp;ldquo;diagonal&amp;rdquo; do conteúdo. É claro que eu não estava feliz. As pessoas me cobravam? Claro que sim&amp;hellip;&lt;/p>
&lt;p>Mas o meu &lt;strong>MAIOR&lt;/strong> inimigo fui eu mesmo. Eu não soube lidar com a pressão dos atrasos, começava e parava de fazer várias coisas que estavam &amp;ldquo;entorno&amp;rdquo; desse projeto, mas eu nunca encarava ele de frente. Eu estava com vergonha de conversar com as pessoas, eu estava com vergonha de &amp;ldquo;não ser suficiente&amp;rdquo;. Enquanto as lives python aconteciam, eu me sentia &lt;strong>MUITO&lt;/strong> mal. Isso não foi bom pra mim de maneira geral.&lt;/p>
&lt;p>&lt;strong>Foi péssimo!&lt;/strong>&lt;/p>
&lt;p>E essa vergonha e culpa me fizeram eu me comunicar muito mal, mais que o normal. Com quem apoiou o projeto, com quem queria saber como estava o andamento, com quem &lt;strong>confiou que eu tinha capacidade de fazer esse curso&lt;/strong>!&lt;/p>
&lt;h3 id="o-estopim-da-fúria" >
&lt;div>
&lt;a href="#o-estopim-da-f%c3%baria">
##
&lt;/a>
O estopim da fúria
&lt;/div>
&lt;/h3>
&lt;p>As pessoas sempre viviam me perguntando sobre o curso. Vendo agora em retrospecto, eu entendo que elas estavam curiosas sobre o que estava acontecendo, sobre o andamento. Nunca ninguém* me disse nada em tom de cobrança. Até porque eu andava fazendo lives na &lt;a href="https://www.twitch.tv/dunossauro">twitch&lt;/a> quase que diariamente, trabalhando no &amp;ldquo;material perfeito&amp;rdquo;, aquele mesmo&amp;hellip; a diagonal da diagonal.&lt;/p>
&lt;p>No dia 1 de julho de 2023, recebi a mensagem de milhões no privado do telegram:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Já faz mais de um ano que a campanha acabou e você ainda não entregou o material e nem fala mais sobre isso. Você enganou todas as pessoas e eu investi 50 reais nesse material. Você me roubou!&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Reescrevi essa mensagem em um tom parecido com o que a pessoa usou, claro, além de ter sido chamado de ladrão. Vamos dizer que a pessoa me mandou tomar no *, me chamou de filho de você sabe quem, etc.&lt;/p>
&lt;h3 id="a-resposta-a-incidentes" >
&lt;div>
&lt;a href="#a-resposta-a-incidentes">
##
&lt;/a>
A resposta a incidentes
&lt;/div>
&lt;/h3>
&lt;p>Quando recebi essa mensagem, eu realmente entendi que eu &amp;ldquo;era um merda mesmo!&amp;rdquo;. Chorei bastante nesse dia. Eu realmente era incapaz de lidar com essa situação.&lt;/p>
&lt;p>Depois de horas de choro, que foram longas, eu cheguei a uma conclusão: &amp;ldquo;Quer saber&amp;hellip; &lt;strong>FODA-SE&lt;/strong>, eu vou fazer tudo de uma forma nova. Uma que eu consiga entregar o que as pessoas querem. Sem masturbação mental, sem caçar detalhes em APIs, em coisas estupidamente complexas que ninguém quer nem saber&amp;rdquo;.&lt;/p>
&lt;h2 id="o-material-em-texto" >
&lt;div>
&lt;a href="#o-material-em-texto">
#
&lt;/a>
O material em texto
&lt;/div>
&lt;/h2>
&lt;p>Esse sentimento amargo na boca, a raiva e a cobrança forte me fizeram ir por outro caminho. Vendo em retrospecto, talvez esse caminho seja o que deveria ter sido tomado desde quando comecei a escrever o &amp;ldquo;maravilhoso profundo&amp;rdquo;.&lt;/p>
&lt;p>As coisas mudaram um pouco de rumo quando entendi que o material deveria ser diferente das rotineiras lives de python. No sentido de tentar destrinchar tudo, todo o tempo, com a complexidade que o tempo permitia. Esse projeto poderia se apoiar nas duzentas e algumas lives que já existiam. O curso poderia apontar tangentes que as lives tradicionais preencheriam.&lt;/p>
&lt;p>No sentido de que ele deveria ser um &lt;strong>projeto&lt;/strong> feito de ponta a ponta. Com todos os entornos colocados na ideia inicial. Banco de dados, Async, testes, CI, deploy, etc.&lt;/p>
&lt;p>Nessa virada de chave, eu sentei e, em alguns poucos dias, esbocei as primeiras cinco aulas em formato de texto.&lt;/p>
&lt;h3 id="mas-texto-não-eram-vídeos" >
&lt;div>
&lt;a href="#mas-texto-n%c3%a3o-eram-v%c3%addeos">
##
&lt;/a>
Mas texto? Não eram vídeos?
&lt;/div>
&lt;/h3>
&lt;p>Trabalhar com texto é extremamente mais exaustivo e complexo do que gravar os vídeos com um roteiro básico e ir no flow e editar tudo depois. Sendo bem sincero, acho que poder me esconder atrás de um monte de palavras parecia mais atraente no primeiro momento.&lt;/p>
&lt;p>Não podia ter tomado uma decisão mais certeira do que essa! Embora o custo de escrever seja mais alto, corrigir o texto e fazer o deploy de páginas é extremamente mais fácil do que regravar uma aula e editar.&lt;/p>
&lt;p>O interessante, no final das contas, é que acredito que o que gerou mais valor em tudo que foi produzido desse curso, o texto é de cara a coisa mais importante. Textos são acessíveis, nem todas as pessoas gostam de vídeos e claro, sim&amp;hellip; &lt;strong>dá pra pesquisar no texto&lt;/strong>.&lt;/p>
&lt;h4 id="o-texto-me-permitiu-mais-do-que-isso" >
&lt;div>
&lt;a href="#o-texto-me-permitiu-mais-do-que-isso">
###
&lt;/a>
O texto me permitiu mais do que isso
&lt;/div>
&lt;/h4>
&lt;p>Mas do que as aulas, o texto me permitiu usar recursos interativos como os quizzes ao final das aulas. Essa foi uma das coisas mais elogiadas e que, durante as lives que assisti com as pessoas fazendo o curso pelo material de texto, elas sempre diziam que o carinho com o material era tão bom que até em &amp;ldquo;fixação do material&amp;rdquo; eu tinha pensado.&lt;/p>
&lt;p>Claro, outras coisas incríveis puderam ser feitas. Muitas delas, graças ao &lt;code>markdown-exec&lt;/code>, que me permitiu fazer coisas interativas que mantinham sempre tudo atualizado, datas, versões, execução de código&amp;hellip;&lt;/p>
&lt;p>As contribuições das pessoas foram incríveis. Corrigindo texto, legibilidade, erros de gramática, exercícios, fazendo sugestões. Isso fez o senso de comunidade em torno do material ser mais &amp;ldquo;ativa&amp;rdquo; no lugar da receptividade &amp;ldquo;depositária&amp;rdquo; dos vídeos.&lt;/p>
&lt;h4 id="comunicação-do-material" >
&lt;div>
&lt;a href="#comunica%c3%a7%c3%a3o-do-material">
###
&lt;/a>
Comunicação do material
&lt;/div>
&lt;/h4>
&lt;p>Divulguei isso para os apoiadores no grupo do telegram no dia 17 de julho de 2023.&lt;/p>
&lt;blockquote>
&lt;p>Galera, só atualizando vocês dessa sprint maluca que eu disse que ia fazer nessa semana.
Consegui roteirizar as aulas: &lt;a href="https://fastapidozero.dunossauro.com/">https://fastapidozero.dunossauro.com/&lt;/a>&lt;/p>
&lt;p>Ainda tem bastante coisa pra ajustar isso pra ser um texto &amp;ldquo;claro&amp;rdquo; para referências, mas a progressão está toda aí.&lt;/p>
&lt;p>O repo para quem quiser furtricar, se quiser mandar alguma coisa. Tá tudo aqui:&lt;/p>
&lt;p>&lt;a href="https://github.com/dunossauro/fastapi-do-zero">https://github.com/dunossauro/fastapi-do-zero&lt;/a>&lt;/p>
&lt;p>Meu objetivo é começar a gravar tudo isso na quarta, vou tirar hoje e amanhã pra trabalhar nessa parte da composição visual (tipografia cores e etc&amp;hellip;)&lt;/p>
&lt;/blockquote>
&lt;p>Sim&amp;hellip; em um pouco mais de um ano, essa foi toda a comunicação &amp;ldquo;oficial&amp;rdquo; que fiz do material.&lt;/p>
&lt;p>Não exatamente só essa, fomos bastante ativos no telegram durante esse ano. Papeando e conversando sobre todo o processo (nunca explicitamente como nesse texto), mas as pessoas sabiam do andamento das coisas. Mas eram conversas que se perdiam com facilidade no grupo.&lt;/p>
&lt;h4 id="olhando-pra-trás" >
&lt;div>
&lt;a href="#olhando-pra-tr%c3%a1s">
###
&lt;/a>
Olhando pra trás
&lt;/div>
&lt;/h4>
&lt;p>Olhando em retrospecto, fica claro pra mim que isso estava acontecendo desde que comecei a escrever o material de apoio. Mas a utilidade do material de apoio não fazia sentido na minha cabeça. Todo o tempo achei que estava &amp;ldquo;me enganando&amp;rdquo;, fugindo do tópico central. Na verdade, era a melhor forma de expressar o que eu estava querendo, mas eu não estava com o caminho bem definido do que o curso &lt;strong>tinha que ser&lt;/strong> em relação ao que eu achava que deveria ser.&lt;/p>
&lt;h3 id="a-volta-dos-vídeos-que-também-não-foram" >
&lt;div>
&lt;a href="#a-volta-dos-v%c3%addeos-que-tamb%c3%a9m-n%c3%a3o-foram">
##
&lt;/a>
A volta dos vídeos que também não foram
&lt;/div>
&lt;/h3>
&lt;p>Embora os textos estivessem no formato &amp;ldquo;perfeito&amp;rdquo; para acompanhar os vídeos e ser a base deles, no momento eu estava me sentindo um merda. Um ladrão&amp;hellip;&lt;/p>
&lt;p>Fui gravar de novo, como prometi no grupo de apoiadores. Dessa vez, já com a ideia do &amp;ldquo;projeto&amp;rdquo;.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/videos-fastapi.png"/>&lt;figcaption>
&lt;h4>Os vídeos nunca lançados...&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Outro grupo de quatro aulas que nunca viram a luz do sol. Só que dessa vez, gravar não foi fácil. Eu tinha o roteiro do que eu queria, eu sabia como fazer, mas eu não conseguia.&lt;/p>
&lt;p>Um dos episódios dessas gravações é muito claro na minha mente. Eu pedi pra minha parceira ficar no quarto comigo enquanto eu gravava. Eu estava perdendo o fôlego durante as falas, irritadiço. Eu não conseguia falar, eu estava me sentindo culpado o tempo todo.&lt;/p>
&lt;p>Decidi tirar alguns dias sem gravar, pra tentar acalmar as ideias. Lembro que vomitei de nervoso duas vezes tentando gravar a quinta aula.&lt;/p>
&lt;h3 id="erros-de-comunicação" >
&lt;div>
&lt;a href="#erros-de-comunica%c3%a7%c3%a3o">
##
&lt;/a>
Erros de comunicação
&lt;/div>
&lt;/h3>
&lt;p>Sofri e me culpei em silêncio por bastante tempo, mas decidi, com a comunicação pífia, que eu iria escrever &lt;strong>TUDO&lt;/strong> antes de tentar voltar a gravar. E fui fazendo o texto e postando os updates. A galera foi curtindo, foi dando os feedbacks, foi contribuindo com melhorias. Tudo isso foi ótimo, na minha cabeça confusa da época, e evitou que eu tivesse que falar abertamente dos motivos pelos quais os vídeos nunca saíram.&lt;/p>
&lt;h4 id="acompanhamentos-periódicos" >
&lt;div>
&lt;a href="#acompanhamentos-peri%c3%b3dicos">
###
&lt;/a>
Acompanhamentos periódicos?
&lt;/div>
&lt;/h4>
&lt;p>De todos os tópicos, esse é o que me dói mais. É um combo de vergonha e atraso sem fim. Na minha cabeça pairava que avisar &amp;ldquo;estou atrasado, mas estou fazendo X&amp;hellip;&amp;rdquo; era péssimo.&lt;/p>
&lt;p>Isso virava uma bola de neve na minha cabeça: &amp;ldquo;Pô, pq avisar? Eu ainda estou travado fazendo coisas que não devia enquanto espero as majors&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>Essa foi a pior escolha possível! Manter as pessoas informadas teria me tirado um peso tão grande das costas.&lt;/p>
&lt;h2 id="além-do-texto-as-lives" >
&lt;div>
&lt;a href="#al%c3%a9m-do-texto-as-lives">
#
&lt;/a>
Além do texto, as lives
&lt;/div>
&lt;/h2>
&lt;p>Acho que nunca me recuperei do silêncio antes da primeira palma seguida por &amp;ldquo;Olá, boas-vindas ao curso de FastAPI&amp;rdquo; sem me sentir um bandido. Se eu não conseguiria fazer isso dessa forma, decidi que pelo menos a primeira apresentação do curso deveria ser síncrona. No sentido de que faríamos em lives, conversando e sem a pressão do silêncio, &amp;ldquo;você me roubou&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>Com isso, o material de texto foi andando durante quase um ano. Quando de fato anunciei, em 17 de abril de 2024, a data das lives e algum tempinho depois fechamos a v1.0 do material.&lt;/p>
&lt;p>As lives foram divertidas, a galera super acompanhou, gostou do material, da forma final de como tudo ficou. Bastante gente fez os projetos.&lt;/p>
&lt;h2 id="final-feliz-não" >
&lt;div>
&lt;a href="#final-feliz-n%c3%a3o">
#
&lt;/a>
Final feliz, não?
&lt;/div>
&lt;/h2>
&lt;p>Sabe aquele incômodo de &lt;strong>não estar &amp;ldquo;perfeito&amp;rdquo;&lt;/strong>? Ele continuava a me massacrar. Eu &amp;ldquo;roubei&amp;rdquo; mesmo as pessoas&amp;hellip; Eu disse que teriam coisas, e no final, elas não estavam no conteúdo.&lt;/p>
&lt;p>Mas, afinal, o que estava faltando? O &lt;code>asyncio&lt;/code>!&lt;/p>
&lt;p>Eu dormia pensando nisso, acordava pensando nisso, tomava banho pensando nisso. Como pude fazer um curso todo sem falar sobre programação assíncrona? Passei meses escrevendo sobre isso, fizemos lives sobre o sqlalchemy assíncrono. Mas, no final, na correria de tentar entregar tudo o mais rápido possível&lt;sup id="fnref:4">&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref">4&lt;/a>&lt;/sup>, eu me pressionei a não colocar mais aulas no texto.&lt;/p>
&lt;p>Foi nessa espiral da desgraça que decidi que iria incluir uma nova aula no texto sobre programação assíncrona e que, depois dessa aula, que iria ser inserida no meio do material, todo o código deveria seguir de forma assíncrona.&lt;/p>
&lt;p>Resultado? Mais retrabalho! Mas pensa &lt;strong>NO&lt;/strong> retrabalho em revisar metade do curso, pensando em refazer explicações e alterando códigos&amp;hellip;&lt;/p>
&lt;p>Nessa hora, eu agradeci por ter feito tudo em texto&amp;hellip; Isso pode me guiar pra fazer as coisas sem errar. Embora, talvez, eu nem precisasse ter feito nada disso, eu me sentia na obrigação.&lt;/p>
&lt;p>Esse processo durou mais alguns meses, com isso foram marcadas outra saga de aulas síncronas. Que ficaram conhecidas como o &amp;ldquo;Curso de 2025&amp;rdquo;.&lt;/p>
&lt;p>Adicionei somente o &lt;code>asyncio&lt;/code>? Você leu o texto até aqui&amp;hellip; Você sabe que não. Eu revisei o material todo e aulas que tinham 15/20 minutos de leitura média se tornaram monstros de 40 minutos de leitura. Testes foram revisados, toda a interação com o banco de dados foi revisada, eventos, apêndices, novas questões nos quizzes&amp;hellip; Bom&amp;hellip; Foi um retrabalho danado.&lt;/p>
&lt;p>Foi lançada a v2 do texto com todas essas alterações. Que foram levadas mais adiante e depois de mais reescrita, viraram a v3.&lt;/p>
&lt;p>Finalmente, eu achei que estávamos perto do que eu queria, reescrevi mais um bocado e a v4 foi lançada e marcadas as datas das &amp;ldquo;reapresentações&amp;rdquo;.&lt;/p>
&lt;h3 id="um-acontecimento-tardio-mas-especial" >
&lt;div>
&lt;a href="#um-acontecimento-tardio-mas-especial">
##
&lt;/a>
Um acontecimento tardio, mas especial
&lt;/div>
&lt;/h3>
&lt;p>Como me disse meu pai uma vez:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;É só pegar o que sabe fazer de melhor. Se você for fazer pra você, pode ter certeza que vai sair mal feito&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Em 29 de janeiro de 2025, eu me dei conta do que poderia ter resolvido meses de angústia. Por que raios eu não fiz &amp;ldquo;logs&amp;rdquo; de trabalho? No que estava trabalhando, o como e com as datas. Isso poderia ter me poupado de tanto sofrimento. Uma página que fosse.&lt;/p>
&lt;p>Nesse dia, eu introduzi o Towncrier no material de texto. O que acabou se tornando uma live de python &lt;a href="https://youtu.be/ATKJXpHrBfE">&amp;ldquo;Entendendo Changelogs: O que são, seus padrões e como gerá-los com Towncrier &amp;ldquo;&lt;/a>.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ATKJXpHrBfE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Olhando agora, não é como se eu nunca tivesse assistido/lido devlogs, principalmente de jogos. E também não tivesse escrito release notes e feito changelogs em projetos de código. É engraçado ver que eu deveria ter pensado nisso. Talvez esse tenha sido o meu maior aprendizado durante esse processo. Isso ajudaria a informar as pessoas, ter uma fonte única dos eventos e também ter aliviado MUITO estresse e ansiedade.&lt;/p>
&lt;h2 id="final-feliz-não-2" >
&lt;div>
&lt;a href="#final-feliz-n%c3%a3o-2">
#
&lt;/a>
Final feliz, não? [2]
&lt;/div>
&lt;/h2>
&lt;p>Não&amp;hellip; Algumas questões foram levantadas durante as apresentações, ccomo o fato de que dessa vez tinha menos gente do que da primeira vez ao vivo e as lives tinham a duração 1/4 maior, mais perguntas, mais formas de uso foram levantadas&amp;hellip;&lt;/p>
&lt;p>Resumo, o texto ganhou a v4.1.&lt;/p>
&lt;h2 id="depois-disso-tudo" >
&lt;div>
&lt;a href="#depois-disso-tudo">
#
&lt;/a>
Depois disso tudo&amp;hellip;
&lt;/div>
&lt;/h2>
&lt;p>Bom&amp;hellip; Demorou muito mais do que eu previa, eu acabei entrando em parafuso algumas vezes. Tento ver isso de dois pontos diferentes.&lt;/p>
&lt;ol>
&lt;li>É que no final deu tudo certo, o material tem a qualidade que eu gostaria que tivesse, embora o &amp;ldquo;produto final&amp;rdquo; tenha se desenrolado completamente diferente do que eu imaginei no início.&lt;/li>
&lt;li>Foi estupidamente desgastante e angustiante. O processo não foi bom.&lt;/li>
&lt;/ol>
&lt;h3 id="erros" >
&lt;div>
&lt;a href="#erros">
##
&lt;/a>
Erros
&lt;/div>
&lt;/h3>
&lt;p>Se puder elencar os pontos onde mais errei, eu destacaria alguns.&lt;/p>
&lt;h4 id="comunicação-da-campanha" >
&lt;div>
&lt;a href="#comunica%c3%a7%c3%a3o-da-campanha">
###
&lt;/a>
Comunicação da campanha
&lt;/div>
&lt;/h4>
&lt;p>Esse foi um erro cometido durante todo o processo. Desde a abertura da campanha. Não ficou claro pra muitas pessoas que se tratava de uma campanha &amp;ldquo;tudo ou nada&amp;rdquo;. Que eu só começaria a trabalhar no material caso a campanha fosse bem sucedida.&lt;/p>
&lt;p>Acredito que essa parte de &amp;ldquo;campanhas&amp;rdquo; seja meio que novidade para algumas pessoas e a &amp;ldquo;cultura&amp;rdquo; de comprar cursos também não ajuda muito. Grande parte achou que o material seria liberado ao final da campanha de um mês. Se tivesse deixado isso mais claro, talvez o início do trabalho teria sido menos frustrante pra mim.&lt;/p>
&lt;h4 id="comunicação-do-processo" >
&lt;div>
&lt;a href="#comunica%c3%a7%c3%a3o-do-processo">
###
&lt;/a>
Comunicação do processo
&lt;/div>
&lt;/h4>
&lt;p>Como já mencionei algumas vezes ao longo desse texto, talvez se eu tivesse feito um &amp;ldquo;devlog&amp;rdquo; ou simplesmente uma página mantendo o processo, o que estava sendo feito, explicitamente claro, isso poderia ter sido evitado.&lt;/p>
&lt;p>Ter &amp;ldquo;uma única fonte de verdade&amp;rdquo; foi o que mais faltou aqui. Lembro que, quando comecei os changelogs, isso me aliviou de uma forma absurda.&lt;/p>
&lt;p>Se isso fosse pensado no início, eu poderia já ter deixado claro na divulgação da campanha.&lt;/p>
&lt;h4 id="desespero" >
&lt;div>
&lt;a href="#desespero">
###
&lt;/a>
Desespero
&lt;/div>
&lt;/h4>
&lt;p>Acho que perdi a sanidade quando as coisas foram anunciando versões e eu não soube lidar com essas coisas. O que acabou me deixando extremamente frustrado e sem norte. Eu queria fazer, mas queria fazer &amp;ldquo;perfeito&amp;rdquo;. Essa busca pelo inalcançável me machucou bastante.&lt;/p>
&lt;p>Embora no final essa subsequência de acontecimentos e espera tenham me feito escrever, esse foi o maior trunfo de todo o material, na minha opinião.&lt;/p>
&lt;h4 id="prazo" >
&lt;div>
&lt;a href="#prazo">
###
&lt;/a>
Prazo
&lt;/div>
&lt;/h4>
&lt;p>Bom&amp;hellip; aqui eu errei rude. Eu não previ a complexidade das coisas porque eu pensei em algo e, na hora de executar, quis fazer de outra forma totalmente diferente. O fato de não ter uma data pra tudo estar &amp;ldquo;pronto&amp;rdquo; fez com que eu fosse me arrastando em projetos diagonais.&lt;/p>
&lt;p>Eu colocaria um prazo, olhando de fora? Acredito que não, mas pontuar &amp;ldquo;checkpoints&amp;rdquo; de metas possíveis poderia ter me ajudado.&lt;/p>
&lt;h4 id="a-entrega" >
&lt;div>
&lt;a href="#a-entrega">
###
&lt;/a>
A entrega
&lt;/div>
&lt;/h4>
&lt;p>No final, o que entreguei foi muito diferente do que foi prometido. As pessoas esperavam um curso em vídeo. Eu entreguei um mega material em texto e aulas síncronas.&lt;/p>
&lt;p>Eu acho que a entrega final foi 200x melhor do que o que foi proposto, mas ainda assim não foi o que foi prometido.&lt;/p>
&lt;h4 id="timing" >
&lt;div>
&lt;a href="#timing">
###
&lt;/a>
timing
&lt;/div>
&lt;/h4>
&lt;p>Convenhamos&amp;hellip; Eu escolhi literalmente o PIOR momento pra fazer esse curso. É aquela coisa de estar no lugar errado e na hora errada.&lt;/p>
&lt;p>Se eu tivesse começado antes ou alguns meses depois, o desenrolar das releases que foi o que mais me deixou maluco, tudo teria acontecido de outra forma.&lt;/p>
&lt;h3 id="acertos" >
&lt;div>
&lt;a href="#acertos">
##
&lt;/a>
Acertos
&lt;/div>
&lt;/h3>
&lt;p>Bom&amp;hellip; Nem tudo deu errado. Talvez eu valorize mais essas coisas por terem sido duras demais pra mim durante o processo. Mas eu aprendi muito do que não fazer e de como fazer coisas melhores do que pensei que seria capaz de entregar.&lt;/p>
&lt;h4 id="a-campanha-1" >
&lt;div>
&lt;a href="#a-campanha-1">
###
&lt;/a>
A campanha
&lt;/div>
&lt;/h4>
&lt;p>Claro, a campanha foi um grande acerto. Ver que as pessoas acreditam e confiam no material que eu desenvolvo, não tem preço. Saber que tem alguém que conta com você, que te incentiva&amp;hellip; Isso faz toda a diferença.&lt;/p>
&lt;p>Muitas das pessoas que contribuíram para o material, assim como na live de Python, de maneira geral, não esperavam pelo resultado. Contribuíram por saber que esse material contribuiria com o conhecimento de outras pessoas.&lt;/p>
&lt;p>Pensar nisso agora me arrancou uma lágrima. A nossa comunidade, que é um subconjunto da comunidade de Python em geral, tem essa coisa incrível de sempre estar disposta, se permitir, contribuir com o crescimento das outras pessoas.&lt;/p>
&lt;h4 id="o-texto" >
&lt;div>
&lt;a href="#o-texto">
###
&lt;/a>
O texto
&lt;/div>
&lt;/h4>
&lt;p>Você já deve ter cansado de me ouvir falar disso. Mas, de verdade, o material em texto é literalmente A MELHOR coisa que foi produzida por esse material.&lt;/p>
&lt;p>Ele é um guia, um tutorial, um livro. É buscável, permitiu os quizzes, atualizações periódicas, o versionamento.&lt;/p>
&lt;p>Olhando em retrospecto, eu não imagino como esse material seria sem o material de texto. Ele literalmente é a coisa mais rica que já produzi na vida. Sem brincadeira.&lt;/p>
&lt;p>Eu já tinha me arriscado a escrever no passo, com o material de funcional (nunca terminado) e o material de ansible (usado para uma live apenas). Eu não consigo imaginar por que não pensei nisso antes.&lt;/p>
&lt;hr>
&lt;p>Outro ponto aqui foi que ter o texto ativou o modo &amp;ldquo;pê errers&amp;rdquo; das pessoas. Elas pegaram o material para si e contribuíram MUITO. Grafia, sugestões de aula, fontes acessíveis, sugestões de ferramentas. Tudo que um projeto aberto é capaz de proporcionar.&lt;/p>
&lt;h4 id="os-changelogs" >
&lt;div>
&lt;a href="#os-changelogs">
###
&lt;/a>
Os changelogs
&lt;/div>
&lt;/h4>
&lt;p>Ter uma fonte de verdade, do que está sendo feito, das pequenas entregas. Além de mostrar pras pessoas o progresso do que está acontecendo, me deram uma sensação de &amp;ldquo;olha, eu fiz alguma coisa essa semana&amp;rdquo;. Que era um sentimento que me massacrava. Trabalhava às vezes por dias sem pausa e a sensação de não ter &amp;ldquo;feito nada&amp;rdquo; era sempre grande, o que me desmotivava muito.&lt;/p>
&lt;h3 id="o-presente-com-fatos" >
&lt;div>
&lt;a href="#o-presente-com-fatos">
##
&lt;/a>
O presente com fatos!
&lt;/div>
&lt;/h3>
&lt;p>Tanto o Pydantic quanto o SQLAlchemy ainda mantêm ativas, recebendo bugfixes, as versões 1 em setembro de 2025. Mesmo após anos da mudança de major&amp;hellip; Ah, claro, o FastAPI ainda hoje 0.117.1 (2025) também suporta o pydantic v1 :)&lt;/p>
&lt;p>Ou seja… eu estava desesperado tentando prever um futuro que hoje, três anos depois, não se concretizou.&lt;/p>
&lt;p>Em algum momento, a mudança do poetry v1 -&amp;gt; v2 também foi alvo da minha preocupação, pois era a base do projeto. Olhando agora com menos desespero, é retrocompatível com &lt;code>pyproject&lt;/code> antigo.&lt;/p>
&lt;p>Coisas que pareciam o fim do mundo, que me deixam sentado no escuro sozinho.&lt;/p>
&lt;h2 id="eu-faria-isso-de-novo" >
&lt;div>
&lt;a href="#eu-faria-isso-de-novo">
#
&lt;/a>
Eu faria isso de novo?
&lt;/div>
&lt;/h2>
&lt;p>Responder isso é bem complicado.&lt;/p>
&lt;p>Mesmo que tenha sido péssimo passar por esse processo, eu cresci muito como pessoa. Eu encontrei falhas nos meus processos, entendi como expor melhor as minhas ideias, ser mais transparente com os processos.&lt;/p>
&lt;p>Talvez eu faça de novo, não em período curto. É bom deixar claro. Hahahahah&lt;/p>
&lt;p>Embora tenha aprendido muito, esse processo me machucou bastante. O resultado foi positivo, vendo agora, após um tempo. Mas enquanto as coisas estavam acontecendo, eu não soube lidar com a maioria das coisas que aconteceram, no momento em que aconteciam pareciam socos no meu estômago.&lt;/p>
&lt;p>Mas, eu faria tudo de forma diferente, se fosse uma nova coisa. Eu focaria no texto, na transparência, as aulas ficariam pro final, depois que tudo estivesse redondo.&lt;/p>
&lt;p>No fim&amp;hellip; o resultado me deixou bastante feliz e o processo me trouxe muita coisa ruim, mas aprendizados importantes pra lidar com essas coisas no futuro.&lt;/p>
&lt;hr>
&lt;p>Pra vocês, como espectadores, como foi tudo isso? Eu adoraria saber.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Mal sabia eu&amp;hellip;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Obviamente, essa opinião é compartilhada pelo total de zero pessoas, mas vive latejante na minha mente.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>Quanta ingenuidade&amp;hellip; deus&amp;hellip;&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:4">
&lt;p>Como se dois anos de espera não tivessem sido o suficiente&amp;hellip;&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>O que andei lendo...</title><link>https://blog.dunossauro.com/posts/o-que-andei-lendo/</link><pubDate>Wed, 27 Aug 2025 12:09:36 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/o-que-andei-lendo/</guid><description>&lt;p>Recentemente adentrei em mais um pedacinho do fediverso, o &lt;a href="https://joinbookwyrm.com/pt-br/">bookwyrm&lt;/a>, uma rede social de leitura e reviews de livros. Confesso que, embora seja um leito regular, eu nunca tive interesse nessas redes. Mas, sempre me perguntam o que ando lendo por aí e eu raramente consigo lembrar de pronto o que andei lendo nos últimos meses.&lt;/p>
&lt;p>Decidi criar uma conta só para lembrar do que li recentemente sem fazer grande esforço. Mas, como criei agora, resolvi nesse post relembrar algumas leituras que fiz nesses últimos dois/três meses. Não vou dar spoilers de nada, quiçá contar a história. A ideia é somente listar as leituras.&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://bookwyrm.social/user/dunossauro">Meu perfil no bookwyrm&lt;/a>, caso queira fazer amizades por lá :)&lt;/p>
&lt;/blockquote>
&lt;h2 id="o-homem-sem-talento-por-yoshiraru-tsuge" >
&lt;div>
&lt;a href="#o-homem-sem-talento-por-yoshiraru-tsuge">
#
&lt;/a>
&amp;ldquo;O homem sem talento&amp;rdquo;, por Yoshiraru Tsuge
&lt;/div>
&lt;/h2>
&lt;p>Mangá clássico do &lt;a href="https://pt.wikipedia.org/wiki/Watakushi_shosetsu">watakushi&lt;/a> que reúne histórias autobiográficas do &lt;a href="https://en.wikipedia.org/wiki/Yoshiharu_Tsuge">Tsuge&lt;/a>.&lt;/p>
&lt;p>Confesso que tentei ler esse mangá uns dois anos atrás, mas o tom &amp;ldquo;ode ao fracasso&amp;rdquo; me fez abandonar por não estar no melhor momento também. É uma obra densa, triste, mas de certa forma libertadora. Machuca&amp;hellip;&lt;/p>
&lt;p>&lt;a href="https://openlibrary.org/works/OL11641330W/Munou_no_Hito?edition=key%3A/books/OL33175348M">open library&lt;/a>&lt;/p>
&lt;h2 id="dois-irmãos-por-fábio-moon-e-gabriel-bá" >
&lt;div>
&lt;a href="#dois-irm%c3%a3os-por-f%c3%a1bio-moon-e-gabriel-b%c3%a1">
#
&lt;/a>
&amp;ldquo;Dois irmãos&amp;rdquo;, por Fábio Moon e Gabriel Bá
&lt;/div>
&lt;/h2>
&lt;p>Quadrinho brasileiro que adapta a obra de &lt;a href="https://pt.wikipedia.org/wiki/Milton_Hatoum">Milton Hatoum&lt;/a>. Retrata a história de uma família de imigrantes libaneses vivendo em Manaus-AM na década de 40.&lt;/p>
&lt;p>Leitura bastante interessante, ganhei esse quadrinho da organização da Python Brasil em Manaus, confesso que demorei bastante para ler. Mas é uma história muito gostosa de ler, o quadrinho é lindo. Após a leitura, descobri que o livro original agora é tema da Fuvest (boa sorte na prova, se você chegou até esse link por conta disso :))&lt;/p>
&lt;p>&lt;a href="https://openlibrary.org/works/OL26427340W/Dois_Irmaos_-?edition=key%3A/books/OL35697166M">open library&lt;/a>&lt;/p>
&lt;h2 id="o-apanhador-no-campo-de-centeio-por-j-d-salinger" >
&lt;div>
&lt;a href="#o-apanhador-no-campo-de-centeio-por-j-d-salinger">
#
&lt;/a>
&amp;ldquo;O apanhador no campo de centeio&amp;rdquo;, por J. D. Salinger
&lt;/div>
&lt;/h2>
&lt;p>Tenho uma relação estranha com esse livro. Tem algo no Holden que me cativa. Essa deve ser a quarta vez que eu pego esse livro pra reler e eu o adoro.&lt;/p>
&lt;p>&lt;a href="https://openlibrary.org/works/OL26414922W/O_Apanhador_no_Campo_de_Centeio?edition=key%3A/books/OL35663922M">open library&lt;/a>&lt;/p>
&lt;h2 id="o-estrangeiro-por-albert-camus" >
&lt;div>
&lt;a href="#o-estrangeiro-por-albert-camus">
#
&lt;/a>
&amp;ldquo;O estrangeiro&amp;rdquo;, por Albert Camus
&lt;/div>
&lt;/h2>
&lt;p>&lt;strong>Absurdismo do começo ao fim&lt;/strong>. Fiquei bastante frustrado com a minha edição que dava o plot da história logo na orelha do livro&amp;hellip;&lt;/p>
&lt;p>Depois da leitura, nas pesquisas sobre o livro, descobri que o pensado pelo Camus era que o Sísifo fosse lido antes. Bom&amp;hellip; vai ser lido depois em algum momento xD&lt;/p>
&lt;p>&lt;a href="https://openlibrary.org/works/OL1230613W/L%E2%80%99%C3%A9tranger?edition=key%3A/books/OL50972958M">open library&lt;/a>&lt;/p>
&lt;h2 id="relato-de-um-náufrago-por-gabriel-garcia-marquez" >
&lt;div>
&lt;a href="#relato-de-um-n%c3%a1ufrago-por-gabriel-garcia-marquez">
#
&lt;/a>
&amp;ldquo;Relato de um náufrago&amp;rdquo;, por Gabriel Garcia Marquez
&lt;/div>
&lt;/h2>
&lt;p>Publicações de jornal de 1955 sobre o acidente da marinha colombiana narrados por Luis Alexandra Valesco e escritas por Gabo. Essas publicações foram um dos motivos do Gabo ser exilado da Colômbia.&lt;/p>
&lt;p>&lt;a href="https://openlibrary.org/works/OL274550W/Relato_de_un_n%C3%A1ufrago?edition=key%3A/books/OL9155428M">open library&lt;/a>&lt;/p>
&lt;hr>
&lt;p>Daqui pra frente vou tentar manter meu perfil no &lt;a href="https://bookwyrm.social/user/dunossauro">bookwyrm&lt;/a> atualizado. Vamos ver se consigo :)&lt;/p></description></item><item><title>Lembranças preciosas</title><link>https://blog.dunossauro.com/posts/lembrancas-preciosas/</link><pubDate>Tue, 08 Jul 2025 15:18:49 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/lembrancas-preciosas/</guid><description>&lt;p>Há alguns dias, estava conversando com as pessoas em uma live na Twitch do tempo que fui voluntário em um projeto que ensinava informática básica para a terceira idade e o quanto isso me marcou de diversas formas, o que pode ser assunto para outro blog post. Mas, quando saí da live, isso me despertou uma lembrança da minha avó paterna.&lt;/p>
&lt;p>Morei uma temporada da vida com meus avós, onde adquiri diversos hábitos que conservo até hoje. Às vezes me pego pensando nessas coisas e me emociono, outras vezes caio em gargalhadas.&lt;/p>
&lt;p>Minha avó não teve muita oportunidade de estudar, era uma católica devota, daquelas que ia à capela rezar o terço todos os fins de tarde. Era dócil e rabugenta, acredito que como todas as avós.&lt;/p>
&lt;p>Como estava no contexto de falar sobre educação durante a live. Me lembrei de várias tardes em que sentava ao lado da minha vó, na mesa da cozinha, tomando um iogurte caseiro que ela fazia, sem açúcar, pois era diabética, mas nós claramente colocávamos açúcar refinado na hora de comer, sem que ninguém nos visse. Ou então outra coisa maluca que comíamos, alface com açúcar.&lt;/p>
&lt;p>Durante essas tardes acontecia uma coisa que levei anos para entender. Minha vó estava fazendo lição de casa. Ela estava tendo o básico de uma educação formal em um supletivo. Tinha um caderno de caligrafia exemplar. Ela tinha tanto orgulho desse caderno, guardava-o em uma gaveta separada do móvel, onde não tinham outros cadernos, mas sim alguns cacarecos acumulados durante a vida. Fantasio hoje, depois de tantos anos, que ali deveriam estar algumas das coisas mais preciosas de sua vida. Lembro de um álbum de fotografias, alguns monóculos antigos também de fotos, algumas outras coisas pequenas das quais não consigo me lembrar agora.&lt;/p>
&lt;p>Uma vez na semana, ela se reunia com outras senhoras da igreja para bordar e pintar panos de prato. Que vendiam no bazar da igreja. Lembro terem sempre frutas pintadas e alguma mensagem, às vezes algo genérico, às vezes alguma passagem que consideravam belas, nas escrituras sagradas. Uma utilidade prática daquelas longas horas treinando caligrafia.&lt;/p>
&lt;p>Lembro de ir buscar minha avó na escola com meu vô em um Chevette prata, que era o xodó dele. Comíamos biscoito de polvilho enquanto esperávamos ela sair, sempre ao som de um bom pagode. Silêncio absoluto ouvindo as aventuras narradas por Tonico e Tinoco. Quando minha avó era avistada pelo meu avô, começavam os resmungos, uma cena digna de coragem, o cão covarde. Meu avô era o próprio Eustacio, enquanto minha avó era uma Muriel por completo. Íamos para casa ao som de uma viola chorando aqui, um resmungo ali.&lt;/p></description></item><item><title>Experimentando o Lima (Linux Machines)</title><link>https://blog.dunossauro.com/posts/conhecendo-o-lima/</link><pubDate>Wed, 30 Apr 2025 10:40:35 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/conhecendo-o-lima/</guid><description>&lt;p>Grande parte do meu trabalho, fora dos streams e vídeos, é dar suporte pra a comunidade. Eu tô sempre por ai, nos grupos da comunidade de python/emacs/GNU/linux, tentando ajudar da melhor maneira possível.&lt;/p>
&lt;blockquote>
&lt;p>Esse post estava no meu draft desde 2023. Não tinha absolutamente nada de interessante que fazia ele valer a pena para ser postado, depois &lt;a href="https://bolha.us/@dunossauro/114395710915156940">desse toot&lt;/a> achei que deveria postar!&lt;/p>
&lt;/blockquote>
&lt;h2 id="meu-problema-de-sempre" >
&lt;div>
&lt;a href="#meu-problema-de-sempre">
#
&lt;/a>
Meu problema de sempre
&lt;/div>
&lt;/h2>
&lt;p>Uma das coisas mais complicadas pra mim é tentar reproduzir o ambiente de desenvolvimento de outras pessoas. &amp;ldquo;Ah&amp;hellip; mas temos docker&amp;rdquo;, faz um tempo que tenho evitado usar docker por conta das licenças absurdas que eles veem impondo aos usuários. Você poderia me dizer que temos o podman então&amp;hellip; E você pode ter razão.&lt;/p>
&lt;p>O meu grande problema com essas ferramentas é que elas não substituem uma máquina virtual. Bom&amp;hellip; pra 99% das coisas, sim. Tirando que tenho que escrever um arquivo pra produzir um container. Mas, o problema começa quando preciso reproduzir o ambiente onde a pessoa executa o container. Fazer &lt;a href="https://www.docker.com/resources/docker-in-docker-containerized-ci-workflows-dockercon-2023/">DinD&lt;/a> ou &lt;a href="https://www.redhat.com/en/blog/podman-inside-container">PiC&lt;/a> não é a coisa mais simples do mundo, principalmente com o fato de que pra isso tenho que escrever um novo &lt;code>Dockerfile&lt;/code>. Em tem várias imagens, portas&amp;hellip; Definitivamente, isso não é prático.&lt;/p>
&lt;p>Em vários momentos, opto por ter uma máquina virtual pra tentar executar essas coisas. Simplifica um pouco o contexto. Aí lá vou eu usar outra plataforma proprietária, como o vagrant cloud pra procurar a distribuição que a pessoa usa. Aí dá aquele frio na espinha e você vê que mesmo no &lt;a href="https://portal.cloud.hashicorp.com/vagrant/discover/bento">bento&lt;/a> a imagem não está disponível pra &lt;a href="https://libvirt.org/">libvirt&lt;/a>. Legal, a gente vai de Virtualbox mesmo&amp;hellip; (imagine a minha cara agora&amp;hellip;). Faço o download da imagem, inicio, compartilho os arquivos com a VM, tenho que habilitar o guest, copia-e-cola unidirecional, montagem do path&amp;hellip; Sim, isso dá &lt;strong>MUITO&lt;/strong> trabalho e ocupa bastante espaço (o que às vezes eu não tenho).&lt;/p>
&lt;h2 id="lima" >
&lt;div>
&lt;a href="#lima">
#
&lt;/a>
Lima
&lt;/div>
&lt;/h2>
&lt;p>Após algumas buscas na interwebs em 2023, acabei conhecendo o &lt;a href="https://lima-vm.io/">Lima&lt;/a> [LInux MAchines] é uma ferramenta de linha de comando para criar sandboxes usando máquinas virtuais via CLI e com suporte a templates. Uma ferramenta bastante promissora, atualmente em estágio de &lt;a href="https://www.cncf.io/sandbox-projects/">sandbox da cncf&lt;/a> e com licença apache 2.0&lt;/p>
&lt;p>Por baixo dos panos ele cria VMs &lt;a href="https://www.qemu.org/">QEMU&lt;/a> [no linux, BSDs&amp;hellip;], &lt;a href="https://github.com/Code-Hex/vz">VZ&lt;/a> no MacOS e com &lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/about">WSL2&lt;/a> no Windows.&lt;/p>
&lt;p>Com um simples comando (e se necessário um arquivo yaml), temos uma VM funcional de &lt;a href="https://lima-vm.io/docs/templates/">diversas distribuições&lt;/a>, SSH aberto, sistema de arquivos compartilhado (read-only por default) e redirecionamento de portas.&lt;/p>
&lt;h3 id="instalação" >
&lt;div>
&lt;a href="#instala%c3%a7%c3%a3o">
##
&lt;/a>
Instalação
&lt;/div>
&lt;/h3>
&lt;p>Para instalar, você pode ir ao guia de &lt;a href="https://lima-vm.io/docs/installation/">instalação oficial&lt;/a>, mas um simples curl é o suficiente:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f5e0dc">VERSION&lt;/span>&lt;span style="color:#89dceb;font-weight:bold">=&lt;/span>&lt;span style="color:#cba6f7">$(&lt;/span>curl -fsSL https://api.github.com/repos/lima-vm/lima/releases/latest | jq -r .tag_name&lt;span style="color:#cba6f7">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL &lt;span style="color:#a6e3a1">&amp;#34;https://github.com/lima-vm/lima/releases/download/&lt;/span>&lt;span style="color:#a6e3a1">${&lt;/span>&lt;span style="color:#f5e0dc">VERSION&lt;/span>&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">/lima-&lt;/span>&lt;span style="color:#a6e3a1">${&lt;/span>&lt;span style="color:#f5e0dc">VERSION&lt;/span>:&lt;span style="color:#f5e0dc">1&lt;/span>&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">-&lt;/span>&lt;span style="color:#cba6f7">$(&lt;/span>uname -s&lt;span style="color:#cba6f7">)&lt;/span>&lt;span style="color:#a6e3a1">-&lt;/span>&lt;span style="color:#cba6f7">$(&lt;/span>uname -m&lt;span style="color:#cba6f7">)&lt;/span>&lt;span style="color:#a6e3a1">.tar.gz&amp;#34;&lt;/span> | tar Cxzvm /usr/local
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Como estou no arch, o pacote está disponível no &lt;a href="https://aur.archlinux.org/packages/lima">AUR&lt;/a>. O que torna tudo mais simples:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>paru -S lima
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mostando-a-magia-da-linha-de-comando" >
&lt;div>
&lt;a href="#mostando-a-magia-da-linha-de-comando">
##
&lt;/a>
Mostando a magia da linha de comando
&lt;/div>
&lt;/h3>
&lt;p>Bom&amp;hellip; Falamos, falamos&amp;hellip; Como funciona?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ limactl start default
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>? Creating an instance &lt;span style="color:#a6e3a1">&amp;#34;default&amp;#34;&lt;/span> &lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>Use arrows to move, &lt;span style="color:#89dceb">type&lt;/span> to filter&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;gt; Proceed with the current configuration
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Open an editor to review or modify the current configuration
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Choose another template &lt;span style="color:#89dceb;font-weight:bold">(&lt;/span>docker, podman, archlinux, fedora, ...&lt;span style="color:#89dceb;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Exit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;code>default&lt;/code> é um template base rodando ubuntu. Já vem com suporte a conteinerd/nerdctl e LXD&lt;/p>
&lt;/blockquote>
&lt;p>Um enter e temos a VM rodando via QEMU.&lt;/p>
&lt;h4 id="foi-isso-que-me-prometeram-mas-não-funcionou-" >
&lt;div>
&lt;a href="#foi-isso-que-me-prometeram-mas-n%c3%a3o-funcionou-">
###
&lt;/a>
Foi isso que me prometeram, mas não funcionou ;)
&lt;/div>
&lt;/h4>
&lt;blockquote>
&lt;p>caso o seu tenha, pule para &lt;a href="#usando-o-lima">Usando o lima&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>O erro:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>FATA&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0030&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> exiting, &lt;span style="color:#f5e0dc">status&lt;/span>&lt;span style="color:#89dceb;font-weight:bold">={&lt;/span>Running:false Degraded:false Exiting:true Errors:&lt;span style="color:#89dceb;font-weight:bold">[]&lt;/span> SSHLocalPort:0&lt;span style="color:#89dceb;font-weight:bold">}&lt;/span> &lt;span style="color:#89dceb;font-weight:bold">(&lt;/span>hint: see &lt;span style="color:#a6e3a1">&amp;#34;/home/dunossauro/.lima/default/ha.stderr.log&amp;#34;&lt;/span>&lt;span style="color:#89dceb;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Lendo o arquivo &lt;code>/home/dunossauro/.lima/default/ha.stderr.log&lt;/code>, podemos ver o que aconteceu:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;#34;level&amp;#34;&lt;/span>:&lt;span style="color:#a6e3a1">&amp;#34;fatal&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;#34;msg&amp;#34;&lt;/span>:&lt;span style="color:#a6e3a1">&amp;#34;could not find firmware for \&amp;#34;/usr/bin/qemu-system-x86_64\&amp;#34; (hint: try setting `firmware.legacyBIOS` to `true`)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;#34;time&amp;#34;&lt;/span>:&lt;span style="color:#a6e3a1">&amp;#34;2025-04-24T02:48:57-03:00&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Como tenho a bios em modo &lt;code>legacy&lt;/code> e isso não combina com a configuração padrão do lima para o qemu, a configuração pode ser alterada na opção de abrir o editor:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ limactl edit default &lt;span style="color:#6c7086;font-style:italic"># abre seu editor de texto&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A única alteração que precisa ser feita, é adicionar dizer que &lt;code>legacyBIOS&lt;/code> é &lt;code>true&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-diff" data-lang="diff">&lt;span style="display:flex;">&lt;span>firmware:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f38ba8;background-color:#313244">- legacyBIOS: none
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f38ba8;background-color:#313244">&lt;/span>&lt;span style="color:#a6e3a1;background-color:#313244">+ legacyBIOS: true
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Salvando o arquivo, temos isso:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>WARN&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0000&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> treating lima version &lt;span style="color:#a6e3a1">&amp;#34;d218ece&amp;#34;&lt;/span> from &lt;span style="color:#a6e3a1">&amp;#34;/home/dunossauro/.lima/default/lima-version&amp;#34;&lt;/span> as very latest release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>INFO&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0022&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> Instance &lt;span style="color:#a6e3a1">&amp;#34;default&amp;#34;&lt;/span> configuration edited
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>? Do you want to start the instance now? &lt;span style="color:#89dceb;font-weight:bold">(&lt;/span>Y/n&lt;span style="color:#89dceb;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Damos &lt;code>Y&lt;/code> e vamos adiante:&lt;/p>
&lt;hr>
&lt;h3 id="usando-o-lima" >
&lt;div>
&lt;a href="#usando-o-lima">
##
&lt;/a>
Usando o lima
&lt;/div>
&lt;/h3>
&lt;p>Após alguns segundos&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic"># ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>INFO&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0107&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> &lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>hostagent&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> Starting QEMU
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>INFO&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0108&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> SSH Local Port: &lt;span style="color:#fab387">60022&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic"># ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>INFO&lt;span style="color:#89dceb;font-weight:bold">[&lt;/span>0149&lt;span style="color:#89dceb;font-weight:bold">]&lt;/span> READY. Run &lt;span style="color:#a6e3a1">`&lt;/span>lima&lt;span style="color:#a6e3a1">`&lt;/span> to open the shell.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>YAY&lt;/strong>, agora temos a VM do QEMU funcionando!&lt;/p>
&lt;p>Usar o lima é bastante simples, só digitar &lt;code>lima&lt;/code> e estamos conectados via SSH na VM:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ lima
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dunossauro@lima-default:/home/dunossauro$
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Como estamos usando o template &lt;code>default&lt;/code>, a VM é um ubuntu com o &lt;a href="https://containerd.io/">containerd&lt;/a> e o &lt;a href="https://github.com/containerd/nerdctl">nerdctl&lt;/a> instalado:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dunossauro@lima-default:/home/dunossauro$ nerdctl run -d -p 8080:80 --name nginx nginx:alpine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Pronto, temos um container do &lt;a href="https://nginx.org/">NGINX&lt;/a> rodando!&lt;/p>
&lt;p>Podemos sair do SSH (&lt;code>exit&lt;/code>) e também executar os comandos direto pelo lima. Como um update simples:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>lima sudo apt update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hit:1 http://archive.ubuntu.com/ubuntu oracular InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hit:2 http://security.ubuntu.com/ubuntu oracular-security InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hit:3 http://archive.ubuntu.com/ubuntu oracular-updates InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hit:4 http://archive.ubuntu.com/ubuntu oracular-backports InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fab387">152&lt;/span> packages can be upgraded. Run &lt;span style="color:#a6e3a1">&amp;#39;apt list --upgradable&amp;#39;&lt;/span> to see them.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="templates" >
&lt;div>
&lt;a href="#templates">
#
&lt;/a>
Templates
&lt;/div>
&lt;/h2>
&lt;p>Uma das coisas legais do lima é o fato de poder usar diferentes configurações de maneira bastante objetiva. Preciso de uma vm do fedora?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>limactl create template://fedora
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ou então usado outras formas de containers?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>limactl create template://docker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>limactl create template://podman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A lista completa pode ser vista aqui &lt;a href="https://lima-vm.io/docs/templates/">https://lima-vm.io/docs/templates/&lt;/a>&lt;/p>
&lt;h2 id="considerações-finais" >
&lt;div>
&lt;a href="#considera%c3%a7%c3%b5es-finais">
#
&lt;/a>
Considerações finais
&lt;/div>
&lt;/h2>
&lt;p>Achei bastante simples e intuitivo usar o Lima, resolve grande parte dos meus problemas pra simular ambientes e me dá um sandbox mais simples pra poder brincar com coisas quando preciso. Muito mais simples de criar VMs e também pode ajudar a simular deploys em VPSs pra mim.&lt;/p>
&lt;p>Talvez eu o use em alguns materiais de aulas no futuro. Por ser agnóstico de plataforma, pode ser uma boa ideia!&lt;/p></description></item><item><title>Possua seus dados (e pensamentos também...)</title><link>https://blog.dunossauro.com/posts/possua-seus-dados/</link><pubDate>Sat, 19 Apr 2025 00:12:54 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/possua-seus-dados/</guid><description>&lt;p>[Esse post é o lado inverso &lt;a href="https://blog.dunossauro.com/posts/descentralizacao-de-consumo-na-internet">deste&lt;/a>]&lt;/p>
&lt;p>Um dos grandes problemas de viver nos &lt;a href="https://indieweb.org/silo">silos&lt;/a>, pelo menos para mim, é ter de pensar no que vai em cada silo. Como toda pessoa, também sou multifacetado. Penso em coisas diferentes, com formas diferentes, e gosto de falar sobre elas. Mas parece que nem todo silo é adaptado e tem receptividade para comportar tudo que eu penso. Quer exemplos de pensamentos?&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;Já ouviu o último disco do &lt;a href="https://umnavio.bandcamp.com/music">umnavio&lt;/a>?&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;&lt;a href="https://youtu.be/ZT0sV6PQxdw">Amicu?&lt;/a>&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Chapéu de nazista é marreta!&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Mano, a pior coisa que eu fiz na vida foi tentar afinar um sintetizador analógico&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;A inclusão do eglot emacs foi a melhor coisa que o editor já recebeu&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;&lt;a href="https://youtu.be/dtps_rOjpEE">Quer enganar o cliente?&lt;/a>&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Se usa JSON não é REST&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Caralho, esse primeiro episódio da 7a temporada de black mirror foi sinistro&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Pega todo esse seu código feito por ia e enfia no cu!&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Hoje é dia de Live de #Python \o/&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Annie Ernaux, por que me machucas?&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Apenas escute o Tecnocracia dessa semana!&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;&lt;a href="https://www.youtube.com/shorts/v_nlpMn6ZO4">Glups moglods&lt;/a>, dica da lora&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Pegue qualquer &amp;ldquo;rede social&amp;rdquo; e se imagine dizendo todos os tipos de coisas que você pensa&amp;hellip;&lt;/p>
&lt;p>Os silos, além de me transparecer unidimensionalmente aos outros, fazem com que eu tenha que &amp;ldquo;me comportar&amp;rdquo;, usando regras de etiqueta do local onde minha publicação pertence. Pra, no final das contas, exercerem o controle de como, via regras algorítmicas, as pessoas vão interagir comigo e claro &lt;strong>lucrarem com o meu conteúdo&lt;/strong>.&lt;/p>
&lt;p>Ao fim, eu acabo perdendo um pouco de tudo, inclusive a posse dos meus dados.&lt;/p>
&lt;h2 id="logando-a-porra-toda" >
&lt;div>
&lt;a href="#logando-a-porra-toda">
#
&lt;/a>
Logando a porra toda
&lt;/div>
&lt;/h2>
&lt;p>Quando me refiro a logs, eu penso em qualquer coisa que eu posto, qualquer forma de compartilhamento de mim para o outro. Como microblog (o que postaríamos no mastodon, bluesky, threads, xwitter), fotologs (pixelfed, instagram). Até mesmo esse blog que vos fala.&lt;/p>
&lt;p>Para quem é mais jovem:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Blog&lt;/strong> é uma contração de weblog.&lt;/p>
&lt;/blockquote>
&lt;p>Dito isso, o &lt;a href="https://indieweb.org/principles#Key_Principles">primeiro princípio&lt;/a> da &lt;a href="https://indieweb.org/Main_Page-pt">inideweb&lt;/a>, a casa de quem está tentando viver &lt;a href="https://smallweb.page/home">fora dos muros&lt;/a> da web corporativa, é ser &lt;a href="https://indieweb.org/own_your_data">dono dos próprios dados&lt;/a>.&lt;/p>
&lt;p>Construir seu cantinho na internet, seu próprio &lt;a href="https://indieweb.org/digital_garden">jardim digital&lt;/a>, é uma boa solução. Você rega aos poucos, planta novas ideias, experimenta novas coisas, &lt;strong>decora com a sua própria estética&lt;/strong> e chama as amizades pra frequentar.&lt;/p>
&lt;p>Quem sabe até disponibilizar um &lt;a href="https://blog.dunossauro.com/posts/descentralizacao-de-consumo-na-internet">feed&lt;/a>, uma forma de dizer a quem te acompanha que você postou algo novo. Sem depender da despersonificação dos silos, você pode compartilhar da forma que quiser e o que quiser, &lt;strong>sem censura&lt;/strong>. Afinal, na sua casa, você fala o que quiser!&lt;/p>
&lt;h2 id="censura" >
&lt;div>
&lt;a href="#censura">
#
&lt;/a>
Censura
&lt;/div>
&lt;/h2>
&lt;p>Quando digo censura, você já pode estar imaginando &lt;a href="https://www.boitempoeditorial.com.br/produto/cypherpunks-152551">cyberpunks&lt;/a>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> vazando documentos da NSA, &lt;a href="https://www.wired.com/story/tiktok-nsfw/">softporn&lt;/a> em redes sociais, venda de drogas online&amp;hellip; Mas não&amp;hellip; Não é isso!&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/censura.jpg" width="300"/>&lt;figcaption>
&lt;h4>A pior parte da censura é a (%&amp;amp;)*(&amp;amp;\*Y@! (%*#&amp;amp;!#!&amp;amp;&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Eu tô falando de &amp;ldquo;termos de serviço&amp;rdquo;, principalmente os ambulantes. Aquele que, quando você começa a construir seu castelo nele (no silo do outro), as regras mudam, aí você passa a ser um &amp;ldquo;fora da lei&amp;rdquo; do condado eletrônico. E o silo vai te penalizar por isso. É claro&amp;hellip; Você não leu o TOS, leu?&lt;/p>
&lt;p>Pra te ajudar nisso, porque tudo é TL;DR (to long, don&amp;rsquo;t read) e cheio de &lt;a href="https://pt.wikipedia.org/wiki/Juridiqu%C3%AAs">juridiquês&lt;/a>, temos o &lt;a href="https://tosdr.org/">TOSDR&lt;/a> que mostra os pontos mais críticos dos termos.&lt;/p>
&lt;p>Mas, basicamente, o que é aceitável hoje&amp;hellip; Amanhã pode não ser mais. Tudo aquilo que, foi feito ali pode não existir mais. Existem casos de monte sobre essas coisas e você pode procurar.&lt;/p>
&lt;p>Na sua casa, quem faz o TOS é sua ética, as coisas são &lt;a href="https://indieweb.org/longevity">feitas pra durar&lt;/a> (o nono princípio da indieweb).&lt;/p>
&lt;h2 id="posse" >
&lt;div>
&lt;a href="#posse">
#
&lt;/a>
POSSE
&lt;/div>
&lt;/h2>
&lt;p>O grande problema de estar de fora do silo é que embora tudo seja liberado, por mais incrível que você seja no argumento, não vai conseguir ficar de fora dele. Por uma razão incrivelmente simples. Suas amizades vão estar lá, sua família vai estar lá&amp;hellip; Isso não quer dizer que você não possa convidar as pessoas a se juntar aos jardins da internet (um dos objetivos dessa postagem). Mas é diminuir a sua dependência do cercadinho pra simplesmente ser &amp;ldquo;você&amp;rdquo; e parar de pensar no seu conteúdo para um cercadinho específico. É aí que um conceito importante entra: POSSE.&lt;/p>
&lt;p>Como disse o &lt;a href="https://www.gmgall.net/">Guilherme&lt;/a> em &lt;a href="https://crieaporradeum.blog/#tenha-a-posse-da-porra-toda">crie a porra de um blog&lt;/a>:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;POSSE é um acrônimo muito do xexelento em inglês. Significa Post to your Own Site, Syndicate Everywhere, algo como “poste no seu site, distribua em todo canto”.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>O segundo S é ponto aqui. Sindique seu conteúdo. Poste no seu jardim e distribua nas redes:&lt;/p>
&lt;pre class="mermaid">flowchart TD
S[Seu site] --> Distribui
Distribui --> A
Distribui --> B
subgraph A["No lado bom da web"]
Mastodon
Pixelfed
Pleroma
end
subgraph B["No lado mal web"]
Xwitter
Instagram
Facebook
end
&lt;/pre>
&lt;p>Se suas publicações tiverem links permanentes, você pode simplesmente enviar eles nas redes e falar &amp;ldquo;Olha aqui&amp;hellip;&amp;rdquo;, assim você fica perto das pessoas e mantém seu conteúdo sob o seu domínio. Inclusive, você poderia &amp;ldquo;reproduzir&amp;rdquo; o conteúdo e deixar uma referência. Algo como &amp;ldquo;Postei originalmente aqui [seu link]&amp;rdquo;.&lt;/p>
&lt;p>No início, claro, você pode copiar seu link e sair colando por aí, no silo que faça sentido. Sem nenhum problema. Depois, no futuro, quem sabe alguma automação?&lt;/p>
&lt;p>~Estou trabalhando nas minhas automações &lt;a href="https://codeberg.org/dunossauro/sociopyta">aqui&lt;/a>. Caso você tenha interesse.~&lt;/p>
&lt;p>Dessa forma, você se afasta dos silos, dos algorítimos, sem se afastar das pessoas.&lt;/p>
&lt;h2 id="tá-mas-que-merda-eu-faço-agora" >
&lt;div>
&lt;a href="#t%c3%a1-mas-que-merda-eu-fa%c3%a7o-agora">
#
&lt;/a>
Tá, mas que merda eu faço agora?
&lt;/div>
&lt;/h2>
&lt;p>Tudo muito legal, tudo bem&amp;hellip; Mas tem uma coisa que eu ainda não entendi. Um detalhezinho assim&amp;hellip; Qual é o peixe que eu tô tentando vender aqui?&lt;/p>
&lt;p>É simples&amp;hellip; &lt;a href="https://crieaporradeum.blog">CRIE A PORRA DE UM BLOG&lt;/a>, compartilhe suas &lt;a href="https://indieweb.org/note">notas mentais&lt;/a> em uma página com a gente, &lt;a href="https://indieweb.org/own_your_links">possua seus links&lt;/a>, dissolva seu conteúdo na internet, compartilhe suas fotos não aesthetic que não dariam likes&amp;hellip; Tire suas ideias das mãos dos milionários da tecnologia.&lt;/p>
&lt;blockquote>
&lt;p>Ah&amp;hellip; Mas ninguém vai ler o que eu posto&lt;/p>
&lt;/blockquote>
&lt;p>Como disse o &lt;a href="https://guites.bearblog.dev/blog/">Guites&lt;/a>: &lt;a href="https://guites.dev/eu-vou-ler-seu-blog/">Eu vou ler seu blog&lt;/a>. Bota ele aqui nos comentários&amp;hellip; Me manda por e-mail. Eu quero ler o que você escreve! Quero conhecer o seu jardim digital, virar um frequentador dele! Conhecer suas facetas &amp;ndash; aquelas coisas que você não vai postar no linkedin pro seu empregador não ler, aquilo que você tem de mais &amp;ldquo;você&amp;rdquo; por aí. Aquelas coisas que só desconhecidos da internet sabem sobre você. E, por favor, deixa eu ser um deles.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Leitura recomendadíssima&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Automatizando postagens no pixelfed</title><link>https://blog.dunossauro.com/posts/automatizando-postagens-no-pixelfed/</link><pubDate>Sat, 12 Apr 2025 16:36:28 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/automatizando-postagens-no-pixelfed/</guid><description>&lt;p>Tenho trabalhado nos últimos tempos em uma forma de postar meus conteúdos na minha página e sindicar o conteúdo nas redes sociais (&lt;a href="https://indieweb.org/POSSE">POSSE&lt;/a>). Nessa experiência, tenho desenvolvido em vagarosidade glacial o &lt;a href="https://codeberg.org/dunossauro/sociopyta/">sociopyta&lt;/a>.&lt;/p>
&lt;p>Na grande maioria dos casos, fazer postagens em redes sociais (&lt;a href="https://indieweb.org/silo">silos&lt;/a>) não oferece um grande desafio, temos documentação de APIs ou bibliotecas prontas para fazer isso. No caso do &lt;a href="https://pixelfed.org/">pixelfed&lt;/a>, não temos nem documentação, nem bibliotecas :)&lt;/p>
&lt;blockquote>
&lt;p>Esse post é sobre um &amp;ldquo;trabalho investigativo&amp;rdquo; em código-fonte alheio. Você pode pular para &lt;a href="#solu%C3%A7%C3%A3o"># solução&lt;/a> e ver como fazer a automação dos seus posts ;)&lt;/p>
&lt;/blockquote>
&lt;h2 id="iniciando-a-jornada" >
&lt;div>
&lt;a href="#iniciando-a-jornada">
#
&lt;/a>
Iniciando a jornada
&lt;/div>
&lt;/h2>
&lt;p>Então lá fui eu desbravar o código-fonte em PHP do servidor do pixelfed, mesmo que meu conhecimento em PHP seja&amp;hellip; Vamos dizer&amp;hellip; Pífio.&lt;/p>
&lt;p>O fonte do controller da API do pixelfed pode ser encontrado &lt;a href="https://github.com/pixelfed/pixelfed/blob/eb5bb9fede5f294f8c5facdaebd4471fa8e3b3fc/app/Http/Controllers/Api/ApiV1Controller.php">aqui&lt;/a>.&lt;/p>
&lt;p>Ao iniciar a minha jornada, procurei por algo que criasse uma postagem. Acabei encontrando &lt;a href="https://github.com/pixelfed/pixelfed/blob/eb5bb9fede5f294f8c5facdaebd4471fa8e3b3fc/app/Http/Controllers/Api/ApiV1Controller.php#L2901">&lt;code>statusCreate&lt;/code>&lt;/a>.&lt;/p>
&lt;p>Nesse endpoint fica evidente que deve ser feito um post para &lt;code>/api/v1/statuses&lt;/code> usando &lt;code>json&lt;/code> com algumas opções no corpo. Vou destacar as que me interessam, você pode ver as outras no código-fonte:&lt;/p>
&lt;ul>
&lt;li>&lt;code>status&lt;/code>: O texto que acompanhará a publicação das fotos&lt;/li>
&lt;li>&lt;code>media_ids&lt;/code>: Os IDs das fotos/vídeos que já foram enviados ao servidor
&lt;ul>
&lt;li>Sim&amp;hellip; Isso precisa ser feito antes!&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://github.com/pixelfed/pixelfed/blob/eb5bb9fede5f294f8c5facdaebd4471fa8e3b3fc/app/Http/Controllers/Api/ApiV1Controller.php#L2909">e mais &amp;hellip;&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>O que nos daria um request parecido com esse (vou usar &lt;a href="https://curl.se/">curl&lt;/a> por considerar &amp;ldquo;universal&amp;rdquo;, mas no final vou fazer tudo usando &lt;a href="https://www.python-httpx.org/">httpx&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -X POST &lt;span style="color:#a6e3a1">&amp;#34;{sua-instancia}/api/v1/statuses&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Accept: application/json&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;status={seu-texto}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;media_ids[]={media-id-1}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;media_ids[]={media-id-2}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> &lt;span style="color:#6c7086;font-style:italic"># adicione mais `-F &amp;#34;media_ids[]={...}&amp;#34;` conforme necessário&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ok&amp;hellip; Temos um ponto de partida.&lt;/p>
&lt;p>Agora precisamos descobrir como enviar as fotos. Encontrei uma função chamada &lt;a href="https://github.com/pixelfed/pixelfed/blob/eb5bb9fede5f294f8c5facdaebd4471fa8e3b3fc/app/Http/Controllers/Api/ApiV1Controller.php#L1658">mediaUpload&lt;/a>. Provavelmente é esse&amp;hellip; hahaha&lt;/p>
&lt;p>O endpoint é &lt;code>/api/v1/media&lt;/code> que recebe também um json. Com o field &lt;code>file&lt;/code> junto com os bytes do arquivo de média. O que nos dá algo parecido com isso:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -X POST &lt;span style="color:#a6e3a1">&amp;#34;{sua-instancia}/api/v1/media&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Accept: application/json&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;file=@{caminho-do-arquivo}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Beleza. Se tudo der certo, vamos conseguir fazer o upload de uma midia agora e depois criar a postagem, certo?&lt;/p>
&lt;p>&lt;strong>ERRADO!&lt;/strong>&lt;/p>
&lt;h3 id="pat" >
&lt;div>
&lt;a href="#pat">
##
&lt;/a>
PAT
&lt;/div>
&lt;/h3>
&lt;p>Para enviar essas requisições, você vai precisar de um token de acesso. O que pixelfed chama de PAT (Personal Access Tokens). Para gerar um PAT você deve ir em:&lt;/p>
&lt;p>https://{sua-instancia}/settings/applications&lt;/p>
&lt;p>Existem duas sessões. Vá em &lt;code>Personal Access Tokens&lt;/code>, clique em &lt;code>Create New Token&lt;/code>, dê um nome para esse token e dê acesso de &lt;code>write&lt;/code>. Isso irá gerar um token enorme. Salve ele, &lt;strong>ele nunca mais vai ser visível&lt;/strong>!&lt;/p>
&lt;h3 id="uma-nova-tentativa" >
&lt;div>
&lt;a href="#uma-nova-tentativa">
##
&lt;/a>
Uma nova tentativa
&lt;/div>
&lt;/h3>
&lt;p>Agora podemos tentar de novo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -X POST &lt;span style="color:#a6e3a1">&amp;#34;{sua-instancia}/api/v1/media&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Authorization: Bearer {PAT}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Accept: application/json&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;file=@{caminho-do-arquivo}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>YAY! Temos nossa media no servidor. O json de resposta em um field chamada &lt;code>id&lt;/code>. Ele é o que devemos usar para criar a postagem.&lt;/p>
&lt;blockquote>
&lt;p>Se você, assim como eu, for nerd de HTTP vai perceber que a resposta é &lt;code>200 OK&lt;/code> e não &lt;code>201 CREATED&lt;/code> e está tudo certo&amp;hellip; &lt;code>200&lt;/code> é que deu certo&amp;hellip; Supere!&lt;/p>
&lt;/blockquote>
&lt;p>Agora que temos o &lt;code>id&lt;/code>, podemos criar a postagem:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -X POST &lt;span style="color:#a6e3a1">&amp;#34;{sua-instancia}/api/v1/statuses&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Accept: application/json&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -H &lt;span style="color:#a6e3a1">&amp;#34;Authorization: Bearer {PAT}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;status={seu-texto}&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#89b4fa">&lt;/span> -F &lt;span style="color:#a6e3a1">&amp;#34;media_ids[]={media-id}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>YAY! [2]. Temos nossa postagem no pixelfed. O field &lt;code>uri&lt;/code> é o link da nossa postagem. Com isso, a nossa jornada investigativa termina.&lt;/p>
&lt;blockquote>
&lt;p>Novamente, 200, meu coração chora. Mas, vou superar.&lt;/p>
&lt;/blockquote>
&lt;h2 id="solução" >
&lt;div>
&lt;a href="#solu%c3%a7%c3%a3o">
#
&lt;/a>
Solução
&lt;/div>
&lt;/h2>
&lt;p>Embora tenha sido chato ler código-fonte, a solução que eu queria para o &lt;a href="https://codeberg.org/dunossauro/sociopyta/">sociopyta&lt;/a> é bastante simples&amp;hellip; Após pegar o &lt;a href="#pat">PAT&lt;/a> precisamos somente fazer uma requisição para cada imagem e um para criar a postagem:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#94e2d5">from&lt;/span> &lt;span style="color:#fab387">pathlib&lt;/span> &lt;span style="color:#94e2d5">import&lt;/span> Path
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#94e2d5">import&lt;/span> &lt;span style="color:#fab387">httpx&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cba6f7">def&lt;/span> &lt;span style="color:#89b4fa">post&lt;/span>(text: &lt;span style="color:#89dceb">str&lt;/span>, images: &lt;span style="color:#89dceb">list&lt;/span>[Path], config) &lt;span style="color:#89dceb;font-weight:bold">-&amp;gt;&lt;/span> &lt;span style="color:#89dceb">tuple&lt;/span>[&lt;span style="color:#89dceb">str&lt;/span>, &lt;span style="color:#89dceb">str&lt;/span>]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> base_url &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> config&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>pixelfed&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>api_base_url
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> access_token &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> config&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>pixelfed&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>access_token
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> post_url &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> &lt;span style="color:#f38ba8">f&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;&lt;/span>&lt;span style="color:#a6e3a1">{&lt;/span>base_url&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">/api/v1/statuses&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> headers &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e3a1">&amp;#39;Authorization&amp;#39;&lt;/span>: &lt;span style="color:#f38ba8">f&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;Bearer &lt;/span>&lt;span style="color:#a6e3a1">{&lt;/span>access_token&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e3a1">&amp;#39;Accept&amp;#39;&lt;/span>: &lt;span style="color:#a6e3a1">&amp;#39;application/json&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> data &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e3a1">&amp;#39;status&amp;#39;&lt;/span>: text,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e3a1">&amp;#39;media_ids[]&amp;#39;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> upload_media(image, base_url, access_token) &lt;span style="color:#cba6f7">for&lt;/span> image &lt;span style="color:#89dceb;font-weight:bold">in&lt;/span> images
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> httpx&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>post(post_url, headers&lt;span style="color:#89dceb;font-weight:bold">=&lt;/span>headers, data&lt;span style="color:#89dceb;font-weight:bold">=&lt;/span>data)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">return&lt;/span> &lt;span style="color:#a6e3a1">&amp;#39;pixelfed&amp;#39;&lt;/span>, response&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>json()[&lt;span style="color:#a6e3a1">&amp;#39;uri&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cba6f7">def&lt;/span> &lt;span style="color:#89b4fa">upload_media&lt;/span>(media: Path, instance: &lt;span style="color:#89dceb">str&lt;/span>, pat: &lt;span style="color:#89dceb">str&lt;/span>) &lt;span style="color:#89dceb;font-weight:bold">-&amp;gt;&lt;/span> &lt;span style="color:#89dceb">str&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> media_url &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> &lt;span style="color:#f38ba8">f&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;&lt;/span>&lt;span style="color:#a6e3a1">{&lt;/span>instance&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">/api/v1/media&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> headers &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> {&lt;span style="color:#a6e3a1">&amp;#39;Authorization&amp;#39;&lt;/span>: &lt;span style="color:#f38ba8">f&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;Bearer &lt;/span>&lt;span style="color:#a6e3a1">{&lt;/span>pat&lt;span style="color:#a6e3a1">}&lt;/span>&lt;span style="color:#a6e3a1">&amp;#39;&lt;/span>, &lt;span style="color:#a6e3a1">&amp;#39;Accept&amp;#39;&lt;/span>: &lt;span style="color:#a6e3a1">&amp;#39;application/json&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response &lt;span style="color:#89dceb;font-weight:bold">=&lt;/span> httpx&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>post(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> media_url,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> headers&lt;span style="color:#89dceb;font-weight:bold">=&lt;/span>headers,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> files&lt;span style="color:#89dceb;font-weight:bold">=&lt;/span>{&lt;span style="color:#a6e3a1">&amp;#39;file&amp;#39;&lt;/span>: media&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>read_bytes()}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">return&lt;/span> response&lt;span style="color:#89dceb;font-weight:bold">.&lt;/span>json()[&lt;span style="color:#a6e3a1">&amp;#39;id&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Agora, o que você vai fazer com essas funções é muito particular. Essas duas funções fazem somente o post, agora dentro do seu contexto de automação você deve chamá-las&amp;hellip;&lt;/p></description></item><item><title>Descentralização de consumo na internet</title><link>https://blog.dunossauro.com/posts/descentralizacao-de-consumo-na-internet/</link><pubDate>Tue, 08 Apr 2025 18:56:49 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/descentralizacao-de-consumo-na-internet/</guid><description>&lt;p>[Esse post é o lado inverso &lt;a href="https://blog.dunossauro.com/posts/possua-seus-dados">deste&lt;/a>]&lt;/p>
&lt;blockquote>
&lt;p>Eu tentei ser o menos sarcástico que consegui nessa postagem. Mas, o estado atual da internet me emputesse e eu perco o controle&amp;hellip;&lt;/p>
&lt;/blockquote>
&lt;p>Me sinto cada vez mais fatigado da internet, sei que não sou só eu que me sinto assim, então acredito que precisamos conversar…&lt;/p>
&lt;p>Grande parte do nosso consumo na rede vem por meio de algorítimos… Você pode até pensar que esse é um papo da &amp;ldquo;nossa década&amp;rdquo;, mas, na verdade, esse problema é um pouco maior e mais complicado do que isso. O consumo algoritmo está na raiz de tudo que consumimos!&lt;/p>
&lt;p>Já se perguntou como você procura por qualquer coisa na internet? Hoje, em 2025, temos três opções:&lt;/p>
&lt;ol>
&lt;li>Um oráculo, como um bom &amp;ldquo;ancião da internet&amp;rdquo; você sabe usar um buscador. Google&amp;hellip;?. Ele faz tracking de toda a sua vida na plataforma e exibe o &lt;strong>&amp;ldquo;melhor resultado&amp;rdquo;&lt;/strong>, não do que você está procurando, mas o melhor baseado nos trackings que ele fez de você.&lt;/li>
&lt;li>Em um &lt;a href="https://indieweb.org/silo">cercadinho&lt;/a>, como um bom &amp;ldquo;jovem&amp;rdquo; você sabe que vai encontrar alguém falando sobre o que você quer saber em qualquer rede social. Claro, ela também fez tracking de tudo que você já consumiu antes e vai te dar uma boa resposta enviesada.&lt;/li>
&lt;li>Em &lt;a href="https://en.m.wikipedia.org/wiki/Stochastic_parrot">papagaio estocástico&lt;/a>, um modelo de linguagem que te entrega os resultados baseados não no seu tracking, mas no viés de todas as pessoas que o treinaram.&lt;/li>
&lt;/ol>
&lt;p>Claro, existe uma quarta forma, mas acho que nenhum &lt;em>boomer&lt;/em> que recebe informações pelo zap está lendo esse texto agora…&lt;/p>
&lt;p>Perceba que existe um padrão aqui. Não consumimos a internet descentralizada que nos venderam como a grande &amp;ldquo;revolução&amp;rdquo;.&lt;/p>
&lt;p>Ficou tenso, né? Calma, relaxe assistindo essa série &lt;strong>&amp;ldquo;Achamos que você vai amar isso&amp;rdquo;&lt;/strong> e quando der play &lt;strong>&amp;ldquo;antes de assistir, assista esse trailer&amp;rdquo;&lt;/strong>&amp;hellip; Ah, você desistiu? Por quê?&lt;/p>
&lt;p>Já sei, você cansou, vai ouvir sua playlist &lt;strong>Feito para [nome de usuário].&lt;/strong> Quem sabe sua &lt;strong>supermix&lt;/strong>. Não é possível…&lt;/p>
&lt;p>É melhor ir comer. Toma aqui esse cupom de entrega grátis para os &amp;ldquo;Famosos no ifood&amp;rdquo;…&lt;/p>
&lt;hr>
&lt;p>&lt;strong>pausa para o anúncio da plataforma&lt;/strong>&lt;/p>
&lt;p>Oi, meu nome é Betina, tenho 22 anos 1.042.000, de patrimônio acumulado (5 segundos [pular])&lt;/p>
&lt;hr>
&lt;p>Deu pra sacar o problema? Vou te ajudar a resolver isso… Link do meu linktree (com tracking + UTM) na bio, cupom de 15% de desconto do meu curso &amp;ldquo;desfodendo a web&amp;rdquo; na alura… Corra, por tempo limitado…&lt;/p>
&lt;blockquote>
&lt;p>Achou que a propaganda era só da plataforma? E o anunciante que me contratou?&lt;/p>
&lt;/blockquote>
&lt;h2 id="é-preciso-descentralizar" >
&lt;div>
&lt;a href="#%c3%a9-preciso-descentralizar">
#
&lt;/a>
É preciso descentralizar&amp;hellip;
&lt;/div>
&lt;/h2>
&lt;p>Imagine se houvesse uma forma de me comunicar diretamente com a fonte da informação e saber exatamente quando ela foi atualizada? Sem intermédio, sem sistemas de notificação, sem dependência algorítmica, sem propaganda, sem poluição visual, somente você e o conteúdo&amp;hellip;&lt;/p>
&lt;p>Espera&amp;hellip; Isso me parece uma tecnologia antiga&amp;hellip; Meu deus&amp;hellip; Isso já existe? Desde 1995? Os Homo erectus da internet já sindicavam conteúdo sem intermédio de redes sociais? Isso não deve ser possível, já evoluímos, tando &lt;a href="https://youtu.be/u3CzgfuEskQ?si=Cd2ZW0k2iAxIu1N4">dizem&amp;hellip;&lt;/a>&lt;/p>
&lt;p>Como diz meu amigo Pokemao &amp;ldquo;o futuro da web é o passado&amp;rdquo;. Emburrecemos, não sabemos nos comunicar diretamente com a fonte de informação.&lt;/p>
&lt;h2 id="feeds" >
&lt;div>
&lt;a href="#feeds">
#
&lt;/a>
feeds
&lt;/div>
&lt;/h2>
&lt;p>Quase todo lugar na internet, pelo menos os que nós queremos estar, disponibiliza um arquivo de resumo com data e hora de publicação. Os chamados feeds. Existem diversos formatos como RSS (Really Simple Syndication), Atom e json feed.&lt;/p>
&lt;p>Basicamente, os sites separam um arquivo no próprio site que contém o conteúdo que queremos consumir.&lt;/p>
&lt;p>Sei que feeds soam como &amp;ldquo;consumo de blogs&amp;rdquo; da década passada, mas basicamente você pode acompanhar tudo que quiser. &lt;strong>Inclusive os blogs&lt;/strong>.&lt;/p>
&lt;p>Se você, como eu, tem gostos peculiares a respeito de música e gosta de conhecer bandas independentes, o bandcamp mantém um feed específico sobre cenas undergrounds do mundo inteiro:&lt;/p>
&lt;p>&lt;a href="https://daily.bandcamp.com/">https://daily.bandcamp.com/&lt;/a>&lt;/p>
&lt;p>Tudo bem, esse é o link das postagens, mas e o feed?&lt;/p>
&lt;p>Basta colocar &lt;code>/feed&lt;/code> e temos isso:&lt;/p>
&lt;p>&lt;a href="https://daily.bandcamp.com/feed">https://daily.bandcamp.com/feed&lt;/a>&lt;/p>
&lt;p>O que deve retornar um XML como esse:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;item&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;title&amp;gt;&lt;/span>The Raw, Rebellious Sound of Chile’s New Rock Underground&lt;span style="color:#cba6f7">&amp;lt;/title&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;link&amp;gt;&lt;/span>https://daily.bandcamp.com/scene-report/chile-rock-emo-punk-scene-report&lt;span style="color:#cba6f7">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;description&amp;gt;&lt;/span>&lt;span style="color:#6c7086;font-style:italic">&amp;lt;![CDATA[&amp;lt;p&amp;gt;&amp;lt;a href=&amp;#34;https://daily.bandcamp.com/scene-report/chile-rock-emo-punk-scene-report&amp;#34;&amp;gt;&amp;lt;img src=&amp;#34;https://f4.bcbits.com/img/0039244968_10.jpg&amp;#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic">&amp;lt;p&amp;gt;A new wave of Chilean rock, emo, punk, and folk bands channel unrest into bracing songs.&amp;lt;/p&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic">&amp;lt;p&amp;gt;Read full story on the &amp;lt;a href=&amp;#34;https://daily.bandcamp.com/scene-report/chile-rock-emo-punk-scene-report&amp;#34;&amp;gt;Bandcamp Daily&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6c7086;font-style:italic">]]&amp;gt;&lt;/span>&lt;span style="color:#cba6f7">&amp;lt;/description&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;category&amp;gt;&lt;/span>Scene Report&lt;span style="color:#cba6f7">&amp;lt;/category&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;pubDate&amp;gt;&lt;/span>Mon, 07 Apr 2025 17:59:47 -0000&lt;span style="color:#cba6f7">&amp;lt;/pubDate&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;guid&lt;/span> &lt;span style="color:#89b4fa">isPermaLink=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;false&amp;#34;&lt;/span>&lt;span style="color:#cba6f7">&amp;gt;&lt;/span>182365&lt;span style="color:#cba6f7">&amp;lt;/guid&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;dc:creator&amp;gt;&lt;/span>Richard Villegas, Maria Contreras&lt;span style="color:#cba6f7">&amp;lt;/dc:creator&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;dc:date&amp;gt;&lt;/span>2025-04-07T17:59:47Z&lt;span style="color:#cba6f7">&amp;lt;/dc:date&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cba6f7">&amp;lt;/item&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Sim, esse é o tão amado feed! Tem o título, a data, a categoria, o link, quem escreveu, etc&amp;hellip;&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ah… Eduardo… Que papo troncho, quer só pagar de diferentão…&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>OK, OK… Jornal? Você lê notícias, não? Todos os jornais que eu conheço tem feeds&amp;hellip; Vamos pegar a folha de são Paulo como exemplo&lt;/p>
&lt;p>&lt;a href="https://www1.folha.uol.com.br/feed/">https://www1.folha.uol.com.br/feed/&lt;/a>&lt;/p>
&lt;p>Você pode seguir qualquer editorial que te agrade!&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ah… Seu conformista, lendo mídia burguesa…&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>OK, o feed da Boi tempo te agrada então?&lt;/p>
&lt;p>&lt;a href="https://blogdaboitempo.com.br/feed">https://blogdaboitempo.com.br/feed&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ah… Eu não interesso por música, notícias me deprimem e eu não sou um comunista safado…&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>OK, isentão, você é dev né? Sempre é&amp;hellip; Você pode seguir releases dos software/bibliotecas/frameworks. Aqui o exemplo das releases do ruff, pq se você é isentão não se importa com dinheiro de VC fazendo open source:&lt;/p>
&lt;p>&lt;a href="https://github.com/astral-sh/ruff/releases.atom">https://github.com/astral-sh/ruff/releases.atom&lt;/a>&lt;/p>
&lt;p>Troque o &lt;code>user/repo&lt;/code> e você terá literalmente o feed de qualquer repositório no github…&lt;/p>
&lt;hr>
&lt;blockquote>
&lt;p>&amp;ldquo;Tá, eu entendi… Mas sou apenas um camponês nesse vasto mundo da internet, consumo coisas normais… Sabe… Tipo YouTube? Um podcast às vezes…&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Vou te contar um segredo, mas não espalha… sabia que feeds podem ser usados pra isso também, né?&lt;/p>
&lt;p>&lt;a href="https://www.youtube.com/feeds/videos.xml?channel_id=UCAaKeg-BocRqphErdtIUFFw">https://www.youtube.com/feeds/videos.xml?channel_id=UCAaKeg-BocRqphErdtIUFFw&lt;/a>&lt;/p>
&lt;p>Esse é o feed (&lt;code>UCAaKeg-BocRqphErdtIUFFw&lt;/code>) do meu canal no YouTube, troque o id e acompanhe o canal que você gosta…&lt;/p>
&lt;p>Pra podcasts também funciona…&lt;/p>
&lt;p>&lt;a href="https://feeds.simplecast.com/hwQVm5gy">https://feeds.simplecast.com/hwQVm5gy&lt;/a>&lt;/p>
&lt;p>Esse é o feed do naruhodo, meu podcast preferido… O seu podcast com certeza tem um feed também…&lt;/p>
&lt;p>Se você estiver procurando por feeds de coisas diferentes, o &lt;a href="https://openrss.org/feeds">OpenRSS&lt;/a> tem algumas opções bem diferentes, até mesmo de lives na twitch. Mas, chega de exemplos, CHEGA… Você já entendeu…&lt;/p>
&lt;h2 id="centralizando-a-descentralização" >
&lt;div>
&lt;a href="#centralizando-a-descentraliza%c3%a7%c3%a3o">
#
&lt;/a>
Centralizando a descentralização
&lt;/div>
&lt;/h2>
&lt;p>Se você não me mandou tomar no cu ainda, sinta-se à vontade. Pode falar &amp;ldquo;eu tenho cara de quem lê XML com a mente? Ainda mais ficar dando F5 nessa porra o dia todo?&amp;rdquo;&lt;/p>
&lt;p>Calma, floco de neve… Agora você precisa de um leitor de feeds. Um software que vai fazer esse serviço repetitivo de merda de dar F5 a cada delta de tempo e mostrar as novidades. Além de, claro, organizar a bagunça e tornar esse XML legível pra você…&lt;/p>
&lt;p>Existem VÁRIOS softwares pra fazer isso. No Android, eu uso o &lt;a href="https://capyreader.com/">capy reader&lt;/a>. Software livre e ainda tem uma capivara no logo. Sem mais explicações da escolha…&lt;/p>
&lt;p>Depois de cadastrar seus feeds, você pode ter uma visão parecida com essa. Somente o que você quer ver e em ordem cronológica:&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/capy-feed.jpg" width="400"/>&lt;figcaption>
&lt;h4>Meu feed no celular&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>É bom ter um leitor de feeds no celular. Aquele momento de paz, que você pararia por 1 minuto, entraria no xwitter pra ler uma merda que vai te deixar igual ao meme da facada mal dada e dar engajamento pra quem só quer &lt;a href="https://en.m.wikipedia.org/wiki/Rage-baiting">farmar seu rage&lt;/a>. Você poderia ler alguma coisa que te interesse e não dar audiência pra babaca… Sua terapia agradece…&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/facada.png" width="400"/>&lt;figcaption>
&lt;h4>Facada mal dada da porra&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>No PC eu costumo usar o &lt;a href="https://gfeeds.gabmus.org/">gfeeds&lt;/a> com o mesmo feed que eu tenho no celular, afinal… O que não me falta é 1 minuto pra me revoltar nas redes sociais…&lt;/p>
&lt;p>O que deve ter uma cara bem parecida com a leitura no celular, mas maior :)&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/gfeeds.png"/>&lt;figcaption>
&lt;h4>Meu feed no pc&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;blockquote>
&lt;p>&amp;ldquo;Ah… Mas eu uso iPhone… Eu uso windows.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Cada um tem seus defeitos… Não é mesmo… Tenho certeza de que alguém vai te saber recomendar um bom leitor nos comentários desse post.&lt;/p>
&lt;h2 id="opml" >
&lt;div>
&lt;a href="#opml">
#
&lt;/a>
OPML
&lt;/div>
&lt;/h2>
&lt;blockquote>
&lt;p>&amp;ldquo;Eu vou ter que entrar em link por link no celular e depois de perder 1 semana da minha vida, eu vou ter que fazer isso no PC também? Tá me tirando?&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>É aí que entra o &lt;a href="https://pt.m.wikipedia.org/wiki/OPML">OPML&lt;/a>. Um arquivo que condensa todos os seus feeds em um único &lt;code>XML&lt;/code>, você pode ajustar as categorias dos feeds, compartilhar com amizades, exportar para backup, importa em outro gerenciador pra testar em outro programa. Assim, você pode testar o que te deixar mais feliz…&lt;/p>
&lt;p>As entradas são bastante simples e o arquivo é lido fácilmente:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cba6f7">&amp;lt;outline&lt;/span> &lt;span style="color:#89b4fa">text=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;Balanço e Fúria&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">title=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;Balanço e Fúria&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">description=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">type=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;rss&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">version=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;RSS&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">htmlUrl=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#89b4fa">xmlUrl=&lt;/span>&lt;span style="color:#a6e3a1">&amp;#34;https://anchor.fm/s/3157c214/podcast/rss&amp;#34;&lt;/span>&lt;span style="color:#cba6f7">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Esse é um exemplo de entrada do podcast &amp;ldquo;Balanço e Fúria&amp;rdquo; que eu adoro &amp;lt;3&lt;/p>
&lt;h2 id="e-atencão-se-liga-ai-que-é-hora-de-revisãohttpswwwyoutubecomwatchvlqikvagyfze" >
&lt;div>
&lt;a href="#e-atenc%c3%a3o-se-liga-ai-que-%c3%a9-hora-de-revis%c3%a3ohttpswwwyoutubecomwatchvlqikvagyfze">
#
&lt;/a>
&lt;a href="https://www.youtube.com/watch?v=lqikvAgyFzE">E atencão! Se liga ai, que é hora de revisão&lt;/a>
&lt;/div>
&lt;/h2>
&lt;p>Sites mantém uma lista de atualizações, você pode seguir as listas de todos os sites agregar em um gerenciador de feeds e não precisar dos algorítimos pra te mostrar o que você quer ver&lt;/p>
&lt;inserir um diagrama aqui>
&lt;pre class="mermaid">flowchart TD
A["Blog X"] e1@--"feed RSS"--> AA[Agregador de feeds]
B["JORNAL"] e2@--"feed RSS"--> AA
C["Youtube"] e3@--"feed ATOM"--> AA
D["Site Y"] e4@--"feed RSS"--> AA
E["Site Z"] e5@--"feed JSON"--> AA
AA --"salva"--> DB
DB@{ shape: cyl, label: "Database" }
AA --"lendo tudo"--> VC["Você no centro!"]
e1@{ animate: true }
e2@{ animate: true }
e3@{ animate: true }
e4@{ animate: true }
e5@{ animate: true }
AA --"exporta"--> F[OPML]
F --"importa em outro"--> AA
&lt;/pre>
&lt;p>Você pode compartilhar e salvar suas preferências usando OPML.&lt;/p>
&lt;p>Se você quiser um lugar estranho pra começar&amp;hellip; Pode usar o meu OPML pessoal&amp;hellip; &lt;a href="https://codeberg.org/dunossauro/dotfiles/src/branch/main/feed.opml">Aqui&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ah&amp;hellip; Mas eu gosto dos feeds algorítimos&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Entenda&amp;hellip; Nem tudo na internet foi escrito pra você&amp;hellip;&lt;/p></description></item><item><title>Golden Slumbers</title><link>https://blog.dunossauro.com/posts/golden-slumbers/</link><pubDate>Wed, 26 Mar 2025 04:25:46 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/golden-slumbers/</guid><description>&lt;blockquote>
&lt;p>Sentimentos complexos saem de mim em toneladas de referências, muitas vezes, incapazes de acompanhar.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>É e cá estamos nós&amp;hellip;&lt;/strong>&lt;/p>
&lt;p>Esse momento me lembra muito o &lt;a href="https://www.lpm-blog.com.br/?p=19397">&amp;ldquo;velho safado&amp;rdquo;&lt;/a>:&lt;/p>
&lt;blockquote>
&lt;p>arranje uma grande máquina de escrever
e assim como os passos que sobem e descem
do lado de fora de sua janela&lt;/p>
&lt;p>bata na máquina
bata forte&lt;/p>
&lt;p>faça disso um combate de pesos pesados&lt;/p>
&lt;/blockquote>
&lt;p>Uma das poucas coisas realmente importantes que aprendi com a terapia foi tentar lidar de forma ativa com as coisas que me incomodam e não deixar &lt;em>escondidas no peito&lt;/em>. Fazia tempo que nada me doía tanto e eu não sei como escrever sobre esse assunto.&lt;/p>
&lt;hr>
&lt;p>Recentemente, antes do turbilhão, li &amp;ldquo;O lugar&amp;rdquo; da &lt;a href="https://pt.wikipedia.org/wiki/Annie_Ernaux">Annie Ernaux&lt;/a> e senti que ela conseguiu expressar de forma tão graciosa o que me afastava da minha família silenciosamente. Parei finalmente de me sentir culpado por não &amp;ldquo;estar&amp;rdquo; lá. Ou talvez eu tenha &amp;ldquo;passado um pincel de merda no passado&amp;rdquo;, como &lt;a href="https://en.wikipedia.org/wiki/Always_Be_My_Maybe_(2019_film)">Marcus Kim disse a Sasha Tran&lt;/a>.&lt;/p>
&lt;p>Por escolha própria, ou como resposta traumática, eu vivo a 250km do lugar onde eu cresci. Sempre pronunciando com orgulho: &amp;ldquo;Longe o suficiente pra não ver todo dia, mas perto o suficiente pra não passar muito tempo&amp;rdquo;. Por falta de opções, ou talvez por uma teimosia aguda, ela vivia a quase 700km do lugar onde me criou. Como já de se esperar, não nos víamos muito. Não conversávamos muito. Sempre que nos falávamos era por iniciativa dela. Quem me conhece mais de perto sabe que &lt;strong>eu tenho um problema crônico em responder mensagens&lt;/strong>.&lt;/p>
&lt;hr>
&lt;p>Minha mãe era uma pessoa bastante expansiva, faladora. Era muito fácil encontrar ela em qualquer &lt;em>buteco&lt;/em> tomando uma ou então em um roda de samba duvidosa. Esbanjava sorrisos, 200kg de sarcasmo a cada meia frase. No velório dela cantaram até um samba. Entre choros e risos, o coro. Andei vendo algumas fotos antigas, de festas, esses dias. Impossível achar uma foto sem um grande riso.&lt;/p>
&lt;p>Eu, por estar de fora da festa, sempre soube que existia um abismo ali. Sempre senti que compartilhávamos um demônio obscuro, guardado a sete chaves. Algo que estava nas entrelinhas das frases, uma solidão&amp;hellip; Aquele tipo de coisa que machuca na calada da noite. O sentimento de não pertencimento da realidade distorcida da vida.&lt;/p>
&lt;p>Quando eu nasci, minha mãe tinha apenas 17 anos. Eu custei a entender isso. Não que isso não fosse um fato consumado e extremamente concreto. Eu custei a entender o que isso significava na existência dela. A fase do descobrimento daquilo que se é. A personalidade de uma mãe jovem é ser &lt;strong>mãe&lt;/strong>. Hoje, com quase o dobro da ideia que ela tinha quando eu nasci, não sei se ainda entendo o significado e o peso que isso tem.&lt;/p>
&lt;p>Depois que me tornei adulto, e na base de muita terapia, compreendo as ausências, &amp;ldquo;fica com o tio ai que eu já venho&amp;rdquo; e voltando com o sol já raiando. Por mais que esse comportamento ausente tenha &lt;a href="https://medium.com/@dunossauro/chegou-a-hora-de-conversar-sobre-estupro-3b453ffc98fb">custado a minha alma&lt;/a>, no fundo, eu gosto de dizer que compreendo.&lt;/p>
&lt;hr>
&lt;p>Nossas últimas conversas, como a maioria das outras, foram frívolas na superfície, mas com as entrelinhas pontilhadas, que ao percorrer sempre levaram ao mesmo lugar as primeiras verdades nobres: dor e sofrimento.&lt;/p>
&lt;p>Nos amávamos à nossa maneira. Distantes, mas intimamente enraizados do quanto um carregava do outro.&lt;/p></description></item><item><title>Olá mundo!</title><link>https://blog.dunossauro.com/posts/primeiro-post/</link><pubDate>Mon, 18 Dec 2023 03:01:28 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/primeiro-post/</guid><description>&lt;p>Há muito tempo quero migrar meus posts do Medium para algum lugar. Tenho me recusado a escrever, pois não queria que as coisas fossem para lá. Mas, todas as outras vezes que me via no momento onde “olha, vou escrever um post hoje”. Eu lembrava que não havia feito alguma coisa. Que coisa era essa? Subir um blog. Inúmeras vezes comecei alguma configuração no pelican, mas me dava preguiça de terminar um tema personalizado, outras inúmeras me peguei escrevendo minha própria engine de blogs. Sem sucesso, claro. Decidi hoje que era hora de parar de encolar. Acabei subindo a configuração padrão do hugo para o netlify e começaremos por aqui!&lt;/p>
&lt;p>Vou iniciar essa jornada de blog &amp;ldquo;libertando&amp;rdquo; todos meus posts antigos do medium e tirar aquele inferno de paywall!&lt;/p>
&lt;p>Quem sabe nessa jornada não acabe escrevendo algo que valha a pena?&lt;/p></description></item><item><title>Eu Piro Quando Voce Passa</title><link>https://blog.dunossauro.com/posts/eu-piro-quando-voce-passa/</link><pubDate>Fri, 07 Aug 2020 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/eu-piro-quando-voce-passa/</guid><description>&lt;p>Em meados de 2011 eu fazia escola técnica na Etec e lembro de escutar essa música do Pablo Dominguez todos os dias no mesmo horário enquanto estava no ônibus.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/bKw5Nb7X3ow" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Uma das coisas que mais demorei para me acostumar quando mudei para o interior de São Paulo foi o rádio. Sim, eu ouvia muito Nova Brasil FM. Um costume um pouco incomum que acabei adquirindo com a minha mãe. Sempre fui do Hard Core e ouvia muito punk rock também, mas toda vez que eu buscava um pouco de paz eu ligava na nova brasil. Inclusive, estou fazendo isso agora.&lt;/p>
&lt;p>O que é um pouco estranho é que a programação não mudou muito nesses 7 anos longe de casa. Longe de eu achar isso ruim, claro, tem muitas coisas nessas músicas, nas vinhetas, que eu não saberia explicar o quão fundo elas tocam. Mas geralmente tenho feito isso nas madrugadas e escutar rádio de madrugada é uma coisa complicada. Claro, existem madrugadas e madrugadas, mas para quem tem insônia, as madrugadas costumam ser mais melancólicas que o normal. Esse simples ato de ouvir rádio me remete a uma infinidade de pensamentos diferentes. Lembro que, quando eu era mais novo, costumava ouvir rádio deitado na laje e ficava olhando as estrelas. Várias vezes eu me perguntava se alguém poderia estar fazendo a mesma coisa que eu. Caso estivessem, como elas estavam se sentindo ouvindo aquela mesma música que eu, vendo o mesmo céu que eu?&lt;/p>
&lt;p>Quando eu era mais novo, eu adorava passar noites e mais noites em claro. Assistindo shop time, aqueles programas que mostram as mãos das pessoas vendendo joias, canal do boi. Não sei, mas alguma coisa na madrugada me chama atenção. Lembrei que fazia essas coisas comendo arroz com farofa. Um gosto bem peculiar, para ser bem sincero. Mas essa era minha vida. Eu escrevia muito no meu antigo fotolog nessa época. Uma pena que, quando o fotolog foi descontinuado, eu não quis fazer o backup deles. Mas tem dias que gostaria de lembrar o que estava sentindo. Perdi tudo :/. Mas confesso que só depois da terapia eu comecei a dar mais valor a tudo isso.&lt;/p>
&lt;p>Eu deveria escrever mais, mas, ao mesmo tempo em que morro de medo de falar para as pessoas como eu me sinto. Me dá um caderno, um editor em branco, para ver se eu não saio escrevendo. Toda essa relação com textos, com o meu íntimo, sempre foi turbulenta. Morreria sete mortes antes de deixar ver algo sem sentido, como isso que estou escrevendo agora. Que fala sobre mim, sobre as minhas lembranças malucas e não dizem nada a ninguém. Mas o tempo passou tão depressa que não pude entender melhor essa fase da minha vida. Eu me jogava de um namoro em outro, com pessoas que foram muito importantes e das quais tenho boas memórias e grandes aprendizados. Que ficaram para trás como se não fossem nada hoje em dia. Engraçado, para não dizer outra coisa. Eu era um babaca, jovem, mas ainda assim babaca.&lt;/p>
&lt;p>Isso me remete a um segredo íntimo, falei sobre isso com poucas pessoas, mas isso vem dessa época da minha vida. Eu lembro de passar semanas ouvindo &amp;ldquo;Maresia&amp;rdquo; na versão da Adriana Calcanhotto. &amp;ldquo;aaaahh se eu fosse marinheiro&amp;rdquo; e eu pensava em ser o marinheiro do asfalto. Tá, mas o que tem de segredo nisso? Acho que foi por isso que nunca tirei carteira de motorista. Lembro de uma frase do meu pai: &amp;ldquo;Um dia eu pego esse carro e vou até o fim da BR-116 pra ver onde acaba&amp;rdquo;. Isso ficou tão fixado na minha cabeça. A BR-116 ficava muito perto de casa. Eu cresci do lado da saída dela em direção a Curitiba.&lt;/p>
&lt;p>E eu passei um tempo com essa ideia, arrumar um trabalho qualquer, juntar uma grana e só sumir. Ir até o Uruguai. Viajar só a noite ouvindo nova brasil FM. Sim, por anos eu só quis isso. Parar onde desse e seguir viagem. Mas pra quê? Qual o objetivo? Foi por isso que nunca tirei carteira de motorista. Eu tenho medo de mim mesmo. Quero fugir, mas tenho medo. Só não pensava que, ao fugir, eu ia ter que carregar o meu pior inimigo. Eu mesmo.&lt;/p>
&lt;p>Com o tempo, nada mudou. Eu fugi para o interior, falo pouco ou quase nada com a minha família e amigos e vivo em um mundo paralelo de mim mesmo. Às vezes isso custa caro emocionalmente. Faz tempo que não vejo meu irmão, faz tempo que não vejo minha irmã. Meu primo, então, a pessoa que era minha melhor amiga, fez o mesmo. Porra Gabs, eu sinto sua falta às vezes. Mas sempre que penso no Gabriel, eu penso que todas as pessoas das quais eu fugi porque achava que a resposta era fugir.&lt;/p>
&lt;p>Toda vez que eu fujo, deixo um buraco e toda vez que ligo o rádio de madrugada, eu passo horas pensando nesses buracos. Por que eu sempre vou embora e deixo tudo pra trás? Por que faço isso todas às vezes? Quando é que eu vou parar?&lt;/p>
&lt;p>Por que raios eu liguei o rádio hoje mesmo?&lt;/p></description></item><item><title>meus sinceros pedidos de perdão</title><link>https://blog.dunossauro.com/posts/meus-sinceros-pedidos-de-perdao/</link><pubDate>Sat, 08 Feb 2020 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/meus-sinceros-pedidos-de-perdao/</guid><description>&lt;p>Eu não sou homem pra você. Talvez esse texto todo só precise de uma frase. Mas, talvez, eu precise ser bem mais prolixo, é de praxe, você sabe. Eu falo muito, não tem como você fingir que não sabe.&lt;/p>
&lt;p>Não sei por que essas coisas acontecem comigo. Eu tenho um sentimento estúpido reprimido que me faz querer fugir das coisas. Meu histórico de relacionamentos é bem grande e maior do que esse tamanho, talvez seja a frustração que carrego deles junto comigo e vai chegando uma hora em que a gente tem que se olhar no espelho e parar com o “não deu certo” ou talvez o clássico “a gente era bem diferente”. Eu sou um boçal mesmo, mas meu terapeuta vai dizer que isso é uma construção do meu ego em relação ao quadro que me foi apresentado durante a infância. Maldito seja Freud. Talvez o fato de reconhecer tudo isso já seja um grande passo. Mas isso me dá a impressão de que a história não é tão “platônica” assim. Não existe um “ideal”, o cume da honestidade consigo. Eu tenho um certo tipo de inveja dessas pessoas que se conhecem, que se “controlam”. Eu nunca aprendi a ser assim. Na verdade, até um tempo atrás eu não sabia que existiam pessoas assim. Com objetivos, com honestidade em relação aos seus próprios pensamentos e sentimentos. Isso é um pouco novo pra mim. Geralmente, a gente “empurra com a barriga” e vai seguindo para ver o que acontece. Talvez meu terapeuta esteja mesmo certo. Até alguns poucos anos atrás, eu não tinha um emprego “de verdade” e nenhuma perspectiva de “futuro”. Na verdade, eu nunca me importei com isso. Seria meio clichê jovem dizer “não chego aos 30”? Já pensei bastante isso. Na real, eu nunca esperei muita coisa de nada. Nós que crescemos na periferia, em grande parte, compartilhamos um sentimento meio negativista da vida e também não é para menos. Quem de nós vai chegar em algum lugar? Vou me planejar para ter uma vida regada a trabalho braçal e mal remunerado? Não dá pra esperar nada, vai ser uma “bosta” de qualquer jeito.&lt;/p>
&lt;p>Um tempo atrás, eu dei uma palestra sobre qualquer coisa e abri ela falando sobre “flow”. O fantástico estado da mente onde seus desafios e habilidades se cruzam. Me senti um vira-lata falando sobre aquilo. Como você avança na &lt;a href="https://pt.wikipedia.org/wiki/Hierarquia_de_necessidades_de_Maslow">pirâmide das necessidades&lt;/a> sem o básico? Toda vez que caminho até a terapia, eu penso nisso. Isso vem acompanhado com uma frase icônica e repetida infinitas vezes pelo meu pai. “Psicólogo é coisa de rico”. Se me permite incluir aqui também um “parafraseamento” do &lt;a href="https://pt.wikipedia.org/wiki/Tapete_Vermelho_(filme)">tapete vermelho&lt;/a>: “Felicidade de pobre é um prato cheio”. Realmente, se usarmos Maslow como base, a estima está bem distante da fisiologia.&lt;/p>
&lt;p>Se for seguir à risca tudo isso, talvez faça sentido a racionalização do ser “cuzão” com tudo. Não ter nenhuma perspectiva de futuro faz com que os sentimentos sejam deixados de lado durante a maior parte do tempo. Você acorda cedo e toma uma surra da cidade cinza no ônibus lotado e depois algum “empresario” vai te ordenhar até você não aguentar mais. Aí, é claro, tem a volta pra casa, que é pior que a ida. Em que momento a gente se conecta com o “eu” e faz grandes reflexões sobre nosso estado mental? Não vai rolar, talvez role, mas é babando na cama.&lt;/p>
&lt;p>Ainda acompanhado desse sentimento vem a “meritocracia”, se eu trabalhar um pouco mais, acordar um pouco mais cedo, dormir um pouco mais tarde. Isso é um ciclo vicioso e eu fui criado nele. Nossa, dando razão ao meu terapeuta? Ele ficaria orgulhoso.&lt;/p>
&lt;p>Bom, eu disse que ia ser prolixo ao ponto de me perder do rumo inicial. Mas é isso, eu nunca tive um momento como esse. Um momento em que pudesse parar para refletir em como tenho me comportado em relação a mim mesmo, aos meus objetivos e aos meus sentimentos. Mas tenho a impressão de estar justificando algo, racionalizando de mais ou até quem sabe vitimizando. Isso tudo, quando olho pra mim, é o que consigo pensar por trás dos sumiços, das mentiras, da distância, do excesso de drogas. Mas parece que esse texto é mais sobre a regência insubstancial do caráter na formação do sujeito. Parece dissimulação, mas na realidade eu ainda não sei. Eu nunca tive um tempo sóbrio para refletir sobre os meus sentimentos, como tenho agora. Parece meio “lacaniano” pensar em mim como o Outro do reflexo de mim mesmo. Mas parece que nessa viagem dentro de mim ainda tenho outros caminhos para percorrer, mais perspectivas para me olhar. Talvez quem sabe eu consiga achar justificativas melhores para esse caráter distorcido, esse medo que não passa de “me dar” para a vida, essa vontade incontrolável de contar pequenas mentiras para parecer mais “cool”.&lt;/p>
&lt;p>A verdade com V maiúsculo desse texto é que eu estou tentando. Estou olhando mais pra mim, criando um certo “orgulho” do que construí até aqui. Tentando ter um pouco menos de vergonha da pessoa que eu sou. Tentando ser menos vira-lata. Estou tentando acreditar que existe uma perspectiva de futuro e que nesse futuro eu posso não estar sozinho. O problema é que isso leva um certo tempo e é um esforço grande para errar menos.&lt;/p>
&lt;p>Estou tentado.&lt;/p></description></item><item><title>A Breve Historia Dos Mocks</title><link>https://blog.dunossauro.com/posts/a-breve-historia-dos-mocks/</link><pubDate>Sun, 29 Dec 2019 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/a-breve-historia-dos-mocks/</guid><description>&lt;blockquote>
&lt;p>Texto original postado por Steve Freeman
Disponível em: &lt;a href="http://www.mockobjects.com/2009/09/brief-history-of-mock-objects.html">http://www.mockobjects.com/2009/09/brief-history-of-mock-objects.html&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h2 id="introdução" >
&lt;div>
&lt;a href="#introdu%c3%a7%c3%a3o">
#
&lt;/a>
Introdução
&lt;/div>
&lt;/h2>
&lt;p>As ideias e conceitos por trás de objetos simulados (mocks) não se materializaram em um único dia. Há uma longa história de experimentação, discussão e colaboração entre muitos desenvolvedores diferentes que pegaram a semente de uma ideia e a transformaram em algo mais profundo. O resultado final deve ajudá-lo a desenvolver software; mas a história de fundo da “Criação dos objetos simulados” também é interessante — e também é um testemunho da dedicação das pessoas envolvidas. Espero que revisitar essa história também o inspire a desafiar seus pensamentos sobre o que é possível e a experimentar novas práticas.&lt;/p>
&lt;h2 id="origens" >
&lt;div>
&lt;a href="#origens">
#
&lt;/a>
Origens
&lt;/div>
&lt;/h2>
&lt;p>A história começou em uma rotatória perto da estação Archway, em Londres, no final de 1999. Naquela noite, vários membros de um grupo de arquitetura de software com sede em Londres se reuniram para discutir questões de software. A discussão se voltou para experiências com desenvolvimento ágil e mencionei o impacto que a escrita de testes pareciam ter sobre o nosso código. Isso foi antes da publicação do primeiro livro Extreme Programming, e equipes como a nossa ainda estavam explorando como fazer o desenvolvimento orientado a testes (TDD) — incluindo o que constituía um bom teste. Em particular, notei uma tendência de adicionar o método “getter” a nossos objetos para facilitar o teste. Isso parecia errado, uma vez que poderia ser visto como uma violação dos princípios orientados a objetos, então eu estava interessado nos pensamentos dos outros membros. A conversa foi bastante animada — principalmente centrada na tensão entre o pragmatismo nos testes e o puro design orientado a objetos. Também tivemos um exemplo recente de uma colega, Oli Bye, que excluiu a API do Java Servlet para testar um aplicativo da Web sem um servidor.&lt;/p>
&lt;p>Lembro-me particularmente daquela noite de um diagrama grosseiro de uma cebola e sua metáfora em relação as muitas camadas de software, junto com o mantra “Sem Getters! Ponto!” A discussão girou em torno de como descascar com segurança e testar as camadas dessa cebola sem afetar seu design. A solução foi focar na composição dos componentes de software (o grupo havia discutido as idéias de Brad Cox sobre componentes de software muitas vezes antes). Foi uma colisão interessante de opiniões, e a ênfase na composição — agora referida como injeção de dependência — nos deu uma técnica para eliminar os getters que estávamos “pragmaticamente” adicionando aos objetos para que pudéssemos escrever testes para eles.&lt;/p>
&lt;p>No dia seguinte, nossa pequena equipe na Connextra começou a colocar a ideia em prática. Removemos os getters das seções do nosso código e usamos uma estratégia de composição adicionando construtores que pegavam os objetos que queríamos testar via getters como parâmetros. A princípio, isso parecia complicado, e nossos dois recrutas recém-formados não estavam convencidos. Eu, no entanto, tinha um histórico em Smalltalk, então para mim a idéia de composição e delegação parecia certa. A imposição de uma regra de “sem getters” parecia uma maneira de obter uma sensação mais orientada a objetos na linguagem Java que estávamos usando.&lt;/p>
&lt;p>Ficamos presos por vários dias e começamos a ver alguns padrões surgindo. Muitas de nossas conversas eram sobre a expectativa de que as coisas acontecessem entre nossos objetos, e frequentemente tínhamos variáveis com nomes como expectURL (URLesperada) e expectativa de serviço em nossos objetos injetados. Por outro lado, quando nossos testes falharam, estávamos cansados de entrar em um depurador para ver o que deu errado. Começamos a adicionar variáveis com nomes como realURL (URLreal) e actualServiceName (NomeAtualdoServiço) para permitir que os objetos de teste injetados gerem exceções com mensagens úteis. Imprimir os valores esperados e reais lado a lado nos mostrou imediatamente qual era o problema.&lt;/p>
&lt;p>Ao longo de várias semanas, refatoramos essas idéias em um grupo de classes: ExpectationValue (ValorEsperado) para valores únicos, ExpectationList (ListaEsperada) para vários valores em uma ordem específica e ExpectationSet (ConjuntoEsperado) para valores exclusivos em qualquer ordem. Mais tarde, Tung Mac também adicionou o ExpectationCounter (ContadorDeEsperados) para situações em que não queríamos especificar valores explícitos, mas apenas contar o número de chamadas. Começou a parecer que algo interessante estava acontecendo, mas me pareceu tão óbvio que não havia muito o que descrever. Uma tarde, Peter Marks decidiu que deveríamos criar um nome para o que estávamos fazendo — para que pudéssemos ao menos empacotar o código — e, depois de algumas sugestões, propusesse “mock” (simulação). Poderíamos usá-lo tanto como substantivo quanto como verbo, e refatorou muito bem em nosso código, então o adotamos.&lt;/p>
&lt;h2 id="divulgando-a-palavra" >
&lt;div>
&lt;a href="#divulgando-a-palavra">
#
&lt;/a>
Divulgando a palavra
&lt;/div>
&lt;/h2>
&lt;p>Nessa época, também iniciamos o London Extreme Tuesday Club (XTC) para compartilhar experiências de Extreme Programming com outras equipes. Durante uma reunião, descrevi nossas experiências de refatoração e expliquei que sentia que isso ajudava nossos desenvolvedores juniores a escrever melhor código orientado a objetos. Terminei a história dizendo: “Mas essa é uma técnica tão óbvia que, com certeza, a maioria das pessoas o faz de qualquer maneira.” Steve apontou que as coisas mais óbvias nem sempre são tão óbvias e geralmente são difíceis de descrever. Ele pensou que isso poderia ser um ótimo trabalho se pudéssemos separar a madeira das árvores, então decidimos colaborar com outro membro do XTC (Philip Craig) e escrever algo para a conferência XP2000. Se nada mais, queríamos ir para Sardenha.&lt;/p>
&lt;p>Começamos a separar as ideias e dar a elas um conjunto consistente de nomes, estudando exemplos de códigos reais para entender a essência da técnica. Reportamos novos conceitos que descobrimos para a base de código original da Connextra para validar sua eficácia. Foi um momento emocionante e lembro-me de que demoramos muitas noites para refinar nossas ideias — embora ainda estivéssemos lutando para criar um “arremesso” preciso para objetos simulados. Sabíamos como era usá-los para gerar ótimos códigos, mas descrever essa experiência para outros desenvolvedores que não faziam parte do XTC ainda era um desafio.&lt;/p>
&lt;p>O jornal XP2000 e a biblioteca inicial de objetos simulados (mocks) teve uma recepção mista — para alguns foi revolucionário, para outros foi desnecessário. Em retrospecto, o fato de o Java não ter um bom Reflection quando começamos significava que muitas das etapas eram manuais ou aumentadas com ferramentas de geração de código. Isso afastou as pessoas — elas não conseguiram separar a idéia da implementação.&lt;/p>
&lt;h2 id="outra-geração" >
&lt;div>
&lt;a href="#outra-gera%c3%a7%c3%a3o">
#
&lt;/a>
Outra Geração
&lt;/div>
&lt;/h2>
&lt;p>A história continua quando Nat Pryce pegou as idéias e as implementou em Ruby. Ele explorou o reflection do Ruby para escrever o que era esperado diretamente nos blocos de teste. Influenciado pelo seu trabalho de doutorado em protocolos entre componentes, sua biblioteca mudou a ênfase de fazer &lt;a href="https://pt.wikipedia.org/wiki/Asser%C3%A7%C3%A3o">asserts&lt;/a> em valores de parâmetro para fazer assert em mensagens enviadas entre objetos. Nat então portou sua implementação para Java, usando o novo tipo de Proxy no Java 1.3 e definindo o resultado esperado com objetos “restritos”. Quando Nat nos mostrou esse trabalho, ele imediatamente deu um estalo em nossas mentes.&lt;/p>
&lt;p>Ele doou sua biblioteca para o projeto de mocks e visitou os escritórios do Connextra, onde trabalhamos juntos para adicionar recursos necessários aos desenvolvedores do Connextra.&lt;/p>
&lt;p>Com Nat no escritório onde mocks estavam sendo usados constantemente, fomos levados a usar suas melhorias para fornecer mensagens de falha mais descritivas. Tínhamos visto nossos desenvolvedores ficarem atolados quando o motivo de uma falha no teste não era óbvio o suficiente (mais tarde, observamos que isso geralmente indicava que um objeto tinha muitas responsabilidades). Agora, as restrições nos permitiram escrever testes mais expressivos e com melhores diagnósticos de falhas, pois os objetos de restrição podiam explicar o que havia de errado. Por exemplo, uma falha em uma restrição stringBegins (StringComeça) pode produzir uma mensagem como:&lt;/p>
&lt;pre tabindex="0">&lt;code>Expected a string parameter beginning with &amp;#34;http&amp;#34; but was called with a value of &amp;#34;ftp.domain.com&amp;#34;S
&lt;/code>&lt;/pre>&lt;p>(tradução do erro)&lt;/p>
&lt;pre tabindex="0">&lt;code>Esperava-se um parâmetro de sequência começando com &amp;#34;http&amp;#34; mas foi chamado com um valor de &amp;#34;ftp.domain.com&amp;#34;
&lt;/code>&lt;/pre>&lt;p>Lançamos a nova versão aprimorada da biblioteca de Nat sob o nome Dynamock.&lt;/p>
&lt;p>À medida que aprimoramos a biblioteca, mais programadores começaram a usá-la, o que introduziu novos requisitos. Começamos a adicionar mais e mais opções à API até que, eventualmente, ficou muito difícil de manter — principalmente porque precisávamos oferecer suporte a várias versões do Java. Enquanto isso, Steve se cansava da duplicação na sintaxe necessária para configurar os valores esperados, então ele apresentou uma versão de chamadas em cascata em Smalltalk — várias chamadas para o mesmo objeto.&lt;/p>
&lt;p>Então, Steve notou que em uma linguagem de tipo estaticamente como Java, uma cascata poderia retornar uma cadeia de interfaces para controlar quando os métodos são disponibilizados para quem os invocou — na verdade, poderíamos usar tipos para codificar um workflow. Steve também queria melhorar a experiência de programação, orientando a nova geração de IDEs para solicitar as opções “certas” de autocomplete.&lt;/p>
&lt;p>Ao longo de um ano, Steve e Nat, com muita participação de todos nós, pressionaram bastante a ideia para produzir o jMock, uma API expressiva sobre a estrutura original do Dynamock. Isso também foi portado para C# como NMock. Em algum momento desse processo, eles perceberam que estavam realmente escrevendo uma linguagem em Java que poderia ser usada para descrever valores esperados; eles escreveram isso mais tarde em um artigo da OOPLSA&lt;/p>
&lt;h2 id="consolidação" >
&lt;div>
&lt;a href="#consolida%c3%a7%c3%a3o">
#
&lt;/a>
Consolidação
&lt;/div>
&lt;/h2>
&lt;p>Através da nossa experiência na Connextra e em outras empresas, e através de muitas apresentações, aprimoramos nosso entendimento e comunicação das ideias de objetos simulados. Steve (inspirado em alguns dos primeiros materiais de lean software) cunhou o termo “needs-driven development” (desenvolvimento orientado às necessidades) e Joe Walnes, outro colega, desenhou uma boa visualização das ilhas de objetos que se comunicavam. Joe também teve a ideia de usar objetos simulados para conduzir o design de interfaces entre objetos. Na época, estávamos lutando para promover a ideia de usar mocks como uma ferramenta de design; muitas pessoas (incluindo alguns autores) viram isso apenas como uma técnica para acelerar os testes de unidade. Joe cortou todas as barreiras conceituais com sua heurística simples de “Only mock types you own.” (Simule apenas os tipos que você possui).&lt;/p>
&lt;p>Pegamos todas essas ideias e escrevemos um segundo documento da conferência, “Mock Roles not Objects” (simule papéis, não objetos). Nossa descrição inicial tinha se concentrado demais na implementação, enquanto a ideia crítica era que a técnica enfatizasse os papéis que os objetos desempenham um para o outro. Quando os desenvolvedores usam bem os objetos simulados, eu os observo desenhando diagramas do que eles querem testar ou usando cartões CRC para interpretar relacionamentos — eles se traduzem bem em objetos simulados e testes que conduzem o código necessário. Desde então, Nat e Steve reformularam o jMock para produzir o jMock2, e Joe extraiu restrições na biblioteca Hamcrest (agora adotada pela JUnit). Agora também há uma grande variedade de bibliotecas de mocks, em muitas linguagens diferentes.&lt;/p>
&lt;p>Os resultados valeram o esforço. Acho que podemos finalmente dizer que agora existe uma técnica bem documentada e polida que ajuda você a escrever um software melhor. Desses humildes inícios, este livro resume anos de experiência de todos nós que colaboramos e adiciona os conhecimentos de programação de Steve e Nat e uma cuidadosa atenção aos detalhes para produzir algo que é maior que a soma de suas partes.&lt;/p></description></item><item><title>Chegou a hora de conversar sobre estupro</title><link>https://blog.dunossauro.com/posts/chegou-a-hora-de-conversar-sobre-estupro/</link><pubDate>Tue, 03 Sep 2019 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/chegou-a-hora-de-conversar-sobre-estupro/</guid><description>&lt;p>Essa semana completa um ano que comecei a fazer terapia. Decidi que em algum momento eu ia ter que colocar isso pra fora. Nunca é fácil falar sobre isso. Não é uma coisa que você joga na roda e debate com seus amigos. Não é uma coisa que você conversa com sua família ou mesmo que você fala na terapia. Simplesmente não existe um bom momento para falar sobre isso. Mas faz dias que não durmo e essa coisa me assombra. Não foi nada que vi em um filme de terror, não é nada que consigo conceber de maneira literal. É um sentimento, um sentimento que achei que ia passar com o tempo e não passou. Essas memórias vem a tona em momentos diversos, sabe? Uma vez eu estava no metrô e alguém me puxou pelo braço e a única reação que tive foi sentar no chão e chorar. Não dá pra explicar.&lt;/p>
&lt;p>Essas coisas aconteceram entre 2005 e 2006. Eu tinha 11 anos, claramente eu não estava entendendo o que estava acontecendo. Vamos chamar de “brincadeira”. Um adulto me chamou para “brincar”. A brincadeira era assim: A gente fica pelado e pega um no brinquedo do outro. A primeira vez que brincamos ele pediu para eu colocar o brinquedo dele na boca e em uma sequência não muito longa de vais-e-vens ele ejaculou na minha boca. Ele me disse que essa brincadeira era secreta e que eu não deveria contar para mais ninguém sobre ela. Assim por algumas semanas.&lt;/p>
&lt;p>Depois uma nova “brincadeira” foi estabelecida. O adulto começou com uma mania de assistir pessoas “brincando” na TV enquanto apalpava a minha retaguarda ou enquanto eu fazia uma “massagem com a boca” até o momento da ejaculação. Esse tipo de “brincadeira” durou uns 4 ou 5 dias. Até que um novo ciclo de “brincadeiras” foi estabelecido. Talvez me falte uma palavra para descrever com exatidão essa “brincadeira”. Acho que roçar possa ser o mais próximo da descrição sobre o movimento. Pense em um “brincadeira” heterossexual sem penetração. Ele “brincava” de roçar o seu brinquedo enquanto me deixava de costas e segurava meus braços para que não me afastasse. De maneira não muito agressiva ele aproximava seu rosto em minha nuca enquanto segurava meus braços e grunia de prazer.&lt;/p>
&lt;p>Assim foram dois dias até a “brincadeira” de verdade começar. Eu andei de skate por anos e quebrei vários ossos, mas não lembro de ter sentido uma dor tão grande como senti aquele dia. Mas chorei calado. As lágrimas escorreram, mas não fiz absolutamente nenhum barulho. Eu não consigo me lembrar de nada da primeira vez. É um misto de um escuro absoluto e com muita dor. Até hoje ainda consigo “sentir” esse momento. Os meus braços sendo segurados com força e uma dor que nos dias de hoje eu não suportaria. “Entrou”, foi o que ouvi. Isso aconteceu mais uma vez, depois de um certo tempo e eu literalmente não tenho estômago para falar sobre isso.&lt;/p>
&lt;p>…&lt;/p>
&lt;p>Nunca tive uma proximidade grande com meus pais, caso você ainda não tenha se perguntado sobre isso. O adulto a qual me refiro era a pessoa em quem eu mais confiava quando criança, talvez a pessoa mais próxima de mim durante muitos anos. Não achava que tinha problemas em “brincar”, na realidade e nem sabia o que estava fazendo. O preço disso foi cobrado anos mais tarde, sim, levei anos para entender o que tinha acontecido naquele período.&lt;/p>
&lt;p>Durante minha adolescência eu tentei cavar isso o mais fundo que pude, na verdade durante parte da minha fase adulta também. Mas isso tem me corroído, de tal formar que não sei explicar. Tem semanas em que não consigo por um dia sequer tirar essas memórias de dentro da minha cabeça. As vezes tenho movimentos involuntários quando vejo alguém que se parece o adulto da história. Eu tenho vontade de correr, de chorar. De fazer qualquer coisa para que eu possa desaparecer o mais rápido possível. Faz dias que não durmo pensando nisso. Talvez colocar pra fora me ajude. Talvez não, mais isso não faz diferença.&lt;/p>
&lt;p>Fora toda essa frustração esse sentimento escroto que nunca desaparece, conforme o tempo vai passando eu vejo crianças. Filhos de amigos meus, meus irmãos, as crianças da minha família, crianças na rua e me faço uma série de questionamentos que não fazem sentido. É complicado entender uma mente doentia como a do adulto.&lt;/p>
&lt;p>Antes que eu me rebaixe a dizer palavras de baixo calão, usar de um vocabulário sujo eu vou parar.&lt;/p>
&lt;p>Força pra nós ❤&lt;/p></description></item><item><title>Estimando o custo total de desenvolvimento de uma distribuicao linux</title><link>https://blog.dunossauro.com/posts/estimando-o-custo-total-de-desenvolvimento-de-uma-distribuicao-linux/</link><pubDate>Sat, 18 May 2019 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/estimando-o-custo-total-de-desenvolvimento-de-uma-distribuicao-linux/</guid><description>&lt;p>Esse artigo é uma livre tradução de: &lt;a href="https://www.linuxfoundation.org/events/2008/10/estimating-the-total-cost-of-a-linux-distribution/">https://www.linuxfoundation.org/events/2008/10/estimating-the-total-cost-of-a-linux-distribution/&lt;/a>&lt;/p>
&lt;p>Autores: &lt;strong>Amanda McPherson, Brian Proffitt, and Ron Hale-Evans&lt;/strong>&lt;/p>
&lt;p>O sistema operacional Linux é o projeto de código aberto mais bem-sucedido da história, mas o quanto vale o software em uma distribuição Linux? Em 2002, David A. Wheeler publicou um estudo bem conceituado que examinou as linhas de software de código presentes em uma distribuição típica do Linux. Suas descobertas? O custo total de desenvolvimento representado em uma distribuição típica do Linux foi de US $ 1,2 bilhão. Usamos suas ferramentas e métodos para atualizar essas descobertas. Usando as mesmas ferramentas, estimamos que seriam necessários aproximadamente US $ 10,8 bilhões para construir a distribuição do Fedora 9 em dólares atuais, com os custos atuais de desenvolvimento de software. Além disso, seriam necessários US $ 1,4 bilhão para desenvolver o kernel Linux sozinho. Este artigo descreve nossa técnica e destaca os custos mais recentes do desenvolvimento do Linux.&lt;/p>
&lt;p>O sistema operacional Linux é o sistema operacional de código aberto mais popular da computação atual, representando um ecossistema de US $ 25 bilhões em 2008. Desde a sua criação em 1991, ela cresceu para se tornar uma força na computação, impulsionando tudo, desde a Bolsa de Nova York até telefones celulares, supercomputadores e dispositivos de consumo.&lt;/p>
&lt;p>Como um sistema operacional aberto, o Linux é desenvolvido de forma colaborativa, o que significa que nenhuma empresa é a única responsável por seu desenvolvimento ou suporte contínuo. As empresas que participam da economia Linux compartilham os custos de pesquisa e desenvolvimento com seus parceiros e concorrentes. Essa disseminação da carga de desenvolvimento entre indivíduos e empresas resultou em um ecossistema grande e eficiente e em inovações de software não divulgadas.&lt;/p>
&lt;p>Mais de 1.000 desenvolvedores, de pelo menos 100 empresas diferentes, contribuem para cada lançamento do kernel. Nos últimos dois anos, mais de 3.200 desenvolvedores de 200 empresas contribuíram para o kernel. É importante observar que o kernel é apenas uma pequena parte de uma distribuição do Linux. Uma distribuição é, na verdade, composta de vários componentes, incluindo o kernel, os ambientes de área de trabalho GNOME e KDE, os componentes GNU, o sistema de janelas X e muitos mais. O total de desenvolvedores individuais que contribuem para esses projetos certamente chega aos milhares.&lt;/p>
&lt;p>Como o Linux foi desenvolvido coletivamente, não há uma única fonte de estimativas de custo de quanto foi necessário para desenvolver a tecnologia. Em 2002, David A. Wheeler publicou um estudo bem conceituado que examinou as linhas de software de código presentes em uma distribuição típica do Linux (Red Hat Linux 7.1) Ele concluiu — como fizemos — que as linhas de código de software são o método mais prático para determinar o valor do software de código aberto, uma vez que se concentra no resultado final e não nas estimativas por empresa ou por desenvolvedor. Usando as ferramentas padrão do setor que ele desenvolveu para contar e analisar o SLOC, ele determinou que custaria mais de US $ 1,2 bilhão para desenvolver uma distribuição Linux por meio de propriedade convencional nos EUA.&lt;/p>
&lt;p>Isso foi há seis anos. Como o Linux está inovando e crescendo a uma taxa alta ano após ano, o número de US $ 1,2 bilhão precisou ser atualizado para refletir o verdadeiro valor do desenvolvimento refletido no Linux hoje (e o aumento do custo do próprio desenvolvimento de software). Para este documento, a Linux Foundation determinou o custo total de desenvolvimento representado em uma distribuição típica do Linux e atualizou o número de US $ 1,2 bilhão amplamente utilizado desde sua publicação em 2002.&lt;/p>
&lt;p>Analisamos a distribuição do Fedora 9, que foi lançada em 13 de maio de 2008. É uma distribuição popular e bem usada e é a base para o Red Hat Enterprise Linux, que representa uma grande porcentagem do mercado de Linux. É também um descendente direto do software Red Hat Linux 7.1 analisado por Wheeler em seu artigo original.&lt;/p>
&lt;p>Para este estudo, usamos a conhecida ferramenta SLOC de David A. Wheeler, SLOCCount. O SLOCCount utiliza o padrão COdstructive COst MOdel (COCOMO) padrão da indústria, um modelo algorítmico de estimativa de custos de software desenvolvido por Barry Boehm. O modelo usa uma fórmula básica de regressão, com parâmetros que são derivados de dados históricos de projetos e características atuais do projeto. Atualizamos seu estudo de 2002 para incluir a crescente base de código do kernel Linux e outros pacotes, bem como o maior salário anual de um desenvolvedor de software. (Mais detalhes sobre isso seguem na seção Abordagem do artigo.)&lt;/p>
&lt;p>Usando essa abordagem, estimamos que seriam necessários US $ 10,8 bilhões para desenvolver a distribuição Linux do Fedora 9 por meios proprietários tradicionais no ano de 2008.&lt;/p>
&lt;h2 id="abordagem" >
&lt;div>
&lt;a href="#abordagem">
#
&lt;/a>
Abordagem
&lt;/div>
&lt;/h2>
&lt;p>Nossa abordagem básica era (Para aqueles que estão interessados em como instalamos e analisamos o código fonte, por favor, veja o Apêndice do artigo original):&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Instale os arquivos de código-fonte no formato descompactado; isso requer baixar o código-fonte e instalá-lo corretamente em nossas máquinas de teste.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Conte o número de linhas de código de origem (SLOC); o que requer uma definição cuidadosa do SLOC.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Use um modelo de estimativa (com base nas práticas do COCOMO) para estimar o esforço e o custo de desenvolver o mesmo sistema de maneira proprietária.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Para atualizar o estudo de 2002, foi decidido que usaríamos o mesmo código base usado no estudo de 2002, o Fedora — a distribuição da comunidade que forma a base do Red Hat Enterprise Linux. Para nosso exame, decidimos usar o Fedora. Contamos todos os pacotes disponíveis do Fedora 9 que foram tornados públicos no arquivo espelho mirrors.kernel.org. Decidiu-se usar todos os pacotes porque não desejávamos usar uma definição arbitrária do sabor do Fedora 9 que mediríamos. O Fedora contém significativamente mais software do que a versão corporativa da Red Hat. Uma razão para isso é que uma comunidade diversificada está envolvida na construção do Fedora, não apenas em uma empresa. Usar o aplicativo SLOCCount é uma tarefa incrivelmente simples: é simplesmente uma questão de apontá-lo no diretório correto onde o código-fonte reside e deixá-lo rodar. Uma explicação detalhada de como o programa funciona e como usá-lo ainda está disponível no site da Wheeler9.&lt;/p>
&lt;p>Para calcular os custos dessas distribuições, foi encontrado um salário-base para programadores de computador do Bureau of Labor Statistics dos EUA. De acordo com o BLS, o salário médio de um programador norte-americano em julho de 2008 foi de US $ 75.662,08. Este era o valor do salário usado em nossa execução no SLOCCount. (É claro que a maioria dos desenvolvimentos de software hoje em dia é global, portanto usar um número de salário apenas nos EUA é um tanto ilusório. Uma maneira de continuar explorando seria determinar um salário médio global a ser usado como base para os custos de produção).&lt;/p>
&lt;p>Deve-se notar que o salário sozinho não é o único determinante dos custos de desenvolvimento de software. Em seus artigos, Wheeler observa a presença do parâmetro overhead dentro do SLOCCount. Isso leva em consideração os custos de testes, equipamentos, custos operacionais da empresa e remuneração total para o desenvolvedor. Esse parâmetro também é conhecido como taxa de quebra.&lt;/p>
&lt;p>Como apenas um exemplo de como esses custos podem aumentar rapidamente, nos Estados Unidos, o percentual médio de remuneração (dias de doença, férias, benefícios de seguro) para um funcionário profissional é de 29,0% 11. Assim, o programador que faz o salário médio dos EUA de US $ 75.662,08 está realmente custando ao empregador US $ 97.604,08 em compensação sozinho. Esta é apenas uma parte da torta de taxa de envoltório total.&lt;/p>
&lt;p>A própria estimativa de Wheeler do valor total da taxa de empacotamento é 2,4. Embora esse número varie claramente por empresa e região, pesquisas adicionais não mostraram nenhuma evidência significativa de que esse número precisaria de ajuste para nossos testes.&lt;/p>
&lt;h3 id="código-fonte-e-resultados-de-custos-estimados" >
&lt;div>
&lt;a href="#c%c3%b3digo-fonte-e-resultados-de-custos-estimados">
##
&lt;/a>
Código-fonte e resultados de custos estimados
&lt;/div>
&lt;/h3>
&lt;p>Finalmente, considerando todas as suposições mostradas anteriormente, o SLOC e os valores de produção estimados para o Fedora 9 são os seguintes.&lt;/p>
&lt;p>Linhas de código fonte físicas totais (SLOC)&lt;/p>
&lt;p>&lt;strong>204,500,946&lt;/strong>&lt;/p>
&lt;p>(Modelo básico COCOMO, Pessoa-meses = 2,4 * (KSLOC ** 1,05))
&lt;strong>59389.53 (712674.36)&lt;/strong>&lt;/p>
&lt;p>Estimativa do cronograma, anos (meses)
(Modelo básico de COCOMO, Meses = 2,5 * (pessoa-meses ** 0,38))&lt;/p>
&lt;p>&lt;strong>24.64 (295.68)&lt;/strong>&lt;/p>
&lt;p>Custo total estimado para desenvolver&lt;/p>
&lt;p>&lt;strong>$10,784,484,309&lt;/strong>&lt;/p>
&lt;p>Como um aparte: o valor do salário anual do SLOCCount original era de US $ 56.286 em dólares do ano 2000, então é interessante ver como os custos de hoje se traduzem nos mesmos custos do ano 2000. Para descobrir isso, multiplicamos o custo total para desenvolver o Fedora 9 em dólares de 2008 (US $ 10.784.484.309) em 0,744, que é a razão entre o salário do programador do ano 2000 normalmente usado pelo SLOCCount (US $ 56.286) e o salário de julho de 2008 que encontramos (US $ 75.662,08). O resultado é pouco mais de US $ 8 bilhões para desenvolver os custos do Fedora 9 em 2000. Isso dá ao leitor uma boa indicação de quanto código e funcionalidade foram adicionados a uma distribuição Linux nesses seis anos.&lt;/p>
&lt;h2 id="focando-no-kernel-linux-e-no-modelo-intermediário" >
&lt;div>
&lt;a href="#focando-no-kernel-linux-e-no-modelo-intermedi%c3%a1rio">
#
&lt;/a>
Focando no Kernel Linux e no Modelo Intermediário
&lt;/div>
&lt;/h2>
&lt;p>Como a pesquisa foi conduzida para este artigo, ficou rapidamente aparente que nem todos os componentes dentro de uma dada distribuição Linux precisavam ser tratados igualmente. Alguns projetos, por sua própria natureza e complexidade, precisam de consideração diferente no modelo COCOMO.&lt;/p>
&lt;p>Em nenhum lugar isso ficou mais aparente do que no próprio artigo de 2002 de Wheeler, onde ele destacou a necessidade de um modelo de estimativa diferente para o próprio kernel Linux. Nesse novo artigo, Wheeler afirmou que, como o código do kernel é tipicamente mais complexa do que uma aplicação “média” — entre outras coisas — requer uma análise que vai além do modelo básico do COCOMO. Um aplicativo de espaço do usuário como o Mozilla, por exemplo, é muito mais fácil de codificar linha por linha, já que é abstraído em um nível muito mais alto e tem que lidar com muito menos tarefas. Um kernel de sistema operacional moderno e de classe empresarial é solicitado a fazer um grande número de coisas extremamente complexas, todas de uma vez.&lt;/p>
&lt;p>Wheeler explica que, em vez de usar o método padrão usado para analisar todos os elementos de uma distribuição, deve-se usar o modelo COCOMO intermediário para contar apenas o kernel. O método intermediário tem mais variáveis para escolher e, portanto, deve ser mais preciso para analisar um software complexo por conta própria. No artigo de 2004, ele detalha suas estimativas para esses parâmetros, que têm o efeito líquido de ajustar o valor do fator de esforço geral no SLOCCount do padrão de 3 para um novo valor de 4.64607. Ao mesmo tempo, o valor expoente de — esforço também é alterado para 1,12, que é o valor atribuído a projetos de software semideminados no modelo intermediário de estimativa de software COCOMO.&lt;/p>
&lt;p>Com esses novos parâmetros em mente, um teste separado foi executado no kernel Linux padrão que foi incluído no Fedora 9, linux-2.6.25.i686:&lt;/p>
&lt;p>Linhas de código fonte físicas totais (SLOC)&lt;/p>
&lt;p>&lt;strong>6,772,902&lt;/strong>&lt;/p>
&lt;p>(Modelo básico COCOMO, Pessoa-meses = 2,4 * (KSLOC ** 1,05))&lt;/p>
&lt;p>&lt;strong>7557.4 (90688.77)&lt;/strong>&lt;/p>
&lt;p>Estimativa do cronograma, anos (meses)
(Modelo básico de COCOMO, Meses = 2,5 * (pessoa-meses ** 0,38))&lt;/p>
&lt;p>&lt;strong>15.95 (191.34)&lt;/strong>&lt;/p>
&lt;p>Número médio estimado de desenvolvedores (esforço / cronograma)&lt;/p>
&lt;p>&lt;strong>473.96&lt;/strong>&lt;/p>
&lt;p>Custo total estimado para desenvolver&lt;/p>
&lt;p>&lt;strong>$1,372,340,206&lt;/strong>&lt;/p>
&lt;h2 id="limitações-e-vantagens-para-a-abordagem-deste-estudo" >
&lt;div>
&lt;a href="#limita%c3%a7%c3%b5es-e-vantagens-para-a-abordagem-deste-estudo">
#
&lt;/a>
Limitações e vantagens para a abordagem deste estudo
&lt;/div>
&lt;/h2>
&lt;p>Não existe uma maneira perfeita de estimar o valor de algo tão complexo e evolutivo quanto o Linux. Embora este método seja a melhor abordagem, ele provavelmente supera alguns aspectos de valor, enquanto subestima os outros. Aqui está um resumo dessas limitações:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>O modelo COCOMO foi projetado a partir de pesquisas sobre desenvolvimento de software proprietário&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Por causa disso, sentimos que isso subestima a complexidade de testes inerente a projetos de software de código aberto desenvolvidos colaborativamente como o Linux. Devido às grandes quantidades de mudanças, pequenas e grandes, e à natureza distribuída de desenvolvedores e projetos independentes, a carga de testes nos participantes do ecossistema Linux é em uma ordem de magnitude mais alta do que para empresas proprietárias autônomas.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Outra dificuldade em medir o valor de uma distribuição Linux é simplesmente determinar o que compreende uma distribuição Linux para começar&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Incluímos todos os pacotes no repositório público de código fonte do Fedora. Mas certamente existem distribuições menores até mesmo do Fedora (a versão do LiveCD, por exemplo). Existem também distribuições maiores; O repositório do Debian GNU / Linux13 é maior que o do Fedora, por exemplo. Há também uma grande quantidade de software de código aberto que não é encontrado em nenhuma das distribuições. É um grande universo de código aberto, por isso tentamos confiar nos pacotes disponíveis de uma distribuição.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>A maior fraqueza na análise de SLOC é seu foco em adições líquidas a projetos de software&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Qualquer um que esteja familiarizado com o desenvolvimento do kernel, por exemplo, percebe que o maior custo de energia do homem em seu desenvolvimento é quando o código é excluído e modificado. A quantidade de esforço necessário para excluir e alterar o código, e não apenas adicioná-lo, não se reflete nos valores associados a essa estimativa. Como em um modelo de desenvolvimento colaborativo, o código é desenvolvido e, em seguida, alterado e excluído, o valor real é muito maior que a base de código existente. Basta pensar no processo: quando algumas linhas de código são adicionadas ao kernel, por exemplo, muitas outras precisam ser modificadas para serem compatíveis com essa mudança. O trabalho que envolve a compreensão das dependências e dos resultados e a alteração desse código não está bem representado neste estudo.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>O desenvolvimento colaborativo significa que você geralmente terá vários indivíduos ou grupos trabalhando em diferentes abordagens para resolver o mesmo problema técnico com apenas uma dessas abordagens “ganhando” a inclusão na versão final&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Como as abordagens “perdedoras” não estão comprometidas com o produto final, essa abordagem não leva em conta o esforço de desenvolvimento para essas abordagens.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Existem significativas linhas de software de diferenças de código entre distribuições e até diferentes versões de distribuições, por isso é enganoso considerar que uma análise é a estimativa canônica do valor de “Linux”&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Existem muitas opções diferentes em que analisar e escolhemos apenas 1. Por essa razão, achamos que as estimativas de pacotes discretos que todas as distribuições compartilham (o kernel, por exemplo) são mais interessantes.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Infelizmente, esse método equivale a valor para quantidade&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>A comunidade Linux leva o “inchaço” muito a sério, mas ao mesmo tempo o Linux contém muito código — como drivers antigos — não usado com muita frequência. No entanto, a inclusão desse código é importante, pois tanto o código específico da arquitetura quanto os drivers são incluídos no Linux (ao contrário de outros sistemas operacionais). Como efeito disso, esse número seria maior do que em outros sistemas operacionais que não incluam esses componentes no próprio sistema operacional.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Este estudo pressupõe que todo o desenvolvimento ocorreria nos EUA, com o custo associado do trabalho dos EUA&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>A maior parte do desenvolvimento de software é de natureza global e seus custos de mão-de-obra variam de acordo.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Os números refletidos neste estudo representam quanto custaria desenvolver o software em uma distribuição Linux hoje, do zero&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>É importante notar que isso estima o custo, mas não o valor, para o ecossistema maior, já que a mudança de uma tecnologia tão amplamente utilizada teria um impacto econômico enorme e de longo alcance.&lt;/p>
&lt;h2 id="como-o-linux-cresceu" >
&lt;div>
&lt;a href="#como-o-linux-cresceu">
#
&lt;/a>
Como o Linux cresceu?
&lt;/div>
&lt;/h2>
&lt;p>Este estudo também não leva em conta os custos anuais de desenvolvimento para atualizar e aumentar a base de código Linux. Com base nesses números (ou na experiência direta de qualquer pessoa com uma distribuição do Linux), é fácil ver como a funcionalidade incluída em uma distribuição do Linux explodiu nos últimos seis anos.&lt;/p>
&lt;p>Por exemplo, o Fedora Linux 9 inclui pouco mais de 204 milhões de linhas de código de origem física (SLOC), em comparação com 30 milhões de linhas no Red Hat Linux 7.1 (lançado em 2002) e mais de 17 milhões de linhas na versão 6.2. Assim, em apenas seis anos, a base de código cresceu em 174 milhões de linhas de código. Usando o modelo de custo COCOMO, estimamos que o Fedora 9 tenha requerido cerca de 60.000 pessoas-ano de tempo de desenvolvimento (em comparação a 8.000 pessoas-ano para o Red Hat 7.1 e 4.500 pessoas-ano para a versão 6.2). Assim, o Fedora 9 representa um aumento de aproximadamente 680% no tamanho, um aumento de 750% no esforço e um aumento de 900% nos custos de desenvolvimento tradicionais sobre o Red Hat Linux 7.1. Isso se deve a um aumento no número de programas de software livre / software livre maduros e maduros disponíveis em todo o mundo. Esse crescimento mostra que o Linux tem um grande impulso: a adição contínua de pacotes de software livre fortalece o conjunto de aplicativos disponíveis para usuários Linux e, por sua vez, torna o Linux muito mais atraente como plataforma de computação.&lt;/p>
&lt;p>A natureza modular do Linux (em sua composição de uma distribuição) também é aparente pela varredura da lista dos dez principais pacotes incluídos em uma distribuição. Dado o tempo e o interesse, seria interessante, por exemplo, analisar os principais componentes de uma distribuição Linux embarcada e os custos de desenvolvimento associados a esse segmento da computação.&lt;/p>
&lt;p>O impacto na inovação do Linux não é medido apenas em linhas adicionais. Como o recente artigo “Quem escreve o kernel Linux” afirma: “Ao longo destes lançamentos, a equipe do kernel tem uma taxa de crescimento muito constante de cerca de 10% ao ano, um número muito impressionante dado o tamanho da árvore de código. Mas o kernel não está apenas crescendo. A cada alteração feita na árvore de origem do kernel, as linhas são adicionadas, modificadas e excluídas para realizar as alterações necessárias ”.&lt;/p>
&lt;p>Embora o kernel do Linux provavelmente tenha uma taxa de mudança maior do que a maioria dos outros componentes do Linux, nossos números refletem que, como um todo, o Linux está crescendo e mudando a cada ano em um ritmo constante. Como o kernel do Linux é apenas um pequeno (mas muito importante) componente de uma distribuição Linux, os custos de desenvolvimento iterativo despejados no Linux por ano são substanciais, mas não são examinados neste estudo.&lt;/p>
&lt;h2 id="conclusões" >
&lt;div>
&lt;a href="#conclus%c3%b5es">
#
&lt;/a>
Conclusões
&lt;/div>
&lt;/h2>
&lt;p>Então, nós sabemos agora o que vale a pena o Linux? Embora possa não ser uma pergunta capaz de ser respondida completamente, algumas coisas são muito claras: O verdadeiro valor do Linux surge da capacidade de reutilizá-lo e da tremenda flexibilidade que ele cria.&lt;/p>
&lt;p>Imagine um mundo da computação em que Linus Torvalds não permitisse (na verdade forçar) os usuários do Linux a permitir que outras pessoas reutilizassem suas contribuições. Haveria um Google se eles não tivessem o uso gratuito do Linux e a capacidade de modificá-lo para atender às suas necessidades? Poderia haver uma nova categoria em expansão de PCs ultra-móveis de menos de US $ 350 sem o uso gratuito de um software de US $ 10,8 bilhões? A Amazon seria capaz de construir sua nova linha de dispositivos de leitura Kindle sem uma parte gratuita de US $ 1,4 bilhão em pesquisa e desenvolvimento? Mais do que apenas dinheiro, o software em uma distribuição Linux representa o tempo. A economia em cada um desses exemplos não teria sido possível se essas empresas tivessem sido forçadas a pagar taxas de licença por dispositivo ou por servidor a qualquer empresa ou tivessem que dedicar os milhares de pessoas-ano de tempo de desenvolvimento para criar esse software.&lt;/p>
&lt;p>O que podemos aprender com este estudo? Os custos substanciais de desenvolvimento representados em uma distribuição Linux baseada na comunidade refletem seu crescente valor e importância no mundo da computação. As empresas e indivíduos que trabalham em projetos relacionados ao Linux e criam esse valor lucram compartilhando a carga de desenvolvimento com seus pares (e às vezes com concorrentes). Cada vez mais está ficando claro que assumir essa carga de pesquisa e desenvolvimento individualmente, como a Microsoft fez, é um abordagem cara à construção de software. Embora a posição de monopólio no passado tenha permitido que eles financiem esse enorme desenvolvimento, acreditamos que, na competição futura das forças colaborativas, essa posição isolada será insustentável.&lt;/p>
&lt;p>Como podemos ver neste estudo e através da explosão do Linux em todas as áreas da computação, o desenvolvimento colaborativo cria um enorme valor econômico. Empresas como a IBM, a Intel, a HP, a Fujitsu, a NEC, a Hitachi, a Google, a Novell, a Oracle, a Red Hat e muitas outras participaram e lucraram com o enorme ecossistema criado por este modelo aberto de desenvolvimento de software. Mas não se engane: enquanto as empresas participam, os indivíduos são tão importantes na expansão deste software e seu valor. É assim que tudo começou depois de tudo.&lt;/p>
&lt;p>— — — — — — — — — — — — — — —-&lt;/p>
&lt;p>Os dados neste documento foram gerados pelo SLOCCount, Copyright © 2001–2004 David A. Wheeler O SLOCCount é Software de Código Aberto / Software Livre, licenciado sob a GNU GPL.
SLOCCount vem com ABSOLUTAMENTE NENHUMA GARANTIA, e você está convidado a redistribuí-lo sob certas condições, conforme especificado pela licença GNU GPL; veja a documentação para detalhes.&lt;/p>
&lt;p>— — — — — — — — — — — — — — — —&lt;/p>
&lt;h2 id="agradecimentos" >
&lt;div>
&lt;a href="#agradecimentos">
#
&lt;/a>
Agradecimentos
&lt;/div>
&lt;/h2>
&lt;p>Gostaríamos de agradecer às seguintes pessoas por revisar e fornecer feedback sobre este artigo: James Bottomley, Jon Corbet e David A. Wheeler.&lt;/p></description></item><item><title>Precisamos falar sobre a Live de python</title><link>https://blog.dunossauro.com/posts/precisamos-falar-sobre-a-live-de-python/</link><pubDate>Thu, 04 Apr 2019 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/precisamos-falar-sobre-a-live-de-python/</guid><description>&lt;p>Em maio desse ano, a live vai fazer 2 anos e o tempo que passou não me fez parar de acreditar que esse projeto é “tosco”. Não veja isso como um adjetivo ruim, o objetivo desse texto é explorar o “tosco”.&lt;/p>
&lt;p>Já contei essa história milhares de vezes, mas isso nunca vai deixar de ser verdade. A live nasceu em um dia qualquer, uma quarta-feira, como uma ideia de “codar” online e me distrair da “mundana vida capitalista”. O objetivo era esse, aliviar o estresse fazendo a coisa que mais gosto de fazer: Programar. Dois anos se passaram e vejo que toda a metamorfose que rola na minha cabeça sobre os ideais que me motivam a continuar investindo todos meus domingos nesse projeto. Esse, “codar”, talvez seja o único que tenha se mantido intacto, embora ele não seja nem de longe tão “glamouroso” quanto “os ideais do software livre”, a “democratização do conhecimento”, “tentar atingir quem talvez não tenha ‘estrutura’ para chegar nesse conteúdo”, “fazer conteúdo em português”, etc.., etc…, etc…&lt;/p>
&lt;p>Uns dias atrás, eu estava relembrando algumas conversas que tive com minha ex-namorada. Eu pincelei a ideia de estar tocando esse projeto e ela me disse uma coisa [palavras não literais] “você sempre soube que faria isso, mesmo que agisse de maneira contrária. Como se ensinar fosse uma opção pra você. Nunca foi, você é isso” e hoje as coisas estão dando piruetas na minha cabeça por pensar nessas coisas. Toda essa parada de DIY (Faça você mesmo) tem uma raiz muito forte dentro de mim. Essa sensação de “Vai lá e faz, mesmo que fique tosco”. Quando eu era adolescente, a gente tinha caixotes de feira e martelos e fazia “palquinhos” pra andar de skate. Hoje eu tenho internet e boa vontade e a gente faz “““Educação”””. E embora eu tenha um certo receio de pronunciar essa palavra: educação, Educação, EDUCAÇÃO. Tive que procurar no oráculo&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.significados.com.br/educacao/">No seu sentido mais amplo, educação significa o meio em que os hábitos, costumes e valores de uma comunidade são transferidos de uma geração para a geração seguinte.&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>Então, nesse caso, a gente pode usar essa palavra, embora eu ainda tenha um certo medo de toda “diplomacia” que essa palavra carrega. Isso é uma maneira de fazer repasse de informações para a “nova geração”. Essa coisa de não usar termos como “Aula” vai sempre continuar existindo dentro de mim. Foi então que hoje a tarde eu estava lembrando de um matemático um tanto quanto genial, Fermat. Ele ganhou o título de “Príncipe dos amadores”. Ele era bom, ele era incrível, mas não era profissional. Ele era o melhor amador, o príncipe deles. Tanto que todas as suas descobertas foram enviadas por carta, por anotações que ele mesmo fazia em seus livros. Nada é conclusivo, ele era um amador com estilo. Esse talvez seja o ponto chave de tudo que quero dizer com a palavra “tosco”. Voltamos ao oráculo&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.significados.com.br/tosco/">Tosco significa rude, desajeitado ou algo no seu estado bruto&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>Aceitaria usar a palavra que não deve ser dita, mas só se ela for dita com tosco junto. A live é uma forma “tosca de educação”. É uma didática tosca, uma aula tosca, um professor tosco. É uma maneira descompromissada, desajeitada, não profissional, sem recursos. Mas incrivelmente cheia de boas intenções. É um “vai lá e faz com o que você tem agora”.&lt;/p>
&lt;p>Dito tudo isso, e entendendo que não há vergonha alguma em ser amador, inclusive me sinto mais livre para pairar sobre os outros ideais. Essa não é filosofia por trás do software livre? Compartilhar o máximo possível, desburocratizar o conhecimento, deixar acessível. É essa coisa que me atrai. Um(a) jovem feliz porque entendeu como fazer algo, que viu uma possibilidade nova em algo que não fazia parte do seu repertório. Uma galera que pode passar o pouco que “ensinei” para frente e que a galera que aprendeu passe pra frente em um ciclo infinito de iterações.&lt;/p>
&lt;p>O objetivo é derrubar muros, deixar acessível, aberto. Quanto mais todos vocês aprenderem, mais vocês vão ensinar e um dia tudo isso volta e não só volta em formato de educação. Mas com amizades, empregos, estrutura, sorrisos e diversão.&lt;/p>
&lt;p>Me sinto honrado em fazer parte disso.&lt;/p></description></item><item><title>Teu trampo não te define</title><link>https://blog.dunossauro.com/posts/teu-trampo-nao-te-define/</link><pubDate>Thu, 21 Feb 2019 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/teu-trampo-nao-te-define/</guid><description>&lt;blockquote>
&lt;p>Escrevo isso enquanto fumo mais do que devia e um horário em já deveria estar na cama. Mas eu simplesmente não consigo parar de pensar nisso. Sim, não vou corrigir gramática aqui.&lt;/p>
&lt;/blockquote>
&lt;p>Hoje eu estava ouvindo o primeiro ep. do podcast do @renzopro onde ele fez uma pergunta extremamente simples&lt;/p>
&lt;blockquote>
&lt;p>O que você quer fazer?&lt;/p>
&lt;/blockquote>
&lt;p>Ao efeito disso, me tentei me colocar em algumas posições. A pergunta é simples e curta, mas ela é carregada de um sentimento introspectivo da parte de quem escuta. A pergunta pode parecer extremamente simples de ser respondida. MAAASSS, vamos parar por um minuto. Onde você está exatamente agora? Você está realmente feliz? O que você faz te satisfaz?&lt;/p>
&lt;p>Apesar de existirem pessoas que vão responder, sim, a todas essas perguntas, algumas pessoas não. Isso me faz lembrar dos passos para alcançar paz de espírito em todas as decisões morais da sua vida.&lt;/p>
&lt;p>Existem coisas que (Por Mario Sergio Cortella):&lt;/p>
&lt;ul>
&lt;li>Você pode fazer&lt;/li>
&lt;li>Você quer fazer&lt;/li>
&lt;li>Você deve fazer&lt;/li>
&lt;/ul>
&lt;p>Agora vamos pensar que tudo isso é uma grande permutação e negativas dentro de um mesmo argumento. Existem coisas que você quer, pode, mas não deve. Coisas que você não quer, mas deve e pode. Coisas que você deve, mas não quer e não pode. E a paz de espírito está no “Quero, posso e devo” Mas o caso que mais me incomoda é o seguinte:&lt;/p>
&lt;blockquote>
&lt;p>Existem coisas que você não quer, mas deve e pode&lt;/p>
&lt;/blockquote>
&lt;p>Muitas vezes a gente se encontra em um relacionamento abusivo que parte desse princípio. ~aqui estou me referindo a todos os tipos ~ Mas queria especialmente falar sobre trabalho. E sim, minha adolescência punk rock nunca vai me deixar falar de maneira positiva sobre isso, mas bem vindos ao capitalismo…&lt;/p>
&lt;p>Você já pensou no que você quer realmente fazer da sua vida? Se sua resposta não foi algo parecido com “deitar na rede sentindo a brisa do vento da manhã” você ainda não pensou o suficiente. Mas pra fazer isso, você possivelmente deveria ter uma forma de sustento e que rendesse o suficiente para que não precisasse mais trabalhar. Sim, você pode começar a colocar parte do seu salário e juntar seu primeiro milhão em renda fixa e alcançar a “tão sonhada independência financeira”. Tá… Vamos voltar a realidade. Se esse for realmente seu objetivo, fica outra pergunta:&lt;/p>
&lt;blockquote>
&lt;p>Como você está traçando seu caminho em direção rumo a paz de espírito?&lt;/p>
&lt;/blockquote>
&lt;p>Nisso vem a questão do objetivo. Vi alguns vídeos sobre uma galera que vendeu brigadeiros na rua para poder viajar o mundo. É sutil dizer que a paz não estava na venda de brigadeiros? Era o objetivo.&lt;/p>
&lt;p>Nesses últimos tempos, venho pensando bastante nisso. O que estou fazendo agora é um passo pra chegar onde eu quero ou estou somente estagnado? É tudo meio aquela música do Belchior “Viver é melhor que sonhar…”. E tem gente que se conforma em andar na direção contrária. A vida é meio paradoxal, não é mesmo? O grande problema que vejo em relação a isso é o sofrimento. Porque se você não vai em direção ao objetivo, você nunca vai chegar. Mas se você já sabe onde ir também tem sofrimento. Partindo do ponto em que o que você faz é exatamente o que você não quer fazer e não existe outra saída.&lt;/p>
&lt;p>Com isso vem todo o caso de sofrer, mas jovem, pense bem. Não é a insatisfação com o presente que gera um futuro ruim. Acredito exatamente no contrário. Se tu tá na merda emocional, não existe nada mais gratificante do que trabalhar para sair disso. E quando digo “trabalho” não estou me referindo a emprego. Trace suas metas. O seu problema atual, o seu emprego atual, a vida que você leva hoje não te define. As metas mostram que isso é só uma fase, vai passar. (Meu terapeuta ficaria surpreso ao ler esse parágrafo).&lt;/p>
&lt;p>E se eu não souber pra onde ir? Se eu não tiver metas? (Não, você não pode dobrar elas). Se você não souber, tem todo o tempo pra descobrir, claro que quanto antes melhor, mas como disse o mestre Samuka “De vagar e sem pausa”. No fundo, não importa muito se você vende brigadeiros, se você programa uma linguagem que você não gosta, se você atende 1000 telefonemas por dia. Isso não faz diferença. Isso não define seu “eu”, e outra, o horário comercial acaba (felizmente) e quando você volta pra casa, tem todo o tempo do mundo pra ser você mesmo. Você pode descobrir sorrindo e sem se cobrar tanto. No fundo as coisas não exigem tanta pressa de quem não sabe onde vai, mas quando descobrir, corra. Quanto antes você chegar, mais tempo vai sobrar pra ser feliz.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/cubtwKYmqMY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>&amp;lt;3&lt;/p></description></item><item><title>O incentivo faz toda diferença</title><link>https://blog.dunossauro.com/posts/o-incentivo-faz-toda-diferenca/</link><pubDate>Sun, 20 Jan 2019 00:00:00 -0200</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/o-incentivo-faz-toda-diferenca/</guid><description>&lt;p>Essa semana eu tive uma série de conversas difíceis, das quais só tomando banho agora tive uma impressão de que todas elas foram as mesmas, só que vistas de ângulos diferentes. Mas a última teve uma frase espacial que, confesso, me fez chorar um pouco antes de dormir.&lt;/p>
&lt;p>Como todo o “bum” dessa história vem dessa frase, vamos contextualizar. Eu estava conversando com a minha @ e contando um pouco de uma das piores fases da minha vida e ela disse:&lt;/p>
&lt;blockquote>
&lt;p>“Pra mim foi bem mais fácil”&lt;/p>
&lt;/blockquote>
&lt;p>E agora eu preciso, necessariamente, dar um contexto as conversas. O problema é que toda vez que penso em falar disso eu penso “Nossa, olha que coitadinho, vítima da sociedade” com o tom mais irônico do mundo. Sempre me vem uma frase de uma banda de hardcore que eu gosto muito, chamada Lupe de Lupe, que diz: “Não sou um privilegiado que vai beber da fonte da pobreza/E depois gorfar só pra te agradar”&lt;/p>
&lt;p>Eu venho de um bairro da periferia da cidade de São Paulo chamado Jd. das Palmas e de longe nunca achei lá um lugar perto de ser “perigoso”, “nossa, olha a criminalidade solta por ai” (ironia novamente). Na realidade, nunca tive muito do que reclamar. Nunca me faltou comida, sempre tive o que vestir, às vezes algumas contas atrasadas, mas de longe não considero uma condição ruim. Como é padrão, e de se esperar, minha figura, tanto paterna quanto materna, são meus avós, dado o fato de ter nascido quando minha mãe tinha 17 anos e meu pai 20. Hoje vejo que não dava pra esperar muita estrutura físico-emocional dos meus pais naquele momento. Tanto que talvez o fato que considere mais relevante na minha existência é ter 25 anos e não ter nenhum filho até hoje. (A maioria dos meus amigos de infância, os que chegaram a essa idade, não tiveram estrutura [ou “sorte”] para esperar o momento desejado pra isso). Uma outra constante um tanto quanto normal pra galera que cresceu comigo é não ter avós, pais, parentes próximos, que chegaram nem mesmo a entrar em uma (facul|universi)dade. Isso me remete a uma piada um pouco infame, mas que carrega um peso simbólico imenso, e que meu pai costuma contar:&lt;/p>
&lt;blockquote>
&lt;p>Fiz 5 faculdades, na sexta o tijolo acabou&lt;/p>
&lt;/blockquote>
&lt;p>Nesse ambiente, de maneira geral, ninguém é incentivado a estudar. Claro, ninguém nunca diz: “Já te disse pra lagar a escola”. Alguns amigos meus largaram a escola porque precisavam trabalhar. Trabalhar pra COMER. É, eu disse que a minha situação de longe não era ruim. Alguns foram presos antes de completar o ensino médio, outros com uma estrutura um pouco melhor se formaram e tem alguns, &lt;strong>como eu&lt;/strong>, que largaram a escola. Tudo isso começou em uma briga que arrumei por lá. Aqui cabe um parêntese pra você que é burguês e acha que uma “suspensão”, “chamar os pais” resolveria. As coisas funcionam basicamente assim. “Um dia, no alto da sua ingenuidade, você ofende alguém (claro, moleques tem boca suja, aquela que nenhum sabão resolveria), no outro dia a pessoa aparece com uns “parceiros” na saída e te dão uma surra, ou em casos mais extremos a pessoa a quem a ofensa é direciona aparece com uma arma e resolve o problema”. Felizmente, eu apanhei bastante.&lt;/p>
&lt;p>Lembro que depois disso meu conhecimento das pistas de skate da cidade ficou bem maior, fora do centro “sujo” de São Paulo. Isso aconteceu no início do ano, não me lembro exatamente quando. Aquele dia talvez tenha sido um das últimas vezes que pisei em uma sala de aula “por obrigação”. Eu estava na 8ª serie e não queria mais voltar a estudar. Lembro de ter procurado algumas escolas com a minha mãe no ano seguinte até que me veio a genial ideia de “estudar longe”. Fui estudar na barra funda. Literalmente do outro lado da cidade.&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/1_ftPg0LV1HQfBJyZnCc-7ag.webp" width="400"/>&lt;figcaption>
&lt;h4>Campo limpo -&amp;gt; Barra Funda&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Claro, eu já estava perito em andar de ônibus pelo “centro”. Descobri nessa época que os horários de pico são um tanto quanto traiçoeiros. Se eu pegasse o ônibus para pinheiros as 5:10 eu chegava as 6:20 na porta da escola. Se perdesse esse e pegasse o das 5:20, eu chegava atrasado. O problema disso era o ônibus intermediário Pinheiros -&amp;gt; Barra funda. Nem sempre era possível entrar nesse ônibus. Tinham 15 pessoas querendo entrar nele no ponto, mas raramente 10 conseguiam e eu fiquei de fora muitas, mas MUITAS vezes. Com isso, não é preciso dizer que muitas vezes eu fiquei pro lado de fora da escola. Mas, uma coisa muito interessante que aprendi nessa escola é que também é possível pular o muro para &lt;strong>entrar&lt;/strong> na escola, sim, você ouviu bem. ENTRAR. Eu realmente estava com vontade de entrar. Tomei incontáveis advertências, fui suspenso algumas vezes mais o ápice e talvez a coisa mais dolorosa que escutei nesse ano foi:&lt;/p>
&lt;blockquote>
&lt;p>Se você não consegue chegar na minha aula no horário, por que você continua vindo?&lt;/p>
&lt;/blockquote>
&lt;p>Na época tinha ficado um tanto quanto magoado. Mas hoje entendo que o fato de um professor de história ter dito isso, torna as coisas um tanto quanto MAIS complicadas. Mas eu insisti um pouco mais e conheci talvez o lugar mais mágico da cidade de São Paulo pra mim, R. Amaral gurgel. Lá tem uma ladeira muito gostosa pra descer de skate e se fosse direto pro centro, pegando 1 ônibus só eu conseguia chegar mais cedo na escola indo de skate pelo centro. Fiz algumas amizades com os moradores do viaduto, conheci melhor o centro. Mas algumas críticas foram feitas a direção em relação ao fato de “levar o skate pra escola”. A alegação da diretora:&lt;/p>
&lt;blockquote>
&lt;p>Skate é baderna e não é tolerada baderna na escola. Trate de acordar mais cedo e pegar dois ônibus&lt;/p>
&lt;/blockquote>
&lt;p>Esse foi o último dia em que fui pra aula. Mas, como ninguém podia saber disso, eu continuei indo dar uma volta de skate no centro. No meio do caminho tinha um Senai com cursos de informática. Acabei fazendo um curso de redes lá. Eu era o aluno mais jovem e mais suado da turma. A coisa mais legal é que eu entrava no prédio a hora que queria, se chegasse atrasado era um “desculpa professor” e estava tudo resolvido. No decorrer desse ano fiz 3 cursos de redes no Senai com o dinheiro que eu tinha pra almoçar e posso dizer que valeu CADA CENTAVO. Arrumei um emprego em uma “lojinha de computadores” do ex-chefe da minha mãe. E tudo estava indo bem, meu chefe sempre me cobrava para voltar pra escola. Sim, ele tinha feito faculdade, os filhos dele tinham feito faculdade. E ele disse que lá era muito legal. Mas eu nunca acreditei que a escola era um bom lugar para. Mas, mesmo assim, fui fazer supletivo. Tentei em outra escola no centro, mas acabei voltando pra uma escola próxima de casa. Meu pai entendeu a importância de voltar a estudar e pagou o supletivo pra mim, já que as escolas públicas só oferecem supletivo no período noturno. Fiz alguns amigos mais velhos, foi um momento muito legal da minha vida. Mas a história toda e motivo de contar todo esse percurso se resume a uma professora que tive nesse período. Professora Agnes. O que ela fez por mim está longe de eu conseguir explicar com palavras e pode ser que outras pessoas tenham tentado fazer isso comigo antes, mas nunca tão claramente assim. Ela era professora de matemática e depois de uma aula ela pediu pra eu ficar, que ela queria falar comigo. Não lembro exatamente o que ela disse e até hoje eu choro um pouco quando lembro disso, agora inclusive.&lt;/p>
&lt;p>Ela me disse que eu era bom em matemática. Sério, ela disse que eu era bom em alguma coisa. Eu nunca tinha escutado isso na minha vida. Mas mais do que isso, ela fez a coisa mais inesperada do mundo. Ele quis me ajudar a crescer, ela queria me ensinar matemática. Ela me deu um CD com os problemas das olimpíadas de matemática e um DVD das aulas do IMPA (Instituto de Matemática Pura e Aplicada). Mas ela não me deu só o material, ela me deu incentivo pra aprender aquilo. Naquele momento ela fez uma coisa que nunca tinha visto na vida. Além de dizer que eu era capaz de aprender aquilo, ela queria me ajudar a aprender aquilo. Foi uma das coisas mais bonitas que eu lembro de terem acontecido. Me deu a faca, o queijo e um abraço.&lt;/p>
&lt;p>Você pode pensar que isso não é uma grande coisa. Mas quando coloquei o CD no computador foi a primeira vez que tive consciência que existia uma “consciência intelectual”. Eu tinha 16 anos, na 8ª série (do supletivo) e só nessa determinada condição eu aprendi a &lt;strong>pensar&lt;/strong>. Eu não tinha capacidade intelectual para compreender o que era um número maior do que cabia de dinheiro na minha carteira. E tava tudo lá, naquele DVD. O infinito de Hilbert, a aritmética modular de Galois. A geometria grega. Tudo a um click do meu mouse. Depois de semanas nesse ritmo e descobri que pra aprender mais daquilo eu tinha que passar por um muro e esse muro era maior do que o infinito de Hilbert. Eu descobri que existia uma palavra que nunca tinha escutado em toda a minha vida &lt;strong>vestibular&lt;/strong>.&lt;/p>
&lt;p>O problema do muro é que embora eu tenha conhecido ele neste ano, existiam outras crianças de 16 anos que sabiam dele a 16 anos. E como você deve ter notado, a única coisa que eu sabia do que caía no vestibular, era o que tinha do DVD do IMPA. Eu não sabia mais nada, absolutamente nada sobre gramática, geografia, química, biologia …&lt;/p>
&lt;p>Mas, nesse ano eu conheci outra palavra que eu não conhecia. Se o vestibular era um muro grande, tinha um muro menor que a minha professora de história me apresentou. O &lt;strong>vestibulinho&lt;/strong>. Nesse momento eu já tinha aprendido o valor de aprender alguma coisa. E quando você passa a dar valor as coisas que você aprende, você começa a dar valor para as pessoas que ensinam. E eu contei pra todo mundo que eu conhecia que eu ia fazer essa prova, pro professores também e eles me deram a &lt;strong>maior moral de todos os tempos&lt;/strong>. Eu aprendi 16 anos em 6 meses graças aos meus professores. E eu passei. Sério, passei. Naquela época, eu não entendia muito bem o que era relação candidato/vaga. Mas como fui estudar na ETEC do Paraisópolis. Você pode entender que não era concorrido. Mas importante é que eu estava lá e eu acho que o grande presente que recebi lá não foi a parte técnica, mas foi outro professor. Gildarcio, um exemplo de humildade, ele sabia exatamente o que era estar ali. Não na frente dos alunos dando aula, ele sabia que todo mundo tinha passado por dificuldades pra estar ali. A galera trabalhava o dia todo e ele conseguiu arrumar um micro-ondas pra gente parar de comer comida fria antes da aula. Ele sabia das coisas. Ele entendia os alunos. Lembro que um dia fui em um final de semana lá na ETEC e ele dava aulas pra cursinhos pré-vestibular abertos pra comunidade no final de semana. Eu já tinha entendido a importância de ter um professor, mas ele me ensinou a importância de &lt;strong>ser&lt;/strong> professor:&lt;/p>
&lt;blockquote>
&lt;p>Ter fé no outro para construir um futuro melhor&lt;/p>
&lt;/blockquote>
&lt;p>Todo o resto dessa história é tão entediante quanto a de qualquer pessoa que tenha feito faculdade. Sim, eu passei por lá também, sou aluno especial no mestrado. Mas isso também é chato de contar. Embora por lá também tenha conhecido muitos outros mágicos da educação. Muitas pessoas inspiradoras, muitas pessoas que moldam o que sou hoje, que me ensinaram a pensar diferente. Mas existe um ponto, o limiar disso, é que, se não fosse uma ajuda totalmente despretensiosa de uma mulher que tinha fé no futuro, eu não sei onde estaria hoje. Sabe, eu conheci uma infinidade de pessoas que me inspiram todos os dias. Já falei de algumas delas em outro texto. Mas se não fosse esse momento simples, essa relação de aluno/professora não seria NADA, absolutamente NADA.&lt;/p>
&lt;p>Isso me faz pensar na quantidade de pessoas que vem desse cenário, ou pior do que ele. Sabe, a molecada tá na rua, muitos deles só precisam de uma força. Mas, no fundo, eles nem sabem disso. Ninguém sabe a capacidade que tem até alguém mostrar isso.&lt;/p>
&lt;p>A outra conversa que tive sobre isso essa semana foi com “seniorzão branco hétero de 40” que tem duas graduações e veio tentar diminuir um estagiário das quebradas de campinas que acorda 5 da manhã pra ir ao estágio. Nem de longe acho que ele tenha noção das coisas que disse, nem da profundidade do problema. Sabe, é social. Essa gente não conhece gente que se esforça, que sai do buraco.&lt;/p>
&lt;p>Então, você Mina/Mano da quebrada que tem que lidar com esse tipo de gente, toca o foda-se. Jovem, você vale muito mais do que um engomadinho vai dizer sobre você. Eu sei que a gente quer se mostrar sempre capaz, responder à altura. Mas não importa. O importante de verdade é que você esteja sempre disponível pra estender o braço e dar aquela força pra quele ser humano que precisa de um incentivo. Pra cada boçal que você encontrar na vida, pra todo obstáculo diplomático que você tiver que enfrentar, lembra de duas coisas: 1) Tem sempre alguém que valha mais a pena investir seu tempo. 2) Você já venceu.&lt;/p></description></item><item><title>Manual para pessimistas convictos</title><link>https://blog.dunossauro.com/posts/manual-para-pessimistas-convictos/</link><pubDate>Wed, 19 Sep 2018 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/manual-para-pessimistas-convictos/</guid><description>&lt;p>Hoje me deparei com um pedido de ajuda de uma amiga “Acordei triste, me animem aí” e me fez pensar em todas as vezes que me senti triste nesses últimos tempos. Quem é mais próximo de mim sabe que não andei muito legal esses meses que se passaram, mas o foco aqui não é falar sobre a tristeza que não sinto pra chamar de “profundo”. Talvez seja um “Manual para pessimistas convictos”. Tá aí, um bom título pra esse texto. (embora não seja nada original)&lt;/p>
&lt;p>A algumas semanas parei pra pensar de onde é que nasce o sentimento que vamos chamar de “tristeza”. Sendo bem “teóricozinho”, o que não gosto muito de ser, lembrei de um texto do Fabiano da Costa:&lt;/p>
&lt;p>&lt;em>“A tristeza é um sentimento próprio do homem que provoca no indivíduo um estado de infelicidade perante algum fato, isto é, é uma consequência interna de causa externa.”&lt;/em>&lt;/p>
&lt;p>Fico um tanto quanto perplexo quando paro pra pensar na influência do externo, sim, somos seres sociais. Praticamente nos sentimos um reflexo do que nos dizem que somos e nos sentimos capazes de fazer, muitas vezes, somente o que nos dizem que somos capazes. Oscar Wilde nos contou que “o rio esperava Narciso para poder se enxergar pelos olhos do pobre garoto” (algo assim). O que me faz pensar que grande parte do problema de olhar pra si mesmo é que fica complicado entender o que se “é” quando não se pode se olhar de fora. E, como a vida é um baile de mascaras, você trata pessoas de momentos diferentes (trabalho, bar, escola, … ) de maneiras diferentes. Então ainda que eu tente me ver pelo reflexo do outro, qual “você” ele está mostrando?&lt;/p>
&lt;p>Mas acho que as coisas partem de um certo nível de angústia. Aí voltamos novamente as definições&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>An-gus-tia&lt;/strong> sf: Grande ansiedade ou aflição; Ânsia, agonia&lt;/p>
&lt;/blockquote>
&lt;p>Acredito eu, e eu não sou ninguém (viu, isso sempre volta), que grande parte dessa “tristeza” cotidiana venha dessa ansiedade de querer “ser” algo. De provar pro mundo que somos capazes de algo. E o aspecto social volta sempre. A partir de que momento as coisas que eu faço são direcionadas para mim, pra minha própria existência, para minha própria necessidade? E pra mim chega a um ponto de questionamento de “quando tempo passo sendo eu para mim”?&lt;/p>
&lt;p>Mas, sendo mais profundo em questionamentos, onde é que nasce esse descontentamento com a vida, com o viver? Acredito que seja nesse lugar que realmente nascem as “inseguranças”, em conjunto com a famosa crise do impostor. Onde eu realmente me considero não sendo bom o suficiente perante tudo aquilo que me disponho a fazer. O grande problema é que quando me disponho a pensar sobre “eu”, eu mesmo não me reconheço naquilo que me forma como “eu”. Não me conheço, somente passo tempo pensando na “minha humilde existência” quando estou “triste”. E se me olho só nesses momentos, é praticamente impossível chegar a um “decreto” de que faço algo de produtivo.&lt;/p>
&lt;blockquote>
&lt;p>É difícil se achar “foda” quando você se olha no espelho e só enxerga “você”.&lt;/p>
&lt;/blockquote>
&lt;p>Pode sempre parecer ruim ficar sozinho, pois você não se considera uma boa companhia pra si mesmo. Por pior que esse momentos possam ser, se você só consegue conversar consigo nesses momentos, você tem que aproveitar ao máximo. Não, isso não é uma ode ao autoflagelamento, é você de frente com você. Carregando o próprio peso da “sua existência”. E se não existe uma fórmula mágica pra sair da pior, a única maneira de viver dentro de si talvez seja abraçar seu próprio vazio. Acredito que assumir aquilo que se “é” ou aquilo que se “pensa ser” já pode ser um bom caminho pra entender o que te destrói por dentro, o que gera essa ansiedade macabra que te frustra a cada momento.&lt;/p>
&lt;p>Talvez passando mais tempo com você mesmo, sem máscaras, sem pudor, até sem roupa se for possível, fazendo aquela única coisa que você sabe que suporta fazer e aproveitar o silêncio do mundo, seja algo que possa te ajudar a ser capaz de acordar todos os dias e lembrar que embora existam todos outros por aí, com suas qualidades e defeitos, só você pode ser você. E se você não estiver disponível para seu próprio “eu” talvez ninguém esteja disponível, nunca.&lt;/p>
&lt;p>E é isso, não tem catarse, não tem uma super lição de como me tornei mais feliz, nem uma super dica pra se apaixonar por si mesmo. Tem momentos, como esse, em que só conseguir suportar o peso de viver já faz com que sejamos capazes de dar um pequeno passo pra frente e entender que embora existam pessoas, exista um sistema, existam relacionamentos, a todo momento o vazio, o abstrato, a famigerada “bad” vai ter que ser carregada pelo (parafraseando Kafka) ser desconhecido que é você pra si mesmo.&lt;/p>
&lt;p>E como diria David Foster Wallace: Desejo a vocês muito mais do que sorte&lt;/p></description></item><item><title>Python, 42 e vida adulta</title><link>https://blog.dunossauro.com/posts/python-42-vida-adulta/</link><pubDate>Wed, 22 Aug 2018 00:00:00 -0300</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/posts/python-42-vida-adulta/</guid><description>&lt;blockquote>
&lt;p>Sério, você não precisa ler esse texto. Ele foi feito em maneira de desabafo sobre coisas que venho guardando a um certo tempo, meio que entaladas na minha garganta.&lt;/p>
&lt;/blockquote>
&lt;p>Bom… Não diga que não avisei depois.&lt;/p>
&lt;p>faz um pouco mais de 5 anos que a minha faculdade entrou em greve e me sentei ao lado do grande mestre Luciano Ramalho quando ele me explicou algumas poucas, mas importantes, linhas de código no garoa hacker clube. A galera estava reunida pra escrever o Pingo. Confesso que eu já tinha tentado escrever algumas linhas de Python em casa, mas você sabe como são as pessoas. “Python? Você deveria estar aprendendo Java. Isso sim vai te dar um emprego”&lt;/p>
&lt;p>Bom… Emprego? Eu nunca quis ter um emprego. Para você que ainda não está inserido nesse mundo, aqui vai uma breve explicação do que é um emprego na área de TI (embora essa papo vá ficar pra outra hora):&lt;/p>
&lt;blockquote>
&lt;p>Pessoas tristes que não sentem tesão pelo que fazem e precisam pagar contas&lt;/p>
&lt;/blockquote>
&lt;p>Segui estudando Python… Sério, era mágico (ainda é). Parecia que tudo fluía, eu conseguia expressar minha ideias em formato de código. Não tinha que esperar nada compilar… era fail fast, errou o interpretador me avisava e eu ia lá e corrigia. Simples assim. Eu não entendia NADA sobre programação, mas eu achava que entendia. Hoje vejo tantas tardes que perdi no meu pentium III tentando fazer bashs imensos pra conectar na internet discada e sinto até frio na espinha. Mas parecia que com Python as coisas fluíam bem, bem até de mais. A minha vida tomou um rumo meio estranho depois de tudo isso. Eu passava 5/6 horas do dia estudando Python. Eu queria saber fazer TUDO. Realmente aprendi muita coisa, eu tinha tempo livre, vontade de automatizar tarefas, fazer tudo que me mandavam fazer na faculdade em 10 linhas porque era possível de fazer em Python. Me tornei realmente proficiente em Python. Eu não conseguia mais escrever uma linha de código que não fosse em Python. Sabe aquela aulas de OO que você tem que usar um Java feio e com classes totalmente monolíticas? Eu estava só esperando chegar em casa pra refazer tudo em Python…&lt;/p>
&lt;p>Parece que toda vez que alguém falava de programação eu fazia questão de colocar Python no meio, eu estava completamente apaixonado. Isso melhorou minhas notas, fez parte da minha IC, estava no meu TCC. Sério, Python estava em todo lugar. Comecei a frequentar os meetups, ir em todo tipo de evento. Eu conheci MUITA gente. E sabe o que era mais legal em tudo isso? Todas as pessoas estava tão apaixonadas quanto eu. Todo mundo estava lá pra falar de Python, pra programar Python, todos viviam de Python. E isso só me motivou mais pra estudar 5/6 horas de programação todos os dias. Eu era de fato um programador na minha bolha. Lembro de poucas coisas na minha vida, claro que sou apenas um jovem ainda, que me impactaram tanto.&lt;/p>
&lt;p>Com isso, várias mudanças foram acontecendo dentro de mim, positivamente, claro. Mas no meio disso tiveram algumas coisas que tiveram fizeram grande diferença. Vou contar algumas dessas experiências. Acho que a maior delas, talvez tão grande quanto conhecer o projeto GNU, foi quando reencontrei o Ramalho pela primeira vez. Estava eu lá, a pessoa pirilampa que sou em um meetup em São Paulo, essa foi a primeira vez que palestrei também, e fui falar com o Luciano e ele fui super gentil, como sempre, mas ele não me reconheceu. Segui a conversa como se fosse a primeira vez que tivéssemos nos encontrado. Afinal, pra mim era um grande prazer estar ao lado dele mais uma vez. Mas confesso que passei dias pensando nisso. Eu tinha ido vários dias aos encontros do Pingo e ele nem mesmo me reconheceu… Foi quando me caiu a ficha que muito pelo contrário, eu não era uma pessoa insignificante, ele teria sentado e ensinado Python pra qualquer outra pessoa. Eu entrei meio que êxtase. Tá aí, isso é a comunidade&lt;/p>
&lt;blockquote>
&lt;p>Você para tudo que está fazendo e vai ajudar, aquilo pode mudar a vida das pessoas&lt;/p>
&lt;/blockquote>
&lt;p>Eu já falava sobre Python o dia todo, eu já escrevia código o dia todo, eu já estudava o dia todo. Qual seria o problema em compartilhar tudo aquilo que eu já sei? Isso foi em 2014/2015, não me lembro ao certo. Passei a ser mais ativo online e tento colaborar o máximo possível. Montamos um grupo de estudo de python e criptografia na faculdade, apaixonei outras pessoas e venho tentando fazer isso sempre que possível, isso virou meio que uma rotina. Qualquer dúvida, estou lá, pronto pra ajudar. As vezes eu também não sei a resposta, mas estou lá, sempre tentando dar uma moral. Tive ótimos momentos falando sobre Python em geral.&lt;/p>
&lt;p>A segunda pancada veio em 2016 quando meu pai me disse que o “patrocínio” estava perto do fim. (Sério, eu não estava pensando em ter um emprego). Bom, não tinha problema, eu era um “programador iniciante mediano”. Não parecia ser tão complicado arrumar um emprego, afinal, “Área de tecnologia, sempre emergente”, como todo mundo diz. Só que eu queria programar PYTHON, eu me recusei a achar outras coisas. Burrice? hoje vejo que sim. Maaaaaaassssss, cidade pequena, do interior de SP, tinham várias vagas…. Suporte, Cobol, Delphi, Java… E o Python? Cadê? NADA. Foi quando pipocou uma vaga próximo a Campinas, teria que acordar 5am, mas Python é Python, então eu fui, me candidatei, eles me enviaram um teste, foi simples, por sinal. Algumas etapas a mais e eu estava dentro. E por dentro eu estava mais ou menos assim:&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/1_6XhBQ0s6IChH5VdGXSnspA.gif" width="400"/>&lt;figcaption>
&lt;h4>Vulgo: Quebrando tudo&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Até chegar no primeiro dia e ter board, scrum, pessoas diferente e que não tinham 1/10 da paixão pela linguagem que eu tinha construído nos últimos anos. Sério, as pessoas que entram nos meetups por engano gostavam mais de Python do que as pessoas que trabalhavam comigo. Era um sistema legado, em python 2, com uma manutenibilidade de código abaixo de zero e complexidade ciclomática crescendo mais rápido que a velocidade da luz. Eu era, sou ainda, muito, mas MUITO teimoso. Nos primeiros dias eu só queria chorar. “Como pode essa galera com anos de experiência fazendo um código tão merda”, eu só conseguia pensar isso. Depois disso, eu fui entrando em estado de aceitação. Sério, eu estava tentando não chorar todo dia quando ia fumar um cigarro. Mas os dias foram passando e você passa mais tempo com as pessoas que trabalham com você do que passa com as que moram com você. Então, é inevitável fazer amizades. Se você não tem amigos no trabalho, você está fazendo algo errado, juro. Eles nunca tinha dado risada importando “antigravity”, eles nunca tinham assistido nem se quer um episódio de Monty python. Era um time legal, unido, eles só não era culturalmente pythonistas.&lt;/p>
&lt;p>Juro que essa foi uma das fases mais legais do trabalho, eles me ensinavam sobre os produtos, sobre os processos e eu devolvia com “Pythonic style”. As semanas foram passando, muitas conversas com a minha chefe. Decidimos isolar algumas pessoas e começar tudo lindamente legal. Com Python 3, com código que semanticamente não parecia outra linguagem. Sério, ninguém mais estava aguentando ver aquele código legado depois de um tempo. Sabe, o time estava contente por estar tomando suas decisões de design, sobre as padronizações de código, sobre olhar a qualidade do código. Antes as pessoas só estavam ali, elas estavam carregando nas costas projetos que elas não começaram, com arquiteturas que ninguém tinha escolhido, com padronizações que não faziam sentido. Junto com o estilo pythonico veio a amizade, o sentimento de pertencimento, todo mundo estava fazendo o que tinha que fazer, do mesmo modo que antes, mas sentindo prazer e sabendo explicar por que determinadas coisas estavam assim e não assado. O time estava integrado, falando python, pensando python, vivendo Python. O pessoal nunca tinha ido a um evento, eles não tinham contato com a comunidade. Fizemos um meetup de python na empresa, fomos à Python Brasil.&lt;/p>
&lt;p>Descobri depois de um tempo que todas aquelas coisas que eu não tinha aprendido na faculdade sobre desenvolvimento ágil, testes automatizados, processos, como se comportar em ambientes corporativos, valia pra todo time. A faculdade, o técnico, os cursos, eles tinham me ensinado muita coisa sobre como ser um “bom escrevedor de códigos”. Mas as coisas que aprendi com o senhor Ricardinho (Richard Stallman) e com a comunidade de software livre são mais importantes do que qualquer bloco ultra mega blaster elaborado de código. Vale relembrar o slogan das últimas Python Brasil&lt;/p>
&lt;blockquote>
&lt;p>Pessoas &amp;gt; Tecnologia&lt;/p>
&lt;/blockquote>
&lt;p>Fiz amigos, mudei muitas das minhas ideias sobre trabalho. Mas realmente estava desgastante, eu só estava pensando em trabalho, claro, tudo estava legal de mais. Mas eu estava dedicando pouco tempo a “ensinar o que sei” fora de lá. No ano passado, em maio, eu estava “meio desocupado” em uma quarta feira e só queria falar de código, sem pensar em nada, eu não queria pensar em sprints, entregas, trabalho. As coisas estavam virando uma só, code=trabalho. Postei no facebook um simples “Que tal a gente fazer uma live falando sobre Python”, era uma quarta-feira, a galera abraçou. Não falamos de nada importante, nem necessariamente relevante. Mas combinamos de nos encontrar na quarta seguinte pra falar sobre um assunto específico e assim nasceu a Live de Python. Eu não tinha nada, além de vontade de falar sobre Python. O dia era meio ruim, mudamos pra segunda. E faz mais de um ano que fazemos live codes. Eu passo horas e mais horas pesquisando sobre o assunto, monto um material e a gente faz uma espécie de sala de aula online.&lt;/p>
&lt;p>Eu nunca pensei que isso pudesse ter um impacto tão positivo na minha vida. As vezes eu fico puto, as vezes eu só quero procrastinar. Mas toda segunda tem live. Descobri uma coisa dentro de mim que eu já sabia. Eu gostava de ensinar. Claro, não tenho formação pra isso, mas tenho MUITA vontade de ensinar, as vezes eu aprendo os temas, só pra ensinar. E faz algum tempo que venho pensando nisso, mas talvez nunca tenha tentado explicar, vou tentar…&lt;/p>
&lt;p>“Cara, olha o impacto que isso tem na vida das pessoas”. Um ambiente totalmente hostil, o mundo não é inclusivo, as pessoas querem cobrar por tudo, as pessoas não querem ajudar ninguém. Como uma live de programação pode ter impacto positivo sobre qualquer coisa? Lembrei de novo das pessoas, estamos nos conectando, falando sobre coisas que gostamos e todo mundo está aprendendo. Isso é meio que um hack, usar uma plataforma que só visa lucro pra ensinar de graça, propagar conhecimento distribuído, que você pode consumir como quiser, quando puder. Isso é totalmente o contrário do que “me ensinaram” a vida toda. Não é necessário um super diploma pra ensinar, não é preciso uma sala de aula pra aprender. Pô, a gente pode fazer isso tomando coca e rindo. A gente pode fazer piada, a gente é livre pra aprender o que quiser e pra chegar onde quiser. É tudo muito confuso dentro da minha cabeça quando penso nisso. Mas se não fosse um maluco (Guido) que tivesse a ideia de materializar tudo isso a um tempo atrás, não teríamos a comunidade que temos, nós não seriamos amigos, pelo que iríamos nos apaixonar? Quem nós seriamos hoje?&lt;/p>
&lt;p>Parece que com o passar do tempo tomamos algumas decisões erradas, as coisas poderiam ser sim diferentes. Mas, quando paro pra pensar nas coisas, gostaria que elas fossem exatamente iguais.&lt;/p>
&lt;p>E você, já se apaixonou por Python hoje?&lt;/p>
&lt;p>Se você chegou até aqui, esse é só um punhado de ideias jogadas na internet, são pensamentos sobre a minha vida, o universo e tudo mais. Se precisar de um amigo, um abraço, uma ajudinha com código. Nós estamos sempre por aqui ❤&lt;/p>
&lt;figure>&lt;img src="https://blog.dunossauro.com/images/1_e3SnNN3qUCrkFGuJwOEZDg.webp" width="400"/>&lt;figcaption>
&lt;h4>????????&lt;/h4>
&lt;/figcaption>
&lt;/figure></description></item><item><title/><link>https://blog.dunossauro.com/blogroll/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mail@dunossauro.com (dunossauro)</author><guid>https://blog.dunossauro.com/blogroll/</guid><description>&lt;h2 id="blogroll" >
&lt;div>
&lt;a href="#blogroll">
#
&lt;/a>
Blogroll
&lt;/div>
&lt;/h2>
&lt;p>Boas-vindas ao meu blogroll.&lt;/p>
&lt;p>Aqui estão blogs, páginas, conteúdos, &amp;hellip; Coisas que leio, que gosto, que recomendo e quem sabe você possa se interessar por eles.&lt;/p>
&lt;h3 id="blogs-pessoais" >
&lt;div>
&lt;a href="#blogs-pessoais">
##
&lt;/a>
Blogs pessoais
&lt;/div>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://rochacbruno.com">Bruno Rocha&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://bugelseif.github.io/">bugelseif&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://carrara.dev.br/">Caio Carrara&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://claromes.com/">claromes.com&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://cassiobotaro.dev/posts/">Cassio Botaro&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://eduardoklosowski.github.io/blog/">Eduardo Klosowski&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://gmgall.net/">gmgall.net&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://helio.loureiro.eng.br/">Helio Loureiro&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://ivansantiago.net/blog/">Ivan Santiago&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://blog.jonatasoliveira.dev/">Jonatas Oliveira&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://masdivago.cc/">Masdivago&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://www.memedecarbono.com.br">Meme de Carbono&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://osantana.me">osantana&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://rennerocha.com/">Renne Rocha&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://www.ratamero.com">ratamero.com&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://teomewhy.org/blog/">Téo Me Why&lt;/a> 🇧🇷&lt;/li>
&lt;/ul>
&lt;hr>
&lt;ul>
&lt;li>&lt;a href="https://andrewkelley.me/">Andrew Kelley&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://blog.glyph.im/">Deciphering Glyph&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://hugovk.dev/">Hugo van Kemenade&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://journal.stuffwithstuff.com/archive/">Stuff With Stuff&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://ploum.net/">Ploum.net&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://vkc.sh">VKC.sh | Veronica Explains&lt;/a> 🇬🇧&lt;/li>
&lt;/ul>
&lt;h3 id="páginas-não-pessoais" >
&lt;div>
&lt;a href="#p%c3%a1ginas-n%c3%a3o-pessoais">
##
&lt;/a>
Páginas não pessoais
&lt;/div>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manualdousuario.net">Manual do Usuário&lt;/a> 🇧🇷&lt;/li>
&lt;li>&lt;a href="https://solar.lowtechmagazine.com/posts/">LOW←TECH MAGAZINE English&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://htmx.org/essays/">HTMX essays&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://f-droid.org/en/news/">F-Droid&lt;/a> 🇬🇧&lt;/li>
&lt;li>&lt;a href="https://daily.bandcamp.com/feed">Bandcamp Daily&lt;/a> 🇬🇧&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>A lista completa de tudo que eu acompanho diariamente está no meu &lt;a href="https://codeberg.org/dunossauro/dotfiles/src/branch/main/feed.opml">OPML&lt;/a>, caso você queira descobrir mais coisas :)&lt;/p>
&lt;/blockquote></description></item></channel></rss>