<?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>DEV Community: Anderson Marlon</title>
    <description>The latest articles on DEV Community by Anderson Marlon (@yagasaki7k).</description>
    <link>https://dev.to/yagasaki7k</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%2F155743%2F38d341e1-23b4-40f5-bb97-52b86c4744c8.jpg</url>
      <title>DEV Community: Anderson Marlon</title>
      <link>https://dev.to/yagasaki7k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yagasaki7k"/>
    <language>en</language>
    <item>
      <title>What if we combined the best of X, Reddit, and 4chan?</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 24 Feb 2026 12:23:28 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/what-if-we-combined-the-best-of-x-reddit-and-4chan-48ee</link>
      <guid>https://dev.to/yagasaki7k/what-if-we-combined-the-best-of-x-reddit-and-4chan-48ee</guid>
      <description>&lt;h2&gt;
  
  
  Why did I think about this?
&lt;/h2&gt;

&lt;p&gt;I’ve always spent time in these places.. (X / Reddit / 4chan / etc) and I’ve seen a lot of good things emerge there.. relevant discussions, useful archives, reports that became news. But I’ve also seen the same problems repeated:&lt;/p&gt;

&lt;p&gt;On X, the algorithm pushes bubbles against each other; conversation becomes collision, not discovery.&lt;br&gt;&lt;br&gt;
On Reddit, posting something “off-topic” turns into a quick delete; to participate properly you have to farm karma.&lt;br&gt;&lt;br&gt;
On 4chan, the myth of anonymity is sometimes just that.. and it creates room for abuse and manipulation.&lt;/p&gt;

&lt;p&gt;The question that stuck with me: what if we combined what works in these ecosystems, but with different rules and incentives — a place that rewards useful behavior instead of identity, and that doesn’t require “farming” to be able to give an opinion?&lt;br&gt;&lt;br&gt;
What is Slider (summary)&lt;/p&gt;

