<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Devhat</title>
    <description>The latest articles on Forem by Devhat (@devhat).</description>
    <link>https://forem.com/devhat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7839%2Faec3df04-0325-423e-b406-a26f0f7b7cad.png</url>
      <title>Forem: Devhat</title>
      <link>https://forem.com/devhat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devhat"/>
    <language>en</language>
    <item>
      <title>Dicas e configurações para seu sistema linux</title>
      <dc:creator>Paulo Victor </dc:creator>
      <pubDate>Fri, 10 May 2024 13:55:52 +0000</pubDate>
      <link>https://forem.com/devhat/dicas-e-configuracoes-para-seu-sistema-linux-5dll</link>
      <guid>https://forem.com/devhat/dicas-e-configuracoes-para-seu-sistema-linux-5dll</guid>
      <description>&lt;p&gt;Fala meu consagrado, quando eu comecei a minha jornada no linux não tinha ninguém para me ajudar e dar dicas de ferramentas para usar no meu terminal e melhorar minha usabilidade, por isso esse guia extra existe, ele ainda faz parte da jornada de configuração do linux, mas é algo bem extra espero que essas dicas possam te ajudar&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos de Terminal
&lt;/h2&gt;

&lt;p&gt;Se você não tem muita experiencia com terminal ou nunca usou um linux na vida, vale a pena ver esse &lt;a href="https://www.hostinger.com.br/tutoriais/comandos-linux" rel="noopener noreferrer"&gt;artigo&lt;/a&gt; e dar um confere em alguns dos comandos que vão te acompanhar pelo dia a dia no linux&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminal mais bonito
&lt;/h2&gt;

&lt;p&gt;Powerlevel10k é um plugin para o shell zsh que te da uma liberdade de personalizar o seu terminal e deixar ele a sua cara&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Antes de começar esse processo recomendo fortemente instalar e configurar alguma fonte de sua preferencia do &lt;a href="https://www.nerdfonts.com/" rel="noopener noreferrer"&gt;nerdfonts&lt;/a&gt;, para suportar os ícones do github&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 https://github.com/romkatv/powerlevel10k.git &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/themes/powerlevel10k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua o tema que está no &lt;code&gt;.zshrc&lt;/code&gt; pelo &lt;code&gt;powerlevel10k/powerlevel10k&lt;/code&gt; e deve ficar assim:&lt;/p&gt;

&lt;p&gt;Restarte o seu terminal e ele aparecerá assim, conclua os passos de acordo com seu gosto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb56saa9co8lfll65vmn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb56saa9co8lfll65vmn.png" alt="Image description" width="787" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira saber mais sobre o powerlevel10k &lt;a href="https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#powerlevel10k" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Alias git
&lt;/h2&gt;

&lt;p&gt;Alguns comando do git pode ser repetitivos e "grandes" caso queira "otimizar" seu digitar de comandos existem esses alias a seguir, é importante que você customize eles ao seu gosto e necessidade&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias g=git
alias ga='git add'
alias gb='git branch'
alias gc='git commit --verbose'
alias gd='git diff'
alias gf='git fetch'
alias gg='git gui citool'
alias gl='git pull'
alias gm='git merge'
alias gp='git push'
alias gr='git remote'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alias parar execução de um contêiner
&lt;/h2&gt;

&lt;p&gt;Esse comando para os contêineres em execução automaticamente sem destruir, a fim de preservar recursos do seu pc, é só adicionar ele no &lt;code&gt;.zshrc&lt;/code&gt; e bau bau&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias docker-down='docker stop $(docker ps -a -q)'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://github.com/LpCodes/Moving-WSL-Distribution-to-Another-Drive" rel="noopener noreferrer"&gt;Transferir wsl para outro disco&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As vezes temos um ambiente de dev todo configurado e queremos transferir ele para outro pc, esse guia abaixo vai te ajudar com isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lazygit
&lt;/h2&gt;

&lt;p&gt;Uma interface gráfica para o git no terminal que pode te ajudar a identificar branchs, fazer cherrypick e até rebase&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O passo a passo a seguir será para a instalação no UBUNTU, caso queria instalar de outra forma, ou em outro ambiente linux, &lt;a href="https://github.com/jesseduffield/lazygit?tab=readme-ov-file#installation" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rode o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LAZYGIT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/jesseduffield/lazygit/releases/latest"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Po&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name": "v\K[^"]*'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
curl &lt;span class="nt"&gt;-Lo&lt;/span&gt; lazygit.tar.gz &lt;span class="s2"&gt;"https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LAZYGIT_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_Linux_x86_64.tar.gz"&lt;/span&gt;
&lt;span class="nb"&gt;tar &lt;/span&gt;xf lazygit.tar.gz lazygit
&lt;span class="nb"&gt;sudo install &lt;/span&gt;lazygit /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a instalação resete se terminal e use o comando &lt;code&gt;lazygit&lt;/code&gt; no seu terminal quando tiver dentro de um repositório q tem git e ele ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbej0gsby8m00wxua04y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbej0gsby8m00wxua04y.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para saber mais sobre os comandos do lazygit, &lt;a href="https://github.com/jesseduffield/lazygit?tab=readme-ov-file#features" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Lazydocker
&lt;/h2&gt;

&lt;p&gt;Dos mesmos criadores de lazygit temos o lazydocker, que tem o intuito de ser uma interface gráfica para o docker no seu terminal, muito útil para ver algum log ou se existe algum container que persistiu, deletar volumes facilmente e outras funcionalidades&lt;/p&gt;

&lt;p&gt;Podemos instalar o programa usando o asdf que deixa tudo bem mais fácil, rode os seguintes comandos no terminal caso tenha o asdf instalado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asdf plugin add lazydocker https://github.com/comdotlinux/asdf-lazydocker.git
asdf list all lazydocker
asdf &lt;span class="nb"&gt;install &lt;/span&gt;lazydocker latest
asdf global lazydocker latest
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias lzd='lazydocker'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após instalar no terminal rode o comando &lt;code&gt;lazydocker&lt;/code&gt; e ele ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsx50de0svquw65mjn3md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsx50de0svquw65mjn3md.png" alt="Image description" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para saber mais sobre os comandos do lazydocker, &lt;a href="https://github.com/jesseduffield/lazydocker?tab=readme-ov-file#cool-features" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Melhor visualização do git log
&lt;/h2&gt;

&lt;p&gt;Esse é um alias de uma visualização de git log, para o git, com ela será possível se orientar de maneira mais fácil, &lt;a href="https://gist.github.com/aalmeida00/b87181f76785b2413d06e56dc6c499db" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;, cole o comando da 1 opção no linux e quando você digitar &lt;code&gt;git lg&lt;/code&gt; a sua visualização de commits vai ficar mais limpa e direta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definição automática de remote push git
&lt;/h2&gt;

&lt;p&gt;O seguinte comando faz uma magica para setar automaticamente o caminho certo do seu push no git, é uma mão na roda, um oferecimento do Andre&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; push.default current
git config &lt;span class="nt"&gt;--global&lt;/span&gt; push.autoSetupRemote &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Definição automática da versão pelo nvm
&lt;/h2&gt;

&lt;p&gt;O @alvarofg conseguiu um script que ativa a versão automatica do node a partir de um nvm assim que se entra em um projeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# place this after nvm initialization!&lt;/span&gt;
autoload &lt;span class="nt"&gt;-U&lt;/span&gt; add-zsh-hook
load-nvmrc&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;node_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nvm version&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;nvmrc_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nvm_find_nvmrc&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$nvmrc_path&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;nvmrc_node_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nvm version &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;nvmrc_path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$nvmrc_node_version&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"N/A"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;nvm &lt;span class="nb"&gt;install
    &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$nvmrc_node_version&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$node_version&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;nvm use
    &lt;span class="k"&gt;fi
  elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$node_version&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nvm version default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Reverting to nvm default version"&lt;/span&gt;
    nvm use default
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
add-zsh-hook chpwd load-nvmrc
load-nvmrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E essa foram algumas das dicas e configurações para seu sistema linux, espero que tenha sido útil, bom código e não se esqueça de seguir nossas redes sociais. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>wsl</category>
      <category>tooling</category>
      <category>programming</category>
    </item>
    <item>
      <title>Instalando de maneira rápida e eficiente suas ferramentas no WSL. Pt-3</title>
      <dc:creator>Paulo Victor </dc:creator>
      <pubDate>Wed, 08 May 2024 13:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/instalando-de-maneira-rapida-e-eficiente-suas-ferramentas-no-wsl-pt-3-307l</link>
      <guid>https://forem.com/devhat/instalando-de-maneira-rapida-e-eficiente-suas-ferramentas-no-wsl-pt-3-307l</guid>
      <description>&lt;p&gt;Opa meu chegado, pronto para a ultima parte desses serie? &lt;br&gt;
Spawnou do nada aqui e não sabe do que se trata ? &lt;a href="https://dev.to/devhat/instalacao-e-configuracao-inicial-do-seu-wsl-pt-1-23m3"&gt;Clica aqui&lt;/a&gt; e vai para o 1 guia dessa serie incrível &lt;/p&gt;

&lt;p&gt;Agora vamos configurar algumas das ferramentas mais utilizadas pela minha pessoa, caso não se interesse por alguma ignore e continue o tutorial&lt;/p&gt;
&lt;h2&gt;
  
  
  NVM
&lt;/h2&gt;

&lt;p&gt;Node version manager é hoje a melhor e mais rápida opção para se instalar o node na sua maquina&lt;/p&gt;

&lt;p&gt;Rode o seguinte comando no seu terminal para&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodar o comando de instalação e a mesma tiver acabado, rode o comando &lt;code&gt;reset&lt;/code&gt; para aplicar as novas mudanças no seu terminal e conseguir usar o &lt;code&gt;nvm&lt;/code&gt; corretamente&lt;/p&gt;

&lt;h3&gt;
  
  
  Instale a versão lst mais recente
&lt;/h3&gt;

&lt;p&gt;Vamos rodar um comando no terminal para poder instalar a versão mais recente do node LTS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--lts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Caso queira saber mais sobre o nvm e seus comando, &lt;a href="https://github.com/nvm-sh/nvm?tab=readme-ov-file#long-term-support" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  PNPM
&lt;/h2&gt;

&lt;p&gt;O node por padrão vem com o &lt;code&gt;npm&lt;/code&gt; como seu gerenciador de pacotesm, mas o pnpm veio para ser mais rápido e otimizado que o npm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalar mais recente
&lt;/h3&gt;

&lt;p&gt;Rodamos o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar uma versão especifica
&lt;/h3&gt;

&lt;p&gt;Informe a versão base especifica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm@8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alias Pn
&lt;/h3&gt;

&lt;p&gt;Esse é um alias que pode ser inserido no &lt;code&gt;.zshrc&lt;/code&gt; para 'facilitar' o seu uso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias pn=pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rode o comando &lt;code&gt;reset&lt;/code&gt; e já pode usar o pnpm&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira saber mais &lt;a href="https://pnpm.io/7.x/motivation" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CLI GITHUB
&lt;/h2&gt;

&lt;p&gt;Uma grande parte das pessoas usam o github como local para armazenas seus códigos, sejam no trabalho ou estudo, se você é estudante e não coloca seus codigos no github, é interessante que tu bote.&lt;br&gt;
A cli do github foi criada para conseguirmos fazer o que fazemos na web com alguns comando no terminal, como criar um repositório, clonar a branch de um PR e assim por diante&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalar o CLI
&lt;/h3&gt;

&lt;p&gt;Para instalar rode o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; wget &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;wget &lt;span class="nt"&gt;-y&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 755 /etc/apt/keyrings &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://cli.github.com/packages/githubcli-archive-keyring.gpg | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/keyrings/githubcli-archive-keyring.gpg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo chmod &lt;/span&gt;go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/github-cli.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gh &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Logar no GitHub
&lt;/h3&gt;

&lt;p&gt;É necessário logar com usa conta do github, necesse processo de login, o github cli nos ajuda cadastrando uma chave ssh, que ja vai ficar integrada no nosso wsl, para começar o processo rode o comando a seguir no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7t53lijxwx7xriw5kig5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7t53lijxwx7xriw5kig5.png" alt="Image description" width="736" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na segunda etapa da configuração é importante que você selecione a opção &lt;code&gt;SSH&lt;/code&gt;, pois ela é a responsavel por conseguimos cadastrar uma chave ssh de maneira facilitada&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42qi4koyuhs2hp6avt3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42qi4koyuhs2hp6avt3o.png" alt="Image description" width="736" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na quarta etapa de configuração você pode escolher ter uma senha para sua chave &lt;code&gt;SSH&lt;/code&gt; ou não, eu particularmente recomendo não ter, pois toda vez que voce realizar um commit ela vai pedir confirmação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjesnobroxc60rf2jyrkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjesnobroxc60rf2jyrkc.png" alt="Image description" width="706" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim basta selecionar o tipo de autenticação que deseja usar para validar sua conta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiurcizlfsb5vnuv7z2iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiurcizlfsb5vnuv7z2iq.png" alt="Image description" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso seu google do linux abra pode se logar por ele e inserir o código que foi exibido no terminal, ao final da autorização feche o navegador e ele validará normalmente&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finalizando essa etapa, recomendo fortemente que defina seu nome e email(de preferencia o mesmo do github) nas configuraçoes do git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Seu Nome"&lt;/span&gt;

git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"seuemail@exemplo.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso você use o vscode como seu editor de código principal, recomendo fortemente definir ele como seu editor padrão do git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.editor &lt;span class="s2"&gt;"code --wait"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.github.com/manual/" rel="noopener noreferrer"&gt;Manual | GitHub CLI&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Complete command
&lt;/h3&gt;

&lt;p&gt;Se você quiser ter uma lista facilitada dos comandos da github cli, rode o comando &lt;code&gt;sudo su&lt;/code&gt; para entrar no super terminal do linux e digite o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh completion &lt;span class="nt"&gt;-s&lt;/span&gt; zsh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /usr/local/share/zsh/site-functions/_gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rode o comando &lt;code&gt;exit&lt;/code&gt; para sair desse terminal, agora vá até o nosso arquivo de configuração do bash(&lt;code&gt;.zshrc&lt;/code&gt;) e insira o comando a seguir nele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;autoload -U compinit
compinit -i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No final ele vai ficar assim no &lt;code&gt;.zshrc&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznvyuwr9ikbrikqk53wm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznvyuwr9ikbrikqk53wm.png" alt="Image description" width="528" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resete o seu terminal com o comando previamente configurado ou reinicie o terminal e digite &lt;code&gt;gh&lt;/code&gt;, ela vai aparecer assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyp87g7wyjd5ijuurzz3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyp87g7wyjd5ijuurzz3j.png" alt="Image description" width="518" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;p&gt;Essa é uma das principais ferramentas para o gerenciamento de container no mercado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Os passos que iremos fazer será para a configuração do docker em um ambiente ubuntu, caso queira fazer em outro SOLinux de sua preferência &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;acesse aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limpar de package
&lt;/h3&gt;

