<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog do Kauê</title><description>ssss</description><link>https://kauefraga.dev/</link><item><title>Criando um projeto simples com react router</title><link>https://kauefraga.dev/blog/criando-um-projeto-simples-com-react-router/</link><guid isPermaLink="true">https://kauefraga.dev/blog/criando-um-projeto-simples-com-react-router/</guid><pubDate>Sat, 05 Apr 2025 16:15:34 GMT</pubDate><content:encoded>&lt;p&gt;Olá! Como vai?&lt;/p&gt;
&lt;p&gt;Já pensou em criar um projeto com algumas telas e operações no local storage usando o react das massas mas se viu perdido procurando a melhor forma de criar o projeto, instalar as dependências e configurá-las? Sim?&lt;/p&gt;
&lt;p&gt;Eu também! São inúmeras opções mesmo com certas tecnologias já definidas... usando Bun ou não? &lt;code&gt;create-vite&lt;/code&gt;? Next.js? &lt;code&gt;create-react-router&lt;/code&gt;? Zustand ou redux? TailwindCSS com postcss ou a própria CLI? Shadcn UI, Radix UI, Daisy UI...? 😵‍💫&lt;/p&gt;
&lt;p&gt;Nesse final de semana estou construindo &lt;a href=&quot;https://github.com/kauefraga/player-leveling&quot;&gt;um site com o treino do Sung Jinwoo de Solo Leveling&lt;/a&gt; (adoro o anime inclusive) e estava perdido nessas opções que mencionei para começar e terminar o projeto.&lt;/p&gt;
&lt;p&gt;Este guia vai te ajudar quanto configuração das tecnologias que eu escolhi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript e Bun&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;React Router Declarativo&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;li&gt;Eslint&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pensando nestes pontos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Projeto relativamente pequeno&lt;/li&gt;
&lt;li&gt;Sem necessidade de server-side rendering&lt;/li&gt;
&lt;li&gt;Estilização fácil e, de preferência, já pronta&lt;/li&gt;
&lt;li&gt;Single-page application&lt;/li&gt;
&lt;li&gt;Dados no local storage ou search params&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Base do projeto&lt;/h2&gt;
&lt;p&gt;Começaremos com o projeto React, vamos criá-lo usando Bun e a ferramenta Vite com o seguinte comando:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun create vite projeto-simples --template react-ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adicionaremos o &lt;a href=&quot;https://reactrouter.com/start/declarative/installation&quot;&gt;React Router&lt;/a&gt; para fazer o roteamento das &quot;páginas&quot; no lado do cliente.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun add react-router
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para finalizar esta parte precisamos configurar o modo declarativo do React Router com 3 linhas de código, no arquivo &lt;code&gt;src/main.tsx&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { BrowserRouter } from &apos;react-router&apos;;