&lt;p&gt;Slider is an anonymous reputation-based network.. no username, no email, you are born as a hash.&lt;br&gt;&lt;br&gt;
You only become someone when you act: post, comment, participate, help — and because of that you gain (or lose) reputation. Reputation = power.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main ideas:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identity = hash + passphrase (if you lose it, you lose the account).
&lt;/li&gt;
&lt;li&gt;No email signup; the system was designed for privacy from the architecture.
&lt;/li&gt;
&lt;li&gt;Reputation determines privileges (creating communities, sending private invites, etc.).
&lt;/li&gt;
&lt;li&gt;Anti-farm system and trust measures (TrustScore, Seniority, reward splitting).
&lt;/li&gt;
&lt;li&gt;Hybrid moderation: local AI (open source / proprietary models + nsfwjs + face-api) + reports + admin panel.
&lt;/li&gt;
&lt;li&gt;In short: practical anonymity + meaningful reputation + abuse controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How reputation works (the essentials)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Actions that add: viral posts, upvotes, saves, quality comments.
&lt;/li&gt;
&lt;li&gt;Actions that subtract: downvotes, removals for violations, confirmed reports.
&lt;/li&gt;
&lt;li&gt;Reputation unlocks capabilities — e.g., creating a community, sending PMs, etc.
&lt;/li&gt;
&lt;li&gt;Login streak: log in every day → points. Doubles each day.
&lt;/li&gt;
&lt;li&gt;Day 1 = 1 point; doubles until day 10 → on day 10 you already have 512 points (or can reach it via virality).
&lt;/li&gt;
&lt;li&gt;Reposter/share/TrustScore: if you repost and generate engagement, there is reward sharing.. no free “farming”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(there is all the math in the repository (the idea is to be a project with several OPEN parts so people can understand EXACTLY how everything works, just like twitter did with the project &lt;a href="https://github.com/twitter/the-algorithm" rel="noopener noreferrer"&gt;https://github.com/twitter/the-algorithm&lt;/a&gt;) so it’s auditable and not a black box..)&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can post
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Text, images, videos, audio, documents
&lt;/li&gt;
&lt;li&gt;Direct downloads (without relying on strange “downloaders”)
&lt;/li&gt;
&lt;li&gt;Communities have rules. There are public sliders and also sliders where only admins post (e.g., THE Slider)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moderation and safety.. how do we intend to handle sensitive content?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic moderation with local models (NSFW + facial/age detection when necessary).
&lt;/li&gt;
&lt;li&gt;Uploads are moderated in the background, images with underage risk are rejected and the user punished, potentially even having the hash fully deleted automatically..
&lt;/li&gt;
&lt;li&gt;Reports affect reputation: self-moderated system with auditing via admin logs.
&lt;/li&gt;
&lt;li&gt;Goal: protect without turning the network into a black box of censorship.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical difference compared to X / Reddit / 4chan
&lt;/h2&gt;

&lt;p&gt;No need to “farm karma” to have a voice.. you build reputation with useful actions.&lt;br&gt;&lt;br&gt;
Privacy by default: identity by hash, no mandatory username.&lt;br&gt;&lt;br&gt;
Transparency: reputation rules and point distribution documented.&lt;br&gt;&lt;br&gt;
Technical moderation (AI + human) to reduce manual workload and slow responses.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Want to test it? Open Alpha
&lt;/h2&gt;

&lt;p&gt;We’re in an ALPHA phase.. open test. Want to play, break things, suggest? Come.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to test / give feedback on now (checklist)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create account (passphrase), post and see reputation go up/down
&lt;/li&gt;
&lt;li&gt;Upload images/videos → check moderation/instant blur
&lt;/li&gt;
&lt;li&gt;Create a community once you reach the required reputation
&lt;/li&gt;
&lt;li&gt;Test reposts / see how point splitting works
&lt;/li&gt;
&lt;li&gt;Look for ways to bypass the system (farm/abuse).. tell us how it happened
&lt;/li&gt;
&lt;li&gt;Report bugs and suggestions here or inside comments on the Slider “The Slider” on the site ... we want the network to evolve with you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  And why does this matter?
&lt;/h2&gt;

&lt;p&gt;It’s not just another network. It’s a practical attempt to combine freedom, anonymity, and responsibility with real economic signals (reputation). The goal is to build a place where good contribution is more valuable than popularity games .. and where communities are created by those who truly contribute.&lt;/p&gt;

&lt;p&gt;Want to test? Join, break things, criticize, improve. It’s just an alpha and we need people to fine-tune the algorithm, rules, and UX.&lt;/p&gt;

&lt;p&gt;Come play and build with us. ✅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://theslider.org" rel="noopener noreferrer"&gt;https://theslider.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://theslider.org" rel="noopener noreferrer"&gt;https://theslider.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;I am not the developer of the project, I am only sharing that it is a very good idea and that it can evolve a lot, very well, toward a right and safe path - and anonymous, as everything should be.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>"Bun, o compilador JavaScript mais rápido do mundo é lançado oficialmente"</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:40:59 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/bun-o-compilador-javascript-mais-rapido-do-mundo-e-lancado-oficialmente-pbp</link>
      <guid>https://dev.to/yagasaki7k/bun-o-compilador-javascript-mais-rapido-do-mundo-e-lancado-oficialmente-pbp</guid>
      <description>&lt;p&gt;Hoje fiquei desacreditado, é 11 de Setembro de 2023 e recebi a notícia de que dia 08 de Setembro a versão 1.0 do Bun saiu, só não soube disso, porque aqui no Brasil foi pós-feriado e muita gente acabou emendando - inclusive eu. Mas vamos lá, o que é o Bun e porquê ele vai revolucionar tanto em questão de velocidade de compiladores.&lt;/p&gt;

&lt;p&gt;Você é júnior e não sabe o que é um compilador ou até mesmo passou despercebido durante os estudos, vamos lá que vou te explicar tudo direitinho.&lt;/p&gt;

&lt;p&gt;Você pode ver a notícia sobre o &lt;a href="https://onigirihardcore.com.br/bun-lana-verso-10-e-promete-revolucionar-o-desenvolvimento-web" rel="noopener noreferrer"&gt;lançamento do Bun lá no Onigiri Hardcore&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são os compiladores?
&lt;/h2&gt;

&lt;p&gt;Compiladores são programas de computador que convertem código-fonte escrito em uma linguagem de programação em código-objeto escrito em uma linguagem de máquina ou seja, um exemplo para quem está familiarizado com Javascript, o Node é um compilador Javascript. Então, ele irá pegar seu código escrito em Javascript e simplesmente ler tudo aquilo e compilar, claro que para cada linguagem temos um compilador diferente, mas a questão aqui é vermos sobre o Bun e sua incrível velocidade referente aos demais no mundo do Javascript. Além de tudo, os compiladores são usados para aumentar a velocidade e a eficiência de execução de programas. Eles também podem ajudar a detectar e corrigir erros de código.&lt;/p&gt;

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

&lt;p&gt;Node.js é um runtime (compilador) JavaScript de código aberto que pode ser usado para executar código JavaScript fora do navegador. Ele é baseado no motor JavaScript V8 do Google Chrome. O Node.js é frequentemente usado para construir aplicações web, mas também pode ser usado para construir aplicações de desktop, aplicações móveis e aplicações de servidor.&lt;/p&gt;

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

&lt;p&gt;Deno, concorrente direto do Node - aí que surge o trocadilho do nome - é um runtime JavaScript e TypeScript moderno que é seguro por design. Ele é baseado no motor JavaScript V8 do Google Chrome, mas usa um mecanismo de segurança baseado em sandbox para proteger os aplicativos executados nele. O Deno é frequentemente usado para construir aplicações web seguras, mas também pode ser usado para construir aplicações de desktop, aplicações móveis e aplicações de servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  E afinal, o que é o Bun?
&lt;/h2&gt;

&lt;p&gt;Bun é um runtime JavaScript e TypeScript moderno que é rápido e eficiente. Ele é baseado no motor JavaScript V8 do Google Chrome, mas usa um mecanismo de compilação para melhorar o desempenho. O Bun é frequentemente usado para construir aplicações web rápidas e eficientes, mas também pode ser usado para construir aplicações de desktop, aplicações móveis e aplicações de servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  O resultado dos testes
&lt;/h2&gt;

&lt;p&gt;Fiz um teste simples, usando o mesmo arquivo para os três compiladores e o resultado foi surreal. Nesse teste, usei uma matemática simples, usando dez casas decimais e segui essa fórmula para que ele pudesse trazer de resultado: ((a + b) * (c + d)) / (e + f) + g - h;&lt;/p&gt;

&lt;p&gt;Claro que para as máquinas isso é mamão com açúcar, mas para nós, levaria mais do que um tempinho para solucionarmos isso, certo? Mas vamos lá.&lt;/p&gt;

&lt;p&gt;Pedi para ele me falar quanto tempo ele levou para executar, qual é o tempo em que ele terminou aquilo - sem parar o relógio - e quanto tempo (abstração) ele levou para fazer isso nesse intervalo ou seja: TdE - TdF = TdR (Tempo de Execução menos o Tempo de Finalização receberemos o Tempo de Resultado).&lt;/p&gt;

&lt;p&gt;O resultado do Node foi que ele começou em 17.3797 milisegundos, terminou o teste em 17.3852 milisegundos e o tempo que levou para resolver tudo isso foi de 0.0058 milisegundos. É um resultado bastante significativo.&lt;/p&gt;

&lt;p&gt;Já o Deno (irmão do meio) começou em 22 milisegundos, terminou em 22 milisegundos e o valor foi menor do que 0.0 milisegundos para retornar o resultado, como ele foi bem chato para nos trazer o valor completo, só tivemos esse valor por cima.&lt;/p&gt;

&lt;p&gt;E então que surge o irmão mais novo, o Flesha da família. O Bun, levou 10.888466 milisegundos para começar, 10.888736 milisegundos para finalizar e levou cerca de apenas 0.0002 milisegundos para resolver a matemática.&lt;/p&gt;

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

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

&lt;p&gt;Sim! Esse valor é muito, mas muito rápido do que os dois comparados. Em questão de velocidade, o Bun é o primeiro, seguido pelo Node e pelo Deno. O mais incrível de tudo isso é que o Bun está na versão 1.0.0, enquanto o Node está na versão 18.17.1 e o Deno na v.1.36.4.&lt;/p&gt;

&lt;p&gt;Eu fiquei alucinado quando vi isso. Claro que, em termos de velocidade, os três runtimes são muito rápidos. Mesmo o mais demorado, o Deno, gastou apenas 22 milissegundos para responder. Mas ver que o Bun é capaz de fazer isso em 10 milissegundos é simplesmente incrível.&lt;/p&gt;

&lt;p&gt;Claro que fizemos um teste simples, mas ele é suficiente para mostrar que o Bun é muito mais rápido que qualquer outro compilador. Em grande escala, como nos vários projetos que carregamos no Node, a diferença é ainda mais significativa. Um projeto que leva cerca de 10, 15 segundos para ser executado no Node pode ser executado em apenas 1 segundo no Bun.&lt;/p&gt;

&lt;p&gt;Em termos técnicos, avaliando os resultados dos testes e os recursos de cada runtime, pode-se concluir que o Bun é a melhor opção para aplicações web que exigem alta performance e eficiência, o Node.js é uma boa opção para aplicações web que não exigem alta performance e o Deno é uma boa opção para aplicações web seguras.&lt;/p&gt;

&lt;p&gt;Agora por trás das cortinas, eu não digo nada se eu mudar meus projetos para o Bun. A versão estável dele foi lançada ao público e é garantida como segura para uso em produção.&lt;/p&gt;

&lt;p&gt;E você? Vai mudar de compilador também ou vai esperar um pouco? Comenta comigo lá no Twitter!&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ContextAPI - Como criar, como usar e como alimentar para iniciantes</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:40:19 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/contextapi-como-criar-como-usar-e-como-alimentar-para-iniciantes-371a</link>
      <guid>https://dev.to/yagasaki7k/contextapi-como-criar-como-usar-e-como-alimentar-para-iniciantes-371a</guid>
      <description>&lt;p&gt;Neste artigo abordaremos um assunto bastante interessante no React chamado context, que disponibiliza uma maneira de passar os dados entre a árvore de componentes sem precisar passar props manualmente em cada nível.&lt;/p&gt;

&lt;p&gt;Imagine o seguinte cenário, você tem o nome de um usuário em um componente, só pra gente ter uma noção entre camadas, vamos&lt;br&gt;
chamá-los de A, B, C e D. Imagine que esse componente fez uma chamada de API no C, certo? Nós temos apenas o nome do usuário lá e&lt;br&gt;
não queremos ter que ficar repetindo essa chamada nos outros componentes, certo?&lt;/p&gt;
&lt;h2&gt;
  
  
  Ah, mas por que não? Ou por que não criamos no topo e vamos chamando até embaixo?
&lt;/h2&gt;

&lt;p&gt;Vamos ao primeiro cenário. Imagine que ao invés de você fazer uma requisição pela página, você faz quatro para apenas uma página,&lt;br&gt;
certo? Isso é tranquilo quando se trata de um usuário, mas já pensou se a nossa aplicação tem mil acessos diários? Isso seria&lt;br&gt;
basicamente quatro mil requisições diária e isso é muita coisa para o banco de dados, isso sem contar as atualizações de página.&lt;/p&gt;

&lt;p&gt;E por que não criamos a aplicação no topo e vamos chamando nas demais? Por um motivo quase que semelhante. Não tem necessidade de&lt;br&gt;
você chamar nas camadas A, B e D, se o usuário sequer passou por lá, imagine que você só entrou na primeira página e saiu, certo?&lt;br&gt;
E quando você vai ver, sem querer, você fez uma requisição na sub página que se quer o usuário entrou, é bem desgastante isso, não&lt;br&gt;
concorda? Ainda mais para quem vive de internet móveis.&lt;/p&gt;
&lt;h2&gt;
  
  
  Voltando ao Foco
&lt;/h2&gt;

&lt;p&gt;Para facilitar essa comunicação, seja de A para D e D para B, por exemplo, existe o Context API do React e aí que entramos no&lt;br&gt;
assunto. useContext, como funciona, de onde ele vem e como ele se alimenta. Em resumo, com o Context API podemos transitar esses&lt;br&gt;
dados através de componentes sem que ele sejam filhos diretos desse componente. &lt;/p&gt;

&lt;p&gt;E vamos com calma entendendo passo a passo dessa situação, porque até para mim foi muito complexo entender no começo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Primeiro Passo
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos importar e executar o método createContext&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&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;MyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inicialmente definimos ele como null, já que queremos ele vazio e não queremos definir um tipo para ele ainda.&lt;/p&gt;

&lt;p&gt;DICA: O retorno do createContext é um componente, por isso é legal salvar numa variável em PascalCase, as famosas &lt;code&gt;{  }&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Segundo Passo
&lt;/h2&gt;

&lt;p&gt;Já que criamos ele vazio, como iremos adicionar dados a esse novo contexto que criamos?&lt;/p&gt;

&lt;p&gt;Dentro do Provider definimos que esse contexto fornecerá pros componentes descendentes, deixando isso na propriedade value.&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;const&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&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;nameUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yagasaki&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="c1"&gt;// Outro exemplo&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yagasaki&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="c1"&gt;// Mais um exemplo&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yagasaki&lt;/span&gt;&lt;span class="dl"&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;&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameUser&lt;/span&gt;&lt;span class="si"&gt;}&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="nc"&gt;ComponentA&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="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Está permitido colocar qualquer tipo de dado dentro contexto, já que ele aceita qualquer tipo, isso inclui até mesmo funções.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terceiro Passo
&lt;/h2&gt;

&lt;p&gt;Agora que sabemos como criar um contexto, como adicionar dados a ele, como faremos para usar esse contexto como a gente bem entender?&lt;/p&gt;

&lt;p&gt;Infelizmente não iremos usar esses dados fora do famoso pai-filho, ou seja, não adianta um componente "dinossauro" tentar acessar&lt;br&gt;
informações do componente "peixe" já que eles não possuem nenhum parentes, é diferente do famoso "dinossauro" para "galinha", deu&lt;br&gt;
para entender a analogia? Componentes que estão fora da árvore deles não possuem acesso, simples.&lt;/p&gt;

&lt;p&gt;Mas como vamos acessar esses dados?&lt;/p&gt;

&lt;p&gt;Primeiramente precisamos importa uma ou duas coisas, sendo: O Hook &lt;code&gt;useContext&lt;/code&gt; do React e o Hook que a gente criou em outro&lt;br&gt;
arquivo. Abaixo está um exemplo de como iremos usar o useContext a nosso favor.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./MyContext.js&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ComponentC&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;userContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyContext&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;&lt;/span&gt;&lt;span class="nt"&gt;div&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;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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;div&lt;/span&gt;&lt;span class="p"&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;p&gt;O seu retorno será exatamente a mesma informação que inserimos ali em cima na propriedade &lt;code&gt;value&lt;/code&gt;. Assim podemos obter o dado&lt;br&gt;
diretamente do provider sem NENHUM componente intermediário! Economizando um esforço que seria praticamente enorme para transitar esse dado abaixo por todos os&lt;br&gt;
componentes intermédios! Simplesmente DEMAIS!&lt;/p&gt;

&lt;p&gt;DICA: Note que obtemos o valor do nome como uma propriedade de userContext, isso porque no exemplo, criamos como um objeto na propriedade value, e esse mesmo objeto foi retornado da execução do useContext. Se for outro tipo de dado, o retorno será correspondente!&lt;/p&gt;
&lt;h2&gt;
  
  
  Modificando o valor
&lt;/h2&gt;

&lt;p&gt;Beleza, já criamos o provider, que vem do inglês de provedor, aquele que provê algo, providencia. Conseguimos inserir algo nele e acessamos ele através de um componente distante, e agora? Agora vamos aprender a modificar esse valor, manipular essa informação. Lembra que eu mencionei acima que ele aceita QUALQUER tipo de dado, inclusive funções? Então, e se por exemplo a gente usasse um &lt;code&gt;useState&lt;/code&gt; nele?&lt;/p&gt;

&lt;p&gt;Você deve se perguntar porque iriamos querer fazer isso, certo? Imagine que você está numa página de edição de usuário e quer que os dados desse usuário já estejam preenchidos quando o usuário entrar na página, como que a gente faz?&lt;/p&gt;

&lt;p&gt;A ideia é o seguinte, vamos isolar a variável que a gente está passando para a propriedade &lt;code&gt;value&lt;/code&gt; para facilitar a leitura e deixar um pouco mais organizado, okay? Nada de muito novo que fizemos aqui, é claro que estamos levando em consideração que ele é um objeto. Iremos apenas adicionar o valor do state e seu dispatch na variável providerValue e assim, inserimos no provider.&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;const&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&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="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;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yagasaki&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;providerValue&lt;/span&gt; &lt;span class="o"&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;setName&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;&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;providerValue&lt;/span&gt;&lt;span class="si"&gt;}&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="nc"&gt;ComponentA&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="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&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;p&gt;Ficou confuso? O que fizemos a mais foi apenas adicionar o nome das duas variáveis que usamos no &lt;code&gt;useState&lt;/code&gt; para assim que chamarmos de volta podermos manipular ele também dentro do componente, caso ao contrário, só precisariamos enviar o &lt;code&gt;name&lt;/code&gt; e ele ficaria somente leitura, tendo que ser alterado apenas na página &lt;code&gt;Parent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma podemos alterar o valor da variável &lt;code&gt;name&lt;/code&gt; a partir de qualquer componente que quisermos, como eu mencionei anteriormente, isso acaba sendo bem útil quando precisamos atualizar o valor de uma variável em ambos os lados, bacana né?&lt;/p&gt;

&lt;p&gt;Olha como ficou o componente filho quando utilizamos o &lt;code&gt;useState&lt;/code&gt; para passar a informaçã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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./MyContext.js&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;ComponentA&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyContext&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;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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="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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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="c1"&gt;// Alguma verificação, se necessário&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setName&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&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;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Usuário: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&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;label&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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&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="nx"&gt;ComponentA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Só tome cuidado com loops infinitos, em casos de formulário, use o &lt;code&gt;form onSubmit={(e) =&amp;gt; e.preventDefault()}&lt;/code&gt;, assim, evitará de atualizar a página quando &lt;br&gt;
o usuário clicar em enviar, por exemplo, e claro, caso esteja usando um form.&lt;/p&gt;

&lt;p&gt;Fico muito agradecido que você tenha chegado até aqui, levou um pouco de tempo para construir esse artigo, já que tentei deixar o mais direto e bem explicado possível para você entender de fato como funciona o Contexto, já que eu levei muito tempo para realmente entender como ele funciona.&lt;/p&gt;

&lt;p&gt;Feedback no meu Twitter/X (&lt;a class="mentioned-user" href="https://dev.to/yagasaki7k"&gt;@yagasaki7k&lt;/a&gt;) são sempre bem vindos e espero que você que se dedicou a ler e entender esse artigo tenha aprendido algo novo.&lt;/p&gt;

&lt;p&gt;Muito obrigado!&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guia Detalhado - Configuração do Rocketchat no Azure com Funcionalidades Avançadas</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:39:36 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/guia-detalhado-configuracao-do-rocketchat-no-azure-com-funcionalidades-avancadas-1c5</link>
      <guid>https://dev.to/yagasaki7k/guia-detalhado-configuracao-do-rocketchat-no-azure-com-funcionalidades-avancadas-1c5</guid>
      <description>&lt;p&gt;Este guia aborda o processo detalhado de instalação e configuração do Rocketchat em uma máquina virtual Ubuntu na plataforma Microsoft Azure - pode funcionar em outras plataformas, mas não foi testado como Google Cloud Plataform, Heroku e outros - com foco em habilitar funcionalidades avançadas como integração com um frame externo e configurações de omnichannel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação da Máquina Virtual no Azure
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o portal Azure: &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;https://portal.azure.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crie uma nova máquina virtual Ubuntu&lt;/li&gt;
&lt;li&gt;Utilize uma senha para acessar a máquina via SSH&lt;/li&gt;
&lt;li&gt;Configure o DNS padrão para a máquina virtual&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Instalação e Configuração do Rocketchat
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Instale o Rocketchat através do seguinte comando:
&lt;/li&gt;
&lt;/ol&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;snap &lt;span class="nb"&gt;install &lt;/span&gt;rocketchat-server &lt;span class="nt"&gt;--channel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5.x/stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Configure o portal com o endereço da sua máquina virtual:
&lt;/li&gt;
&lt;/ol&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;snap &lt;span class="nb"&gt;set &lt;/span&gt;rocketchat-server &lt;span class="nv"&gt;siteurl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://SEU_ENDERECO.azure.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Reinicie o serviço do Rocketchat:
&lt;/li&gt;
&lt;/ol&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;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; snap.rocketchat-server.rocketchat-caddy
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap restart rocketchat-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Acesse o portal configurado e realize as configurações iniciais.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuração do Omnichannel
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Acesse as configurações do Rocketchat no painel de administração.&lt;/li&gt;
&lt;li&gt;Em "Admin / Config / Omnichannel", habilite o "External Frame" e configure a URL do frame externo.&lt;/li&gt;
&lt;li&gt;Configure as opções de "Livechat":

&lt;ul&gt;
&lt;li&gt;Título do Livechat: Defina um nome descritivo.&lt;/li&gt;
&lt;li&gt;Roteamento: Atribua novas conversas para um agente bot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Em "Admin / Config / Accounts", desative a autenticação de dois fatores (TOTP).&lt;/li&gt;
&lt;li&gt;Em "Admin / Permissões", desabilite o fechamento de salas omnichannel para os respectivos cargos.&lt;/li&gt;
&lt;li&gt;Opcional: Em "Users", adicione um usuário bot com email verificado e defina o cargo dele.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Integração com Frame Externo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Em "Omnichannel / Webhooks", configure a URL do webhook para receber informações do frame externo.&lt;/li&gt;
&lt;li&gt;Defina um token secreto para o webhook.&lt;/li&gt;
&lt;li&gt;Selecione todas as opções para enviar solicitações ao webhook.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuração de Agentes e Departamentos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Em "Omnichannel / Agents", adicione um usuário local (admin) e o usuário bot.&lt;/li&gt;
&lt;li&gt;Defina o status do bot como disponível.&lt;/li&gt;
&lt;li&gt;Em "Omnichannel / Managers", adicione um usuário local (admin).&lt;/li&gt;
&lt;li&gt;Em "Omnichannel / Departments", crie os departamentos desejados (por exemplo: HUMAN_DEPARTMENT e BOT_DEPARTMENT).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configurações Adicionais
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Personalize o CSS customizado conforme necessário, por exemplo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.rcx-sidebar-footer&lt;/span&gt; &lt;span class="nt"&gt;footer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6rem&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Este guia abordou passo a passo a instalação e configuração do Rocketchat no Azure, mas tem possibilidade de funcionar em outros&lt;br&gt;
ambientes como Google Cloud Plataform, Heroku e outros. Assim habilitando recursos avançados como integração com um frame externo e configurações de omnichannel. Certifique-se de verificar a documentação oficial do Rocketchat para obter informações&lt;br&gt;
atualizadas e detalhadas sobre cada configuração, lembrando que estamos usando a versão 5.x que evita certas limitações de recursos como o funcionamento do Frame Externo, por exemplo.&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guia de Comandos Rocketchat para Iniciantes</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:38:39 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/guia-de-comandos-rocketchat-para-iniciantes-2ao4</link>
      <guid>https://dev.to/yagasaki7k/guia-de-comandos-rocketchat-para-iniciantes-2ao4</guid>
      <description>&lt;p&gt;Ao contrário da publicação anterior, hehe, essa é uma publicação original e é de minha autorial.&lt;/p&gt;

&lt;p&gt;O Rocketchat é uma plataforma de comunicação poderosa que oferece uma variedade de recursos e funcionalidades para facilitar a comunicação e colaboração entre equipes. Se você está começando ou precisa de ajuda para se orientar nas funcionalidades, este guia detalhado irá ajudá-lo a dominar os comandos essenciais. &lt;/p&gt;

&lt;p&gt;Lembrando que todos eles são comandos via curl, que podem ser utilizados através do terminal, Postman ou Insomnia. Se você deseja usar através do Node.js, PHP ou qualquer outro tipo de maneira fora desse convencional, consulte a documentação oficial.&lt;/p&gt;

&lt;p&gt;Vamos explorar além do básico e ver como tirar o máximo proveito do Rocketchat via API, vale lembrar também que esses são comandos que achei essenciais e já cheguei a utilizar no dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazendo Login via API
&lt;/h2&gt;

&lt;p&gt;Se você precisa fazer login no Rocketchat via API, o seguinte comando pode ser usado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000/api/v1/login &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"user=SEU_USUÁRIO&amp;amp;password=SUA_SENHA"&lt;/span&gt;
Substitua SEU_USUÁRIO pelo seu nome de usuário e SUA_SENHA pela sua senha.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando um Visitante via API
&lt;/h2&gt;

&lt;p&gt;Crie um visitante usando a API para interagir com os usuários. Execute o seguinte comando curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-type:application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://localhost:3000/api/v1/livechat/visitor &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "visitor": {
    "name": "Nome do Visitante",
    "email": "email@exemplo.com",
    "department": "DEPARTAMENTO",
    "phone": "55 344433322",
    "token": "TOKEN_DO_VISITANTE",
    "customFields": []
  }
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certifique-se de substituir as informações corretas, como nome, email, departamento e token do visitante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando uma Sala para o Visitante
&lt;/h2&gt;

&lt;p&gt;Crie uma sala para o visitante usando o comando curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Auth-Token: SEU_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-User-Id: SEU_ID_DO_USUÁRIO"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"http://localhost:3000/api/v1/livechat/room?token=TOKEN_DO_VISITANTE"&lt;/span&gt;
Substitua SEU_TOKEN, SEU_ID_DO_USUÁRIO e TOKEN_DO_VISITANTE pelas informações corretas.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enviando Mensagens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como Agente
&lt;/h3&gt;

&lt;p&gt;Se você é um agente e deseja enviar mensagens, use o seguinte comando curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Auth-Token: SEU_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-User-Id: SEU_ID_DO_USUÁRIO"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-type:application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     http://localhost:3000/api/v1/chat.sendMessage &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message": { "rid": "ID_DA_SALA", "msg": "Esta é uma mensagem de teste!" }}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua SEU_TOKEN, SEU_ID_DO_USUÁRIO e ID_DA_SALA pelas informações corretas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como Usuário (Visitante)
&lt;/h3&gt;

