<?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: Giovani Sousa</title>
    <description>The latest articles on Forem by Giovani Sousa (@giovanisleite).</description>
    <link>https://forem.com/giovanisleite</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%2F34347%2Fe399088d-b69f-4d10-94bb-6e0e23d3a6cf.jpeg</url>
      <title>Forem: Giovani Sousa</title>
      <link>https://forem.com/giovanisleite</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/giovanisleite"/>
    <language>en</language>
    <item>
      <title>Cansado de conferir o schema.rb</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Mon, 05 Sep 2022 20:00:36 +0000</pubDate>
      <link>https://forem.com/giovanisleite/cansado-de-conferir-o-schemarb-in6</link>
      <guid>https://forem.com/giovanisleite/cansado-de-conferir-o-schemarb-in6</guid>
      <description>&lt;p&gt;O Rails nos dá algumas facilidades que parecem mágica. A não-necessidade de importar os módulos que queremos usar, a metaprogramação da linguagem Ruby, os generators presentes no framework... Entre outras. Para mim, o maior contraste com outras linguagens é como fazer muito escrevendo tão pouco quando comparado. E isso tem o seu lado ruim também.&lt;/p&gt;

&lt;p&gt;Quando criamos um novo modelo, não precisamos declarar no arquivo ruby (&lt;code&gt;model.rb&lt;/code&gt;) todos os campos presentes naquele modelo. Geralmente, só mencionamos os campos que precisam de alguma validação ou que estão presentes em algum método para aquele modelo. E toda vez que queremos saber algum campo que não é mencionado: &lt;code&gt;ctrl + f&lt;/code&gt; no &lt;code&gt;schema.rb&lt;/code&gt;. O que não é exatamente a forma mais rápida e agradável que gostaríamos, ainda mais quando o campo é mencionado em diferentes tabelas, a tabela é mencionada em outras tabelas, indexes e etc.&lt;/p&gt;

