<?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: Matheus Figueiredo</title>
    <description>The latest articles on DEV Community by Matheus Figueiredo (@matfigueiredo).</description>
    <link>https://dev.to/matfigueiredo</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%2F1085174%2F323105c8-e876-4987-b568-0149aa5bbaca.jpeg</url>
      <title>DEV Community: Matheus Figueiredo</title>
      <link>https://dev.to/matfigueiredo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matfigueiredo"/>
    <language>en</language>
    <item>
      <title>Tornando sua aplicação Go mais eficiente: Estratégias de otimização de desempenho</title>
      <dc:creator>Matheus Figueiredo</dc:creator>
      <pubDate>Wed, 28 Jun 2023 21:02:06 +0000</pubDate>
      <link>https://dev.to/matfigueiredo/tornando-sua-aplicacao-go-mais-eficiente-estrategias-de-otimizacao-de-desempenho-3p2</link>
      <guid>https://dev.to/matfigueiredo/tornando-sua-aplicacao-go-mais-eficiente-estrategias-de-otimizacao-de-desempenho-3p2</guid>
      <description>&lt;p&gt;&lt;strong&gt;De volta aos estudos em Golang&lt;/strong&gt;, decidi criar este artigo para &lt;strong&gt;documentar a minha jornada com esta linguagem.&lt;/strong&gt; Particularmente eu aprendo muito ao criar algum tipo de conteúdo.&lt;/p&gt;

&lt;p&gt;Sabemos que desenvolver aplicações eficientes e com bom desempenho é essencial para fornecer uma boa experiência aos usuários, mas o que de fato significa uma aplicação eficiente?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma aplicação eficiente é aquela que utiliza os recursos de forma otimizada, entregando um bom desempenho e consumindo uma quantidade adequada de recursos, como memória e processamento. Uma aplicação eficiente é capaz de lidar com cargas de trabalho elevadas, responder rapidamente às solicitações dos usuários e minimizar o consumo excessivo de recursos, resultando em uma experiência mais ágil e eficiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É claro que a escolha por uma linguagem de programação passa &lt;strong&gt;por muitos contextos e requisitos&lt;/strong&gt;, entretanto o objetivo aqui é tornar uma aplicação eficiente, &lt;strong&gt;no cerne da palavra&lt;/strong&gt;, e nisso o Go é extremamente capaz.&lt;/p&gt;

&lt;p&gt;Separei &lt;strong&gt;3 tópicos&lt;/strong&gt; que são diferenciais da linguagem e que podem &lt;strong&gt;elevar o nível da sua aplicação:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1 - Utilizar eficientemente as estruturas de dados&lt;br&gt;
2 - Aproveitar a Concorrência&lt;br&gt;
3 - Otimizar o uso de memória&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1 - Utilizar eficientemente as estruturas de dados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Temos algumas estruturas de dados em Go, para diversos fins.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Escolher a estrutura de dados correta pode impactar significativamente o desempenho, a escalabilidade e a legibilidade do código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Slices:&lt;/strong&gt;&lt;br&gt;
Slices são uma das estruturas mais utilizadas em Go. O grande ganho aqui é a flexibilidade para manipular coleções de elementos, de tamanho variável, enquanto no Array precisamos definir o seu tamanho previamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fELKjn4B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9xdl1naq2frmwp8avo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fELKjn4B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9xdl1naq2frmwp8avo4.png" alt="difference between slice and array" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao trabalhar com uma slice, você especifica apenas o tamanho inicial da slice. À medida que você adiciona elementos à slice, ela pode crescer automaticamente, conforme necessário, alocando apenas a quantidade necessária de memória adicional.&lt;/p&gt;

&lt;p&gt;Em vez de alocar uma quantidade fixa de memória no início e correr o risco de ficar sem espaço, as slices aumentam sua capacidade gradualmente, conforme necessário. Isso é especialmente útil quando você não sabe antecipadamente o número exato de elementos que serão armazenados na slice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maps:&lt;/strong&gt;&lt;br&gt;
Maps são estrutura de dados &lt;strong&gt;chave-valor&lt;/strong&gt;, permitindo que você associe uma chave a um valor correspondente.&lt;/p&gt;