&lt;p&gt;Para enviar mensagens como um usuário (visitante), use este comando curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-type:application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://localhost:3000/api/v1/livechat/message &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"token": "TOKEN_DO_VISITANTE", "rid": "ID_DA_SALA", "msg": "Mensagem do visitante via API"}'&lt;/span&gt;
Substitua TOKEN_DO_VISITANTE e ID_DA_SALA pelas informações corretas.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transferindo a Conversa para um Agente
&lt;/h2&gt;

&lt;p&gt;Transfira a conversa para um agente específico usando o seguinte comando curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-type:application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer SEU_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     http://localhost:3000/api/v1/livechat/room.transfer &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
         "roomId": "ID_DA_SALA",
         "token": "TOKEN_DO_VISITANTE",
         "userId": "ID_DO_AGENTE"
     }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua SEU_TOKEN, ID_DA_SALA, TOKEN_DO_VISITANTE e ID_DO_AGENTE pelas informações corretas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explorando Mais Recursos
&lt;/h2&gt;

&lt;p&gt;Este guia abordou alguns comandos essenciais do Rocketchat via API, mas esta plataforma oferece uma ampla gama de recursos e possibilidades. Agora que você tem uma base sólida, sinta-se à vontade para explorar outras funcionalidades, como transferência entre departamentos, notificações e muito mais. Lembre-se de consultar a &lt;a href="https://developer.rocket.chat/" rel="noopener noreferrer"&gt;documentação oficial do Rocketchat&lt;/a&gt; para obter detalhes completos sobre todas as funcionalidades disponíveis. &lt;/p&gt;