&lt;p&gt;Com a &lt;code&gt;gem&lt;/code&gt; (Annotate)[&lt;a href="https://github.com/ctran/annotate_models"&gt;https://github.com/ctran/annotate_models&lt;/a&gt;], podemos facilmente adicionar um comentário ao fim do código no &lt;code&gt;model.rb&lt;/code&gt; com a estrutura da tabela referente aquele model, no mesmo formato que encontramos no &lt;code&gt;schema.rb&lt;/code&gt;, algo tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# == Schema Info&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Table name: line_items&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;#  id                  :integer(11)    not null, primary key&lt;/span&gt;
&lt;span class="c1"&gt;#  quantity            :integer(11)    not null&lt;/span&gt;
&lt;span class="c1"&gt;#  product_id          :integer(11)    not null&lt;/span&gt;
&lt;span class="c1"&gt;#  unit_price          :float&lt;/span&gt;
&lt;span class="c1"&gt;#  order_id            :integer(11)&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maravilha, né?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/XKyP6RJH29cCaD0QpF/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/XKyP6RJH29cCaD0QpF/giphy.gif" alt='Obama dizendo "Special... Beautiful"' width="500" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Falta algo no seu commit</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Fri, 13 May 2022 20:47:51 +0000</pubDate>
      <link>https://forem.com/giovanisleite/falta-algo-no-seu-commit-3ekl</link>
      <guid>https://forem.com/giovanisleite/falta-algo-no-seu-commit-3ekl</guid>
      <description>&lt;p&gt;Falta algo no seu commit. O histórico de commits e pull requests é uma documentação incrível sobre a evolução do seu projeto. Assumindo que você já usa &lt;a href="https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/"&gt;boas mensagens de commit&lt;/a&gt;, no histórico do seu projeto (&lt;code&gt;git log&lt;/code&gt;), você já tem qual foi a mudança - no título ou vendo a mudança (&lt;code&gt;git diff&lt;/code&gt;), quando aconteceu e quem fez essa mudança. Mas tem dois pedaços de informação que normalmente não estão ali.&lt;/p&gt;

&lt;p&gt;Um desses pedaços de informação faltando no seu commit é a razão pela qual você fez a mudança. É comum essa informação estar em uma ferramenta de gerenciamento de projetos — como Jira, Trello ou Pivotal Tracker. O melhor caso é essa conexão ser feita numa via de mão dupla, a partir da ferramenta é possível encontrar o commit, e, partindo do commit, é possível encontrar o ticket na ferramenta.&lt;/p&gt;

&lt;p&gt;O segundo pedaço é a explicação da solução. Quais as razões que te levaram a resolver aquela demanda (o primeiro pedaço da informação) daquela forma (o que podemos ver no git diff). Essa informação é muito valiosa e, muitas vezes, fica guardada na sua cabeça até não estar mais.&lt;/p&gt;

&lt;p&gt;Para muitas pessoas desenvolvedoras, a maioria do trabalho no código é manutenção de que já existe. Passa pelo processo de ler, entender como funciona e aplicar as mudanças de acordo com a demanda, seja para corrigir um bug, adicionar uma nova funcionalidade e quem sabe até remover algo. &lt;a href="https://fs.blog/chestertons-fence/"&gt;Antes de tirar a cerca, é importante entender por que ela foi colocada ali&lt;/a&gt;, qual era o problema anterior a última mudança, o que ele resolveu, por que resolveu daquela forma.&lt;/p&gt;

&lt;p&gt;E temos um lugar perfeito para guardar essa informação. O commit é formado pela descrição curta (também chamada de título) e pela descrição longa, pouquíssimo utilizada. Mas é bem simples de adicionar, direto do terminal, é a string após o segundo &lt;code&gt;-m&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Descrição curta"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Descrição longa."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou editando o commit posteriormente com &lt;code&gt;git commit --amend&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Descrição curta

Descrição longa

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Author:    YOU! &amp;lt;your-email@email.com&amp;gt;
# Date:      Thu May 13 09:31:52 2022 -0300
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
#   modified:   file-changed.txt
#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicionar a motivação e a razão por trás da solução como descrição longa do commit — conectando a mudança do código com o que temos na ferramenta de gerenciamento de demanda e registrando nosso raciocínio—, é parte da comunicação do time e enriquece muito a tomada de decisão futura.&lt;/p&gt;

&lt;p&gt;Tendo uma extensão no seu editor de texto, como a &lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens"&gt;GitLens&lt;/a&gt; disponível para VSCode, no momento que você está editando o código, é possível ver quem foi o último a modificar aquela linha, quando, e a mensagem do commit.&lt;/p&gt;

&lt;p&gt;Olha que beleza, no momento que você está construindo a nova solução ou entendendo a última, você consegue saber o que a última pessoa que modificou aquilo estava pensando. Sem a necessidade de tomar tempo dela ou tentar fazer ela relembrar — o que pode ser impossível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HY_lIDHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://giovanisleite.dev/static/gimli-2a0754cd91e9fc408f9d53373b9e55b5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HY_lIDHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://giovanisleite.dev/static/gimli-2a0754cd91e9fc408f9d53373b9e55b5.gif" width="500" height="254"&gt;&lt;/a&gt;&lt;br&gt;Bom, o que a gente está esperando?
  &lt;/p&gt;

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

&lt;p&gt;O commit é formado pela descrição curta (também chamada de título) e pela descrição longa, pouquíssimo utilizada. Utilizar a descrição longa para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conectar o commit e o código que é parte dele com a demanda (o ticket no JIRA, o card do trello, quem pediu, o que pediu, as restrições que pediram para respeitar, e etc)&lt;/li&gt;
&lt;li&gt;Explicar as razões por trás da solução. Quais foram as decisões tomadas para solucionar aquilo daquela forma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;São pequenas informações que muitas vezes são perdidas ao longo do tempo. O registro delas pode ajudar seus colegas ou o você do futuro a tomar decisões melhores e escrever soluções melhores!&lt;/p&gt;

</description>
      <category>git</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>boaspraticas</category>
    </item>
    <item>
      <title>Controlando a quebra de linha</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Mon, 02 May 2022 20:17:39 +0000</pubDate>
      <link>https://forem.com/giovanisleite/controlando-a-quebra-de-linha-4gi0</link>
      <guid>https://forem.com/giovanisleite/controlando-a-quebra-de-linha-4gi0</guid>
      <description>&lt;p&gt;Seja para criar um efeito estético ou evitar algum problema, tipo uma palavra viúva, aquela que sobra para outra linha no final de um parágrafo, é legal ter umas cartas na manga para dar aquela ajeita nos textos e nas quebras de linha. Ainda mais quando tratamos de partes chave do projeto, como a primeira coisa que vão ver no site que você está desenvolvendo, como é o caso da &lt;em&gt;Hero Section&lt;/em&gt;&lt;sup id="fnref1"&gt;1&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, estamos criando um site que o texto da nossa &lt;em&gt;Hero Section&lt;/em&gt; é "Vamos Jogar um Basquete". Os designers do nosso time pediram que a frase ocupe apenas uma linha em telas grandes o bastante, mas nas demais, o desejado é que ao quebrar, nunca a palavra "Basquete" fique sozinha na segunda linha.&lt;/p&gt;

&lt;p&gt;Obviamente, podemos dar uma olhada como a frase fica disposta em vários tamanhos de tela e forçarmos a quebra de linha entre as palavras "jogar" e "um" com uma tag &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; e, para os tamanhos de tela, que cabem a frase toda, podemos usar media-queries&lt;sup id="fnref2"&gt;2&lt;/sup&gt; para esconder a quebra de linha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt; Vamos Jogar&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;um Basquete&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;Jogar&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas tem um jeito muito mais fácil e escrevendo muito menos! &lt;strong&gt;É utilizando o caracter especial &lt;em&gt;Non-breaking space&lt;/em&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt;, no HTML ele é invocado assim: &lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;.&lt;/strong&gt; Esse caractere funciona como um espaço, mas, no momento da quebra da linha, ele não vai ser considerado. É como se "Um Basquete" fosse uma palavra só sob a regra padrão de quebra de linha, na qual uma palavra é indivisível.&lt;/p&gt;

&lt;p&gt;Codando nosso exemplo:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/giovanileite/embed/XWZJKaK?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Geralmente, a primeira dobra (o que aparece no seu navegador assim que abre o site) da página inicial dos sites é chamada de &lt;em&gt;Hero Section&lt;/em&gt;. A versão mais comum é uma imagem de fundo, um texto grande com o nome do produto e/ou um slogan e um botão convidando a se cadastrar, comprar o produto ou algo que seja do interesse do site em questão. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/Media_Queries/Using_media_queries"&gt;https://developer.mozilla.org/pt-BR/docs/Web/CSS/Media_Queries/Using_media_queries&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Non-breaking_space"&gt;https://en.wikipedia.org/wiki/Non-breaking_space&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Um .env para todos workspaces</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Sat, 05 Jun 2021 23:24:49 +0000</pubDate>
      <link>https://forem.com/giovanisleite/um-env-para-todos-workspaces-1hh1</link>
      <guid>https://forem.com/giovanisleite/um-env-para-todos-workspaces-1hh1</guid>
      <description>&lt;p&gt;A feature do Yarn Workspaces é bastante útil quando você quer ter várias aplicações ou bibliotecas&lt;br&gt;
no mesmo repositório. Um famigerado monorepo. O &lt;a href="https://twitter.com/robertoachar"&gt;Roberto Achar&lt;/a&gt; fez &lt;a href="https://robertoachar.dev/blog/yarn-workspaces"&gt;um post sobre como configurar um monorepo utilizando o Yarn Workspaces&lt;/a&gt;. A &lt;a href="https://github.com/mui-org/material-ui"&gt;biblioteca do Material-UI para React&lt;/a&gt; é um exemplo de repositório que tem múltiplos pacotes juntos e usa Yarn Workspaces.&lt;/p&gt;

&lt;p&gt;São várias as organizações que podemos fazer nesse esquema, podemos ter aplicações independentes, uma lib que é usada por todas as outras, várias independentes e uma que usa todas elas e etc. Nesse mundo de aplicações, durante o desenvolvimento, ter um .env para cada uma pode não fazer sentido ou simplesmente ser chato demais por ter que ficar cada hora mudando em um lugar diferente, copiando de um pro outro e etc.&lt;/p&gt;

&lt;p&gt;Um comando e uma alteração nos seus scripts pode resolver isso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instale a biblioteca &lt;a href="https://github.com/entropitor/dotenv-cli"&gt;&lt;code&gt;dotenv-cli&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; dotenv-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;ol&gt;
&lt;li&gt;Adicione &lt;code&gt;dotenv -e .env&lt;/code&gt; antes do seu comando que irá iniciar a aplicação/lib, por exemplo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start-frontend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dotent -e yarn workspace frontend start"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, sua aplicação vai poder acessar as váriaveis que você configurou no seu &lt;code&gt;.env&lt;/code&gt; da raiz 🎉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>yarnworkspaces</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Copiando com Javascript - Clipboard API</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Sat, 29 May 2021 15:16:05 +0000</pubDate>
      <link>https://forem.com/giovanisleite/copiando-com-javascript-clipboard-api-2l4o</link>
      <guid>https://forem.com/giovanisleite/copiando-com-javascript-clipboard-api-2l4o</guid>
      <description>&lt;p&gt;TL;DR&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;let&lt;/span&gt; &lt;span class="nx"&gt;textToCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eu quero copiar esse texto aqui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;afterSuccess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Copiado com sucesso!&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;afterFailure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A Cópia falhou!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clipboard&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textToCopy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;afterSuccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;afterFailure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Numa era pré &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API"&gt;ClipboardAPI&lt;/a&gt;, a solução para copiar e colar algum texto que eu mais vi envolvia adicionar à página um input com o texto que você quer copiar, colocar o foco naquele input, selecionar o texto e enviar o comando &lt;code&gt;document.execCommand("copy")&lt;/code&gt;. E em muitos casos essa ainda é a melhor solução dependendo de quais browsers a sua aplicação deve-se manter compatível. Você pode comparar o suporte dessa feature utilizando o &lt;a href="//caniuse.com"&gt;caniuse.com&lt;/a&gt;. Suporte a &lt;a href="https://caniuse.com/document-execcommand"&gt;document.execCommand&lt;/a&gt; x Suporte a &lt;a href="https://caniuse.com/mdn-api_clipboard_writetext"&gt;Clipboard API write text&lt;/a&gt;. &lt;a href="https://stackoverflow.com/a/46118025/7838074"&gt;Em caso de IE, não tem jeito, vai ter que usar &lt;code&gt;document.execCommand&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para o uso do Clipboard API, além de conhecer a API em si, temos que respeitar algumas regras por questão de segurança. Uma delas, por exemplo, é que o clipboard.writeText vai falhar caso o usuário não esteja com foco na aba. Você pode ver esse erro acontecendo, testando o código no console do seu browser (isso no Chrome). Em alguns outros browsers, esse código só funciona caso esteja num código sendo executado em resposta a uma ação do usuário, como um click por exemplo. Então, tenha isso em mente ao utilizar essa API.&lt;/p&gt;

&lt;p&gt;O código é simples, a função &lt;code&gt;window.navigator.clipboard.writeText&lt;/code&gt; retorna uma &lt;a href="https://medium.com/trainingcenter/entendendo-promises-de-uma-vez-por-todas-32442ec725c2"&gt;&lt;code&gt;Promise&lt;/code&gt;&lt;/a&gt;, ou seja, ele é assíncrono, logo após a sua execução pode ser que ele ainda não tenha terminado de copiar. Por isso, nós utilizamos o &lt;code&gt;.then&lt;/code&gt;, para que quando essa &lt;code&gt;Promise&lt;/code&gt; seja resolvida, ou seja, o comando tenha de fator terminado de copiar ou dado erro, no caso de sucesso execute a nossa função &lt;code&gt;afterSuccess&lt;/code&gt; e em caso de erro execute nossa outra função, &lt;code&gt;afterFailure&lt;/code&gt;. E é isso, assim que aparecer a mensagem de sucesso, já estamos livres pra sair colando nossa mensagem.&lt;/p&gt;

&lt;p&gt;Esse text foi originalmente postado em &lt;a href="https://giovanisleite.dev/copiando-com-javascript"&gt;https://giovanisleite.dev/copiando-com-javascript&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>clipboardapi</category>
      <category>webapis</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como configurar chaves SSH para duas ou mais contas no Github</title>
      <dc:creator>Giovani Sousa</dc:creator>
      <pubDate>Sat, 20 Jun 2020 16:05:09 +0000</pubDate>
      <link>https://forem.com/giovanisleite/como-configurar-chaves-ssh-para-duas-ou-mais-contas-no-github-5de9</link>
      <guid>https://forem.com/giovanisleite/como-configurar-chaves-ssh-para-duas-ou-mais-contas-no-github-5de9</guid>
      <description>&lt;p&gt;Imagino que você já tenha sua primeira conta configurada e está fazendo/já fez o &lt;a href="https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account"&gt;processo de autenticação SSH&lt;/a&gt; para a segunda conta, criando uma segunda chave e adicionando ao Github/Bitbucket/Gitlab/Outro da sua escolha e deu merda na hora de fazer o &lt;code&gt;git clone&lt;/code&gt; do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como resolver
&lt;/h2&gt;

&lt;p&gt;Dentro da pasta que guarda suas chaves, geralmente &lt;code&gt;~/.ssh&lt;/code&gt; você vai criar um arquivo &lt;code&gt;config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Supondo que você quer deixar a chave que já está funcionando como default e quer que essa segunda chave funcione apenas para casos especiais, como esse repositório ou alguns repositórios que você vai fazer clone em seguida. Você vai adicionar uma regra no arquivo &lt;code&gt;~/.ssh/config&lt;/code&gt; para esses repositórios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host caso-especial
  HostName github.com
  IdentityFile ~/.ssh/segundachave_id_rsa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ao clonar o repositório, ao invés de usar o comando que o Git sugere, você vai usar algo como: &lt;code&gt;git clone git@caso-especial:organizacao-dono-do-repo/repo.git&lt;/code&gt;. E tchana nana na.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l4FGIdh6jzW3MSszC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l4FGIdh6jzW3MSszC/giphy.gif" alt="gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ssh</category>
      <category>autenticação</category>
      <category>ptbr</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
