<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on cassiobotaro</title><link>https://cassiobotaro.dev/posts/</link><description>Recent content in Posts on cassiobotaro</description><generator>Hugo</generator><language>pt-br</language><lastBuildDate>Mon, 06 Jul 2026 13:07:09 -0300</lastBuildDate><atom:link href="https://cassiobotaro.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>As receitas escondidas na documentação do itertools</title><link>https://cassiobotaro.dev/posts/receitas-itertools/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/receitas-itertools/</guid><description>&lt;p&gt;No fim da página do &lt;code&gt;itertools&lt;/code&gt; existe uma seção chamada &lt;a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" class="external-link" target="_blank" rel="noopener"&gt;Itertools Recipes&lt;/a&gt;: uma coleção de funções úteis construídas combinando os blocos do módulo. Achatar uma lista de listas, achar o primeiro elemento que passa num teste, percorrer uma sequência em janelas: muita coisa que você escreveria na mão já está resolvida ali. As receitas não vêm prontas no &lt;code&gt;itertools&lt;/code&gt;, a ideia é copiar pro seu código. Já usamos uma delas por aqui, a &lt;code&gt;consume&lt;/code&gt;, no artigo sobre &lt;a href="https://cassiobotaro.dev/posts/consumindo-iteraveis/" &gt;consumir iteráveis sem alocar memória&lt;/a&gt;. Separei três outras que valem a pena conhecer.&lt;/p&gt;</description></item><item><title>Invocando módulos com python -m</title><link>https://cassiobotaro.dev/posts/python-m-modulo/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/python-m-modulo/</guid><description>&lt;p&gt;O Python tem a flag &lt;code&gt;-m&lt;/code&gt;, que localiza um módulo e roda ele como script. E a biblioteca padrão está cheia de módulos que viram utilitários de linha de comando prontos pra usar, sem instalar nada.&lt;/p&gt;
&lt;p&gt;Servir a pasta atual por HTTP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m http.server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Formatar (e validar) um JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;nome&amp;#34;: &amp;#34;cassio&amp;#34;, &amp;#34;linguagem&amp;#34;: &amp;#34;python&amp;#34;}&amp;#39;&lt;/span&gt; | python -m json.tool
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ver o calendário do ano no terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m calendar &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Você provavelmente já usou a flag sem perceber, em comandos como &lt;code&gt;python -m venv .venv&lt;/code&gt; ou &lt;code&gt;python -m pip install&lt;/code&gt;. É o mesmo mecanismo: o &lt;code&gt;-m&lt;/code&gt; localiza o módulo no caminho de importação e executa ele como programa principal, com &lt;code&gt;__name__&lt;/code&gt; valendo &lt;code&gt;&amp;quot;__main__&amp;quot;&lt;/code&gt; (quando o alvo é um pacote, o que roda é o &lt;code&gt;__main__.py&lt;/code&gt; dele).&lt;/p&gt;</description></item><item><title>Objetos totalmente comparáveis com um único método</title><link>https://cassiobotaro.dev/posts/objetos-comparaveis/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/objetos-comparaveis/</guid><description>&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Para um objeto responder a &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt; e &lt;code&gt;!=&lt;/code&gt;, o Python espera que você implemente &lt;code&gt;__lt__&lt;/code&gt;, &lt;code&gt;__le__&lt;/code&gt;, &lt;code&gt;__gt__&lt;/code&gt;, &lt;code&gt;__ge__&lt;/code&gt;, &lt;code&gt;__eq__&lt;/code&gt; e &lt;code&gt;__ne__&lt;/code&gt;. São seis métodos quase idênticos, tediosos de escrever e fáceis de deixar inconsistentes (um diz que &lt;code&gt;a &amp;lt; b&lt;/code&gt; e outro discorda).&lt;/p&gt;
&lt;h2 id="a-dica"&gt;
 A dica
 &lt;a class="heading-link" href="#a-dica"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Duas peças cobrem tudo:&lt;/p&gt;</description></item><item><title>Design docs, parte 5: ferramentas, referências e uma demo</title><link>https://cassiobotaro.dev/posts/design-docs-parte-5/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/design-docs-parte-5/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/design-docs-5.png" alt="Design docs (parte 5)" title="Design docs"&gt;&lt;/p&gt;
&lt;p&gt;Chegamos à última parte da série. Já vimos o que é um design doc, como preencher cada seção e como ele vive ao longo do tempo. Falta a parte mais prática, que mostra com o que escrever, onde se aprofundar e como um agente de IA pode te dar o primeiro rascunho.&lt;/p&gt;
&lt;h2 id="ferramentas-para-escrever"&gt;
 Ferramentas para escrever
 &lt;a class="heading-link" href="#ferramentas-para-escrever"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confluence.&lt;/strong&gt; Wiki corporativo da Atlassian para criar documentos com colaboração em equipe. Integra com Jira e Bitbucket.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Docs.&lt;/strong&gt; Online e gratuito, com edição colaborativa em tempo real e compartilhamento fácil.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub.&lt;/strong&gt; Hospeda código e também documentos em Markdown, com edição colaborativa via Pull Requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ferramentas-para-diagramas"&gt;
 Ferramentas para diagramas
 &lt;a class="heading-link" href="#ferramentas-para-diagramas"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://mermaid.js.org" class="external-link" target="_blank" rel="noopener"&gt;Mermaid&lt;/a&gt;.&lt;/strong&gt; Diagramas de forma textual: sequência, casos de uso, C4 e mais.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://sequencediagram.org" class="external-link" target="_blank" rel="noopener"&gt;Sequence Diagram&lt;/a&gt;.&lt;/strong&gt; Dedicada a diagramas de sequência, de forma textual e rápida.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://structurizr.com" class="external-link" target="_blank" rel="noopener"&gt;Structurizr&lt;/a&gt;.&lt;/strong&gt; Diagramas como código: vários diagramas de arquitetura C4 a partir de um único modelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Os diagramas C4 e de sequência que aparecem na &lt;a href="https://cassiobotaro.dev/posts/design-docs-parte-2/" &gt;parte 2&lt;/a&gt; foram feitos com ferramentas como essas.&lt;/p&gt;</description></item><item><title>Rodando um .zip como aplicação Python</title><link>https://cassiobotaro.dev/posts/rodando-zip-com-python/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/rodando-zip-com-python/</guid><description>&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Você tem uma aplicação Python espalhada em vários arquivos e quer entregar tudo num arquivo só. E se desse pra empacotar num &lt;code&gt;.zip&lt;/code&gt; e rodar com &lt;code&gt;python app.zip&lt;/code&gt;?&lt;/p&gt;