&lt;p&gt;Vale lembrar que o Rocketchat é uma plataforma open source e a comunidade anda ajudando em peso!&lt;/p&gt;

&lt;p&gt;Com esses comandos em mãos, você estará melhor preparado para dominar o Rocketchat e aproveitar ao máximo essa plataforma poderosa de comunicação e colaboração, isso inclui fazer interações com bot e clientes através do Whatsapp. Espero que essas dicas sejam úteis, já que pra mim será uma mão na roda para projetos futuros.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nunca mexeu e quer &lt;a href="https://yagasaki.dev/blog/guia-de-comandos-rocketchat-para-iniciantes" rel="noopener noreferrer"&gt;configurar pela primeira vez&lt;/a&gt;? Me segue!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Integrando seu chat com o Rocketchat Omnichannel</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:36:19 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/integrando-seu-chat-com-o-rocketchat-omnichannel-79h</link>
      <guid>https://dev.to/yagasaki7k/integrando-seu-chat-com-o-rocketchat-omnichannel-79h</guid>
      <description>&lt;p&gt;Algumas pessoas que me conhece sabe que eu já trabalhei e até os dias de hoje trabalho com Rocketchat, é uma ferramenta fundamental para ter uma ampla comunicação com o cliente, se tratando de ecommerce, ele é simplesmente fantástico. Ele é um app onde poderíamos centralizar contatos vindos de diferentes plataformas de comunicação em um único meio de atendimento. Existem funcionalidades já prontas disponíveis na loja da plataforma, permitindo integrar com o WhatsApp, Telegram ou Twitter. Além disso, é disponibilizado na área administrativa um script nativo personalizado capaz de adicionar ao seu site um frame externo do próprio Rocket para conversação.&lt;/p&gt;

&lt;p&gt;Agora, vamos entender melhor como realizar essa integração de forma manual, entendendo os usos das APIs e Webhooks.&lt;/p&gt;

&lt;p&gt;Vale lembrar que esse artigo não é de minha autoria, mas do &lt;a href="https://blog.4linux.com.br/integrando-seu-chat-com-o-rocket-omnichannel/" rel="noopener noreferrer"&gt;4Linux Blog&lt;/a&gt;, estou apenas compartilhando para ser um atalho até mesmo pra mim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo o caso de uso
&lt;/h2&gt;

&lt;p&gt;Imagine que na sua empresa seja disponibilizado um chat (seja via web e/ou aplicativo) para os clientes e você deseja integrá-lo&lt;br&gt;
ao Rocket para centralizar os atendimentos em uma única plataforma, que é especializada nesse tipo de situação. Ou até mesmo, você ainda não tem esse chat, mas deseja criá-lo e quer ter o menor custo de implementação.&lt;/p&gt;

&lt;p&gt;Tudo isso é simples! Com o Rocket você não vai precisar se preocupar com um servidor complexo, armazenamento de dados, atendimento etc. Você pode apenas criar o frontend para o cliente (ou utilizar o widget fornecido) e um backend simples capaz de realizar as chamadas à API do Rocket e receber chamadas de resposta via Webhook.&lt;/p&gt;

&lt;p&gt;Para se comunicar com o Rocket, temos dois meios disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Via API: Criação de usuários (visitantes), criação de salas, envio de mensagens;&lt;/li&gt;
&lt;li&gt;Via Webhook: Rockchat enviando informações sobre as salas abertas – Respostas dos atendentes, encerramento de salas, transferências;
Pode parecer complicado em um primeiro momento, mas não é! Vamos entender melhor o que será necessário.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Preparando o ambiente
&lt;/h2&gt;

&lt;p&gt;Como o foco aqui é como realizar a integração, não vamos ficar perdendo tempo com instalação do Rocket. Vamos utilizar o Docker&lt;br&gt;
para auxiliar com isso.&lt;/p&gt;

&lt;p&gt;Criei um docker-compose de exemplo para facilitar a infraestrutura. Você pode visualizar ele aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;version: &lt;span class="s2"&gt;"3.0"&lt;/span&gt;

services:
  rocketchat:
    image: rocketchat/rocket.chat:3.16.2
    &lt;span class="nb"&gt;command&lt;/span&gt;: &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      bash &lt;span class="nt"&gt;-c&lt;/span&gt;
        &lt;span class="s2"&gt;"for i in &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 30&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;; do
          node main.js &amp;amp;&amp;amp;
          s=&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;? &amp;amp;&amp;amp; break || s=&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;?;
          echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Tried &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;i times. Waiting 5 secs...&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;;
          sleep 5;
        done; (exit &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;s)"&lt;/span&gt;
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000
      - &lt;span class="nv"&gt;ROOT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3000
      - &lt;span class="nv"&gt;MONGO_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://mongo:27017/rocketchat
      - &lt;span class="nv"&gt;MONGO_OPLOG_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://mongo:27017/local
      - &lt;span class="nv"&gt;ADMIN_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rocket
      - &lt;span class="nv"&gt;ADMIN_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PZxs7wsHWEJLP98z
      - &lt;span class="nv"&gt;ADMIN_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin@rocketchat.local
    depends_on:
      - mongo
    ports:
      - 3000:3000

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
      - ./data/db:/data/db
      - ./data/dump:/dump
    &lt;span class="nb"&gt;command&lt;/span&gt;: mongod &lt;span class="nt"&gt;--smallfiles&lt;/span&gt; &lt;span class="nt"&gt;--oplogSize&lt;/span&gt; 128 &lt;span class="nt"&gt;--replSet&lt;/span&gt; rs0 &lt;span class="nt"&gt;--storageEngine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mmapv1

  mongo-init-replica:
    image: mongo:4.0
    &lt;span class="nb"&gt;command&lt;/span&gt;: &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      bash &lt;span class="nt"&gt;-c&lt;/span&gt;
        &lt;span class="s2"&gt;"for i in &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 30&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;; do
          mongo mongo/rocketchat --eval &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp;
          s=&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;? &amp;amp;&amp;amp; break || s=&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;?;
          echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Tried &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;i times. Waiting 5 secs...&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;;
          sleep 5;
        done; (exit &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;s)"&lt;/span&gt;
    depends_on:
      - mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele irá iniciar o ambiente com tudo que precisamos, e já irá criar um usuário administrador (Login rocket e senha&lt;br&gt;
PZxs7wsHWEJLP98z). Basta fazer login e realizar a configuração inicial.&lt;/p&gt;

&lt;p&gt;Com o Rocket rodando, precisamos realizar uma simples configuração. Por padrão o Omnichannel não vem habilitado, mas é simples ajustar isso!&lt;/p&gt;

&lt;p&gt;Basta acessar a Administração, procurar pelo menu Omnichannel e marcar a opção Omnichannel habilitado. Não se esqueça de salvar.&lt;/p&gt;

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

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

&lt;p&gt;A configuração é simplesmente isso! Agora temos o Rocket prontinho para receber nossa integração.&lt;/p&gt;
&lt;h2&gt;
  
  
  Acessando a documentação
&lt;/h2&gt;

&lt;p&gt;Nessa página temos detalhes sobre os endpoints disponibilizados, tanto para o Rocket como um todo, quanto especificamente para o Omnichannel. Nesse caso, como iremos trabalhar integrando com o livechat, podemos acessar sua documentação específica.&lt;/p&gt;

&lt;p&gt;Há alguns termos que aparecem bastante quando acessamos a documentação, então vamos entendê-los melhor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; – Agentes são os atendentes dos chats. Eles acessaram o Rocket pela sua interface e recebem os chats vindos via Omnichannel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visitor&lt;/strong&gt; – Visitantes são os seus clientes que entraram via Omnichannel. Para que haja o atendimento dentro do Rocket é necessário que esse cliente seja criado como um visitante. Visitantes existem apenas no Omnichannel, não são usuários do Rocket e não podem acessá-lo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom field&lt;/strong&gt; – Campos personalizados que podem ser adicionados ao registro dos visitantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contact&lt;/strong&gt; – Contato é basicamente um visitante. Apesar de existir na documentação APIs diferentes referenciando individualmente cada um, eles são o mesmo registro dentro do banco. Há apenas diferença nas suas APIs, tendo mais campos obrigatórios para manipulação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Room&lt;/strong&gt; – Sala criada para realizar a conversa entre o agente e o cliente. A sala deve ser encerrada ao final do atendimento e cada novo irá gerar uma nova sala, mesmo que seja o mesmo contato.&lt;/p&gt;

&lt;p&gt;Tendo entendido isso, vamos ter um último passo antes de analisar as APIs que precisamos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Autenticando no Rocket
&lt;/h2&gt;

&lt;p&gt;Nenhuma das APIs que vamos utilizar necessita de autenticação, mas é bom entender como conseguir esses dados antes de continuarmos. E isso é bem simples: estando logado com um usuário administrador, basta gerar um token.&lt;/p&gt;

&lt;p&gt;Para gerar o token, basta acessar Minha conta, e clicar em Token de acesso pessoal. Na tela aberta, você deve digitar um nome para&lt;br&gt;
identificar esse token e opcionalmente selecionar Ignorar Autenticação de dois fatores (só faz sentido caso deseje utilizar 2FA nessa conta) e clicar em Adicionar.&lt;/p&gt;

&lt;p&gt;Será aberto uma tela com os dados do token. Guarde bem esses dados! Eles não serão exibidos novamente. Caso perca, será necessário&lt;br&gt;
gerar um novo token.&lt;/p&gt;

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

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

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

&lt;p&gt;&lt;strong&gt;Observação:&lt;/strong&gt; Poderia ser qualquer usuário, não necessariamente um administrador, mas nesse caso precisaria ajustar as permissões desse usuário manualmente para permitir o uso da API e ter os acessos necessários ao livechat. Com o administrador, fica mais fácil, mas em um ambiente produtivo seria mais interessante ter um usuário específico com apenas os acessos necessários.&lt;/p&gt;

&lt;p&gt;Agora que já temos tudo preparado, podemos começar a analisar as APIs.&lt;/p&gt;

&lt;p&gt;Começando com as APIs: Criando um visitante&lt;/p&gt;

&lt;p&gt;A primeira coisa a se fazer para integrar o seu chat com o Rocket é criar o visitante. Esse passo será constante, visto que sempre que um novo usuário for transferido, ele precisará ser criado ou atualizado. A mesma API realiza as duas ações, criar e atualizar o visitante. &lt;/p&gt;