&lt;p&gt;Esse comando é necessário para remover algum package que vai conflitar com a instalação do seu docker cli&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;pkg &lt;span class="k"&gt;in &lt;/span&gt;docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get remove &lt;span class="nv"&gt;$pkg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Definição do repo do docker
&lt;/h3&gt;

&lt;p&gt;Algumas intalações do linux são feitas com base em suas versões encontradas nos repositórios de cada projeto, agora iremos configurar o do docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Docker's official GPG key:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;ca-certificates curl
&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 &lt;span class="nt"&gt;-d&lt;/span&gt; /etc/apt/keyrings
&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.asc
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;a+r /etc/apt/keyrings/docker.asc

&lt;span class="c"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar ultima versão
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar versão especifica
&lt;/h3&gt;

&lt;p&gt;Aqui você vai precisar listar as versões disponiveis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List the available versions:&lt;/span&gt;
apt-cache madison docker-ce | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $3 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de escolher uma versão, copie o nome dela e jogue na variavel e rode o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Variavel&lt;/span&gt;
&lt;span class="nv"&gt;VERSION_STRING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5:24.0.0-1~ubuntu.22.04~jammy

&lt;span class="c"&gt;# Comando&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_STRING&lt;/span&gt; docker-ce-cli&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_STRING&lt;/span&gt; containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verificando
&lt;/h3&gt;

&lt;p&gt;Para verificar se a instalação foi um sucesso rode o comando &lt;code&gt;sudo docker run hello-world&lt;/code&gt;, seu terminal vai ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj82lix4ubue2l8u5jjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsj82lix4ubue2l8u5jjo.png" alt="Image description" width="778" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu recomendo fortemente que você rode o comando &lt;code&gt;docker run -it ubuntu bash&lt;/code&gt;, para tentar usar o terminal dentro de uma imagem ubuntu, se surgir algum erro como esse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90lpt361a2oqts3tcf10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90lpt361a2oqts3tcf10.png" alt="Image description" width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rode &lt;code&gt;sudo usermod -aG docker $USER&lt;/code&gt; no terminal linux e reinicie o wsl pelo powershell admin com o comando &lt;code&gt;wsl --shutdown&lt;/code&gt; e tente rodar novamente o comando do docker.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em alguns casos é preciso ficar ativando o docker toda vez que entrar no wsl, não necessito fazer isso, mas caso o seu linux exiba:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você precisará rodar &lt;code&gt;sudo service docker start&lt;/code&gt; toda vez que for usar o mesmo&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;É MUITO IMPORTANTE TOMAR CUIDADO PARA NÃO DEIXAR MUITOS CONTAINERS ATIVOS NO SEU PC&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ASDF
&lt;/h2&gt;

&lt;p&gt;Asdf é um gerenciador de versões de linguagens direto na sua cli, você consegue instalar go, ruby e node com ele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/asdf-vm/asdf.git ~/.asdf &lt;span class="nt"&gt;--branch&lt;/span&gt; v0.14.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodar esse comando, adicione a seguinte linha de codigo no &lt;code&gt;.zshrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. "$HOME/.asdf/asdf.sh"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No deve ficar assim no seu &lt;code&gt;.zshrc&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx924y7drwo1b7lyit6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx924y7drwo1b7lyit6y.png" alt="Image description" width="245" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira saber mais sobre o asdf &lt;a href="https://asdf-vm.com/" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Go
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Golang&lt;/strong&gt;, linguagem criada pelo Google em 2009, destaca-se por sua &lt;strong&gt;simplicidade, velocidade, confiabilidade e suporte à concorrência&lt;/strong&gt;. Ideal para diversos tipos de aplicações, desde servidores web até sistemas embarcados. Curva de aprendizado e menor quantidade de bibliotecas são pontos a serem considerados. Comunidade ativa e diversos recursos facilitam o aprendizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Pra instalar o GO vamos usar o asdf previamente instalado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asdf plugin-add golang
asdf &lt;span class="nb"&gt;install &lt;/span&gt;golang 1.21.5
asdf global golang 1.21.5
asdf shell golang 1.21.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pra ver se está tudo ok e rode um &lt;code&gt;go version&lt;/code&gt; se o retorno for parecido com o da imagem está tudo ok&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84mlu5jrklojephvzdrs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84mlu5jrklojephvzdrs.png" alt="Image description" width="295" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Parabêns
&lt;/h1&gt;

&lt;p&gt;Agora você tem um WSL, configurado e pronto para contibuir com a comunidade opensource ou fazer seus projetos pessoais, saiba que a jornada no linux é cheia de altos e baixo, qualquer duvida pergunte para alguem em um forum/comunidade que participa e com certeza alguem vai te ajudar, caso queira adaptar esse guia para seu caso especifico é só clonar ele com o comando `` e ser feliz.&lt;/p&gt;

&lt;p&gt;Muito obrigado por ficar até aqui, não deixe de ver a sessão abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://piluvitu.dev/" rel="noopener noreferrer"&gt;Me siga&lt;/a&gt; e siga a &lt;a href="https://bento.me/devhatt" rel="noopener noreferrer"&gt;devhatt&lt;/a&gt; nas redes sociais, fique alerta para mais conteúdos, quem sabe não tem algum extra 🤠 &lt;/p&gt;

</description>
      <category>wsl</category>
      <category>windows</category>
      <category>development</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Melhorando e configurando seu novo Shell linux. Pt-2</title>
      <dc:creator>Paulo Victor </dc:creator>
      <pubDate>Thu, 02 May 2024 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/melhorando-e-configurando-seu-novo-shell-linux-pt-2-4bfc</link>
      <guid>https://forem.com/devhat/melhorando-e-configurando-seu-novo-shell-linux-pt-2-4bfc</guid>
      <description>&lt;p&gt;E ai meu patrão, bom saber que você se interessa em configurar ainda mais o seu ambiente de desenvolvimento, essa é o guia 2 da nossa configuração completa de ambiente de desenvolvimento no WSL, caso vc tenha vindo direto para esse artigo e não sabe o que é WSL ou como configurar o seu, clica aqui e vai ver o 1 artigo.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é um Shell?
&lt;/h1&gt;

&lt;p&gt;O &lt;em&gt;Shell&lt;/em&gt; é uma camada que faz a intermediação de comandos e/ou serviços entre o sistema operacional e o usuário.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;Ubuntu&lt;/em&gt; por padrão vem com o &lt;em&gt;Shell&lt;/em&gt; base mais famoso e usado pelas distro linux ao redor do mundo o &lt;code&gt;Bash&lt;/code&gt;, mas nesse guia vamos ensinar a você instalar o &lt;code&gt;ZSH&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira saber mais sobre a escolha do ZSH ao inves do Bash e até aprender mais sobre Shell voce pode conferir os links a baixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.educba.com/zsh-vs-bash/" rel="noopener noreferrer"&gt;Zsh X Bash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://diolinux.com.br/tecnologia/entenda-o-que-e-bash-fish-zsh.html" rel="noopener noreferrer"&gt;O que é um Shell?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos instalar o zsh com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos fechar o terminal e abrir novamente e provavelmente paraecerá a seguinte tela para você:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs048x5khxwpna7vu1rzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs048x5khxwpna7vu1rzo.png" alt="Pasted image 20240315151906" width="519" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se por algum acaso não aparecer, sem problemas, vamos resolver isso no prox passo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Oh My ZSH
&lt;/h2&gt;

&lt;p&gt;Agora vamos intalar um dos grandes motivos de usar zsh, oh my zsh é plugin que facilita muito a nossa vida com possibilidades de autocomplete, lista de comandos e personalização para deixar o terminal do seu jeito, rode o comando abaixo e ele vai baixar o &lt;code&gt;OhMyZsh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apos inserir o comando vai aparecer a seguinte tela para você:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7remi144augezvflumtk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7remi144augezvflumtk.png" alt="Image description" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É só apertar a tecla &lt;code&gt;Y&lt;/code&gt; para definir o zsh como shell padrão e seu terminal deverá ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr96xgpjlre9spbu8tlox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr96xgpjlre9spbu8tlox.png" alt="Image description" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugins para o Oh My ZSH
&lt;/h2&gt;

&lt;p&gt;Com o shell configurado poderemos adicionar plugins para facilitar e auxiliar no nosso dia a dia de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Execute o seguinte comando no terminal para baixar os plugins na sua maquina&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira mais pugins, acesse esse &lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins" rel="noopener noreferrer"&gt;link&lt;/a&gt; e instale o de sua preferência&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-autosuggestions.git &lt;span class="nv"&gt;$ZSH_CUSTOM&lt;/span&gt;/plugins/zsh-autosuggestions &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="nv"&gt;$ZSH_CUSTOM&lt;/span&gt;/plugins/zsh-syntax-highlighting &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git clone https://github.com/zdharma-continuum/fast-syntax-highlighting.git &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/plugins/fast-syntax-highlighting &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="nt"&gt;--&lt;/span&gt; https://github.com/marlonrichert/zsh-autocomplete.git &lt;span class="nv"&gt;$ZSH_CUSTOM&lt;/span&gt;/plugins/zsh-autocomplete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos adicionar no seu .zshrc os plugins, no linux podemos abrir qualquer arquivo com editores que temos na nossa maquina, por padrão o Ubuntu vem com o &lt;code&gt;nano&lt;/code&gt;, mas podemos usar o &lt;code&gt;VsCode&lt;/code&gt;(Se estiver instalado).&lt;/p&gt;

&lt;p&gt;Todas as suas configuraçoes de shell vão ficar centralizadas no arquivo &lt;code&gt;.zshrc&lt;/code&gt; que fica localizado na raiz do seu linux, por padrão você sempre inicia na raiz do seu linux, mas caso esteja dentro de uma pasta e queira voltar rápidamente ou só garantir que está na raiz do linux insira o comando &lt;code&gt;cd&lt;/code&gt; no seu terminal e aperte a tecla &lt;code&gt;Enter&lt;/code&gt;, se o seu terminal estiver como a imagem abaixo, vc está na raiz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvp2lfvjde8utivdtui4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvp2lfvjde8utivdtui4.png" alt="Image description" width="222" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A partir dela vamos inserir o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.zshrc

&lt;span class="c"&gt;# caso tenha o vsCode instalado no seu windows use: &lt;/span&gt;
code .zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O seu terminal deve ficar assim agora:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri5f3hqp8wnzb7sqsdkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri5f3hqp8wnzb7sqsdkc.png" alt="Image description" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seja bem vindo ao &lt;code&gt;nano&lt;/code&gt; um editor de texto padrão do linux, não é segredo como usar ele, apenas olhe para a parte inferior no terminal e verá os comando do nano:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1ifafpfz0mh02dex56x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1ifafpfz0mh02dex56x.png" alt="Image description" width="800" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No nano a o caractere &lt;code&gt;^&lt;/code&gt; representa a tecla &lt;code&gt;Ctrl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Digite &lt;code&gt;Ctrl + W&lt;/code&gt; e digite &lt;code&gt;plugin&lt;/code&gt;, você deve se atentar a seguinte parte do arquivo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh33eq07ph25au497svxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh33eq07ph25au497svxy.png" alt="Image description" width="603" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subistitua onde tem &lt;code&gt;plugins=(git)&lt;/code&gt; pelo código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=(git zsh-autosuggestions zsh-syntax-highlighting fast-syntax-highlighting zsh-autocomplete)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vai ficar da seguinte maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fginby9h39xuyvvl08mnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fginby9h39xuyvvl08mnn.png" alt="Image description" width="800" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É recomendado reiniciar o terminal toda vez que você altera esse arqivo ou instala alguma coisa importante no seu linux, usando o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /home/seuUser/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se você quiser definir um alias com o nome &lt;code&gt;reset&lt;/code&gt; é só inserir no arquivo &lt;code&gt;.zshrc&lt;/code&gt; o seguinte trecho &lt;code&gt;alias reset="source /home/seuUser/.zshrc"&lt;/code&gt;, salvar o arquivo e reiniciar o terminal. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E pronto, agora você tem um shell incrível e potente configurado para te auxiliar e dar mais produtividade quando estiver usando o WSL.&lt;/p&gt;

&lt;p&gt;Muito obrigado por ler até aqui, na nossa próxima parte iremos configurar as ferramentas de desenvolvimento &lt;code&gt;git, docker, go, node&lt;/code&gt; para você conseguir botar a mão na massa e fazer altos projetinhos. &lt;/p&gt;

&lt;p&gt;Te aguardo na próxima postagem 🤠&lt;/p&gt;

</description>
      <category>linux</category>
      <category>windows</category>
      <category>wsl</category>
      <category>shell</category>
    </item>
    <item>
      <title>Instalação e configuração inicial do seu WSL. Pt-1</title>
      <dc:creator>Paulo Victor </dc:creator>
      <pubDate>Mon, 29 Apr 2024 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/instalacao-e-configuracao-inicial-do-seu-wsl-pt-1-23m3</link>
      <guid>https://forem.com/devhat/instalacao-e-configuracao-inicial-do-seu-wsl-pt-1-23m3</guid>
      <description>&lt;p&gt;Opa meu consagrado, essa é a 1 postagem de 3 onde vamos abordar a configuração completa do seu ambiente de desenvolvimento, esse guia tem o foco em desenvolvedores que utilizam o Windows como sistema de desenvolvimento, vamos iniciar com a instalação do seu WSL:  &lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o WSL ?
&lt;/h2&gt;

&lt;p&gt;De maneira mais genérica e sucinta WSL é um subsistema linux no seu pc windows. Isso significa que vamos instalar um linux que vai rodar em conjunto com o windows, permitindo que você desenvolva sem abrir mão do seu sistema principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparação
&lt;/h2&gt;