createRoot(document.getElementById(&apos;root&apos;)!).render(
  &amp;lt;StrictMode&amp;gt;
    &amp;lt;BrowserRouter&amp;gt;
      &amp;lt;App /&amp;gt;
    &amp;lt;/BrowserRouter&amp;gt;
  &amp;lt;/StrictMode&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O diff atualmente fica assim.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { StrictMode } from &apos;react&apos;;
import { createRoot } from &apos;react-dom/client&apos;;
import &apos;./index.css&apos;;
import App from &apos;./App.tsx&apos;;
+ import { BrowserRouter } from &apos;react-router&apos;;

createRoot(document.getElementById(&apos;root&apos;)!).render(
  &amp;lt;StrictMode&amp;gt;
+    &amp;lt;BrowserRouter&amp;gt;
      &amp;lt;App /&amp;gt;
+    &amp;lt;/BrowserRouter&amp;gt;
  &amp;lt;/StrictMode&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Estilos&lt;/h2&gt;
&lt;p&gt;Agora, seguindo o &lt;a href=&quot;https://tailwindcss.com/docs/installation/using-vite&quot;&gt;guia do TailwindCSS&lt;/a&gt;, vamos colocá-lo para usarmos as classes utilitárias.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun add tailwindcss @tailwindcss/vite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No arquivo &lt;code&gt;vite.config.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &apos;vite&apos;;
import react from &apos;@vitejs/plugin-react&apos;;
import tailwindcss from &apos;@tailwindcss/vite&apos;;

export default defineConfig({
  plugins: [
    // ...outros plugins
    react(),
    tailwindcss(),
  ],
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No arquivo &lt;code&gt;src/index.css&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@import &quot;tailwindcss&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Em uma postagem futura vou abordar formas de implementar temas, porém existem duas páginas importantes desse &lt;strong&gt;tema&lt;/strong&gt; (ba-dum-tss): &lt;a href=&quot;https://tailwindcss.com/docs/dark-mode&quot;&gt;dark-mode&lt;/a&gt; e &lt;a href=&quot;https://tailwindcss.com/docs/theme&quot;&gt;themes variables&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Local storage hook&lt;/h2&gt;
&lt;p&gt;Também vamos adicionar o hook para acessar e manipular o localStorage. No arquivo &lt;code&gt;src/hooks/use-local-storage.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { useState } from &apos;react&apos;;

export function useLocalStorage&amp;lt;T extends string | boolean | number | object&amp;gt;(
  key: string,
  initialValue: T
): [T, (value: T) =&amp;gt; void] {
  const storedValue = localStorage.getItem(key);
  const parsedStoredValue = storedValue ? (JSON.parse(storedValue) as T) : initialValue;

  const [value, setInternalValue] = useState(parsedStoredValue);

  const setValue = (v: T) =&amp;gt; {
    localStorage.setItem(key, JSON.stringify(v));
    setInternalValue(v);
  };

  return [value, setValue];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Explicando o que este hook faz na &lt;strong&gt;assinatura&lt;/strong&gt; e no &lt;strong&gt;bloco&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pega um tipo genérico T para melhorar o autocomplete e ter uma API com type-safety (obs.: não precisa ser definido explicitamente porque pode ser inferido pelo parâmetro &lt;code&gt;initialValue&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Pega os parâmetros &lt;code&gt;key&lt;/code&gt; (chave do que queremos buscar no local storage) e &lt;code&gt;initialValue&lt;/code&gt; (valor inicial caso não exista um atrelado à chave)&lt;/li&gt;
&lt;li&gt;No bloco da função, pega o valor armazenado no local storage usando o método &lt;code&gt;getItem(key)&lt;/code&gt; e depois, caso exista um valor (string), faz o parsing dele com &lt;code&gt;JSON.parse&lt;/code&gt; e aceita que ele é do tipo T (&lt;code&gt;as T&lt;/code&gt;), do contrário usa o &lt;code&gt;initialValue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Usa o hook useState do React para criar um estado reativo do tipo T a partir do valor guardado&lt;/li&gt;
&lt;li&gt;Cria uma função para atualizar o item do local storage e o estado reativo&lt;/li&gt;
&lt;li&gt;Retorna um array com o estado reativo na primeira posição e a função para altera-lo na segunda&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Linting e formatação&lt;/h2&gt;
&lt;p&gt;Depois de horas lendo sobre ferramentas conhecidas (eslint, prettier, biome) e convenções, decidi usar o eslint como linter e formatter já que ele é capaz e maduro (soluções e integrações com editores).&lt;/p&gt;
&lt;p&gt;Para isso precisei instalar o &lt;a href=&quot;https://typescript-eslint.io/&quot;&gt;typescript-eslint&lt;/a&gt; e o &lt;a href=&quot;https://eslint.style/&quot;&gt;@stylistic/eslint-plugin&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun add -D typescript-eslint @stylistic/eslint-plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E a configuração &lt;code&gt;eslint.config.js&lt;/code&gt; ficou assim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import stylistic from &apos;@stylistic/eslint-plugin&apos;;
import reactHooks from &apos;eslint-plugin-react-hooks&apos;;
import reactRefresh from &apos;eslint-plugin-react-refresh&apos;;
import globals from &apos;globals&apos;;
import tseslint from &apos;typescript-eslint&apos;;

// Cria configuração do eslint
export default tseslint.config(
  tseslint.configs.strictTypeChecked, // estende as configurações estritas com checagem de tipos do typescript-eslint
  stylistic.configs.recommended, // estende as configurações recomendadas do stylistic
  stylistic.configs.customize({ semi: true }), // customiza a configuração `semi` (ponto e vírgula)
  {
    // configuração que vem do create-vite
    ignores: [&apos;dist&apos;],
    files: [&apos;**/*.{ts,tsx}&apos;],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
      parserOptions: {
        project: [&apos;./tsconfig.node.json&apos;, &apos;./tsconfig.app.json&apos;],
        projectService: true, // https://typescript-eslint.io/getting-started/typed-linting
        tsconfigRootDir: import.meta.dirname,
      },
    },
    plugins: {
      &apos;@stylistic&apos;: stylistic, // adiciona o plugin stylistic
      &apos;react-hooks&apos;: reactHooks,
      &apos;react-refresh&apos;: reactRefresh,
    },
    rules: {
      ...reactHooks.configs.recommended.rules,
      &apos;react-refresh/only-export-components&apos;: [
        &apos;warn&apos;,
        { allowConstantExport: true },
      ],
    },
  }
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Resumindo, com esse setup você deve conseguir criar pequenos projetos ou protótipos facilmente implantáveis e que não requerem um back end dedicado com API e banco dados para funcionar 100%.&lt;/p&gt;
&lt;p&gt;Escrevi esse artigo justamente porque adoro construir projetos úteis e que não fogem desse escopo, o problema é que sempre que começo um novo projeto preciso pesquisar novamente alguns comandos, dependências e configurações.&lt;/p&gt;
&lt;p&gt;Inclusive, aqui estão os sites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://themis.kauefraga.dev/&quot;&gt;Themis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://constantia.kauefraga.dev/&quot;&gt;Constantia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://polvinho.vercel.app/&quot;&gt;Polvinho&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Muito obrigado por ter lido até aqui :green_heart:&lt;/p&gt;
&lt;p&gt;Estou disponível para contato no &lt;a href=&quot;https://x.com/rkauefraga&quot;&gt;Twitter/X&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/kauefraga.dev&quot;&gt;Bluesky&lt;/a&gt; e &lt;a href=&quot;https://linkedin.com/in/kauefraga&quot;&gt;LinkedIn&lt;/a&gt;. Até a próxima!&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Conhecendo o Node JS</title><link>https://kauefraga.dev/blog/conhecendo-o-node-js/</link><guid isPermaLink="true">https://kauefraga.dev/blog/conhecendo-o-node-js/</guid><pubDate>Sat, 26 Oct 2024 20:56:12 GMT</pubDate><content:encoded>&lt;p&gt;Neste final de semana eu decidi revisar um pouco sobre o JavaScript e o Node. Isso porque eu esbarrei na definição enquanto testava um &lt;a href=&quot;https://diciotech.netlify.app/&quot;&gt;projeto que apareceu no feed do meu GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Também planejo estudar alguns tópicos como o event loop e as promises mais profundamente, então uma revisão cai muito bem.&lt;/p&gt;
&lt;p&gt;Aqui vão minhas anotações.&lt;/p&gt;
&lt;h2&gt;O que é Node.js&lt;/h2&gt;
&lt;p&gt;É um ambiente (runtime) que permite a execução de JavaScript pelo lado do servidor. Com ele é possível criar aplicações que executam fora do navegador (aplicações back end, mobile, desktop...).&lt;/p&gt;
&lt;p&gt;Só pra relembrar, JavaScript é uma linguagem de programação interpretada e multiparadigma criada para adicionar interatividade nas páginas web, ou seja, ela foi desenvolvida com o intuito de ser usada no navegador.&lt;/p&gt;
&lt;p&gt;Foi o Node que trouxe essa possibilidade de executar JavaScript fora do navegador.&lt;/p&gt;
&lt;p&gt;Hoje em dia já existem outros ambientes de execução de JavaScript como Deno ou Bun, mas o Node foi o pioneiro, lançado em 2009.&lt;/p&gt;
&lt;p&gt;A capacidade de desenvolver tanto o front end quanto o back end de uma aplicação usando apenas uma linguagem de programação é fantástica. É uma das grandes vantagens do JavaScript, embora alguns profissionais questionem a utilização no lado do servidor.&lt;/p&gt;
&lt;p&gt;Pensando no lema &quot;Write once, run anywhere&quot; do Java, temos o nosso: &lt;strong&gt;learn once, run everywhere&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;O Node é baseado no &lt;a href=&quot;https://nodejs.org/en/learn/getting-started/the-v8-javascript-engine&quot;&gt;motor V8&lt;/a&gt;, que é o mesmo do Google Chrome, ele que lê e executa o código JavaScript no navegador. Uma característica importante é que um motor JavaScript é independente do navegador em que ele executa, essa característica foi o que permitiu a criação do Node e dos outros ambientes.&lt;/p&gt;
&lt;p&gt;Existem outros motores de JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://spidermonkey.dev/&quot;&gt;SpiderMonkey&lt;/a&gt;, usado pelo Firefox&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.webkit.org/Deep%20Dive/JSC/JavaScriptCore.html&quot;&gt;JavaScriptCore&lt;/a&gt;, utilizado pelo Safari e pelo Bun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/chakra-core/ChakraCore&quot;&gt;Chakra&lt;/a&gt;, era usado pelo Edge, que usa o motor &lt;a href=&quot;https://support.microsoft.com/en-us/help/4501095/download-the-new-microsoft-edge-based-on-chromium&quot;&gt;V8 atualmente&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eu disse anteriormente que o JavaScript é considerado uma linguagem interpretada, porém os motores possuem uma etapa de compilação just-in-time (JIT), levando-o a ser uma linguagem interpretada e compilada.&lt;/p&gt;
&lt;p&gt;Importante ressaltar que o Node não tem acesso as APIs de manipulação do DOM, &lt;code&gt;window&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;, etc. No lugar dessas ele tem sua biblioteca padrão que permite ter acesso ao sistema de arquivos, escutar requisições HTTP, gerar UUIDs, emitir eventos e tantas outras coisas.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ❌
const element = document.getElementById(&apos;js-in-server&apos;)
console.log(element.textContent)

// ✅
import fs from &apos;fs&apos;

fs.readFile(&apos;js-is-really-cool.md&apos;, &apos;utf-8&apos;, (err, content) =&amp;gt; {
  console.log(content)
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O Node vem equipado com o gerenciador de pacotes NPM (Node Package Manager) que serve para organizar, instalar e resolver as dependências de projetos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/&quot;&gt;NPM&lt;/a&gt; também é o registrador de pacotes padrão, é onde as bibliotecas e frameworks são registrados para serem utilizados posteriormente.&lt;/p&gt;
&lt;p&gt;Só para esclarecer, existe a ferramenta de gerenciamento de pacotes NPM e o registrador desses pacotes, que também se chama NPM. &lt;a href=&quot;https://docs.npmjs.com/about-npm&quot;&gt;Mais sobre aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alternativas à ferramenta são &lt;a href=&quot;https://yarnpkg.com/&quot;&gt;yarn&lt;/a&gt; e &lt;a href=&quot;https://pnpm.io/&quot;&gt;pnpm&lt;/a&gt;. O ambiente &lt;a href=&quot;https://bun.sh/docs/cli/install&quot;&gt;Bun também tem um gerenciador de pacotes&lt;/a&gt; compatível com o Node e que tem a proposta de ser o substituto mais rápido entre as opções que citei antes.&lt;/p&gt;
&lt;p&gt;Falando do registrador, esse ano surgiu uma espécie de alternativa moderna que diz ser feita para especialmente pensando em Typescript e ESM, o &lt;a href=&quot;https://jsr.io/&quot;&gt;JSR&lt;/a&gt;. Só a título de conhecimento, continuo usando e recomendo o NPM.&lt;/p&gt;
&lt;p&gt;Resumindo, se você está começando seus estudos de JavaScript e Node, &lt;strong&gt;use o Node e o NPM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Depois você decide se vai usar o yarn porque é mais bonitinho, o pnpm pois é mais rápido ou o Bun porque é o melhor (🔥).&lt;/p&gt;
&lt;h2&gt;Instalando o Node&lt;/h2&gt;
&lt;p&gt;Na instalação você pode seguir o &lt;a href=&quot;https://nodejs.org/en/download/prebuilt-installer&quot;&gt;tutorial do site&lt;/a&gt; mas eu recomendo usar um gerenciador de versões porque vai facilitar bastante caso você precise trocar de versão.&lt;/p&gt;
&lt;p&gt;Acredito que esses sejam os principais:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;nvm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Schniz/fnm&quot;&gt;fnm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://volta.sh/&quot;&gt;volta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tj/n&quot;&gt;n&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eu uso o &lt;a href=&quot;https://asdf-vm.com/guide/getting-started.html&quot;&gt;asdf&lt;/a&gt; junto com o &lt;a href=&quot;https://github.com/asdf-vm/asdf-nodejs&quot;&gt;plugin do node&lt;/a&gt;. O asdf é um gerenciador de versões genérico, com ele basta adicionar o plugin da ferramenta/runtime que você quer gerenciar e pronto.&lt;/p&gt;
&lt;p&gt;Prefiro não colocar nada aqui para que não fique desatualizado, minha dica é: use um gerenciador de versões. Abra a documentação dos que citei e leia.&lt;/p&gt;
&lt;h2&gt;Novas funcionalidades&lt;/h2&gt;
&lt;p&gt;Não são novas novas, mas são legais e não existem desde o começo. Perdão pelo bait...&lt;/p&gt;
&lt;p&gt;Tem um arquivo &lt;code&gt;.env&lt;/code&gt; e quer carregar os valores? &lt;a href=&quot;https://nodejs.org/en/learn/command-line/how-to-read-environment-variables-from-nodejs&quot;&gt;Carregamento de variáveis de ambiente&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Digamos que você tenha a váriavel SECRET_KEY=jsmelhorquejava

// $ node env.js
console.log(process.env.SECRET_KEY) // undefined

// $ node --env-file=.env env.js
console.log(process.env.SECRET_KEY) // jsmelhorquejava
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quer escrever testes sem ter que adicionar dependências como &lt;a href=&quot;https://jestjs.io/&quot;&gt;Jest&lt;/a&gt;, &lt;a href=&quot;https://mochajs.org/&quot;&gt;Mocha&lt;/a&gt; ou &lt;a href=&quot;https://vitest.dev/&quot;&gt;Vitest&lt;/a&gt;? O executor de testes nativo foi introduzido de &lt;a href=&quot;https://nodejs.org/docs/latest-v20.x/api/test.html&quot;&gt;forma estável na versão 20.x&lt;/a&gt; .&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import assert from &apos;assert&apos;
import { it, describe } from &apos;test&apos;

describe(&apos;user entity&apos;, () =&amp;gt; {
  it(&apos;should create user instance&apos;, () =&amp;gt; {
    // ...
  })
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quer executar TypeScript? Usa Bun! Brincadeiras à parte, é possível executar código &lt;code&gt;.ts&lt;/code&gt; usando Node, &lt;a href=&quot;https://nodejs.org/en/learn/typescript/run-natively&quot;&gt;ainda experimental&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Usando o Node V22.6.0 pra cima
node --experimental-strip-types tsisawesome.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por enquanto é isso, pretendo ir atualizando essa revisão pra cobrir mais alguns tópicos que vou revisar, além do que é event loop e sua importância.&lt;/p&gt;
&lt;p&gt;Um fato divertido é que eu desenvolvi meu primeiro servidor HTTP usando Node e foi com ele que descobri que gostava de desenvolvimento back end, um caminho sem volta.&lt;/p&gt;
&lt;p&gt;Obrigado por ler!&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Open source, learn in public e minha experiência</title><link>https://kauefraga.dev/blog/open-source-learn-in-public-e-minha-experiencia/</link><guid isPermaLink="true">https://kauefraga.dev/blog/open-source-learn-in-public-e-minha-experiencia/</guid><pubDate>Sun, 20 Oct 2024 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tudo certo? Quero começar a semana fomentando as iniciativas de projetos públicos e trazer um pouco da minha experiência construindo projetos open source.&lt;/p&gt;
&lt;p&gt;Vamos começar colocando os pingos nos is.&lt;/p&gt;
&lt;h2&gt;O que é &lt;em&gt;open source&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Open source significa &quot;código aberto&quot; e é uma corrente no mundo da tecnologia que busca a &lt;strong&gt;construção transparente&lt;/strong&gt; e &lt;strong&gt;colaborativa&lt;/strong&gt; de software. É possível ver o código fonte de um &lt;strong&gt;projeto open source&lt;/strong&gt;, entendê-lo, sugerir alterações ou fazê-las por conta própria, entre outras possibilidades.&lt;/p&gt;
&lt;p&gt;Alguns projetos open source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O conhecido kernel &lt;a href=&quot;https://github.com/torvalds/linux&quot;&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O sistema de versionamento de código mais utilizado, &lt;a href=&quot;https://github.com/git/git&quot;&gt;git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zen-browser&quot;&gt;Zen browser&lt;/a&gt;, um recente navegador baseado no Firefox&lt;/li&gt;
&lt;li&gt;A rede social &lt;a href=&quot;https://github.com/bluesky-social&quot;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O emulador de terminal que uso, &lt;a href=&quot;https://github.com/wez/wezterm&quot;&gt;WezTerm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E a lista segue. Quantas aplicações e ferramentas que você usa são open source?&lt;/p&gt;
&lt;p&gt;O GitHub é uma plataforma de hospedagem de software (código e afins) que é bastante usada pela comunidade open source porque&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa Git&lt;/li&gt;
&lt;li&gt;Tem ótimas ferramentas&lt;/li&gt;
&lt;li&gt;Tem várias funcionalidades que facilitam o trabalho colaborativo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Outro ponto importante, um projeto open source deve ter uma &lt;a href=&quot;https://choosealicense.com/&quot;&gt;licença&lt;/a&gt; que restrinja o acesso e as modificações do código para proteger os criadores, contribuidores e até mesmo os usuários.&lt;/p&gt;
&lt;h2&gt;O que é &lt;em&gt;learn in public&lt;/em&gt; e &lt;em&gt;build in public&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Learn in public, aprenda em público ou aprendizado público é a &lt;strong&gt;prática de compartilhar a sua jornada de aprendizado&lt;/strong&gt;. É ir na sua rede social favorita e postar isso&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Estou aprendendo x! O conceito y é bem simples mas o z me pegou, alguém pode me ajudar?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Não tenha vergonha! Você vai ter diferentes respostas, como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Que legal! Também estou aprendendo x, porém não entendi o conceito y ainda...&quot;&lt;/li&gt;
&lt;li&gt;&quot;Isso é fácil demais, como você não compreende?&quot;&lt;/li&gt;
&lt;li&gt;&quot;O artigo w me ajudou a entender z, dá uma olhada.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O importante é você saber extrair o melhor disso.&lt;/p&gt;
&lt;p&gt;Caso alguém se identifique e diga que não sabe algum tópico que você compreende (um pouco pelo menos), tente explicar da melhor forma que conseguir. &lt;strong&gt;Ensinar é uma das melhores formas de reforçar o conhecimento&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se a pessoa te oferece ajuda ou mentoria, aproveite, agradeça e pergunte.&lt;/p&gt;
&lt;p&gt;Se alguém for rude ou insensível, pergunte qual foi o erro ou simplesmente ignore/bloqueie.&lt;/p&gt;
&lt;p&gt;Não tenha medo de errar. Se você errar, vão te corrigir e você vai aprender também.&lt;/p&gt;
&lt;p&gt;Vale ressaltar que você não tem só sua rede social pra ser público. Mantenha um blog, comece uma newsletter, poste vídeos no YouTube, faça live na Twitch...&lt;/p&gt;
&lt;p&gt;Build in public ou construa em público é uma especialização do aprendizado público, nele você expõe as dificuldades, erros e aprendizados que você teve na construção de um projeto pessoal ou profissional.&lt;/p&gt;
&lt;p&gt;É uma maneira orgânica e funcional de converter &lt;em&gt;leads&lt;/em&gt;, atrair investidores e criar marca. Um bom exemplo disso é a &lt;a href=&quot;https://www.alertpix.live/&quot;&gt;alertpix&lt;/a&gt; do &lt;a href=&quot;https://www.youtube.com/@daniellimae&quot;&gt;Daniel&lt;/a&gt; e do &lt;a href=&quot;https://bsky.app/profile/horadecodar.dev&quot;&gt;Christopher&lt;/a&gt; que cresceu bastante por conta das publicações no Twitter/X, Instagram e TikTok.&lt;/p&gt;
&lt;p&gt;Pra mim, dois benefícios absurdos de todo esse processo de compartilhar, ensinar, construir, errar e ser ensinado (além do aprendizado) são:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documentação do teu processo. Você cria um histórico, uma trajetória visível que pode ser acompanhada ou revivida no futuro.&lt;/li&gt;
&lt;li&gt;Visibilidade. As pessoas se identificam, querem acompanhar seu progresso e você pode acabar virando referência em determinado assunto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A visibilidade não é o objetivo, você não deve esperar likes, mas é verdade que ela também aumenta sua &quot;sorte&quot;. Inclusive, uma vez li no blog do GitHub um artigo muito bom sobre como publicar o seu trabalho aumenta sua &quot;sorte&quot;, &lt;a href=&quot;https://github.com/readme/guides/publishing-your-work&quot;&gt;&quot;Publishing your work increases your luck&quot;&lt;/a&gt;, um trecho a seguir:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For every snarky comment, there are 10x as many people admiring your work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Como o criador do movimento descreveu em &lt;a href=&quot;https://www.swyx.io/learn-in-public&quot;&gt;&quot;Learn In Public&quot;&lt;/a&gt;, o aprendizado público é o &lt;strong&gt;jeito mais rápido de aprender&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Por que praticar o learn in public (tl;dr)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Acelera seu aprendizado&lt;/li&gt;
&lt;li&gt;Ajuda a criar conexões, o famoso &lt;em&gt;networking&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Contribui para o aprendizado alheio&lt;/li&gt;
&lt;li&gt;Novas oportunidades como consequência da visibilidade&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Como praticar&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Construindo um projeto open source (e divulgando ele)&lt;/li&gt;
&lt;li&gt;Postando um vídeo no YouTube explicando um conceito&lt;/li&gt;
&lt;li&gt;Postando um vídeo ensinando como criar um projeto usando uma tecnologia específica&lt;/li&gt;
&lt;li&gt;Mantendo um blog e escrevendo sobre a construção dos seus projetos, seu dia a dia, suas filosofias sobre software&lt;/li&gt;
&lt;li&gt;Criando um canal na Twitch e fazendo stream construindo software e explicando (live coding)&lt;/li&gt;
&lt;li&gt;Postando vídeos curtos no YouTube ou TikTok dando dicas rápidas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A verdade é que existem muitas maneiras de praticar o learn in public, se você está aprendendo e tornando seu aprendizado público em alguma plataforma/rede social, você está praticando o learn in public.&lt;/p&gt;
&lt;p&gt;Existem várias soluções de blogging como &lt;a href=&quot;https://substack.com/&quot;&gt;Substack&lt;/a&gt;, &lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt;, &lt;a href=&quot;https://hashnode.com/&quot;&gt;Hashnode&lt;/a&gt;, &lt;a href=&quot;https://wordpress.com/pt-br/create-blog/&quot;&gt;WordPress&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;Também existem diversos fóruns onde você pode publicar seus escritos, tipo o &lt;a href=&quot;https://www.tabnews.com.br/&quot;&gt;TabNews&lt;/a&gt;, &lt;a href=&quot;https://dev.to/&quot;&gt;dev.to&lt;/a&gt; e o &lt;a href=&quot;https://www.reddit.com/&quot;&gt;Reddit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Não esqueça das redes sociais: Twitter/X, Bluesky, Instagram, TikTok, YouTube, Twitch, LinkedIn...&lt;/p&gt;
&lt;h2&gt;Unindo learn in public e open source&lt;/h2&gt;
&lt;p&gt;Não tem segredo, começar um projeto open source por si só já é praticar o learn in public, a questão é maximizar o alcance dos seus projetos por meio das redes sociais que você usa.&lt;/p&gt;
&lt;p&gt;Quando iniciei meus estudos de desenvolvimento web optei por estudar sozinho, sem falar publicamente sobre, isso em meados de 2021.&lt;/p&gt;
&lt;p&gt;Eu fiquei quase 3 anos na &quot;caverna&quot; e em 2024, quando decidi criar minha conta no Twitter e interagir diretamente com a comunidade dev, minha carreira começou.&lt;/p&gt;
&lt;p&gt;O &quot;boom&quot; da minha integração com a bolha dev foi durante a &lt;a href=&quot;https://github.com/zanfranceschi/rinha-de-backend-2024-q1&quot;&gt;segunda edição da Rinha de Backend&lt;/a&gt;, uma competição de soluções back end. Nesse evento compartilhei o desenvolvimento da minha solução, meu aprendizado da linguagem Go e participei de várias discussões sobre o desafio.&lt;/p&gt;
&lt;p&gt;Desde de então postei sobre meus projetos pessoais, estudos e códigos.&lt;/p&gt;
&lt;p&gt;Depois disso fui contratado para fazer uma modificação em um blog sobre computarias e recebi um convite valioso para trabalhar em um projeto confidencial.&lt;/p&gt;
&lt;p&gt;Eu concordo que as oportunidades vieram ao acaso, mas acredito que ser mais público influenciou minha &quot;sorte&quot;. Sou grato a isso, ao learn in public, as pessoas que me impulsionaram e as pessoas que interagi e agregaram de alguma forma.&lt;/p&gt;
&lt;p&gt;Sobre os projetos que eu construí publicamente, gostaria de ressaltar&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga?tab=repositories&amp;amp;q=learning&quot;&gt;Os repositórios aprendendo alguma tecnologia&lt;/a&gt;, onde eu documentei vários tópicos que aprendi sobre as tecnologias&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/esquilo-aniquilador&quot;&gt;Esquilo Aniquilador&lt;/a&gt; - minha solução da segunda edição da Rinha de Backend&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke&quot;&gt;ruke&lt;/a&gt; - uma ferramenta para executar comandos configurados em um projeto, inspirada no &lt;a href=&quot;https://www.gnu.org/software/make/&quot;&gt;GNU Make&lt;/a&gt; e &lt;a href=&quot;https://github.com/casey/just&quot;&gt;just&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/themis&quot;&gt;themis&lt;/a&gt; - analisador de perfil do Bluesky, conta 7 contribuidores atualmente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enfatizei esses porque foram os que eu mais divulguei e tive um feedback bacana. Eu normalmente crio meus projetos públicos e com licença MIT, porém esses escolhidos se sobressaem.&lt;/p&gt;
&lt;p&gt;Obrigado por ter lido! Espero que tenha te ajudado de alguma maneira.&lt;/p&gt;
&lt;p&gt;Onde me encontrar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/kauefraga/&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/kauefraga&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href=&quot;https://bsky.app/profile/kauefraga.dev&quot;&gt;kauefraga.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href=&quot;https://x.com/rkauefraga&quot;&gt;rkauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href=&quot;https://dev.to/kauefraga&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TabNews: &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/conteudos/1&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Referências:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.redhat.com/pt-br/topics/open-source/what-is-open-source&quot;&gt;RedHat - &quot;O que é open source?&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/he4rt/open-source-e-software-livre-conheca-e-entenda-de-uma-vez-por-todas-o-que-cada-um-significa-15in&quot;&gt;He4rt Developers - &quot;Open Source e Software Livre&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.swyx.io/learn-in-public&quot;&gt;Shawn Wang (swyx) - &quot;Learn In Public&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/devrelbr/aplicando-o-learn-in-public-na-vida-real-3027&quot;&gt;Beatriz Oliveira - &quot;Aplicando o Learn In Public na Vida Real&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spacecoding.substack.com/p/deploy-na-sexta-010-o-que-e-learn&quot;&gt;Giulia Bordignon - &quot;Deploy na Sexta #010: O que é learn in public?&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/readme/guides/publishing-your-work&quot;&gt;Aaron Francis - &quot;Publishing your work increases your luck&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Recriando um jogo clássico com Python</title><link>https://kauefraga.dev/blog/recriando-um-jogo-classico-com-python/</link><guid isPermaLink="true">https://kauefraga.dev/blog/recriando-um-jogo-classico-com-python/</guid><pubDate>Sun, 01 Sep 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Esse é o primeiro capítulo de uma série em que eu compartilho o meu processo de construção de um jogo clássico, o &lt;strong&gt;ping pong&lt;/strong&gt; ou pong.&lt;/p&gt;
&lt;p&gt;Essa história começou na escola, onde eu criei um protótipo bem rápido utilizando a linguagem de programação Python durante a aula de programação de aplicativo.&lt;/p&gt;
&lt;p&gt;Minha implementação consistia em&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tela com cor de fundo&lt;/li&gt;
&lt;li&gt;duas raquetes controladas pelas setas e teclas &amp;lt;kbd&amp;gt;wasd&amp;lt;/kbd&amp;gt;&lt;/li&gt;
&lt;li&gt;bolinha com detecção de colisão (parede e raquete)&lt;/li&gt;
&lt;li&gt;placar centralizado no topo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Isso foi feito usando a biblioteca &lt;a href=&quot;https://www.pygame.org/docs/&quot;&gt;Pygame&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Em 2023 também fiz um ping pong para Windows usando c++ e a biblioteca &lt;a href=&quot;https://www.raylib.com/&quot;&gt;Raylib&lt;/a&gt;, até publiquei sobre no TabNews, &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/ping-pong-um-grande-classico&quot;&gt;&quot;Ping pong, um grande clássico&quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Meu objetivo com essa terceira versão que estou fazendo é ter um ping pong definitivo, completo, bonito e multiplataforma. Também quero impressionar meus colegas 😅&lt;/p&gt;
&lt;p&gt;Acima dessas metas, quero me divertir construindo um joguinho.&lt;/p&gt;
&lt;p&gt;Usando Python e Pygame, comecei a terceira versão do clássico, o &lt;a href=&quot;https://github.com/kauefraga/pyng-pong&quot;&gt;Pyng Pong&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Minha primeira dificuldade foi configurando um &lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;ambiente virtual&lt;/a&gt; para isolar as dependências e preparar um interpretador do Python.&lt;/p&gt;
&lt;p&gt;Felizmente a resolução foi simples:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# usando Linux e fish

python -m venv .venv # para criar um ambiente virtual em .venv

source .venv/bin/activate.fish # para usar o ambiente virtual
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depois arrumei meu &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; para usar o Python, instalando essas extensões:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=KevinRose.vsc-python-indent&quot;&gt;Python Indent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=donjayamanne.python-environment-manager&quot;&gt;Python Environment Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens&quot;&gt;Error Lens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abri meu VSCode e comecei a codar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code . --profile Python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Essa funcionalidade de perfis é bem legal, você pode ver mais sobre &lt;a href=&quot;https://code.visualstudio.com/docs/editor/profiles&quot;&gt;na documentação do VSCode&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Preparando a base&lt;/h2&gt;
&lt;p&gt;Um jogo é um aplicativo que executa em tempo real, ou seja, as instruções do jogo são executadas em loop até que o mesmo seja encerrado. A partir disso, enxergamos uma parte importante do nosso jogo, o chamado &quot;game loop&quot;.&lt;/p&gt;
&lt;p&gt;Pensando de maneira simplista, um jogo pode ser dividido em 3 etapas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inicialização&lt;/li&gt;
&lt;li&gt;Game loop&lt;/li&gt;
&lt;li&gt;Finalização&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Na inicialização nós criamos o processo e reservamos os recursos que vamos usar no nosso jogo, como os efeitos sonoros, imagens de fundo, dados de entidades, etc.&lt;/p&gt;
&lt;p&gt;Já no game loop tratamos de 2 partes: &lt;strong&gt;atualização&lt;/strong&gt; dos dados e &lt;strong&gt;renderização&lt;/strong&gt;. Aqui a gente detecta colisões, escuta eventos, atualiza as coordenadas das entidades e muito mais.&lt;/p&gt;
&lt;p&gt;Na finalização, simplesmente fechamos conexões e liberamos os recursos reservados na primeira etapa.&lt;/p&gt;
&lt;p&gt;Esse foi um resuminho bem grosseiro do que é um jogo e quais são as fases genéricas do mesmo.&lt;/p&gt;
&lt;p&gt;Vamos para o código, começando com o game loop que aparece logo no início da documentação do Pygame.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import pygame

# inicialização (1)
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True

# game loop (2)
while running:
  # atualização (2.1)
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False

  # renderização (2.2)
  screen.fill(&quot;purple&quot;)

  # sim, vai aparecer uma tela roxa, apenas

  pygame.display.flip()

  clock.tick(60)

# finalização (3)
pygame.quit()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bem direto, não?&lt;/p&gt;
&lt;p&gt;Buscando modularidade para gerenciar os dados e as cenas, eu pensei na seguinte estrutura:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# src/
#   main.py &amp;lt;-- estamos nesse arquivo
#   gameplay.py
#   menu.py

from game import Game
from menu import menu_scene
from gameplay import gameplay_scene

scenes = {
  0: menu_scene,
  1: gameplay_scene
}

def run_game():
  game = Game()

  while game.running:
    scene = scenes.get(game.scene)
    scene(game)

if __name__ == &apos;__main__&apos;:
  run_game()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obs.: não tem nada de clean code, functional programming, solid, kiss, design patterns ou outros princípios sendo aplicados nesse projeto. Estou apenas desenvolvendo...&lt;/p&gt;
&lt;p&gt;Como é um jogo relativamente pequeno, escolhi criar uma classe que contém todos os atributos compartilhados e recursos necessários, acoplamento 100%.&lt;/p&gt;
&lt;p&gt;Uma classe tem o método construtor &lt;code&gt;def __init__&lt;/code&gt; e o método destrutor &lt;code&gt;def __del__&lt;/code&gt;, que funcionam perfeitamente nas nossas etapas de inicialização e finalização.&lt;/p&gt;
&lt;p&gt;Sobre as cenas, usei uma &lt;em&gt;lookup table&lt;/em&gt; (ou dicionário) para facilitar na execução de uma cena específica. O dicionário consiste em uma chave (cena atual) e um valor (função de atualização e renderização da cena). No objeto do jogo (&lt;code&gt;game&lt;/code&gt;) tem um atributo &lt;code&gt;scene&lt;/code&gt; que guarda o valor da cena atual, valor esse que corresponde a uma chave do dicionário, então eu só preciso pegar no dicionário a função que vai cuidar da cena atual com a chave correspondente e executa-la.&lt;/p&gt;
&lt;p&gt;Por enquanto é isso! Ainda preciso organizar melhor as outras partes (entidades, componentes de texto, botões...) e como tudo isso vai se comunicar em cada cena antes de escrever um texto completo sobre, por isso decidi separar essa jornada em uma sériezinha. Assim posso escrever a medida que vou aprimorando o jogo e lidando com os desafios.&lt;/p&gt;
&lt;p&gt;Espero que tenha gostado e aprendido algo novo. De qualquer forma, muito obrigado por ler!&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Desbravando o poder do markdown</title><link>https://kauefraga.dev/blog/desbravando-o-poder-do-markdown/</link><guid isPermaLink="true">https://kauefraga.dev/blog/desbravando-o-poder-do-markdown/</guid><pubDate>Mon, 12 Aug 2024 18:23:45 GMT</pubDate><content:encoded>&lt;p&gt;Salve, salve! Vamos aprofundar nossos conhecimentos em markdown.&lt;/p&gt;
&lt;p&gt;Este é o quarto capítulo de uma série sobre markdown, caso queira ler os capítulos anteriores&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/aprenda-a-fazer-um-readme-4n36&quot;&gt;Introdução ao markdown e aos READMEs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/personalizando-o-readme-do-seu-projeto-51jm&quot;&gt;Personalizando o README do seu projeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/personalizando-o-readme-do-seu-perfil-do-github-52ke&quot;&gt;Personalizando o README do seu perfil do GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sem mais delongas, bora pro markdown!&lt;/p&gt;
&lt;h2&gt;Lista de tarefas&lt;/h2&gt;
&lt;p&gt;Você deve conhecer as listas ordenadas e não-ordenadas, correto?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fulano&lt;/li&gt;
&lt;li&gt;ciclano&lt;/li&gt;
&lt;li&gt;beltrano&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;item&lt;/li&gt;
&lt;li&gt;item&lt;/li&gt;
&lt;li&gt;item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;E se eu te dissesse que é possível fazer uma lista com marcações?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- [x] tarefa x
- [ ] tarefa y
- [ ] tarefa z
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;[x] tarefa x&lt;/li&gt;
&lt;li&gt;[ ] tarefa y&lt;/li&gt;
&lt;li&gt;[ ] tarefa z&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tabelas&lt;/h2&gt;
&lt;p&gt;Com linhas e colunas, uma tabela pode melhor a visualização e facilitar a busca de informações.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| Coluna 1 | Coluna 2 | Coluna 3 |
|----------|----------|----------|
| Item 1   | Item 1   | Item 1   |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Resultado:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coluna 1&lt;/th&gt;
&lt;th&gt;Coluna 2&lt;/th&gt;
&lt;th&gt;Coluna 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Item 1&lt;/td&gt;
&lt;td&gt;Item 1&lt;/td&gt;
&lt;td&gt;Item 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Você pode escolher como os textos ficam alinhados e usar os estilos de texto dentro da tabela também.&lt;/p&gt;
&lt;p&gt;Coloque &lt;code&gt;:&lt;/code&gt; no início do divisor e as células vão ficar alinhadas à esquerda. No final, alinhadas à direita. E se você colocar &lt;code&gt;:&lt;/code&gt; no início e no fim do divisor o texto vai ficar centralizado.&lt;/p&gt;
&lt;p&gt;Um exemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| Nome completo  |         Idade |
|:--------------:|--------------:|
|  João `Silva`  | &amp;lt;kbd&amp;gt;27&amp;lt;/kbd&amp;gt; |
| Ana *Carvalho* |            20 |
| Beatriz Souza  |        **35** |
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nome completo&lt;/th&gt;
&lt;th&gt;Idade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;João &lt;code&gt;Silva&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;kbd&amp;gt;27&amp;lt;/kbd&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ana &lt;em&gt;Carvalho&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beatriz Souza&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A tag &lt;code&gt;kbd&lt;/code&gt; serve pra mostrar entradas do teclado, veja mais na &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd&quot;&gt;documentação da mdn sobre kbd&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sobre tabelas é isso, bem simples, não?&lt;/p&gt;
&lt;p&gt;A formatação das tabelas no markdown pode dificultar bastante a leitura, então tente sempre manter as tabelas bem formatadas.&lt;/p&gt;
&lt;p&gt;Uma dica pra quem usa o Visual Studio Code: instale a extensão &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=darkriszty.markdown-table-prettify&quot;&gt;Markdown Table Prettifier&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Vídeos&lt;/h2&gt;
&lt;p&gt;Colocar uma demonstração visual de um conceito ou projeto pode ser poderoso, mas nem todos os processadores de markdown tem uma sintaxe pronta pra isso.&lt;/p&gt;
&lt;p&gt;A forma mais simples e totalmente compatível é usando HTML puro.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div align=&quot;center&quot;&amp;gt;
  &amp;lt;video width=&quot;320&quot; height=&quot;240&quot; controls&amp;gt;
    &amp;lt;source src=&quot;video.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;
  &amp;lt;/video&amp;gt;
  &amp;lt;p&amp;gt;esta é a legenda do vídeo (caption)&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;div align=&quot;center&quot;&amp;gt;
&amp;lt;video width=&quot;500&quot; height=&quot;300&quot; controls&amp;gt;
&amp;lt;source src=&quot;video.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;
&amp;lt;/video&amp;gt;
&amp;lt;p&amp;gt;sim, não tem um vídeo -_-&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;div&lt;/code&gt; para centralizar e o parágrafo (&lt;code&gt;p&lt;/code&gt;) não são necessários, você pode remover caso queira. Recomendo que dê uma olhada na &lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/video&quot;&gt;documentação da tag &lt;code&gt;video&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Não testei mas quero compartilhar que de acordo com uma &lt;a href=&quot;https://github.blog/news-insights/product-news/video-uploads-available-github/&quot;&gt;postagem no blog do GitHub&lt;/a&gt; é possível apenas colocar um link que termine com a extensão mp4 ou mov e o GitHub cuida da renderização para você.&lt;/p&gt;
&lt;p&gt;Outra forma de expor uma demonstração é usando um gif, que foi o que eu fiz no projeto &lt;a href=&quot;https://github.com/kauefraga/ruke#ruke&quot;&gt;Ruke&lt;/a&gt; (porque eu não conhecia a tag &lt;code&gt;video&lt;/code&gt;). Você converte o vídeo para o formato gif usando uma plataforma ou ferramenta e usa a sintaxe de imagem.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![texto alternativo](demonstracao.gif)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tenha em mente que gifs têm a qualidade reduzida e ausência de áudio.&lt;/p&gt;
&lt;h2&gt;Notas de rodapé (&lt;em&gt;footnotes&lt;/em&gt;)&lt;/h2&gt;
&lt;p&gt;Sabe aquelas referências da Wikipédia[^1], então...&lt;/p&gt;
&lt;p&gt;Nunca utilizei mas pode fazer sentido no seu documento ou em documentos grandes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Aqui está meu texto falando e do nada pneumoultramicroscopicossilicovulcanoconiótico[^pneu].

[^pneu]: doença pulmonar causada ao inalar partículas finas de sílica provenientes de atividades vulcânicas.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Identificação de títulos (&lt;em&gt;heading IDs&lt;/em&gt;)&lt;/h2&gt;
&lt;p&gt;Mesmo invisível é muito útil. Serve para você mudar a âncora daquele título/subtítulo e isso é útil quando você tem um título grande ou com emojis.&lt;/p&gt;
&lt;p&gt;Qual link você prefere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;github.com/kauefraga/anubis#um-titulo-realmente-muito-grande-lorem-ipsum-blablabla&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/kauefraga/anubis#titulo-lorem&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Imagino que a segunda opção, afinal, o título vai estar escrito no texto e não precisa necessariamente estar na url.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Um título realmente muito grande lorem ipsum blablabla {#titulo-lorem}

### Um subtítulo não muito grande mas grande {#subtitulo}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O resultado do texto é o mesmo mas a âncora não, estará encurtada.&lt;/p&gt;
&lt;h2&gt;Superscript e subscript&lt;/h2&gt;
&lt;p&gt;Aquele texto em cima ou embaixo, tipo em expoentes ou quantidade de moléculas.&lt;/p&gt;
&lt;p&gt;Também vai depender do seu processador markdown, mas a solução em HTML é a seguinte:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; e H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O

Este texto &amp;lt;sup&amp;gt;é muito&amp;lt;/sup&amp;gt; &amp;lt;sub&amp;gt;legal&amp;lt;/sub&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; e H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&lt;/p&gt;
&lt;p&gt;Este texto &amp;lt;sup&amp;gt;é muito&amp;lt;/sup&amp;gt; &amp;lt;sub&amp;gt;legal&amp;lt;/sub&amp;gt;&lt;/p&gt;
&lt;h2&gt;Diagramas mermaid&lt;/h2&gt;
&lt;p&gt;Em plataformas que usem &lt;a href=&quot;https://mermaid.js.org&quot;&gt;Mermaid&lt;/a&gt; é possível usar markdown para fazer diagramas (e vários tipos deles). O GitHub e o GitLab, por exemplo, suportam esses diagramas.&lt;/p&gt;
&lt;p&gt;Como existem diversos tipos de diagramas e está tudo documentado, quero mostrar só dois exemplos.&lt;/p&gt;
&lt;p&gt;Um fluxograma:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\```mermaid
flowchart LR
  cliente --- servidor
\```
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
  cliente --- servidor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma representação de ramificações Git:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\```mermaid
---
title: Branches git
---
gitGraph
  commit
  commit
  branch develop
  checkout develop
  commit
  commit
  checkout main
  merge develop
  commit
  commit
\```
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;---
title: Branches git
---
gitGraph
  commit
  commit
  branch develop
  checkout develop
  commit
  commit
  checkout main
  merge develop
  commit
  commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Muito massa, né?&lt;/p&gt;
&lt;p&gt;Só não esquece de tirar as contra barras \ ali...&lt;/p&gt;
&lt;p&gt;É isso! Te agradeço por acompanhar até aqui, espero que tenha gostado e aprendido algo novo ao longo do caminho.&lt;/p&gt;
&lt;p&gt;Com este capítulo, eu finalizo essa série de markdown. É claro que na medida necessária irei atualizando esses 4 textos.&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Instalando o Ruke pelo GitHub Releases</title><link>https://kauefraga.dev/blog/instalando-ruke-pelo-github-releases/</link><guid isPermaLink="true">https://kauefraga.dev/blog/instalando-ruke-pelo-github-releases/</guid><pubDate>Mon, 20 May 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opa! Bão? Segundei aqui com &lt;em&gt;scripting&lt;/em&gt; (bash e powershell).&lt;/p&gt;
&lt;p&gt;Decidi criar um pipeline para disponibilizar o binário do ruke direto no GitHub. Com isso, quem não tem um setup Rust pode instalar o &lt;a href=&quot;https://github.com/kauefraga/ruke&quot;&gt;ruke&lt;/a&gt; e usar sem nenhum problema.&lt;/p&gt;
&lt;p&gt;Para facilitar mais ainda a instalação e configuração, nada melhor do que um scriptzão, não é mesmo?&lt;/p&gt;
&lt;h2&gt;Instalando no Linux/WSL e MacOS&lt;/h2&gt;
&lt;p&gt;Primeiro utilitário que veio em mente foi o &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Abri um arquivo &lt;code&gt;.sh&lt;/code&gt; e comecei assim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#! /bin/bash

curl -OLs https://github.com/kauefraga/ruke/releases/latest/download/ruke-x86_64-unknown-linux-gnu.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;curl [url]&lt;/code&gt; para fazer uma requisição para a url&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-O&lt;/code&gt; para criar um arquivo local nomeado tal qual o arquivo remoto (&lt;a href=&quot;https://curl.se/docs/manpage.html#-O&quot;&gt;curl -O&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-L&lt;/code&gt; para seguir redirecionamentos (&lt;a href=&quot;https://curl.se/docs/manpage.html#-L&quot;&gt;curl -L&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; para silenciar a saída (&lt;a href=&quot;https://curl.se/docs/manpage.html#-s&quot;&gt;curl -s&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depois de baixar, tem que descompactar esse &lt;code&gt;.tar.gz&lt;/code&gt; e remove-lo.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -xzf ruke-x86_64-unknown-linux-gnu.tar.gz

rm ruke-x86_64-unknown-linux-gnu.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tar [arquivo]&lt;/code&gt; para trabalhar um arquivo &lt;code&gt;.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-x&lt;/code&gt; para extrair o arquivo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-z&lt;/code&gt; para descompactar com &lt;code&gt;gzip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; para criar o arquivo final, eu acho&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Poderia adicionar a flag &lt;code&gt;-v&lt;/code&gt; (&lt;em&gt;verbose&lt;/em&gt;) para ter mais informações na saída, mas não é necessário.&lt;/p&gt;
&lt;p&gt;Perfeito! Mas agora eu preciso criar outro script para pegar o arquivo do MacOS certinho, não? Não mesmo.&lt;/p&gt;
&lt;p&gt;Dei uma pesquisada e achei uma &lt;a href=&quot;https://stackoverflow.com/questions/394230/how-to-detect-the-os-from-a-bash-script&quot;&gt;resposta legal no Stack Overflow&lt;/a&gt; sobre como detectar o sistema operacional com bash.&lt;/p&gt;
&lt;p&gt;Existe uma variável chamada &lt;code&gt;$OSTYPE&lt;/code&gt; que armazena o sistema operacional atual. Creio que seja possível guardar o resultado do comando &lt;code&gt;uname&lt;/code&gt; em uma variável e usa-la também. Com o sistema operacional em mãos, basta mudar o arquivo dependendo do SO.&lt;/p&gt;
&lt;p&gt;Usando uma variável (&lt;code&gt;$binary&lt;/code&gt;) juntamente com a variável &lt;code&gt;$OSTYPE&lt;/code&gt; eu cheguei nessa solução:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#! /bin/bash

binary=&apos;ruke-x86_64-unknown-linux-gnu.tar.gz&apos;

if [[ &quot;$OSTYPE&quot; == &quot;darwin&quot;* ]]; then
    binary=&apos;ruke-x86_64-apple-darwin.tar.gz&apos;
fi

curl -OLs https://github.com/kauefraga/ruke/releases/latest/download/$binary

tar -xzf $binary

rm $binary

echo &apos;Reminder: add ruke in your PATH or move it to a local where PATH is already set&apos;
echo &apos;$ mv ruke /usr/bin/&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para Linux, WSL e MacOS é isso!&lt;/p&gt;
&lt;h2&gt;Instalando no Windows&lt;/h2&gt;
&lt;p&gt;Para Windows, a ideia não vai ser diferente: faz o download, extrai e limpa a sujeira. Sem enrolação, veja o resultado:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invoke-WebRequest &apos;https://github.com/kauefraga/ruke/releases/latest/download/ruke-x86_64-pc-windows-msvc.zip&apos; -OutFile &apos;ruke-x86_64-pc-windows-msvc.zip&apos;

Expand-Archive -Force -Path &apos;ruke-x86_64-pc-windows-msvc.zip&apos; -DestinationPath &apos;.&apos;

Remove-Item &apos;ruke-x86_64-pc-windows-msvc.zip&apos;

Write-Host &apos;Reminder: add ruke in your PATH or move it to a local where PATH is already set&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O powershell é bem reconhecível pelo início das palavras em maiúsculo. Powershell &quot;idiomático&quot; talvez...&lt;/p&gt;
&lt;p&gt;Vale ressaltar também que &lt;code&gt;Invoke-WebRequest&lt;/code&gt; pode ser só &lt;code&gt;iwr&lt;/code&gt;, assim como &lt;code&gt;Remove-Item&lt;/code&gt; e &lt;code&gt;Write-Host&lt;/code&gt; poderiam ser apenas &lt;code&gt;rm&lt;/code&gt; e &lt;code&gt;echo&lt;/code&gt;, respectivamente.&lt;/p&gt;
&lt;p&gt;Novamente, foi pesquisando que encontrei a forma de extrair um arquivo zipado com &lt;code&gt;Expand-Archive&lt;/code&gt;, &lt;a href=&quot;https://superuser.com/questions/1314420/how-to-unzip-a-file-using-the-cmd&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pelo que vi também é possível usar &lt;code&gt;tar&lt;/code&gt; para extrair no Windows (&lt;a href=&quot;https://stackoverflow.com/questions/38776137/native-tar-extraction-in-powershell&quot;&gt;&quot;Native tar extraction in powershell&quot;&lt;/a&gt;). E usar o utilitário &lt;code&gt;7z&lt;/code&gt; seria outra opção viável.&lt;/p&gt;
&lt;h2&gt;A lição&lt;/h2&gt;
&lt;p&gt;Depois disso, eu pude refletir e concluir:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hoje em dia, com acesso à Internet e tempo, só lhe resta encontrar a pergunta certa.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Acho que esse pensamento é bem comum. Você não sabe nada sobre &lt;em&gt;scripting&lt;/em&gt;, em seguida você pesquisa e é capaz de criar uma automação para algum processinho chato do seu projeto ou do seu dia a dia. Provavelmente você não aprendeu a usar as ferramentas que utilizou, mas o que importa é que você conseguiu facilitar sua vida.&lt;/p&gt;
&lt;p&gt;Se quiser trocar uma ideia comigo, pode me mandar uma DM no &lt;a href=&quot;https://twitter.com/rkauefraga&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Boa semana e muito obrigado por ler! Espero ter ajudado ❤&lt;/p&gt;
&lt;p&gt;O projeto e os arquivos citados podem ser encontrados nos links abaixo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke&quot;&gt;ruke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke/blob/main/.github/workflows/release.yml&quot;&gt;pipeline de release do ruke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke/issues/25&quot;&gt;issue da instalação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke/blob/main/install.sh&quot;&gt;script bash (linux/wsl/darwin)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ruke/blob/main/install.ps1&quot;&gt;script powershell (windows)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Personalizando o README do seu perfil do GitHub</title><link>https://kauefraga.dev/blog/personalizando-o-readme-do-seu-perfil-do-github/</link><guid isPermaLink="true">https://kauefraga.dev/blog/personalizando-o-readme-do-seu-perfil-do-github/</guid><pubDate>Sun, 12 May 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opa, tranquilo? Bora deixar o README do teu GitHub bonitão!&lt;/p&gt;
&lt;p&gt;Antes de começar realmente, se você não sabe o que é README nem markdown eu recomendo fortemente que veja os outros artigos dessa série.&lt;/p&gt;
&lt;p&gt;O README do GitHub é o cartão de visita do seu perfil. Antes de personalizar ele, você precisa criar ele.&lt;/p&gt;
&lt;h2&gt;Criando README&lt;/h2&gt;
&lt;p&gt;Crie um repositório com o mesmo nome do seu perfil. Como meu nome de usuário é &quot;kauefraga&quot; o nome do repositório seria &quot;kauefraga&quot; também.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/guide-1.png&quot; alt=&quot;criando repositório seu-nome-de-usuario/seu-nome-de-usuario&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Para facilitar seu trabalho já inclua o arquivo README no seu repositório.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/guide-2.png&quot; alt=&quot;incluindo o arquivo README e criando o repositório de fato&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Feito isso você está pronto para customizar o seu README.&lt;/p&gt;
&lt;p&gt;Eu recomendo que você coloque as seguintes informações:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O que você gosta de fazer&lt;/li&gt;
&lt;li&gt;Planos para o ano atual&lt;/li&gt;
&lt;li&gt;Projetos&lt;/li&gt;
&lt;li&gt;As tecnologias (tech stack) e ferramentas que você usa&lt;/li&gt;
&lt;li&gt;Contato&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vale ressaltar que o README deve ficar com a sua cara, com o que você gostar e achar que deve ter. Reflita sua extravagância, seu minimalismo, suas cores favoritas, tudo que te represente.&lt;/p&gt;
&lt;p&gt;Para editar pelo próprio GitHub clique no lápis para editar, veja a seguir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/guide-3.png&quot; alt=&quot;entrando no modo de edição do README&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A partir de agora é contigo, totalmente pessoal. Vou deixar vários materiais e inspirações de estilos e layouts.&lt;/p&gt;
&lt;p&gt;Uma coisa que eu gostaria de ressaltar, eu gosto de ter um README bonitinho e algumas pessoas (recrutadores, outros desenvolvedores, etc.) olham sim, porém não leve tão a sério. Faça porque você quer falar um pouco sobre quem você é e expor informações técnicas suas.&lt;/p&gt;
&lt;h3&gt;GitHub Readme Stats&lt;/h3&gt;
&lt;p&gt;Com esses cards você pode mostrar informações relevantes do seu perfil do GitHub e personalizar as cores.&lt;/p&gt;
&lt;p&gt;Veja o &lt;a href=&quot;https://github.com/anuraghazra/github-readme-stats&quot;&gt;repositório&lt;/a&gt; ou vá direto para a &lt;a href=&quot;https://github.com/anuraghazra/github-readme-stats?tab=readme-ov-file#github-stats-card&quot;&gt;seção dos cards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/github-stats.png&quot; alt=&quot;demo dos stats&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Skill Icons&lt;/h3&gt;
&lt;p&gt;Quer expor as tecnologias que você usa, está estudando ou querendo estudar? Tá na mão!&lt;/p&gt;
&lt;p&gt;Veja o &lt;a href=&quot;https://skillicons.dev/&quot;&gt;site&lt;/a&gt; ou vá direto na &lt;a href=&quot;https://github.com/tandpfun/skill-icons#specifying-icons&quot;&gt;documentação&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/skill-icons.png&quot; alt=&quot;demo dos skill icons&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Se você não viu ainda, na seção &lt;a href=&quot;https://kauefraga.github.io/blog/about/#sobre-mim&quot;&gt;sobre mim&lt;/a&gt; do blog eu uso os &lt;em&gt;skill icons&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Markdown Badges&lt;/h3&gt;
&lt;p&gt;Veja o &lt;a href=&quot;https://github.com/Ileriayo/markdown-badges&quot;&gt;repositório markdown badges&lt;/a&gt; e o &lt;a href=&quot;https://github.com/alexandresanlim/Badges4-README.md-Profile&quot;&gt;badges for readme.md profile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/badges.png&quot; alt=&quot;demo das badges&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Snake Game&lt;/h3&gt;
&lt;p&gt;Você deve conhecer o jogo da cobrinha, certo? Imagina uma cobrinha comendo suas contribuições no seu gráfico de contribuições.&lt;/p&gt;
&lt;p&gt;Veja o &lt;a href=&quot;https://github.com/Platane/snk&quot;&gt;repositório&lt;/a&gt; e um &lt;a href=&quot;https://dev.to/henriquelopes42/como-adicionar-o-snake-game-jogo-da-cobrinha-no-seu-perfil-do-github-40m2&quot;&gt;tutorial de como adicionar no seu perfil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/snake-game.png&quot; alt=&quot;demo da cobrinha comendo os commits&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Wakatime&lt;/h3&gt;
&lt;p&gt;Quer exibir métricas do seu tempo em &lt;em&gt;x&lt;/em&gt; projeto ou usando &lt;em&gt;y&lt;/em&gt; linguagem de programação? Comece a usar o &lt;a href=&quot;https://wakatime.com/&quot;&gt;wakatime&lt;/a&gt; e veja esse artigo também, &lt;a href=&quot;https://airton.dev/article/exibindo-no-github-metricas-de-tempo-gasto-em-linguagens-usando-wakatime/&quot;&gt;&quot;Exibindo no Github métricas de tempo gasto em linguagens usando Wakatime&quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/wakatime.png&quot; alt=&quot;demo do wakatime direto do artigo do Airton Zanon&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Inspirações&lt;/h2&gt;
&lt;p&gt;Não tem nada melhor que ter opções para se inspirar, né? Aqui vão alguns READMEs que eu considero legais. Clique na imagem para ir até o README.&lt;/p&gt;
&lt;p&gt;Começando com o meu 😂&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kauefraga/kauefraga&quot;&gt;&lt;img src=&quot;images/meu-readme.png&quot; alt=&quot;meu readme&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sem frufru? Olha esse do Filipe&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/datsfilipe/datsfilipe&quot;&gt;&lt;img src=&quot;images/readme-datsfilipe.png&quot; alt=&quot;readme do datsfilipe&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simples mas nem tanto? O Lucas amassou aqui&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/LucasMorais1998/LucasMorais1998&quot;&gt;&lt;img src=&quot;images/readme-lucasmorais1998.png&quot; alt=&quot;readme do lucasmorais1998&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nessa mesma ideia, a Tifany arrasou também&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pinuya/pinuya&quot;&gt;&lt;img src=&quot;images/readme-pinuya.png&quot; alt=&quot;readme da pinuya&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Continuando...&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hiroshimorowaka/hiroshimorowaka&quot;&gt;&lt;img src=&quot;images/readme-hiroshimorowaka.png&quot; alt=&quot;readme do hiroshimorowaka&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cherryramatisdev/cherryramatisdev&quot;&gt;&lt;img src=&quot;images/readme-cherryramatisdev.png&quot; alt=&quot;readme da cherryramatisdev&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JuMayumiC/JuMayumiC&quot;&gt;&lt;img src=&quot;images/readme-jumayumic.png&quot; alt=&quot;readme da jumayumic&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cr-0w/cr-0w&quot;&gt;&lt;img src=&quot;images/readme-cr-0w.png&quot; alt=&quot;readme do cr-0w&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/joevtap/joevtap&quot;&gt;&lt;img src=&quot;images/readme-joevtap.png&quot; alt=&quot;readme do joevtap&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/erickcestari/erickcestari&quot;&gt;&lt;img src=&quot;images/readme-erickcestari.png&quot; alt=&quot;readme do erickcestari&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/NFTSZ/NFTSZ&quot;&gt;&lt;img src=&quot;images/readme-nftsz.png&quot; alt=&quot;readme da nftsz&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Recomendações&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/TsaLQAetPLU&quot;&gt;Como personalizar o seu perfil no Github (Readme) da Rafaella Ballerini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/kibumLaura/status/1754254161615491117&quot;&gt;Guia resumido da Laura Kibum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estarei aberto para dúvidas ou sugestões pelo &lt;a href=&quot;https://twitter.com/rkauefraga&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Muito obrigado por ter lido até aqui ❤.&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Ruke, uma ferramenta de automação de tarefas</title><link>https://kauefraga.dev/blog/ruke-uma-ferramenta-de-automacao-de-tarefas/</link><guid isPermaLink="true">https://kauefraga.dev/blog/ruke-uma-ferramenta-de-automacao-de-tarefas/</guid><pubDate>Sun, 05 May 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opa, tudo bem? Queria compartilhar um projeto que estou fazendo e mantendo.&lt;/p&gt;
&lt;p&gt;O Ruke é uma ferramenta simples para automatizar tarefas de um projeto. Com ele, você pode definir uma tarefa com comandos que serão executados de maneira sequencial. Essas tarefas e comandos ficam em um arquivo &lt;a href=&quot;https://toml.io/en/&quot;&gt;TOML&lt;/a&gt; bem fácil de ler e configurar.&lt;/p&gt;
&lt;p&gt;O projeto é feito em Rust e tem uma interface de linha de comando (CLI).&lt;/p&gt;
&lt;p&gt;Veja uma demonstração do Ruke na versão 0.1.3.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;gifs/demo-1.gif&quot; alt=&quot;Demonstração do ruke, mostrando a interface e executando algumas tarefas.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Escolhas importantes&lt;/h2&gt;
&lt;p&gt;Decidi desenvolver esse projeto usando Rust porque é uma linguagem de programação que estou aprendendo e ela tem uma boa reputação quanto a criação de ferramentas para desenvolvedores.&lt;/p&gt;
&lt;p&gt;O Ruke foi totalmente inspirado pelo &lt;a href=&quot;https://www.gnu.org/software/make/&quot;&gt;GNU Make&lt;/a&gt; e pelo &lt;a href=&quot;https://github.com/casey/just&quot;&gt;just&lt;/a&gt;, porém uma diferença relevante está na escolha do arquivo de configuração. Enquanto esses projetos citados optaram por ter um formato próprio, eu escolhi usar o TOML por alguns motivos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dados os objetivos, não há necessidade de um controle total da implementação (sintaxe, funcionalidades, estruturas de dados).&lt;/li&gt;
&lt;li&gt;A diferença do esforço para os ganhos de escrever um parser próprio é drástica.&lt;/li&gt;
&lt;li&gt;Usar um formato simples e conhecido faz com que a curva de aprendizado seja mínima.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;E esse nome, veio de onde?&lt;/h2&gt;
&lt;p&gt;O nome &quot;ruke&quot; é uma combinação de &quot;&lt;strong&gt;ru&lt;/strong&gt;st&quot; e &quot;ma&lt;strong&gt;ke&lt;/strong&gt;&quot;.&lt;/p&gt;
&lt;p&gt;O primeiro nome era &quot;rufile&quot; de &quot;&lt;strong&gt;ru&lt;/strong&gt;st&quot; e &quot;make&lt;strong&gt;file&lt;/strong&gt;&quot;, mas em &lt;a href=&quot;https://twitter.com/rkauefraga/status/1778574809384833043&quot;&gt;um post meu no Twitter&lt;/a&gt; o coelho &lt;a href=&quot;https://twitter.com/JeffQuesado&quot;&gt;Jeff Quesado&lt;/a&gt; comentou sobre o comando que seria utilizado e deu uma sugestão: &lt;code&gt;Makefile -&amp;gt; make&lt;/code&gt;, &lt;code&gt;Rufile -&amp;gt; ruke&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A partir desse momento, o projeto começou a se chamar &lt;code&gt;ruke&lt;/code&gt; e o arquivo &lt;code&gt;Rukefile&lt;/code&gt; (por implicações práticas, atualmente o arquivo principal é &lt;code&gt;Ruke.toml&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;Primeiros contribuidores&lt;/h2&gt;
&lt;p&gt;Eu tenho pouquíssimos repositórios privados, tudo que fiz e faço gosto de deixar público para os outros verem, se inspirarem, sugerirem alterações ou melhorias.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Open source and build in public are the ways!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Felizmente, conheci pessoas incríveis no Twitter (uma surpresa, não?) que me ajudaram e decidiram contribuir para o Ruke.&lt;/p&gt;
&lt;p&gt;Uma delas já foi citada, o Jeff, que deu a ideia do nome.&lt;/p&gt;
&lt;p&gt;O &lt;a href=&quot;https://twitter.com/fodasecassiano&quot;&gt;Felipe Cassiano&lt;/a&gt; foi o primeiro contribuidor do projeto em si, forkou, desenvolveu e mandou alguns pull requests. As mudanças mais significativas que ele fez foram:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implementar o comando &lt;code&gt;list&lt;/code&gt; que serve para listar as tarefas existentes.&lt;/li&gt;
&lt;li&gt;Desenvolver os comandos &lt;code&gt;add&lt;/code&gt; e &lt;code&gt;remove&lt;/code&gt; que serviam para adicionar e remove tarefas do arquivo &lt;code&gt;Ruke.toml&lt;/code&gt; (ainda existem mas foram modificados).&lt;/li&gt;
&lt;li&gt;Adicionar um modo interativo para os comandos &lt;code&gt;add&lt;/code&gt; e &lt;code&gt;remove&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementar a troca da estrutura de dados principal de vetor para hash map.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E por último mas não menos importante, o &lt;a href=&quot;https://twitter.com/shwuydev&quot;&gt;Shwuy&lt;/a&gt;, que implementou uma busca pelo arquivo &lt;code&gt;Ruke.toml&lt;/code&gt; usando o iterador &lt;a href=&quot;https://doc.rust-lang.org/std/path/struct.Ancestors.html&quot;&gt;&lt;code&gt;Ancestors&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Essas contribuições agregaram na performance e, principalmente, na usabilidade da ferramenta.&lt;/p&gt;
&lt;p&gt;Agradeço muito a eles por terem me ajudado a construir esse projeto (e não só), têm um espaço no meu coração. Foram &lt;strong&gt;os primeiros contribuidores&lt;/strong&gt; de um projeto meu.&lt;/p&gt;
&lt;h2&gt;Atualização mais recente&lt;/h2&gt;
&lt;p&gt;A última atualização do Ruke (0.1.6) incrementou ainda mais a usabilidade. Inspirado no &lt;a href=&quot;https://bun.sh/&quot;&gt;Bun&lt;/a&gt;, modifiquei as saídas do executor de tarefa e do comando &lt;code&gt;list&lt;/code&gt; para que apareçam mais informações úteis.&lt;/p&gt;
&lt;p&gt;Dá uma olhada em como ficou.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;gifs/demo-2.gif&quot; alt=&quot;Demonstração das alterações mais recentes do Ruke, baseadas nas saídas do Bun.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tenho gostado bastante do projeto pois adoro criar ferramentas para desenvolvedores e também porque está sendo útil para mim, tanto no âmbito do aprendizado quanto da utilização. Inclusive, estou usando o Ruke em um projeto full stack que comecei recentemente chamado &lt;a href=&quot;https://github.com/kauefraga/inus&quot;&gt;Inu&lt;/a&gt; (aquele ali em cima no gif, é o back end).&lt;/p&gt;
&lt;p&gt;Caso tenha ficado interessado em testar o Ruke, recomendo que instale pelo &lt;a href=&quot;https://doc.rust-lang.org/cargo/&quot;&gt;Cargo&lt;/a&gt; usando o comando abaixo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo install ruke
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para iniciar um arquivo de configuração, basta executar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruke init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pra executar a tarefa &quot;main&quot;, execute:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruke # ou ruke main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Com o comando &lt;code&gt;ruke --help&lt;/code&gt; você pode ver um menu de ajuda com os comandos que existem e o que eles fazem. O comando &lt;code&gt;ruke {comando} --help&lt;/code&gt; irá mostrar mais detalhes de um comando específico.&lt;/p&gt;
&lt;p&gt;Você pode aprender como adicionar tarefas e especificar comandos na documentação, nas seções &lt;a href=&quot;https://github.com/kauefraga/ruke?tab=readme-ov-file#mastering-the-cli&quot;&gt;&quot;Mastering the CLI&quot;&lt;/a&gt; e &lt;a href=&quot;https://github.com/kauefraga/ruke?tab=readme-ov-file#mastering-the-rukefile&quot;&gt;&quot;Mastering the Rukefile&quot;&lt;/a&gt; no &lt;a href=&quot;https://github.com/kauefraga/ruke&quot;&gt;repositório do projeto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Estarei aberto para dúvidas ou sugestões por aqui ou pelo &lt;a href=&quot;https://twitter.com/rkauefraga&quot;&gt;Twitter/X&lt;/a&gt; se preferir.&lt;/p&gt;
&lt;p&gt;Muito obrigado por ter lido até aqui ❤🦀.&lt;/p&gt;
&lt;p&gt;Fonte: &lt;a href=&quot;https://github.com/kauefraga/ruke&quot;&gt;repositório do Ruke&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Colocando coelhinhos no computaria e enlouquecendo</title><link>https://kauefraga.dev/blog/colocando-coelhinhos-no-computaria-e-enlouquecendo/</link><guid isPermaLink="true">https://kauefraga.dev/blog/colocando-coelhinhos-no-computaria-e-enlouquecendo/</guid><pubDate>Sat, 06 Apr 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Publicado originalmente no &lt;a href=&quot;https://computaria.gitlab.io/blog/2024/04/06/colocando-coelhinhos-no-computaria&quot;&gt;Computaria&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Olá! Me chamo Kauê, tenho 16 anos e é um prazer estar redigindo este texto como o primeiro convidado do Computaria 😊&lt;/p&gt;
&lt;p&gt;Eu tava no intervalo da escola, de boa, quando de repente chegou uma mensagem
na minha DM do Twitter/X. Era o &lt;a href=&quot;https://twitter.com/JeffQuesado&quot;&gt;Jeff Coelho Quesado&lt;/a&gt; me perguntando se eu sabia
CSS e se eu poderia colocar alguns coelhos desenhados pelo &lt;a href=&quot;https://twitter.com/arorok_&quot;&gt;@arorok_&lt;/a&gt;
no Computaria.&lt;/p&gt;
&lt;p&gt;Fiquei animado porque ele estava pedindo para mim e seria minha
primeira experiência resolvendo o problema de outra pessoa com código. Por outro
lado, fiquei com o pé atrás pois eu tenho um conhecimento superficial de CSS e o
pedido do Jeff caiu como um caso de aplicação do CSS que meu conhecimento não
contempla. Mesmo com essa desvantagem clara, resolvi aceitar. Afinal não é todo
dia que alguém me pede para solucionar seu problema.&lt;/p&gt;
&lt;p&gt;Cheguei em casa, instalei o ruby, gems e o jekylls. Clonei o Computaria e
botei pra rodar. Dando uma olhada percebi que minhas alterações seriam no
&lt;code&gt;_layouts/post.html&lt;/code&gt; e no &lt;code&gt;_sass/_layout.scss&lt;/code&gt;. Mexi aqui, ali e nada do que
eu queria acontecia, então decidi iniciar uma POC só com HTML e CSS.&lt;/p&gt;
&lt;h2&gt;Trabalhando na POC&lt;/h2&gt;
&lt;p&gt;Comecei com a tag &lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt; + um WIP do coelho só para posicionar e ter uma
ideia de como ficaria porque o Jeff queria esse trabalho CSS-only.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://computaria.gitlab.io/blog/assets/colocando-coelhinhos-no-computaria/primeira-tentativa-no-computaria.png&quot; alt=&quot;Coelho ao lado direito do título do post &amp;quot;Colocando coelhinhos no computaria e enlouquecendo&amp;quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;O Jeff disse que poderia ficar atrás do título também e quando fui tentar fazer
isso, usei o combo &lt;code&gt;position: relative;&lt;/code&gt; + &lt;code&gt;position: absolute;&lt;/code&gt; + &lt;code&gt;z-index: 0 e 1;&lt;/code&gt;.
Se você conhece CSS provavelmente sabe que &lt;code&gt;position: absolute;&lt;/code&gt; é cilada quase
sempre.&lt;/p&gt;
&lt;p&gt;Falei pro Jeff que cheguei perto do resultado esperado usando posição absoluta e
ele prontamente ficou com o pé atrás:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Absolute 😨&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Será que seria possível botar como um :after associado a classe do título?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dei uma pesquisadinha sobre o &lt;code&gt;:after&lt;/code&gt; e consegui remover o posicionamento
absoluto. A primeira vitória!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.post-title:after {
  position: relative;
  content: &quot;&quot;;
  display: inline-block;
  transform: translateY(20%);
  width: 80px;
  height: 80px;
  background-image: url(&apos;caminho/para/a/imagem-do-coelho.png&apos;);
  background-size: cover;
  z-index: -1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Posicionando coelhos nas laterais&lt;/h2&gt;
&lt;p&gt;A primeira coisa que pensei aqui, foi: &quot;vou usar um &lt;code&gt;background-repeat&lt;/code&gt; e dar
um espacinho entre cada repetição&quot;. Depois de vários tentativas e combinações
diferentes das propriedades &lt;code&gt;background-algumacoisa&lt;/code&gt; o melhor resultado foi esse:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://computaria.gitlab.io/blog/assets/colocando-coelhinhos-no-computaria/coelhos-nas-laterais.png&quot; alt=&quot;POC do Computaria com coelhos nas laterais, ficou bem estranho&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Abalou tudo! Eu não tinha entendido o que o Jeff queria com o &quot;coelhos nas
laterais&quot;, porém certamente não era isso. Tentei, tentei e a cada teste eu entendia
menos sobre as diferenças entre as propriedades em torno do &lt;code&gt;background-repeat&lt;/code&gt;.
Enlouqueci...&lt;/p&gt;
&lt;h2&gt;Aplicando no Computaria&lt;/h2&gt;
&lt;p&gt;Voltando ao Computaria após entender algumas coisas com a POC, fui direto no
&lt;code&gt;_sass/_layout.scss&lt;/code&gt; que eu comentei e adicionei aquele código ali em cima na
classe &lt;code&gt;.post-title:after&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Rodei o Computaria com &lt;code&gt;bundle exec jekyll serve&lt;/code&gt; e depois de abrir alguns posts
percebi que quando o título era grande demais o coelho podia ficar sozinho na
linha de baixo ou obstruir parte do texto acima. E agora?&lt;/p&gt;
&lt;p&gt;Mandei pro Jeff e ele disse que o coelho podia ficar na esquerda (espelhado horizontalmente)
e aqui está a versão final do coelho no título:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- .post-title:after {
+ .post-title:before {
    position: relative;
    content: &quot;&quot;;
    display: inline-block;
-   transform: translateY(20%);
+   transform: scaleX(-1) rotate(-15deg) translateY(20%);
    width: 80px;
    height: 80px;
    background-image: url(&apos;caminho/para/a/imagem-do-coelho.png&apos;);
    background-size: cover;
    z-index: -1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora falta colocar os coelhos nas laterais. O maior desafio de todos os tempos
(para um não-especialista em CSS como eu)!&lt;/p&gt;
&lt;p&gt;Se liga no que aconteceu, eu comecei a encarar a página do Computaria e reparei
nos ícones do lado dos metadados do artigo. Os ícones em questão são as logos do
GitLab e do &lt;a href=&quot;https://github.com/bolodissenoura/pixmeacoffee&quot;&gt;pixmeacoffee&lt;/a&gt; 🤩&lt;/p&gt;
&lt;p&gt;Na hora me lembrei do fundo do dashboard do &lt;a href=&quot;https://www.pixme.bio/&quot;&gt;pixmeacoffee&lt;/a&gt;.
Esse aqui:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://computaria.gitlab.io/blog/assets/colocando-coelhinhos-no-computaria/dashboard-pixmeacoffee.png&quot; alt=&quot;Dashboard do pixmeacoffee com vários cafés ao fundo, bem discretos&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mandei pro Jeff e ele gostou da ideia. Peguei a arte final do coelho, desenhado
pelo artista &lt;a href=&quot;https://twitter.com/arorok_&quot;&gt;@arorok_&lt;/a&gt;, abri um canvas no &lt;a href=&quot;https://krita.org/en/&quot;&gt;Krita&lt;/a&gt;
e fiz um fundo inspirado no pixmeacoffee. Se você está lendo esse post, provavelmente
pode ver o fundo que eu fiz.&lt;/p&gt;
&lt;p&gt;Inclusive, quer me pagar um café 😅? &lt;a href=&quot;https://www.pixme.bio/kauefraga&quot;&gt;Pix me a coffee&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Obrigado por ler e ao Jeff pelo convite ❤&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Personalizando o README do seu projeto</title><link>https://kauefraga.dev/blog/personalizando-o-readme-do-seu-projeto/</link><guid isPermaLink="true">https://kauefraga.dev/blog/personalizando-o-readme-do-seu-projeto/</guid><pubDate>Sun, 24 Mar 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opa, tudo tranquilo?&lt;/p&gt;
&lt;p&gt;Continuando a série sobre READMEs, agora vamos falar da personalização 🤩&lt;/p&gt;
&lt;p&gt;Vamos usar markdown para customizar o README do seu projeto com seções, frases, ícones/insígnias, etc. Se você não tem ideia do que é markdown e README, recomendo ler o primeiro artigo desta série, &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/introducao-ao-markdown-e-aos-readmes&quot;&gt;Introdução ao markdown e aos READMES&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Estruturando o README&lt;/h2&gt;
&lt;p&gt;Pense no &lt;strong&gt;modo que você quer expor as informações do seu projeto&lt;/strong&gt;. Defina uma hierarquia e use vários identificadores (seções, negrito, código...).&lt;/p&gt;
&lt;p&gt;Depois de fazer alguns projetos e espiar um bocado de projetos alheios, eu normalmente estruturo meu projeto da seguinte forma:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Título ou nome do projeto&lt;/li&gt;
&lt;li&gt;Descrição&lt;/li&gt;
&lt;li&gt;Funcionalidades&lt;/li&gt;
&lt;li&gt;Como instalar/rodar/usar&lt;/li&gt;
&lt;li&gt;Licença&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;É isso! Simples, não?&lt;/p&gt;
&lt;p&gt;Você pode adicionar mais informações, mas eu acredito que essas sejam essenciais.&lt;/p&gt;
&lt;p&gt;Se você não sabe o que adicionar, pense em quais informações são importantes para o projeto. Eu tenho algumas sugestões:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documente as tecnologias e a escolha delas&lt;/li&gt;
&lt;li&gt;descreva a arquitetura, os padrões de projetos e o porquê dessas decisões&lt;/li&gt;
&lt;li&gt;dedique uma seção a sua API (interna ou não)&lt;/li&gt;
&lt;li&gt;liste as variáveis de ambiente necessárias para executar o projeto&lt;/li&gt;
&lt;li&gt;exemplifique a utilização do projeto (código ou imagem/vídeo)&lt;/li&gt;
&lt;li&gt;explique os passos necessários para contribuir&lt;/li&gt;
&lt;li&gt;mencione os contribuidores&lt;/li&gt;
&lt;li&gt;diga se tem testes e como roda-los&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Estilizando essas informações com markdown&lt;/h2&gt;
&lt;p&gt;Fique atento, em algumas partes eu vou adicionar só a opção discutida (incremental mesmo) e em outras eu vou reescrever boa parte do código já mostrado porque alguma coisinha ali foi alterada.&lt;/p&gt;
&lt;h3&gt;Especifique o título&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: tente criar um nome explicativo e memorável para o seu projeto, por mais difícil que isso seja 😅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Título do projeto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Centralizado:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1 align=&apos;center&apos;&amp;gt;Nome do projeto&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Não é possível centralizar com markdown, por isso usamos HTML.&lt;/p&gt;
&lt;h3&gt;Adicione insígnias legais ao seu projeto&lt;/h3&gt;
&lt;p&gt;Veja no site &lt;a href=&quot;https://shields.io&quot;&gt;shields.io&lt;/a&gt;. Segue as que eu mais uso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linguagem mais utilizada&lt;/li&gt;
&lt;li&gt;Último commit&lt;/li&gt;
&lt;li&gt;Palavras/frase estática&lt;/li&gt;
&lt;li&gt;Licença&lt;/li&gt;
&lt;li&gt;Downloads (GitHub releases, crates.io, npm...)&lt;/li&gt;
&lt;li&gt;Versão mais recente&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Título do projeto

![Linguagem mais utilizada](https://img.shields.io/github/languages/top/:nomedeusuario/:nomedorepositorio)
![Último commit](https://img.shields.io/github/last-commit/:nomedeusuario/:nomedorepositorio)
![README bem legal](https://img.shields.io/badge/readme-bem_legal-8A2BE2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Centralizado:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div align=&apos;center&apos;&amp;gt;
	&amp;lt;h1&amp;gt;Nome do projeto&amp;lt;/h1&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/github/languages/top/:nomedeusuario/:nomedorepositorio&apos; alt=&apos;Linguagem mais utilizada&apos; /&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/github/last-commit/:nomedeusuario/:nomedorepositorio&apos; alt=&apos;Último commit&apos; /&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/badge/readme-bem_legal-8A2BE2&apos; alt=&apos;README bem legal&apos; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lembre-se de trocar as informações &lt;code&gt;:nomedeusuario&lt;/code&gt; e &lt;code&gt;:nomedorepositorio&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Coloque uma descrição&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Título do projeto

![Linguagem mais utilizada](https://img.shields.io/github/languages/top/:nomedeusuario/:nomedorepositorio)
![Último commit](https://img.shields.io/github/last-commit/:nomedeusuario/:nomedorepositorio)
![README bem legal](https://img.shields.io/badge/readme-bem_legal-8A2BE2)

Esta é a descrição do meu projeto super legal.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descrição como citação:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; Esta é a descrição do meu projeto super legal.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Centralizado:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div align=&apos;center&apos;&amp;gt;
	&amp;lt;h1&amp;gt;Nome do projeto&amp;lt;/h1&amp;gt;
	&amp;lt;p&amp;gt;Esta é a descrição do meu projeto super legal.&amp;lt;/p&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/github/languages/top/:nomedeusuario/:nomedorepositorio&apos; alt=&apos;Linguagem mais utilizada&apos; /&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/github/last-commit/:nomedeusuario/:nomedorepositorio&apos; alt=&apos;Último commit&apos; /&amp;gt;
	&amp;lt;img src=&apos;https://img.shields.io/badge/readme-bem_legal-8A2BE2&apos; alt=&apos;README bem legal&apos; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Diga quais são as funcionalidades&lt;/h3&gt;
&lt;p&gt;As funcionalidades podem ser capacidades, rotas ou o que seu projeto fizer.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;### Funcionalidades

- Este projeto é capaz de automatizar um processo muito chato
- Este projeto é muito performático
- Este projeto é amigável e intuitivo
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## Features

- [x] Este projeto é capaz de receber requisições e responder
- [x] Este projeto é capaz de lidar com requisições simultaneamente, graças ao controle de concorrência implementado
- [ ] Este projeto pode teletransportar uma pessoa para qualquer lugar do planeta a qualquer momento
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perceba a alteração das palavras (funcionalidades e features), nível da seção (h3 e h2) e lista (não-marcada e marcada). Faça como quiser.&lt;/p&gt;
&lt;h3&gt;Como instalar e rodar&lt;/h3&gt;
&lt;p&gt;Aqui você precisa descrever o processo de instalação e execução/utilização do seu projeto.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Como instalar e rodar

1. Clone o repositório
2. Instale as dependências
3. Execute o comando x

&amp;lt;-----&amp;gt;bash
git clone https://github.com/usuario/repositorio.git
cd repositorio

npm i
go mod download
cargo build

npm run start
go run cmd/main.go
cargo run src/main.rs
&amp;lt;-----&amp;gt;

Obs.: uma observação muito interessante.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Substitua esses &lt;code&gt;&amp;lt;-----&amp;gt;&lt;/code&gt; por crases triplas (bloco de código).&lt;/p&gt;
&lt;h3&gt;Instrua contribuidores&lt;/h3&gt;
&lt;p&gt;Uma seção dedicada a como contribuir pode ser muito útil. Detalhe o processo de contribuição.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Contribuindo

Sinta-se livre para contribuir, criar uma issue para reportar um bug, sugerir um alteração na API, uma melhoria ou uma feature. Fique à vontade.

### Como contribuir

1. Faça um fork desse repositório
2. Clone seu fork na sua máquina
3. Faça alterações, commit e dê push
4. Abra um pull request (escreva uma mensagem descritiva sobre o que você alterou)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mencionar os seus contribuidores e declarar sua gratidão é bacana também. Coloque o ícone dos seus contribuidores.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;### Contribuidores

Meus agradecimentos a essas pessoas incríveis:

[![notshwuy GitHub profile picture](https://github.com/notshwuy.png?size=50)](https://github.com/notshwuy)
[![FelipeMCassiano GitHub profile picture](https://github.com/FelipeMCassiano.png?size=50)](https://github.com/FelipeMCassiano)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Exponha a licença&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;## Licença

Este projeto está sob a licença y - Veja a [LICENÇA](https://github.com/usuario/repositorio/blob/main/LICENSE) para mais informações.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Resultado final&lt;/h2&gt;
&lt;p&gt;Veja como ficou o README copiando e colando direto daqui:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/resultado-final.png&quot; alt=&quot;resultado final&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Basicamente é isso. Lembra que o README é um &quot;cartão de visitas&quot; para o seu projeto? O que você quer mostrar aos seus visitantes? Você deve montar seu README pensando nas informações que são relevantes para o seu projeto. A partir disso, escreva e refine ao longo do tempo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt;: dependendo do lugar que você pretende colocar seu README (GitHub, GitLab, Bitbucket...) pode existir um &lt;em&gt;superset&lt;/em&gt; do markdown como diz &lt;a href=&quot;https://www.markdownguide.org/extended-syntax/#lightweight-markup-languages&quot;&gt;o Markdown Guide em &lt;em&gt;extended syntax&lt;/em&gt;&lt;/a&gt;, que adiciona marcações e melhora o comportamento de algumas existentes.&lt;/p&gt;
&lt;p&gt;Se você usa o Visual Studio Code para escrever seus READMEs, eu tenho extensões para recomendar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bierner.markdown-checkbox&quot;&gt;Markdown Checkbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bierner.markdown-emoji&quot;&gt;Markdown Emoji&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid&quot;&gt;Markdown Mermaid (diagramas e fluxogramas)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bierner.markdown-preview-github-styles&quot;&gt;Markdown GitHub Styles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint&quot;&gt;Markdown Lint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Também selecionei alguns dos meus melhores READMEs para você ter uma ideia de como eu faço:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/esquilo-aniquilador&quot;&gt;esquilo aniquilador&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/eco&quot;&gt;eco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/ariprog&quot;&gt;ariprog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/anime-archive&quot;&gt;anime archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kauefraga/node-typescript-server&quot;&gt;node typescript server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obrigado por ler 💜&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Introdução ao markdown e aos READMEs</title><link>https://kauefraga.dev/blog/introducao-ao-markdown-e-aos-readmes/</link><guid isPermaLink="true">https://kauefraga.dev/blog/introducao-ao-markdown-e-aos-readmes/</guid><pubDate>Mon, 18 Mar 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Olá, tudo certo?&lt;/p&gt;
&lt;p&gt;Hoje vou falar sobre o que é um README, o que é markdown, como escrever um README básico e por que você deveria aprender a sintaxe markdown e escrever READMEs. Bora?&lt;/p&gt;
&lt;h2&gt;O que é um README&lt;/h2&gt;
&lt;p&gt;Começando pelo começo, você provavelmente já viu projetos de outros desenvolvedores ou instalou um projeto, uma solução ou um jogo de origem duvidosa e se deparou com aquele arquivo &lt;code&gt;README&lt;/code&gt;, &lt;code&gt;README.txt&lt;/code&gt; ou &lt;code&gt;README.md&lt;/code&gt;. Caso nunca tenha visto, tudo bem.&lt;/p&gt;
&lt;p&gt;A tradução de &lt;em&gt;read me&lt;/em&gt; é &quot;leia me&quot; e, resumidamente, um README é um arquivo que fica junto de um projeto e serve como um cartão de visita para o mesmo, contendo informações sobre o projeto como: objetivo, capacidade, instalação, documentação em geral, licença, etc.&lt;/p&gt;
&lt;p&gt;Deu pra perceber a importância dos READMEs?&lt;/p&gt;
&lt;p&gt;Um README geralmente é escrito em markdown, uma linguagem de marcação assim como o HTML. Dito isso, a forma mais comum desse arquivo é essa: &lt;code&gt;README.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;O que é markdown&lt;/h2&gt;
&lt;p&gt;Markdown é uma linguagem de marcação simplificada e de fácil uso. O primeiro processador de markdown foi o próprio &lt;a href=&quot;https://daringfireball.net/projects/markdown&quot;&gt;Markdown&lt;/a&gt; feito pelo John Gruber com a linguagem de programação Perl. Ele tinha o objetivo de ser uma ferramenta de conversão de markdown para HTML.&lt;/p&gt;
&lt;p&gt;Atualmente existem vários processadores Markdown e variações (ou &lt;em&gt;supersets&lt;/em&gt;) da sintaxe, permitindo novas marcações e diferentes saídas. Por exemplo, de markdown para PDF.&lt;/p&gt;
&lt;p&gt;Veja um resumo ou &lt;em&gt;cheatsheet&lt;/em&gt; da sintaxe markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Isto é um título ou um h1 em HTML
## Isto é um subtítulo ou um h2 em HTML
### Você já entendeu... vai até o h6 ou ######

Isto é um parágrafo e a palavra **negrito** está em negrito, enquanto a palavra *itálico* está em itálico. ~~riscado~~ e [link](https://example.com).

- eu sou um item em uma lista desordenada
- eu sou outro item na lista desordenada
- eu sou mais um item

&amp;gt; Uma citação blablablablablabla

1. eu sou o primeiro item de uma lista ordenada
2. eu sou o segundo item
3. eu sou o terceiro!

![este é o texto alternativo de uma imagem](https://example.com/imagem.png)

---

Estou abaixo do divisor horizontal.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E o resultado:&lt;/p&gt;
&lt;h2&gt;Isto é um subtítulo ou um h2 em HTML&lt;/h2&gt;
&lt;h3&gt;Você já entendeu... vai até o h6 ou&lt;/h3&gt;
&lt;p&gt;Isto é um parágrafo e a palavra &lt;strong&gt;negrito&lt;/strong&gt; está em negrito, enquanto a palavra &lt;em&gt;itálico&lt;/em&gt; está em itálico. &lt;s&gt;riscado&lt;/s&gt; e &lt;a href=&quot;https://example.com&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eu sou um item em uma lista desordenada&lt;/li&gt;
&lt;li&gt;eu sou outro item na lista desordenada&lt;/li&gt;
&lt;li&gt;eu sou mais um item&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Uma citação blablablablablabla&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;eu sou o primeiro item de uma lista ordenada&lt;/li&gt;
&lt;li&gt;eu sou o segundo item&lt;/li&gt;
&lt;li&gt;eu sou o terceiro!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://example.com/imagem.png&quot; alt=&quot;este é o texto alternativo de uma imagem&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Estou abaixo do divisor horizontal.&lt;/p&gt;
&lt;p&gt;Uma ótima referência para você se aprofundar é o &lt;a href=&quot;https://www.markdownguide.org&quot;&gt;Markdown Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Por que aprender markdown e escrever READMEs&lt;/h2&gt;
&lt;p&gt;Escrever é algo muito importante na vida de um desenvolvedor. Todo projeto, decisão ou solução deveria ter uma documentação que defina, explique e/ou demonstre essas coisas.&lt;/p&gt;
&lt;p&gt;Saber markdown facilita muito sua vida ao oferecer uma sintaxe simples e ser convertido em HTML, além de ser quase uma convenção (se não for) no quesito escrita técnica.&lt;/p&gt;
&lt;h2&gt;Resumo (tl;dr)&lt;/h2&gt;
&lt;p&gt;Markdown é uma linguagem de marcação que tem uma sintaxe simples, pode ser convertida para HTML e, com isso, ela pode ser usada para escrever textos formatados. Por ser fácil de ler e escrever, o markdown tem uma alta adoção na comunidade de desenvolvimento de software.&lt;/p&gt;
&lt;p&gt;O README é como um cartão de visitas e serve para expor os detalhes mais relevantes de um projeto. Pode ser qualquer tipo de arquivo mas normalmente é escrito usando markdown, então um README geralmente tem a extensão &lt;code&gt;.md&lt;/code&gt; para demonstrar isso.&lt;/p&gt;
&lt;p&gt;Para conhecer a sintaxe, veja essa &lt;em&gt;cheatsheet&lt;/em&gt;: &lt;a href=&quot;https://www.markdownguide.org/cheat-sheet&quot;&gt;Markdown Cheat Sheet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt;: esse texto foi escrito inteiramente em markdown e faz parte de uma série sobre READMEs :)&lt;/p&gt;
&lt;p&gt;Obrigado por ler ❤&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Eco, minha implementação em Rust do programa echo</title><link>https://kauefraga.dev/blog/eco/</link><guid isPermaLink="true">https://kauefraga.dev/blog/eco/</guid><pubDate>Sat, 24 Feb 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Links: &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/eco-minha-implementacao-em-rust-do-programa-echo&quot;&gt;TabNews&lt;/a&gt;, &lt;a href=&quot;https://dev.to/kauefraga/eco-minha-implementacao-em-rust-do-programa-echo-34jh&quot;&gt;DevTo&lt;/a&gt; e &lt;a href=&quot;https://twitter.com/rkauefraga/status/1761391229986599342&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hey, folks!&lt;/em&gt; Hoje quero falar sobre o meu mini-projeto, chamado &quot;eco&quot;.&lt;/p&gt;
&lt;p&gt;O programa &lt;code&gt;echo&lt;/code&gt; basicamente pega argumentos (entrada) e imprime eles na tela do seu console (&lt;em&gt;stdout&lt;/em&gt;). O eco, atualmente, faz isso também. Escolhi esse nome porque eu sempre li o programa &lt;code&gt;echo&lt;/code&gt; como /ɛko/. Como eu disse, o &lt;code&gt;echo&lt;/code&gt; pega a entrada e devolve a mesma coisa, similar a uma reverberação, um &lt;strong&gt;eco&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A iniciativa do projeto surgiu quando pesquisei por projetos para fazer em Rust, quero praticar!&lt;/p&gt;
&lt;p&gt;A implementação inicial (v0.1.0) foi bem simples, como esperado. Veja o código do commit &lt;a href=&quot;https://github.com/kauefraga/eco/commit/516992e1dd25c1206feed3d10ccd597acc4fc7a8&quot;&gt;516992e&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;use std::env;

fn main() {
    let mut args: Vec&amp;lt;String&amp;gt; = env::args().collect();

    /*
     * Read the `remove` docstring.
     * This `remove(0)` is the worst case,
     * all the arguments are going to be
     * shifted to the left, everytime.
     */
    args.remove(0);

    let mut output = String::new();

    for arg in args {
        output.push_str(&amp;amp;format!(&quot;{arg} &quot;));
    }

    println!(&quot;{}&quot;, output.trim());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Pega os argumentos passados;&lt;/li&gt;
&lt;li&gt;Remove o primeiro argumento, pois ele é o caminho do executável;&lt;/li&gt;
&lt;li&gt;Inicializa uma string dinâmica, chamada &lt;em&gt;output&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Itera sobre os argumentos adicionando cada argumento com o formato &quot;argumento-tal &quot; (argumento + espaço) ao final da string &lt;em&gt;output&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Imprime a string &lt;em&gt;output&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Agora na versão 0.1.2, o código está assim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;use std::collections::VecDeque;
use std::env;
use std::process::exit;

fn main() {
    let mut args: VecDeque&amp;lt;String&amp;gt; = env::args().collect();

    args.pop_front();

    let is_help_needed = (args.len() == 1 &amp;amp;&amp;amp; args[0] == &quot;-h&quot;)
        || (args.len() == 1 &amp;amp;&amp;amp; args[0] == &quot;--help&quot;);
    if is_help_needed {
        println!(&quot;Example: eco-rs Bom dia!&quot;);
        exit(0);
    }

    let mut output = String::new();

    for arg in args {
        output.push_str(&amp;amp;format!(&quot;{arg} &quot;));
    }

    println!(&quot;{}&quot;, output.trim());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alterações:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Na linha &lt;code&gt;args.remove(0)&lt;/code&gt; havia possibilidade de otimização e mesmo sem conhecer VecDeque, que deve ser um vetor bidirecional (entrada e saída por ambos os lados), a fiz. Essa estrutura de dados possibilita a saída de um elemento do início sem precisar mover os elementos posteriores para trás, o que é vantajoso aqui.&lt;/li&gt;
&lt;li&gt;Adicionei um menu de ajuda, que tá bem vazio por sinal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A distribuição está sendo feito pelo crates.io em &lt;a href=&quot;https://crates.io/crates/eco-rs&quot;&gt;eco-rs&lt;/a&gt;. Infelizmente a crate &quot;eco&quot; já existia. O legal é que ao executar o comando &lt;code&gt;cargo install eco-rs&lt;/code&gt; o Cargo pega a crate e compila na arquitetura do seu computador. Com isso, eu não preciso compilar para todas as arquiteturas disponíveis e manter as releases no GitHub também (deveria, quem não gosta de só baixar o executável e pronto?).&lt;/p&gt;
&lt;h3&gt;Conclusão&lt;/h3&gt;
&lt;p&gt;tl;dr: o projeto eco é, atualmente, apenas uma implementação em Rust do programa &lt;code&gt;echo&lt;/code&gt; que pega os argumentos de entrada, junta eles em uma string e imprime a string final na saída do terminal.&lt;/p&gt;
&lt;p&gt;Pretendo fazer mais umas funcionalidades como colorir palavras específicas e criar uma sintaxe de marcação para estilizar também.&lt;/p&gt;
&lt;p&gt;Se quiser acompanhar o projeto, veja &lt;a href=&quot;https://github.com/kauefraga/eco&quot;&gt;o repositório eco&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Você pode me achar no:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/kauefraga&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TabNews: &lt;a href=&quot;https://www.tabnews.com.br/kauefraga&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevTo: &lt;a href=&quot;https://dev.to/kauefraga&quot;&gt;kauefraga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href=&quot;https://twitter.com/rkauefraga&quot;&gt;rkauefraga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obrigado por ler! ❤&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Funcionalidades do Rust</title><link>https://kauefraga.dev/blog/funcionalidades-do-rust/</link><guid isPermaLink="true">https://kauefraga.dev/blog/funcionalidades-do-rust/</guid><pubDate>Mon, 19 Feb 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Olá! Se você quer saber um pouco mais sobre as &lt;strong&gt;principais&lt;/strong&gt; funcionalidades do Rust, então acho que posso ajudar. Bora 👊&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A linguagem de programação Rust tem várias features peculiares e legais! Uma coleção de técnicas que deram certo em outras linguagens e paradigmas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Features abordadas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zero-cost abstractions&lt;/li&gt;
&lt;li&gt;Data Ownership ou Ownership&lt;/li&gt;
&lt;li&gt;Algebraic Type System ou Algebraic Data Types&lt;/li&gt;
&lt;li&gt;Polymorphism&lt;/li&gt;
&lt;li&gt;Async/await&lt;/li&gt;
&lt;li&gt;Meta programming&lt;/li&gt;
&lt;li&gt;Cargo&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Zero-cost abstractions&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;What you don&apos;t use, you don&apos;t pay for. What you do use, you couldn&apos;t hand code any better&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Direto do C++.&lt;/p&gt;
&lt;p&gt;As abstrações (pattern matching, iterators, generics, collections...) de recursos-base (for loops, if/else, raw pointers...) da linguagem não devem consumir nenhum recurso além daqueles já consumidos. Zero custo!&lt;/p&gt;
&lt;h3&gt;Ownership&lt;/h3&gt;
&lt;p&gt;Baseado no RAII (Resource Acquisition Is Initialization) design pattern do C++. Esse padrão de projeto diz: recursos como memória alocada, file handles e database connections devem estar presos a um tempo de vida. Quando um objeto é criado, os recursos são adquiridos e quando o objeto é destruído, os recursos são liberados. Simples. Esse padrão é tão útil porque liberar os recursos é algo facilmente esquecido, você pode ter escrito bastante código antes de precisar liberar e esqueceu, resultando em &lt;em&gt;memory leaks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tão útil que... Rust integrou ele diretamente na linguagem e assim surgiu o Ownership. Para não precisar lembrar de usar esse padrão, o próprio compilador vai te forçar a seguir um conjunto de regras chamado de &quot;ownership rules&quot;.&lt;/p&gt;
&lt;p&gt;Ownership Rules&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cada valor em Rust tem uma variável que é sua dona, ou seja, cada valor tem um dono.&lt;/li&gt;
&lt;li&gt;Só pode existir um dono de uma vez.&lt;/li&gt;
&lt;li&gt;Quando um dono sai de escopo, o valor é largado ou &lt;em&gt;dropped&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Essas regras são combinadas com as chamadas &lt;em&gt;borrowing rules&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Borrowing Rules&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Em um momento qualquer, você pode ter uma referência mutável ou infinitas referências imutáveis.&lt;/li&gt;
&lt;li&gt;Referências DEVEM sempre ser válidas. SEM NULL/NIL NESSA PO@#$!!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Veja também exemplos em [[Rust Ownership]].&lt;/p&gt;
&lt;h3&gt;Algebraic Type System&lt;/h3&gt;
&lt;p&gt;Algebraic data types ou ADTs permitem a criação de tipos compostos usando &lt;em&gt;sum types&lt;/em&gt; e &lt;em&gt;product types&lt;/em&gt;. Geralmente implementado em linguagens funcionais, como Haskell.&lt;/p&gt;
&lt;p&gt;Um &lt;em&gt;product type&lt;/em&gt; é um tipo composto de dois ou mais tipos. Pense em um tipo usuário que tem nome e idade, outros dois tipos, dentro dele. Classes (OO) são um exemplo de product type. Basicamente, toda linguagem que tem um sistema de tipos, tem &lt;em&gt;product types&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Um &lt;em&gt;sum type&lt;/em&gt; é um tipo que pode ser representado por uma lista finita de opções válidas (como um enum).&lt;/p&gt;
&lt;h3&gt;Polymorphism&lt;/h3&gt;
&lt;p&gt;Direto do paradigma de orientação a objetos (OOP), polimorfismo é a capacidade que um objeto ou uma função têm de assumir múltiplas formas ou se comportar diferente dependendo do contexto em que é usada. O polimorfismo geralmente é implementado a partir da herança (&lt;em&gt;inheritance&lt;/em&gt;). Já no Rust, o polimorfismo é implementado com &lt;em&gt;traits&lt;/em&gt; e &lt;em&gt;generics&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Traits definem um conjunto de funções/métodos que um tipo pode implementar, parecido com interfaces em outras linguagens. Lembre-se, tipos podem implementar múltiplos traits e traits podem ter implementações por padrão (default).&lt;/p&gt;
&lt;p&gt;Generics te permitem escrever código abstrato em relação ao tipo, que te leva a código reutilizável e eficiente. Você pode dizer que um tipo necessário para uma função, não é algo específico, mas algo que implemente funções específicas.&lt;/p&gt;
&lt;p&gt;O sistema de traits (&lt;em&gt;trait system&lt;/em&gt;) em Rust tem sua raiz nas &lt;em&gt;type classes&lt;/em&gt; do Haskell. Rust implementa o &lt;em&gt;trait system&lt;/em&gt; juntamente do ownership/borrowing e lifetimes, que são um dos motivos da garantia de &lt;em&gt;memory-safety&lt;/em&gt;. Alguns benefícios em relação a herança:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flexibilidade e composição&lt;/li&gt;
&lt;li&gt;Não-invasivo e extensível&lt;/li&gt;
&lt;li&gt;Evita o problema de classes bases frágeis (&lt;em&gt;fragile base class problem&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Static dispatch by default e performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Async/await&lt;/h3&gt;
&lt;p&gt;Rust roubou a sintaxe &lt;code&gt;async/await&lt;/code&gt; para programação assíncrona da linguagem de programação JavaScript. O paradigma assíncrono permite que tarefas sejam executadas independentemente e concorrentemente sem bloquear a execução do programa principal. O JavaScript usa Promises para representar o resultado de uma operação assíncrona e para utilizar esse resultado é necessário usar os métodos &lt;code&gt;.then()&lt;/code&gt;, &lt;code&gt;.catch()&lt;/code&gt; e &lt;code&gt;.finally()&lt;/code&gt;. O problema é que esses métodos podem levar a um código aninhado e complexo. A sintaxe &lt;code&gt;async/await&lt;/code&gt; no JavaScript permite que código assíncrono seja escrito da forma como código síncrono é escrito, sem usar then, catch e finally. No final é só um syntactic sugar para trabalhar com as Promises.&lt;/p&gt;
&lt;p&gt;O Rust adotou a programação assíncrona de maneira parecida. Notação &lt;code&gt;async&lt;/code&gt; antes de &lt;code&gt;fn&lt;/code&gt; e &lt;code&gt;.await?&lt;/code&gt; a cada chamada assíncrona. O ponto de interrogação serve para propagar erros. Como em JavaScript, &lt;code&gt;async/await&lt;/code&gt; em Rust é um syntactic sugar para trabalhar com Futures (similar a Promises). Algumas diferenças do Rust para o JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O &lt;code&gt;async/await&lt;/code&gt; em Rust segue o princípio de abstração sem custo (zero-cost abstraction).&lt;/li&gt;
&lt;li&gt;Em Rust, Futures foram moldados para serem preguiçosos (lazy), ou seja, eles não começam até que sejam explicitamente chamados e &quot;esperados&quot; (&lt;em&gt;awaited&lt;/em&gt;). Com isso, Futures podem ser agendados, compostos e combinados com outros Futures sem esforço desnecessário. No JavaScript, quando uma Promise é criada a operação assíncrono já começa em seguida, mesmo se a Promise não tiver sido &quot;esperada&quot; (&lt;em&gt;awaited&lt;/em&gt;) ainda.&lt;/li&gt;
&lt;li&gt;JavaScript é single-threaded e tem uma implementação que cria a ilusão do paralelismo. Rust tem paralelismo de verdade, podendo executar operações concorrentes em paralelo usando múltiplas threads.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Meta programming&lt;/h3&gt;
&lt;p&gt;O Rust tem uma feature muito poderosa, os macros. Para entender os macros, vamos falar de meta programação.&lt;/p&gt;
&lt;p&gt;Meta programação é uma técnica que permite um programa a manipular ou gerar código durante a compilação (&lt;em&gt;compile time&lt;/em&gt;) ou execução (&lt;em&gt;runtime&lt;/em&gt;). Macros são um recurso do Rust que permite o desenvolvedor a definir uma sintaxe customizada e fazer geração de código ou transformação de código. Eles permitem a meta programação com uma forma de escrever código que gera ou altera outro código durante a compilação (&lt;em&gt;compile time&lt;/em&gt;).&lt;/p&gt;
&lt;h3&gt;Cargo&lt;/h3&gt;
&lt;p&gt;Inspirado no NPM (node package manager) do NodeJS, o Cargo é a ferramenta oficial de building e gerenciamento de pacotes do Rust. Com simples comandos no terminal é possível instalar as dependências de um projeto, compilar o projeto, testar o projeto, etc. O crates.io é onde ficam as caixas/crates, os pacotes do ecossistema Cargo. O &lt;code&gt;package.json&lt;/code&gt; em JavaScript é o &lt;code&gt;cargo.toml&lt;/code&gt; em Rust.&lt;/p&gt;
&lt;p&gt;Obrigado por ler! ❤&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fontes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/4YU_r70yGjQ&quot;&gt;Rust is not a faster horse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/784JWR4oxOI&quot;&gt;All Rust features explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabnews.com.br/kauefraga/funcionalidades-do-rust&quot;&gt;TabNews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/funcionalidades-do-rust-2bem&quot;&gt;DevTo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Introdução ao Rust</title><link>https://kauefraga.dev/blog/introducao-ao-rust/</link><guid isPermaLink="true">https://kauefraga.dev/blog/introducao-ao-rust/</guid><pubDate>Sun, 18 Feb 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Olá! Se você quer aprender ou está estudando a linguagem de programação Rust assim como eu, acho que aqui consegui sintetizar bem a linguagem nesse texto introdutório. Bora lá!!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rust é uma linguagem de programação eficiente e segura.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Na seção &quot;Por que Rust?&quot; do site &lt;a href=&quot;https://www.rust-lang.org&quot;&gt;Rust Lang&lt;/a&gt; eles dizem: Rust é rápido e tem consumo de memória eficiente; Rust é confiável porque tem um rico sistema de tipos, além do modelo &quot;ownership&quot; que garante &lt;em&gt;memory-safety&lt;/em&gt; e &lt;em&gt;thread-safety&lt;/em&gt;; Programar em Rust é produtivo pois tem uma ótima documentação, boas mensagens de erro do compilador e fantásticas ferramentas (como compilador, gerenciador de pacotes, formatador...). No mesmo site, a linguagem é recomendada para fazer CLIs (interfaces de linha de comando), WebAssembly, Networking e Embedded programming (embarcados).&lt;/p&gt;
&lt;p&gt;Não se limitando a esses campos, Rust é visto no desenvolvimento de sistemas operacionais, jogos, APIs, Web, Crypto e a lista continua aumentando. Tem um futuro brilhante.&lt;/p&gt;
&lt;p&gt;As principais ferramentas do Rust são: Rustup e Cargo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rustup serve para gerenciar o Rust (versão, plataforma...)&lt;/li&gt;
&lt;li&gt;Cargo serve para gerenciar seu projeto em Rust, desde a criação até o build.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sobre o gerenciador de pacotes:&lt;/p&gt;
&lt;p&gt;Cada pacote no Rust tem diversas features que podem ser desabilitadas ou não, reduzindo o tempo de compilação e o tamanho do executável final.&lt;/p&gt;
&lt;p&gt;Os pacotes são instalados e publicados com a ferramenta Cargo e são distribuídos pelo &lt;a href=&quot;https://crates.io&quot;&gt;crates.io&lt;/a&gt; (assim como o &lt;a href=&quot;https://www.npmjs.com&quot;&gt;npmjs.com&lt;/a&gt;). Além disso, a documentação dos pacotes é centralizada em &lt;a href=&quot;https://docs.rs&quot;&gt;docs.rs/nome-no-pacote&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para aprender Rust:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/rust-by-example&quot;&gt;Rust by examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/book&quot;&gt;Rust book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@letsgetrusty&quot;&gt;Let&apos;s Get Rusty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De acordo com &lt;a href=&quot;https://youtu.be/4YU_r70yGjQ&quot;&gt;esse vídeo&lt;/a&gt; (Rust is not a faster horse), Rust não é um substituto para C, você está procurando Zig. Rust não é um substituto para C++, você está procurando Go. &quot;Rust não é um cavalo mais rápido, é um foguete!&quot;.&lt;/p&gt;
&lt;p&gt;É isso! Pretendo postar mais conteúdo sobre Rust. Inclusive, quem viu minha primeira postagem (&lt;a href=&quot;https://dev.to/kauefraga/aprendendo-rust-4pb5&quot;&gt;Aprendendo Rust&lt;/a&gt;) sabe que eu já tenho alguns textos escritos, vou adapta-los e publicá-los, ao final espero ter uma espécie de guia introdutório da linguagem de programação Rust.&lt;/p&gt;
&lt;p&gt;Obrigado por ler! ❤&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabnews.com.br/kauefraga/introducao-ao-rust&quot;&gt;TabNews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/introducao-ao-rust-463o&quot;&gt;DevTo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>Meu primeiro post no dev.to</title><link>https://kauefraga.dev/blog/meu-primeiro-post-no-devto/</link><guid isPermaLink="true">https://kauefraga.dev/blog/meu-primeiro-post-no-devto/</guid><pubDate>Sun, 18 Feb 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A verdade é que escrevi para o TabNews, copiei e colei no DevTo, mas ninguém precisa saber... 😂&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabnews.com.br/kauefraga/aprendendo-rust&quot;&gt;Post no TabNews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/kauefraga/aprendendo-rust-4pb5&quot;&gt;Post no DevTo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Texto&lt;/h2&gt;
&lt;p&gt;Olá! 👋&lt;/p&gt;
&lt;p&gt;Assisti &lt;a href=&quot;https://www.youtube.com/live/aXQenZGvLrQ&quot;&gt;uma live do Navarro&lt;/a&gt; sobre a Rinha de Backend em que ele usa a linguagem de programação Rust. Ao assisti-lo codando e explicando (não vou mentir, ele tem uma ótima didática) fiquei fascinado pela linguagem. Eu já tive contato com ela ao fazer o curso de Rust da Alura, mas confesso que não dei continuidade.&lt;/p&gt;
&lt;p&gt;Dessa vez, cativado, pretendo ir adiante com a linguagem e fazer dela, parte das minhas ferramentas. Com o meu espírito entusiasta, acabei me empolgando nos estudos hoje e escrevi três textos introdutórios para mim, sobre Rust, algumas de suas funcionalidades e seu carro-chefe, Ownership. Para quem quiser ver (e quem sabe corrigir):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/rkauefraga/status/1758958622518743272&quot;&gt;Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/rkauefraga/status/1759008932385755258&quot;&gt;Rust Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/rkauefraga/status/1759011206629621985&quot;&gt;Rust Ownership&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Partindo disso, gostaria de saber quais tópicos vocês recomendam para entender Rust e ser um Rustáceo de verdade 🤣&lt;/p&gt;
&lt;p&gt;Brincadeiras à parte, pretendo me aprofundar no Ownership/Borrowing e seguir meus estudos pela &lt;a href=&quot;https://doc.rust-lang.org/book&quot;&gt;documentação principal&lt;/a&gt; e pelo &lt;a href=&quot;https://doc.rust-lang.org/rust-by-example&quot;&gt;Rust by examples&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quais funcionalidades, projetos, conceitos da linguagem Rust vocês recomendam para entender a linguagem Rust e se tornar minimamente proficiente?&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item><item><title>O que são variáveis e constantes</title><link>https://kauefraga.dev/blog/o-que-sao-variaveis-e-constantes/</link><guid isPermaLink="true">https://kauefraga.dev/blog/o-que-sao-variaveis-e-constantes/</guid><pubDate>Sun, 28 Jan 2024 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Veja a postagem do twitter/x &lt;a href=&quot;https://twitter.com/rkauefraga/status/1751298782975648026&quot;&gt;aqui&lt;/a&gt; e veja a postagem do tabnews &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/o-que-sao-variaveis-e-constantes&quot;&gt;aqui&lt;/a&gt;. Comentei &lt;a href=&quot;https://www.tabnews.com.br/kauefraga/o-basico-das-linguagens-de-programacao&quot;&gt;no TabNews&lt;/a&gt; também.&lt;/p&gt;
&lt;p&gt;Tópicos abordados&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O que é uma variável
&lt;ul&gt;
&lt;li&gt;Referência a um pedaço de memória aleatória&lt;/li&gt;
&lt;li&gt;Podem ser acessadas (leitura) ou alteradas (escrita)&lt;/li&gt;
&lt;li&gt;Podem pertencer a um escopo&lt;/li&gt;
&lt;li&gt;Podem ter um tipo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Por que existe e usar&lt;/li&gt;
&lt;li&gt;Como usar uma variável
&lt;ul&gt;
&lt;li&gt;Declaração, atribuição, inicialização e definição&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Olá! Tudo bem? Esse é o primeiro post de uma série sobre conceitos e funcionalidades elementares das linguagens de programação em geral. Meu objetivo é me aproximar da comunidade e ajudar explicando tópicos essenciais para começar a usar uma nova linguagem. Bora?&lt;/p&gt;
&lt;h2&gt;O que é uma variável e por que usar?&lt;/h2&gt;
&lt;p&gt;Uma variável, em um programa, é uma referência a um pedaço (uma posição) de memória que guarda um valor. E geralmente vai ser usado no futuro.&lt;/p&gt;
&lt;p&gt;Pense que uma variável é uma etiqueta colocada numa caixa que tem algo dentro e está em um montante de caixas. Alguém colocou aquelas caixas lá, mas o que importa é que você colou uma etiqueta e agora se você precisar daquela caixa específica você só precisa procurar pela etiqueta.&lt;/p&gt;
&lt;p&gt;As variáveis existem para simplificar e possibilitar a criação de soluções mais complexas e flexíveis. Como você lembraria de algo específico como um valor númerico, um nome, um objeto inteiro? Como acessaria e manipularia dados de outro escopo? E dados vindos do usuário?&lt;/p&gt;
&lt;p&gt;O @maniero escreveu algo interassante sobre variáveis em &lt;a href=&quot;https://pt.stackoverflow.com/q/181332&quot;&gt;uma resposta no Stack Overflow&lt;/a&gt;, acho que vale a menção:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Variável é um &lt;strong&gt;padrão de projeto&lt;/strong&gt; (&lt;em&gt;design pattern&lt;/em&gt;) tão usado, tão simples, e tão presente em linguagens que ninguém enxerga assim. É um padrão para acessar uma posição da memória. Esse padrão torna independentes nome e valor. Isso cria várias oportunidades para expressar algoritmos complexos de forma &lt;strong&gt;poderosa e flexível&lt;/strong&gt;.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eu nunca tinha pensado em variáveis dessa forma e acho que faz muito sentido.&lt;/p&gt;
&lt;p&gt;Já pensou como seria se variáveis não existissem? Acho que não daria pra ir tão longe sem enlouquecer completamente 😅😆.&lt;/p&gt;
&lt;h2&gt;Como usar uma variável?&lt;/h2&gt;
&lt;p&gt;Uma variável tem algumas propriedades principais, são elas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Poder ser acessada (leitura)&lt;/li&gt;
&lt;li&gt;Poder ser alterada (escrita)&lt;/li&gt;
&lt;li&gt;Poder ter um tipo (número, ponto-flutuante, booleano, etc...)&lt;/li&gt;
&lt;li&gt;Poder pertencer a um escopo (um local do código)&lt;/li&gt;
&lt;li&gt;Poder ser declarada e atribuída&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sintaxe&lt;/h3&gt;
&lt;p&gt;Vamos ver a estrutura de uma variável. A sintaxe pode ser um pouco diferente de linguagem para linguagem (vai ser), mas a ideia segue a mesma.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Palavra reservada para DECLARAR a variável*&lt;/li&gt;
&lt;li&gt;Nome da variável&lt;/li&gt;
&lt;li&gt;Tipo da variável**&lt;/li&gt;
&lt;li&gt;Valor da variável***&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;*Algumas linguagens de programação podem não ter palavra reservada para declarar variáveis ou ter e não ser necessária, falando a grosso modo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;**Algumas linguagens conseguem inferir tipos automaticamente (pelo valor atribuído e/ou outras técnicas) e não têm especificação de tipos para o desenvolver utilizar (tipos sempre vão existir por de baixo dos panos). Outras linguagens tem especificação de tipos mas conseguem fazer inferência também, como Python e Go. Isso tem nome: linguagem fortemente tipada, fracamente tipada, estaticamente tipada ou dinamicamente tipada (cada um desses nomes descrevem comportamentos diferentes, acho que valeria um texto só para explicar esse tópico de tipagem das linguagens).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;***O valor da variável não necessariamente precisa ser atribuído quando declaramos uma variável, salvo exceções.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Veja abaixo um exemplo em Golang:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/estrutura.png&quot; alt=&quot;Demonstração da estrutura de uma variável com setas e cores. &apos;var&apos; -&amp;gt; palavra reservada. &apos;idade&apos; -&amp;gt; nome da variável. &apos;int&apos; -&amp;gt; tipo da variável. &apos;= 16&apos; -&amp;gt; atribuição.&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;O que é declaração, atribuição, inicialização e definição?&lt;/h3&gt;
&lt;p&gt;Declaração e atribuição são métodos para dizer ao compilador/interpretador da linguagem de programação que uma variável precisa ser reservada e tem um valor, respectivamente.&lt;/p&gt;
&lt;p&gt;Inicialização e definição por outro lado, são só nomenclaturas pra especializações.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Declaração&lt;/strong&gt; (&lt;em&gt;declaration&lt;/em&gt;) é quando você diz que uma variável deve existir pra ser usada no programa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Atribuição&lt;/strong&gt; (&lt;em&gt;assignment&lt;/em&gt;) é quando você diz que determinada variável tem tal valor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inicialização&lt;/strong&gt; (&lt;em&gt;initialization&lt;/em&gt;) é uma espécie de atribuição. Quando você ATRIBUI um valor a uma variável pela primeira vez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt; (&lt;em&gt;definition&lt;/em&gt;) é só uma forma de dizer que você está DECLARANDO e ATRIBUINDO de uma vez.&lt;/p&gt;
&lt;p&gt;Veja um exemplo de cada:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/declaracao.png&quot; alt=&quot;Exemplo de declaração em Golang&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/atribuicao.png&quot; alt=&quot;Exemplo de atribuição e inicialização na linguagem Go&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/definicao.png&quot; alt=&quot;Exemplo de definição em Golang&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;O que é uma constante?&lt;/h2&gt;
&lt;p&gt;Bom, você verá implementações um pouco diferentes em torno do que é uma constante. No geral, uma constante é uma espécie de variável que não varia durante toda a execução do programa, ou seja, você não pode alterar o valor de uma constante depois de defini-la no seu código. Isso significa que constantes não podem ser redefinidas, redeclaradas nem reatribuídas.&lt;/p&gt;
&lt;p&gt;Alguns compiladores inclusive fazem o processo de inline das suas constantes, ou seja, onde elas forem referenciadas o compilador troca pelo valor delas em tempo de compilação, nesse caso, uma constante não tem um endereço na memória, não é uma espécie de variável, é apenas um valor no seu código que vai ser trocado em tempo de compilação. Legal, não?&lt;/p&gt;
&lt;h2&gt;Fun fact&lt;/h2&gt;
&lt;p&gt;Se você usa uma linguagem que disponibiliza ponteiros e referências para uso, você pode ver onde sua variável &quot;mora&quot; na memória reservada, que eu comentei anteriormente, por exemplo:&lt;/p&gt;
&lt;p&gt;Com esse código em Golang&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/onde-mora.png&quot; alt=&quot;Código Golang&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ao executar, você deve ver&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/execucao-onde-mora.png&quot; alt=&quot;Saída do terminal ao executar o código da imagem acima&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Acho que é isso. Tentei abordar da maneira mais genérica para que quando você estiver dando os primeiros passos em determinada linguagem, você saiba mais ou menos o que pesquisar sobre variáveis e constantes.&lt;/p&gt;
&lt;p&gt;Fez sentido pra você? Gostou da explicação? Se sim, considere um 👍. Se não, o que você acha que faltou?&lt;/p&gt;
&lt;p&gt;Por sinal, a próxima publicação vai ser sobre estruturas condicionais, fica ligado! Obrigado por ler 💜.&lt;/p&gt;
</content:encoded><author>Kauê Fraga Rodrigues &lt;rkauefraga@gmail.com&gt;</author></item></channel></rss>