&lt;h2 id="a-dica"&gt;
 A dica
 &lt;a class="heading-link" href="#a-dica"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Dá, e é mais simples do que parece. O Python sabe executar um &lt;code&gt;.zip&lt;/code&gt; direto, desde que tenha um &lt;code&gt;__main__.py&lt;/code&gt; lá dentro. Vamos do zero.&lt;/p&gt;</description></item><item><title>Design docs, parte 4: ciclo de vida, quando não escrever e outros documentos</title><link>https://cassiobotaro.dev/posts/design-docs-parte-4/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/design-docs-parte-4/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/design-docs-4.png" alt="Design docs (parte 4)" title="Design docs"&gt;&lt;/p&gt;
&lt;p&gt;Nas partes anteriores preenchemos o documento de ponta a ponta. Agora o foco muda: como um design doc vive ao longo do tempo, quando &lt;em&gt;não&lt;/em&gt; escrever um e que outros documentos andam ao lado dele.&lt;/p&gt;
&lt;h2 id="o-ciclo-de-vida"&gt;
 O ciclo de vida
 &lt;a class="heading-link" href="#o-ciclo-de-vida"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Um design doc é &lt;strong&gt;documentação viva&lt;/strong&gt;. Ele não nasce pronto nem morre quando o código sobe. O caminho típico é:&lt;/p&gt;</description></item><item><title>Consumindo iteráveis sem alocar memória</title><link>https://cassiobotaro.dev/posts/consumindo-iteraveis/</link><pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/consumindo-iteraveis/</guid><description>&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Quando você só quer &amp;ldquo;rodar&amp;rdquo; um pipeline de &lt;code&gt;map&lt;/code&gt;/gerador pelos efeitos colaterais (escrever cada item num stream, por exemplo), o reflexo é um &lt;code&gt;for&lt;/code&gt; ou um &lt;code&gt;list(...)&lt;/code&gt;. O &lt;code&gt;list&lt;/code&gt; aloca uma lista inteira que vai ser descartada na sequência, gastando memória à toa. O &lt;code&gt;for&lt;/code&gt; resolve a memória, mas o loop roda em Python puro.&lt;/p&gt;
&lt;h2 id="a-dica"&gt;
 A dica
 &lt;a class="heading-link" href="#a-dica"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;collections.deque&lt;/code&gt; aceita o parâmetro &lt;code&gt;maxlen&lt;/code&gt;. Com &lt;code&gt;maxlen=0&lt;/code&gt;, ela puxa cada elemento e descarta na hora, sem nunca crescer: é a receita &lt;a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" class="external-link" target="_blank" rel="noopener"&gt;&lt;code&gt;consume&lt;/code&gt;&lt;/a&gt; do &lt;code&gt;itertools&lt;/code&gt;. Em vez de materializar uma lista só para jogá-la fora, você esgota o pipeline em memória constante.&lt;/p&gt;</description></item><item><title>Design docs, parte 3: alternativas, preocupações transversais e mais</title><link>https://cassiobotaro.dev/posts/design-docs-parte-3/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/design-docs-parte-3/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/design-docs-3.png" alt="Design docs (parte 3)" title="Design docs"&gt;&lt;/p&gt;
&lt;p&gt;Na &lt;a href="https://cassiobotaro.dev/posts/design-docs-parte-2/" &gt;parte 2&lt;/a&gt; descrevemos e justificamos o design da solução. Mas um bom documento também mostra os caminhos que &lt;strong&gt;não&lt;/strong&gt; foram seguidos e o que a solução afeta fora do seu time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Lembrando: as seções a seguir são exemplos e recomendações, não um molde obrigatório.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="alternativas-consideradas"&gt;
 Alternativas consideradas
 &lt;a class="heading-link" href="#alternativas-consideradas"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Aqui você lista os sistemas ou soluções alternativas que foram avaliados, explicando as compensações e as motivações da escolha final.&lt;/p&gt;</description></item><item><title>Design docs, parte 2: o design</title><link>https://cassiobotaro.dev/posts/design-docs-parte-2/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/design-docs-parte-2/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/design-docs-2.png" alt="Design docs (parte 2)" title="Design docs"&gt;&lt;/p&gt;
&lt;p&gt;Na &lt;a href="https://cassiobotaro.dev/posts/design-docs-parte-1/" &gt;parte 1&lt;/a&gt; montamos o início do design doc do nosso caso fictício, o Recomendador de reposição de estoque: cabeçalhos, visão geral, escopo e contexto, objetivos e fora de escopo. Agora chegamos ao coração do documento.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Como sempre, as seções aqui são exemplos e recomendações, não um molde obrigatório.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="o-design"&gt;
 O design
 &lt;a class="heading-link" href="#o-design"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Aqui vale um esclarecimento: o &amp;ldquo;design&amp;rdquo; não é uma única seção, e sim um conjunto delas. Dependendo do projeto, ele se desdobra em várias partes, cada uma com seu próprio título:&lt;/p&gt;</description></item><item><title>Design docs, parte 1: o que são e o início do documento</title><link>https://cassiobotaro.dev/posts/design-docs-parte-1/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/design-docs-parte-1/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/design-docs-1.png" alt="Design docs (parte 1)" title="Design docs"&gt;&lt;/p&gt;
&lt;p&gt;Um &lt;strong&gt;design doc&lt;/strong&gt; é um documento relativamente informal que a pessoa autora principal (ou as autoras) de um sistema de software cria antes de embarcar no projeto de codificação. Ele documenta a estratégia de implementação de alto nível e as principais decisões de design, com ênfase nas compensações consideradas ao longo do caminho. Em outras palavras, é onde registramos o racional da solução adotada, as alternativas, os objetivos e a arquitetura, de forma clara e compartilhável com o time, antes de gastar tempo escrevendo código.&lt;/p&gt;</description></item><item><title>O protocolo de escrita</title><link>https://cassiobotaro.dev/posts/protocolo-de-escrita/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/protocolo-de-escrita/</guid><description>&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Quando uma função só precisa escrever em um stream, tipar o argumento como &lt;a href="https://docs.python.org/3/library/typing.html#typing-io" class="external-link" target="_blank" rel="noopener"&gt;&lt;code&gt;IO[str]&lt;/code&gt;&lt;/a&gt; é exagero, já que você está exigindo &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;seek&lt;/code&gt;, &lt;code&gt;close&lt;/code&gt; e todo o resto da interface, mesmo que nunca vá usá-los.&lt;/p&gt;
&lt;h2 id="a-dica"&gt;
 A dica
 &lt;a class="heading-link" href="#a-dica"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A partir do &lt;strong&gt;Python 3.14&lt;/strong&gt;, o módulo &lt;code&gt;io&lt;/code&gt; expõe os protocolos &lt;code&gt;Writer[T]&lt;/code&gt; e &lt;code&gt;Reader[T]&lt;/code&gt;. Eles descrevem só o contrato mínimo (&lt;code&gt;write()&lt;/code&gt; ou &lt;code&gt;read()&lt;/code&gt;), então qualquer objeto que implemente apenas esse método já satisfaz o tipo.&lt;/p&gt;</description></item><item><title>POOP: Python infectado por Smalltalk</title><link>https://cassiobotaro.dev/posts/poop-python-infectado-por-smalltalk/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/poop-python-infectado-por-smalltalk/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/poop.png" alt="POOP" title="Logo do projeto POOP"&gt;&lt;/p&gt;