&lt;p&gt;Temos diversos problemas que o map resolve, mas alguns deles que me chamaram atenção foram: &lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Indexação rápida:&lt;/strong&gt; É muito mais otimizado gerenciar usuários (Através de ID, por ex.), utilizando map. Podemos usar um map com o ID do usuário como chave e o objeto de usuário correspondente como valor, permitindo uma busca rápida de usuários com base em seus IDs.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Cache de resultados:&lt;/strong&gt; Em aplicações que envolvem cálculos pesados ou acesso a recursos externos, um map pode ser usado como cache para armazenar resultados pré-computados ou resultados obtidos anteriormente. Isso evita a necessidade de recalcular ou reacessar o recurso a todo o tempo que este é executado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structs:&lt;/strong&gt;&lt;br&gt;
Structs são estruturas de dados que definem a forma como os dados de um arquivo por ex. são organizados e armazenados.&lt;/p&gt;

&lt;p&gt;O GO não é uma linguagem orientada a objetos (OOP), porém a struct é uma forma que permite utilizar um dos conceitos que mais gosto na OOP, que é a Inversão de Dependência e Injeção de Dependência.&lt;/p&gt;

&lt;p&gt;Ao projetar uma struct, eu posso adotar esses conceitos acima para criar componentes mais independentes e desacoplados. As dependências externas são &lt;strong&gt;injetadas nas structs&lt;/strong&gt; em vez de serem criadas dentro delas. Isso permite que as structs dependam de &lt;strong&gt;interfaces ou abstrações&lt;/strong&gt; em vez de classes concretas, invertendo as dependências.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2 - Aproveitar a Concorrência&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Concorrência é uma técnica que permite que diferentes partes de um programa sejam executadas simultaneamente, melhorando a performance geral.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De forma geral, a concorrência permite que &lt;strong&gt;diferentes partes de um programa sejam executadas independentemente umas das outras&lt;/strong&gt;, reduzindo o tempo de execução total. Isso é especialmente útil em situações em que há tarefas que podem ser realizadas em paralelo, &lt;strong&gt;como processamento de requisições em um servidor web&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No entanto, é importante mencionar que &lt;strong&gt;a concorrência não é uma solução para todos os problemas de desempenho.&lt;/strong&gt; Em alguns casos, a utilização excessiva de goroutines pode resultar em sobrecarga e piorar o desempenho. É necessário equilibrar.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3 - Otimizar o uso de memória&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Temos muitos recursos na linguagem para otimizar o uso da memória, destaco algumas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Otimizações do compilador:&lt;/strong&gt; O compilador Go realiza várias otimizações, como inlining de funções e eliminação de código morto, para melhorar a performance e reduzir o uso de memória.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Garbage collector:&lt;/strong&gt; O Go gerencia automaticamente a alocação e a liberação de memória, evitando que esse gerenciamento seja de forma manual. Assim, é reduzido a ocorrência de vazamentos e o processo se torna mais eficiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uso das goroutines:&lt;/strong&gt; Por fim, as goroutines permitem a execução concorrente das tarefas (lembra do tópico 2?). Elas possuem uma representação de memória menor do que as threads tradicionais, o que significa que é possível executar um grande número de goroutines com uso eficiente de memória.&lt;/p&gt;




&lt;p&gt;Muitas aplicações e empresas exigem esse nível de otimização, pois isso se traduz, no fim do dia, em custos. &lt;/p&gt;

&lt;p&gt;Portanto, convido e recomendo vocês a explorararem o mundo do Go e descobrir como essa linguagem pode ser uma aliada poderosa na criação de aplicações de alto desempenho, otimizando o uso de recursos de memória e oferecendo uma experiência excepcional aos usuários.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como desenvolver um chatbot em menos de 30 minutos (Com IA)</title>
      <dc:creator>Matheus Figueiredo</dc:creator>
      <pubDate>Wed, 21 Jun 2023 04:09:52 +0000</pubDate>
      <link>https://dev.to/matfigueiredo/como-desenvolver-um-chatbot-em-menos-de-30-minutos-com-ia-c7j</link>
      <guid>https://dev.to/matfigueiredo/como-desenvolver-um-chatbot-em-menos-de-30-minutos-com-ia-c7j</guid>
      <description>&lt;p&gt;Há alguns dias precisei levantar rapidamente um ambiente de testes de um Chatbot com inputs integrados a alguma inteligência artificial, como forma de melhorar a experiência dos usuários ao utilizar esse canal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Na minha opinião, um chatbot com inteligência artificial &lt;strong&gt;não deve substituir&lt;/strong&gt; o atendimento humano, entretanto essa automação tem o papel de qualificar esse atendimento, tanto para o usuário quanto para a equipe de atendimento.&lt;/p&gt;

