<?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: Alecell</title>
    <description>The latest articles on Forem by Alecell (@alecell).</description>
    <link>https://forem.com/alecell</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%2Fuser%2Fprofile_image%2F404528%2F3640a4d9-70d8-4b0f-be44-3e8b78753e34.jpeg</url>
      <title>Forem: Alecell</title>
      <link>https://forem.com/alecell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alecell"/>
    <language>en</language>
    <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>Expo AVD (Android Virtual Device) on Windows Subsystem for Linux (WSL2)</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Tue, 05 Mar 2024 19:47:10 +0000</pubDate>
      <link>https://forem.com/alecell/expo-avd-android-virtual-device-on-windows-subsystem-for-linux-wsl2-4d8n</link>
      <guid>https://forem.com/alecell/expo-avd-android-virtual-device-on-windows-subsystem-for-linux-wsl2-4d8n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is the second and final part of two parts tutorial to completely run a &lt;em&gt;Expo&lt;/em&gt; project through &lt;em&gt;WSL2&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;br&gt;
WinRAR/7Zip&lt;br&gt;
Unzip&lt;br&gt;
&lt;a href="https://dev.to/alecell/expo-qr-code-on-windows-subsystem-for-linux-wsl2-1bjf"&gt;The previous step of this article&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;On the &lt;a href="https://dev.to/alecell/expo-qr-code-on-windows-subsystem-for-linux-wsl2-1bjf"&gt;previous part of this tutorial&lt;/a&gt; we managed to open our &lt;em&gt;Expo&lt;/em&gt; app by the &lt;em&gt;QR code&lt;/em&gt; adding some network configs on our &lt;em&gt;Windows&lt;/em&gt; and &lt;em&gt;WSL&lt;/em&gt;. Now we'll move further to make it work with &lt;em&gt;AVD&lt;/em&gt; as well!&lt;/p&gt;



&lt;p&gt;To be able to run our virtual device we'll need to have a virtual device on our &lt;em&gt;Windows&lt;/em&gt;, add the &lt;em&gt;Android SDK&lt;/em&gt; on our &lt;em&gt;WSL&lt;/em&gt; and install &lt;em&gt;ADB&lt;/em&gt; to allow the connection between our &lt;em&gt;Expo&lt;/em&gt; app on &lt;em&gt;WSL&lt;/em&gt; and the virtual device on &lt;em&gt;Windows&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installing &lt;em&gt;WSA&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;There's a &lt;em&gt;Android&lt;/em&gt; version of &lt;em&gt;WSL&lt;/em&gt;, in this case &lt;em&gt;WSA&lt;/em&gt;, &lt;em&gt;Windows Subsystem Android&lt;/em&gt;, it works almost like &lt;em&gt;WSL&lt;/em&gt;, but its a &lt;em&gt;Android&lt;/em&gt; environment.&lt;/p&gt;

&lt;p&gt;Testing locally on my computer and on other teammates computers it worked better, some teammates have very old computers and that was a decisive point to opt on &lt;em&gt;WSA&lt;/em&gt;. So basically we'll move on with &lt;em&gt;WSA&lt;/em&gt; because it is more performant &lt;em&gt;AVD&lt;/em&gt; than &lt;em&gt;Android Studio&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To install &lt;em&gt;WSA&lt;/em&gt; go to this &lt;a href="https://github.com/MustardChef/WSABuilds"&gt;github repository&lt;/a&gt; scroll to the readme and, on the &lt;em&gt;Download&lt;/em&gt; section select the stable build for your &lt;em&gt;Windows&lt;/em&gt; version and processor architecture.&lt;/p&gt;

&lt;p&gt;On the page it opened go all the way to the bottom to the download table and select the second download option, right now, while I'm writing this article, the version is &lt;code&gt;WSA_2311.40000.5.0_x64_Release-Nightly-MindTheGapps-13.0.7z&lt;/code&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%2Fn8rpws49mh6z9kfcvmri.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%2Fn8rpws49mh6z9kfcvmri.png" alt="highlighted version to download" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that downloaded file move it to the root of your &lt;code&gt;C:&lt;/code&gt; of your &lt;em&gt;Windows&lt;/em&gt; and extract that file there, after this you should have this folder on your &lt;code&gt;C:&lt;/code&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%2Ftyxzwzrrsuqqeoyzm6ii.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%2Ftyxzwzrrsuqqeoyzm6ii.png" alt="WSA on C: folder" width="529" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: if you're not able to extract that file you'll need to install &lt;code&gt;WinRAR&lt;/code&gt; or &lt;code&gt;7Zip&lt;/code&gt; on your &lt;em&gt;Windows&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now open that folder and look for the script &lt;code&gt;Install.ps1&lt;/code&gt; (if your &lt;em&gt;Windows&lt;/em&gt; is not configured to see the file extensions it'll be just &lt;code&gt;Install&lt;/code&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%2Fdigq0qwsxqzy60njn656.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%2Fdigq0qwsxqzy60njn656.png" alt="Install script on WSA folder" width="632" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now &lt;em&gt;right click&lt;/em&gt; on the &lt;code&gt;Install.ps1&lt;/code&gt; file and click on &lt;code&gt;Run with Power Shell&lt;/code&gt; or anything similar to that.&lt;/p&gt;

&lt;p&gt;It'll open a &lt;em&gt;Power Shell&lt;/em&gt; window with a bunch of other windows and ask some permissions, but no worry, that's expected. Just click on &lt;code&gt;continue&lt;/code&gt; buttons, let the windows load its views and move on. When the &lt;em&gt;Power Shell&lt;/em&gt; process finishes just press any button to close the window.&lt;/p&gt;

&lt;p&gt;After the process finished look for a window called &lt;em&gt;Windows Subsystem Android&lt;/em&gt;, it'll open with a title at the top left corner as &lt;code&gt;System&lt;/code&gt;. The window is similar to this one&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%2Fd9hy496cc23zj75fd7qp.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%2Fd9hy496cc23zj75fd7qp.png" alt="WSA config window" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On this window go to &lt;code&gt;Advanced Configuration&lt;/code&gt; and turn the &lt;em&gt;Developer Mode&lt;/em&gt; on (that menu option could be hide on a hamburger menu at top left corner). It could ask for some admin permissions, just allow them. &lt;/p&gt;

&lt;p&gt;If work as expected it'll suggest you that you can run the &lt;em&gt;ADB&lt;/em&gt; server on &lt;code&gt;127.0.0.1:58526&lt;/code&gt;. After turn it on you can close all the &lt;em&gt;WSA&lt;/em&gt; windows since it runs on background.&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%2F6v0ohx1ivbvy0kn2lek6.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%2F6v0ohx1ivbvy0kn2lek6.png" alt="highlighted developer mode triggered on in WSA window" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After close all the windows you can check if &lt;em&gt;ADB&lt;/em&gt; is working checking the &lt;em&gt;Windows&lt;/em&gt; &lt;em&gt;Task Manager&lt;/em&gt; and check if the &lt;em&gt;WSA&lt;/em&gt; is there &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%2Fxoxhce6r42n3vbxy350p.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%2Fxoxhce6r42n3vbxy350p.png" alt="task manager showing that WSA is running as a background proccess" width="767" height="578"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Search for Android&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Troubleshoot
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Running the Install.ps1&lt;/strong&gt;&lt;br&gt;
If you get a error trying to run the &lt;code&gt;Install.ps1&lt;/code&gt; script try run the &lt;code&gt;Run.bat&lt;/code&gt; script instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer mode not showing the &lt;code&gt;127.0.0.1:58526&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
If you can't see the &lt;code&gt;127.0.0.1:58526&lt;/code&gt; after turn your Developer Mode on, try reinstall &lt;em&gt;WSA&lt;/em&gt; with a &lt;em&gt;PRE-RELEASE&lt;/em&gt; build instead.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installing &lt;em&gt;Android SDK&lt;/em&gt; on &lt;em&gt;WSL&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;With your &lt;em&gt;WSA&lt;/em&gt; installed now you'll need to install &lt;em&gt;Android SDK&lt;/em&gt; on your &lt;em&gt;WSL&lt;/em&gt;. &lt;em&gt;Expo&lt;/em&gt; needs that to run the app with &lt;em&gt;Android&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;I found a &lt;a href="https://gist.github.com/steveclarke/d988d89e8cdf51a8a5766d69ecb07e7b"&gt;awesome tutorial&lt;/a&gt; to do that on &lt;em&gt;WSL&lt;/em&gt;, but we'll not use everything there and also I needed to update some of the commands so, I just get and update what is needed here.&lt;/p&gt;