&lt;h2 id="uma-provocação-à-orientação-a-objetos"&gt;
 Uma provocação à orientação a objetos
 &lt;a class="heading-link" href="#uma-provoca%c3%a7%c3%a3o-%c3%a0-orienta%c3%a7%c3%a3o-a-objetos"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Há uma frase de Alan Kay que me persegue há anos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OOP é, essencialmente, sobre troca de mensagens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A primeira vez que ouvi sobre isso, fingi que entendi e segui escrevendo &lt;code&gt;if&lt;/code&gt; e &lt;code&gt;for&lt;/code&gt; como sempre. Mas a ideia não saiu da cabeça. O empurrão final veio da palestra &lt;a href="https://www.youtube.com/watch?v=OMPfEXIlTVE" class="external-link" target="_blank" rel="noopener"&gt;&lt;em&gt;Nothing is Something&lt;/em&gt;&lt;/a&gt; da Sandi Metz, em que ela mostra como substituir &lt;code&gt;nil&lt;/code&gt;, condicionais e operadores por objetos que respondem a mensagens, inclusive um &lt;code&gt;Null Object&lt;/code&gt; que sabe se comportar como qualquer outro. Saí dali com uma vontade enorme de fazer uma provocação concreta ao Python: e se eu tirasse tudo que &lt;em&gt;parece&lt;/em&gt; procedural, mesmo quando não é? Eu sei que &lt;code&gt;print(x)&lt;/code&gt; acaba chamando &lt;code&gt;__str__&lt;/code&gt; e que &lt;code&gt;len(x)&lt;/code&gt; delega para &lt;code&gt;__len__&lt;/code&gt;; o modelo de dados do Python é absurdamente coerente nesse aspecto. Mas a &lt;em&gt;cara&lt;/em&gt; dessas chamadas é de função livre, não de mensagem para um objeto. Sem &lt;code&gt;if&lt;/code&gt;, sem &lt;code&gt;for&lt;/code&gt;, sem &lt;code&gt;print(x)&lt;/code&gt;, sem &lt;code&gt;len(x)&lt;/code&gt;. Tudo precisa &lt;em&gt;parecer&lt;/em&gt; uma mensagem enviada a um objeto.&lt;/p&gt;</description></item><item><title>Como detectei um leak de memória em Node.js com heap snapshots</title><link>https://cassiobotaro.dev/posts/detectando-memory-leak-nodejs/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/detectando-memory-leak-nodejs/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/leak.png" alt="Leak"&gt;&lt;/p&gt;
&lt;p&gt;Recentemente precisei investigar um crescimento estranho de memória num projeto real — o comportamento não aparecia em desenvolvimento, mas explodiu sob carga. Montei um exemplo mínimo que reproduz o cenário. Mais importante do que decorar a correção é entender o processo: se você souber repetir esse fluxo, vai conseguir investigar problemas parecidos com muito mais segurança.&lt;/p&gt;
&lt;h2 id="o-sintoma"&gt;
 O sintoma
 &lt;a class="heading-link" href="#o-sintoma"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;O endpoint buscava dados com Sequelize, enriquecia cada item com informação externa e serializava tudo na resposta. O problema só apareceu ao executar repetidamente sob carga.&lt;/p&gt;</description></item><item><title>Meu Primeiro Programa</title><link>https://cassiobotaro.dev/posts/meu-primeiro-programa/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/meu-primeiro-programa/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/555.png" alt="CI 555 com calculadora e código Pascal" title="O CI NE555 cercado de código Pascal — meu primeiro programa de verdade"&gt;&lt;/p&gt;
&lt;h2 id="uma-história-de-técnico-em-automação"&gt;
 Uma História de Técnico em Automação
 &lt;a class="heading-link" href="#uma-hist%c3%b3ria-de-t%c3%a9cnico-em-automa%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Em 2010 me formei como técnico em Automação Industrial. Se você não sabe bem o que isso significa, pense em fábricas, esteiras, robôs, CLPs, sensores e uma porção de siglas que a maioria das pessoas nunca vai precisar conhecer. Foi um curso incrível, que misturava eletrônica, mecânica e — aqui começa a história — programação.&lt;/p&gt;</description></item><item><title>O Objeto Dinheiro</title><link>https://cassiobotaro.dev/posts/objeto-dinheiro/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/objeto-dinheiro/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/dinheiro.png" alt="Dinheiro"&gt;&lt;/p&gt;
&lt;h2 id="a-história"&gt;
 A História
 &lt;a class="heading-link" href="#a-hist%c3%b3ria"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Há um tempo, participei de um processo seletivo de um banco roxinho bastante conhecido. Não passei, mas recebi um feedback valioso sobre o código que escrevi. Juntando esse feedback com conhecimentos que adquiri depois, decidi revisitar o desafio e melhorar a implementação.&lt;/p&gt;