&lt;p&gt;Para começar vamos garantir que você está no ambiente certo para usar todo poder do wsl&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você precisará estar no Windows 10 Build 19044+ ou Windows 11&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Para ver qual é sua versão de build do windows, acesse:&lt;br&gt;
Configurações -&amp;gt; Sistema -&amp;gt; Sobre &amp;gt; Especificações do Windows &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Driver instalado para vGPU&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-dch-drivers.html" rel="noopener noreferrer"&gt;GPU Driver da Intel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amd.com/en/support" rel="noopener noreferrer"&gt;GPU Driverda AMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nvidia.com/Download/index.aspx?lang=en-us" rel="noopener noreferrer"&gt;GPU Driver da NVIDIA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Ative a virtualização no seu processador na sua bios&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira saber se sua virtualização está ativada sem ir na bios do seu pc: &lt;br&gt;
Aperte as teclas &lt;code&gt;CTRL + ALT + DEL&lt;/code&gt;, escolha a opção &lt;code&gt;gerenciador de tarefas&lt;/code&gt;, clique na guia &lt;code&gt;Desempenho&lt;/code&gt;, clique em &lt;code&gt;CPU&lt;/code&gt; e procure na parte inferior o status &lt;code&gt;Virtualização&lt;/code&gt;, se ele estiver habilitado avance no guia, se não estiver procure como ativar na sua bios&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Pesquise por 'Ativar ou desativar recurso do windows' como mostra a imagem abaixo&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;PT-BR&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falat3fj04lfvc2t05eiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falat3fj04lfvc2t05eiy.png" alt="Image description" width="341" height="99"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;EN&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2e14tv7yihri55ngqvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2e14tv7yihri55ngqvi.png" alt="Image description" width="340" height="75"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Acesse essa opção e ative os seguintes recursos&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;PT-BR &amp;amp; EN&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoj84stfa9dnpodffmp9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoj84stfa9dnpodffmp9.png" alt="Image description" width="103" height="20"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;PT-BR&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0274shcxafgdg147bval.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0274shcxafgdg147bval.png" alt="Image description" width="263" height="37"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;EN&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1jmvqv3p7a68rw59r8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1jmvqv3p7a68rw59r8j.png" alt="Image description" width="205" height="35"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;PT-BR&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc1esyv177s514dl3cwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc1esyv177s514dl3cwd.png" alt="Image description" width="230" height="19"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;EN&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg97p6i8gi0pmtrr63hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg97p6i8gi0pmtrr63hy.png" alt="Image description" width="207" height="20"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Agora estamos prontos para intalar o wsl, abra o seu powershell em modo &lt;strong&gt;ADMIN&lt;/strong&gt; e digite o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;REINICIE O PC DEPOIS DESSA INSTALAÇÃO&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Defina suas credênciais
&lt;/h2&gt;

&lt;p&gt;Inicie o seu &lt;em&gt;Ubuntu&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz8v1s484chc1e29axg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz8v1s484chc1e29axg8.png" alt="Image description" width="339" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele vai pedir para você definir as suas credenciais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffywd53jgeonvd8fhxpyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffywd53jgeonvd8fhxpyw.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Insira seu nome de usuario e uma senha simples e rápida, você vai usar ela para executar comandos recorrentes, então não pode ser muito complexa e grande&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ATENÇÃOOO:&lt;/strong&gt; A SENHA NÃO APARECE A MEDIDA QUE VOCÊ DIGITA, essa é uma medida de segurança que o ubuntu tem, fique atento na hora de digitar a sua senha.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Após definir as suas credenciais você vai estar em uma tela parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9c31yhuhsrpgf7jmr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9c31yhuhsrpgf7jmr3.png" alt="Image description" width="793" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Atualize suas dependências
&lt;/h2&gt;

&lt;p&gt;A partir de agora você está dentro do seu wsl, a primeira coisa que devemos fazer ao entrar nesse sistema é rodar os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses comandos vão atualizar a sua maquina e deixar ela pronta para uso, se lembra daquela senha que definimos na sessão acima? É ela que vamos usar para confirmar os comandos com o inicio &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso queira se aprofundar mais sobre a instalação inicial do linux acesse o link abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="noopener noreferrer"&gt;Instalar o WSL | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conferindo tudo
&lt;/h2&gt;

&lt;p&gt;Agora vamos conferir se tudo está certo o WSL 2 permite que os aplicativos de GUI do Linux pareçam nativos e naturais para uso no Windows fazendo com que possamos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iniciar aplicativos Linux no menu Iniciar do Windows&lt;/li&gt;
&lt;li&gt;Fixar aplicativos Linux na barra de tarefas do Windows&lt;/li&gt;
&lt;li&gt;Usar alt-tab para alternar entre aplicativos Linux e Windows&lt;/li&gt;
&lt;li&gt;Recortar + Colar entre aplicativos Windows e Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por isso, vamos instalar os aplicativos X11 rodando o  seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;x11-apps &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após completa a instalação, reinicie o seu terminal e digite &lt;code&gt;xeyes&lt;/code&gt; se o resultado for igual ao seguinte: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5cstq8lb2v1upyu0b1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5cstq8lb2v1upyu0b1y.png" alt="Image description" width="424" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parabéns, o seu WSL está devidamente configurado. &lt;/p&gt;

&lt;h2&gt;
  
  
  Extra
&lt;/h2&gt;

&lt;p&gt;Se você vai usar o Electron pelo WSL é altamente recomendado que você instale alguma versão do Chrome no seu WSL, para fazer isso, você pode usar o seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Primeiro vá até a pasta temp do seu linux:&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp 

&lt;span class="c"&gt;# Quando estiver na temp baixe o instalador do chrome:&lt;/span&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 

&lt;span class="c"&gt;# Assim que acabar o passo anterior instale o mesmo:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--fix-missing&lt;/span&gt; ./google-chrome-stable_current_amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando acabar a instalação digite &lt;code&gt;cd&lt;/code&gt; para voltar ao seu diretório raiz e por fim tente executar o comando &lt;code&gt;google-chrome&lt;/code&gt;, se o resultado for parecido com esse: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwbk87yjnt4pyei0fy2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwbk87yjnt4pyei0fy2g.png" alt="Image description" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parabéns o seu linux está configurado corretamente 🫡&lt;/p&gt;

&lt;p&gt;Essa foi a 1 parte do nosso guia não se esqueça de ver as próximas duas partes. &lt;/p&gt;

&lt;p&gt;Muito obrigado por ler até aqui 🤠, não se esqueça de seguir a gente nas redes sociais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bento.me/devhatt" rel="noopener noreferrer"&gt;Devhatt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://piluvitu.dev" rel="noopener noreferrer"&gt;Pilu Vitu(Eu)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>windows</category>
      <category>development</category>
      <category>wsl</category>
    </item>
    <item>
      <title>Unidades CSS — Um Guia Completo</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Mon, 11 Mar 2024 15:06:41 +0000</pubDate>
      <link>https://forem.com/devhat/unidades-css-um-guia-completo-1a2l</link>
      <guid>https://forem.com/devhat/unidades-css-um-guia-completo-1a2l</guid>
      <description>&lt;p&gt;Vejo com muita frequência o pessoal não saber quais unidades CSS usar e em quais situações. Esse é um assunto quase abstrato pois não é claro cada caso meticulosamente explicado de quando usar cada unidade.&lt;/p&gt;

&lt;p&gt;Sou frontend a um tempo e ao longo dos anos construí um padrão que funciona pra mim e que aplico em todo projeto que trabalho hoje. Vale reforçar que essa é a minha visão sobre o assunto, mas não é a única, existem vários meios de fazer um bom site.&lt;br&gt;
Aqui vou falar de &lt;em&gt;quase&lt;/em&gt; todas as unidades, seus usos e peculiaridades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unidades abordadas
&lt;/h2&gt;

&lt;p&gt;Vou usar o &lt;a href="https://www.w3schools.com/cssref/css_units.php"&gt;w3schools&lt;/a&gt; como referencia para as unidades, mas antes vamos separar as unidades em 2 categorias:&lt;br&gt;
&lt;strong&gt;absolutas&lt;/strong&gt; com cm, mm, in, px, pt e pc;&lt;br&gt;
&lt;strong&gt;relativas&lt;/strong&gt; com em, rem, ex, ch e %;&lt;/p&gt;

&lt;h2&gt;
  
  
  Absolutas
&lt;/h2&gt;

&lt;p&gt;Unidades absolutas são independentes de qualquer outra coisa, além da definição da própria unidade. Valendo apenas lembrar que algumas unidades aqui podem variar dependendo da precisão do seu &lt;em&gt;hardware&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Características&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar elementos puramente visuais&lt;/li&gt;
&lt;li&gt;Criar experiencias personalizadas para mídias especificas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS não é escalável&lt;/li&gt;
&lt;li&gt;Responsividade mais verbosa&lt;/li&gt;
&lt;li&gt;Páginas não são dinâmicas, mas sim adaptativas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  px
&lt;/h3&gt;

&lt;p&gt;Com certeza a unidade mais utilizada na web, não que seja a melhor opção, mas é com certeza a mais fácil de se aplicar em telas no geral.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;px&lt;/strong&gt; é uma unidade &lt;em&gt;péssima&lt;/em&gt; pra trabalhar com responsividade de &lt;strong&gt;containers&lt;/strong&gt;, exigindo usar muito mais &lt;em&gt;media-queries&lt;/em&gt; do que de fato seria necessário se usasse uma unidade mais adequada.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Até pode&lt;/em&gt; usar &lt;code&gt;px&lt;/code&gt; se responsividade de &lt;em&gt;containers&lt;/em&gt; não for algo necessário na sua aplicação, porém é muito raro criar algo específico por dispositivo, logo é bem pouco comum esse ser o caso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;px&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detalhes visuais como &lt;code&gt;border-radius&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;box-shadow&lt;/code&gt; e etc&lt;/li&gt;
&lt;li&gt;Tamanhos (&lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;) de &lt;em&gt;elementos puramente visuais não-relativos&lt;/em&gt;. Esse tipo de elemento segue o mesmo princípio dos &lt;em&gt;detalhes visuais&lt;/em&gt;, eles dependem apenas de si mesmos e não variam em tamanho de acordo com nada, mudam pouco entre resoluções e são muito usados quando trabalhamos com layouts que possuem detalhes nas páginas apenas para finalidade de preenchimento, veja a baixo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrtufeemuqqbvk06hdav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrtufeemuqqbvk06hdav.png" alt="screenshot de um site com alguns elementos puramente visuais em destaque" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38iflu21rl0ghcaoi78h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38iflu21rl0ghcaoi78h.png" alt="screenshot de uma outra sessão do mesmo site destacando outros tipos de elementos puramente visuais" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;px&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;media-query&lt;/em&gt; , é basicamente a pior unidade pra se usar, &lt;a href="https://www.linkedin.com/pulse/px-em-ou-rem-media-queries-alexandre-gomes/"&gt;traduzi esse artigo sobre esse assunto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Containers responsivos&lt;/em&gt; pois usar pixels nesses containeres acaba exigindo muito mais media-querydo que de fato você iria precisar. Isso também deixa mais difícil de dar manutenção pois as coisas não fluem, são todas estáticas, exigindo mudanças manuais em cada nível dos elementos. Usar px nesse caso também torna seu site &lt;em&gt;adaptativo&lt;/em&gt; e não &lt;em&gt;responsivo&lt;/em&gt; o que não é um grande problema, mas pela minha vivencia acabo não concordando com a abordagem.&lt;/li&gt;
&lt;li&gt;Qualquer propriedade que afete &lt;strong&gt;fonte&lt;/strong&gt; como &lt;code&gt;font-size&lt;/code&gt;, &lt;code&gt;letter-spacing&lt;/code&gt;, &lt;code&gt;line-height&lt;/code&gt; e etc por razões de acessibilidade e respeito com o usuário. Quando você usa fontes em &lt;code&gt;px&lt;/code&gt; você acaba ignorando completamente as preferencias de tamanho de fonte do usuário e força ele a ver as coisas da forma que você fixou, isso é &lt;strong&gt;péssimo&lt;/strong&gt; pois penaliza pessoas com problemas ou até mesmo deficiências visuais. Para fontes prefiro &lt;code&gt;rem&lt;/code&gt;, mas vamos discutir ela melhor na sessão de unidades relativas.&lt;/li&gt;
&lt;li&gt;Espaçamentos como &lt;code&gt;padding&lt;/code&gt; e &lt;code&gt;margin&lt;/code&gt; pois esses espaçamentos vão variar de acordo com outros elementos relativos na sua página, &lt;code&gt;px&lt;/code&gt; nesse caso seria um elemento fixo num mar de relatividade o que acabaria variando muito a experiencia do site com variações principalmente de &lt;em&gt;fonte&lt;/em&gt;, por isso não devemos usar &lt;code&gt;px&lt;/code&gt; nesse caso, a unidade correta vamos abordar na sessão de unidades relativas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  cm, mm, in
&lt;/h3&gt;

&lt;p&gt;Essas unidades não são &lt;em&gt;tão usadas&lt;/em&gt; por serem muito mais úteis em impressão do que na tela de fato, mas é importante falarmos sobre elas.&lt;/p&gt;

&lt;p&gt;Como já dito acima são unidades que &lt;strong&gt;não devem ser usadas para web&lt;/strong&gt;, mas sim para gerar documentos impressos, quando for imprimir a tela em questão ou quando na impressão formos usar elementos estáticos na tela.&lt;/p&gt;

&lt;p&gt;Antigamente essas unidades eram mais usadas, na época inicial do CSS, para criar documentos impressos, nessa época era MUITO mais frequente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; A pesar de que faz sim sentido usar essas unidades para impressão e eu ainda vejo valor nelas, hoje em dia não é algo tão usual assim e você poderia usar &lt;code&gt;px&lt;/code&gt; normalmente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;cm&lt;/code&gt;, &lt;code&gt;mm&lt;/code&gt; e &lt;code&gt;in&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Elementos puramente visuais&lt;/em&gt; em impressão de papel por serem unidades físicas que vão ser traduzidas para coisas igualmente físicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;cm&lt;/code&gt;, &lt;code&gt;mm&lt;/code&gt; e &lt;code&gt;in&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telas digitais, munitores ou qualquer coisa que for ser vista no âmbito digital.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Fontes&lt;/em&gt; de impressão em papel, a pesar de que sim, essas são unidades boas para impressão física, existem unidades melhores pra esse fim que vamos discutir no próximo tópico.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;qualquer outro caso que não sejam os citados no tópico “use”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  pt e pc
&lt;/h3&gt;