&lt;p&gt;Now open your &lt;em&gt;WSL&lt;/em&gt;, go to the your user root folder and run the following commands &lt;strong&gt;individually&lt;/strong&gt;&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;openjdk-8-jdk-headless

wget https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; Android/sdk
unzip commandlinetools-linux-6200805_latest.zip &lt;span class="nt"&gt;-d&lt;/span&gt; Android/sdk

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANDROID_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Android/sdk
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/emulator:&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/tools:&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/tools/bin:&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/platform-tools:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

sdkmanager &lt;span class="nt"&gt;--sdk_root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANDROID_HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"tools"&lt;/span&gt;

sdkmanager &lt;span class="nt"&gt;--update&lt;/span&gt;
sdkmanager &lt;span class="nt"&gt;--list&lt;/span&gt;
sdkmanager &lt;span class="s2"&gt;"build-tools;28.0.3"&lt;/span&gt; &lt;span class="s2"&gt;"platform-tools"&lt;/span&gt; &lt;span class="s2"&gt;"platforms;android-28"&lt;/span&gt; &lt;span class="s2"&gt;"tools"&lt;/span&gt;
sdkmanager &lt;span class="nt"&gt;--licenses&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agree to all the agreements and, after all, you'll have a &lt;code&gt;Android&lt;/code&gt; folder on your user root&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%2Fzlfn81kx9l0sv6ulq3vs.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%2Fzlfn81kx9l0sv6ulq3vs.png" alt="demonstration that the Android folder is there on the user root on WSL" width="317" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now with &lt;em&gt;Android SDK&lt;/em&gt; installed we &lt;em&gt;Expo&lt;/em&gt; will run with &lt;em&gt;Android&lt;/em&gt;, otherwise it'll throw a error saying that it didn't found the &lt;em&gt;Android SDK&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing &lt;em&gt;ADB&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Now we'll need to install &lt;em&gt;ADB (Android Debugging Bridge)&lt;/em&gt;, this is what will make the connection between our &lt;em&gt;Expo&lt;/em&gt; project on &lt;em&gt;WSL&lt;/em&gt; and the &lt;em&gt;AVD&lt;/em&gt; on &lt;em&gt;Windows&lt;/em&gt; with &lt;em&gt;WSA&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To install &lt;em&gt;ADB&lt;/em&gt; go to &lt;a href="https://github.com/awake558/adb-win/tree/master/SDK_Platform-Tools_for_Linux"&gt;this link&lt;/a&gt;, scroll down until you find the markdown and there click on the first &lt;code&gt;platform tools&lt;/code&gt;, its the one that has &lt;em&gt;Android Debug Bridge version 1.0.41&lt;/em&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%2F8luqoec581rou4khxejl.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%2F8luqoec581rou4khxejl.png" alt="highlighted version of platform-tools to be downloaded" width="800" height="813"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It'll download a zip file on your your &lt;em&gt;Windows&lt;/em&gt;, move that file to your &lt;em&gt;WSL&lt;/em&gt; user root.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For those who don't know, you can find your &lt;em&gt;WSL&lt;/em&gt; &lt;em&gt;Linux&lt;/em&gt; on the side of your &lt;em&gt;File Explorer&lt;/em&gt;. There you can navigate to your user root folder manually in a WYSIWYG way, then paste the file there on your user root folder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again on &lt;em&gt;WSL&lt;/em&gt; and with the file &lt;code&gt;platform-tools_r34.0.5-linux.zip&lt;/code&gt; on your user root folder, &lt;code&gt;unzip&lt;/code&gt; this file and go to the extracted folder &lt;code&gt;platform-tools&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On the folder run you'll need to run &lt;code&gt;./adb connect &amp;lt;WSL IP:WSA PORT&amp;gt;&lt;/code&gt; to create the connection between &lt;em&gt;WSL&lt;/em&gt; and &lt;em&gt;WSA&lt;/em&gt;, but before that lets get that IP and port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting &lt;em&gt;WSL&lt;/em&gt; IP&lt;/strong&gt;&lt;br&gt;
To get the &lt;em&gt;WSL&lt;/em&gt; IP, on your &lt;em&gt;WSL&lt;/em&gt; terminal run &lt;code&gt;netsh.exe interface ip show address&lt;/code&gt; and look for the &lt;em&gt;WSL&lt;/em&gt; interfaces. In my case is these two:&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%2Fjbktg7x4knlmlgtrsvma.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%2Fjbktg7x4knlmlgtrsvma.png" alt="output of commands of my WSL interfaces" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my specific case I need to get the IP Address from &lt;code&gt;"vEthernet (WSL (Hyper-V firewall))"&lt;/code&gt;, but your interface name may be different than mine, either way just get one of the &lt;em&gt;WSL&lt;/em&gt; IP's and and save it to use later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting &lt;em&gt;WSA&lt;/em&gt; Port&lt;/strong&gt;&lt;br&gt;
Go to your &lt;em&gt;WSA&lt;/em&gt;, on that same page we turned &lt;em&gt;Developer Mode&lt;/em&gt; on, check the message it displays right below it and look for the port&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%2Fnzc19dd1kndko3d891dr.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%2Fnzc19dd1kndko3d891dr.png" alt="message below developer mode with local IP and port" width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For all the tests I made the port was the same, but I'm showing how to get the port just in case!&lt;/p&gt;

&lt;p&gt;Getting back to our &lt;em&gt;WSL&lt;/em&gt; on the &lt;code&gt;platform-tools&lt;/code&gt; folder with that &lt;em&gt;ADB&lt;/em&gt; command we view before, with your &lt;em&gt;WSL&lt;/em&gt; IP and the &lt;em&gt;WSA&lt;/em&gt; port run &lt;code&gt;./adb connect &amp;lt;WSL IP:58526&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;WSA&lt;/em&gt; may ask you to allow the &lt;em&gt;ADB&lt;/em&gt; connection, if that happens click on "Always allow from this computer" and "Allow"&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%2Fqoh0bb9mskm4dr6zd85r.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%2Fqoh0bb9mskm4dr6zd85r.png" alt="WSA connection confirmation window" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check if your &lt;em&gt;ADB&lt;/em&gt; was connected successfully on your &lt;em&gt;WSA&lt;/em&gt; running &lt;code&gt;./adb devices&lt;/code&gt;, if it display something like that we're connected!&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%2F70rpnobfotkjktollq8s.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%2F70rpnobfotkjktollq8s.png" alt="ADB on WSL is connected to WSA" width="294" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Running the Project with &lt;em&gt;AVD&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Now go again to your project folder and run it with &lt;code&gt;npm run start:wsl&lt;/code&gt; then press &lt;code&gt;a&lt;/code&gt; to open &lt;em&gt;Android&lt;/em&gt; &lt;em&gt;AVD&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It should open two windows from &lt;em&gt;WSA&lt;/em&gt;, one with the &lt;em&gt;Expo&lt;/em&gt; app and another one with your project running, just like this&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%2Fips6udfpk9h4d0og239q.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%2Fips6udfpk9h4d0og239q.png" alt="expo app and expo project running on two separated windows on WSA" width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then, congratulations, your &lt;em&gt;Expo&lt;/em&gt; project is fully working through &lt;em&gt;WSL&lt;/em&gt;!&lt;/p&gt;

