<?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: Edson Costa</title>
    <description>The latest articles on DEV Community by Edson Costa (@ecsistem).</description>
    <link>https://dev.to/ecsistem</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%2F859642%2F64be7274-f9a4-422a-a134-3ccdf86cae45.jpeg</url>
      <title>DEV Community: Edson Costa</title>
      <link>https://dev.to/ecsistem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ecsistem"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Mon, 01 Dec 2025 05:20:54 +0000</pubDate>
      <link>https://dev.to/ecsistem/-1p8g</link>
      <guid>https://dev.to/ecsistem/-1p8g</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/devsnorte" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8641%2F96f45e9a-ded6-415a-94d5-7f1488bd6e65.png" alt="Devs Norte" width="294" height="294"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F859642%2F64be7274-f9a4-422a-a134-3ccdf86cae45.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devsnorte/solid-explicado-com-exemplos-em-java-do-jeito-simples-que-todo-dev-gostaria-de-ter-aprendido-36g1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;SOLID explicado com exemplos em Java — do jeito simples que todo dev gostaria de ter aprendido&lt;/h2&gt;
      &lt;h3&gt;Edson Costa for Devs Norte ・ Dec 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#solidprinciples&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>solidprinciples</category>
      <category>java</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Mon, 01 Dec 2025 05:06:17 +0000</pubDate>
      <link>https://dev.to/ecsistem/-4oh9</link>
      <guid>https://dev.to/ecsistem/-4oh9</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/devsnorte" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F8641%2F96f45e9a-ded6-415a-94d5-7f1488bd6e65.png" alt="Devs Norte" width="294" height="294"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F859642%2F64be7274-f9a4-422a-a134-3ccdf86cae45.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devsnorte/solid-explicado-com-exemplos-em-java-do-jeito-simples-que-todo-dev-gostaria-de-ter-aprendido-36g1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;SOLID explicado com exemplos em Java — do jeito simples que todo dev gostaria de ter aprendido&lt;/h2&gt;
      &lt;h3&gt;Edson Costa for Devs Norte ・ Dec 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#solidprinciples&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>solidprinciples</category>
      <category>java</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SOLID explicado com exemplos em Java — do jeito simples que todo dev gostaria de ter aprendido</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Mon, 01 Dec 2025 05:05:50 +0000</pubDate>
      <link>https://dev.to/devsnorte/solid-explicado-com-exemplos-em-java-do-jeito-simples-que-todo-dev-gostaria-de-ter-aprendido-36g1</link>
      <guid>https://dev.to/devsnorte/solid-explicado-com-exemplos-em-java-do-jeito-simples-que-todo-dev-gostaria-de-ter-aprendido-36g1</guid>
      <description>&lt;p&gt;Ao longo da minha jornada como desenvolvedor — principalmente vindo do desenvolvimento web — sempre ouvi falar sobre SOLID. Mas foi entrando de vez no desenvolvimento mobile que esses princípios começaram a fazer um sentido muito maior no meu dia a dia.&lt;/p&gt;

&lt;p&gt;SOLID não é um conjunto de regras rígidas, e sim um &lt;strong&gt;guia de boas práticas para construir sistemas mais limpos, flexíveis e fáceis de manter&lt;/strong&gt;.&lt;br&gt;
E, para explicar isso, vou usar analogias simples e exemplos reais em Java, mostrando como cada princípio se aplica no código.&lt;/p&gt;

&lt;p&gt;Vamos direto ao ponto.&lt;/p&gt;


&lt;h1&gt;
  
  
  🧱 O que é SOLID?
&lt;/h1&gt;

&lt;p&gt;SOLID é um acrônimo formado por cinco princípios fundamentais da programação orientada a objetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt; — Single Responsibility Principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt; — Open/Closed Principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt; — Liskov Substitution Principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I&lt;/strong&gt; — Interface Segregation Principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt; — Dependency Inversion Principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A ideia central é simples: &lt;strong&gt;projetar software que seja fácil de entender, evoluir, testar e manter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agora, vamos ver cada princípio na prática.&lt;/p&gt;


&lt;h1&gt;
  
  
  1️⃣ Single Responsibility Principle (Responsabilidade Única)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Uma classe deve ter apenas um motivo para mudar.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine uma classe que salva usuários e também envia e-mails.&lt;br&gt;
Ela faz &lt;strong&gt;duas coisas&lt;/strong&gt; — e isso é um problema.&lt;/p&gt;
&lt;h3&gt;
  
  
  ❌ Exemplo que viola o SRP
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// salva no banco&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendWelcomeEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// envia e-mail&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Se qualquer parte falhar (e-mail, banco, regra de negócio), a classe inteira é afetada.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✔️ Exemplo seguindo o SRP
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// salva no banco&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendWelcomeEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// envia e-mail&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Cada classe tem sua responsabilidade, e o código fica muito mais claro e testável.&lt;/p&gt;


&lt;h1&gt;
  
  
  2️⃣ Open/Closed Principle (Aberto para Extensão, Fechado para Modificação)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Você deve poder adicionar novos comportamentos sem alterar código existente.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  ✔️ Exemplo com descontos
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Discount&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&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 java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NoDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Discount&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlackFridayDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Discount&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Precisa de um novo tipo de desconto?&lt;/p&gt;

&lt;p&gt;Crie uma nova classe.&lt;br&gt;
Nenhuma linha das anteriores precisa mudar.&lt;/p&gt;

&lt;p&gt;Isso é &lt;strong&gt;Open/Closed&lt;/strong&gt; na prática.&lt;/p&gt;


&lt;h1&gt;
  
  
  3️⃣ Liskov Substitution Principle (Substituição de Liskov)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Subclasses devem poder substituir suas classes base sem quebrar o comportamento esperado.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  ❌ Exemplo que quebra o princípio
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Voando..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Penguin&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;UnsupportedOperationException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pinguins não voam!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O contrato promete que &lt;strong&gt;todo pássaro voa&lt;/strong&gt;, mas o pinguim não.&lt;br&gt;
Isso quebra o comportamento esperado.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✔️ Exemplo correto
&lt;/h3&gt;