&lt;p&gt;Quando falamos de unidades em impressões de texto precisamos falar, basicamente, a língua da impressora e essa língua é &lt;code&gt;pt&lt;/code&gt; e &lt;code&gt;pc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Essas unidades nasceram pra trabalhar texto impresso especificamente, ou seja, elas devem ser usadas apenas para esse tipo de trabalho.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;pt&lt;/code&gt; e &lt;code&gt;pc&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fontes em impressão em papel pois essas unidades nasceram exatamente para isso e as impressoras em geral não tem problemas de precisão para trabalhar com essas unidades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;pt&lt;/code&gt; e &lt;code&gt;pc&lt;/code&gt; quando trabalhar com quaisquer outra coisa que não seja impressão no papel.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Relativas
&lt;/h2&gt;

&lt;p&gt;Unidades relativas são aquelas que os desenvolvedores front-end mais vão usar, são unidades dependentes de outros valores como tamanho da tela, configurações do usuário e etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Características&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prós:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsividade mais manutenível&lt;/li&gt;
&lt;li&gt;Se adapta de acordo com a necessidade de usuário&lt;/li&gt;
&lt;li&gt;Maior escalabilidade para componentes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contras:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exige devs mais experientes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  em e rem
&lt;/h3&gt;

&lt;p&gt;As unidades clássicas pra se trabalhar com fontes na web, diferente do &lt;code&gt;pt&lt;/code&gt; e &lt;code&gt;pc&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt; e &lt;code&gt;rem&lt;/code&gt; são unidades feitas pra usar fora de impressão e é a unidade que vamos usar majoritariamente para fontes em nossas aplicações e sites.&lt;/p&gt;

&lt;p&gt;A pesar disso existem peculiaridades dentro de cada unidade que me força a tratar cada uma em um tópico diferente!&lt;/p&gt;

&lt;h4&gt;
  
  
  em
&lt;/h4&gt;

&lt;p&gt;Essa unidade deriva seu valor da &lt;em&gt;font size&lt;/em&gt; do &lt;em&gt;elemento pai&lt;/em&gt;, ou seja, &lt;em&gt;se o pai possui 16px de font-size, 1rem vai ser 16px, 2rem vão ser 32px&lt;/em&gt; e assim sucessivamente.&lt;/p&gt;

&lt;p&gt;Essa unidade é bastante útil quando não trabalhamos com layouts criados por designers decorrente de que em geral eles não pensam nessa propagação do &lt;code&gt;font-size&lt;/code&gt; com &lt;code&gt;em&lt;/code&gt;, tornando mais trabalhoso do que útil usar &lt;code&gt;em&lt;/code&gt; como unidade nesses casos, para usar fontes na web &lt;code&gt;rem&lt;/code&gt; acaba sendo melhor na minha opinião, mas vamos discutir melhor sobre isso no próximo tópico.&lt;/p&gt;

&lt;p&gt;Além disso existe uma coisa muito importante sobre o uso de &lt;code&gt;em&lt;/code&gt;, essa é com certeza a melhor unidade pra se usar com &lt;em&gt;responsividade&lt;/em&gt;, fazendo com que troquemos o &lt;code&gt;@media screen and (max-width: 1200px)&lt;/code&gt; por &lt;code&gt;@media screen and (max-width: 120em)&lt;/code&gt; &lt;em&gt;(considerando uma font-size base de 10px)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Existem os que defendam que é melhor utilizar os espaçamentos (como &lt;code&gt;padding&lt;/code&gt; e &lt;code&gt;margin&lt;/code&gt;) com &lt;code&gt;em&lt;/code&gt;, mas eu discordo porque isso gera mais problemas do que soluções. Posso até, quando precisar alterar o tamanho de uma fonte, ter que me atentar a reajustar o espaçamento também uma vez que o espaçamento vai mudar com a fonte e isso quase nunca é o desejado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;em&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;media-query&lt;/code&gt;, traduzi um artigo excelente sobre o assunto e você pode &lt;a href="https://www.linkedin.com/pulse/px-em-ou-rem-media-queries-alexandre-gomes/"&gt;ler ele aqui&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Quando for trabalhar com &lt;em&gt;fontes&lt;/em&gt; em aplicações web que não tenham sido idealizadas por designers. Na maioria dos casos os designers não fazem os layouts de uma forma que as fontes são relativas umas as outas de forma pensada, fazendo com que qualquer alteração simples de &lt;code&gt;font-size&lt;/code&gt; em vire uma necessidade de alteração em cascata ao invés de ser uma simples alteração como deveria ser. Essa unidade é melhor quando não temos um layout pronto ou temos apenas um &lt;em&gt;wireframe&lt;/em&gt; base, nesses casos faz sentido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use em quando trabalhar com quaisquer outra situação que não sejam os casos citados a cima.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  rem
&lt;/h4&gt;

&lt;p&gt;Talvez a unidade mais negligenciada na minha visão, o &lt;code&gt;rem&lt;/code&gt; tem o mesmo poder do &lt;code&gt;em&lt;/code&gt;, mas não deriva da fonte pai e sim da fonte base da página, isso faz com que ela seja muito mais consistente pra se trabalhar com fontes na web!&lt;/p&gt;

&lt;p&gt;Essa unidade é excelente para fontes por ser uma unidade acessível e não exigir quase nenhum esforço dos devs para fazer sua acessibilidade funcionar, o &lt;code&gt;rem&lt;/code&gt; deriva da &lt;em&gt;fonte root&lt;/em&gt; e faz com que, se ela for &lt;code&gt;16px&lt;/code&gt;, logo &lt;code&gt;1rem&lt;/code&gt; vai ser &lt;code&gt;16px&lt;/code&gt; e assim sucessivamente tal como o &lt;code&gt;em&lt;/code&gt; e é dai que vem sua acessibilidade!&lt;/p&gt;

&lt;p&gt;Existem pessoas com dificuldades visuais ou mesmo apenas pessoas com grau mais alto no óculos cujas, em geral, aumentam a fonte do celular ou dão zoom na página pra que seja mais fácil de enxergar.&lt;/p&gt;

&lt;p&gt;Esses aumentos na web são traduzidos como o &lt;em&gt;font root&lt;/em&gt; que por sua vez vão afetar diretamente tudo que tiver usando &lt;code&gt;rem&lt;/code&gt;, fazendo no fim a fonte realmente aumentar e se adaptar a necessidade do usuário sem que ele precise dar zoom na tela apenas porque sua aplicação não suporta a necessidade dele.&lt;/p&gt;

&lt;p&gt;Assim, para tudo que for derivado de fontes como &lt;code&gt;font-size&lt;/code&gt;, &lt;code&gt;letter-spacing&lt;/code&gt; e qualquer outro valor que em geral usaríamos &lt;code&gt;px&lt;/code&gt;, use &lt;code&gt;rem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas não só isso, também é interessante usar &lt;code&gt;rem&lt;/code&gt; para delimitadores. Um layout nem sempre deve esticar até o infinito e esse valor de limite, que pode ser na prática &lt;code&gt;1920px&lt;/code&gt;, pode ser traduzido em &lt;code&gt;192rem&lt;/code&gt; por exemplo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Vale do adendo de que &lt;code&gt;line-height&lt;/code&gt; acaba sendo melhor sem nenhuma unidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; também é bastante útil pra criar espaçamentos de &lt;code&gt;padding&lt;/code&gt; e &lt;code&gt;margin&lt;/code&gt; pela sua consistência e fluidez com a &lt;em&gt;fonte root&lt;/em&gt;, sendo essa na minha visão a melhor unidade pra isso também.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Prefiro usar &lt;code&gt;rem&lt;/code&gt; alterando a fonte do &lt;code&gt;html&lt;/code&gt; e do &lt;code&gt;body&lt;/code&gt; para &lt;code&gt;font-size: 62.5%;&lt;/code&gt; fazendo essa alteração fica mais fácil de trabalhar com &lt;code&gt;rem&lt;/code&gt; já que ela é múltipla de &lt;code&gt;10&lt;/code&gt;, e não de &lt;code&gt;16&lt;/code&gt;. Os exemplos dados inclusive foram baseados nesse hack.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;rem&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para todas as propriedades derivadas de fonte na web pela sua consistência de manter o valor da unidade e acessibilidade escalando o valor de acordo com a necessidade do usuário.&lt;/li&gt;
&lt;li&gt;Espaçamentos gerais como &lt;code&gt;padding&lt;/code&gt; e &lt;code&gt;margin&lt;/code&gt; pois eles vão mudar de acordo com a fonte root da página, se adaptando de acordo com a alteração de fonte base o que deixa a página mais consistente em sua fluidez e evita que ela quebre quando usarmos fontes baseadas em &lt;code&gt;rem&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Delimitadores de tamanho de página já que como os espaçamentos e as fontes estão sendo derivadas da &lt;em&gt;root font&lt;/em&gt; do usuário é interessante que os delimitadores sejam usados com &lt;code&gt;rem&lt;/code&gt; também. Assim o tamanho máximo da página irá fluir de acordo com a &lt;em&gt;root font&lt;/em&gt;, permitindo mais espaço para acomodar os demais elementos que cresceram junto com a alteração da &lt;em&gt;root font&lt;/em&gt; do site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;rem&lt;/code&gt; quando trabalhar com quaisquer outras situações que não sejam as citadas a cima.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usamos o &lt;code&gt;rem&lt;/code&gt; para espaçamentos de não &lt;code&gt;em&lt;/code&gt; pela natureza derivada do root do &lt;code&gt;rem&lt;/code&gt;. O problema do &lt;code&gt;em&lt;/code&gt; é que ele varia de acordo com a fonte do pai e isso gera &lt;em&gt;side-effects&lt;/em&gt; geralmente indesejados. Em contra partida o &lt;code&gt;rem&lt;/code&gt; deriva do &lt;em&gt;root&lt;/em&gt;, o que não atrapalha enquanto trabalhamos, mas altera de acordo com a necessidade do usuário. Então usando &lt;code&gt;rem&lt;/code&gt; para espaçamentos ganhamos a fluidez dos espaçamentos variarem com a fonte.&lt;/p&gt;

&lt;h3&gt;
  
  
  ex e ch
&lt;/h3&gt;

&lt;p&gt;Essas unidades são meio novas e são relativas a caracteres na &lt;code&gt;font-size&lt;/code&gt; atual, boas pra fazer coisas derivadas dos tamanhos dos textos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ex:&lt;/strong&gt; é a altura do caractere &lt;code&gt;x&lt;/code&gt; na &lt;code&gt;font-size&lt;/code&gt; atual&lt;br&gt;
&lt;strong&gt;ch:&lt;/strong&gt; é a largura do caractere &lt;code&gt;0&lt;/code&gt; na &lt;code&gt;font-size&lt;/code&gt; atual&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;ex&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contêineres com altura relativa a quantidade de linhas, por exemplo quando você quer limitar uma quantidade de linhas visíveis no container sem precisar fazer algum hack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;ex&lt;/code&gt; quando trabalhar com qualquer outra situação que não seja ao menos semelhante a citada a cima.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;ch&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contêineres com largura relativa a quantidade de caracteres, por exemplo quando você quer limitar o tamanho de um texto no container sem precisar fazer algum hack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;ch&lt;/code&gt; quando trabalhar com qualquer outra situação que não seja ao menos semelhante a citada a cima.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Para ambos os casos pode ter alguma situação além dessas que o uso faz sentido e eu desconheça, mas via de regra é isso.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  %
&lt;/h3&gt;

&lt;p&gt;Essa é a unidade que deveria ser a mais utilizada na esmagadora maioria dos casos, mas infelizmente não é tão utilizada assim…&lt;/p&gt;

&lt;p&gt;Essa unidade nos permite evitar um uso excessivo de &lt;em&gt;media-query&lt;/em&gt; pela sua característica dinâmica com relação ao tamanho da página. Com isso você pode deixar seus contêineres fluidos e dinâmicos de acordo com a necessidade.&lt;/p&gt;

&lt;p&gt;Existem também outros casos que podemos usar &lt;code&gt;%&lt;/code&gt; a pesar de que sua principal função é determinar tamanhos de contêineres.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;%&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contêineres que fluem com o tamanho da página/container pai, quase todos os elementos de uma página devem ser construídos com &lt;code&gt;%&lt;/code&gt; por ser uma unidade flexível. Essa unidade reduz consideravelmente a quantidade de &lt;em&gt;media-query&lt;/em&gt; que sua página precisa sendo mais fácil de dar manutenção e manter no geral.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adendo:&lt;/strong&gt; Porcentagem deve ser usada em todos os contêineres, pai/filho não importa. Existe exceções já abordadas neste artigo, mas fora elas, via de regra, o resto TUDO é porcentagem.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Posicionamento relativo pois quando você tem algo em algum posicionamento &lt;em&gt;left&lt;/em&gt;/&lt;em&gt;right&lt;/em&gt;/&lt;em&gt;bottom&lt;/em&gt;/&lt;em&gt;top&lt;/em&gt; que varia de acordo com o tamanho do container é interessante usar, por exemplo, um &lt;code&gt;&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;right: 3%&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Border Radius&lt;/em&gt; para atingir resultados ovalados quanto trabalhar com &lt;code&gt;border-radius&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Não use &lt;code&gt;%&lt;/code&gt; quando trabalhar com&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fontes/Textos pois quase nunca você vai querer usar &lt;code&gt;font-size&lt;/code&gt; relativa ao container pai, em geral a fonte varia em outra proporção oque faria fontes em porcentagem gerarem mais manutenção do que soluções.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Eu espero que não tenha esquecido nenhum caso de uso ou não-uso de algum unidade, aqui tentei compilar todas as regras que uso no meu processo de desenvolvimento e que veem funcionando pra mim a bastante tempo. Vale lembrar que esse &lt;strong&gt;não é o único jeito de usar as unidades&lt;/strong&gt;, é apenas, o meu jeito de usar elas.&lt;/p&gt;