&lt;h4&gt;
  
  
  Troubleshoot
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;unzip is not defined&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
If you got a issue saying that &lt;code&gt;unzip command not found&lt;/code&gt; or something like that, this is because you don't have unzip installed on your &lt;em&gt;WSL&lt;/em&gt;, you just need to &lt;a href="https://www.tecmint.com/install-zip-and-unzip-in-linux/"&gt;install it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;./adb connect&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
You got a error when try to connect on &lt;em&gt;ADB&lt;/em&gt; or nothing simply happens after you run the command, maybe your &lt;em&gt;WSL&lt;/em&gt; IP is the wrong one, double check if you typed the IP correctly and also you can try to use another &lt;em&gt;WSL&lt;/em&gt; interface IP Address.&lt;/p&gt;




&lt;p&gt;That's all folks!&lt;/p&gt;

&lt;p&gt;I really hope that this tutorial is as useful to you as it was to me to figure out how to make a &lt;em&gt;Expo&lt;/em&gt; project run on &lt;em&gt;WSL&lt;/em&gt;! Feel free to ask any questions down below and thank you for reading it!&lt;/p&gt;

</description>
      <category>expo</category>
      <category>reactnative</category>
      <category>mobile</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Expo QR code on Windows Subsystem for Linux (WSL2)</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Tue, 05 Mar 2024 19:47:02 +0000</pubDate>
      <link>https://forem.com/alecell/expo-qr-code-on-windows-subsystem-for-linux-wsl2-1bjf</link>
      <guid>https://forem.com/alecell/expo-qr-code-on-windows-subsystem-for-linux-wsl2-1bjf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 11/10&lt;/li&gt;
&lt;li&gt;WSL2&lt;/li&gt;
&lt;li&gt;NodeJS&lt;/li&gt;
&lt;li&gt;Admin Rights&lt;/li&gt;
&lt;li&gt;Up to Date Power Shell Version&lt;/li&gt;
&lt;li&gt;Dotenv&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;On one of the Top Secret project on &lt;a href="https://discord.gg/3gsMAEumEd" rel="noopener noreferrer"&gt;Devhat community&lt;/a&gt; my team decided to work with &lt;a href="https://expo.dev/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt; to create our MVP, &lt;em&gt;Expo&lt;/em&gt; looks great but soon I figured out that it will make me suffer. ☠️&lt;/p&gt;

&lt;p&gt;All my developer environment runs on &lt;em&gt;WSL&lt;/em&gt;, &lt;em&gt;Windows Subsistem Linux 2&lt;/em&gt; to be precise, its been more than a year that I work with it, but soon I realize that its not that easy to run &lt;em&gt;Expo&lt;/em&gt; with &lt;em&gt;WSL&lt;/em&gt;, there's no straight to the point tutorial nor a updated tutorial on internet on how to make it, but I wasn't comfortable to install Node, Git and god knows what else I would need to install on my &lt;em&gt;Windows&lt;/em&gt; just because of a single project, so I started a journey to find the golden way to run &lt;em&gt;Expo&lt;/em&gt; with &lt;em&gt;WSL&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And thank god, I managed to make it work!&lt;/p&gt;

&lt;p&gt;I'll divide this tutorial in two, the first part is to make &lt;em&gt;Expo&lt;/em&gt; works with &lt;em&gt;WSL&lt;/em&gt; thought the &lt;em&gt;QR code&lt;/em&gt; and, the second part, is &lt;a href="https://dev.to/alecell/expo-avd-android-virtual-device-on-windows-subsystem-for-linux-wsl2-4d8n"&gt;how to make it work with Android Virtual Device (AVD)&lt;/a&gt;, but keep in mind that this first step is required if you want to make it work with &lt;em&gt;AVD&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;em&gt;WSL&lt;/em&gt; and &lt;em&gt;Expo&lt;/em&gt; &lt;em&gt;QR code&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;First, get this script, available as &lt;a href="https://gist.github.com/Alecell/b6243922079e49e08963930bea318096#file-forward_wsl2_ports-ps1" rel="noopener noreferrer"&gt;Gist&lt;/a&gt; as well, and move it to your root &lt;code&gt;C:&lt;/code&gt;  &lt;strong&gt;on your &lt;em&gt;Windows&lt;/em&gt;&lt;/strong&gt;, the same place of your &lt;em&gt;Program Files&lt;/em&gt; and &lt;em&gt;Users&lt;/em&gt; folder, and name it &lt;code&gt;forward_wsl2_ports.ps1&lt;/code&gt;. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Its worth to mention that this script is a slightly change of &lt;a href="https://medium.com/weavik/react-native-expo-on-wsl2-aff04b1639f8" rel="noopener noreferrer"&gt;this one&lt;/a&gt;, we needed to change it in order to make it work for people that has more than one IP on the &lt;code&gt;wsl hostname -I&lt;/code&gt; command. Also if your want to understand what this script actually solves I strongly recommend you to read the article&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This script doesn't need any change if you use the default &lt;em&gt;Expo&lt;/em&gt; port &lt;code&gt;8081&lt;/code&gt;, but if your &lt;em&gt;Expo&lt;/em&gt; run in another port you'll need to update the &lt;code&gt;line 6&lt;/code&gt; of the script adding the desired port, for instance &lt;code&gt;$ports = @(8081,8089);&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Opening &lt;em&gt;WSL&lt;/em&gt; ports
&lt;/h4&gt;

&lt;p&gt;Now on your &lt;strong&gt;&lt;em&gt;Windows&lt;/em&gt;&lt;/strong&gt;, open &lt;em&gt;Power Shell&lt;/em&gt; as administrator and &lt;strong&gt;before run the command below&lt;/strong&gt; make sure that your &lt;em&gt;WSL&lt;/em&gt; is completely turned off, so close all &lt;em&gt;WSL&lt;/em&gt; terminals and editors such as VSCode and then &lt;code&gt;wsl --shutdown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;em&gt;WSL&lt;/em&gt; turned off you can run the command below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 powershell.exe -ExecutionPolicy Bypass -f C:\forward_wsl2_ports.ps1


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

&lt;/div&gt;
&lt;p&gt;If everything went right you'll see something like that&lt;/p&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%2Fx2zhyx7s2xmaa5osjghz.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%2Fx2zhyx7s2xmaa5osjghz.png" alt="power shell output after run the script"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command opened the &lt;em&gt;WSL&lt;/em&gt; ports for the IP returned on the first step of the command &lt;code&gt;WSL IP 'the ip'&lt;/code&gt;, in my case it opened just &lt;code&gt;8081&lt;/code&gt; which is the default &lt;em&gt;Expo&lt;/em&gt; port, but if you added more IP's there it will open that other ports too. Then you can press any key and close this &lt;em&gt;Power Shell&lt;/em&gt; window.&lt;/p&gt;
&lt;h4&gt;
  
  
  Configuring the &lt;em&gt;WSL&lt;/em&gt; &lt;em&gt;Expo&lt;/em&gt; project
&lt;/h4&gt;

&lt;p&gt;Go to your &lt;em&gt;WSL2&lt;/em&gt; and open your &lt;em&gt;Expo&lt;/em&gt; project or, if your don't have any, create a new one with &lt;code&gt;npx create-expo-app&lt;/code&gt; and follow steps to create the project.&lt;/p&gt;

&lt;p&gt;Open the project with your desired editor and lets add a new script on our &lt;code&gt;package.json&lt;/code&gt; file, this script will be a specific one to run the &lt;em&gt;Expo&lt;/em&gt; project on through your &lt;em&gt;WSL&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&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="cm"&gt;/* other scripts */&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start:wsl&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="s2"&gt;REACT_NATIVE_PACKAGER_HOSTNAME=$(node get_network_local_ip.js) expo start&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;We'll need to add the &lt;code&gt;get_network_local_ip.js&lt;/code&gt; file on the next step, but all that &lt;code&gt;package.json&lt;/code&gt; command does is run the &lt;em&gt;JavaScript&lt;/em&gt; file to get your local internet IP address and then set it as the hostname for &lt;em&gt;Expo&lt;/em&gt; instead use the default one!&lt;/p&gt;