&lt;p&gt;Para essa ação, temos basicamente um campo obrigatório para criar o visitante. Mas vamos entender melhor cada um:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;token&lt;/strong&gt;* – Um texto de identificação desse visitante. Essa informação deve ser gerada pelo seu sistema para poder encontrar o visitante dentro do Rocket. Ele é o único campo obrigatório e será utilizado como chave para criação e atualização dos dados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;name&lt;/strong&gt; – O nome do visitante. Será exibido como nome das salas e em cada mensagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;email&lt;/strong&gt; – O e-mail do visitante. Além de ser exibido para os agentes que atendem esse contato, pode ser utilizado para envio da transcrição da conversa automaticamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;department&lt;/strong&gt; – Departamento do visitante. Esse campo é muito importante pois ele será decisivo ao tentar criar uma sala para o contato. Caso o contato tenha um departamento e não tenha sido especificado um agente específico, será criado a sala apenas com o departamento especificado.&lt;br&gt;
phone – Telefone do visitante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;username&lt;/strong&gt; – Usuário do visitante. Será utilizado para identificação interna e buscas. Se não for informado na criação, será gerado um valor aleatório. Esse valor não poderá ser alterado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;customFields&lt;/strong&gt; – Campos personalizados do contato. Esses campos precisam ter sido previamente criados via API ou interface. Nesse momento eles terão apenas seus valores definidos. Esse campo é uma lista de objetos contendo a seguite extrutura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;key&lt;/strong&gt; – O nome do campo definido quando foi criado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;value&lt;/strong&gt; – O valor desse campo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;overwrite&lt;/strong&gt; – Se deseja sobrescrever o valor ou não. Se verdadeiro sempre irá definir o valor. Se falso, só irá definidor o valor caso ainda não tenha nenhuma informação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que entendemos os campos, teríamos o corpo da requisição seguinte a estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"visitor"&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;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"visitante-identificador"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Meu visistante"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"visitante@meusite.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+55 11 98765-4321"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"meuvisitante-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"customFields"&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;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rocket.Chat street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"overwrite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O endereço dessa API seria: &lt;strong&gt;/api/v1/livechat/visitor&lt;/strong&gt;. Utilizando o método &lt;strong&gt;POST&lt;/strong&gt;, você poderá criar e atualizar visitantes por esse endereço.&lt;/p&gt;

&lt;p&gt;Além do momento da criação, o seu uso é interessante para alternar entre os departamentos e atualizar os campos customizados. Com isso, já temos o visitante criado e pronto para falar com um atendente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avançado com as APIs: Criando salas e enviando mensagens
&lt;/h2&gt;

&lt;p&gt;A criação de salas é um processo simples. Ela utiliza o método &lt;strong&gt;GET&lt;/strong&gt; e endereço &lt;strong&gt;/api/v1/livechat/room&lt;/strong&gt;. Ela é utilizada tanto para criar salas como resgatar seus dados.&lt;/p&gt;

&lt;p&gt;Todos seus parâmetros são informados via query param na url. Vamos entender melhor eles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;token&lt;/strong&gt;* – O token do visitante que irá utilizar essa sala. Esse campo é &lt;strong&gt;obrigatório&lt;/strong&gt; em qualquer requisição a esse endpoint.&lt;br&gt;
&lt;strong&gt;rid&lt;/strong&gt; – O id da sala. Quando você está criando uma sala esse valor não deve ser informado, afinal, sequer existe. Porém para leitura, deverá ser informado ou uma nova sala será criada.&lt;br&gt;
&lt;strong&gt;agentId&lt;/strong&gt; – O id do agente que irá atender essa sala. Se esse valor não for informado, a sala será criada para um atendente aleatório. Caso o visitante tenha um departamento definido, será atribuído um atendente desse departamento.&lt;br&gt;
Um ponto importante na criação de salas é a disponibilidade dos agentes: existe a opção de aceitar que as salas sejam criadas mesmo que o agente não esteja online. Mas caso essa opção não seja marcada, a criação de sala apenas funciona se o agente estiver online no Rocket e no Omnichannel.&lt;/p&gt;

&lt;p&gt;Agora que já termos a sala criada, podemos enviar mensagens! Também é um processo simples. Esse endpoint utiliza o método &lt;strong&gt;POST&lt;/strong&gt; e o endereço &lt;strong&gt;/api/v1/livechat/message&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O seus poucos parâmetros possíveis são passados via corpo da requisição. Vamos entender melhor eles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;token&lt;/strong&gt;* – O token do visitante que está enviando a mensagem. Precisa ser do mesmo visitante que criou a sala. Esse campo é obrigatório.&lt;br&gt;
&lt;strong&gt;rid&lt;/strong&gt;* – O id da sala onde a mensagem será enviada. Ela precisa estar com o status aberta. Esse campo é obrigatório.&lt;br&gt;
&lt;strong&gt;msg&lt;/strong&gt;* – O texto da mensagem a ser enviada. Esse campo não pode ultrapassar o limite definido nas configurações do Rocket. Ele é obrigatório.&lt;br&gt;
&lt;strong&gt;_id&lt;/strong&gt; – O id da mensagem a ser criada. Caso não seja informado, um id será criado.&lt;br&gt;
&lt;strong&gt;agent&lt;/strong&gt; – Na documentação informa que esse campo deve ser o agente da sala. Mas olhando o código do Rocket ele não faz sentido e nunca será usada. Podemos ignora-lo.&lt;/p&gt;

&lt;p&gt;Teríamos o corpo da requisição seguindo a estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"visitante-identificador"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sala-id-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bom dia!"&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;Com isso, já podemos criar um visitante, uma sala e enviar mensagens. Agora o próximo passo é receber o retorno do Rocket com as mensagens enviadas pelos agentes e os eventos que podem ocorrer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Webhooks: Recebendo retorno do Rocket
&lt;/h2&gt;

&lt;p&gt;Como havia dito, para receber o retorno do Rocket sobre os eventos ocorridos na sala, a melhor forma é via Webhook. Você até conseguiria fazer isso via API (pode visualizar melhor isso na documentação). Porém, via API você teria que efetuar constantes requisições para receber atualizações e tratar cada item da resposta individualmente. Não há possibilidade de filtros por apenas dados não vistos ou algo parecido, no máximo por eventos ocorridos após um timestamp informado. Resumindo, é mais complexo utilizar API e menos prático.&lt;/p&gt;

&lt;p&gt;Para utilizar Webhooks é simples! Para configurá-lo, basta acessar o menu Omnichannel e clicar em Webhooks. Na tela aberta, você deve digitar o endereço para onde essas requisições serão disparadas e selecionar quais eventos deverão disparar essa ação. Opcionalmente pode informar um token que será enviado no cabeçalho das requisições para validar a autenticidade. Clique em Salvar para aplicar as mudanças.&lt;/p&gt;

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

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

&lt;p&gt;Os eventos possíveis são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chat Start&lt;/strong&gt; – Sala criada.&lt;br&gt;
&lt;strong&gt;Chat Close&lt;/strong&gt; – Sala encerrada.&lt;br&gt;
&lt;strong&gt;Agent Messages&lt;/strong&gt; – Mensagem do atendente.&lt;br&gt;
&lt;strong&gt;Chat Taken&lt;/strong&gt; – Agente recebeu a sala.&lt;br&gt;
&lt;strong&gt;Chat Queued&lt;/strong&gt; – Sala entrou na fila para encontrar agente (Há possibilidade de uso de serviços externos para sorteio de agente, por isso esse evento pode fazer sentido).&lt;br&gt;
&lt;strong&gt;Forwarding&lt;/strong&gt; – Sala encaminhada para outra agente/departamento.&lt;br&gt;
&lt;strong&gt;Offline Messages&lt;/strong&gt; – Dependendo se tiver a opção de mensagens offline habilitada e utilizar o widget fornecido, ou utilizar a API, esse evento pode ocorrer. Basicamente o visitante poderia informar o seu nome, e-mail e uma mensagem quando não tiver agentes online.&lt;br&gt;
&lt;strong&gt;Visitor Messages&lt;/strong&gt; – Mensagem do visitante.&lt;br&gt;
Para cada evento, é realizada uma requisição POST para o endereço informado. O corpo da requisição varia em cada evento, mas é identificado o tipo do evento entre os campos.&lt;/p&gt;

&lt;p&gt;No mínimo, será necessário configurar os eventos de sala fechada e mensagem do agente, pois assim será possível saber quando ocorrem respostas e quando for encerrado. Os demais eventos podem não ser necessários.&lt;/p&gt;




&lt;p&gt;E por enquanto é isso. Entendeu tudo? Se ainda estiver com dúvida, faço questão de poder te ajudar lá no Twitter através do&lt;br&gt;
&lt;a href="https://twitter.com/Yagasaki7K" rel="noopener noreferrer"&gt;@Yagasaki7K&lt;/a&gt;. Mas lembrando, existem suporte através da própria documentação - que não é lá complexa - existe comunidades dispostas&lt;br&gt;
a te ajudar e foruns a rodo. Então, pesquise, estude e se esforce bem. Até a próxima!&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Frequently Asked Questions</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:35:11 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/frequently-asked-questions-19g8</link>
      <guid>https://dev.to/yagasaki7k/frequently-asked-questions-19g8</guid>
      <description>&lt;p&gt;Eu vi recentemente que muitas pessoas me procuram com as mesmas perguntas, como faço para conseguir um emprego, pode me ajudar &lt;br&gt;
com tal projeto, porque você é desenvolvedor de Javascript, resolvi então separar essas perguntas e responder todos que me veio a mente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como faço para conseguir um emprego?
&lt;/h2&gt;

&lt;p&gt;Você é um desenvolvedor júnior? Possuí experiência, senão, leia sobre &lt;a href="https://yagasaki.dev/blog/como-conseguir-experiencia-sendo-junior-iniciante" rel="noopener noreferrer"&gt;Como conseguir experiência sendo Júnior/Iniciante&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Eu entendi, preciso de experiência, mas acredito que meu Github não é &lt;br&gt;
bonito, pode dar uma olhada? Recomendo que você veja de como eu estive &lt;br&gt;
&lt;a href="https://yagasaki.dev/blog/montando-um-perfil-interessante-e-exemplar-no-github" rel="noopener noreferrer"&gt;Montando um perfil interessante e exemplar no GitHub&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Se nenhuma dessas ideias de deu uma ajuda sobre o que você precisa, peça ajuda na &lt;a href="https://discord.gg/jhSepmE7nN" rel="noopener noreferrer"&gt;Comunidade de Desenvolvedores da Kalify Inc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nenhuma pergunta é idiota.&lt;/p&gt;

&lt;h2&gt;
  
  
  Você pode me ajudar com XYZ?
&lt;/h2&gt;

&lt;p&gt;Não, eu recebo muitos pedidos e simplesmente não tenho tempo para ajudar a todos, infelizmente, a maioria das coisas nem são &lt;br&gt;
problemas e a a &lt;a href="https://discord.gg/jhSepmE7nN" rel="noopener noreferrer"&gt;Comunidade de Desenvolvedores da Kalify Inc&lt;/a&gt; poderá ajudá-lo, a menos que você &lt;br&gt;
tenha algo incompleto - eu tento responder cada menção que recebo no Twitter e, às vezes, dependendo do que for, responderei &lt;br&gt;
oferecendo assistência, mas isso é raro e depende muito de qual é o problema ou a informação que está sendo encaminhada para mim. &lt;br&gt;
Recomendo tentar entrar em contato comigo usando a comunidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que você não usa outra linguagem além do Javascript?
&lt;/h2&gt;