&lt;p&gt;Nesse artigo ensinarei uma excelente opção para subir esse ambiente de desenvolvimento local, utilizando ferramentas de construção code e low-code, com o objetivo de verificar se a inteligência artificial pode &lt;strong&gt;auxiliar o atendimento da sua empresa.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aqui está a lista de sites utilizados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/FlowiseAI/Flowise"&gt;https://github.com/FlowiseAI/Flowise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/"&gt;https://platform.openai.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://serpapi.com/users/sign_up"&gt;https://serpapi.com/users/sign_up&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Primeiro de tudo, certifique-se de criar uma conta nos sites dos tópicos 2 e 3 acima.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: É necessário cadastrar um cartão de crédito para utilizar a Api Key da openai.com e em cada resposta do Chatbot você será cobrado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note 2&lt;/strong&gt;: A API Key da SERP API funciona de forma gratuita para testes.&lt;/p&gt;

&lt;p&gt;Vamos lá:&lt;/p&gt;

&lt;p&gt;1- Para começar você precisa clonar o repositório do site 1 (&lt;a href="https://github.com/FlowiseAI/Flowise"&gt;https://github.com/FlowiseAI/Flowise&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Basta utilizar o comando abaixo em seu terminal, na pasta de sua preferência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/FlowiseAI/Flowise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra esse arquivo no editor de código de sua preferência. &lt;/p&gt;

&lt;p&gt;Algo parecido com isto deve aparecer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YfBepYjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/amonkt5gy3i4lvvuznx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YfBepYjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/amonkt5gy3i4lvvuznx4.png" alt="Image description" width="346" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2- Aqui você pode rodar o ambiente de testes utilizando o npm ou o Docker. &lt;br&gt;
Para esse fim, estarei utilizando o Docker. Certifique-se que você tenha o Docker e o Docker compose instalado.&lt;/p&gt;

&lt;p&gt;Caso você também use o Docker, vá para a pasta docker do seu arquivo e altere o arquivo ".env" com a porta que você deseja redirecionamento do seu ambiente local.&lt;/p&gt;

&lt;p&gt;No exemplo, utilizei a porta &lt;strong&gt;3005&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ufTSS-dM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8t9houxay4q3pivoixy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ufTSS-dM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8t9houxay4q3pivoixy.png" alt="Image description" width="616" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3- Rode o comando para iniciar sua aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4- Quase lá! O seu ambiente de testes de Chatbot está quase pronto, basta acessar em seu navegador o endereço &lt;a href="http://localhost:3005"&gt;http://localhost:3005&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Utilize no fim do link a porta que você escolheu no arquivo ".env"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e3Mt0ffC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yuu5uklau7gw3ylbbj2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e3Mt0ffC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yuu5uklau7gw3ylbbj2f.png" alt="Image description" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5- Clique em Marketplace no menu à esquerda. Diversos templates serão ofertados para o seu teste.&lt;/p&gt;

&lt;p&gt;Para o exemplo, escolhi o "Conversational Agent".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4AYXsq9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15qyuk6qc86jab09vc6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4AYXsq9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15qyuk6qc86jab09vc6i.png" alt="Image description" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6- Agora precisamos das credenciais. &lt;br&gt;
Insira sua API Key da Open AI e da SERP API nos campos correspondentes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YKcq7w68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m54w5hcpxqbyxjaefjp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YKcq7w68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m54w5hcpxqbyxjaefjp0.png" alt="Image description" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7- Insira alguns paramêtros para o seu Chatbot. No exemplo solicitei apenas para o bot responder os comandos em português e me oferecer um produto ao fim da interação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WF0Nzr3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ejnf2b0yj1iho9ndqi3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WF0Nzr3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ejnf2b0yj1iho9ndqi3e.png" alt="Image description" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8- Clique no chat no canto superior direito para começar a testar&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3C6LSwQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qh32qr2avdg4v8rc01ta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3C6LSwQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qh32qr2avdg4v8rc01ta.png" alt="Image description" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9- E aqui temos o resultado!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aZocYAQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aljnzj4etefuoazwvkyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aZocYAQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aljnzj4etefuoazwvkyq.png" alt="Image description" width="395" height="774"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em menos de 30 minutos podemos subir um ambiente de testes de chatbot, integrado com inteligência artificial e que consegue realizar buscas na internet!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;: A cada input é gerado uma pequena cobrança pela utilização da API Key da OpenAI. Certifique-se de colocar um limite de gastos na plataforma. No exemplo, limitei em 200 tokens as respostas como forma de diminuir esse custo.&lt;/p&gt;

&lt;p&gt;Caso desejem trocar uma ideia sobre inteligência artificial, programação e muito mais, meu direct está aberto no Linkedin! =)&lt;/p&gt;

</description>
      <category>chatbot</category>
      <category>chatgpt</category>
      <category>ia</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