&lt;p&gt;The project will work if you replace the &lt;code&gt;$(node get_network_local_ip.js)&lt;/code&gt; with your local IP. To know your local IP you can go to, on &lt;em&gt;Windows 11&lt;/em&gt;, &lt;code&gt;Start -&amp;gt; Network &amp;amp; Internet -&amp;gt;  Properties&lt;/code&gt; and then look for &lt;code&gt;IPv4 address&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, if you're a solo developer its &lt;em&gt;"ok"&lt;/em&gt; if your script look like this&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"start:wsl": "REACT_NATIVE_PACKAGER_HOSTNAME=19X.XXX.XX.XXX expo start"


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

&lt;/div&gt;
&lt;p&gt;But for teams this solution is not a good one, that's why we need the &lt;code&gt;get_network_local_ip.js&lt;/code&gt; script!&lt;/p&gt;

&lt;p&gt;All that script does is search for the IP of your active internet network, but its worth to mention that this is a updated version of the command showed on &lt;a href="https://medium.com/weavik/react-native-expo-on-wsl2-aff04b1639f8" rel="noopener noreferrer"&gt;Kendall article&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;Kendall's current solution in &lt;code&gt;package.json&lt;/code&gt; to find the internet interface &lt;em&gt;IPv4&lt;/em&gt; is great, but it could lead to issues in scenarios where a different internet interface other than "Ethernet" is used or the &lt;em&gt;IPv4&lt;/em&gt; regex doesn't match 'IP Address'. Modifying &lt;code&gt;package.json&lt;/code&gt; for these local-specific configurations would result in unnecessary changes in every &lt;em&gt;Merge Request&lt;/em&gt;. To avoid this, I've implemented a separate &lt;code&gt;get_network_local_ip.js&lt;/code&gt; script that leverages a &lt;code&gt;.env.local&lt;/code&gt; file for local configurations, ensuring a more flexible and MR-friendly approach.&lt;/p&gt;

&lt;p&gt;I also updated the regex to look for the IP, but this is a idiom specific issue, if you want you can read the explanation below.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why did I update the IP regex:&lt;/strong&gt; I'm a Brazilian and so the original script &lt;code&gt;netsh.exe interface ip show address 'Ethernet' | grep 'IP Address' | sed -r 's/^.*IP Address:\\W*//'&lt;/code&gt; don't work for me since my &lt;code&gt;netsh.exe&lt;/code&gt; displays the interfaces in &lt;code&gt;pt-br&lt;/code&gt; not &lt;code&gt;en-us&lt;/code&gt; and that's a huge problem cause here "IP Address" becomes "Endereço IP", a word with a &lt;code&gt;unicode&lt;/code&gt; character that's very hard to work with bash scripts and even harder with a script that is somewhere between &lt;em&gt;WSL&lt;/em&gt; and &lt;em&gt;Power Shell&lt;/em&gt;. All my attempts to search for "Endereço IP" with &lt;code&gt;grep&lt;/code&gt; were failures so, instead of replace the "IP Address:" section, on this updated script I look for the actual IP which was way easier. I also believe that this will work on many other idioms around the world, so its a more cross language solution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the updated command as a &lt;em&gt;JavaScript&lt;/em&gt; file, its also available on &lt;a href="https://gist.github.com/Alecell/b6243922079e49e08963930bea318096#file-get_network_local_ip-js" rel="noopener noreferrer"&gt;this gist&lt;/a&gt;. Add it to the root of your project with the name &lt;code&gt;get_network_local_ip.js&lt;/code&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;You'll also need the &lt;code&gt;.env.local&lt;/code&gt; file to define your local variables for your internet interface name and your regex to look for your &lt;em&gt;IPv4&lt;/em&gt; label.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  Your interface name and IP regex
&lt;/h4&gt;

&lt;p&gt;On your &lt;code&gt;.env.local&lt;/code&gt; you need to add the name of your internet interface and the regex to find your &lt;em&gt;IPv4&lt;/em&gt;, here's how you can find it:&lt;/p&gt;

&lt;p&gt;On &lt;em&gt;Windows 11&lt;/em&gt; go to &lt;code&gt;Start -&amp;gt; Network &amp;amp; Internet -&amp;gt;  Properties&lt;/code&gt;, look for &lt;code&gt;IPv4 address&lt;/code&gt; and save the IP for later.&lt;/p&gt;

&lt;p&gt;Then open your &lt;strong&gt;&lt;em&gt;WSL&lt;/em&gt; terminal&lt;/strong&gt; and run &lt;code&gt;netsh.exe interface ip show address&lt;/code&gt;, it will return a bunch of network interfaces, in my case its &lt;strong&gt;a lot of interfaces&lt;/strong&gt;, but in your case you can have only few, either way we just want one of them, the one that the &lt;em&gt;IP Address&lt;/em&gt; is the same as the IP we saved previously saved.&lt;/p&gt;

&lt;p&gt;In my case &lt;code&gt;Ethernet 3&lt;/code&gt; is the interface that has the same IP, so I can update that &lt;code&gt;LOCAL_CONNECTION_INTERFACE_NAME&lt;/code&gt; environment variable with &lt;code&gt;Ethernet 3&lt;/code&gt;.&lt;/p&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%2Fljigkfm3hqzxokfcqkf3.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%2Fljigkfm3hqzxokfcqkf3.png" alt="output of the conection interfaces on windows"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your case it could be just &lt;code&gt;Ethernet&lt;/code&gt;, &lt;code&gt;Ethernet 2&lt;/code&gt; or even &lt;code&gt;WiFi&lt;/code&gt;, all depends of how and which internet port you're using to connect your device on the internet.&lt;/p&gt;

&lt;p&gt;Now, on the left of your IP is how your "IP Address" is called on your idiom and with that you'll need to get the most of the word on your idiom, avoiding &lt;code&gt;unicode&lt;/code&gt; characters, to search for your IP later with the variable &lt;code&gt;LOCAL_CONNECTION_IPV4_SEARCH&lt;/code&gt;. In my case for instance if add the whole "Endereço IP" will throw a error cause 'ç' is a &lt;code&gt;unicode&lt;/code&gt; character, but if I search for &lt;code&gt;Endere&lt;/code&gt; it finds the right label!&lt;/p&gt;

&lt;p&gt;You can test if your chosen word works running&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

netsh.exe interface ip show address &lt;span class="s1"&gt;'YOUR_INTERFACE_NAME'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_IPV4_SEARCH'&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;In my case it is&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

netsh.exe interface ip show address &lt;span class="s1"&gt;'Ethernet 3'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s1"&gt;'Endere'&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;If it returns something like &lt;em&gt;"YOUR WORD: YOUR IP"&lt;/em&gt; it worked! In my case &lt;/p&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%2F1kqy28s9ffsveom4o1it.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%2F1kqy28s9ffsveom4o1it.png" alt="output of the filter on the netsh.exe command"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can add the value to the &lt;code&gt;LOCAL_CONNECTION_IPV4_SEARCH&lt;/code&gt; variable, my &lt;code&gt;.env.local&lt;/code&gt; is looking like this&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;LOCAL_CONNECTION_INTERFACE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Ethernet 3"&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;


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

&lt;/div&gt;

&lt;p&gt;Now test if your script is working, on the opened &lt;em&gt;Expo&lt;/em&gt; project run &lt;code&gt;node get_network_local_ip.js&lt;/code&gt; and it should return your &lt;em&gt;IPv4&lt;/em&gt; &lt;/p&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%2Fg3o0c5l9za6deebyb0zd.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%2Fg3o0c5l9za6deebyb0zd.png" alt="IP as return of the javascript script"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it returned your IP everything it setup! Now the only thing you need to do is check if your cellphone is connected to the same internet as your computer and then, on the &lt;em&gt;Expo&lt;/em&gt; project, run&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm run start:wsl


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

&lt;/div&gt;