&lt;p&gt;PS: Eu sei que ficou faltando falar de &lt;code&gt;vh&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;, &lt;code&gt;vmin&lt;/code&gt;, &lt;code&gt;vmax&lt;/code&gt; e etc, mas essas unidades vou deixar para uma parte dois desse artigo pra manter esse aqui mais conciso no objetivo. Na minha visão também não tem tanto que essas unidades façam que as apresentadas aqui não, logo essas unidades seriam mais um adendo no conteúdo do que realmente algo diferente a ser trazido.&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>html</category>
    </item>
    <item>
      <title>Como Configurar o Expo no WSL</title>
      <dc:creator>Victor Hugo</dc:creator>
      <pubDate>Mon, 04 Mar 2024 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/como-configurar-o-expo-no-wsl-bo3</link>
      <guid>https://forem.com/devhat/como-configurar-o-expo-no-wsl-bo3</guid>
      <description>&lt;h2&gt;
  
  
  pré-requisitos:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Windows 11/10&lt;/code&gt;, &lt;code&gt;Direitos de administrador no WSL2&lt;/code&gt;, &lt;code&gt;dotenv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;Expo&lt;/code&gt; é uma ferramenta &lt;code&gt;open source&lt;/code&gt; para facilitar a sua vida na hora de criar aplicativos em &lt;code&gt;React Native&lt;/code&gt;. É possível usa-lo em qualquer sistema operacional que você quiser: &lt;code&gt;Windows&lt;/code&gt;, &lt;code&gt;Linux&lt;/code&gt; e &lt;code&gt;MacOs&lt;/code&gt; mas e se eu quiser usa-lo no meu &lt;code&gt;WSL (Windows Subsystem of Linux)&lt;/code&gt;? Bem... até a data de criação desse artigo isso seria uma tarefa que &lt;strong&gt;beiraria&lt;/strong&gt; o impossível, mas nós da &lt;a href="https://discord.gg/3gsMAEumEd" rel="noopener noreferrer"&gt;Devhat&lt;/a&gt; nos juntamos para te ajudar nessa missão!&lt;/p&gt;

&lt;h3&gt;
  
  
  observação
&lt;/h3&gt;

&lt;p&gt;Esse artigo será separado em duas partes: a primeira parte ensinará a configurar e conectar o &lt;code&gt;Expo&lt;/code&gt; ao seu celular pelo &lt;code&gt;QR code&lt;/code&gt;, a segunda parte ensinará a conectar o &lt;code&gt;Expo&lt;/code&gt; a um &lt;code&gt;Virtual Device&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1: ABRIR AS PORTAS DE IP DO SEU COMPUTADOR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dentro deste GIST  tem um arquivo &lt;code&gt;Powershell&lt;/code&gt;, você precisará baixar ou copiar esse arquivo (garanta que é um arquivo &lt;code&gt;.ps1&lt;/code&gt; e não um arquivo &lt;code&gt;.txt&lt;/code&gt;) .
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Caso  você precise trocar a porta, edite a variável na 6ª linha, entre parênteses.
```bash
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;$ports = @(8081, 8082);&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Pegue esse arquivo e jogue ele na Root da pasta C  `C:\`.

![foto mostrando o script powershell na root da pasta C](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mkhbk3bfc9hf43mf41b.png)
- Agora abra o `PowerShell` como administrador (precisa ser como administrador).

![mostrando como abrir o powershell como adminstrador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/obiejwpxsxwv5ysou2rv.png)

- Agora com o seu `PowerShell` como `administrador` aberto, você irá fazer algumas coisas:
    - feche todas as abas do `WSL` abertas no seu computador e execute o seguinte comando.
```bash


wsl --shutdown  


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;essa mensagem de erro aparecerá caso você pule essa etapa.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pqvi2lnssz4kl79mjmz.png" alt="Nenhum objeto MSFT_NetFIrewallRule encontrado com a propriedade 'DisplayName' igual a 'WSL2 Forwarded Prots'. Verifique o valor da propriedae e tente de novo."&gt;
&lt;/li&gt;
&lt;li&gt;Execute o seguinte comando.
```bash
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;powershell.exe -ExecutionPolicy Bypass -f C:\forward_wsl2_ports.ps1&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- se tudo der certo, esse será o resultado no seu `terminal`.

![sucesso executando o script](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6z8wklpl8xi3r061s7rx.png)

Se tudo deu certo até aqui significa que você conseguiu configurar o `WSL` para rodar o `Expo`! Agora precisamos configurar o `Expo` para rodar o `WSL`.

## 2. CRIANDO E CONFIGURANDO UM PROJETO EXPO

- Abra o seu terminal com `WSL` e rode o seguinte comando para criar um projeto `Expo`.
```bash


npx create-expo-app


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Após criar o projeto você irá criar um script node chamado &lt;code&gt;get_network_local_ip.js&lt;/code&gt; na Root do seu projeto.&lt;/li&gt;
&lt;li&gt;Dentro desse arquivo, &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;Nesse &lt;code&gt;script&lt;/code&gt; nós usamos duas &lt;code&gt;variáveis de ambiente&lt;/code&gt; chamadas: &lt;code&gt;LOCAL_CONNECTION_INTERFACE_NAME&lt;/code&gt; e &lt;code&gt;LOCAL_CONNECTION_IPV4_SEARCH&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Nós precisamos dessas duas &lt;code&gt;envs&lt;/code&gt; para poder rodar o projeto no WSL, vamos aprender a achar os valores necessários pras essas &lt;code&gt;envs&lt;/code&gt;, para isso vamos rodar o seguinte comando 
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;netsh.exe interface ip show address&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;pre &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight plaintext"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;code&amp;gt;- Procure pela &lt;span class="sb"&gt;`&lt;/span&gt;Ethernet&lt;span class="sb"&gt;`&lt;/span&gt; que tenha o &lt;span class="sb"&gt;`&lt;/span&gt;DHCP habilitado&lt;span class="sb"&gt;`&lt;/span&gt; como sim, no meu caso é apenas &lt;span class="sb"&gt;`&lt;/span&gt;Ethernet&lt;span class="sb"&gt;`&lt;/span&gt;, mas no seu caso pode ser &lt;span class="sb"&gt;`&lt;/span&gt;Ethernet 1&lt;span class="sb"&gt;`&lt;/span&gt; ou &lt;span class="sb"&gt;`&lt;/span&gt;Ethernet 2&lt;span class="sb"&gt;`&lt;/span&gt; ou &lt;span class="sb"&gt;`&lt;/span&gt;WiFi&lt;span class="sb"&gt;`&lt;/span&gt;, etc. 

&lt;span class="o"&gt;![&lt;/span&gt;imagem mostrando os dados que precisamos pro tutorial]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8aqkv2ttx2hyul8ed7q.png&lt;span class="o"&gt;)&lt;/span&gt;

- Dessas informações nós queremos o &lt;span class="sb"&gt;`&lt;/span&gt;Ethernet&lt;span class="sb"&gt;`&lt;/span&gt; e o &lt;span class="sb"&gt;`&lt;/span&gt;endereço IP&lt;span class="sb"&gt;`&lt;/span&gt; pro nosso &lt;span class="sb"&gt;`&lt;/span&gt;script&lt;span class="sb"&gt;`&lt;/span&gt; e esses serão os valores das nossas &lt;span class="sb"&gt;`&lt;/span&gt;envs&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
- Agora vamos criar o arquivo de &lt;span class="sb"&gt;`&lt;/span&gt;envs&lt;span class="sb"&gt;`&lt;/span&gt; e preenche-las para o nosso script
- Na Root &lt;span class="k"&gt;do &lt;/span&gt;seu projeto crie um arquivo chamado &lt;span class="sb"&gt;`&lt;/span&gt;.env.local&lt;span class="sb"&gt;`&lt;/span&gt; e coloque as seguintes &lt;span class="sb"&gt;`&lt;/span&gt;envs&lt;span class="sb"&gt;`&lt;/span&gt; lá:
&lt;span class="sb"&gt;```&lt;/span&gt;bash


&lt;span class="nv"&gt;LOCAL_CONNECTION_INTERFACE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Ethernet"&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_CONNECTION_IPV4_SEARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Endere"&lt;/span&gt;


&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;h3&amp;gt;
  &amp;lt;a &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"observa%C3%A7%C3%B5es-importantes"&lt;/span&gt; &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"#observa%C3%A7%C3%B5es-importantes"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &amp;lt;/a&amp;gt;
  OBSERVAÇÕES IMPORTANTES!!!!!
&amp;lt;/h3&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Por que a segunda &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;LOCAL_CONNECTION_IPV4_SEARCH&amp;lt;/code&amp;gt; tem como valor &amp;lt;code&amp;gt;Endere&amp;lt;/code&amp;gt; e não &amp;lt;code&amp;gt;Endereço IP&amp;lt;/code&amp;gt;?

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt; Alguns terminais podem ter um erro de &amp;lt;code&amp;gt;utf-8&amp;lt;/code&amp;gt; e podem não reconhecer a letra &amp;lt;code&amp;gt;ç&amp;lt;/code&amp;gt;, nesse caso ele não vai achar o valor correto na hora de executar o script e irá dar &amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;erro&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;! Por isso colocaremos apenas &amp;lt;code&amp;gt;Endere&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Se a linguagem &lt;span class="k"&gt;do &lt;/span&gt;seu sistema estiver em inglês, o &amp;lt;code&amp;gt;windows&amp;lt;/code&amp;gt; retornará o IP em &amp;lt;code&amp;gt;IP Adress&amp;lt;/code&amp;gt; em vez de &amp;lt;code&amp;gt;Endereço IP&amp;lt;/code&amp;gt;, caso essa seja a sua situação, troque no &amp;lt;code&amp;gt;.env.local&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Endere&amp;lt;/code&amp;gt; por &amp;lt;code&amp;gt;IP Adress&amp;lt;/code&amp;gt; senão, você não conseguirá rodar o projeto.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;h2&amp;gt;
  &amp;lt;a &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"3-comando-para-rodar-o-expo-no-wsl"&lt;/span&gt; &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"#3-comando-para-rodar-o-expo-no-wsl"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &amp;lt;/a&amp;gt;
  3. COMANDO PARA RODAR O EXPO NO WSL
&amp;lt;/h2&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;
&amp;lt;p&amp;gt;Após essas configurações nós precisaremos apenas criar o comando no &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; para rodar o projeto. Faremos da seguinte forma:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt; Abriremos o arquivo &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; &lt;span class="k"&gt;do &lt;/span&gt;nosso projeto&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Colocaremos o seguinte comando na parte de &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; 
&lt;span class="sb"&gt;```&lt;/span&gt;bash
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&lt;span class="s2"&gt;"start:wsl"&lt;/span&gt;: &lt;span class="s2"&gt;"REACT_NATIVE_PACKAGER_HOSTNAME=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;node get_network_local_ip.js&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; expo start"&lt;/span&gt;,&amp;lt;/p&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;pre &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight plaintext"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;code&amp;gt;
- Ficando dessa forma

&lt;span class="o"&gt;![&lt;/span&gt;scripts no package.json]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6kcdpr1dqn1gl05zs7g.png&lt;span class="o"&gt;)&lt;/span&gt;

- Agora rode o comando que acabamos de criar no terminal com &lt;span class="sb"&gt;`&lt;/span&gt;npm run start:wsl&lt;span class="sb"&gt;`&lt;/span&gt;
- Se tudo der certo, ele irá mostrar um &lt;span class="sb"&gt;`&lt;/span&gt;QR code&lt;span class="sb"&gt;`&lt;/span&gt; na tela, baixe o aplicativo &lt;span class="sb"&gt;`&lt;/span&gt;Expo GO&lt;span class="sb"&gt;`&lt;/span&gt; e escaneie esse &lt;span class="sb"&gt;`&lt;/span&gt;QR code&lt;span class="sb"&gt;`&lt;/span&gt; e pronto, você tá rodando o Expo pelo &lt;span class="sb"&gt;`&lt;/span&gt;WSL&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

