<?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: Fernanda</title>
    <description>The latest articles on DEV Community by Fernanda (@bussularf).</description>
    <link>https://dev.to/bussularf</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%2F829366%2F7d692507-8de5-416b-ba41-c42ee9c93ab6.jpeg</url>
      <title>DEV Community: Fernanda</title>
      <link>https://dev.to/bussularf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bussularf"/>
    <language>en</language>
    <item>
      <title>Frações: Multiplicação e Divisão</title>
      <dc:creator>Fernanda</dc:creator>
      <pubDate>Tue, 12 Aug 2025 07:31:35 +0000</pubDate>
      <link>https://dev.to/bussularf/fracoes-multiplicacao-e-divisao-1g90</link>
      <guid>https://dev.to/bussularf/fracoes-multiplicacao-e-divisao-1g90</guid>
      <description>&lt;p&gt;Na minha &lt;a href="https://dev.to/bussularf/fracoes-1pfn"&gt;postagem anterior&lt;/a&gt; falamos sobre soma e subtração de fração, hoje o assunto vai ser ✨✨multiplicação e divisão✨✨ &lt;/p&gt;

&lt;p&gt;Na &lt;strong&gt;multiplicação&lt;/strong&gt; de fração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;multiplicamos &lt;strong&gt;numerador com numerador&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;multiplicamos &lt;strong&gt;denominador com denominador&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;buscamos o menor divisor comum, para simplificar até chegar na &lt;strong&gt;fração irredutível&lt;/strong&gt;, ou seja, onde não haja nenhum divisor comum que não seja o 1.&lt;/p&gt;&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%2Fsgyqsbfduur7sid5yjnw.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%2Fsgyqsbfduur7sid5yjnw.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na &lt;strong&gt;divisão&lt;/strong&gt; de fração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;mantemos a primeira fração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;invertemos a segunda e mudamos o sinalda operação para multiplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repetimos os passos da multiplicação:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;multiplicamos &lt;strong&gt;numerador com numerador&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;multiplicamos &lt;strong&gt;denominador com denominador&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;buscamos o menor divisor comum, para simplificar até chegar na &lt;strong&gt;fração irredutível&lt;/strong&gt;.&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%2F2cv9cju2sbxkm4jqaghb.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%2F2cv9cju2sbxkm4jqaghb.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Frações: Soma e Subtração</title>
      <dc:creator>Fernanda</dc:creator>
      <pubDate>Tue, 12 Aug 2025 05:18:38 +0000</pubDate>
      <link>https://dev.to/bussularf/fracoes-1pfn</link>
      <guid>https://dev.to/bussularf/fracoes-1pfn</guid>
      <description>&lt;p&gt;Ainda seguindo a linha do meu &lt;a href="https://dev.to/bussularf/conjuntos-numericos-199d"&gt;ultimo post sobre conjuntos&lt;/a&gt;, hoje vamos falar sobre ✨✨frações✨✨ &lt;/p&gt;

&lt;p&gt;Na matemática, uma &lt;strong&gt;fração&lt;/strong&gt; representa uma parte de um todo ou uma divisão de quantidades.&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%2F8f75mcjo80mbba12pgpy.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%2F8f75mcjo80mbba12pgpy.png" alt=" " width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Números racionais&lt;/strong&gt; são todos os números que podem ser escritos como uma &lt;strong&gt;fração&lt;/strong&gt;, ou seja, uma &lt;strong&gt;razão entre dois números inteiros&lt;/strong&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%2Fie5woas32x2vkzpmwkku.webp" 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%2Fie5woas32x2vkzpmwkku.webp" alt=" " width="542" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Frações equivalentes&lt;/strong&gt; são frações diferentes que representam a mesma quantidade ou o mesmo valor. &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%2Fp2xcuigdhvz4jrf745gh.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%2Fp2xcuigdhvz4jrf745gh.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No caso de &lt;strong&gt;soma&lt;/strong&gt; e &lt;strong&gt;subtração&lt;/strong&gt; de fração, sempre usamos &lt;strong&gt;m.m.c&lt;/strong&gt;, quando não há um menor multiplo comum que não seja 1, usamos como m.m.c o resultado do produto dos denominadores.&lt;/p&gt;