&lt;p&gt;You can notice if everything went well if &lt;em&gt;Expo&lt;/em&gt; displays your IP as the &lt;em&gt;Metro&lt;/em&gt; connection instead of another one&lt;/p&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%2F1nkudw30425v8yorog8b.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%2F1nkudw30425v8yorog8b.png" alt="expo output your local ip as Metro connection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can download the &lt;em&gt;Expo&lt;/em&gt; App on your cellphone, scan the &lt;em&gt;QR code&lt;/em&gt; and it should work as expected! 🥹&lt;/p&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%2Fr2fjxihw2f1bts0ooyow.jpg" 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%2Fr2fjxihw2f1bts0ooyow.jpg" alt="expo working on my own device"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;WSL&lt;/em&gt; and &lt;em&gt;Expo&lt;/em&gt; &lt;em&gt;AVD&lt;/em&gt; (Android Virtual Device)
&lt;/h3&gt;

&lt;p&gt;For those who want to use &lt;em&gt;Expo&lt;/em&gt; through a virtual device the &lt;a href="https://dev.to/alecell/expo-avd-android-virtual-device-on-windows-subsystem-for-linux-wsl2-4d8n"&gt;tutorial continues here&lt;/a&gt; on how to run &lt;em&gt;Expo&lt;/em&gt; on &lt;em&gt;WSL&lt;/em&gt; with a &lt;em&gt;Android Virtual Device&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;If this tutorial helped you please leave a comment or a reaction! &lt;/p&gt;

&lt;p&gt;Thank you for reading, see ya!&lt;/p&gt;

</description>
      <category>expo</category>
      <category>reactnative</category>
      <category>mobile</category>
      <category>wsl</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>As Coisas Não Acontecem do Nada</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Mon, 23 May 2022 20:49:28 +0000</pubDate>
      <link>https://forem.com/alecell/as-coisas-nao-acontecem-do-nada-16bn</link>
      <guid>https://forem.com/alecell/as-coisas-nao-acontecem-do-nada-16bn</guid>
      <description>&lt;p&gt;Era 2009, eu tinha 13 anos, tava na época de férias na escola e, apesar de não fazer a mais puta ideia de como, eu e meu irmão começamos a desenvolver um jogo de RPG em &lt;a href="http://www.byond.com/?"&gt;Byond&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nós iniciamos o projeto num super hype, compramos um livro na Saraiva perto de casa chamado &lt;a href="https://www.amazon.com.br/Arte-Game-Design-Livro-Original/dp/8535241981"&gt;A Arte De Game Design&lt;/a&gt; do Jesse Schell, começamos a ler pra aprender Game Design enquanto fazíamos o jogo. O objetivo era fazer o mais rápido possível nosso RPG do Naruto, meu irmão na arte com pixelart e eu na programação &lt;del&gt;a pesar de que ele me ajudava na programação também porque eu não queria ler tutorial&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;Já tínhamos feito a Vila da Folha, um modelo de personagem usável, definido como atacar, o calculo de ataque e dano deduzido da defesa, tudo em uma semana! Íamos conseguir fazer esse jogo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Porém...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na semana seguinte meu irmão já estava cansado, não queria mais fazer a arte nem nada do jogo, queria ficar só jogando Grand Chase, eu percebi isso e fui desanimando também, é chato ficar insistindo pras pessoas irem pra frente com projetos colaborativos, além do que tínhamos 13 anos, foi bem fácil me desfocar do que eu realmente queria, que era fazer o jogo.&lt;/p&gt;

&lt;p&gt;Infelizmente aos poucos fomos abandonando o projeto, cada vez mais largado até o momento que nem lembrávamos de fazer nada, o projeto foi dropado com vários assets, mecânicas e etc feitos, mas o maior recurso que era nosso &lt;strong&gt;foco&lt;/strong&gt; havia acabado e sem isso nunca iria haver projeto.&lt;/p&gt;

&lt;p&gt;Lembro de nessa época, meses depois de o projeto ter sido largado, por um lapso qualquer, lembrei do jogo e me senti mal por ter abandonado, nesse momento eu disse pra mim mesmo &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quero muito que quando eu envelhecer, com uns 17 anos, saiba fazer jogos, assim como alguns adolescentes são, quero ser um deles um dia.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Realidade
&lt;/h2&gt;

&lt;p&gt;Vez ou outra eu abria o Byond pra tentar fazer alguma coisa simples, mas parava na metade e não olhava mais pra plataforma por meses. Foi assim por bastante tempo, mas o tempo passou. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dias. Semanas. Meses. Anos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Durante todo esse tempo eu mal estudei Byond, mal aprendi gamedesign, parei de ler o livro do Jesse Schell na página 60, nem tinha mais o Byond instalado no PC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt; &lt;strong&gt;Cheguei nos 17 anos sem saber fazer jogos como havia desejado&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A Reação
&lt;/h2&gt;

&lt;p&gt;Me achei burro, perdedor, idiota, não era um adolescente bom com as meninas, não era bom em jogos, não era bom na escola e nem o meu maior objetivo que era &lt;strong&gt;fazer jogos&lt;/strong&gt; foi atingido, com isso, peguei toda a minha maturidade de adolescente e fiquei na cama deitado por meses sentindo pena de mim mesmo sem fazer nada além de jogar Grand Chase no notebook me auto-culpando pelo que eu não fiz e como eu fracassei na vida.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Lição
&lt;/h2&gt;

&lt;p&gt;Demorou muitos anos, mas hoje eu percebo a lição valiosíssima que aprendi com esse fracasso pessoal e é por isso que eu to aqui compartilhando essa história com você.&lt;/p&gt;

&lt;p&gt;Talvez a lição seja obvia, cristalina como água, mas por mais que ela seja é válido dizer ela e algumas coisas sobre ela&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As coisas só acontecem pra quem luta por elas&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;del&gt;mesmo que tenha as que ganharam tudo de bandeja, se você se comparar com essas pessoas você só vai se frustrar e vai continuar sem atingir seus objetivos&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Nos 4 anos, dos 13 aos 17 eu nunca realmente me dediquei a aprender a fazer jogos, nunca foquei pra aprender, não tentei entrar no mundo, não estudei, não pratiquei. &lt;strong&gt;Como eu iria me tornar um desenvolvedor de jogos sem ir atrás de ser um?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Eu achava que ia acordar um belo dia com todo o conhecimento na minha cabeça?&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Todo mundo sabe que se você não pratica algo você nunca vai ser bom naquilo, dependendo o que é você pode sequer saber como iniciar em alguma coisa se você não ir minimamente atrás pra entender como fazer, mas por algum motivo temos o hábito de traçar metas sem fazer por onde.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você colhe o que planta&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu e você temos metas, mas me fala, sinceramente, o que você está fazendo hoje pra atingir suas metas? Você ta caminhando em direção do seu objetivo ou ta esperando ele cair do céu no seu colo?&lt;/p&gt;

&lt;p&gt;Independente de qual objetivo seja, se aposentar mais cedo, arrumar um trampo melhor, ganhar mais, comprar uma casa, viajar pra fora, aprender violão, ficar bom no LOL e etc. Você ta mesmo indo atras disso ou você ta se enganando dizendo que lá na frente vai tudo dar certo?&lt;/p&gt;




&lt;h2&gt;
  
  
  Um Exercício
&lt;/h2&gt;

&lt;p&gt;Como você se imagina daqui 10 anos? O que você tem? Onde mora? Casou? Tem filhos? Trabalha com o que? Qual sua área? Seja bastante específico nas respostas, nada de "ganhando bem", especifique o salário: "ganhando 100k mês".&lt;/p&gt;

&lt;p&gt;Agora, de novo, você está de fato fazendo algo que te aproxime desses objetivos ou está se distraindo?&lt;/p&gt;




&lt;h2&gt;
  
  
  Vá Atras
&lt;/h2&gt;