&lt;p&gt;Separando o que pode voar do que não pode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;FlyingBird&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Eagle&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FlyingBird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Penguin&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, tudo faz sentido.&lt;/p&gt;




&lt;h1&gt;
  
  
  4️⃣ Interface Segregation Principle (Segregação de Interfaces)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Nenhuma classe deve ser forçada a implementar métodos que não usa.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ❌ Exemplo errado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Robot&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// robô não come...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O robô é obrigado a implementar algo que não faz sentido para ele.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Exemplo correto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Workable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Eatable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Robot&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Workable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Human&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Workable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Eatable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interfaces menores = classes mais limpas.&lt;/p&gt;




&lt;h1&gt;
  
  
  5️⃣ Dependency Inversion Principle (Inversão de Dependência)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Dependa de abstrações, não de implementações concretas.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ❌ Exemplo errado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySQLDatabase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;MySQLDatabase&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MySQLDatabase&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O serviço está &lt;strong&gt;acoplado&lt;/strong&gt; ao MySQL.&lt;br&gt;
Se quiser trocar para Postgres, precisa alterar o código.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Exemplo correto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Database&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&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 java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySQLDatabase&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Database&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PostgresDatabase&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Database&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&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 java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Database&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Database&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, trocar o banco é só configurar outra implementação.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎯 Conclusão
&lt;/h1&gt;

&lt;p&gt;SOLID não é sobre “seguir regras”, e sim sobre &lt;strong&gt;facilitar sua vida como desenvolvedor&lt;/strong&gt;.&lt;br&gt;
Quanto mais seu sistema cresce, mais esses princípios fazem diferença.&lt;/p&gt;

&lt;p&gt;Eles ajudam a criar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;código mais limpo,&lt;/li&gt;
&lt;li&gt;classes mais coesas,&lt;/li&gt;
&lt;li&gt;responsabilidades claras,&lt;/li&gt;
&lt;li&gt;menos bugs,&lt;/li&gt;
&lt;li&gt;mais testes,&lt;/li&gt;
&lt;li&gt;e mais flexibilidade para evoluir o projeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você está trabalhando com Android, KMP ou qualquer arquitetura moderna (como MVVM), SOLID é um aliado poderoso.&lt;/p&gt;

</description>
      <category>solidprinciples</category>
      <category>java</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Padronizando Commits com Commitizen e Husky</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Tue, 01 Oct 2024 00:03:02 +0000</pubDate>
      <link>https://dev.to/devsnorte/padronizando-commits-com-commitizen-e-husky-12pl</link>
      <guid>https://dev.to/devsnorte/padronizando-commits-com-commitizen-e-husky-12pl</guid>
      <description>&lt;p&gt;Os commits bem estruturados são essenciais para manter a clareza e organização em projetos de desenvolvimento de software. Quando várias pessoas colaboram em um projeto, é crucial manter um padrão para mensagens de commit, facilitando a compreensão das alterações realizadas em um determinado momento. Neste artigo, exploraremos como padronizar commits usando as ferramentas Commitizen e Husky.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que padronizar commits?
&lt;/h2&gt;

&lt;p&gt;Padronizar commits traz uma série de benefícios para equipes de desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clareza:&lt;/strong&gt; Mensagens de commit bem estruturadas tornam mais fácil entender o propósito das alterações.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rastreabilidade:&lt;/strong&gt; Com commits padronizados, é mais simples rastrear a evolução do código ao longo do tempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilidade de Reversão:&lt;/strong&gt; Commits bem documentados facilitam a identificação de alterações específicas, tornando mais fácil reverter mudanças indesejadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração:&lt;/strong&gt; Padronizar commits promove uma melhor colaboração entre membros da equipe, pois todos seguem as mesmas convenções.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introdução ao Commitizen e Husky
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Commitizen&lt;/strong&gt; é uma ferramenta que visa facilitar a criação de commits padronizados seguindo as convenções do &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;. Ele fornece uma interface interativa para guiar os desenvolvedores na criação de mensagens de commit consistentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Husky&lt;/strong&gt;, por outro lado, é uma biblioteca que nos permite configurar ganchos (hooks) Git facilmente. Podemos usá-lo para executar scripts automatizados antes de certos eventos do Git, como &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt; e outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passos para padronizar commits com Commitizen e Husky
&lt;/h2&gt;

&lt;p&gt;Aqui estão os passos necessários para padronizar commits em seu projeto:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Instalação do Commitizen e Husky
&lt;/h3&gt;

&lt;p&gt;Certifique-se de que o Node.js esteja instalado em seu sistema. Em seguida, instale o Commitizen e Husky como dependências de desenvolvimento em seu projeto:&lt;br&gt;
&lt;/p&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;--save-dev&lt;/span&gt; commitizen husky
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configuração do Commitizen
&lt;/h3&gt;

&lt;p&gt;Depois de instalar o Commitizen, você pode configurá-lo para seu projeto executando o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx commitizen init cz-conventional-changelog &lt;span class="nt"&gt;--save-dev&lt;/span&gt; &lt;span class="nt"&gt;--save-exact&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso instalará o adaptador &lt;code&gt;cz-conventional-changelog&lt;/code&gt; e configurará o Commitizen para usar o Conventional Commits.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Configuração do Husky
&lt;/h3&gt;