Caso você goste dessa opção de rodar o seu projeto no seu celular você pode parar por aqui, mas caso você queira rodar o seu projeto no seu computador e  o melhor de tudo, &lt;span class="k"&gt;**&lt;/span&gt;SEM PRECISAR DE ANDROID STUDIO PARA ISSO&lt;span class="k"&gt;**&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;acesse a parte 2 desse artigo e entenda como.]&lt;span class="o"&gt;(&lt;/span&gt;https://dev.to/devhat/como-rodar-um-projeto-expo-por-um-virtual-device-no-wsl-2i16&lt;span class="o"&gt;)&lt;/span&gt;

Caso esse artigo tenha sido útil para você, de uma olhada na nossa comunidade, a &lt;span class="o"&gt;[&lt;/span&gt;devhat]&lt;span class="o"&gt;(&lt;/span&gt;https://discord.gg/3gsMAEumEd&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; É aqui, que encontramos apoio, compartilhamos ideias e nos inspiramos mutuamente. A comunidade DevHatt não é apenas um conjunto de desenvolvedores, mas uma família unida pela paixão pela tecnologia e inovação.

Se você ainda não faz parte desta comunidade, convidamos você a se juntar a nós no &lt;span class="o"&gt;[&lt;/span&gt;Discord DevHatt]&lt;span class="o"&gt;(&lt;/span&gt;https://discord.gg/3gsMAEumEd&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>expo</category>
      <category>reactnative</category>
      <category>wsl</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Como rodar um projeto Expo por um Virtual Device no WSL</title>
      <dc:creator>Victor Hugo</dc:creator>
      <pubDate>Mon, 04 Mar 2024 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/como-rodar-um-projeto-expo-por-um-virtual-device-no-wsl-2i16</link>
      <guid>https://forem.com/devhat/como-rodar-um-projeto-expo-por-um-virtual-device-no-wsl-2i16</guid>
      <description>&lt;p&gt;Para seguir com esse artigo, você precisará concluir o ultimo &lt;a&gt;artigo ensinando a configurar o WSL para o Expo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. INSTALANDO O WSA
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agora para rodar o Expo em um &lt;code&gt;Virtual Device&lt;/code&gt; no &lt;code&gt;WSL (Window Subsystem for Linux)&lt;/code&gt; nós precisamos instalar o &lt;code&gt;WSA (Windows Subsystem for Android)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Abra &lt;a href="https://github.com/MustardChef/WSABuilds?tab=readme-ov-file" rel="noopener noreferrer"&gt;este link&lt;/a&gt; e procure por essa tabela no &lt;code&gt;README&lt;/code&gt;, feito isso baixe a ultima versão estável do &lt;code&gt;WSA&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajxwtd391b96wnlwiqnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajxwtd391b96wnlwiqnu.png" alt="tabela mostrando para baixar a versao estavel do wsa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mova o arquivo &lt;code&gt;ZIP&lt;/code&gt; que você acabou de baixar para a Root da pasta &lt;code&gt;C:\&lt;/code&gt; igual você fez com o script de &lt;code&gt;PowerShell&lt;/code&gt; no &lt;a href="https://dev.tolink%20do%20artigo%201"&gt;artigo 1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Agora com o &lt;code&gt;ZIP&lt;/code&gt; no lugar certo extraia o arquivo com &lt;code&gt;winRAR&lt;/code&gt; ou &lt;code&gt;7z&lt;/code&gt; e exclua o arquivo &lt;code&gt;.ZIP&lt;/code&gt;, entre na pasta que acabou de ser extraída e veja se tem uma pasta dentro, se houver, recorte ela e cole-a no root do seu C: novamente.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Abra a pasta, clique com o botão direito no Install.ps1 e clique em &lt;code&gt;Executar com o PowerShell&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso &lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/74tnainl10m7lk5kcwpw.png" rel="noopener noreferrer"&gt;você encontre esse erro&lt;/a&gt; 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74tnainl10m7lk5kcwpw.png" alt="o arquivo C:\WSA_2311.400000.5.0_x64\Install.ps1 nao pode ser carregado porque a execucao de scripts foi desabilitada neste sistema. Para obter mais informacoes consulte about_Execution_policies em https://go.microsoft.com/fwlink/?linkID=135170"&gt;
&lt;/li&gt;
&lt;li&gt;Clique no arquivo &lt;code&gt;Run.bat&lt;/code&gt; e execute ele.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Depois que o comando rodar, vão aparecer algumas popups e umas caixas de dialogo clique em continue e deixe os processos carregarem. Não feche inicialmente nenhuma aba, apenas minimize.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Procure a aba que se chame &lt;code&gt;Windows Subsystem for Android&lt;/code&gt; com o titulo &lt;code&gt;System&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Vá no canto superior esquerdo e selecione &lt;code&gt;advanced settings&lt;/code&gt; e ative o &lt;code&gt;developer mode&lt;/code&gt; e permita as coisas que precisarem permitir em nível de admin.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. INSTALANDO O SDK DO ANDROID
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nós precisamos desse &lt;code&gt;sdk&lt;/code&gt; para termos acesso as &lt;code&gt;API's Nativas do android&lt;/code&gt; pelo &lt;code&gt;javascript&lt;/code&gt;, sem isso nós não conseguiremos criar os nossos aplicativos de forma adequada. Além disso precisamos do &lt;code&gt;sdk&lt;/code&gt; para prosseguir pro próximo passo &lt;/li&gt;
&lt;li&gt;Siga o passo de instalação desse GIST &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Rode os comandos um por um pra evitar qualquer problema.&lt;/li&gt;
&lt;li&gt;Lembre-se de trocar o path de &lt;code&gt;Sdk&lt;/code&gt; para &lt;code&gt;sdk&lt;/code&gt; pois o padrão do expo é &lt;code&gt;sdk&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;NÃO&lt;/code&gt;&lt;/strong&gt; rode o ultimo comando do &lt;code&gt;gradle&lt;/code&gt;.
## 3. INSTALANDO O ADB&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;O &lt;code&gt;ADB (Android Debug Bridge)&lt;/code&gt; é uma ferramenta de linha de comando que faz parte do &lt;code&gt;SDK&lt;/code&gt; do &lt;code&gt;Android&lt;/code&gt;. Ele cria a conexão do nosso &lt;code&gt;WSL&lt;/code&gt; ao &lt;code&gt;WSA&lt;/code&gt;, sem ele nós não conseguiremos fazer essa conexão e por consequência não conseguiremos usar o &lt;code&gt;WSA&lt;/code&gt; para rodar o nosso projeto em um &lt;code&gt;Virtual Device&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Acesse &lt;a href="https://github.com/awake558/adb-win/tree/master/SDK_Platform-Tools_for_Linux" rel="noopener noreferrer"&gt;esse link&lt;/a&gt; e baixe a versão mais recente encontrada nesse repositório.&lt;/li&gt;

&lt;li&gt;Pegue o &lt;code&gt;ZIP&lt;/code&gt; que você acabou de baixar e coloque na &lt;code&gt;HOME&lt;/code&gt; do seu WSL&lt;/li&gt;

&lt;li&gt;Depois de jogar o seu &lt;code&gt;ZIP&lt;/code&gt; lá, extraia ele pelo terminal usando o seguinte comando:
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;unzip &amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;pre &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight plaintext"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;code&amp;gt;- Se tudo der certo, você terá a pasta &lt;span class="sb"&gt;`&lt;/span&gt;platform-tools&lt;span class="sb"&gt;`&lt;/span&gt; na home &lt;span class="k"&gt;do &lt;/span&gt;seu terminal

&lt;span class="o"&gt;![&lt;/span&gt;mostrando a pasta na home &lt;span class="k"&gt;do &lt;/span&gt;terminal]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecvf6gciwr6dthpdqbmw.png&lt;span class="o"&gt;)&lt;/span&gt;
- Acesse essa pasta e rode o seguinte comando:
&lt;span class="sb"&gt;```&lt;/span&gt;bash


./adb connect &amp;amp;lt&lt;span class="p"&gt;;&lt;/span&gt;ip-do-wsl&amp;amp;gt&lt;span class="p"&gt;;&lt;/span&gt;:&amp;amp;lt&lt;span class="p"&gt;;&lt;/span&gt;porta-do-WSA&amp;amp;gt&lt;span class="p"&gt;;&lt;/span&gt;


&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;h3&amp;gt;
  &amp;lt;a &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"como-descobrir-o-ip-do-wsl"&lt;/span&gt; &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"#como-descobrir-o-ip-do-wsl"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &amp;lt;/a&amp;gt;
  COMO DESCOBRIR O IP DO WSL
&amp;lt;/h3&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;No seu terminal &lt;span class="k"&gt;do &lt;/span&gt;WSL, execute o mesmo comando:
&lt;span class="sb"&gt;```&lt;/span&gt;bash
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;netsh.exe interface ip show address&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;pre &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"highlight plaintext"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;lt;code&amp;gt;- Procure pelo &lt;span class="sb"&gt;`&lt;/span&gt;vEthernet &lt;span class="o"&gt;(&lt;/span&gt;WSL&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="o"&gt;![&lt;/span&gt;mostrando o resultado &lt;span class="k"&gt;do &lt;/span&gt;comando no terminal]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/32j40187atghmdy2hn12.png&lt;span class="o"&gt;)&lt;/span&gt;

- No &lt;span class="sb"&gt;`&lt;/span&gt;Endereço IP&lt;span class="sb"&gt;`&lt;/span&gt;terá o IP &lt;span class="k"&gt;do &lt;/span&gt;WSL que precisamos usar no comando acima.
&lt;span class="c"&gt;### COMO DESCOBRIR A PORTA DO WSA&lt;/span&gt;
- Abra o WSA &lt;span class="o"&gt;(&lt;/span&gt;clique na barra de pesquisa &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;windows&lt;span class="sb"&gt;`&lt;/span&gt; e escreva &lt;span class="sb"&gt;`&lt;/span&gt;android&lt;span class="sb"&gt;`&lt;/span&gt; nele&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;![&lt;/span&gt;WSA na barra de pesquisa &lt;span class="k"&gt;do &lt;/span&gt;windows]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ho32xejy91me2tynpss.png&lt;span class="o"&gt;)&lt;/span&gt;

- Acesse a aba de Advanced settings

&lt;span class="o"&gt;![&lt;/span&gt;mostrando a aba advanced settings no wsa]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afmclgf4m0o0qecoz1hl.png&lt;span class="o"&gt;)&lt;/span&gt;

- Esses números depois &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;:&lt;span class="sb"&gt;`&lt;/span&gt; são a porta &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;WSA&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;![&lt;/span&gt;porta &lt;span class="k"&gt;do &lt;/span&gt;WSA]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztnyo4n46u1fsk6vtv2z.png&lt;span class="o"&gt;)&lt;/span&gt;

- caso você não encontre a porta &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;WSA&lt;span class="sb"&gt;`&lt;/span&gt; aqui, você terá que baixar a versão de &lt;span class="sb"&gt;`&lt;/span&gt;pre release&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;WSA.
- O padrão é &lt;span class="sb"&gt;`&lt;/span&gt;58526&lt;span class="sb"&gt;`&lt;/span&gt;, mas no seu caso pode mudar, é bom verificar.
- Pronto, agora você sabe  o IP &lt;span class="k"&gt;do &lt;/span&gt;seu WSL e a porta &lt;span class="k"&gt;do &lt;/span&gt;WSA, agora você pode rodar  o comando.
- Depois de fazer isso, você pode rodar o projeto &lt;span class="sb"&gt;`&lt;/span&gt;Expo&lt;span class="sb"&gt;`&lt;/span&gt; de novo e aperte  o botão &lt;span class="sb"&gt;`&lt;/span&gt;a&lt;span class="sb"&gt;`&lt;/span&gt; para abrir o projeto com o &lt;span class="sb"&gt;`&lt;/span&gt;WSA&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;![&lt;/span&gt;mostrando o expo rodando corretamente com o virtual device]&lt;span class="o"&gt;(&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jqq3pyy5uqlgy8lqtnd3.png&lt;span class="o"&gt;)&lt;/span&gt;