&lt;p&gt;Agora vamos tentar visualizar isso num problema real. &lt;/p&gt;

&lt;p&gt;Imagine que você tem uma fazenda que possui tres tipos de áreas: &lt;strong&gt;cultivável&lt;/strong&gt;, &lt;strong&gt;improdutiva&lt;/strong&gt; e de &lt;strong&gt;preservação&lt;/strong&gt;. &lt;br&gt;
Sabemos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a área &lt;strong&gt;cultivável&lt;/strong&gt; representa 3/8 da fazenda.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a área &lt;strong&gt;improdutiva&lt;/strong&gt; representa 1/5 da fazenda.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Precisamos descobrir qual é a área de &lt;strong&gt;preservação&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Primeiro vamos somar a área cultivável com a área improdutiva. &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%2Fvjesuav40t1cvoo4p80n.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%2Fvjesuav40t1cvoo4p80n.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos descobrir a área de preservação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;primeiro vamos trabalhar com 1 inteiro menos a fração equivalente (23/40).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sabemos que 1 representa o &lt;strong&gt;inteiro&lt;/strong&gt;, ou seja toda a área da sua fazenda. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sabemos também que se dividirmos a fazenda em 40 partes e considerarmos as 40 partes, 1 vai equivaler a 40/40, ou seja 40/40 também representa toda a area da sua fazenda. Descobrimos esse valor ao fazer o m.m.c da area cultivavel mais a área improdutiva. &lt;/p&gt;&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%2Fx8ajhx1i1vma0q317ixo.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%2Fx8ajhx1i1vma0q317ixo.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E descobrimos  area de preservação. sendo um total de &lt;strong&gt;17/40&lt;/strong&gt; (lê-se &lt;strong&gt;dezessete quarenta avos&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E não se esqueça:&lt;/strong&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%2Fdhz8wzol3wxiimxv0s79.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%2Fdhz8wzol3wxiimxv0s79.jpg" alt=" " width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Conjuntos numéricos</title>
      <dc:creator>Fernanda</dc:creator>
      <pubDate>Tue, 12 Aug 2025 04:59:24 +0000</pubDate>
      <link>https://dev.to/bussularf/conjuntos-numericos-199d</link>
      <guid>https://dev.to/bussularf/conjuntos-numericos-199d</guid>
      <description>&lt;p&gt;Os ✨✨conjuntos numéricos✨✨ são uma maneira de classificar os números de acordo com as suas características.&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%2F7giz2axnxny8vyg6ye2h.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%2F7giz2axnxny8vyg6ye2h.jpg" alt=" " width="720" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os principais conjuntos são: naturais, inteiros, racionais, irracionais e reais.&lt;/p&gt;

&lt;p&gt;Ainda temos o conjunto de números complexos, mas esses números são menos usados no dia-a-dia.&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%2Fyxb317qurovzol42foss.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%2Fyxb317qurovzol42foss.png" alt=" " width="524" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conjunto dos &lt;strong&gt;números naturais&lt;/strong&gt; é composto pelo zero e números positivos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℕ&lt;/strong&gt; = {0,1,2,...}&lt;/p&gt;

&lt;p&gt;Conjunto dos &lt;strong&gt;números inteiros&lt;/strong&gt; inclui os numeros negativos e o conjunto dos números naturais (N).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℤ&lt;/strong&gt; = {...,-3, -2, -1, 0, ...}&lt;/p&gt;

&lt;p&gt;Conjunto dos &lt;strong&gt;números racionais&lt;/strong&gt; engloba as frações juntamente com o conjunto dos números inteiros (ℤ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℚ&lt;/strong&gt; = { p/q, onde &lt;strong&gt;p&lt;/strong&gt; ∈ &lt;strong&gt;q&lt;/strong&gt; e &lt;strong&gt;q&lt;/strong&gt; ∈ &lt;strong&gt;ℤ&lt;/strong&gt;}&lt;/p&gt;

&lt;p&gt;Conjunto dos &lt;strong&gt;números reais&lt;/strong&gt; engloba o número π, dizimas periódicas não periódicas, raiz quadrada, ou seja: &lt;strong&gt;números irracionais&lt;/strong&gt; (&lt;strong&gt;𝕀&lt;/strong&gt;) e todo o conjunto dos números racionais (ℚ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℝ&lt;/strong&gt; = {π, ∛5, 1/2, ...}&lt;/p&gt;

&lt;p&gt;Conjunto dos &lt;strong&gt;números complexos&lt;/strong&gt;, engloba todos os números do conjunto dos reais (ℝ), mais a unidade imaginária (i), que significa a √-1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i = √-1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dizemos que os número complexos são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℂ&lt;/strong&gt; = a + bi&lt;/p&gt;

&lt;p&gt;Onde &lt;strong&gt;a&lt;/strong&gt; é um número real e &lt;strong&gt;b&lt;/strong&gt; também, porém b é multiplicado pela unidade imaginária (i). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℂ&lt;/strong&gt; = {3+5i, -2+i, ...}&lt;/p&gt;

&lt;p&gt;Para declarar um &lt;strong&gt;conjunto sem a presença do número zero&lt;/strong&gt;, basta usar um * ao lado da letra que define o conjunto.&lt;/p&gt;

&lt;p&gt;Ex.: ℕ* = {1, 2, 3,...}, ou seja, ℕ é igual a todos os números positivos menos o zero.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Criando um Sistema de Envio de Emails com Rails e Sidekiq: Um Guia Prático</title>
      <dc:creator>Fernanda</dc:creator>
      <pubDate>Tue, 24 Sep 2024 06:36:21 +0000</pubDate>
      <link>https://dev.to/bussularf/criando-um-sistema-de-envio-de-emails-com-rails-e-sidekiq-um-guia-pratico-3450</link>
      <guid>https://dev.to/bussularf/criando-um-sistema-de-envio-de-emails-com-rails-e-sidekiq-um-guia-pratico-3450</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br&gt;
Neste artigo, vou mostrar como criar um sistema de envio de emails em uma aplicação Ruby on Rails utilizando Sidekiq para processamento de background jobs. Vou detalhar o processo passo a passo, desde a configuração inicial até a implementação e testes. Também discutirei possíveis casos de uso para este sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objetivos do Projeto&lt;/strong&gt;&lt;br&gt;
Nosso objetivo é construir uma funcionalidade que permita ao usuário enviar emails a partir da nossa aplicação Rails. Utilizaremos Sidekiq para processar o envio de emails em segundo plano e Letter Opener ou MailCatcher para visualizar os emails enviados durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repositório:&lt;/strong&gt; &lt;a href="https://github.com/bussularf/sidekiq-project" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuração do Ambiente&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instalação do Sidekiq:&lt;/strong&gt;&lt;br&gt;
Primeiro, adicionamos a gem sidekiq ao nosso Gemfile e configuramos o Redis como nosso backend para o Sidekiq.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuração do Mailer:&lt;/strong&gt;&lt;br&gt;
Configuramos o ActionMailer para usar SMTP com MailCatcher, uma ferramenta para visualizar emails enviados em ambiente de desenvolvimento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criação do Job:&lt;/strong&gt;&lt;br&gt;
Implementamos um job de background que envia o email usando o Sidekiq.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criação do Formulário de Envio:&lt;/strong&gt;&lt;br&gt;
Implementamos um formulário simples para enviar emails.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Passos Detalhados&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instalação e Configuração do Sidekiq
Adicione a &lt;code&gt;gem sidekiq&lt;/code&gt; ao seu &lt;code&gt;Gemfile&lt;/code&gt; e execute &lt;code&gt;bundle install&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configure o Sidekiq e Redis em &lt;code&gt;config/application.rb&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;config.active_job.queue_adapter = :sidekiq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configuração do Mailer
No &lt;code&gt;config/environments/development.rb&lt;/code&gt;, configure o ActionMailer para usar MailCatcher:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: 'localhost',
  port: 1025
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criando o Job
Crie um job para enviar o email:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SendReportJob &amp;lt; ApplicationJob
  queue_as :default

  def perform(user, subject, body)
    ReportMailer.send_report(user, subject, body).deliver_now
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Implementação do Mailer
Crie um mailer para enviar o email:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ReportMailer &amp;lt; ApplicationMailer
  def send_report(user, subject, body)
    @user = user
    @body = body

    mail(
      to: @user.email,
      subject: subject
    ) do |format|
      format.text { render plain: @body }
    end
  end
end

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Criando o Formulário
No arquivo app/views/emails/new.html.erb, adicione o formulário para enviar o email:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="container mt-5"&amp;gt;
  &amp;lt;h1 class="mb-4"&amp;gt;Enviar E-mail&amp;lt;/h1&amp;gt;
  &amp;lt;div class="form-group"&amp;gt;

  &amp;lt;%= form_with url: send_email_path, local: true, class: "needs-validation" do |form| %&amp;gt;
    &amp;lt;div class="mb-3"&amp;gt;
      &amp;lt;%= form.label :user_id, "Selecione um usuário:", class: "form-label" %&amp;gt;
      &amp;lt;%= form.collection_select :user_id, User.all, :id, :name, { prompt: "Escolha um usuário" }, { class: "form-select" } %&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="mb-3"&amp;gt;
      &amp;lt;%= form.label :subject, "Assunto:", class: "form-label" %&amp;gt;
      &amp;lt;%= form.text_field :subject, class: "form-control", placeholder: "Digite o assunto" %&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="mb-3"&amp;gt;
      &amp;lt;%= form.label :body, "Corpo do e-mail:", class: "form-label" %&amp;gt;
      &amp;lt;%= form.text_area :body, rows: 10, class: "form-control", placeholder: "Escreva a mensagem do e-mail" %&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="mb-3"&amp;gt;
      &amp;lt;%= form.submit "Enviar E-mail", class: "btn btn-primary" %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;% end %&amp;gt;

  &amp;lt;% if notice %&amp;gt;
    &amp;lt;div class="alert alert-&amp;lt;%= notice['class'] %&amp;gt; mt-4"&amp;gt;&amp;lt;%= notice['message'] %&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;/div&amp;gt;

  &amp;lt;%= link_to "Add user", new_user_path, class: "btn btn-secondary mt-3" %&amp;gt;
&amp;lt;/div&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;br&gt;
Envio de Relatórios Periódicos: Enviar relatórios de desempenho ou de vendas para os usuários em horários programados.&lt;br&gt;
Notificações de Sistema: Enviar notificações importantes sobre o sistema ou atualizações para os usuários.&lt;br&gt;
Recuperação de Senha: Enviar emails para recuperação de senha e outros processos de autenticação.&lt;br&gt;
&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br&gt;
Neste artigo, cobrimos como criar um sistema de envio de emails em Rails usando Sidekiq para processamento assíncrono. Implementamos a configuração necessária, criamos um job para enviar emails, e testamos a funcionalidade usando ferramentas como MailCatcher. Agora, você pode expandir esse sistema para atender a diferentes necessidades da sua aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://sidekiq.org/" rel="noopener noreferrer"&gt;Documentação do Sidekiq&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;a href="https://guiarails.com.br/action_mailer_basics.html" rel="noopener noreferrer"&gt;Documentação do ActionMailer&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mailcatcher.me/" rel="noopener noreferrer"&gt;MailCatcher&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Criando uma API Simples com Sinatra e Documentando com Swagger UI</title>
      <dc:creator>Fernanda</dc:creator>
      <pubDate>Mon, 09 Sep 2024 23:45:25 +0000</pubDate>
      <link>https://dev.to/bussularf/criando-uma-api-simples-com-sinatra-e-documentando-com-swagger-ui-59fa</link>
      <guid>https://dev.to/bussularf/criando-uma-api-simples-com-sinatra-e-documentando-com-swagger-ui-59fa</guid>
      <description>&lt;p&gt;Hoje vou compartilhar um pequeno projeto que desenvolvi: uma API simples de gerenciamento de tarefas utilizando Sinatra com documentação interativa através do Swagger UI. O objetivo deste tutorial é mostrar como construir uma API básica e documentá-la de forma acessível para qualquer desenvolvedor que queira testar e interagir com as rotas disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bussularf/simple-ruby-api-to-do-list" rel="noopener noreferrer"&gt;Link do repositório&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introdução ao Projeto&lt;/strong&gt;&lt;br&gt;
A API permite criar, listar e deletar tarefas. O foco principal é integrar a documentação com o Swagger UI para que seja fácil visualizar e testar os endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tecnologias Utilizadas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sinatra:&lt;/strong&gt; Um micro framework Ruby para construir APIs de forma simples e rápida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger UI:&lt;/strong&gt; Um conjunto de ferramentas que ajuda a gerar uma interface gráfica para testar e documentar APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON:&lt;/strong&gt; Formato de dados para a comunicação entre o cliente e a API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Estrutura Básica da API&lt;/strong&gt;&lt;br&gt;
Aqui está um exemplo do código da API com as funcionalidades de listar, adicionar e deletar tarefas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require 'sinatra'
require 'json'

tasks = []

get '/tasks' do
  content_type :json
  tasks.to_json
end

post '/tasks' do
  content_type :json
  task = JSON.parse(request.body.read)
  tasks &amp;lt;&amp;lt; task
  task.to_json
end

delete '/tasks' do
  content_type :json
  title = params['title']
  task_to_delete = tasks.find { |task| task['title'] == title }

  if task_to_delete
    tasks.delete(task_to_delete)
    { status: 'Task deleted' }.to_json
  else
    status 404
    { error: 'Task not found' }.to_json
  end
end

get '/' do
  send_file 'index.html'
end

get '/swagger.yaml' do
  send_file 'swagger.yaml'
end

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Como Adicionar Documentação com Swagger UI&lt;/strong&gt;&lt;br&gt;
Para facilitar o uso e visualização dos endpoints, integramos o Swagger UI ao projeto. O Swagger gera uma interface gráfica que permite que você faça testes diretamente pelo navegador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura do Arquivo Swagger (&lt;code&gt;swagger.yaml&lt;/code&gt;)&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;openapi: 3.0.0
info:
  title: TO-DO LIST API
  description: A simple API to manage tasks.
  version: 1.0.0
paths:
  /tasks:
    get:
      summary: Get all tasks
      responses:
        '200':
          description: A list of tasks
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
    post:
      summary: Add a new task
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
      responses:
        '200':
          description: Task added successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  title:
                    type: string
    delete:
      summary: Delete a task by title
      parameters:
        - in: query
          name: title
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Task deleted successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
        '404':
          description: Task not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string

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

&lt;/div&gt;



&lt;p&gt;Esse arquivo YAML é o que define as rotas da API, os parâmetros e as respostas esperadas. No Swagger UI, ele gera uma interface amigável para que você possa interagir com a API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML para Rodar o Swagger UI&lt;/strong&gt;&lt;br&gt;
Crie um arquivo &lt;code&gt;index.html&lt;/code&gt; para visualizar a interface do Swagger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;title&amp;gt;Swagger UI&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css" &amp;gt;
    &amp;lt;script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id="swagger-ui"&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        SwaggerUIBundle({
            url: "swagger.yaml",
            dom_id: '#swagger-ui',
            presets: [
                SwaggerUIBundle.presets.apis,
                SwaggerUIStandalonePreset
            ],
            layout: "StandaloneLayout"
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Com isso, você pode acessar o Swagger UI ao rodar a aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rodando o Projeto&lt;/strong&gt;&lt;br&gt;
Aqui estão os passos para rodar a API localmente:&lt;/p&gt;

&lt;p&gt;Clone o repositório:&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 &amp;lt;https://github.com/bussularf/simple-ruby-api-to-do-list.git&amp;gt;
cd simple_api
bundle
ruby app.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No console: use curl para interagir com a API.&lt;br&gt;
exemplo: &lt;code&gt;curl -X GET http://127.0.0.1:4567/tasks&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No browser: &lt;a href="http://127.0.0.1:4567/" rel="noopener noreferrer"&gt;127.0.0.1:4567&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq69x88ra7jseo4v3v468.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq69x88ra7jseo4v3v468.png" alt="Image description" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>test</category>
      <category>webdev</category>
      <category>api</category>
    </item>
  </channel>
</rss>