&lt;p&gt;Javascript é meu espaço seguro para mim, estou muito confortável com ele e posso escrever quase tudo que não envolva nada de &lt;br&gt;
especial sem ter que verificar nenhuma documentação mais complicada.&lt;/p&gt;

&lt;p&gt;Eu poderia usar PHP, Python ou qualquer outra coisa que possa existir e eu realmente uso esses idiomas às vezes - quase que &lt;br&gt;
raramente, mas acabo pesquisando cada passo simples no Google porque simplesmente não sei o que estou fazendo, é como se você &lt;br&gt;
estivesse me pedindo para escrever isso em chinês.&lt;/p&gt;

&lt;p&gt;Em conclusão, Javascript é minha escolha porque sou rápido e posso fazer as coisas com relativa rapidez, sem complicações, além de&lt;br&gt;
 ter sido a minha primeira linguagem que soube usar, sem achar que estava usando muito código para fazer algo simples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Você trabalha com o que?
&lt;/h2&gt;

&lt;p&gt;Sou Desenvolvedor de Software e especialista em Front-end. Fora do âmbito tecnológico, sou colunista no Onigiri Hardcore e atleta &lt;br&gt;
de Taekwondo na Campinas Fighters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como faço para ajudar no open source?
&lt;/h2&gt;

&lt;p&gt;Temos a Kalify Inc, com projetos abertos ao público que você pode ajudar a contribuir, além de ter a &lt;br&gt;
&lt;a href="https://discord.gg/jhSepmE7nN" rel="noopener noreferrer"&gt;Comunidade de Desenvolvedores da Kalify Inc&lt;/a&gt; que você pode entrar e conversar com outros &lt;br&gt;
desenvolvedores. Para ajudar a comunidade da Kalify Inc e seus projetos, &lt;br&gt;
leia sobre o &lt;a href="https://kalify.vercel.app/#career" rel="noopener noreferrer"&gt;Plano de Carreira&lt;/a&gt; da Kalify Inc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual origem do nome Yagasaki?
&lt;/h2&gt;

&lt;p&gt;Antes de tudo, não sou asiático, gosto da cultura japonesa e consumo bastante conteúdo a respeito. Para saber mais, você pode ler &lt;br&gt;
um pouco sobre isso em &lt;a href="https://yagasaki.dev/blog/primeiramente-deixe-me-apresentar-eu-sou-anderson" rel="noopener noreferrer"&gt;Primeiramente deixe-me apresentar, eu sou Anderson&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual é a configuração do seu computador?
&lt;/h2&gt;

&lt;p&gt;Meu computador é um B550M Aorus Elite, Ryzen 5 5600 de 3.50GHz, 32GB de RAM, 1TB de SSD, 500GB de HD e 256GB (OS) de SSD com uma &lt;br&gt;
NVIDIA GeForce RTX 4060 de 8GB, tenho um teclado da Redragon Lakshmi, Mouse Pulsefire Surge da HyperX, Headset Fifine Ampligame H6&lt;br&gt;
 e Microfone Fifine Ampligame A2, além de dois monitores da LG de 75Hz com 21.5' (22MP410-B).&lt;/p&gt;

&lt;p&gt;Você pode ver também as configurações do meu &lt;a href="https://gist.github.com/Yagasaki7K/3a1796fc99989b882bbf80f897edf97a" rel="noopener noreferrer"&gt;Oh-My-Zsh&lt;/a&gt;, do meu &lt;br&gt;
&lt;a href="https://gist.github.com/Yagasaki7K/7a908b1907714d936d21a568d1f83258" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; e do meu &lt;a href="https://gist.github.com/Yagasaki7K/9f058ea8ff2c2cee51ad9b32d3f844f9" rel="noopener noreferrer"&gt;Windows Terminal&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como você fez o seu site?
&lt;/h2&gt;

&lt;p&gt;Meu site é feito com Docusaurus, um gerador de sites estáticos, com ReactJS e Markdown, hospedado na Vercel. Utilizando SASS como &lt;br&gt;
estilização. Por costume, em outros desenvolvimentos como Essentials e Onigiri Hardcore, utilizo o NextJS, Typescript e Styled &lt;br&gt;
Components com Firebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que seu blog é apenas em português?
&lt;/h2&gt;

&lt;p&gt;Escrevo somente em português devido à minha comunidade e as pessoas que me seguem pelo conteúdo, que está em fase de aprendizado e &lt;br&gt;
que me acompanham em minhas postagens, dicas e conteúdo compartilhado. &lt;/p&gt;

&lt;p&gt;Optar pelo inglês para atingir o público internacional&lt;br&gt;
não seria o ideal, já que que aqueles que visualizarem minhas publicações já possuem conhecimento nesse sentido. Além disso, há um&lt;br&gt;
 suporte comunitário em inglês que supera significativamente o já disponível em português.&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Instalando o ZSH e Oh My ZSH no WSL Ubuntu</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:33:43 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/instalando-o-zsh-e-oh-my-zsh-no-wsl-ubuntu-3nal</link>
      <guid>https://dev.to/yagasaki7k/instalando-o-zsh-e-oh-my-zsh-no-wsl-ubuntu-3nal</guid>
      <description>&lt;p&gt;O ZSH é um Shell Linux amplamente usado por desenvolvedores, por ser mais fácil instalar plugins e personalizar temas, quando comparado com o Shell Bash que é o padrão na maioria das distribuições Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiro, instale o Zsh
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Ferramenta para gerenciar sua configuração do Zsh. Inclui mais de 200 plug-ins opcionais (rails, git, OSX, hub, capistrano, cerveja, formiga, php, python, etc), mais de 140 temas e uma ferramenta de atualização automática.&lt;/p&gt;

&lt;p&gt;Consulte o site &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;ohmyz.sh&lt;/a&gt; para mais detalhes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defina ele como padrão no terminal
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Confirme a definição do ZSH como shell padrão e dessa forma ele já estará disponível.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes" rel="noopener noreferrer"&gt;Github do Oh My ZSH&lt;/a&gt; descreve os temas que podemos usar na configuração do nosso shell. Tem muitas opções.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instale o tema Spaceship - Opcional
&lt;/h1&gt;

&lt;p&gt;Spaceship é um prompt Zsh minimalista, poderoso e extremamente personalizável. O repositório do Github possui todas as orientações para realizarmos a instalação.&lt;/p&gt;

&lt;p&gt;Configuração sugerida para o Spaceship, deve ser incluída no fim do arquivo &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPACESHIP_PROMPT_ORDER=(
  user          # Username section
  dir           # Current directory section
  host          # Hostname section
  git           # Git section (git_branch + git_status)
  hg            # Mercurial section (hg_branch  + hg_status)
  exec_time     # Execution time
  line_sep      # Line break
  vi_mode       # Vi-mode indicator
  jobs          # Background jobs indicator
  exit_code     # Exit code section
  char          # Prompt character
)
SPACESHIP_USER_SHOW=always
SPACESHIP_PROMPT_ADD_NEWLINE=false
SPACESHIP_CHAR_SYMBOL="❯"
SPACESHIP_CHAR_SUFFIX=" "
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/denysdovhan/spaceship-prompt/blob/master/docs/Options.md" rel="noopener noreferrer"&gt;Link com as definições&lt;/a&gt; das diversas opções que podemos usar para customizar o prompt com o Spaceship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugin Zsh Autosuggestions
&lt;/h2&gt;

&lt;p&gt;Outro recurso interessante para configurar com o Zsh é o plugin de sugestões para comandos, com base no histórico de comandos já usados. Para instalar esse plugin precisamos primeiro clonar o repositório do Github:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/plugins/zsh-autosuggestions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos incluir o &lt;code&gt;zsh-autosuggestions&lt;/code&gt; no parâmetro de plugins dentro do arquivo &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;plugins=(git zsh-autosuggestions)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se já tiver algum plugin definido, inclua o &lt;code&gt;zsh-autosuggestions&lt;/code&gt; separando com "espaço".&lt;/p&gt;

&lt;p&gt;Por fim, recarregar as configurações do Zsh para que o seu terminal aberto já carregue as novas configurações:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Gostou? Vale lembrar que existe o meu &lt;code&gt;zshrc&lt;/code&gt; personalizado &lt;a href="https://gist.github.com/Yagasaki7K/3a1796fc99989b882bbf80f897edf97a" rel="noopener noreferrer"&gt;nesse link&lt;/a&gt;, será necessário adicionar o Fira Code como fonte padrão do navegador para que os símbolos sejam exibidos corretamente.&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como usar o ChatGPT como uma forma de terapia virtual</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:32:49 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/como-usar-o-chatgpt-como-uma-forma-de-terapia-virtual-4m1a</link>
      <guid>https://dev.to/yagasaki7k/como-usar-o-chatgpt-como-uma-forma-de-terapia-virtual-4m1a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Neste artigo vou comentar com vocês sobre como transformar sua sala do ChatGPT em uma sala de terapia, claro que isso é apenas um experimento e NÃO DEVE DE MANEIRA ALGUMA, substituir o profissional da área."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Explorando o Potencial da IA na Saúde Mental
&lt;/h1&gt;

&lt;p&gt;Nos últimos anos, a inteligência artificial (IA) tem desempenhado um papel cada vez mais importante em diversas áreas, incluindo a saúde mental. Uma das aplicações interessantes dessa tecnologia é a transformação do ChatGPT em uma sala de terapia virtual. Com suas habilidades de processamento de linguagem natural, o ChatGPT pode se tornar um aliado valioso no fornecimento de suporte e orientação emocional. Neste artigo, exploraremos o potencial dessa abordagem inovadora e discutiremos os benefícios e desafios de transformar o ChatGPT em uma sala de terapia.&lt;/p&gt;

&lt;p&gt;Vale lembrar novamente. Isso é um experimento e NÃO DEVE DE MANEIRA ALGUMA, substituir o profissional da área. Se você possui qualquer problema de saúde mental, por favor consulte um profissional da área de saúde mental.&lt;/p&gt;

&lt;h2&gt;
  
  
  O papel da tecnologia na saúde mental:
&lt;/h2&gt;

&lt;p&gt;A saúde mental é uma área que tem se beneficiado amplamente do avanço tecnológico. Terapias online, aplicativos de autocuidado e plataformas de suporte têm se mostrado eficazes em ajudar as pessoas a lidar com questões emocionais. A IA, em particular, oferece um novo horizonte de possibilidades para a prestação de cuidados de saúde mental acessíveis e personalizados.&lt;/p&gt;