&lt;p&gt;Hoje, quase exatos 10 anos de um dos meus maiores fracassos, eu consigo ver que errei muito na adolescência, não usei meu tempo como deveria pra atingir meus objetivos e isso me custou que &lt;strong&gt;até hoje não sei fazer jogos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Mas não deixe que isso aconteça com você também, vá atras dos seus objetivos &lt;strong&gt;hoje&lt;/strong&gt;, faça um pouco por dia, mas faça, vá atras, mesmo que a passos lentos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Andando você demora, parado você não chega&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sei que você provavelmente também tem seus arrependimentos da adolescência, mas não deixe eles se repetirem, se você pode fazer algo hoje pra que atinja o seu &lt;strong&gt;amanha&lt;/strong&gt;, faça, não espere, vá atras da sua visão do futuro!&lt;/p&gt;

&lt;p&gt;Depois de quase 10 anos eu estou aqui tentando novamente fazer jogos, brigando com minha falta de foco e com a falta de tempo da vida de adulto, mas indo atras, a passos lentos na direção de um objetivo.&lt;/p&gt;

&lt;p&gt;Faça isso também, sei que consegue!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se &lt;strong&gt;hoje&lt;/strong&gt; fosse 10 anos no futuro, você estaria feliz com seus resultados?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As coisas não vão acontecer sozinhas, faça hoje pra colher amanha.&lt;/p&gt;

&lt;p&gt;E, do fundo do meu coração, boa sorte com seus objetivos! Espero que você os atinja, que faça um pouco por dia, mas faça. Não espere chegar lá por mágica pois isso não vai acontecer. Troque o seu "sonho" pra "objetivo" e faça acontecer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tenha medo de atingir o prazo, mas não a meta&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Boa sorte!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Iae, dahora? To fazendo lives de segunda a sexta as 19h, segue a gente na twitch!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/alecell"&gt;https://linktr.ee/alecell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>braziliandevs</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Diga o que a função faz</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Mon, 18 Apr 2022 14:44:07 +0000</pubDate>
      <link>https://forem.com/alecell/diga-o-que-a-funcao-faz-429g</link>
      <guid>https://forem.com/alecell/diga-o-que-a-funcao-faz-429g</guid>
      <description>&lt;p&gt;Por algum motivo atualmente é convenção nomear qualquer método com o prefixo &lt;code&gt;handle&lt;/code&gt; quando ele é chamado em um evento, tipo chamar de &lt;code&gt;handleClick&lt;/code&gt; um método chamado num evento de &lt;em&gt;click&lt;/em&gt;, &lt;code&gt;handleChange&lt;/code&gt; quando lidamos com o evento &lt;em&gt;change&lt;/em&gt; e assim por diante.&lt;/p&gt;

&lt;p&gt;Mas advinha?! Isso é o &lt;strong&gt;crime&lt;/strong&gt; &lt;strong&gt;do&lt;/strong&gt; &lt;strong&gt;crime&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;O nomes dos nossos métodos ficam sem significado, o nome não diz nada sobre a função do método, só é dito quando ele é disparado, não o que ele de fato faz!&lt;/p&gt;

&lt;p&gt;Suponhamos que temos que trabalhar em uma loja de roupas e precisamos dar manutenção neste componente, o que acontece quando clico nos botões?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="sr"&gt;/.../&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"short"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Short &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"medium"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Medium &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"big"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Big &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bigger"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Bigger &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;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;p&gt;Teria que ler a implementação do &lt;code&gt;handleClick&lt;/code&gt; pra poder responder essa pergunta, apenas com a informação atual o máximo que podemos fazer é supor de forma bem branda o que acontece ao clicar no botão, mas não temos quase nenhuma certeza!&lt;/p&gt;

&lt;p&gt;Mas fazendo apenas ajustando o nome da função, fica claro o que acontece ao clicar no botão&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="sr"&gt;/.../&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"short"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Short &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"medium"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Medium &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"big"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Big &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bigger"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Bigger &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;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;p&gt;Com uma simples alteração no nome da função e apenas lendo o &lt;code&gt;return&lt;/code&gt; do componente podemos saber o que está acontecendo, sem precisar ir na função, entender a lógica lá pra poder saber o que acontece. O código está claro quanto ao que ele faz, é explícito como deve ser.&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Note
&lt;/h3&gt;

&lt;p&gt;Existe apenas um caso que faz algum sentido chamar a função handler de &lt;code&gt;handle&lt;/code&gt;, e é quando, em casos muito raros, a função precisa fazer mais de uma coisa. Nesse caso chamar de &lt;code&gt;handle&lt;/code&gt; é o meio &lt;em&gt;genérico&lt;/em&gt; de chamar o método e, dentro dele, chamamos os 2 ou mais métodos necessários.&lt;/p&gt;

&lt;p&gt;Por exemplo, suponhamos que o pessoal de produto &lt;del&gt;acordou, caiu da cama, bateu a cabeça no chão e&lt;/del&gt; quer que quando o usuário mudar o filtro de busca o site mude de cor completamente, ai faz sentido usar &lt;code&gt;handleClick&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;applySearchFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;changeSiteColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"short"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Short &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"medium"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Medium &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"big"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Big &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bigger"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Bigger &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;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;h4&gt;
  
  
  E se nomearem a função de forma errada?
&lt;/h4&gt;

&lt;p&gt;Esse tipo de coisa precisa ser percebida e corrigida o quanto antes, se essa má nomeação te levou ao erro, você tem o dever de ajustar o nome da função para prevenir que futuros devs sejam induzidos ao erro também!&lt;/p&gt;

&lt;p&gt;&lt;del&gt;É legal também tirar print do git blame e colocar no grupo da empresa&lt;/del&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Reutilização legível
&lt;/h4&gt;

&lt;p&gt;Usando esse método de &lt;em&gt;nomenclatura&lt;/em&gt; ainda por cima ganhamos a semântica de poder reutilizar a função usada no evento mantendo a leitura do código limpa!&lt;/p&gt;

&lt;p&gt;Suponhamos que nos exemplos anteriores, por algum motivo, outro método precisa chamar a função &lt;code&gt;applySearchFilter&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;applySearchFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="sr"&gt;/.../&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;updateSearchText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;applySearchFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      /.../
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"short"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Short &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"medium"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Medium &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"big"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Big &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bigger"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;applySearchFilter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Bigger &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;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;p&gt;Dessa forma podemos ler de forma falada dizendo que &lt;em&gt;"após atualizar o texto de busca o filtro é aplicado"&lt;/em&gt; ao invés de dizer &lt;em&gt;"após atualizar o texto de busca lidamos com o click"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tem uma fala de &lt;strong&gt;Grady Booch&lt;/strong&gt; que eu gosto muito&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um código limpo é simples e direto. Ele é tão bem legível como uma prosa bem escrita.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  💡 Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pra nomear uma função sempre se pergunte: "O que essa função faz?"&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📚 References
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vozes da minha cabeça&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.amazon.com.br/C%C3%B3digo-limpo-Robert-C-Martin/dp/8576082675/ref=asc_df_8576082675/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379792215563&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=11685244748379490463&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=1001724&amp;amp;hvtargid=pla-398225630878&amp;amp;psc=1"&gt;Clean Code - Uncle Bob&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>react</category>
    </item>
    <item>
      <title>Deixando de procrastinar e sendo mais produtivo</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Tue, 12 Apr 2022 17:21:35 +0000</pubDate>
      <link>https://forem.com/alecell/deixando-de-procrastinar-e-sendo-mais-produtivo-316i</link>
      <guid>https://forem.com/alecell/deixando-de-procrastinar-e-sendo-mais-produtivo-316i</guid>
      <description>&lt;p&gt;Muitos desenvolvedores, assim como eu, tem uma dificuldade gigante de focar no que de fato precisa ser focado, fazer o que precisa ser feito, estudar, atualizar currículo e etc. &lt;/p&gt;