&lt;p&gt;Com o Husky, podemos configurar ganchos Git para executar scripts antes de certos eventos. Para configurar o Husky, adicione o seguinte script ao seu &lt;code&gt;package.json&lt;/code&gt;:&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="nl"&gt;"husky"&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;"hooks"&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;"commit-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;"commitlint -E HUSKY_GIT_PARAMS"&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;Este script usa o &lt;code&gt;commitlint&lt;/code&gt; para verificar se a mensagem de commit está em conformidade com as convenções especificadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Adicionar Configurações de Commitlint
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;commitlint&lt;/code&gt; é uma ferramenta de validação de mensagens de commit baseada em regras. É comumente usado para garantir que as mensagens de commit sigam um formato específico. Você pode instalar o &lt;code&gt;commitlint&lt;/code&gt; e as configurações do Conventional Commits usando:&lt;br&gt;
&lt;/p&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;--save-dev&lt;/span&gt; @commitlint/&lt;span class="o"&gt;{&lt;/span&gt;config-conventional,cli&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, crie um arquivo &lt;code&gt;commitlint.config.js&lt;/code&gt; na raiz do seu projeto e adicione o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&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;@commitlint/config-conventional&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;h3&gt;
  
  
  5. Usando Commitizen para commits
&lt;/h3&gt;

&lt;p&gt;Agora que tudo está configurado, ao executar &lt;code&gt;git commit&lt;/code&gt;, você será levado a uma interface interativa fornecida pelo Commitizen para criar mensagens de commit.&lt;/p&gt;

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

&lt;p&gt;Padronizar commits é uma prática recomendada que promove clareza, rastreabilidade e colaboração em projetos de desenv&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automatizando Notificações via Telegram com GitHub Actions</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Tue, 01 Oct 2024 00:01:42 +0000</pubDate>
      <link>https://dev.to/devsnorte/automatizando-notificacoes-via-telegram-com-github-actions-2cdo</link>
      <guid>https://dev.to/devsnorte/automatizando-notificacoes-via-telegram-com-github-actions-2cdo</guid>
      <description>&lt;p&gt;O GitHub Actions é uma ferramenta poderosa que permite automatizar tarefas dentro do fluxo de trabalho de desenvolvimento. Uma aplicação útil disso é a capacidade de enviar notificações para diferentes plataformas, como o Telegram, sempre que ocorrerem eventos específicos em seus repositórios do GitHub. Neste artigo, vamos explorar como configurar e utilizar o GitHub Actions para enviar notificações via Telegram.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o GitHub Actions?
&lt;/h3&gt;

&lt;p&gt;O GitHub Actions é um serviço de automação integrado diretamente no GitHub, permitindo que você crie fluxos de trabalho personalizados para automatizar processos de desenvolvimento, desde a construção e teste até a implantação e notificação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando o Telegram Bot
&lt;/h3&gt;

&lt;p&gt;Antes de começarmos com o GitHub Actions, é necessário criar um bot no Telegram e obter seu token de acesso. Siga os passos abaixo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra o Telegram e pesquise por &lt;code&gt;BotFather&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inicie uma conversa com o &lt;code&gt;BotFather&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use o comando &lt;code&gt;/newbot&lt;/code&gt; para criar um novo bot.&lt;/li&gt;
&lt;li&gt;Siga as instruções do &lt;code&gt;BotFather&lt;/code&gt;, fornecendo um nome e um nome de usuário para o seu bot.&lt;/li&gt;
&lt;li&gt;Após a criação, o &lt;code&gt;BotFather&lt;/code&gt; irá fornecer um token de acesso para o seu bot. Mantenha esse token seguro, pois será usado posteriormente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configurando o GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Agora que temos o token do nosso bot, vamos configurar o GitHub Actions para enviar notificações para o Telegram sempre que ocorrerem eventos específicos em nosso repositório.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No seu repositório do GitHub, crie um diretório chamado &lt;code&gt;.github/workflows&lt;/code&gt; se ainda não existir.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dentro deste diretório, crie um arquivo YAML com o nome que desejar, por exemplo, &lt;code&gt;telegram-notification.yml&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adicione o seguinte conteúdo ao arquivo YAML:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Telegram Notification&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;telegram-notification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Send Telegram Notification&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/telegram-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TELEGRAM_TO }}&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TELEGRAM_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;commit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pushed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repository."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, configuramos o fluxo de trabalho para enviar uma notificação para o Telegram sempre que houver um push para a branch principal (&lt;code&gt;main&lt;/code&gt;). Você pode personalizar os eventos e as branches conforme necessário.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agora, precisamos adicionar as variáveis de ambiente &lt;code&gt;TELEGRAM_TO&lt;/code&gt; e &lt;code&gt;TELEGRAM_TOKEN&lt;/code&gt; como segredos em nosso repositório.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TELEGRAM_TO&lt;/code&gt;: Este é o ID do chat para o qual a mensagem será enviada. Você pode obter isso iniciando uma conversa com seu bot no Telegram e usando a API do Telegram para recuperar o ID do chat.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TELEGRAM_TOKEN&lt;/code&gt;: Este é o token de acesso que obtivemos anteriormente do &lt;code&gt;BotFather&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para adicionar esses segredos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navegue até as configurações do seu repositório no GitHub.&lt;/li&gt;
&lt;li&gt;Selecione "Secrets" no menu lateral.&lt;/li&gt;
&lt;li&gt;Clique em "New repository secret" e adicione as variáveis &lt;code&gt;TELEGRAM_TO&lt;/code&gt; e &lt;code&gt;TELEGRAM_TOKEN&lt;/code&gt; com seus valores correspondentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testando o Fluxo de Trabalho
&lt;/h3&gt;

&lt;p&gt;Com tudo configurado, você pode testar o fluxo de trabalho fazendo um push para a branch principal do seu repositório. Após o push, você deve receber uma notificação no Telegram informando sobre a nova alteração no repositório.&lt;/p&gt;

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