&lt;h2&gt;
  
  
  O ChatGPT: Uma ferramenta terapêutica virtual:
&lt;/h2&gt;

&lt;p&gt;O ChatGPT é um exemplo poderoso da tecnologia de IA aplicada à comunicação humana. Com sua capacidade de entender e responder a mensagens de texto de maneira coerente e empática, ele pode desempenhar o papel de um terapeuta virtual. Ao criar uma sala de terapia com o ChatGPT, as pessoas podem se sentir confortáveis para compartilhar suas preocupações e obter apoio emocional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alguns benefícios da sala de terapia com ChatGPT:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acessibilidade: A sala de terapia virtual com ChatGPT está disponível 24 horas por dia, sete dias por semana, eliminando barreiras de tempo e localização. Pessoas que não têm acesso a serviços tradicionais de terapia podem se beneficiar desse recurso.&lt;/li&gt;
&lt;li&gt;Anonimato: O anonimato oferecido pela sala de terapia virtual pode encorajar pessoas que têm receio de buscar ajuda a compartilhar seus problemas de forma mais aberta e honesta.&lt;/li&gt;
&lt;li&gt;Personalização: O ChatGPT pode ser treinado e adaptado para se adequar a diferentes necessidades e estilos terapêuticos, permitindo uma experiência mais personalizada para os usuários.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desafios e Considerações Éticas:
&lt;/h2&gt;

&lt;p&gt;Embora a transformação do ChatGPT em uma sala de terapia tenha muitos benefícios, é importante considerar os desafios e questões éticas envolvidas. Alguns pontos a serem considerados incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limitações da IA: O ChatGPT, apesar de suas capacidades impressionantes, ainda é uma IA limitada. Ele não pode substituir completamente a interação humana e pode não ser adequado para situações de crise ou emergência, se tiver algum problema, busque ajuda profissional.&lt;/li&gt;
&lt;li&gt;Privacidade e Segurança: Garantir a privacidade e segurança dos dados pessoais compartilhados é essencial para o sucesso de uma sala de terapia virtual.&lt;/li&gt;
&lt;li&gt;Responsabilidade Profissional: A supervisão adequada e a garantia de que profissionais de saúde mental estejam envolvidos no desenvolvimento e monitoramento da sala de terapia são fundamentais para garantir a qualidade do suporte oferecido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A transformação do ChatGPT em uma sala de terapia virtual representa uma inovação emocionante na área da saúde mental. Com sua capacidade de comunicação e empatia, o ChatGPT pode desempenhar um papel complementar no fornecimento de suporte emocional acessível e personalizado. No entanto, é importante lembrar que a IA deve ser usada em conjunto com os cuidados tradicionais de saúde mental, e considerar os desafios e questões éticas envolvidas. Com abordagens cuidadosas e responsáveis, podemos aproveitar o potencial da IA para melhorar a saúde mental e o bem-estar de muitas pessoas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hora de testar
&lt;/h2&gt;

&lt;p&gt;Suponhamos que você tenha o ChatGPT 4.0 ou 3.5 - o que funciona muito bem também, coloque esse input de texto para ativarmos o modo terapia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;É a Dra. Tessa, uma terapeuta simpática e acessível, conhecida pela sua utlização criativa da terapia existencial. Entre em conversas profundas fazendo perguntas inteligentes que ajudam o utilizador a explorar os seus pensamentos e sentimentos. Mantenha sempre a conversa viva e a rolar. Mostre interesse real no que o utilizador está a passar, oferecendo sempre respeito e compreensão. Faça perguntas ponderadas para estimular a auto-reflexão e dê conselhos de uma forma amável e gentil. Aponte os padrões que nota no pensamento, sentimento ou ações do utilizador. Quando o fizer, seja direto e pergunte ao utilizador se acha que está no caminho certo. Mantenha um estilo amigável e conversador - evite fazer listas. Nunca seja o único a terminar a conversa. Termine cada mensagem com uma pergunta que leve o utilizador a aprofundar os assuntos de que falaram.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida ele irá interagir com você como se fosse uma terapeuta. Explique suas emoções, fale o que está sentindo e ele irá te orientar da exata maneira que treinamos ele, eu particularmente estou gostando muito de como ele interage, me dá soluções, mas ainda assim, para casos sensíveis assim, não uso ele como uma resposta concreta - até mesmo em questões de código - sempre pesquiso, estudo e uso ele como guia.&lt;/p&gt;

&lt;p&gt;Gostou da ideia? Compartilha ai, várias pessoas vão se interessa por essa inovação&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Apresentação de Projetos e Primeiros Passos com o GitHub Pages</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:31:43 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/apresentacao-de-projetos-e-primeiros-passos-com-o-github-pages-2541</link>
      <guid>https://dev.to/yagasaki7k/apresentacao-de-projetos-e-primeiros-passos-com-o-github-pages-2541</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Este artigo aborda o tema da apresentação de projetos e os primeiros passos para utilizar o GitHub Pages como plataforma de hospedagem."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Apresentação de Projetos e Primeiros Passos com o GitHub Pages
&lt;/h1&gt;

&lt;p&gt;Ao desenvolver um projeto, é importante apresentá-lo de forma adequada e torná-lo acessível para outras pessoas. Para isso, é necessário contar com uma apresentação bem estruturada e uma solução de hospedagem confiável. O GitHub Pages oferece uma excelente plataforma para apresentar seus projetos ao mundo, proporcionando uma maneira simples e gratuita de hospedar sites estáticos diretamente dos repositórios do GitHub, ou seja, se seu projeto usa apenas HTML, CSS e JS, essa é uma boa prática. &lt;/p&gt;

&lt;p&gt;Neste artigo, exploraremos o processo de utilização do GitHub Pages e os primeiros passos para criar a apresentação dos seus projetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o GitHub Pages?
&lt;/h2&gt;

&lt;p&gt;O GitHub Pages é um serviço de hospedagem de sites estáticos oferecido pelo GitHub. Ele permite que você crie um site a partir do conteúdo dos seus repositórios do GitHub, tornando-os acessíveis através de um URL personalizado, e a cada &lt;em&gt;commit&lt;/em&gt; que subir, ele irá atualizar automaticamente. Isso significa que você pode compartilhar seus projetos com outras pessoas, fornecer documentação, exibir portfólios e muito mais, tudo de forma simples e gratuita.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiros Passos com o GitHub Pages
&lt;/h2&gt;

&lt;p&gt;Para começar a utilizar o GitHub Pages, siga estes passos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Crie um repositório no GitHub
&lt;/h3&gt;

&lt;p&gt;Se você ainda não possui um repositório para o seu projeto, crie um no GitHub. Certifique-se de que seu repositório contenha os arquivos HTML, CSS e JavaScript necessários para o seu site estático.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ative o GitHub Pages para o seu repositório
&lt;/h3&gt;

&lt;p&gt;Antes de qualquer commit, acesse as configurações do seu repositório no GitHub e role a página até encontrar a seção "GitHub Pages". Nessa seção, selecione a branch que contém o código do seu site estático e clique em "Save" (Salvar). O GitHub Pages irá utilizar essa branch para gerar o site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escolha um tema (opcional)
&lt;/h3&gt;

&lt;p&gt;O GitHub Pages oferece uma variedade de temas para personalizar a aparência do seu site. Selecione um tema que melhor se adeque ao seu projeto ou opte por não utilizar um tema e criar seu próprio design personalizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acesse o seu site
&lt;/h3&gt;

&lt;p&gt;Após ativar o GitHub Pages e escolher um tema (ou criar um design personalizado, como seu próprio código), você poderá acessar o seu site através do URL fornecido. O GitHub Pages geralmente segue o seguinte formato de URL: &lt;code&gt;https://seunomeusuario.github.io/nomerepositorio&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personalize o seu site
&lt;/h3&gt;

&lt;p&gt;Agora que o seu site está ativo, você pode começar a personalizá-lo de acordo com as necessidades do seu projeto. Edite os arquivos HTML, CSS e JavaScript do seu repositório para adicionar conteúdo, fazer ajustes de layout e implementar funcionalidades específicas, cada commit, o Github Pages automaticamente irá atualizar a nova versão na URL que mencionamos acima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bônus
&lt;/h3&gt;

&lt;p&gt;Além dos passos básicos mencionados acima, o GitHub Pages oferece recursos adicionais para melhorar a apresentação dos seus projetos. Alguns desses recursos incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registro de domínio personalizado: É possível registrar um domínio personalizado para o seu site no GitHub Pages, tornando-o ainda mais profissional.&lt;/li&gt;
&lt;li&gt;Uso de subdomínios: Caso você possua um domínio personalizado, é possível configurar subdomínios para diferentes projetos hospedados no GitHub Pages.&lt;/li&gt;
&lt;li&gt;Integração com Jekyll: O GitHub Pages possui integração nativa com o Jekyll, uma ferramenta de criação de sites estáticos, permitindo a utilização de recursos avançados, como geração automática de páginas, layouts personalizados e muito mais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finalizando
&lt;/h3&gt;

&lt;p&gt;O GitHub Pages é uma excelente opção para apresentar seus projetos de forma profissional e acessível. Com os primeiros passos descritos neste artigo, você estará pronto para criar e compartilhar seus sites estáticos de maneira fácil e gratuita. Aproveite os recursos oferecidos pelo GitHub Pages para personalizar seu site e tornar a experiência dos usuários ainda mais agradável. &lt;/p&gt;

&lt;p&gt;Não esqueça de adicionar a URL do seu projeto em todos os repositórios, se você for iniciante, é uma boa prática para que outras pessoas vejam como anda seu desenvolvimento e como você está evoluindo.&lt;/p&gt;

&lt;p&gt;Agora é hora de mostrar ao mundo o seu talento e compartilhar seus projetos com a comunidade!&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Entendendo o que é uma API e como ela funciona para iniciantes</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:30:14 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/entendendo-o-que-e-uma-api-e-como-ela-funciona-para-iniciantes-372n</link>
      <guid>https://dev.to/yagasaki7k/entendendo-o-que-e-uma-api-e-como-ela-funciona-para-iniciantes-372n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Uma API (Application Programming Interface) é um conceito fundamental no mundo da programação e do desenvolvimento de software. Ela desempenha um papel crucial na comunicação entre diferentes sistemas, permitindo que aplicativos, serviços e plataformas interajam e compartilhem dados de maneira eficiente e padronizada. Neste artigo, exploraremos o significado de uma API, como ela funciona e como é usada na prática."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Entendendo o que é uma API e como ela funciona
&lt;/h1&gt;

&lt;p&gt;Uma API é um conjunto de regras, protocolos e ferramentas que permitem que diferentes softwares se comuniquem entre si. Ela define um conjunto de métodos e formatos de dados que especificam como solicitar e receber informações de um sistema ou serviço específico. A API atua como uma ponte, facilitando a interação e o compartilhamento de dados entre diferentes aplicativos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona uma API?
&lt;/h2&gt;