Finalizamos, caso esse artigo tenha sido útil para você, de uma olhada na nossa comunidade, a &lt;span class="o"&gt;[&lt;/span&gt;devhat]&lt;span class="o"&gt;(&lt;/span&gt;https://discord.gg/3gsMAEumEd&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; É aqui, que encontramos apoio, compartilhamos ideias e nos inspiramos mutuamente. A comunidade DevHatt não é apenas um conjunto de desenvolvedores, mas uma família unida pela paixão pela tecnologia e inovação.

Se você ainda não faz parte desta comunidade dinâmica, convidamos você a se juntar a nós no &lt;span class="o"&gt;[&lt;/span&gt;Discord DevHatt]&lt;span class="o"&gt;(&lt;/span&gt;https://discord.gg/3gsMAEumEd&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wsl</category>
      <category>reactnative</category>
      <category>javascript</category>
      <category>expo</category>
    </item>
    <item>
      <title>Vue Primeiras Impressões</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Tue, 20 Feb 2024 15:56:56 +0000</pubDate>
      <link>https://forem.com/devhat/vue-primeiras-impressoes-40d9</link>
      <guid>https://forem.com/devhat/vue-primeiras-impressoes-40d9</guid>
      <description>&lt;p&gt;Tem muitos anos que tenho um amor platônico pelo VueJS, ele tinha tudo que eu sempre quis num framework, possuía em seu ecossistema coisas legais tanto do React quanto do Angular &lt;del&gt;(eca)&lt;/del&gt;, mas eu nunca tinha pegado pra estudar Vue de fato, tampouco trabalhei em lugares que usavam Vue, então sempre que me perguntavam o que eu achava de Vue eu dizia que era maravilhoso apesar de nunca ter usado 😅&lt;/p&gt;

&lt;p&gt;Como parte da minha retomada recente aos estudos em TI resolvi fazer algo em Vue de fato e, somado a isso, eu sempre quis fazer um &lt;em&gt;masonry grid&lt;/em&gt;, aí, unindo o útil ao agradável, resolvi fazer um projeto de &lt;em&gt;masonry grid&lt;/em&gt; em Vue!&lt;/p&gt;




&lt;h2&gt;
  
  
  O Projeto
&lt;/h2&gt;

&lt;p&gt;A ideia era ser algo simples em termos de layout e lógica no geral, nada super complexo que demoraria pra fazer, tanto que acabei levando coisa de uma semana pra terminar tudo, o importante era:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fazer um &lt;em&gt;masonry grid&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Aprender o básico de Vue&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;só isso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E devo dizer que estou bem satisfeito com meu foco! 😋&lt;/p&gt;

&lt;p&gt;Inicialmente ia fazer algo que batia na API do LOL (League of Legends) pra pegar minhas últimas partidas e listar elas em &lt;em&gt;masonry&lt;/em&gt;, mas rapidamente vi que não sabia bem qual dado usar pra ser o dado que definiria a altura do elemento, quando percebi isso mudei pra uma listagem de contribuição em projetos Open Source do Github!&lt;/p&gt;

&lt;p&gt;Muito simples, o usuário coloca um projeto no formato &lt;em&gt;user/repo&lt;/em&gt;, por exemplo &lt;code&gt;facebook/react&lt;/code&gt; e eu listo os contribuidores desse projeto. A variação na altura dos cards do grid seria de acordo com quanto mais a pessoa contribuiu no projeto, mais contribuição, maior o card!&lt;/p&gt;




&lt;h2&gt;
  
  
  Masonry Grid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Layout
&lt;/h3&gt;

&lt;p&gt;Eu sempre quis fazer uma &lt;em&gt;masonry grid&lt;/em&gt; desde quando em 2020 eu trabalhei numa empresa que precisou fazer um, mas acabei não podendo pegar a tarefa pra deixar ela pra um dos meus juniores ;-;&lt;/p&gt;

&lt;p&gt;Pra quem não sabe, um &lt;em&gt;masonry grid&lt;/em&gt; é basicamente o layout do Pinterest, um grid onde as células que o compõem não possuem um tamanho fixo, assim fica um, bom, um &lt;em&gt;masonry grid&lt;/em&gt; 😄&lt;/p&gt;

&lt;p&gt;Fazer o &lt;em&gt;masonry grid&lt;/em&gt; foi até que simples, inicialmente fiz pegando como referência &lt;a href="https://www.youtube.com/watch?v=KrPz_wmBsAE"&gt;esse vídeo do Kevin Powell&lt;/a&gt;, mas acabei descobrindo que a forma que ele usa nesse vídeo, mesmo sendo um vídeo de 3 anos atrás, ainda não é bem suportada entre os navegadores, na verdade, de acordo com o &lt;a href="https://caniuse.com/mdn-css_properties_grid-template-rows_masonry"&gt;Can I Use&lt;/a&gt; ele só é suportado pelo Safari Technology Preview (nem sei o que é isso)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmkstipm0qj75f5s9m2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmkstipm0qj75f5s9m2n.png" alt="Can I Use mostrando que template rows para grid layout com masonry é muito mal suportado" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Decepcionante!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Felizmente eu conhecia outro método de fazer &lt;em&gt;masonry grid&lt;/em&gt; que é usando &lt;em&gt;Multi-column Layout&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;Pra quem não conhece, o &lt;em&gt;Multi-column Layout&lt;/em&gt; é um formato de layout baseado em colunas (quem diria, não é mesmo 🤣), você já viu muito disso, só talvez não conheça pelo nome, por exemplo uma página de jornal (sim, o de papel) onde cada coluna é a continuação do texto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34du1lt29vyqxv82drm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34du1lt29vyqxv82drm1.png" alt="Exemplo de folha de jornal como um exemplo pro modelo de layout Multi-column" width="435" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A questão é que a gente não popula as colunas com texto, mas sim com &lt;code&gt;div&lt;/code&gt;s!&lt;/p&gt;

&lt;p&gt;E pra fazer isso é bem simples já que esse formato de layout não se importa com qual o conteúdo que está lá dentro, ele apenas aplica o conteúdo dentro do que ele tem de espaço disponível, no fim o código que de fato faz o &lt;em&gt;masonry grid&lt;/em&gt; acontecer no meu projeto são essas 3 linhas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;column-count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;column-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--masonry-spacing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;column-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;210px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;column-count&lt;/code&gt; diz que eu não qu&lt;/p&gt;

&lt;p&gt;ero limitar a quantidade de colunas, vai quantas couberem.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;column-gap&lt;/code&gt; diz o espaçamento entre uma coluna e outra, no caso eu usei uma variável pra que o espaçamento entre as colunas e o espaçamento entre os itens fosse o mesmo, pra ficar algo mais uniforme mesmo evitando que eu alterasse em um lugar e tivesse que lembrar de alterar no outro lugar também.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;column-width&lt;/code&gt; é um valor fixo pois é justamente o tamanho que eu quero pra as colunas, como a quantidade de colunas é definida dinamicamente, isso aqui diz "coloca o tanto de colunas de &lt;code&gt;210px&lt;/code&gt; de largura que couber na tela."&lt;/p&gt;

&lt;p&gt;O interessante do &lt;em&gt;Multi-column Layout&lt;/em&gt; é que ele já organiza a distribuição dos itens automaticamente pra você, então não preciso me preocupar, coisa que pode até soar estranho porque geralmente coisas que crescem pra baixo podem dar trabalho, mas nesse caso não dá, ele só sai andando e maravilha!&lt;/p&gt;

&lt;h3&gt;
  
  
  Cards
&lt;/h3&gt;

&lt;p&gt;Como era um &lt;em&gt;masonry grid&lt;/em&gt; precisava ainda criar os itens do grid, esses fiz de uma forma bem simples, cada item teria um gradiente de baixo pra cima de tamanho fixo, ou seja, se o container fosse pequeno o gradiente não iria da cor X pra a cor Y, ele iria da cor X até o tamanho do container, podendo não chegar na cor Y, ou seja, teria uma referência visual de barra do quanto alguém contribuiu&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2d23vwltrnprtl028d73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2d23vwltrnprtl028d73.png" alt="Comparação dos dois cards um com muitas contribuições e outro com poucas" width="451" height="1063"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coloquei além do fundo um efeitinho de hover, a foto do contribuidor, o nome e a quantidade de commits, inclusive a quantidade de commits é justamente o que define o tamanho do card!&lt;/p&gt;

&lt;p&gt;Acabei decidindo que quem teve menos que 250 contribuições iria ficar cinza porque tinha muita gente com pouca contribuição o que acabava fazendo tudo ficar vermelho o que era ruim visualmente. Pra os que contribuíram pouco também coloquei um mínimo pra a altura pra não quebrar quando fosse bem pouquinha contribuição e foi isso, bem simples a parte dos cards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vue
&lt;/h2&gt;

&lt;p&gt;O setup inicial do projeto em Vue foi simples pra iniciar a codar logo, fui no &lt;em&gt;Quick Start&lt;/em&gt; do &lt;a href="https://vuejs.org/"&gt;site do Vue&lt;/a&gt; copiei o comando &lt;code&gt;pnpm create vue@latest&lt;/code&gt; e alegria, respondi se queria TypeScript, Vuex e coisas assim, depois tudo configurado e preparado pra codar!&lt;/p&gt;

&lt;p&gt;Na parte de codar em Vue pra mim foi um pouco complicado, eu geralmente antes de fazer um projeto, faço diversas configurações pra deixar o ambiente do jeito que eu gosto de codar, por exemplo, eu prefiro separar os arquivos de &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt; e &lt;code&gt;script&lt;/code&gt;, também costumo criar arquivos separados pra tipagem e coisas assim, mas me desafiei a fazer as coisas da forma como a comunidade em geral prefere fazer!&lt;/p&gt;

&lt;p&gt;Assim eu codei com tudo dentro de um arquivo &lt;code&gt;.vue&lt;/code&gt;, interfaces e afins colocava tudo dentro da tag &lt;code&gt;script&lt;/code&gt; também e alguns outros detalhes que comento a seguir!&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensão do Vue para VSCode
&lt;/h3&gt;

&lt;p&gt;Achei inicialmente estranho que tinha uma extensão específica para Vue, mas logo entendi que é pra interpretar os arquivos &lt;code&gt;.vue&lt;/code&gt; que não eram entendidos pelo VSCode, inclusive nessa descobri que o ChatGPT também não reconhece o formato &lt;code&gt;.vue&lt;/code&gt;, todos os code snippets que ele me ofereceu nas perguntas que fiz eram sem cores, tudo branco no preto.&lt;/p&gt;

&lt;p&gt;A extensão do Vue parecia funcionar direitinho, mas teve o seguinte caso que não funcionou muito bem, a colorização das coisas ficou bugada, esse código funciona, mas considera que a &lt;code&gt;const&lt;/code&gt; é uma função porque ele não entendeu o fechamento do template string&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2obzz0akgvwihbf72l1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2obzz0akgvwihbf72l1v.png" alt="Erro do interpretador da extensão do Vue colorindo erroneamente o const" width="798" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fora isso não tive outros problemas, mas fico me perguntando se não existem outros problemas nessa parada além do que eu experienciei.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe e Estrutura
&lt;/h3&gt;

&lt;p&gt;A sintaxe do Vue (falando de Vue3) é bastante interessante, o modo como gerar loops e condicionais pra renderização de tags é bem semelhante a como o Angular faz&lt;/p&gt;

&lt;p&gt;, tudo dentro das tags, o que facilita a leitura das tags em si, sem &lt;code&gt;.map&lt;/code&gt; no meio de tags coisa que eu &lt;strong&gt;odeio&lt;/strong&gt; porque pra mim isso prejudica a leitura.&lt;/p&gt;

&lt;p&gt;O modo como o Vue funciona foi estranho pra mim de início, não é uma classe, não é uma função, ele apenas é, existe, você usa métodos pra definir interface de props e outros métodos que à primeira vista não parecem se comunicar diretamente, mas se comunicam, parece até um pouco de bruxaria!&lt;/p&gt;

&lt;p&gt;Por exemplo, em Vue3 você não precisa exportar nem fazer nada com as variáveis que você declara e recebem valores. Declarou? Já dá pra usar no &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; do componente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c1"&gt;// declaro a propriedade&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alecell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- uso a propriedade --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pra mim é MUITA bruxaria, não é pouca não! 🤣&lt;/p&gt;

&lt;p&gt;Inclusive se a variável em questão for um state, que nos scripts é usado como &lt;code&gt;state.value&lt;/code&gt;, no template não precisamos colocar o &lt;code&gt;.value&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c1"&gt;// declaro a propriedade&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alecell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clearName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- uso a propriedade --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"clearName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Set name&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso acima, perceba que pra alterar o nome no &lt;code&gt;script&lt;/code&gt; usamos &lt;code&gt;name.value&lt;/code&gt;, mas no &lt;code&gt;template&lt;/code&gt; podemos usar apenas &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Nomeando Componentes e Seus Arquivos
&lt;/h4&gt;

&lt;p&gt;Aqui teve uma coisa que achei bastante chata do Vue que ele me obriga a chamar um componente Card de Card[Alguma coisa] tipo CardComponent, eu não posso chamar um componente de apenas uma palavra, não entendi o motivo disso, tampouco entendi o porquê isso não poderia ser feito nos internos do Vue evitando que tenhamos que fazer isso nós mesmos, achei estranho e não achei nenhuma resposta.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Isso pode até ser necessário, mas o motivo do porquê não é feito automaticamente, é um mistério pra mim&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Vue3 API
&lt;/h4&gt;

&lt;p&gt;O tanto que eu fiquei em dúvida de como fazer as coisas no Vue é sacanagem, demorou, sei que não existe certo nessas coisas, mas senhor da glória, o tanto que eu fiquei em dúvida se eu deveria usar &lt;code&gt;defineProps&lt;/code&gt; ou &lt;code&gt;defineComponent&lt;/code&gt; é sacanagem! Não teve nenhum jeito claro através da doc sobre isso, aliás, esse problema me mostrou outro problema, que era a diferença entre &lt;em&gt;Vue Composition&lt;/em&gt; e &lt;em&gt;Vue Options&lt;/em&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Vue Composition API VS Vue Options API
&lt;/h5&gt;

&lt;p&gt;Aparentemente o Vue3 veio ano passado e com isso trazendo a &lt;em&gt;Composition API&lt;/em&gt;, uma API que não obriga a gente a usar aquele clássico objetão do Vue&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alecell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;changeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newName&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas algo mais comum de se ver quando codamos, lembra até um pouco mais o React nesse caso&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c1"&gt;// ref é como o useState do React&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alecell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;changeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newName&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ambos os códigos fazem a mesma coisa, mas usam API's diferentes do mesmo framework.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;É como escrever um componente é _function components&lt;/em&gt; e &lt;em&gt;class components&lt;/em&gt; em React, ambos fazem a mesma coisa, só muda o como escreve_&lt;/p&gt;

&lt;p&gt;No fim das contas o &lt;code&gt;defineComponent&lt;/code&gt; é uma coisa do &lt;em&gt;Options API&lt;/em&gt; enquanto o &lt;code&gt;defineProps&lt;/code&gt; é do &lt;code&gt;Composition API&lt;/code&gt;. Na verdade eles sequer são "concorrentes", eles fazem coisas diferentes.&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; VS &lt;code&gt;defineComponent&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;O &lt;code&gt;defineComponent&lt;/code&gt; é o setup inicial do componente, mas um jeito mais verboso de escrever, hoje é possível usar &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; que remove a necessidade de escrever esse pedaço de código. No fim o modo mais simples de escrever é usando o &lt;code&gt;setup option&lt;/code&gt; do &lt;code&gt;script&lt;/code&gt; então acabei usando esse formato ao invés do `define&lt;/p&gt;

&lt;p&gt;Component` por questão de comodidade, mas meio que dá pra fazer a mesma coisa com os dois modos.&lt;/p&gt;

&lt;p&gt;Aí no caso, você usa &lt;code&gt;defineProps&lt;/code&gt; quando estiver em um &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; e usa &lt;code&gt;defineComponent&lt;/code&gt; quando não estiver num &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;, esse método ainda tem a opção de você expor as props através dele.&lt;/p&gt;

&lt;p&gt;Eu segui escrevendo tudo usando a &lt;em&gt;Composition API&lt;/em&gt; por ser o método mais moderno, ainda no futuro pretendo fazer algo usando a &lt;em&gt;Options API&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando um composable
&lt;/h4&gt;

&lt;p&gt;Devo dizer que escrever essa seção faz eu me sentir meio burro, mas faz parte, eu apanhei horrores pra escrever meu primeiro Composable, vale dizer aqui que um composable é basicamente um hook, sério, usa a mesma lógica que vai ser sucesso.&lt;/p&gt;

&lt;p&gt;Meu projeto precisava bater em uma API e queria criar um composable que batia na API do github, dava um shuffle dos dados e aí retornava os dados pra o componente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;aqui acabou&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mano o tanto que eu sofri pra fazer isso é sacanagem, mas isso aconteceu porque eu fui, como disse antes, &lt;strong&gt;burro&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Primeiro eu tentei dar um &lt;code&gt;await&lt;/code&gt; no composable o que, não surpreendentemente, não funcionou, um amigo que conhece Vue disse que o que eu fiz funciona no Vuxt, mas não no Vue normal, mas eu achei um tutorial na internet que poderia salvar minha vida: &lt;a href="https://www.vuemastery.com/blog/coding-better-composables-5-of-5/"&gt;https://www.vuemastery.com/blog/coding-better-composables-5-of-5/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poxa, eu vi isso, achei bizarro de funcionar, mas o cara não ia fazer um artigo trolando né? Bom, SE EU TIVESSE LIDO ao invés de ficar tentando copiar os snippets teria sido MUITO BOM, mas eu não li, então eu fiquei coisa de uns 3 dias tentando entender porque quando eu chamava o composable no corpo do componente funcionava, mas quando eu colocava na chamada do método de request ele não ia nem ferrando, bom, isso é porque &lt;strong&gt;esse método é apenas pra o setup&lt;/strong&gt;, não é algo pra eventos ou coisas mais dinâmicas.&lt;/p&gt;

&lt;p&gt;Foram dias, até que fiz uma pergunta decente pro GPT e ele mostrou como fazer o composable que, pasmem, era igualzinho um hook do React 😶&lt;/p&gt;

&lt;p&gt;Bastava eu retornar os estados &lt;strong&gt;e o método de requisição&lt;/strong&gt; pra o componente que ia funcionar, nada de mais, simples, mas eu fiquei viajando nas minhas próprias ideias de que uma request assíncrona &lt;strong&gt;sem&lt;/strong&gt; &lt;code&gt;await&lt;/code&gt; seria resolvida em tempo de execução só porque Deus quer.&lt;/p&gt;

&lt;p&gt;Finalmente com uma versão decente do composable eu finalmente tinha ele funcionando conforme eu esperava, já tava tudo praticamente pronto, só faltava isso e o &lt;code&gt;input&lt;/code&gt; de texto.&lt;/p&gt;

&lt;p&gt;Fiz rapidinho um input de texto e um botão e BOOM, tava funcionando certinho como eu queria 🥹&lt;/p&gt;




&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;Achei bem interessante essa experiência de codar em Vue, quero em breve poder criar algo mais robusto com esse framework que, depois de codar nele, eu ainda &lt;strong&gt;amo&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Uma coisa que gostei muito nele é que, mesmo ele tendo mais boilerplate, é muito mais simples de fazer as coisas no Vue e você consegue fazer mais codando menos, isso é bem interessante e algo que eu já imaginava com relação a esse framework maravilhoso!&lt;/p&gt;

&lt;p&gt;Tudo em termos de setup foi zero estresse, muito decorrente do boilerplate que escolhi, mas também porque o Vue é um framework simples, algo que ele pega do React de forma incrível, permitindo que reutilizemos esse conhecimento, mas em outro framework!&lt;/p&gt;

&lt;p&gt;Pra quem quiser conferir o projeto ele &lt;a href="https://alecell.github.io/masonry-github-contrib/"&gt;ta aqui&lt;/a&gt; e o código &lt;a href="https://github.com/Alecell/masonry-github-contrib"&gt;ta aqui&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Valeu pra quem leu e até a próxima!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vue</category>
      <category>typescript</category>
      <category>css</category>
    </item>
    <item>
      <title>TIL - Today I Learn 12-11 18-11</title>
      <dc:creator>Victor Hugo</dc:creator>
      <pubDate>Fri, 08 Dec 2023 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/til-today-i-learn-12-11-18-11-parte-2-45n4</link>
      <guid>https://forem.com/devhat/til-today-i-learn-12-11-18-11-parte-2-45n4</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/piluvitu"&gt;@piluvitu&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  .env
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Para quem não sabe o seu sistema por padrão tem variáveis de ambiente, que servem para armazenar alguma informação e padronizar o acesso dela pela mesma.

&lt;ul&gt;
&lt;li&gt;É possível inserir váriáveis no próprio sistema sem precisar de nem uma abstração, mas ela não são inserções persistentes, por isso a fim de facilitar a definição dessas variáveis, existe o módulo do NPM &lt;code&gt;.env&lt;/code&gt;, que foi criado a fim de facilitar isso.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Para usa-lo tudo que é necessário fazer é criar um arquivo &lt;code&gt;.env&lt;/code&gt; na raiz do projeto e inserir as variáveis com a seguinte sintaxe:&lt;/li&gt;
&lt;li&gt;O modelo é chave - valor, com a chave sendo por padrão MAIUSCULA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;OPENIA_KEY = informação sensivel URL = localhost PORT = 3000&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Muito se é discutido em upar ou não o &lt;code&gt;.env&lt;/code&gt; então devemos explicar o comportamento dele no sistema:&lt;/li&gt;
&lt;li&gt; &lt;code&gt;.env.development&lt;/code&gt; - serve para um ambiente de desenvolvimento&lt;/li&gt;
&lt;li&gt; &lt;code&gt;.env.example&lt;/code&gt; - serve como um arquivo de exemplo&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; - é o arquivo padrão, que em teoria seria usado para inserir as variáveis de produção.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Muitos dos provedores onde podemos subir nossas aplicações de maneira facilitada, disponibilizam uma parte para inserirmos as variáveis de ambiente que serão utilizadas na nossa aplicação e por ordem de importância essas variáveis inseridas antes do deploy, são as que vão realmente sobrepor as que ficam no &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  GIT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pensando nisso o GitHub fez um &lt;a href="https://docs.github.com/pt/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository"&gt;artigo&lt;/a&gt;  que sugere usar uma ferramenta do próprio git ou uma ferramenta open-source

&lt;ul&gt;
&lt;li&gt;Falando em git, descobri que tem como renomear arquivos usando o próprio git usando o comando &lt;code&gt;git mv&lt;/code&gt;:
&lt;code&gt;git mv &amp;lt;nome do arquivo atual&amp;gt; &amp;lt;novo nome do arquivo&amp;gt;&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  Absolute PATH
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Eu nunca tinha parado para pensar que, quando queremos acessar algum arquivo que está fora da pasta atual:
1 - Navegamos para fora da pasta atual
2 - Entramos na pasta do arquivo
3 - Por fim referenciamos o mesmo.&lt;/li&gt;
&lt;li&gt;O nome disso é relative PATH e percebemos que priemeiro voltamos para depois seguir em frente, que em um projeto com muitos arquivos gera um PATH longo e nada didático

&lt;ul&gt;
&lt;li&gt;Já o absolute PATH é o caminho absoluto, que toma como padrão sempre sair da raiz do projeto e ir para o arquivo desejado, encurtando o PATH e deixando didático&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Fica a dúvida de como eles fazem para referenciar o diretório raiz do projeto ?&lt;/li&gt;
&lt;li&gt;Existem várias soluções no mercado, mas a microsoft desenvolveu os arquivos &lt;code&gt;jsconfig.json&lt;/code&gt; e &lt;code&gt;tsconfig.json&lt;/code&gt; que servem para indicar ao editor que ali é a raiz do projeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript
&lt;/h3&gt;

&lt;p&gt;Por fim o typescript, meu primeiro contato sem auxilio de curso tem sido aqui na devhat, no projeto octopost, mal conheço e já considero pacas esse TS, estou fazendo minha introdução pelo curso da origamid.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estudei conceitos básicos de annotation, inferface e inferência.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Annotation&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;produt0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Livro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prec0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;856&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No TypeScript podemos tipar, e isso é interessante pois evitamos erros na hora de lidar com os dados&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Interface
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Interface&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;carr0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;motor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;motor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;marca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;245&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;portas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;motor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aspirado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;alumínio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Inferência
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Mesmo sem declarar a tipagem, alguns tipos de variáveis o TS, 
já identifica a tipagem correta */&lt;/span&gt;

&lt;span class="c1"&gt;// Annotation&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;produtos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Livro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;856&lt;/span&gt;

&lt;span class="nx"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jajaja&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Interface&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;carro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;motor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;marca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;245&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;portas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;motor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aspirado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;alumínio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Como pode-se ver no exemplo acima, podemos deixar de declarar a tipagem de alguns dados que o proprio TypeScript já reconhece.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No exemplo acima é possivel ver um otimo motivo para tipar, pois saberemos o que é para chegar no parâmetro e o que será retornado&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  FunFact
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;O vsCode tem intelisense de JS graças ao TS nativamente no editor, caso queira ter um pouco da experiência de usar TS no JS é só adicionar &lt;code&gt;//@ts-check&lt;/code&gt; na primeira linha do seu arquivo JS e o editor vai passar a indicar alguns erros que o TS pegaria no seu código&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/hxsggsz"&gt;@hxsggsz&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  Typescript
&lt;/h3&gt;

&lt;p&gt;Essa semana eu estudei bastante &lt;code&gt;Typescript&lt;/code&gt; pra tentar resolver um problema. Durante esse estudo eu descobri alguns &lt;code&gt;Utilities Types&lt;/code&gt; criados pelo próprio time do &lt;code&gt;Typescript&lt;/code&gt; pra facilitar a nossa vida difícil de bugs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Como esses "Utilities Types" funcionam
&lt;/h4&gt;

&lt;p&gt;Todos eles se  beneficiam dos "Generics", algo muito útil na hora de tipagem e que é presente em diversas linguagens estaticamente tipadas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Partial
&lt;/h4&gt;

&lt;p&gt;O que ele faz? Ele transforma tudo em  um objeto opcional. Olha esse exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora se a gente taca essa &lt;code&gt;interface&lt;/code&gt; no &lt;code&gt;Partial&lt;/code&gt; assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OptionalUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É como se a gente fizesse isso&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Required
&lt;/h4&gt;

&lt;p&gt;Existe o oposto do &lt;code&gt;Partial&lt;/code&gt; que é o &lt;code&gt;Required&lt;/code&gt;, e como o nome já diz, ele transforma todos os &lt;code&gt;tipos&lt;/code&gt; que ele receber para &lt;code&gt;necessário fornecer&lt;/code&gt;, até os que originalmente são &lt;code&gt;opicionais&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OptionalUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RequiredUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Required&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OptionalUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora o tipo &lt;code&gt;RequiredUser&lt;/code&gt; fica assim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Omit
&lt;/h4&gt;

&lt;p&gt;Agora imagina que a gente quer omitir o nome da interface &lt;code&gt;User&lt;/code&gt; sem alterar a interface original, essa é a função do &lt;code&gt;Omit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserWithouName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pick
&lt;/h4&gt;

&lt;p&gt;E tem o contrario também, imagina que a gente quer pegar apenas a propriedade nome da interface mas sem alterar a interface original, o &lt;code&gt;Pick&lt;/code&gt; serve pra isso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você quiser pegar ou excluir mais de uma propriedade, basta usar o pipeline&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// ou &lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível combinar todos esses &lt;code&gt;Utilities Types&lt;/code&gt; também&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserNameOptional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ReturnType
&lt;/h4&gt;

&lt;p&gt;Agora imagina que a gente tem esse tipagem de função aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;HandleSomething&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E você precisa ter a tipagem do retorno dessa função, pra isso existe o &lt;code&gt;ReturnType&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ReturnOfHandleSomething&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HandleSomething&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Awaited
&lt;/h4&gt;

&lt;p&gt;Imagina que você tem uma tipagem que é uma promise&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AwaitSomething&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E você quer a tipagem que essa &lt;code&gt;promise&lt;/code&gt; vai retornar, pra isso serve o &lt;code&gt;Awaited&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Awaited&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AwaitSomething&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora um caso um pouco mais real, você tipou uma função que retorna uma &lt;code&gt;promise&lt;/code&gt; e você quer separar um &lt;code&gt;type&lt;/code&gt; diferente o retorno dessa função, simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserNameOptional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;



&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Awaited&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserNameOptional&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo com uma função real&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;awaitSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demorei mas cheguei&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// string&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Awaited&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;awaitSomething&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>env</category>
      <category>typescript</category>
    </item>
    <item>
      <title>TIL - Today I Learn 12-11 18-11</title>
      <dc:creator>Victor Hugo</dc:creator>
      <pubDate>Fri, 01 Dec 2023 20:30:00 +0000</pubDate>
      <link>https://forem.com/devhat/til-today-i-learn-12-11-18-11-1mdf</link>
      <guid>https://forem.com/devhat/til-today-i-learn-12-11-18-11-1mdf</guid>
      <description>&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/alvarogfn"&gt;@alvarogfn&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Make System Under Test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O nome vem de &lt;code&gt;Make System Under Test&lt;/code&gt; (fazer sistema sob teste).&lt;/li&gt;
&lt;li&gt;Isso é usado em &lt;code&gt;Testes Unitários&lt;/code&gt; para criar uma função que retorna uma &lt;code&gt;Instância da Classe ou Componente&lt;/code&gt; que está sendo testado. &lt;/li&gt;
&lt;li&gt;Vocês devem encontrar exemplos disso com &lt;code&gt;Classes e Testes em Java&lt;/code&gt;, eles preparam um &lt;code&gt;setup/Factory&lt;/code&gt; para fazer &lt;code&gt;testes unitários&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;MakeSut&lt;/code&gt; recebe &lt;code&gt;parâmetros&lt;/code&gt; que podem ser usados para personalizar o comportamento ou a aparência do componente, e dentro dessa função você cria a lógica de renderização do componente no contexto dos testes, reutilizando a função entre vários testes para não precisar reescrever o código de setup em cada teste.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Uma função que vai retornar a renderização do seu teste toda vez que for chamada&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;makeSut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Aqui você seta algum parametro padrão para todos os testes. É útil quando alguma prop é obrigatória&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt;  &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// Aqui fica a lógica de renderização do componente. Pode ser qualquer uma.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;when&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;do&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Você pode modificar os parâmetros para adaptar a renderização do componente&lt;/span&gt;
      &lt;span class="nf"&gt;makeSut&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="kc"&gt;false&lt;/span&gt;  &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/nicolettifps"&gt;@nicolettifps&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ThreeJs
&lt;/h2&gt;

&lt;p&gt;Primeiramente essa semana dei uma pegada no &lt;strong&gt;ThreeJs&lt;/strong&gt;. A parte interessante aqui é que ele também está sendo muito usado no &lt;strong&gt;Electron&lt;/strong&gt; &lt;a href="https://medium.com/@sharadghimire5551/getting-started-with-three-js-and-electron-js-9ae49b1d3f59"&gt;Aqui tem um Get Started&lt;/a&gt; que eu tava dando uma lida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Também dei uma avançada no de &lt;strong&gt;Git&lt;/strong&gt; Essa semana dei uma olhada pra alguns &lt;em&gt;Rewriting history&lt;/em&gt; que são bem uteis, principalmente pra mim que envio commit errado toda hora. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Changing the Last Commit:&lt;/strong&gt; &lt;code&gt;git commit --amend&lt;/code&gt; O amend pode ser usado para "Editar" seu último commit enviado sem precisar enviar um novo. Ele também serve caso queira apenas trocar o comentário do commit. Mas vale uma atenção especial já que o &lt;code&gt;--amend&lt;/code&gt; não apenas "editará" o commit antigo, e sim substituirá o antigo por um novo, trocando assim suas hashs já que o git tem a ideia de ser imutável. &lt;code&gt;git commit --amend -m "an updated commit message"&lt;/code&gt; &lt;a href="https://www.atlassian.com/git/tutorials/rewriting-history](https://www.atlassian.com/git/tutorials/rewriting-history"&gt;Aqui deixo um dos materiais de referencia&lt;/a&gt; ) caso queiram entender mais afundo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/aalmeida00"&gt;@aalmeida00&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  variaveis scss
&lt;/h2&gt;

&lt;p&gt;Se importar o arquivo que possui as variáveis scss dessa forma &lt;code&gt;@use '../../styles/global' as *;&lt;/code&gt; Voce nao precisa usar o prefixo &lt;code&gt;global.$varname&lt;/code&gt;, é só chamar &lt;code&gt;$varname&lt;/code&gt; evitando a repetição desnecessária.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/zoldyzdk"&gt;@zoldyzdk&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Error Boundary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Error boundary&lt;/code&gt; é um componente especial, utilizado na captura de erros gerados durante a renderização da sua aplicação.&lt;/p&gt;

&lt;p&gt;Com ele você consegue por exemplo renderizar uma UI específica para quando houver um erro na aplicação, também pode capturar esses erros para um sistema de log.&lt;/p&gt;

&lt;p&gt;Uma curiosidade sobre o componente é que apesar do &lt;code&gt;React&lt;/code&gt; atualmente usar &lt;code&gt;Function Component&lt;/code&gt; por padrão ele só pode ser escrito como um &lt;code&gt;Class Component&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de um &lt;code&gt;Error Boundary Component&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ErrorBoundary&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;getDerivedStateFromError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="nf"&gt;componentDidCatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nf"&gt;logErrorToMyService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;componentStack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>todayilearned</category>
      <category>react</category>
      <category>typescript</category>
      <category>github</category>
    </item>
  </channel>
</rss>