&lt;p&gt;Como sempre fiz parte dessa galera, vivi buscando como resolver esse problema e acabei aprendendo muito sobre o assunto com livros, vídeos e etc. Hoje sinto que consegui, resolver o problema, então se você sente tanto quanto eu a dor de não conseguir se organizar, cola comigo que vou ensinar um jeito que ando fazendo pra organizar meus afazeres que &lt;strong&gt;ta dando super certo!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥🔥 Google Agenda + Google Tarefas 🔥🔥
&lt;/h2&gt;

&lt;p&gt;Já tem um tempo que o Google lançou o Google Tarefas, mas só recentemente veio uma feature no Google Calendar que permite a sincronização dos 2 serviços criando tarefas com &lt;em&gt;deadline&lt;/em&gt; listadas no seu calendário e com todas as features que um evento tem.&lt;/p&gt;

&lt;p&gt;Mas antes, quais são as features que esses serviços juntos tem que são foda bagarai na organização?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receber notificação da tarefa em qualquer dispositivo&lt;/li&gt;
&lt;li&gt;Definição de tarefas a periódicas com periodicidades customizadas&lt;/li&gt;
&lt;li&gt;Descrição detalhada da tarefa&lt;/li&gt;
&lt;li&gt;Mover a tarefa automaticamente para o dia seguinte caso ela não tenha sido concluída&lt;/li&gt;
&lt;li&gt;Visualização macro da sua agenda quando precisar se reorganizar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso junto com algumas técnicas de produtividade que conheço estão fazendo tanta diferença aqui que acredito de verdade que vão te ajudar também!&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Criando uma Tarefa
&lt;/h2&gt;

&lt;p&gt;Antes de criar as tarefas temos que ter um lugar para coloca-las, então faça o seguinte:&lt;/p&gt;

&lt;p&gt;Acesse &lt;a href="https://calendar.google.com/"&gt;seu calendário&lt;/a&gt; e, na barra lateral direita, clique em &lt;strong&gt;Tarefas&lt;/strong&gt;, isso vai abrir a aba de tarefas: &lt;br&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%2F1jtu2smm541eupq59d1h.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%2F1jtu2smm541eupq59d1h.png" alt="botão tarefas no google calendar" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na aba de &lt;strong&gt;Tarefas&lt;/strong&gt; crie uma nova lista de tarefas e de a ela um nome:&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%2Fd0b4q10tfmuk16pg3syd.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%2Fd0b4q10tfmuk16pg3syd.png" alt="botão criar tarefas" width="800" height="411"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Agora com sua lista criada podemos começar a adicionar novas tarefas, mas não diretamente na lista de tarefas, mas sim no seu calendário!&lt;/p&gt;

&lt;p&gt;Pense primeiro em alguma coisa que você deveria fazer todo dia, algo bem simples, rápido, ou pode pensar em algo que geralmente demora, mas que se você fizer um pouco por dia já é o suficiente, pode ser ler uma página de um livro por dia, atualizar uma informação do currículo e etc.&lt;/p&gt;

&lt;p&gt;Mas lembra-se de que seus objetivos devem ser claros, se você quer ler um livro coloque "ler uma página de um livro" ou "ler um capítulo", mas nunca "ler o livro", esse objetivo é muito aberto, indefinido, nesse caso, uma palavra poderia ser "ler o livro"? Seja objetivo, metas visíveis e alcançáveis.&lt;/p&gt;

&lt;p&gt;Neste exemplo, quero tentar melhorar em Javascript, então vou fazer um exercício do &lt;a href="https://www.hackerrank.com/"&gt;HackerRank&lt;/a&gt; por dia.&lt;/p&gt;

&lt;p&gt;Para isso clique no dia que você vai começar a fazer a tarefa, quando a janela abrir clique em "Tarefa" e dê um nome:&lt;br&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%2Fjf1ilj7fjo3krccorvmq.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%2Fjf1ilj7fjo3krccorvmq.png" alt="colocando um nome na tarefa" width="445" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora clique em &lt;em&gt;Adicionar horário&lt;/em&gt; e coloque quando você vai realizar essa tarefa, lembrando que é importante que tenha um horário determinado pois &lt;a href="https://www.amazon.com.br/dp/B0055PGUYU/ref=dp-kindle-redirect?_encoding=UTF8&amp;amp;btkr=1"&gt;rotinas ajudam na construção de hábitos&lt;/a&gt;! Vou colocar as 10:00 AM.&lt;/p&gt;

&lt;p&gt;Pensando na periodicidade agora, como queremos melhorar em Javascript o ideal seja que façamos 1 exercício por dia, então clique em &lt;em&gt;Não se repete&lt;/em&gt; e selecione &lt;em&gt;Todos os dias&lt;/em&gt;:&lt;br&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%2Fs6p276r9h2xculnshskc.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%2Fs6p276r9h2xculnshskc.png" alt="definindo a frequencia de uma tarefa" width="443" height="476"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Po, mas e o descanso do guerreiro?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ai você clica em &lt;em&gt;Personalizar&lt;/em&gt;, a última opção, depois que a modal aparecer, na aba &lt;em&gt;Repetir&lt;/em&gt;, desmarca os dias de folga e clica em &lt;em&gt;Concluir&lt;/em&gt;:&lt;br&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%2F2in2ia5nhfu499gflcmj.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%2F2in2ia5nhfu499gflcmj.png" alt="personalizando a frequencia" width="376" height="414"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Na descrição da sua nota coloque elementos que podem facilitar que você faça o exercício, nesse caso talvez seja colocar o link direto pra página de exercícios do &lt;a href="https://www.hackerrank.com/domains/algorithms"&gt;HackerRank&lt;/a&gt; que você vai fazer.&lt;/p&gt;

&lt;p&gt;Na ultima opção selecione sua lista de tarefas (caso já não esteja selecionada)&lt;br&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%2F2us1jhkbjdzjq9c5lzoz.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%2F2us1jhkbjdzjq9c5lzoz.png" alt="selecionando a lista de tarefas" width="432" height="471"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Pronto! Sua tarefa foi criada, adicionada ao calendário com a periodicidade escolhida! &lt;br&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%2Fv4xiil2ka8z1z4or6j2e.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%2Fv4xiil2ka8z1z4or6j2e.png" alt="como fica no calendario" width="800" height="536"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍🏭 👩‍🏭 Usando as features 👩‍🏭👨‍🏭
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Concluindo tarefas
&lt;/h3&gt;

&lt;p&gt;Quando concluir a tarefa do dia você pode ir no seu calendário, selecionar a tarefa e marcar ela como concluída:&lt;br&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%2Ffwjczo73ro70vc0xd5x6.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%2Ffwjczo73ro70vc0xd5x6.png" alt="concluindo tarefas" width="441" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando concluir a tarefa ela também será concluída na lista de tarefas e a agenda, quando o dia virar, vai criar automaticamente a tarefa do próximo dia!&lt;/p&gt;

&lt;h3&gt;
  
  
  Tarefa não concluída
&lt;/h3&gt;

&lt;p&gt;É comum que por um motivo ou outro deixamos de fazer uma tarefa, mas felizmente o Google Agenda nos lembra que deixamos a tarefa e move ela para o outro dia quando não concluímos a tarefa no dia esperado.&lt;/p&gt;

&lt;p&gt;Então se eu tinha 3 tarefas para serem concluídas em um dia, mas por algum motivo não faço, elas estackam para o dia seguinte como tarefas pendentes, mas se mantem ativas no dia que eu perdi também, como um double check:&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%2F6jv7jjufj7j572s22azp.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%2F6jv7jjufj7j572s22azp.png" alt="tarefa nao concluida" width="351" height="173"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Se clicarmos em &lt;em&gt;tarefas pendentes&lt;/em&gt;:&lt;br&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%2Fyrkzt3fsqgf0wuepksf2.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%2Fyrkzt3fsqgf0wuepksf2.png" alt="tarefas pendentes" width="441" height="282"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vale dizer que nessa listagem podemos concluir as tarefas normalmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notificações
&lt;/h3&gt;

