<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Vinicius Rocha</title>
		<link>https://f145068f.blog-an9.pages.dev/pt/</link>
		<description>Recent content on Vinicius Rocha</description>
		<generator>Hugo</generator>
		<language>pt-BR</language>
		
		
		
		
			<lastBuildDate>Thu, 23 Jul 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://f145068f.blog-an9.pages.dev/pt/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Guia rápido do Herdr</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/guia-rapido-do-herdr/</link>
				<pubDate>Thu, 23 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/guia-rapido-do-herdr/</guid>
				<description>&lt;p&gt;O &lt;a href=&#34;https://herdr.dev/&#34;&gt;Herdr&lt;/a&gt; é um multiplexador de terminal feito em torno de agentes de codificação. Eu &lt;a href=&#34;https://f145068f.blog-an9.pages.dev/pt/posts/herdr/&#34;&gt;escrevi sobre por que o uso&lt;/a&gt;; esta é a referência de atalhos que mantenho por perto enquanto aprendo seu fluxo de trabalho pelo teclado.&lt;/p&gt;&#xA;&lt;p&gt;O Herdr usa uma tecla de prefixo para não conflitar com os programas em execução dentro de seus painéis. O prefixo padrão é &lt;code&gt;Ctrl+b&lt;/code&gt;: pressione-o, solte-o e então pressione a tecla do comando. Neste post, escrevo essa sequência como &lt;code&gt;prefix+key&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Herdr</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/herdr/</link>
				<pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/herdr/</guid>
				<description>&lt;p&gt;Nas últimas semanas, venho usando o &lt;a href=&#34;https://herdr.dev/&#34;&gt;Herdr&lt;/a&gt; como meu multiplexador de terminal diário. Comecei a usá-lo porque gerenciar vários agentes de codificação em janelas de terminal diferentes estava ficando difícil: eu ficava alternando entre sessões o tempo todo para ver quais agentes estavam trabalhando, tinham terminado ou esperavam por mim. O Herdr reúne essas sessões em um só lugar.&lt;/p&gt;&#xA;&lt;p&gt;O Herdr foi feito pensando em agentes de codificação. Assim como o &lt;a href=&#34;https://f145068f.blog-an9.pages.dev/pt/posts/guia-rapido-do-tmux/&#34;&gt;tmux&lt;/a&gt;, ele organiza sessões de terminal em espaços de trabalho, abas e painéis, mantendo seus processos em execução quando eu me desconecto. O que o torna diferente é sua consciência dos agentes de codificação: ele mostra se cada agente está trabalhando, terminou, está ocioso ou esperando minha entrada.&lt;/p&gt;</description>
			</item>
			<item>
				<title>O que é um agente de IA?</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/o-que-e-um-agente-de-ia/</link>
				<pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/o-que-e-um-agente-de-ia/</guid>
				<description>&lt;p&gt;Um agente de IA é formado por duas partes essenciais: um loop de raciocínio e um conjunto de ferramentas.&lt;/p&gt;&#xA;&lt;p&gt;O loop de raciocínio é o processo de pensamento do agente. É o ciclo contínuo de observar o que está acontecendo, interpretar as informações disponíveis, planejar o próximo passo e agir conforme esse plano.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://f145068f.blog-an9.pages.dev/assets/posts/20260709/ai-agent-reasoning-loop.webp&#34; alt=&#34;Loop de raciocínio de um agente de IA: observar, interpretar, planejar e agir&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Preparando-se para o Azure AI Fundamentals</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/preparando-se-para-o-azure-ai-fundamentals/</link>
				<pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/preparando-se-para-o-azure-ai-fundamentals/</guid>
				<description>&lt;div class=&#34;tldr-callout&#34;&gt;&#xA;  &lt;span class=&#34;tldr-label&#34;&gt;TL;DR&lt;/span&gt;&#xA;  &lt;div class=&#34;tldr-content&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;passei no exame beta AI-901 e obtive a credencial Microsoft Certified: Azure AI Fundamentals&lt;/li&gt;&#xA;&lt;li&gt;usei o Microsoft Learn e exercícios práticos em Python como meus principais recursos de preparação&lt;/li&gt;&#xA;&lt;li&gt;foquei no esboço de habilidades do AI-901, Microsoft Foundry, serviços de IA do Azure, exemplos em Python e IA responsável, em vez de memorização&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Recentemente obtive a certificação Azure AI Fundamentals ao passar no exame beta AI-901, e queria registrar os recursos de estudo e a abordagem que me ajudaram a passar. Como o AI-901 está substituindo o AI-900, este post foca nos objetivos mais recentes do exame e no caminho de aprendizado centrado no Microsoft Foundry.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Engenharia de harness</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/engenharia-de-harness/</link>
				<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/engenharia-de-harness/</guid>
				<description>&lt;h2 id=&#34;o-que-é&#34;&gt;O que é?&lt;/h2&gt;&#xA;&lt;p&gt;A engenharia de harness de agentes de IA é a prática de construir a infraestrutura essencial que cerca, controla e sustenta sistemas de IA autônomos.&lt;/p&gt;&#xA;&lt;p&gt;Pense em um agente de IA como um motor de carro de corrida potente e veloz; o &amp;ldquo;harness&amp;rdquo; é o chassi, o volante, os freios e o painel de diagnóstico que o tornam realmente dirigível e seguro. Em termos práticos, isso significa que agentes de IA precisam dos ambientes necessários para gerenciamento de memória, integração com ferramentas externas (como conectar-se a APIs ou bancos de dados), salvaguardas de segurança rígidas e monitoramento de desempenho em tempo real. Em última análise, trata-se de construir uma estrutura confiável e supervisionada que permita a esses modelos inteligentes executar tarefas complexas no mundo real sem sair dos trilhos.&lt;/p&gt;</description>
			</item>
			<item>
				<title>O Zen do Python</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/o-zen-do-python/</link>
				<pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/o-zen-do-python/</guid>
				<description>&lt;h2 id=&#34;o-easter-egg&#34;&gt;O Easter Egg&lt;/h2&gt;&#xA;&lt;p&gt;Execute &lt;code&gt;import this&lt;/code&gt; em qualquer interpretador Python e você recebe 19 aforismos escritos por Tim Peters em 1999, embutidos na linguagem como um Easter egg:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Python 3.14.5 (tags/v3.14.5:5607950, May 10 2026, 10:43:50)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type &amp;#34;help&amp;#34;, &amp;#34;copyright&amp;#34;, &amp;#34;credits&amp;#34; or &amp;#34;license&amp;#34; for more information.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;&amp;gt;&amp;gt; import this&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The Zen of Python, by Tim Peters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Beautiful is better than ugly.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Explicit is better than implicit.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Simple is better than complex.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Complex is better than complicated.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Flat is better than nested.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sparse is better than dense.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Readability counts.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Special cases aren&amp;#39;t special enough to break the rules.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Although practicality beats purity.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Errors should never pass silently.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Unless explicitly silenced.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;In the face of ambiguity, refuse the temptation to guess.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;There should be one-- and preferably only one --obvious way to do it.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Although that way may not be obvious at first unless you&amp;#39;re Dutch.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Now is better than never.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Although never is often better than *right* now.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;If the implementation is hard to explain, it&amp;#39;s a bad idea.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;If the implementation is easy to explain, it may be a good idea.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Namespaces are one honking great idea -- let&amp;#39;s do more of those!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;por-trás-do-poema&#34;&gt;Por trás do poema&lt;/h2&gt;&#xA;&lt;p&gt;O poema é anterior ao PEP 20; ele circulou na lista de discussão &lt;code&gt;comp.lang.python&lt;/code&gt; anos antes de Guido van Rossum formalizá-lo. O &lt;a href=&#34;https://github.com/python/cpython/blob/main/Lib/this.py&#34;&gt;código-fonte do módulo &lt;code&gt;this&lt;/code&gt;&lt;/a&gt; é, por si só, uma piscadela: o poema é armazenado como uma string codificada em ROT-13 e decodificado no momento do import.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Spinel: o compilador nativo de Ruby do Matz</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/spinel-o-compilador-nativo-de-ruby-do-matz/</link>
				<pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/spinel-o-compilador-nativo-de-ruby-do-matz/</guid>
				<description>&lt;p&gt;Yukihiro &amp;ldquo;Matz&amp;rdquo; Matsumoto, o criador do Ruby, está trabalhando no &lt;a href=&#34;https://github.com/matz/spinel&#34;&gt;Spinel&lt;/a&gt; — um compilador ahead-of-time (AOT) que transforma código-fonte Ruby em executáveis nativos independentes. Ele o apresentou na &lt;a href=&#34;https://rubykaigi.org/2026/&#34;&gt;RubyKaigi 2026&lt;/a&gt; com uma demonstração ao vivo, e os resultados são impressionantes: &lt;strong&gt;11,6x mais rápido&lt;/strong&gt; que o miniruby nos benchmarks, com cargas de trabalho intensivas em computação alcançando ganhos de 24–87x.&lt;/p&gt;&#xA;&lt;h2 id=&#34;como-funciona&#34;&gt;Como funciona&lt;/h2&gt;&#xA;&lt;p&gt;O pipeline de compilação do Spinel tem três estágios:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Depurando o TurboTax com o Claude Code</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/depurando-o-turbotax-com-o-claude-code/</link>
				<pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/depurando-o-turbotax-com-o-claude-code/</guid>
				<description>&lt;div class=&#34;tldr-callout&#34;&gt;&#xA;  &lt;span class=&#34;tldr-label&#34;&gt;TL;DR&lt;/span&gt;&#xA;  &lt;div class=&#34;tldr-content&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;O Claude Code consegue analisar arquivos HAR — exportações de tráfego de rede do navegador — para depurar problemas do mundo real rapidamente.&lt;/li&gt;&#xA;&lt;li&gt;O TurboTax estava detectando o fuso horário do meu navegador e inferindo que eu estava no Canadá, redirecionando-me para a página de login canadense.&lt;/li&gt;&#xA;&lt;li&gt;Um único prompt foi suficiente para identificar a causa raiz e obter passos acionáveis para corrigi-la.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;o-claude-code-como-ferramenta-diária&#34;&gt;O Claude Code como ferramenta diária&lt;/h2&gt;&#xA;&lt;p&gt;O &lt;a href=&#34;https://claude.ai/code&#34;&gt;Claude Code&lt;/a&gt; pode ser um companheiro poderoso para tarefas do dia a dia, especialmente as que envolvem grandes quantidades de dados para analisar. Eu o uso todos os dias como parte do meu trabalho, e venho encontrando mais formas de trazê-lo para minha vida diária além do trabalho.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Notas sobre: Ruby é a melhor linguagem para construir apps de IA</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/notas-sobre-ruby-e-a-melhor-linguagem-para-construir-apps-de-ia/</link>
				<pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/notas-sobre-ruby-e-a-melhor-linguagem-para-construir-apps-de-ia/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://paolino.me/ruby-is-the-best-language-for-ai-apps/&#34;&gt;Carmine Paolino&lt;/a&gt; defende de forma convincente que o Ruby é a melhor linguagem para construir aplicações de IA em 2026 — não por causa do treinamento de ML (esse é o território do Python), mas porque o desenvolvimento moderno de IA é apenas chamadas HTTP, e tudo ao redor disso é engenharia web.&lt;/p&gt;&#xA;&lt;p&gt;O argumento central: a integração com um LLM é uma chamada HTTP. O que importa é tudo ao redor dela — streaming de respostas, persistência de conversas, rastreamento de custos, troca de providers. É aí que o Rails brilha.&lt;/p&gt;</description>
			</item>
			<item>
				<title>I/O com e sem buffer no Unix</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/io-com-e-sem-buffer-no-unix/</link>
				<pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/io-com-e-sem-buffer-no-unix/</guid>
				<description>&lt;div class=&#34;tldr-callout&#34;&gt;&#xA;  &lt;span class=&#34;tldr-label&#34;&gt;TL;DR&lt;/span&gt;&#xA;  &lt;div class=&#34;tldr-content&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;I/O com buffer agrupa dados em buffers no espaço do usuário (ou da biblioteca) e realiza menos chamadas de sistema, porém maiores. Ótimo para throughput.&lt;/li&gt;&#xA;&lt;li&gt;I/O sem buffer envia dados diretamente (ou de forma mais direta) ao kernel/dispositivo, oferecendo menor latência e timing mais previsível — a um custo de throughput para muitas operações pequenas.&lt;/li&gt;&#xA;&lt;li&gt;Use I/O com buffer para processamento normal de arquivos e tarefas de alto throughput. Use I/O sem buffer ou síncrono quando precisar de visibilidade imediata, determinismo ou durabilidade estrita.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;o-que-com-buffer-e-sem-buffer-significam&#34;&gt;O que &amp;lsquo;com buffer&amp;rsquo; e &amp;lsquo;sem buffer&amp;rsquo; significam&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I/O com buffer: o runtime (por exemplo, o &lt;code&gt;FILE*&lt;/code&gt; da biblioteca padrão do C) mantém um buffer intermediário e só chama &lt;code&gt;read()&lt;/code&gt;/&lt;code&gt;write()&lt;/code&gt; quando o buffer está cheio, vazio ou é esvaziado. Isso reduz o número de chamadas de sistema e geralmente melhora o throughput.&lt;/li&gt;&#xA;&lt;li&gt;I/O sem buffer: suas operações são passadas ao kernel (ou dispositivo) com o mínimo de agregação no espaço do usuário. Exemplos: chamar &lt;code&gt;read()&lt;/code&gt;/&lt;code&gt;write()&lt;/code&gt; do POSIX repetidamente com tamanhos pequenos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;duas-camadas-de-buffer-no-unix&#34;&gt;Duas camadas de buffer no Unix&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Buffer no espaço do usuário (stdio, runtime da linguagem) — o que a maioria das pessoas quer dizer com &amp;ldquo;I/O com buffer&amp;rdquo; no nível da aplicação.&lt;/li&gt;&#xA;&lt;li&gt;Page cache do kernel — mesmo depois que &lt;code&gt;write()&lt;/code&gt; retorna, o kernel frequentemente mantém o conteúdo na RAM (o page cache) até gravá-lo no disco. Para tornar os dados duráveis em armazenamento estável, você precisa de &lt;code&gt;fsync()&lt;/code&gt;/&lt;code&gt;fdatasync()&lt;/code&gt; ou das semânticas &lt;code&gt;O_SYNC&lt;/code&gt;/&lt;code&gt;O_DSYNC&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Entender as duas camadas importa: você pode fazer &lt;code&gt;fflush()&lt;/code&gt; (espaço do usuário) e ainda precisar de &lt;code&gt;fsync()&lt;/code&gt; (kernel/disco) se exigir persistência.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Valores de tempo Unix (o epoch)</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/valores-de-tempo-unix-o-epoch/</link>
				<pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/valores-de-tempo-unix-o-epoch/</guid>
				<description>&lt;p&gt;O tempo Unix (muitas vezes chamado de &amp;ldquo;o epoch&amp;rdquo;) é uma forma simples de representar um ponto no tempo: o número de segundos decorridos desde 1970-01-01 00:00:00 UTC, sem contar os segundos bissextos. É compacto, independente de linguagem e fácil de comparar e ordenar.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/bug.png&#34; alt=&#34;xkcd 376: Bug&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Quadrinho: &lt;a href=&#34;https://xkcd.com/376/&#34;&gt;xkcd #376&lt;/a&gt; — usado sob a &lt;a href=&#34;https://creativecommons.org/licenses/by-nc/2.5/&#34;&gt;Licença Creative Commons Atribuição-NãoComercial 2.5&lt;/a&gt;. Crédito: Randall Munroe / xkcd.&lt;/em&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Guia rápido do tmux</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/guia-rapido-do-tmux/</link>
				<pubDate>Wed, 05 Jun 2024 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/guia-rapido-do-tmux/</guid>
				<description>&lt;p&gt;Este é um documento vivo que pretendo manter conforme me familiarizo mais com o tmux.&lt;/p&gt;&#xA;&lt;h2 id=&#34;atalhos-de-teclado&#34;&gt;Atalhos de teclado&lt;/h2&gt;&#xA;&lt;p&gt;Todos os atalhos devem ser prefixados com uma tecla de prefixo, &lt;code&gt;C-b&lt;/code&gt; (CTRL+b) por padrão, seguida de uma tecla de comando.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Categoria&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Atalho&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Descrição&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Window&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;c&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Criar uma nova janela&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Window&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;,&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Renomear a janela&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Window&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Escolher a janela em uma lista&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Window&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt; a &lt;code&gt;9&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir da janela 0 à 9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Window&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para a próxima janela&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;%&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dividir em dois painéis, à esquerda e à direita&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;&amp;quot;&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dividir em dois painéis, em cima e embaixo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;Left&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para o painel à esquerda&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;Right&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para o painel à direita&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;Down&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para o painel de baixo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;Up&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para o painel de cima&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ir para o próximo painel&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Fechar/matar o painel atual&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Exibir brevemente os índices dos painéis.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;System&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Listar todos os atalhos&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;System&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Desanexar (detach)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;System&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;:&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Entrar no prompt de comando do tmux&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;recursos&#34;&gt;Recursos&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;man 1 tmux&lt;/code&gt; (&lt;a href=&#34;https://man.openbsd.org/OpenBSD-current/man1/tmux.1&#34;&gt;versão web&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tmux/tmux/wiki&#34;&gt;GitHub.com/tmux/tmux&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;[vídeo] &lt;a href=&#34;https://www.youtube.com/watch?v=niuOc02Rvrc&#34;&gt;Tmux will SKYROCKET your productivity - here&amp;rsquo;s how&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;[vídeo] &lt;a href=&#34;https://www.youtube.com/watch?v=DzNmUNvnB04&#34;&gt;Tmux has forever changed the way I write code.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Instalando o Ruby com chruby e ruby-install</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/instalando-o-ruby-com-chruby-e-ruby-install/</link>
				<pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/instalando-o-ruby-com-chruby-e-ruby-install/</guid>
				<description>&lt;p&gt;Todo desenvolvedor Ruby provavelmente usará um gerenciador de versões do Ruby. Os mais populares são: &lt;a href=&#34;https://rvm.io&#34;&gt;RVM&lt;/a&gt;, &lt;a href=&#34;https://github.com/rbenv/rbenv&#34;&gt;rbenv&lt;/a&gt; e &lt;a href=&#34;https://github.com/postmodern/chruby&#34;&gt;chruby&lt;/a&gt;. Use o que te deixar feliz. Eu fui de &lt;code&gt;chruby&lt;/code&gt; e estou feliz com ele.&lt;/p&gt;&#xA;&lt;h2 id=&#34;o-que-é-o-chruby&#34;&gt;O que é o chruby&lt;/h2&gt;&#xA;&lt;p&gt;O &lt;code&gt;chruby&lt;/code&gt; é uma ferramenta de linha de comando que permite alternar entre diferentes versões do Ruby. Ela permite que você mude entre elas manualmente, ou pode mudar a versão para você automaticamente conforme você navega entre as pastas de projeto.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Configurando o Rails com chruby e ruby-install</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/configurando-o-rails-com-chruby-e-ruby-install/</link>
				<pubDate>Wed, 15 Dec 2021 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/configurando-o-rails-com-chruby-e-ruby-install/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Veja a versão atualizada deste post: &lt;a href=&#34;https://f145068f.blog-an9.pages.dev/pt/posts/instalando-o-ruby-com-chruby-e-ruby-install/&#34;&gt;Instalando o Ruby com chruby e ruby-install&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Aqui estão os passos para instalar e configurar o Ruby e o Ruby on Rails no macOS usando &lt;a href=&#34;https://github.com/postmodern/chruby&#34;&gt;chruby&lt;/a&gt; e &lt;a href=&#34;https://github.com/postmodern/ruby-install&#34;&gt;ruby-install&lt;/a&gt;. Ambas são ferramentas muito leves, escritas por &lt;a href=&#34;https://postmodern.github.io/&#34;&gt;Hal Brodigan&lt;/a&gt;. Uma abordagem semelhante também pode ser usada no Linux ou no Windows/WSL.&lt;/p&gt;&#xA;&lt;h2 id=&#34;configuração&#34;&gt;Configuração&lt;/h2&gt;&#xA;&lt;p&gt;Vamos começar instalando o &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt;. Siga as instruções oficiais de instalação no site deles.&lt;/p&gt;</description>
			</item>
			<item>
				<title>O Z shell</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/o-z-shell/</link>
				<pubDate>Tue, 03 Aug 2021 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/o-z-shell/</guid>
				<description>&lt;h2 id=&#34;o-que-é&#34;&gt;O que é&lt;/h2&gt;&#xA;&lt;p&gt;O &lt;a href=&#34;https://en.wikipedia.org/wiki/Shell_%28computing%29&#34;&gt;shell&lt;/a&gt; é o que fica entre o usuário e o núcleo do sistema operacional, geralmente na forma de uma interface de linha de comando (CLI). O shell mais popular nas distribuições Linux é o &lt;a href=&#34;https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29&#34;&gt;bash&lt;/a&gt;. Em 2019, a Apple começou a lançar o MacOS com o &lt;a href=&#34;https://en.wikipedia.org/wiki/Z_shell&#34;&gt;Zsh (Z shell)&lt;/a&gt; por padrão. Acredito que essa seja uma das razões que tornaram o zsh tão popular.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Adicionando um arquivo de configuração JSON a uma aplicação de console .NET Core</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/adicionando-um-arquivo-de-configuracao-json-a-uma-aplicacao-de-console-net-core/</link>
				<pubDate>Tue, 02 Mar 2021 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/adicionando-um-arquivo-de-configuracao-json-a-uma-aplicacao-de-console-net-core/</guid>
				<description>&lt;p&gt;Uma aplicação .NET Core pode lidar com configuração usando diferentes formatos (providers) como memória, linha de comando e variáveis de ambiente. Aqui, usaremos um provider de arquivo, mais especificamente um &lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.configuration.json.jsonconfigurationprovider&#34;&gt;JsonConfigurationProvider&lt;/a&gt;. &lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/core/extensions/configuration-providers&#34;&gt;Clique neste link&lt;/a&gt; para saber mais sobre os diferentes tipos de providers de configuração.&lt;/p&gt;&#xA;&lt;h2 id=&#34;configuração-do-projeto&#34;&gt;Configuração do projeto&lt;/h2&gt;&#xA;&lt;p&gt;Vamos começar criando uma aplicação de console e adicionando o &lt;a href=&#34;https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/&#34;&gt;pacote NuGet&lt;/a&gt; do provider. No nosso caso, será um provider JSON.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Tratando eventos de diálogo de janelas WPF da forma elegante</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/tratando-eventos-de-dialogo-de-janelas-wpf-da-forma-elegante/</link>
				<pubDate>Fri, 26 Jul 2019 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/tratando-eventos-de-dialogo-de-janelas-wpf-da-forma-elegante/</guid>
				<description>&lt;p&gt;Aqui estão duas formas elegantes que você pode usar para tratar diálogos WPF a partir do ViewModel. Vou demonstrar os dois exemplos fechando um diálogo de janela WPF a partir do ViewModel, dependendo de alguma lógica.&lt;/p&gt;&#xA;&lt;h2 id=&#34;usando-eventos&#34;&gt;Usando eventos&lt;/h2&gt;&#xA;&lt;p&gt;A primeira solução é usar um evento que notifica o diálogo da janela para fechar. Considere o seguinte exemplo:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cs&#34; data-lang=&#34;cs&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;DialogViewModel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;event&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EventHandler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Saved&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DialogViewModel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;SaveCommand&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DelegateCommand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OnSave&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ICommand&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SaveCommand&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;//&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// SOME LOGIC TO SAVE GOES HERE&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;//&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Saved&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Invoke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EventArgs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A janela de diálogo pode escutar esse evento e se fechar de acordo.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Validação condicional no ASP.NET</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/validacao-condicional-no-asp-net/</link>
				<pubDate>Wed, 20 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/validacao-condicional-no-asp-net/</guid>
				<description>&lt;p&gt;A validação condicional pode ser muito útil, e fico feliz por ter encontrado uma forma elegante de fazê-la. Você pode usar o mesmo View-Model em duas actions diferentes do seu controller e ter validações distintas para cada uma delas.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cenário-de-exemplo&#34;&gt;Cenário de exemplo&lt;/h2&gt;&#xA;&lt;p&gt;Para ajudar a ilustrar o problema e a solução, vamos descrever um cenário simples de gerenciamento de usuários. Teremos um controller que adiciona e edita usuários. Vou abstrair a camada de negócio para que possamos focar apenas na validação de usuário.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Testes de unidade para mapeamentos do NHibernate</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/posts/testes-de-unidade-para-mapeamentos-do-nhibernate/</link>
				<pubDate>Wed, 21 Jun 2017 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/posts/testes-de-unidade-para-mapeamentos-do-nhibernate/</guid>
				<description>&lt;p&gt;Qual é a melhor abordagem para mapear suas classes de domínio para o banco de dados usando NHibernate? Depois de fazer alguns testes, acredito que a melhor resposta é: não importa. Desde que você tenha testes de unidade para isso, você está coberto.&lt;/p&gt;&#xA;&lt;p&gt;O mesmo problema de mapeamento que você enfrentará usando &lt;a href=&#34;http://nhibernate.info/doc/nhibernate-reference/mapping.html&#34;&gt;arquivos HBM&lt;/a&gt;, você encontrará usando &lt;a href=&#34;http://www.fluentnhibernate.org/&#34;&gt;FHN&lt;/a&gt; ou &lt;a href=&#34;http://notherdev.blogspot.ca/2012/02/nhibernates-mapping-by-code-summary.html&#34;&gt;Mapping By Code&lt;/a&gt;. Por causa disso, fiz alguns experimentos sobre qual seria uma boa abordagem para testar mapeamentos do NHibernate com testes de unidade.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Arquivos</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/archives/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/archives/</guid>
				<description></description>
			</item>
			<item>
				<title>Citações</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/quotes/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/quotes/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Simplicity is prerequisite for reliability.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;— Edsger W. Dijkstra&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Make it work, make it right, make it fast.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;— Kent Beck&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Talk is cheap. Show me the code.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;— Linus Torvalds&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Premature optimization is the root of all evil.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;— Donald Knuth&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;The best way to predict the future is to invent it.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;— Alan Kay&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Good code is its own best documentation.&amp;rdquo;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Sobre</title>
				<link>https://f145068f.blog-an9.pages.dev/pt/about/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://f145068f.blog-an9.pages.dev/pt/about/</guid>
				<description>&lt;p&gt;Olá, eu sou Vinicius Rocha, desenvolvedor de software.&lt;/p&gt;&#xA;&lt;p&gt;Escrevo código há mais de 20 anos. Comecei nos primeiros tempos do .NET, passei muito tempo em sistemas backend e ainda gosto das partes da programação que deixam o trabalho do dia a dia mais suave: ferramentas de shell, editores, infraestrutura, depuração e pequenas melhorias de fluxo de trabalho.&lt;/p&gt;&#xA;&lt;p&gt;Este blog são minhas anotações tornadas públicas. A maioria dos posts começa como algo que precisei descobrir por conta própria: um comando que vivo esquecendo, uma ferramenta que testei, um bug que persegui ou uma ideia que queria explicar com clareza suficiente para que o meu eu do futuro pudesse encontrá-la novamente.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