&lt;p&gt;Uma das melhorias mais significativas foi a criação de um objeto &lt;code&gt;Money&lt;/code&gt;, baseado no padrão de mesmo nome descrito por Martin Fowler no livro &lt;em&gt;Patterns of Enterprise Application Architecture&lt;/em&gt; (PEAA).&lt;/p&gt;</description></item><item><title>Números Romanos com Python</title><link>https://cassiobotaro.dev/posts/numeros-romanos-com-python/</link><pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/numeros-romanos-com-python/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/numeros-romanos.png" alt="Números Romanos" title="Duas pessoas com trajes romanas e balões dizendo &amp;#39;5&amp;#39; e &amp;#39;V&amp;#39;"&gt;&lt;/p&gt;
&lt;h2 id="números-romanos"&gt;
 Números Romanos
 &lt;a class="heading-link" href="#n%c3%bameros-romanos"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Imagine escrever código Python desta forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; roman
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(roman&lt;span style="color:#f92672"&gt;.&lt;/span&gt;X) &lt;span style="color:#75715e"&gt;# 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(roman&lt;span style="color:#f92672"&gt;.&lt;/span&gt;IV) &lt;span style="color:#75715e"&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(roman&lt;span style="color:#f92672"&gt;.&lt;/span&gt;XLII) &lt;span style="color:#75715e"&gt;# 42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(roman&lt;span style="color:#f92672"&gt;.&lt;/span&gt;MCMXC) &lt;span style="color:#75715e"&gt;# 1990&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simplesmente elegante, não? Sem funções, sem conversões explícitas, apenas&amp;hellip; números romanos sendo números romanos. É como se a linguagem naturalmente entendesse esse sistema milenar.&lt;/p&gt;
&lt;h2 id="dsls-internas-e-a-mágica-do-__getattr__"&gt;
 DSLs Internas e a Mágica do &lt;code&gt;__getattr__&lt;/code&gt;
 &lt;a class="heading-link" href="#dsls-internas-e-a-m%c3%a1gica-do-__getattr__"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DSL (Domain-Specific Language) é basicamente uma linguagem criada para um propósito específico. Existem as &lt;strong&gt;externas&lt;/strong&gt; (com sua própria sintaxe) e as &lt;strong&gt;internas&lt;/strong&gt; (que aproveitam a sintaxe da linguagem que você já usa). O que vamos criar aqui é uma &lt;strong&gt;DSL interna&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Quando Python Encontra RPG: Rolando Dados com Estilo</title><link>https://cassiobotaro.dev/posts/dsl-rolagem-dados/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/dsl-rolagem-dados/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/rpg.png" alt="Pessoas jogando RPG" title="Pessoas jogando RPG"&gt;&lt;/p&gt;