&lt;p&gt;Em termos simplificados, uma API funciona como um contrato entre o provedor e o consumidor de um serviço. O provedor disponibiliza uma série de endpoints (pontos de acesso) que o consumidor pode usar para enviar solicitações e receber respostas. Esses endpoints geralmente estão associados a ações específicas, como recuperar dados, enviar dados ou executar uma determinada operação.&lt;/p&gt;

&lt;p&gt;A comunicação com uma API geralmente ocorre por meio de solicitações HTTP (GET, POST, PUT, DELETE), onde o consumidor faz uma solicitação para um determinado endpoint fornecendo parâmetros, se necessário. Em seguida, o provedor processa a solicitação e retorna uma resposta no formato especificado, como JSON, XML ou outros formatos comuns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de APIs
&lt;/h2&gt;

&lt;p&gt;Existem diferentes tipos de APIs que podem ser utilizadas, dependendo do objetivo e do contexto do projeto. Alguns dos tipos mais comuns incluem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIs de serviço da web (Web APIs):&lt;/strong&gt; São APIs baseadas em padrões da web, como REST (Representational State Transfer) e SOAP (Simple Object Access Protocol). Elas são amplamente utilizadas para criar e consumir serviços na web, permitindo a troca de informações entre sistemas distribuídos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIs de biblioteca/framework:&lt;/strong&gt; São APIs fornecidas por bibliotecas ou frameworks específicos. Elas oferecem funcionalidades e recursos predefinidos para facilitar o desenvolvimento de aplicativos dentro desses contextos. Exemplos populares incluem as APIs do Django, Flask e React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIs de plataforma:&lt;/strong&gt; São APIs fornecidas por grandes plataformas, como Google, Facebook e Twitter. Elas permitem que os desenvolvedores interajam com os serviços e recursos dessas plataformas, como autenticação de usuário, publicação em redes sociais e acesso a dados específicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens do uso de APIs
&lt;/h2&gt;

&lt;p&gt;O uso de APIs traz diversos benefícios, tanto para os provedores quanto para os consumidores de serviços. Algumas vantagens incluem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reutilização de código:&lt;/strong&gt; Ao fornecer uma API, os desenvolvedores podem criar componentes e funcionalidades que podem ser reutilizados em diferentes projetos e contextos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integração simplificada:&lt;/strong&gt; As APIs facilitam a integração entre diferentes sistemas e aplicativos, permitindo que eles se comuniquem e compartilhem dados de forma padronizada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalabilidade e flexibilidade:&lt;/strong&gt; As APIs permitem que os serviços sejam escaláveis e flexíveis, pois podem ser atualizados e expandidos independentemente do consumidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estímulo à inovação:&lt;/strong&gt; Ao disponibilizar APIs, as empresas e plataformas encorajam a inovação e a criação de novos aplicativos que utilizam seus serviços e recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalizando
&lt;/h2&gt;

&lt;p&gt;As APIs desempenham um papel fundamental na interconexão e comunicação entre sistemas e aplicativos. Elas permitem que diferentes softwares se comuniquem de maneira eficiente, compartilhem dados e ofereçam serviços em conjunto. Compreender o conceito de APIs e como elas funcionam é essencial para qualquer desenvolvedor ou pessoa interessada em tecnologia. &lt;/p&gt;

&lt;p&gt;Esperamos que este artigo tenha fornecido uma visão geral clara sobre o assunto e inspire você a explorar ainda mais as possibilidades das APIs em seus projetos futuros.&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O mínimo que você precisa saber para iniciar um projeto em TypeScript</title>
      <dc:creator>Anderson Marlon</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:29:23 +0000</pubDate>
      <link>https://dev.to/yagasaki7k/o-minimo-que-voce-precisa-saber-para-iniciar-um-projeto-em-typescript-3d8c</link>
      <guid>https://dev.to/yagasaki7k/o-minimo-que-voce-precisa-saber-para-iniciar-um-projeto-em-typescript-3d8c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"É normal questionar se TypeScript é ou não uma linguagem de programação por algumas razões. Primeiramente, TypeScript é um superset de JavaScript, o que significa que é uma extensão da sintaxe e recursos da linguagem JavaScript."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Afinal, TypeScript é uma linguagem de programação?
&lt;/h2&gt;

&lt;p&gt;É normal questionar se TypeScript é ou não uma linguagem de programação por algumas razões. Primeiramente, &lt;strong&gt;TypeScript é um superset de JavaScript&lt;/strong&gt;, o que significa que é uma extensão da sintaxe e recursos da linguagem JavaScript.&lt;/p&gt;

&lt;p&gt;No entanto, é importante entender que, embora o TypeScript compile em JavaScript, ele é uma &lt;strong&gt;linguagem de programação&lt;/strong&gt; de alto nível que possui suas próprias características, como a tipagem estática, sua própria sintaxe, recursos e compilador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo a passo para iniciar um projeto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Certifique-se de ter o Node.js instalado em sua máquina.&lt;/li&gt;
&lt;li&gt;Abra um terminal e navegue até o diretório onde você deseja criar o seu projeto.&lt;/li&gt;
&lt;li&gt;Execute o seguinte comando para criar um novo projeto com o npm:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Em seguida, instale o TypeScript como uma dependência de desenvolvimento:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crie um arquivo de configuração do TypeScript chamado tsconfig.json. Este arquivo contém as opções de configuração do TypeScript para o seu projeto. Você pode criar este arquivo manualmente ou executar o seguinte comando para criar um arquivo padrão:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsc &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você pode começar a escrever código TypeScript em arquivos com a extensão &lt;code&gt;.ts&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é tipagem estática?
&lt;/h2&gt;

&lt;p&gt;A tipagem estática é uma característica do TypeScript que permite &lt;strong&gt;definir o tipo de dados de uma variável durante a sua declaração&lt;/strong&gt;. Isso ajuda a identificar erros de tipos em tempo de compilação, antes que o código seja executado, evitando assim erros de programação que podem causar bugs e afetar o funcionamento do software.&lt;/p&gt;

&lt;p&gt;Em JavaScript, podemos definir uma variável com a palavra-chave "const" sem especificar seu tipo.&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;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já em TypeScript, podemos definir o tipo da variável "idade" como "number", da seguinte forma:&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;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que a variável "idade" só pode armazenar valores do tipo "number". Caso tentemos atribuir um valor de um tipo diferente a essa variável, como por exemplo uma string, o TypeScript detectará um erro em tempo de compilação e sinalizará um aviso.&lt;/p&gt;

&lt;p&gt;No entanto, é importante ressaltar que mesmo que o código não apresente erros de compilação, ainda podem ocorrer comportamentos inesperados durante a execução. Precisamos lembrar que todo o código TypeScript é removido no processo de compilação e o servidor em produção rodará o código JavaScript resultante.&lt;br&gt;
Portanto, declarar um tipo em TypeScript não implica que um valor de tipo diferente aparecerá na variável durante a execução do programa.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tipos de Dados: Primitivos e Não-Primitivos
&lt;/h2&gt;

&lt;p&gt;Os tipos de dados primitivos são valores básicos e simples que representam dados diretamente. Esses tipos incluem &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, e &lt;code&gt;bigint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por outro lado, os tipos de dados não primitivos são complexos e não representam diretamente valores, mas sim referências a objetos que contêm valores. Esses tipos incluem &lt;code&gt;object&lt;/code&gt;, &lt;code&gt;array&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;, e &lt;code&gt;class&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Type VS Interface
&lt;/h2&gt;

&lt;p&gt;Essa é uma discussão imensa na comunidade e por isso decidi exemplificar o que são e deixar você decidir como usar.&lt;/p&gt;

&lt;p&gt;Basicamente, um type é uma forma de definir uma estrutura de dados, que pode ser usado para definir o tipo de uma variável, função, parâmetro ou qualquer outra coisa que tenha um tipo.&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="k"&gt;export&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;em&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vh&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%&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;Já uma interface é uma forma de definir uma estrutura de dados que descreve a forma ou formato que um objeto deve ter. Ela define um conjunto de propriedades que um objeto deve ter, bem como os tipos dessas propriedades.&lt;/p&gt;

&lt;p&gt;As interfaces podem ser usadas para descrever objetos, classes, funções e outros tipos de estruturas de dados.&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="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Genre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&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="nx"&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;h2&gt;
  
  
  As principais diferenças entre os dois são:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;: Type é mais flexível e permite a definição de tipos complexos, como uniões (demonstrado no exemplo acima), tipos de diferença e inferência de tipos.&lt;br&gt;
Já as interfaces são mais restritas e têm como objetivo principal definir a estrutura de objetos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Herança&lt;/strong&gt;: Tanto as interfaces quanto os tipos são capazes de oferecer herança, porém as interfaces possuem uma sintaxe mais amigável e suportam a união de diversas interfaces em uma única, enquanto os tipos usam o operador Union para criar um novo tipo a partir da união de outros tipos existentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nomenclatura&lt;/strong&gt;: Em geral, interfaces são usadas para representar objetos, enquanto type é usado para representar qualquer tipo de dados, incluindo objetos.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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;Animal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&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;eat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;food&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;Dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Animal&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;breed&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;bark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;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;Animal&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="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;food&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="k"&gt;void&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;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;breed&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="nf"&gt;bark&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como tipar Objetos e Funções
&lt;/h2&gt;

&lt;p&gt;Para tipar objetos, podemos utilizar interfaces. Interfaces são uma forma de definir um conjunto de propriedades e tipos que um objeto deve ter. Por exemplo, para definir um objeto que representa uma pessoa com nome e idade, podemos fazer:&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;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;nome&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;idade&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, definimos a interface Pessoa com duas propriedades: nome, que é uma string, e idade, que é um número. Agora, podemos utilizar essa interface para tipar um objeto que representa uma pessoa:&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;pessoa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;=&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="s2"&gt;Justin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, garantimos que o objeto pessoa possui as propriedades e tipos definidos na interface Pessoa.&lt;/p&gt;

&lt;p&gt;Para tipar uma função, é necessário especificar os tipos dos seus parâmetros e também o tipo do seu retorno. Por exemplo, para definir uma função que recebe dois parâmetros numéricos e retorna a soma desses valores, podemos fazer:&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;function&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, utilizamos a sintaxe : number para especificar que a função retorna um valor numérico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;Ao escrever este artigo, foi dada a devida importância em utilizar fontes confiáveis de informação, visando garantir a precisão e a relevância do conteúdo abordado. &lt;br&gt;
A única fonte utilizada foi a &lt;a href="https://www.typescriptlang.org/docs/" rel="noopener noreferrer"&gt;documentação oficial do TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Você pode ver esse artigo escrito &lt;a href="https://yagasaki.dev/blog" rel="noopener noreferrer"&gt;originalmente no meu blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