&lt;p&gt;O GitHub Actions oferece uma maneira conveniente de automatizar tarefas repetitivas, como enviar notificações para plataformas externas como o Telegram. Neste artigo, vimos como configurar o GitHub Actions para enviar notificações via Telegram sempre que ocorrerem eventos específicos em um repositório do GitHub. Essa automação pode ajudar a manter equipes informadas sobre o progresso do desenvolvimento e a agilizar o fluxo de trabalho de desenvolvimento de software.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Turbinando sua Produtividade: Autocomplete e Personalização no Terminal do Windows</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Sat, 27 Apr 2024 13:52:16 +0000</pubDate>
      <link>https://dev.to/devsnorte/turbinando-sua-produtividade-autocomplete-e-personalizacao-no-terminal-do-windows-39e9</link>
      <guid>https://dev.to/devsnorte/turbinando-sua-produtividade-autocomplete-e-personalizacao-no-terminal-do-windows-39e9</guid>
      <description>&lt;p&gt;Se você busca um terminal mais inteligente e visualmente atraente, capaz de antecipar seus comandos, reduzir a digitação repetitiva e oferecer um autocomplete eficaz, então você veio ao lugar certo! Vamos explorar como tornar o terminal do Windows uma ferramenta poderosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Windows Terminal&lt;/strong&gt;: Comece instalando o Windows Terminal através da Microsoft Store ou baixando-o diretamente no GitHub. Ele oferece uma interface moderna e suporte para múltiplos terminais, como PowerShell, Command Prompt e WSL.&lt;/li&gt;