&lt;h2 id="vamos-rolar-os-dados"&gt;
 Vamos rolar os dados?
 &lt;a class="heading-link" href="#vamos-rolar-os-dados"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Imagine poder escrever rolagens de dados de RPG de forma natural como:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; D6 &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; D10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;E executar uma rolagem simplesmente com:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; D10 &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; D4)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;roll()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isso é possível em Python através da sobrecarga de operadores! Vamos criar uma DSL (Domain Specific Language - Linguagem Específica de Domínio) para tornar a rolagem de dados intuitiva e expressiva.&lt;/p&gt;</description></item><item><title>Armadilha com count e index em NamedTuple</title><link>https://cassiobotaro.dev/posts/namedtuple-count-index-mypy/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/namedtuple-count-index-mypy/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/type-checking.png" alt="Type checking"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O Problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Você está usando &lt;code&gt;NamedTuple&lt;/code&gt; para criar suas classes de dados e decide criar um campo chamado &lt;code&gt;count&lt;/code&gt; ou &lt;code&gt;index&lt;/code&gt;. Tudo funciona perfeitamente em tempo de execução, mas quando você executa o mypy ou outro analisador de tipos, recebe erros estranhos. O que está acontecendo?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; typing &lt;span style="color:#f92672"&gt;import&lt;/span&gt; NamedTuple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Item&lt;/span&gt;(NamedTuple):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: str
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count: int &lt;span style="color:#75715e"&gt;# Perigo!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Item(name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, count&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(item&lt;span style="color:#f92672"&gt;.&lt;/span&gt;count) &lt;span style="color:#75715e"&gt;# Funciona em runtime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ao executar o mypy:&lt;/p&gt;</description></item><item><title>Rastreando progresso com IntFlag</title><link>https://cassiobotaro.dev/posts/rastreando-progresso-com-intflag/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/rastreando-progresso-com-intflag/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/tracking.png" alt="Tracking"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O Problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Imagine que você está integrando um produto novo no seu sistema. Este produto deve possuir detalhes e especificações completos antes de ser publicado. Porém, essas informações são adicionadas em passos separados e não necessariamente ordenados. Como verificar que todos os passos foram completados?&lt;/p&gt;
&lt;p&gt;Uma solução ingênua seria usar variáveis booleanas para cada passo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ProductTrack&lt;/span&gt;(models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Model):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ForeignKey(Product, on_delete&lt;span style="color:#f92672"&gt;=&lt;/span&gt;models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CASCADE)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; has_specification &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;BooleanField(default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; has_detail &lt;span style="color:#f92672"&gt;=&lt;/span&gt; models&lt;span style="color:#f92672"&gt;.&lt;/span&gt;BooleanField(default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is_complete&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;has_specification &lt;span style="color:#f92672"&gt;and&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;has_detail
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mas e se você precisar adicionar mais passos? Ou remover algum? Cada alteração exige mudanças no modelo, migrações de banco de dados e ajustes na lógica.&lt;/p&gt;</description></item><item><title>Programação Orientada a Objetos - Canal do Regis do Python - Parte 2</title><link>https://cassiobotaro.dev/posts/poop-canal-do-regis-parte-2/</link><pubDate>Fri, 26 Mar 2021 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/poop-canal-do-regis-parte-2/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/thumb-poop-canal-regis-parte-2.jpg" alt="Banner divulgação da palestra" title="Divulgação do Vídeo"&gt;&lt;/p&gt;
&lt;p&gt;Após uma &lt;a href="" &gt;primeira parte&lt;/a&gt; onde definimos vários conceitos da programação orientada a objetos, como instâncias, classes, abstração, encapsulamento, herança, composição. Chegou a vez de darmos uma aprofundada sobre um conceito que é: Métodos e atributos de classe e de instância. Também falamos sobre polimorfismo e vimos como isto pode ser aplicado em um sistema orientado a objetos e para encerrar a live (ufa!) demos uma passada sobre os padrões de projeto &lt;em&gt;strategy&lt;/em&gt; e &lt;em&gt;command&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Programação Orientada a Objetos - Canal do Regis do Python</title><link>https://cassiobotaro.dev/posts/poop-canal-do-regis/</link><pubDate>Fri, 12 Feb 2021 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/poop-canal-do-regis/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/thumb-poop-canal-regis.jpg" alt="Banner divulgação da palestra" title="Divulgação do Vídeo"&gt;&lt;/p&gt;
&lt;p&gt;Recentemente tenho feito estudos a respeito da orientação a objeto e ontem tive o prazer de poder compartilhar este conhecimento no canal de um grande amigo da comunidade que é o Regis. Foi uma palestra de muita provocação sobre os conceitos que são a base da programação orientada a objetos, sem focar tanto na sintaxe, mas sim no fundamentos.&lt;/p&gt;
&lt;p&gt;Obrigado Regis pelo convite e espero que gostem do conteúdo!&lt;/p&gt;</description></item><item><title>Contribuindo com Open Source - DevDay 2020</title><link>https://cassiobotaro.dev/posts/contribuindo-com-open-source-dev-day/</link><pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/contribuindo-com-open-source-dev-day/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/open-source.png" alt="Logo Open Source" title="Logo Open Source"&gt;&lt;/p&gt;
&lt;p&gt;Desde 2012 participo do &lt;em&gt;DevDay&lt;/em&gt;, para mim um dos melhores eventos que temos em Minas Gerais. Como a versão 2020 foi online, tive o prazer de palestrar novamente sobre como é o passo a passo para contribuir com um projeto Open Source. Escolhi contribuir com o &lt;a href="http://vim-bootstrap.com/" class="external-link" target="_blank" rel="noopener"&gt;Vim Bootstrap&lt;/a&gt;, um projeto que contribuo a algum tempo.&lt;/p&gt;
&lt;p&gt;Obrigado Gibran e Douglas pela excelente organização e recomendo assistirem as outras palestras.&lt;/p&gt;</description></item><item><title>Contribuindo com Open Source</title><link>https://cassiobotaro.dev/posts/contribuindo-com-open-source/</link><pubDate>Wed, 14 Oct 2020 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/contribuindo-com-open-source/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/open-source.png" alt="Logo Open Source" title="Logo Open Source"&gt;&lt;/p&gt;
&lt;p&gt;O mês de outubro é conhecido como o mês da &lt;a href="https://hacktoberfest.digitalocean.com/" class="external-link" target="_blank" rel="noopener"&gt;&lt;em&gt;hacktoberfest&lt;/em&gt;&lt;/a&gt; e a promoção da contribuição com projetos open sources. Convidado pelo meu grande amigo Fernando Pimenta, dei uma palestra mostrando os lados da pessoa contribuidora e também da pessoa mantenedora de projetos open source.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HrUzE499OaY?t=4491?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;Os slides podem ser encontrados aqui: &lt;a href="http://bit.ly/contribuindo-open-source" class="external-link" target="_blank" rel="noopener"&gt;🧑‍💻 Open Source e você, tudo a ver&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Dublês de teste</title><link>https://cassiobotaro.dev/posts/dubles-de-teste/</link><pubDate>Sat, 19 Sep 2020 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/dubles-de-teste/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/dubles.jpg" alt="dublê" title="dublês"&gt;&lt;/p&gt;
&lt;h2 id="test-double---o-termo-genérico"&gt;
 Test Double - O termo genérico
 &lt;a class="heading-link" href="#test-double---o-termo-gen%c3%a9rico"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;O termo &lt;strong&gt;Test Double&lt;/strong&gt; (dublê de teste) foi cunhado por Gerard Meszaros em seu livro &amp;ldquo;xUnit Test Patterns&amp;rdquo;, como analogia aos dublês de cinema (stunt doubles). Um Test Double é qualquer objeto que substitui um objeto de produção para propósitos de teste.&lt;/p&gt;
&lt;p&gt;Assim como no cinema diferentes dublês são usados para diferentes cenas (dublês de ação, de corpo, etc.), nos testes temos diferentes tipos de dublês, cada um com seu propósito específico.&lt;/p&gt;</description></item><item><title>Ordenando dicionário por valores</title><link>https://cassiobotaro.dev/posts/ordenando-dicionario-por-valores/</link><pubDate>Sat, 23 Mar 2019 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/ordenando-dicionario-por-valores/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/dict.png" alt="dict" title="associação de chaves e valores"&gt;&lt;/p&gt;
&lt;p&gt;Dado um dicionário, eu quero ordenar seus elementos de acordo com seus valores, não por sua chave.&lt;/p&gt;
&lt;p&gt;Por exemplo o dicionário &lt;code&gt;{1: &amp;quot;b&amp;quot;, 2: &amp;quot;a&amp;quot;}&lt;/code&gt; se torna &lt;code&gt;{2: &amp;quot;a&amp;quot;, 1: &amp;quot;b&amp;quot;}&lt;/code&gt; pois &amp;ldquo;a&amp;rdquo; &amp;lt; &amp;ldquo;b&amp;rdquo; .&lt;/p&gt;
&lt;h2 id="discussão"&gt;
 Discussão
 &lt;a class="heading-link" href="#discuss%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Executar a função sorted sobre um dicionário tem como resultado uma lista ordenada de suas chaves.&lt;/p&gt;
&lt;p&gt;A explicação disso é que a função sorted recebe um objeto iterável, ou seja uma estrutura de dados container que pode ter seus elementos internos percorridos múltiplas vezes e retorna uma nova lista ordenada de forma ascendente.&lt;/p&gt;</description></item><item><title>Amor Programador</title><link>https://cassiobotaro.dev/posts/amor-programador/</link><pubDate>Wed, 20 Mar 2019 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/amor-programador/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/coracao.jpg" alt="mao-coracao" title="Mãos em formato de coração"&gt;&lt;/p&gt;
&lt;p&gt;Expressar sentimentos pode ser por muitas vezes muito difícil, e &lt;em&gt;normalmente&lt;/em&gt; pessoas que programam tem esta dificuldade.&lt;/p&gt;
&lt;p&gt;Em uma tarde qualquer, à procura de uma diversão com programação me perguntei &amp;ldquo;Como desenhar um coração com python?&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Como pessoa programadora experiente, fui ao google e digitei esta pergunta e para minha surpresa o primeiro resultado não me levava ao stack overflow e sim ao &lt;a href="https://www.quora.com/How-can-I-draw-a-heart-using-Python" class="external-link" target="_blank" rel="noopener"&gt;quora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Achei várias implementações, mas a que mais me chamou atenção foi uma que isto era feita em &lt;strong&gt;somente uma linha&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Somatório</title><link>https://cassiobotaro.dev/posts/somatorio/</link><pubDate>Wed, 13 Mar 2019 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/somatorio/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/somatorio.jpg" alt="Formula matemática" title="Formula matemática"&gt;&lt;/p&gt;
&lt;p&gt;O somatório é um operador matemático, utilizado para representar a soma de termos, mesmo em uma sequência infinita. Seu simbolo é a letra grega sigma.&lt;/p&gt;
&lt;p&gt;Aproveitando que python 3 aceita o caracter &lt;code&gt;Σ&lt;/code&gt;, decidi escrever uma função que soma os termos em um intervalo finito representado pelos limites inferiores e superiores.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Σ&lt;/span&gt;(lower_bound, upper_bound, function):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;Summation is a math operator to easily represent a great sum of terms,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; even infinity.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; It&amp;#39;s represented with the greek letter sigma.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Sum terms from lower_bound until upper_bound, applying some function on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; each term.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;gt;&amp;gt;&amp;gt; Σ(1,5,lambda x:x) # 1 + 2 + 3 + 4 + 5 = 15
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 15
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sum(function(index) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; index &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(lower_bound,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; upper_bound &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Você pode testar através do comando &lt;code&gt;python -m doctest&lt;/code&gt;ou mesmo de forma interativa.&lt;/p&gt;</description></item><item><title>Mergulhando em Rust</title><link>https://cassiobotaro.dev/posts/mergulhando-em-rust/</link><pubDate>Thu, 21 Dec 2017 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/mergulhando-em-rust/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/mergulhando.jpg" alt="Mergulhando em rust" title="Livro fictício Mergulhando em Rust"&gt;&lt;/p&gt;
&lt;h2 id="o-workshop"&gt;
 O workshop
 &lt;a class="heading-link" href="#o-workshop"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;No dia 9 de Dezembro, aconteceu o primeiro workshop da linguagem Rust em Belo Horizonte. Foi um evento organizado pela comunidade local, liderados pelo Tiago(&lt;a href="https://github.com/tilacog" class="external-link" target="_blank" rel="noopener"&gt;@tilacog&lt;/a&gt;) e com um excelente suporte da &lt;a href="https://www.mozilla.org" class="external-link" target="_blank" rel="noopener"&gt;Mozilla&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Iniciando às 13h, os primeiros minutos foram de imersão sobre uma linguagem que para mim e outros presentes era nova, assim como conceitos que eram diferentes.&lt;/p&gt;</description></item><item><title>Armadilha de nomes em variáveis de funções</title><link>https://cassiobotaro.dev/posts/ardilha-de-nomes-em-variaveis-de-funcoes/</link><pubDate>Sat, 13 Aug 2016 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/ardilha-de-nomes-em-variaveis-de-funcoes/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/fragile.jpg" alt="fragile" title="Importação Frágil"&gt;&lt;/p&gt;
&lt;p&gt;Vamos analisar os seguintes cenários, eu tenho uma função onde ocorre uma importação dentro de uma função.&lt;/p&gt;
&lt;p&gt;Porém temos duas coisas ocorrendo, uma é que a condicional é falsa, logo o math não vai ser importado.&lt;/p&gt;
&lt;p&gt;Mas como já havia sido previamente importado no início do arquivo, o que esperar?&lt;/p&gt;
&lt;p&gt;No segundo caso, temos a declaração da variável de forma global, novamente temos uma condicional onde a variavel é redefinida de forma local.&lt;/p&gt;</description></item><item><title>Ordenação com valores nulos</title><link>https://cassiobotaro.dev/posts/ordenacao-com-valores-nulos/</link><pubDate>Thu, 21 Jul 2016 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/ordenacao-com-valores-nulos/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/sort.jpg" alt="ordenacao" title="Ordenação"&gt;&lt;/p&gt;
&lt;p&gt;Dado uma lista de elementos de mesmo tipo e valores nulos, ordene-os considerando que elementos nulos devem ir para o fim da lista.&lt;/p&gt;
&lt;p&gt;Por exemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Considere uma lista com valores inteiros e nulos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lista1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# A ordenação correta seria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; lista1 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Considere também uma lista de strings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lista2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;f&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# A ordenação correta seria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; lista2 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# O mesmo problema aparece em lista de dicionários ou objetos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lista3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [{&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;João&amp;#39;&lt;/span&gt;}, {&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;}, {&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Carla&amp;#39;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# A ordenação correta seria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; lista3 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [{&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Carla&amp;#39;&lt;/span&gt;}, {&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;João&amp;#39;&lt;/span&gt;}, {&lt;span style="color:#e6db74"&gt;&amp;#39;nome&amp;#39;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="discussão-sobre-o-problema"&gt;
 Discussão sobre o problema
 &lt;a class="heading-link" href="#discuss%c3%a3o-sobre-o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A lista possui um método para ordenação que se chama &lt;code&gt;sort&lt;/code&gt;. Sua assinatura nos permite ordenar qualquer tipo de objeto, desde que este seja iterável e seus elementos sejam comparáveis.&lt;/p&gt;</description></item><item><title>Corrigindo o vim bootstrap</title><link>https://cassiobotaro.dev/posts/corrigindo-o-vim-bootstrap/</link><pubDate>Thu, 11 Feb 2016 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/corrigindo-o-vim-bootstrap/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/vim.png" alt="logo-vim" title="Logo Vim"&gt;&lt;/p&gt;
&lt;h2 id="introdução"&gt;
 Introdução
 &lt;a class="heading-link" href="#introdu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;O intuito deste post é trazer problemas que tive durante a instalação do &lt;a href="https://github.com/avelino/vim-bootstrap" class="external-link" target="_blank" rel="noopener"&gt;vim-bootstrap&lt;/a&gt; e a solução dos mesmos.&lt;/p&gt;
&lt;p&gt;Acredito que minhas dúvidas podem ser de outros também.&lt;/p&gt;
&lt;p&gt;Só para referência, sou usuário xubuntu, ou seja, meu ambiente gráfico é o xfce.&lt;/p&gt;
&lt;p&gt;Utilizo o vim na versão 7.4, o git na versão 2.5.0. Estas informações são necessárias pois soluções podem divergir por versão.&lt;/p&gt;</description></item><item><title>Conceitos de linguagem de programação - Parte 4</title><link>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-4/</link><pubDate>Mon, 14 Dec 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-4/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="introdução"&gt;
 Introdução
 &lt;a class="heading-link" href="#introdu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Este post está relacionado a uma palestra ministrada no XVI encontro da comunidade mineira de Python, e aqui foi divida em partes para evitar que fique massante e cansativa.&lt;/p&gt;
&lt;p&gt;Cada parte será postada em uma semana.&lt;/p&gt;
&lt;p&gt;Existe um &lt;a href="https://github.com/cassiobotaro/conceitos_linguagens" class="external-link" target="_blank" rel="noopener"&gt;repositório&lt;/a&gt; onde exemplifico tudo que for colocado aqui além de explicar mais detalhadamente como e por que as coisas acontecem.&lt;/p&gt;</description></item><item><title>Conceitos de linguagem de programação - Parte 3</title><link>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-3/</link><pubDate>Sun, 06 Dec 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-3/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="introdução"&gt;
 Introdução
 &lt;a class="heading-link" href="#introdu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Este post está relacionado a uma palestra ministrada no XVI encontro da comunidade mineira de Python, e aqui foi divida em partes para evitar que fique massante e cansativa.&lt;/p&gt;
&lt;p&gt;Cada parte será postada em uma semana.&lt;/p&gt;
&lt;p&gt;Existe um &lt;a href="https://github.com/cassiobotaro/conceitos_linguagens" class="external-link" target="_blank" rel="noopener"&gt;repositório&lt;/a&gt; onde exemplifico tudo que for colocado aqui além de explicar mais detalhadamente como e por que as coisas acontecem.&lt;/p&gt;</description></item><item><title>Conceitos de linguagem de programação - Parte 2</title><link>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-2/</link><pubDate>Sun, 29 Nov 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-2/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="introdução"&gt;
 Introdução
 &lt;a class="heading-link" href="#introdu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Este post está relacionado a uma palestra ministrada no XVI encontro da comunidade mineira de Python, e aqui foi divida em partes para evitar que fique massante e cansativa.&lt;/p&gt;
&lt;p&gt;Cada parte será postada em uma semana.&lt;/p&gt;
&lt;p&gt;Existe um &lt;a href="https://github.com/cassiobotaro/conceitos_linguagens" class="external-link" target="_blank" rel="noopener"&gt;repositório&lt;/a&gt; onde exemplifico tudo que for colocado aqui além de explicar mais detalhadamente como e por que as coisas acontecem.&lt;/p&gt;</description></item><item><title>Conceitos de linguagem de programação - Parte 1</title><link>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-1/</link><pubDate>Sun, 22 Nov 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/conceitos-linguagem-parte-1/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="introdução"&gt;
 Introdução
 &lt;a class="heading-link" href="#introdu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Este post está relacionado a uma palestra ministrada no XVI encontro da comunidade mineira de Python, e aqui foi divida em partes para evitar que fique massante e cansativa.&lt;/p&gt;
&lt;p&gt;Cada parte será postada em uma semana.&lt;/p&gt;
&lt;p&gt;Existe um &lt;a href="https://github.com/cassiobotaro/conceitos_linguagens" class="external-link" target="_blank" rel="noopener"&gt;repositório&lt;/a&gt; onde exemplifico tudo que for colocado aqui além de explicar mais detalhadamente como e por que as coisas acontecem.&lt;/p&gt;</description></item><item><title>Removendo Labels</title><link>https://cassiobotaro.dev/posts/removendo-labels/</link><pubDate>Mon, 28 Sep 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/removendo-labels/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/rotulos.png" alt="rotulo" title="Rótulos"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Recentemente em um projeto pessoal me deparei com o seguinte problema. Ao adicionar um formulário utilizando o helper &lt;code&gt;SQLFORM&lt;/code&gt;, mais especificamente com o método &lt;code&gt;SQLFORM.factory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Eu não gostaria de exibir a label no formulário e também não gostaria de ter de escrever um form custom só por causa deste problema.&lt;/p&gt;
&lt;h2 id="discussão-sobre-o-problema"&gt;
 Discussão sobre o problema
 &lt;a class="heading-link" href="#discuss%c3%a3o-sobre-o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Minha primeira tentativa foi aplicar um formstyle ao formulário. Realizei tentativas frustadas com &amp;rsquo;table3cols&amp;rsquo;, &amp;rsquo;table2cols&amp;rsquo; e até mesmos os que utilizam bootstrap(que é utilizado no projeto).&lt;/p&gt;</description></item><item><title>Instalando Pillow</title><link>https://cassiobotaro.dev/posts/instalando-pillow/</link><pubDate>Fri, 14 Aug 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/instalando-pillow/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/ubuntu_pillow.jpg" alt="ubuntu-pillow" title="Travesseiro Ubuntu"&gt;&lt;/p&gt;
&lt;h2 id="problema"&gt;
 Problema
 &lt;a class="heading-link" href="#problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ao tentar instalar a biblioteca pillow, me deparei com o problema de não dar suporte a jpeg.&lt;/p&gt;
&lt;p&gt;O erro apresentado era: &amp;ldquo;decoder jpeg not available&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Como estou desenvolvendo uma aplicação que irá redimensionar imagens jpeg e png isto é um problema.&lt;/p&gt;
&lt;h2 id="solução"&gt;
 Solução
 &lt;a class="heading-link" href="#solu%c3%a7%c3%a3o"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Após algumas buscas no Stack Overflow cheguei ao seguintes passos que funcionaram pra mim.&lt;/p&gt;</description></item><item><title>Mito ou Verdade = Destrutor</title><link>https://cassiobotaro.dev/posts/mito-ou-verdade-destrutor/</link><pubDate>Sat, 25 Jul 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/mito-ou-verdade-destrutor/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/MythBusters-Logo.jpg" alt="mythbusters"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Linguagens de programação mais antigas traziam a capacidade de manipulação da memória. A competência de reservar um espaço de memória pra determinada operação e sua posterior liberação era do desenvolvedor.&lt;/p&gt;
&lt;p&gt;Python desde o seu início possui um mecanismo simples de alocação e desalocação, é o mecanismo de contador de referencia.&lt;/p&gt;
&lt;p&gt;Sempre que um novo objeto é referenciado(alguém passa apontar para aquele objeto), o contador é incrementado e quando deixa de apontar, este contador é decrementado. Chegando a 0 este contador aquele espaço de memória está livre.&lt;/p&gt;</description></item><item><title>Mais um passo com web2py</title><link>https://cassiobotaro.dev/posts/mais-um-passo-com-web2py/</link><pubDate>Tue, 07 Jul 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/mais-um-passo-com-web2py/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/web2py_logo.png" alt="Web2py Logo"&gt;&lt;/p&gt;
&lt;h2 id="recapitulando"&gt;
 Recapitulando
 &lt;a class="heading-link" href="#recapitulando"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;No &lt;a href="http://cassiobotaro.github.io/introducao-ao-web2py.html" class="external-link" target="_blank" rel="noopener"&gt;post&lt;/a&gt; anterior dei uma introdução sobre o que é o &lt;strong&gt;web2py&lt;/strong&gt; e iniciamos a construção de uma aplicação, porém não através de um &lt;em&gt;scaffolding&lt;/em&gt; (uma aplicação base).&lt;/p&gt;
&lt;p&gt;Escrevemos um &amp;ldquo;&lt;em&gt;hello world&lt;/em&gt;&amp;rdquo; personalizado onde o nome passado por argumento era retornado no corpo do retorno da nossa aplicação.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/print_screen_hello.png" alt="print"&gt;&lt;/p&gt;
&lt;h2 id="o-próximo-passo"&gt;
 O próximo passo
 &lt;a class="heading-link" href="#o-pr%c3%b3ximo-passo"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ainda sem uma aplicação bem definida decidi abordar um pouco da criação de um modelo e sua aplicação.&lt;/p&gt;</description></item><item><title>Loop Infinito</title><link>https://cassiobotaro.dev/posts/loop-infinito/</link><pubDate>Sat, 27 Jun 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/loop-infinito/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/infinite_loop.png" alt="loop" title="Loop infinito"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Vamos começar analisando o seguinte código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exemplo&lt;/span&gt;(object):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super(Exemplo, self)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;interno &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__getitem__&lt;/span&gt;(self, chave, default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;interno&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(chave, default)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__setitem__&lt;/span&gt;(self, chave, valor):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;interno[chave] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; valor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Criando uma instância do exemplo e manipulando-a, as coisas parecem legais:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; instancia_exemplo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Exemplo&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; instancia_exemplo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;chave1&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;valor1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; instancia_exemplo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;chave2&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;valor2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; instancia_exemplo.get&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;chave1&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;valor1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Até que você decide mudar a notação para se recuperar um valor:&lt;/p&gt;</description></item><item><title>Mito ou Verdade = Importação</title><link>https://cassiobotaro.dev/posts/mito-ou-verdade-importacao/</link><pubDate>Thu, 11 Jun 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/mito-ou-verdade-importacao/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/MythBusters-Logo.jpg" alt="mythbusters"&gt;&lt;/p&gt;
&lt;h2 id="o-problema"&gt;
 O problema
 &lt;a class="heading-link" href="#o-problema"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Vamos supor que temos uma função em um determinado módulo que precisa de utilizar de recursos de outro módulo.&lt;/p&gt;
&lt;p&gt;Mas este outro modulo pode importar outros módulos que possivelmente não serão utilizados.&lt;/p&gt;
&lt;p&gt;Será que a solução é fazer as importações internamente nas funções para que o carregamento seja feito de forma preguiçosa?&lt;/p&gt;
&lt;p&gt;Esta economia de recursos é uma otimização?&lt;/p&gt;</description></item><item><title>Introdução ao web2py</title><link>https://cassiobotaro.dev/posts/introducao-ao-web2py/</link><pubDate>Mon, 04 May 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/introducao-ao-web2py/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/web2py_logo.png" alt="Web2py Logo"&gt;&lt;/p&gt;
&lt;h2 id="sobre-o-web2py"&gt;
 Sobre o web2py
 &lt;a class="heading-link" href="#sobre-o-web2py"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Framework full stack&lt;/em&gt; (ou seja assim como Python vem com baterias incluídas), para desenvolvimento rápido, seguro, portável e orientado a banco de dados(o que não o limita).&lt;/p&gt;
&lt;p&gt;O download pode ser feito através da página &lt;a href="http://www.web2py.com/download" class="external-link" target="_blank" rel="noopener"&gt;http://www.web2py.com/&lt;/a&gt; e quando este artigo foi escrito estava em sua versão 2.10.X.&lt;/p&gt;
&lt;p&gt;Embora possua versões para &lt;em&gt;Windows&lt;/em&gt; e &lt;em&gt;MAC&lt;/em&gt; eu recomendo sempre baixar a versão de código fonte.&lt;/p&gt;</description></item><item><title>Argumentos somente por palavra chave</title><link>https://cassiobotaro.dev/posts/argumentos-somente-por-palavra-chave/</link><pubDate>Sat, 28 Mar 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/argumentos-somente-por-palavra-chave/</guid><description>&lt;h2 id="por-que-falar-sobre-isto"&gt;
 Por que falar sobre isto?
 &lt;a class="heading-link" href="#por-que-falar-sobre-isto"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Python 3 ainda possui uma névoa sobre ele, e o movimento de resistência ainda é grande. Mas isto não quer dizer que desbravadores já não o estejam explorando. Já escrevi um &lt;a href="http://cassiobotaro.github.io/porque-python-3.html" class="external-link" target="_blank" rel="noopener"&gt;post&lt;/a&gt; sobre a nova versão da linguagem, porém ainda tem vários recursos que podem ser demonstrados. Um deles é a capacidade de aceitar somente palavras chaves como argumento. Eu até coloquei isto nos slides da Python Brasil 10, porém senti que ao apresentar faltou uma boa explicação.&lt;/p&gt;</description></item><item><title>Por que Python 3?</title><link>https://cassiobotaro.dev/posts/porque-python-3/</link><pubDate>Tue, 10 Mar 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/porque-python-3/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="um-pouco-de-história"&gt;
 Um pouco de história
 &lt;a class="heading-link" href="#um-pouco-de-hist%c3%b3ria"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;O Python 3.0 foi uma decisão tomada em 2008, e decidiu-se assim por causa da incompatibilidade de alguns novos recursos com a versão 2.0 .
É uma versão com novas baterias incluídas como &lt;code&gt;asyncio&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;enum&lt;/code&gt;, &lt;code&gt;statistics&lt;/code&gt;, &lt;code&gt;venv&lt;/code&gt;.
Uma longa correção da nomenclatura de alguns módulos foi feita seguindo mais o padrão pythonico (pep-8).
Outras mudanças foram a transformação do &lt;em&gt;print&lt;/em&gt; em uma função, o que trouxe novas possibilidades, a utilização de visão e iteradores ao invés de listas como retorno de alguns métodos, a unificação de &lt;em&gt;long&lt;/em&gt; e &lt;em&gt;int&lt;/em&gt;, e várias outras mudanças que serão apresentadas.&lt;/p&gt;</description></item><item><title>Hello Python!</title><link>https://cassiobotaro.dev/posts/hello-python/</link><pubDate>Sun, 01 Mar 2015 00:00:00 +0000</pubDate><guid>https://cassiobotaro.dev/posts/hello-python/</guid><description>&lt;p&gt;&lt;img src="https://cassiobotaro.dev/images/logopython2.png" alt="logo-python" title="Logo Python"&gt;&lt;/p&gt;
&lt;h2 id="faq"&gt;
 FAQ
 &lt;a class="heading-link" href="#faq"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Como algumas perguntas são recorrentes nas listas de discussões, nos grupos do &lt;em&gt;Facebook&lt;/em&gt; e outros meios de comunicação e nossa comunidade gosta de receber bem os iniciantes, listei aqui aquelas dúvidas que são constantes.&lt;/p&gt;
&lt;h2 id="python-roda-no-coloque-aqui-sua-plataforma-"&gt;
 Python roda no (coloque aqui sua plataforma) ?
 &lt;a class="heading-link" href="#python-roda-no-coloque-aqui-sua-plataforma-"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link para o cabeçalho"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;Link para o cabeçalho&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sim. Atualmente usuários &lt;em&gt;Linux&lt;/em&gt;, &lt;em&gt;Windows&lt;/em&gt;, MAC e de &lt;a href="https://www.python.org/download/other/" class="external-link" target="_blank" rel="noopener"&gt;outras plataformas&lt;/a&gt; podem programar nesta linguagem. O mesmo código pode ser rodado em diferentes plataformas, embora em &lt;em&gt;casos específicos&lt;/em&gt; onde utilizamos recursos especiais do sistema operacional não funcione.&lt;/p&gt;</description></item></channel></rss>