&lt;p&gt;Para usar as notificações da agenda em todos os dispositivos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.google.com/calendar/answer/37242?hl=pt-BR&amp;amp;co=GENIE.Platform%3DDesktop#zippy=%2Cativar-ou-desativar-as-notifica%C3%A7%C3%B5es"&gt;Permita as notificações de browser do seu Google Agenda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.calendar&amp;amp;hl=pt_BR&amp;amp;gl=US"&gt;Baixe o aplicativo do Google Agenda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.tasks&amp;amp;hl=pt"&gt;Baixe o aplicativo do Google Tarefas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;: Como as &lt;em&gt;tarefas&lt;/em&gt; não são &lt;em&gt;eventos&lt;/em&gt;, na maioria dos aplicativos de calendários as tarefas não aparecem 😕&lt;/p&gt;

&lt;h3&gt;
  
  
  TODO list
&lt;/h3&gt;

&lt;p&gt;Como isso fica integrado com o Google Tarefas, se preferir visualizar suas tarefas como uma TODO list ao invés de acompanhar elas pelo calendário, basta abrir o Google Tarefas no Gmail ou algum outro serviço google (não são todos que possuem a barra lateral de tarefas) direto pelo app do Google Tarefas.&lt;/p&gt;




&lt;p&gt;Gostou da dica? Me segue para mais, toda segunda to postando uma diquinha maneira!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/alecell"&gt;https://linktr.ee/alecell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>TIL: October 2020</title>
      <dc:creator>Alecell</dc:creator>
      <pubDate>Thu, 08 Oct 2020 22:52:44 +0000</pubDate>
      <link>https://forem.com/alecell/til-october-2020-37g6</link>
      <guid>https://forem.com/alecell/til-october-2020-37g6</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Day 05 [Typescript/Redux] - How to type an dispatched action that returns a value with redux-thunk, react-hooks and typescript&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To get access to the returned value of a &lt;code&gt;ThunkAction&lt;/code&gt; inside dispatch that don't pop any type errors you should declare the the type when initiate the dispatch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyDispatchType&lt;/span&gt;&lt;span class="o"&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;The generics define the retuned value of the &lt;code&gt;dispatch&lt;/code&gt;, but the generic type should be of type &lt;code&gt;ThunkDispatch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ThunkDispatch&lt;/code&gt; receive 3 arguments, but to our case we just need to care about the first one, which is relative to the return type of the &lt;code&gt;dispatch&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MyDispatchType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ThunkDispatch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AnyAction&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;&lt;em&gt;&lt;strong&gt;Obs:&lt;/strong&gt; &lt;code&gt;ThunkDispatch&lt;/code&gt; is exported from &lt;code&gt;redux-thunk&lt;/code&gt; and &lt;code&gt;AnyAction&lt;/code&gt; is exported from &lt;code&gt;redux&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With this, when you use the &lt;code&gt;dispatch&lt;/code&gt; function it will provide autocomplete and a type-safe return based on &lt;code&gt;MyType&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Full example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;MyType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MyDispatchType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ThunkDispatch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AnyAction&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;const&lt;/span&gt; &lt;span class="nx"&gt;myAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;MyType&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;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;status&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;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;baz&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hokage&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="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&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;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyDispatchType&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;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//  No errors&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baz&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;myAction&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="k"&gt;return &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;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;CLICK&lt;/span&gt; &lt;span class="nx"&gt;ME&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;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;h3&gt;
  
  
  &lt;strong&gt;Day 07 [Javascript] - How to return a value that is accessible only inside/after an event&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One of the gold questions of the Javascript past is now solved surprisingly easy, thanks to the &lt;code&gt;Promises&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;So, imagine a scenario that your user add an audio file to an &lt;code&gt;input&lt;/code&gt; and, before you upload the audio, for some reason, you need to get that audio duration. Before &lt;code&gt;Promises&lt;/code&gt; it was impossible to achieve without bad practices or code smells since you only can get an audio duration after it was loaded, but with promises we can keep our code clean and do the trick.&lt;/p&gt;

&lt;p&gt;As I found &lt;a href="https://stackoverflow.com/questions/34647536/how-to-get-audio-duration-value-by-a-function"&gt;here&lt;/a&gt; promises could be used to return the value inside an event (which is pretty obvious BTW) so, on the case that we need to return the audio duration of a &lt;code&gt;File&lt;/code&gt; when &lt;code&gt;onloadedmetadata&lt;/code&gt; event is fired, we can do this:&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;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getAudioFileDuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="p"&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;number&lt;/span&gt;&lt;span class="o"&gt;&amp;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;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;objectUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&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;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objectUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onloadedmetadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The best of this approach is to avoid many work around on the web like have a &lt;em&gt;variable in the upper scopes of the methods&lt;/em&gt;, &lt;em&gt;send a callback&lt;/em&gt; or &lt;em&gt;do what you wanted to be outside of the event inside of it&lt;/em&gt;. The &lt;code&gt;Promise&lt;/code&gt; method keep the best practices, its modular, reusable and clean to read.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 12 [CSS] - How to &lt;code&gt;justify-self&lt;/code&gt; with &lt;code&gt;flex&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;(Okay, I's embarrassing I did no know this before, BUT...)&lt;/p&gt;

&lt;p&gt;I tried to answer &lt;a href="https://stackoverflow.com/questions/64175842/flexbox-boxes-inside-boxes/64175903#64175903"&gt;this StackOverFlow question&lt;/a&gt; and realize (besides answering the question wrongly) I didn't know how to answer, what makes me think "Hey, I don't know the answer", and start to search.&lt;/p&gt;

&lt;p&gt;The point is that for needing purposes, the property &lt;code&gt;justify-self&lt;/code&gt; don't work on flex items because we can just use the &lt;code&gt;margin&lt;/code&gt; proprty to reach the same behavior.&lt;/p&gt;

&lt;p&gt;So, when need &lt;code&gt;justify-self: flex-end&lt;/code&gt;, just replace this with &lt;code&gt;margin-left: auto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I create a &lt;a href="https://codepen.io/alecell-the-lessful/pen/YzWZyoj"&gt;pen&lt;/a&gt; to exemplify this.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 15 [Typescript] - Why we have to reference dynamic types with the name of the type, and not only the type?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Delving on the web these days I figure out a answer that I don't get that I have already: &lt;strong&gt;Why we have to write dynamic keys like this:&lt;/strong&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kr"&gt;string&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;strong&gt;instead of:&lt;/strong&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kr"&gt;string&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;For too long I thought it was a typescript limitation, but I was wrong (maybe not btw), this exists for reading purposes, since name the &lt;code&gt;key&lt;/code&gt; with something more clear is way more readable than just &lt;code&gt;key&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kr"&gt;string&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;Now I'll stop to name the dynamic keys with just &lt;code&gt;key&lt;/code&gt; and give them an appropriate name, and you should do it too. (if you don't do already of course)&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 20 [Typescript] - Get the type of deeply nested dynamic key types&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let's suppose we have a collection of objects like this:&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;Item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&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="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price&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="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ItemCollection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;itemId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;Item&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;So we have a collection of &lt;code&gt;Items&lt;/code&gt; that each one of the collection is its &lt;code&gt;itemId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, again, for some reason we need to get the type of &lt;code&gt;Item&lt;/code&gt; by the collection, without reference the &lt;code&gt;Item&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;How can we get access to the type of each item of &lt;code&gt;ItemCollection&lt;/code&gt;, to, let's say, create an type alias?&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;TypeAlias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ItemCollection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it, is really easy to reference the type nested, you just need to use the type of the key as you would use the type reference directly, but not using the name, but the type itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 30 [Typescript/React] - Correctly type SVG to use as components&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For too long I wonder how to properly type SVG images when use ReactSvg or something like this, saddly I don't save the reference, but I found this:&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SVGProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SVGSVGElement&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;So, when use it on the declarations, make something like this:&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;declare&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*.svg&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;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SVGProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SVGSVGElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&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>react</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>css</category>
    </item>
  </channel>
</rss>