&lt;/ul&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%2F64hyqm8wfzqul143yzxe.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%2F64hyqm8wfzqul143yzxe.png" alt="Windows Terminal" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oh My Posh&lt;/strong&gt;:
Essa é uma extensão que personaliza a aparência e o conteúdo da linha de comando. Por aqui, incluí o nome do usuário, o caminho da pasta, a branch atual, e a hora e uma experiência de terminal mais eficiente. &lt;/li&gt;
&lt;/ul&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%2Fxxpii9rcbfdep5g8avm2.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%2Fxxpii9rcbfdep5g8avm2.png" alt="Oh My Posh" width="800" height="355"&gt;&lt;/a&gt;&lt;br&gt;
Para instalar o oh-my-posh, uma das opções é usar o winget, mas você pode usar o scoop, o próprio PowerShell ou chocolatey como mostrado na &lt;a href="https://ohmyposh.dev/docs/installation/windows" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;winget install JanDeDobbeleer.OhMyPosh -s winget
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após instalar isso, o seu terminal precisa "saber" que deve usar o oh-my-posh. Para isso, vamos configurar o perfil do Powershell no VS Code. Basta executar o comando abaixo.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;se não tiver o vscode instalado pode usar no bloco de notas da seguinte maneira:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;notepad $PROFILE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse arquivo Microsoft.PowerShell_profile.ps1 que abriu é responsável  por lê e executa os comandos desse arquivo a cada vez que o PowerSell é aberto. Nele, copie e cole o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;amp; ([ScriptBlock]::Create((oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json" --print) -join "`n"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode trocar o &lt;code&gt;"$env:POSH_THEMES_PATH\jandedobbeleer.omp.json"&lt;/code&gt; pela url do seu tema. &lt;a href="https://ohmyposh.dev/docs/themes" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; você encotra diversos temas para o o Oh My Posh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salve e Recarregue o Terminal:&lt;/strong&gt;&lt;br&gt;
Salve o arquivo Microsoft.PowerShell_profile.ps1.&lt;br&gt;
Feche e abra novamente o terminal ou recarregue o perfil do PowerShell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visualize as Mudanças:&lt;/strong&gt;&lt;br&gt;
Depois de recarregar o terminal, você deve ver as melhorias na linha de comando, incluindo informações como seu nome de usuário, diretório atual, ramificação do Git e hora&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Antes de salvar meu terminal estava assim:&lt;/p&gt;
&lt;/blockquote&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%2F7frcnu4wcp6j5zlmkp6e.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%2F7frcnu4wcp6j5zlmkp6e.png" alt="Terminal Antes" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Após esse procedimento ficou assim:&lt;/p&gt;
&lt;/blockquote&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%2Fbohlluz7n7r3z7x12dar.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%2Fbohlluz7n7r3z7x12dar.png" alt="Terminal Depois" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nerd Fonts&lt;/strong&gt;:
Para que os ícones do seu terminal apareçam, o oh-my-posh precisa que você use uma fonte compatível com eles, e uma das recomendações da própria aplicação é instalar uma fonte dentre as "Nerd Fonts".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode baixar diretamente do &lt;a href="https://github.com/ryanoasis/nerd-fonts" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; deles, ou usando um comando do oh-my-posh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;oh-my-posh font install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal Icons&lt;/strong&gt;:
Essa é mais uma extensão para melhorar a aparência do terminal, acrescentando ícones do tipo de arquivo ou pasta que está na lista:&lt;/li&gt;
&lt;/ul&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%2Fk4j5s8gvo7howulp25dc.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%2Fk4j5s8gvo7howulp25dc.png" alt="Terminal Icons" width="800" height="357"&gt;&lt;/a&gt;&lt;br&gt;
Para instalar, basta rodar os seguintes comandos no seu terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Module -Name Terminal-Icons -Repository PSGallery -Force
Import-Module Terminal-Icons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A cada vez que você abrir seu terminal, para ver o terminal Icons em funcionamento, você precisaria rodar novamente o comando &lt;code&gt;Import-Module Terminal-Icons&lt;/code&gt;. Para que isso não seja necessário, basta acrescentar esse comando no arquivo de perfil do Powershell. (Lembra como faz isso? -&amp;gt; &lt;code&gt;code $PROFILE&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Melhorias de Produtividade com Autocomplete
&lt;/h2&gt;

&lt;p&gt;Agora, vamos falar sobre algumas extensões que são super úteis para facilitar o seu trabalho diário, especialmente quando estiver navegando entre as pastas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Z&lt;/strong&gt;:
Esta é uma extensão de intellisense que consegue aprender com a forma como você navega entre as pastas. Isso significa que você não precisa mais digitar o caminho completo toda vez que quiser acessar uma pasta específica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como é um intellisense, o Z precisa de algumas navegações entre as pastas para "aprender" quais você acessa com mais frequência.&lt;br&gt;
use assim: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na primeira vez que usar use o nome da pasta completo. Como ex:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z crypto-trends
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na segunda vez em diante, você só precisa digitar parte do nome da pasta, e o Z já identificará a pasta desejada. Por exemplo, se você digitou "z crypto" anteriormente, na próxima vez pode digitar apenas:&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%2Fe676u76pazirgik2bv9a.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%2Fe676u76pazirgik2bv9a.png" alt="Z" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PSReadLine&lt;/strong&gt;
O PSReadLine é um módulo do Powershell que permite o autocomplete de uma forma inteligente, também. Algumas configurações interessantes podem ser usadas para visualizar e navegar pelo histórico de comandos similares ao que você está digitando:&lt;/li&gt;
&lt;/ul&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%2Fqqoqcflt9r55sub53m39.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%2Fqqoqcflt9r55sub53m39.png" alt="PSReadLine" width="800" height="414"&gt;&lt;/a&gt;&lt;br&gt;
Para instalar, o comando é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Module -Name PSReadLine -AllowPrerelease -Force -SkipPublisherCheck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gora, para garantir que as opções de autocomplete apareçam como mostrado na imagem anterior, vamos adicionar alguns comandos ao seu perfil do PowerShell (aquele &lt;code&gt;code $PROFILE&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;Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Posh git&lt;/strong&gt;
O posh-git será seu novo melhor amigo. Com autocomplete para comandos do Git, você pode navegar entre branches e commits com facilidade, economizando tempo e esforço. Um simples "tab" após digitar git checkout, por exemplo, faz com que apareçam todas as opções de branches existentes no projeto.&lt;/li&gt;
&lt;/ul&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%2Fzdokcwpx2m9vpt7ub7xk.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%2Fzdokcwpx2m9vpt7ub7xk.png" alt="Posh git" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para usar, basta rodar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Module posh-git -Scope CurrentUser -Force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aliases Personalizados&lt;/strong&gt;: Crie aliases para comandos frequentemente usados e aproveite o autocomplete para acessá-los rapidamente. Por exemplo:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-Alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj6zsuw5dhk2c6gqi9bax.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%2Fj6zsuw5dhk2c6gqi9bax.png" alt="Aliases Personalizados" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segue abaixo o meu arquivo de perfil do PowerShell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Import-Module oh-my-posh ecarregar tema
&amp;amp; ([ScriptBlock]::Create((oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json" --print) -join "`n"))
#Import-Module de Icones do terminal
Import-Module Terminal-Icons

#import do autocomplete por historico
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView

# import do autocomplete do git
Import-Module Posh-Git

#Uso o  para não ficar poluido o terminal
clear-host

#Alias do git, não ter que digitar git no lugar só coloco g
Set-Alias g git

#Alias do chocolatey(Só use se tiver o chocolatey)
function Install-Choco {
    choco install $args
}

Set-Alias install Install-Choco
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Atalhos do Terminal
&lt;/h2&gt;

&lt;p&gt;Aqui estão alguns atalhos úteis para agilizar sua interação com o terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + t&lt;/strong&gt;: Criar uma nova aba no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Tab&lt;/strong&gt;: Alternar entre as abas no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Shift + -&lt;/strong&gt;: Criar um pane na horizontal no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Shift + +&lt;/strong&gt;: Criar um pane na vertical no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + w&lt;/strong&gt;: Remover um pane no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + seta&lt;/strong&gt;: Navegar entre os panes no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + seta&lt;/strong&gt;: Navegar entre as posições dentro de um pane no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alt + Shift + seta&lt;/strong&gt;: Redimensionar panes no Windows Terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F11&lt;/strong&gt;: Alternar entre o modo fullscreen e o modo normal no Windows Terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses atalhos podem variar de acordo com a configuração do seu sistema ou outras extensões instaladas. Certifique-se de consultar a documentação do Windows Terminal para obter a lista completa de atalhos e funcionalidades.&lt;/p&gt;

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

&lt;p&gt;Ao adotar as ferramentas e técnicas apresentadas, você não apenas transforma sua experiência de linha de comando, mas também eleva sua produtividade e eficiência a novos patamares. O Windows Terminal não é apenas uma janela para seus sistemas; é uma porta de entrada para um universo de possibilidades.&lt;/p&gt;

&lt;p&gt;Personalizando sua linha de comando com o Oh My Posh, Nerd Fonts e Terminal Icons, você não apenas torna sua interação mais visualmente atraente, mas também mais informativa e funcional. A navegação rápida entre pastas com o Z, o autocomplete inteligente do PSReadLine e a facilidade de uso do posh-git simplificam suas tarefas diárias e liberam tempo para o que realmente importa: sua criatividade e inovação.&lt;/p&gt;

&lt;p&gt;Portanto, mergulhe fundo, experimente, personalize e descubra como o terminal no Windows pode se tornar seu aliado mais poderoso. Combinando estilo, funcionalidade e eficiência, você está pronto para enfrentar qualquer desafio, abrir caminhos e alcançar novos horizontes em sua jornada digital.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://dev.to/danicaus/personalizando-o-windows-terminal-50ca"&gt;Personalizando o terminal&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/powershell/module/psreadline/?view=powershell-7.2" rel="noopener noreferrer"&gt;Documentação do PSReadLine&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ohmyposh.dev/docs" rel="noopener noreferrer"&gt;Documentação do OhMyPosh&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.reddit.com/r/chocolatey/comments/1c4lif8/how_to_create_aliases/?rdt=38201" rel="noopener noreferrer"&gt;Alias do chocolatey&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/ryanoasis/nerd-fonts" rel="noopener noreferrer"&gt;Documentação do NerdFonts&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.manualdocodigo.com.br/windows-terminal/#:~:text=Seja%20mais%20PRODUTIVO.%201%20Introdu%C3%A7%C3%A3o%20Neste%20artigo%20mostrarei,Appearance%20...%208%20Color%20schemes%20...%20More%20items" rel="noopener noreferrer"&gt;Atalhos do Terminal&lt;/a&gt;&lt;/p&gt;

</description>
      <category>windowns</category>
      <category>terminal</category>
      <category>produtividade</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dominando os Desafios da Programação: Um Guia para os Erros Léxicos, Sintáticos e Semânticos</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Sun, 21 Apr 2024 15:12:16 +0000</pubDate>
      <link>https://dev.to/devsnorte/dominando-os-desafios-da-programacao-um-guia-para-os-erros-lexicos-sintaticos-e-semanticos-n3g</link>
      <guid>https://dev.to/devsnorte/dominando-os-desafios-da-programacao-um-guia-para-os-erros-lexicos-sintaticos-e-semanticos-n3g</guid>
      <description>&lt;p&gt;Na jornada rumo à excelência na programação, enfrentamos uma série de desafios que testam nossa habilidade e perseverança. Entre estes desafios, destacam-se os erros léxicos, sintáticos e semânticos - obstáculos que podem comprometer a integridade e eficácia do código. Neste guia, vamos explorar esses erros em detalhes e discutir estratégias para identificá-los e corrigi-los de forma eficaz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros Léxicos: Precisão na Linguagem da Programação
&lt;/h2&gt;

&lt;p&gt;Os erros léxicos são como imperfeições na gramática de um idioma - pequenas discrepâncias que podem alterar completamente o significado de uma sentença. Na programação, essas imperfeições se manifestam quando palavras-chave são mal escritas ou símbolos são utilizados de forma inadequada. Considere o seguinte exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If x == 5:       # A primeira letra de "if" deveria estar minúscula
    print("Hello World")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste código, o erro léxico reside na letra maiúscula em "If", que deveria ser "if".&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros Sintáticos: A Importância da Estruturação Correta
&lt;/h2&gt;

&lt;p&gt;A sintaxe é a estrutura que define a gramática de uma linguagem de programação. Erros sintáticos ocorrem quando essa estruturação é violada, resultando em código que não pode ser interpretado corretamente pelo compilador ou interpretador. Considere o seguinte exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print "Erro de sintaxe")  # Esqueceu de colocar os parênteses para a função print
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ausência do ponto e vírgula no final da linha resulta em um erro sintático.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros Semânticos: Alinhando Intenção e Resultado
&lt;/h2&gt;

&lt;p&gt;Embora o código possa estar gramaticalmente correto, ainda pode falhar em cumprir sua intenção original devido a erros semânticos. Esses erros ocorrem quando há uma discrepância entre a interpretação do programador e o comportamento real do programa. Considere o seguinte exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def media(lista):
    soma = 0
    for num in lista:
        soma += num
    return soma / len(lista)

lista = []
media(lista)     # Vai gerar uma exceção por tentar dividir por zero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A tentativa de calcular a média de uma lista vazia resulta em uma divisão por zero, um erro semântico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Navegando com Precisão no Oceano da Programação
&lt;/h2&gt;

&lt;p&gt;Identificar e corrigir erros em programação é uma habilidade essencial para qualquer desenvolvedor. Os erros léxicos, sintáticos e semânticos representam desafios significativos, mas compreendê-los nos capacita a enfrentá-los com confiança e eficácia. Que este guia sirva como uma ferramenta valiosa em sua jornada de desenvolvimento, ajudando-o a navegar com precisão no vasto oceano da programação.&lt;/p&gt;

</description>
      <category>erros</category>
      <category>programming</category>
      <category>code</category>
    </item>
    <item>
      <title>Desenvolvendo um Bot do Telegram em Golang para Buscar Eventos da Comunidade Devs Norte no Sympla</title>
      <dc:creator>Edson Costa</dc:creator>
      <pubDate>Sun, 21 Apr 2024 15:03:46 +0000</pubDate>
      <link>https://dev.to/devsnorte/desenvolvendo-um-bot-do-telegram-em-golang-para-buscar-eventos-da-comunidade-devs-norte-no-sympla-1j21</link>
      <guid>https://dev.to/devsnorte/desenvolvendo-um-bot-do-telegram-em-golang-para-buscar-eventos-da-comunidade-devs-norte-no-sympla-1j21</guid>
      <description>&lt;p&gt;Este é um guia de como cria um bot para Telegram capaz de buscar e exibir eventos da Comunidade Devs Norte através da plataforma Sympla. Vamos mergulhar no processo de desenvolvimento passo a passo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos, assegure-se de ter o Go instalado em seu sistema. Além disso, será necessário ter uma no Telegram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: Configuração do Ambiente
&lt;/h2&gt;

&lt;p&gt;Crie um novo diretório para o seu projeto&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%2Fgr74lo12uyqxaon2mrbx.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%2Fgr74lo12uyqxaon2mrbx.png" alt="Cria e entrar na pasta" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;inicialize um módulo Go usando o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go mod init nome-do-seu-projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certifique-se de ter as dependências necessárias instaladas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/joho/godotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/mymmrac/telego

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 2: Configuração do Token
&lt;/h2&gt;

&lt;p&gt;Agora, você precisa obter um token de autenticação do bot do Telegram para interagir com a API do Telegram. Siga estas etapas para obter o token:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o &lt;a href="https://t.me/botfather" rel="noopener noreferrer"&gt;BotFather &lt;/a&gt; no Telegram.&lt;/li&gt;
&lt;li&gt;Siga as instruções para criar um novo bot. Envie o comando &lt;code&gt;/newbot&lt;/code&gt; e siga as instruções para fornecer um nome e um username para o seu bot.&lt;/li&gt;
&lt;li&gt;Após concluir o processo de criação do bot, o &lt;a href="https://t.me/botfather" rel="noopener noreferrer"&gt;BotFather &lt;/a&gt; irá fornecer um token de acesso para o seu bot.&lt;/li&gt;
&lt;li&gt;Agora, crie um arquivo chamado .env no mesmo diretório do seu código e adicione o token como uma variável de ambiente.
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;p&gt;Substitua seu_token_aqui pelo token fornecido pelo BotFather.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 3: Escrevendo o Código
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Crie um arquivo main.go e coloque nele:&lt;/li&gt;
&lt;li&gt;Importações das bibliotecas necessárias.&lt;/li&gt;
&lt;li&gt;Definição das estruturas de dados necessárias para lidar com a resposta da API do Sympla.&lt;/li&gt;
&lt;li&gt;Implementação da função NewBot para criar uma nova instância do bot do Telegram.&lt;/li&gt;
&lt;li&gt;Implementação do método Start para iniciar o bot.&lt;/li&gt;
&lt;li&gt;Implementação dos métodos para registrar os comandos do bot e lidar com eventos relacionados a eventos disponíveis e encerrados.&lt;/li&gt;
&lt;li&gt;Implementação da função fetchSymplaEvents para fazer requisições à API do Sympla e obter eventos futuros ou passados.&lt;/li&gt;
&lt;li&gt;Implementação da função intArrayToString para converter uma lista de inteiros em uma string.&lt;/li&gt;
&lt;li&gt;Implementação da função formatEventsMessage para formatar a 9ensagem a ser enviada ao usuário com base nos eventos encontrados.&lt;/li&gt;
&lt;li&gt;Função main que carrega as variáveis de ambiente, cria uma instância do bot e inicia sua execução.&lt;/li&gt;
&lt;/ol&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
    "strings"

    "github.com/joho/godotenv"
    "github.com/mymmrac/telego"
    th "github.com/mymmrac/telego/telegohandler"
    tu "github.com/mymmrac/telego/telegoutil"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;package main&lt;/code&gt;: Define que este arquivo faz parte do pacote principal do programa.&lt;br&gt;
&lt;code&gt;Importações&lt;/code&gt;: Importamos as bibliotecas necessárias para o funcionamento do bot, incluindo godotenv para lidar com variáveis de ambiente, telego para interagir com a API do Telegram e telegohandler e telegoutil para lidar com os eventos e mensagens do Telegram.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Bot struct {
    bot   *telego.Bot
    bh    *th.BotHandler
    token string
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Bot&lt;/code&gt;: Definimos uma estrutura &lt;code&gt;Bot&lt;/code&gt; que contém o bot do Telegram, o manipulador de bot e o token de autenticação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type SymplaResponse struct {
    Data []Event `json:"data"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SymplaResponse&lt;/code&gt;: Define uma estrutura para armazenar a resposta da API do Sympla.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Location struct {
    Country      string  `json:"country"`
    Address      string  `json:"address"`
    AddressAlt   string  `json:"address_alt"`
    City         string  `json:"city"`
    AddressNum   string  `json:"address_num"`
    Name         string  `json:"name"`
    Longitude    float64 `json:"lon"`
    State        string  `json:"state"`
    Neighborhood string  `json:"neighborhood"`
    ZipCode      string  `json:"zip_code"`
    Latitude     float64 `json:"lat"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Location&lt;/code&gt;: Define uma estrutura para armazenar informações sobre a localização de um evento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Images struct {
    Original string `json:"original"`
    XS       string `json:"xs"`
    LG       string `json:"lg"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Images&lt;/code&gt;: Define uma estrutura para armazenar URLs de imagens relacionadas a um evento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type StartDateFormats struct {
    Pt string `json:"pt"`
    En string `json:"en"`
    Es string `json:"es"`
}
type EndDateFormats struct {
    Pt string `json:"pt"`
    En string `json:"en"`
    Es string `json:"es"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;StartDateFormats&lt;/code&gt; e &lt;code&gt;EndDateFormats&lt;/code&gt;: Definem estruturas para armazenar formatos de data de início e fim de um evento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Event struct {
    Name             string           `json:"name"`
    Images           Images           `json:"images"`
    Location         Location         `json:"location"`
    StartDateFormats StartDateFormats `json:"start_date_formats"`
    EndDateFormats   EndDateFormats   `json:"end_date_formats"`
    URL              string           `json:"url"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Event&lt;/code&gt;: Define uma estrutura para representar um evento, incluindo seu nome, imagens, localização, datas e URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func NewBot(token string) (*Bot, error) {
    bot, err := telego.NewBot(token, telego.WithDefaultDebugLogger())
    if err != nil {
        return nil, err
    }

    updates, err := bot.UpdatesViaLongPolling(nil)
    if err != nil {
        return nil, err
    }

    bh, err := th.NewBotHandler(bot, updates)
    if err != nil {
        return nil, err
    }

    return &amp;amp;Bot{
        bot:   bot,
        bh:    bh,
        token: token,
    }, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;NewBot&lt;/code&gt;: Esta função cria uma nova instância do bot do Telegram, configura os manipuladores de atualização e retorna uma estrutura Bot inicializada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) Start() {
    defer b.bh.Stop()
    defer b.bot.StopLongPolling()

    b.registerCommands()

    b.bh.Start()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Start&lt;/code&gt;: Método que inicia o bot. Ele registra os comandos e inicia o manipulador de bot para receber atualizações do Telegram.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) registerCommands() {
    b.registerBotCommand()
    b.registerEventCommands()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;registerCommands&lt;/code&gt;: Método que registra todos os comandos disponíveis do bot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) registerBotCommand() {
    b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
        infoMessage := `
👋 Bem-vindo ao Bot da Comunidade Devs Norte! 🚀

Este bot está aqui para ajudá-lo a encontrar os eventos mais recentes e emocionantes hospedados no Sympla pela nossa comunidade.

Para consultar os eventos disponíveis, basta digitar /disponiveis. E se estiver interessado nos eventos que já passaram, digite /encerrados.

Fique à vontade para explorar e participar dos eventos que mais lhe interessarem!😊
`

        _, _ = bot.SendMessage(tu.Message(
            tu.ID(update.Message.Chat.ID),
            infoMessage,
        ))
    }, th.CommandEqual("start"))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;registerBotCommand&lt;/code&gt;: Método que registra o comando &lt;code&gt;/start&lt;/code&gt;, que envia uma mensagem de boas-vindas ao usuário quando o bot é iniciado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) registerEventCommands() {
    b.registerAvailableEventsCommand()
    b.registerClosedEventsCommand()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;registerEventCommands&lt;/code&gt;: Método que registra os comandos relacionados aos eventos disponíveis e encerrados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) registerAvailableEventsCommand() {
    b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
        events, err := fetchSymplaEvents("future")
        if err != nil {
            fmt.Println("Erro ao buscar eventos:", err)
            return
        }
        message := formatEventsMessage(events)
        _, _ = bot.SendMessage(tu.Message(
            tu.ID(update.Message.Chat.ID),
            message,
        ))
    }, th.CommandEqual("disponíveis"))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;registerAvailableEventsCommand: Método que registra o comando &lt;code&gt;/disponiveis&lt;/code&gt;, que busca e exibe eventos futuros.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func (b *Bot) registerClosedEventsCommand() {
    b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
        events, err := fetchSymplaEvents("past")
        if err != nil {
            fmt.Println("Erro ao buscar eventos:", err)
            return
        }
        message := formatEventsMessage(events)
        _, _ = bot.SendMessage(tu.Message(
            tu.ID(update.Message.Chat.ID),
            message,
        ))
    }, th.CommandEqual("encerrados"))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;registerClosedEventsCommand&lt;/code&gt;: Método que registra o comando &lt;code&gt;/encerrados&lt;/code&gt;, que busca e exibe eventos passados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func fetchSymplaEvents(eventType string) ([]Event, error) {
    // Define os IDs dos organizadores
    organizerIDs := []int{3125215, 5478152}

    // Define o serviço a ser chamado na API do Sympla com base no tipo de evento
    service := "/v4/search"
    if eventType == "past" {
        service = "/v4/events/past"
    }

    // Monta o corpo da requisição
    requestBody := fmt.Sprintf(`{
        "service": "%s",
        "params": {
            "only": "name,images,location,start_date_formats,end_date_formats,url",
            "organizer_id": %s,
            "sort": "date",
            "order_by": "desc",
            "limit": "6",
            "page": 1
        },
        "ignoreLocation": true
    }`, service, intArrayToString(organizerIDs))

    // Faz a requisição HTTP para a API do Sympla
    resp, err := http.Post("https://www.sympla.com.br/api/v1/search", "application/json", strings.NewReader(requestBody))
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    // Lê a resposta da requisição
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }

    // Decodifica a resposta JSON em uma estrutura SymplaResponse
    var symplaResp SymplaResponse
    if err := json.NewDecoder(bytes.NewReader(body)).Decode(&amp;amp;symplaResp); err != nil {
        return nil, err
    }

    // Retorna os eventos encontrados na resposta
    return symplaResp.Data, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fetchSymplaEvents&lt;/code&gt;: Esta função faz uma requisição para a API do Sympla para buscar eventos, com base no tipo de evento (futuro ou passado), e retorna uma lista de eventos encontrados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func intArrayToString(arr []int) string {
    strArr := make([]string, len(arr))
    for i, num := range arr {
        strArr[i] = fmt.Sprint(num)
    }
    return "[" + strings. Join(strArr, ",") + "]"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;intArrayToString&lt;/code&gt;: Esta função converte uma lista de inteiros em uma string formatada para ser usada na construção do corpo da requisição para a API do Sympla.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func formatEventsMessage(events []Event) string {
    message := "#BOT Devs Norte 🤖\n\n\n"
    if events == nil || len(events) == 0 {
        message += "Ops... Nem um evento disponivel no momento, mas não fique triste logo estaremos fazendo mais eventos! 🥺\n\n\n"
    } else {
        message += "🎉 Eventos: 🎉\n\n\n"
        for _, event := range events {
            message += fmt.Sprintf("- %s\n  Local: %s\n  Data: %s\n  URL: %s\n \n\n\n", event. Name, event.Location.City, event.StartDateFormats.Pt, event.URL)
            message += "----------------------------------------\n\n\n"
        }
    }
    return message
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;formatEventsMessage&lt;/code&gt;: Esta função formata uma mensagem a ser enviada ao usuário com base nos eventos encontrados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func main() {
    // Carrega as variáveis de ambiente do arquivo .env
    if err := godotenv.Load(); err != nil {
        fmt.Println("Erro ao carregar o arquivo .env:", err)
        os.Exit(1)
    }

    // Obtém o token do bot do Telegram das variáveis de ambiente
    token := os.Getenv("TELEGRAM_BOT_TOKEN")
    if token == "" {
        fmt.Println("Token do bot do Telegram não fornecido")
        os.Exit(1)
    }

    // Cria uma nova instância do bot e inicia sua execução
    bot, err := NewBot(token)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    bot.Start()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;main&lt;/code&gt;: A função main é o ponto de entrada do programa. Ela carrega as variáveis de ambiente do arquivo .env, obtém o token do bot do Telegram, cria uma instância do bot e inicia sua execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 5: Executar o Código
&lt;/h2&gt;

&lt;p&gt;No diretório do projeto.&lt;br&gt;
execute o código Go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go run main. Go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso iniciará o bot do Telegram. Agora você pode acessar o bot no Telegram e interagir com ele usando os comandos &lt;code&gt;/start&lt;/code&gt;, &lt;code&gt;/disponiveis&lt;/code&gt; e &lt;code&gt;/encerrados&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fptheaobbikprrbh8wqza.jpg" 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%2Fptheaobbikprrbh8wqza.jpg" alt="Bot no Telegram" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode encontrar o código completo do projeto no repositório GitHub &lt;a href="https://github.com/ecsistem/bot-telegram-devs-norte" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero que essa explicação detalhada ajude a entender como o código funciona e como cada parte contribui para o funcionamento do bot do Telegram. Se tiver mais alguma dúvida ou precisar de mais alguma explicação, estou à disposição!&lt;/p&gt;

</description>
      <category>go</category>
      <category>bot</category>
      <category>programacao</category>
      <category>devsnorte</category>
    </item>
  </channel>
</rss>
