<?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: Bruna Ferreira</title>
    <description>The latest articles on DEV Community by Bruna Ferreira (@bug_elseif).</description>
    <link>https://dev.to/bug_elseif</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%2F580498%2F7b936f0e-9b93-4dc3-b68c-e5c3347d47d3.jpg</url>
      <title>DEV Community: Bruna Ferreira</title>
      <link>https://dev.to/bug_elseif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bug_elseif"/>
    <language>en</language>
    <item>
      <title>Dear future me</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Mon, 10 Mar 2025 17:22:56 +0000</pubDate>
      <link>https://dev.to/feministech/dear-future-me-i18</link>
      <guid>https://dev.to/feministech/dear-future-me-i18</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://future.forem.com/challenges/writing-2025-02-26"&gt;Future Writing Challenge&lt;/a&gt;: How Technology Is Changing Things.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Querida eu do futuro,&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Nós já passamos por tantas mudanças, sabemos como a tecnologia foi essencial para nosso desenvolvimento e como ainda será!&lt;/p&gt;

&lt;p&gt;Por tanto tempo passamos por dificuldades de comunicação e socialização, quando surgiram os computadores domésticos e a internet, vimos nosso primeiro passo, ainda desajeitado, de melhoria. Um ambiente onde as coisas que gostávamos não eram tão estranhas assim, nos deparamos com um lugar onde poderíamos ser nós mesmas, conhecer pessoas de diferentes lugares, nos divertir com amigos distantes, começar novos hobbies, estudar...&lt;/p&gt;

&lt;p&gt;Por muito tempo como usuárias, não imaginávamos que isso poderia ser uma profissão. Por causa de vídeos no YouTube e uma ideia de facilitar a vida das pessoas (na época trabalhando com arquitetura e urbanismo), descobrimos que seria possível deixar se ser apenas usuárias e passar a desenvolver tecnologias. Começamos a estudar, conseguimos diploma técnico e de graduação na área, conseguimos trabalhar remotamente com desenvolvimento e hoje temos a vida mais confortável por causa disso.&lt;/p&gt;

&lt;p&gt;Muito tempo se passou, novamente com a tecnologia demos mais um passo rumo ao auto entendimento. Ter informações acessíveis nos levou a profissionais especializados onde tivemos o diagnóstico de autismo. Foi uma luz para todo sofrimento nas tentativas de nos encaixarmos em um mundo feito para pessoas típicas. Estamos nos adaptando, vivendo melhor, mas ainda precisamos de suporte. Então, eu do futuro, sei que você terá esse suporte com a tecnologia que está em evolução, mais informações sobre nossas características, mais recursos de comunicação alternativa, mais facilidade para realizar aquelas tarefas que ainda nos causam sofrimento.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Te vejo no futuro, mais brilhante do que nunca! 🖤&lt;/p&gt;




</description>
      <category>futurechallenge</category>
      <category>inclusion</category>
      <category>diversity</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Isso não acaba aqui!</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Fri, 01 Nov 2024 01:01:56 +0000</pubDate>
      <link>https://dev.to/bug_elseif/isso-nao-acaba-aqui-do</link>
      <guid>https://dev.to/bug_elseif/isso-nao-acaba-aqui-do</guid>
      <description>&lt;p&gt;O mês de outubro chegou ao fim, e nesse dia 31, encerra também o Hacktoberfest 2024.&lt;br&gt;
Durante o evento, muitos projetos foram preparados e receberam contribuições valiosas de pessoas de vários os niveis e áreas do conhecimento. Mas o encerramento do evento não é motivo para parar de contribuir!&lt;/p&gt;

&lt;h2&gt;
  
  
  Escolhendo projetos
&lt;/h2&gt;

&lt;p&gt;O Hacktoberfest é um ótimo &lt;em&gt;start&lt;/em&gt; para quem não conhece o open source, também é comum pessoas experimentarem contribuir para projetos diferentes, mas uma excelente maneira de manter a motivação é escolher projetos que você realmente acha interessantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue estudando
&lt;/h2&gt;

&lt;p&gt;Para pessoas iniciantes, o open souce pode ser uma porta de entrada para desenvolver suas habilidades, então pense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quais tecnologias eu gostaria de aprender ou dominar?&lt;/li&gt;
&lt;li&gt;Existem projetos que têm impacto social ou que podem ajudar outras pessoas?&lt;/li&gt;
&lt;li&gt;Posso contribuir com algo no meu campo de atuação ou que agregue às minhas habilidades?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Escolher projetos alinhados com seus interesses pessoais e profissionais ajuda a tornar a contribuição mais prazerosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comunidades
&lt;/h2&gt;

&lt;p&gt;As comunidades open source são o coração dos projetos de código aberto, oferecendo um espaço para pessoas do mundo todo colaborarem, construirem, aprimorarem projetos úteis para diversas finalidades.&lt;br&gt;
Participar de uma comunidade é uma maneira valiosa de aprender, ensinar, e também de se conectar com pessoas.&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%2Fe6oo9kr2e9tr3k5pbmc0.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%2Fe6oo9kr2e9tr3k5pbmc0.png" alt="Montagem de várias fotos do evento Python Brasil" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recomendo que, se você tiver oportunidade, vá em um evento de tecnologia! Esses eventos são um espaço de compartilhamento de projetos e ideias, e de fortalecimento da comunidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cumbuca Dev 🥥💜
&lt;/h3&gt;

&lt;p&gt;Nesse mês tive o prazer de me aproximar de um projeto muito alinhado com o que eu acredito: &lt;strong&gt;Transformação através da Educação!&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%2Fr8vxzngd3sscp789e3cl.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%2Fr8vxzngd3sscp789e3cl.png" alt="Foto com Maria Antonia, eu e Camila em pé, uma ao lado da outra, abraçadas, ao fundo uma televisão e mesas" width="731" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quero deixar como indicação para vocês conhecerem a história inspiradora dessas pessoas e apoiarem a &lt;strong&gt;Cumbuca Dev&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://cumbuca.dev/" rel="noopener noreferrer"&gt;"...um termo autenticamente brasileiro, que transmitisse a ideia de comunidade e colaboração. Um nome criativo e original, que se destacasse por sair do convencional e permanecesse na memória das pessoas."&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E se você precisar de ajuda, não se esqueça, estamos com você nessa!&lt;/p&gt;




&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Sharingan no Google</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Fri, 29 Mar 2024 03:15:37 +0000</pubDate>
      <link>https://dev.to/feministech/sharingan-no-google-i3o</link>
      <guid>https://dev.to/feministech/sharingan-no-google-i3o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sharingan é uma técnica de ninjutsu do clã Uchiha, que é uma das mais poderosas técnicas do mundo ninja. O Sharingan é conhecido por sua capacidade de copiar qualquer técnica de um oponente, além de poder ver através de genjutsus, taijutsus e ninjutsus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Citação aleatória apenas para dizer que fiz uma "cópia" da página do Google...&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Comecei um curso de programação web na &lt;a href=""&gt;CS50W&lt;/a&gt;, para rever alguns conceitos e treinar o idioma inglês.&lt;/p&gt;

&lt;p&gt;O primeiro projeto desse curso é criar uma página web com alguns recursos de pesquisa, direcionando para o Google.&lt;/p&gt;

&lt;h3&gt;
  
  
  Página de principal
&lt;/h3&gt;

&lt;p&gt;Inicialmente, a página principal deve conter um formulário de pesquisa, com um campo de texto e um botão de pesquisa.&lt;/p&gt;

&lt;p&gt;O que eu desconhecia era que na tag &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; é possível adicionar o atributo &lt;code&gt;action&lt;/code&gt; que direciona para URL específicas da web Google junto com uma tag &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; e um atributo &lt;code&gt;name&lt;/code&gt; que é usado como parâmetro de pesquisa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google.com/search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Google Search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;: tag que define um formulário HTML para entrada de dados do usuário.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;action&lt;/code&gt;: atributo que especifica para onde enviar os dados do formulário.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;: tag que define um campo de entrada onde o usuário pode inserir dados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type="text"&lt;/code&gt;: atributo que especifica o tipo de entrada do campo como texto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name="q"&lt;/code&gt;: atributo que especifica o nome do campo de entrada, indicando o 'q' de query.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type="submit"&lt;/code&gt;: atributo que especifica um botão de envio para enviar o formulário.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value="Google Search"&lt;/code&gt;: atributo que especifica o texto do botão de envio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Página de pesquisa
&lt;/h3&gt;

&lt;p&gt;Fazendo uma busca qualquer, como "Sharingan":&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%2F6xisd4rmyiklsrde4bee.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%2F6xisd4rmyiklsrde4bee.png" alt="Formulário de pesquisa" width="540" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja o que acontece com o link ao submeter a busca:&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%2Fkscgymk2pl3l8nrjv9rg.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%2Fkscgymk2pl3l8nrjv9rg.png" alt="Link: https://www.google.com/search?q=sharingan" width="409" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse momento, o parâmetro &lt;code&gt;q&lt;/code&gt; é concatenado com o valor digitado &lt;code&gt;value&lt;/code&gt; "sharingan", formatando como uma query de pesquisa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direcionando a pesquisa
&lt;/h3&gt;

&lt;p&gt;Outro ponto interessante é a possibilidade de adicionar mais parâmetros e valores para direcionar a busca, por exemplo, em imagens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://google.com/search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"tbm"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"isch"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"q"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Images Search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui definimos o parâmetro &lt;code&gt;tbm&lt;/code&gt; (&lt;strong&gt;t&lt;/strong&gt;o &lt;strong&gt;b&lt;/strong&gt;e &lt;strong&gt;m&lt;/strong&gt;atched) com o valor &lt;code&gt;isch&lt;/code&gt; (&lt;strong&gt;i&lt;/strong&gt;mage &lt;strong&gt;s&lt;/strong&gt;ear &lt;strong&gt;ch&lt;/strong&gt;), os quais são especificos para pesquisa de imagens. Note que ele é do tipo &lt;code&gt;hidden&lt;/code&gt;, ou seja, não é visível ao usuário.&lt;/p&gt;

&lt;p&gt;Fazendo uma busca por "Sharingan" novamente:&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%2Fk2i7459tobeyj2ude8x6.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%2Fk2i7459tobeyj2ude8x6.png" alt="Formulário de pesquisa de imagens" width="540" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja como o link é formatado:&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%2Fvhn2mf7b5koac4nvxnbr.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%2Fvhn2mf7b5koac4nvxnbr.png" alt="Link: https://www.google.com/search?tbm=isch&amp;amp;q=sharingan" width="432" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os parâmetros e valores são concatenados com o link de pesquisa, direcionando para uma busca mais detalhada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então...
&lt;/h2&gt;

&lt;p&gt;Um input com o atributo &lt;code&gt;name="tbm"&lt;/code&gt; pode receber valores diferentes para direcionar a pesquisa para outros tipos de conteúdo, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vídeos (&lt;code&gt;value="vid"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;notícias (&lt;code&gt;value="nws"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;livros (&lt;code&gt;value="bks"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;blog (&lt;code&gt;value="blg"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;discussões (&lt;code&gt;value="dsc"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;aplicativos (&lt;code&gt;value="app"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;compras (&lt;code&gt;value="shop"&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Experimente fazer uma página para testar esses parâmetros e valores, e veja o que acontece!&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>html</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Therac-25</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Wed, 27 Mar 2024 03:16:47 +0000</pubDate>
      <link>https://dev.to/feministech/therac-25-180j</link>
      <guid>https://dev.to/feministech/therac-25-180j</guid>
      <description>&lt;p&gt;Você já deve ter se deparado com vários erros de código no seu cotidiano, seja em um aplicativo, em um site ou em um sistema. Esses erros podem ser causados por diversos fatores, entre eles, as falhas de programação.&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%2Fkig3s18853thhwp8jtuh.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%2Fkig3s18853thhwp8jtuh.png" alt="Captura de tela de um programa de computador fazendo a soma de dois campos. 1 + 1 = 11" width="643" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muitas vezes, esses erros podem ser inofensivos, até engraçados em alguns casos. Mas há situações em que eles podem ser extremamente perigosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uma breve história
&lt;/h2&gt;

&lt;p&gt;Entre as décadas de 70 e 80, radioterapia era um dos tratamentos utilizados para combater o câncer, existiam dois tipos diferentes de tratamento, com emissão de &lt;em&gt;elétrons&lt;/em&gt; e &lt;em&gt;raio-x&lt;/em&gt;. Cada um deles necessitava um equipamento específico para ser realizado, gerando mais custos para os hospitais.&lt;/p&gt;

&lt;p&gt;Então, uma empresa desenvolveu um equipamento que podia realizar ambos os tratamentos, o Therac-25. De acordo com a necessidade do paciente, o equipamento poderia ser configurado para emitir &lt;em&gt;elétrons _ou _raio-x&lt;/em&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%2Fpukthfhqxtnxsr4bqgc5.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%2Fpukthfhqxtnxsr4bqgc5.png" alt="Equipamento Therac-25" width="381" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma boa solução?
&lt;/h3&gt;

&lt;p&gt;O Therac-25 foi um grande avanço na medicina, pois permitia que os hospitais economizassem dinheiro e espaço, além de facilitar o tratamento dos pacientes. No entanto, o equipamento começou a apresentar comportamentos estranhos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relatos de pacientes
&lt;/h3&gt;

&lt;p&gt;Em um dos primeiros casos, um paciente que estava em tratamento com o Therac-25 relatou que estava sentindo dores intensas durante o processo e sua pele no local da aplicação parecia queimar. Porém os médicos acreditavam que se tratava de uma reação normal do tratamento.&lt;/p&gt;

&lt;p&gt;Em um caso mais grave, um paciente relatou estar sentindo choques elétricos durante o processo. Mas o equipamento parecia estar funcionando normalmente, sem apresentar erro durante o procedimento e o monitor indicava que tudo estava correto.&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%2F7q6u7n6p16cmvotwyj99.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%2F7q6u7n6p16cmvotwyj99.png" alt="Terminal utilizado para configurações do equipamento" width="621" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Malfunction 54
&lt;/h3&gt;

&lt;p&gt;Esse erro genericamente chamado de &lt;code&gt;"Malfunction 54"&lt;/code&gt; era causado na tela do equipamento, sem especificar o que estava acontecendo. Muitas vezes, os médicos apenas reiniciam o equipamento e continuavam o tratamento, sem saber o que estava acontecendo. Além disso, as informações no monitor apontavam os valores corretos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O problema
&lt;/h3&gt;

&lt;p&gt;O Therac-25 era controlado totalmente por software, programado em uma linguagem de baixo nível, o que permitia um controle mais preciso do hardware. &lt;/p&gt;

&lt;p&gt;Em um momento, uma pessoa que estava operando o equipamento, cometeu um erro ao configurar o tratamento e assim que notou, mudou o tipo de radiação emitida para a correta. Após o procedimento, apareceu um alerta no monitor que indicava ter sido emitida a dose abaixo do necessário. Então a pessoa recomeçou o procedimento.&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%2Fg68zr2l2t93iuhchsblc.gif" 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%2Fg68zr2l2t93iuhchsblc.gif" alt="Ilustração do giro feito pelo equipamento ao mudar a configuração do tipo de raio emitido" width="980" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Investigação
&lt;/h3&gt;

&lt;p&gt;Depois de vários relatos, tentativas de reproduzir o erro e investigações, foi descoberto que o erro era causado por um problema de software. No momento em que a pessoa alterava o tipo de radiação, o equipamento não conseguia processar a mudança e emitia a dose de radiação muito acima do necessário, causando graves danos e até a morte dos pacientes.&lt;/p&gt;

&lt;p&gt;A empresa responsável pelo Therac-25 usou práticas inadequadas de desenvolvimento de software, não haviam mensagens claras em relação aos erros, sequer haviam feito testes de segurança e qualidade.&lt;/p&gt;

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

&lt;p&gt;Essa história aqui resumida, é um exemplo de como um erro de software pode ser extremamente perigoso. A falta de ética e responsabilidade no desenvolvimento de software pode causar danos irreparáveis.&lt;/p&gt;

&lt;p&gt;Um ponto importante, apesar de sermos muito dependentes de softwares atualmente, não podemos confiar cegamente neles. Mesmo que máquinas tenham uma precisão maior que humanos, elas ainda são programadas por humanos e muitas vezes podem não ter boas intenções.&lt;/p&gt;




&lt;p&gt;Mais detalhes sobre o &lt;a href="https://en.wikipedia.org/wiki/Therac-25"&gt;Therac-25&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enjoy!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Trajetória de um ano</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Fri, 01 Mar 2024 05:54:17 +0000</pubDate>
      <link>https://dev.to/feministech/trajetoria-de-um-ano-2hea</link>
      <guid>https://dev.to/feministech/trajetoria-de-um-ano-2hea</guid>
      <description>&lt;p&gt;Olá, sou a Bruna! Nessa celebração de WeCoded, vou contar um pouco sobre o que aconteceu nesse último ano.&lt;/p&gt;

&lt;h2&gt;
  
  
  2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Eu estava no setor de suporte técnico, com uma proposta de mudar para o setor de desenvolvimento, porém isso nunca aconteceu, não veio um sim nem um não e aquele lugar já não estava agregando muito pra mim. Comecei o ano decidindo sair do estágio e focar em estudar, seria o ultimo ano da faculdade de Ciência da Computação.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Janeiro, começando com o primeiro evento do ano: Conferência CSS Brasil + Code in the Dark, em SP. Assisti palestras incríveis com direito a livecoding da &lt;a href="https://www.youtube.com/c/nataliafdev"&gt;Natália F. Dev&lt;/a&gt; e depois teve a baladinha insana do Code in the Dark.&lt;/li&gt;
&lt;/ul&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%2F9mrk5mue6uyzdu4e5xzb.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%2F9mrk5mue6uyzdu4e5xzb.png" alt="Foto de uma palestra tirada no evento conferência CSS Brasil ao lado de uma foto tirada de uma tela no Code in the Dark" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Voltando para faculdade, começando o sétimo semestre e o TCC, tive que decidir o tema e com quem eu faria, já que era em dupla. A minha ideia inicial era criar algo semelhante ao Duolingo para ensino de inglês, porém trocamos o foco para ensino de computação (o que fazia mais sentido até).&lt;/li&gt;
&lt;/ul&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%2F4cmrn75mv7rhdi9lzq8e.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%2F4cmrn75mv7rhdi9lzq8e.png" alt="Foto da entrada do IFSC e uma foto de livros ao lado" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Em março participei de mais um evento presencial: GitTogether em Floripa. Falei um pouco sobre open source exemplificando com o bot da Twitch da Feministech. Senti que não me preparei muito bem para isso, mas foi uma boa experiência.&lt;/li&gt;
&lt;/ul&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%2Fbnziemns1n58dt6seh92.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%2Fbnziemns1n58dt6seh92.png" alt="Foto tirada no evento GitTogether, eu e ao fundo uma tela de slides" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Ainda em março, a &lt;a href="https://dev.to/morgannadev"&gt;Morganna&lt;/a&gt; me convidou para participar do &lt;a href="https://www.youtube.com/live/ev5SW-2jdJo?si=hGNt1DF_gWeG8bNv&amp;amp;t=1204"&gt;Meetup&lt;/a&gt; online da BotCity para apresentar algum conteúdo. Eu, sem saber nada de RPA, decidi aprender no pouco tempo que eu tive e apresentar sobre isso. Não saiu totalmente como esperado mas foi divertido, fiz um livecoding criando um bot para manipular nomes de arquivos.&lt;/li&gt;
&lt;/ul&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%2Fp4hckrnoscbwxg4zqieu.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%2Fp4hckrnoscbwxg4zqieu.png" alt="Print da tela do Meetup BotCity online aparecendo Morganna, eu e um pedaço de código" width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Abril estava eu entrando para o time de DX da BotCity, onde eu comecei a estudar mais sobre RPA e testes. Consegui finalmente trabalhar com uma linguagem que eu amo: Python.&lt;/li&gt;
&lt;/ul&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%2F7vg7pgeci83vjtu0rj2x.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%2F7vg7pgeci83vjtu0rj2x.png" alt="Fotos de trechos de códigos de teste" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Em Maio teve o encontro presencial do time da BotCity, passamos uma semana trabalhando juntos, teve meetup, palestras, alinhamentos e muita diversão.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;É agora que pede truco?&lt;/p&gt;
&lt;/blockquote&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%2Frk5spzuepegt3ikmctit.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%2Frk5spzuepegt3ikmctit.png" alt="Colagem de fotos da BotWeek, uma tela com conteúdos de uma palestra, uma foto da tela com mapa do avião, foto de uma parede escrito 'ciência, tecnologia e impacto social' e uma foto de uma tela com slides" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Por essa época começamos o desenvolvimento do TCC também, decidimos por uma aplicação mobile e dividimos as tarefas basicamente entre frontent e backend. Eu fiquei com o backend, e após alguns testes decidi usar o FastAPI e o banco de dados PostgreSQL.&lt;/li&gt;
&lt;/ul&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%2Fstehjfojrw8p5ngjklpb.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%2Fstehjfojrw8p5ngjklpb.png" alt="Foto com trechos de código em Python" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Em Julho eu assisti um vídeo e pensei: hm, pq não...? O vídeo era do &lt;a href="https://www.youtube.com/@rochacbruno"&gt;Bruno Rocha&lt;/a&gt; sobre o canal &lt;a href="https://www.youtube.com/@CodeShowbr"&gt;CodeShow&lt;/a&gt; que estava sendo aberto para pessoas que quisessem apresentar conteúdo. Falei com ele sobre meu interesse e ele, junto com o time, aceitou que eu fizesse parte do canal também.&lt;/li&gt;
&lt;/ul&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%2Fb9nhkvonavx15bcj1xe4.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%2Fb9nhkvonavx15bcj1xe4.png" alt="Print do vídeo e do canal do CodeShow" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Em julho tivemos outro &lt;a href="https://www.youtube.com/live/eOVUUxL1Yo8?si=IwzBRHmvdxvFtun-&amp;amp;t=1025"&gt;Meetup&lt;/a&gt; online da BotCity, onde eu apresentei os primeiros passos com Python e RPA, também no formato de livecoding.&lt;/li&gt;
&lt;/ul&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%2Fl3skhfk16yn3gj9mdv0l.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%2Fl3skhfk16yn3gj9mdv0l.png" alt="Foto da capa da palestra sobre primeiros passos com Python RPA ao lado foto da tela com as pessoas do evento" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Por essa época também, começando o último semestre da faculdade e dando continuidade no TCC, eu e minha dupla começamos a integrar o frontend com o backend do projeto. Em paralelo com estudos de RPA para o trabalho.&lt;/li&gt;
&lt;/ul&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%2Fdbiphbasjxhj6bklcgq0.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%2Fdbiphbasjxhj6bklcgq0.png" alt="Foto de slides apresentando uma disciplina ao lado fotos de trechos de códigos" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Em outubro tivemos o evento global: Hacktoberfest. Eu participei apresentando dentro da comunidade Feministech, um pouco de como o evento funciona e como contribuir. Contei um pouco sobre essa experiência nesse &lt;a href="https://dev.to/feministech/minha-experiencia-na-hacktoberfest-2023-3p7f"&gt;artigo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&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%2Fqyfwfkjyqdnnz50454ic.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%2Fqyfwfkjyqdnnz50454ic.png" alt="Print do evento online GitTogether SP, ao lado uma imagem do octogato customizado" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Ainda em outubro, teve o evento presencial: Python Brasil. Participei de duas lightning talks com a Morganna, onde fizemos uma encenação de milhões falando sobre RPA. kkkkkk O evento (e pybar) foi incrível, encontrar com pessoas que eu só conhecia virtualmente foi muito legal. Ainda no evento, consegui fazer um teste com o aplicativo do meu TCC, apresentando para algumas pessoas e recebendo feedbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Olá meu nome é Bruna e essa é minha primeira Python Brasil ~ 👏🏻👏🏻👏🏻👏🏻&lt;/p&gt;
&lt;/blockquote&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%2Fhu4ibrwhv80qqgsid7hn.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%2Fhu4ibrwhv80qqgsid7hn.png" alt="Colagem de fotos do evento Python Brasil" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Novembro, surgiu uma pessoa no Mastodon procurando por alguém para ajudar uma pessoa iniciante na área. A pessoa gostaria de aprender sobre programação web, então eu me ofereci para ajudar. Estamos fazendo reuniões semanais para estudar juntas, construindo um projeto do zero.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Em dezembro, comecei o projeto &lt;a href="https://github.com/codeshow/one-minute"&gt;one-minute&lt;/a&gt; no canal CodeShow, onde eu apresento sobre Python em vídeos de um minuto.&lt;/li&gt;
&lt;/ul&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%2F6lf3gffwv3gqegqdew66.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%2F6lf3gffwv3gqegqdew66.png" alt="Print do instagram e github do projeto one minute" width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Enfim, ainda em dezembro, disciplinas da faculdade finalizadas, TCC finalizado e apresentado com sucesso.&lt;/li&gt;
&lt;/ul&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%2Fwg5jnsgnfyf195hje2mk.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%2Fwg5jnsgnfyf195hje2mk.png" alt="Colagem de fotos do dia da formatura" width="539" height="261"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reflexões
&lt;/h2&gt;

&lt;p&gt;Muitas vezes me pego pensando que fiz pouca coisa durante o ano, mas parando para refletir, foi um ano bem produtivo, além desses pontos citados, ainda enfrentei vários desafios pessoais.&lt;/p&gt;

&lt;p&gt;É bom pararmos para refletir sobre nossas conquistas, não nos deixar levar pela cobrança excessiva imposta pelo modelo de sociedade em que vivemos. Enfim, consegui trabalhar com o que eu gosto, apresentar conteúdo em eventos, ajudar pessoas e finalizar a faculdade. Foi um bom ano.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>braziliandevs</category>
      <category>lgbtq</category>
    </item>
    <item>
      <title>O que o passado mostra</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Thu, 01 Feb 2024 01:20:33 +0000</pubDate>
      <link>https://dev.to/feministech/o-que-o-passado-mostra-14nl</link>
      <guid>https://dev.to/feministech/o-que-o-passado-mostra-14nl</guid>
      <description>&lt;p&gt;Há 4 anos, eu sem ter muita ideia de como usar o GitHub, joguei alguns projetos no repositório: &lt;a href="https://github.com/bugelseif/Basics"&gt;Basics&lt;/a&gt;. A maioria deles são de quando comecei, em 2018.&lt;/p&gt;

&lt;p&gt;No readme, as seguintes colocações:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Repositório de estudos!
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Coloquei aqui os primeiros projetos que eu fiz.
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Com o tempo vou modificando e melhorando eles.
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Não existe aprendizado sem afeto!
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que temos aqui?
&lt;/h2&gt;

&lt;p&gt;Alguns dos projetos de páginas web que eu fiz durante o curso técnico em informática para internet, junto com alguns experimentos usando &lt;em&gt;HTML&lt;/em&gt;, &lt;em&gt;CSS&lt;/em&gt; e &lt;em&gt;JavaScript&lt;/em&gt;. Tais como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabuada&lt;/li&gt;
&lt;/ul&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%2Frjc69lq36v71gq0jzzw5.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%2Frjc69lq36v71gq0jzzw5.png" alt="Página da tabuada" width="289" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma página simples que gera tabuada a partir do input de um número. Estava aprendendo sobre como estruturar códigos para fazer as ações corretas, receber um input, calcular com um laço de repetição e mostrar o resultado na tela, usando &lt;em&gt;JavaScript&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correios&lt;/li&gt;
&lt;/ul&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%2Fg7d9kciq8qykpo9vkbam.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%2Fg7d9kciq8qykpo9vkbam.png" alt="Página do calculo do correio" width="454" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa página envolviam alguns cálculos considerando diferentes tipos de input, como texto, número e seleção. Usando condicionais para verificar quais campos estavam preenchidos e então calcular o valor do frete.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Café Starbuzz&lt;/li&gt;
&lt;/ul&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%2Fe0fge7kfed1me2k67skb.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%2Fe0fge7kfed1me2k67skb.png" alt="Página do café Starbuzz" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Partindo mais para estilização com &lt;em&gt;CSS&lt;/em&gt;, nota-se que design nunca foi meu forte... Mas eu gostava de perceber como cada elemento se comportava na tela, e modificar o código para ficar na estrutura correta. Estava aprendendo sobre o uso de &lt;code&gt;grid&lt;/code&gt; no &lt;em&gt;CSS&lt;/em&gt;, achei interessante em alguns casos, porém achei complexo para utilizar. Atualmente opto pelo uso de &lt;code&gt;flexbox&lt;/code&gt; para a maioria dos casos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Galeria de Fotos&lt;/li&gt;
&lt;/ul&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%2Fs2suzstgvdatmis5d2w2.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%2Fs2suzstgvdatmis5d2w2.png" alt="Página da galeria de fotos" width="439" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já deu uma melhorada no design, nesse caso o uso de &lt;code&gt;grid&lt;/code&gt; foi mais interessante, pois a estrutura para encaixar fotos de tamanhos diferentes fez mais sentido.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jogos adivinhação&lt;/li&gt;
&lt;/ul&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%2Focwamb2zt009gg3i6mf3.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%2Focwamb2zt009gg3i6mf3.png" alt="Jogo adivinhação" width="258" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse repositório ainda tem um dos primeiros programas que fiz em Python. Um jogo de adivinhação, onde tinha um input para enviar o palpite, com 3 chances de acertar. O número era fixo e o programa dava dicas se o palpite era maior ou menor que o número escolhido.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além desses exemplos, ainda tem outros projetos web, alguns utilizando &lt;em&gt;PHP&lt;/em&gt; também.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que guardar isso?
&lt;/h2&gt;

&lt;p&gt;A ideia era melhorar esses projetos com o tempo, mas acabou ficando como registro de como eu comecei. Considero importante conseguir ver a evolução do meu aprendizado.&lt;/p&gt;

&lt;p&gt;Lembrar que nessa época eu estava em contato pela primeira vez com a programação fazendo um curso técnico, eu gostei tanto da experiência que comecei a faculdade de ciência da computação e não tinha ideia de onde isso ia me levar.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Não existe aprendizado sem afeto!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sempre acreditei nisso e gostaria de deixar meu agradecimento principalmente às comunidades de tecnologia que sempre me acolheram desde quando as conheci. &lt;/p&gt;

&lt;p&gt;Amo vocês. 🖤&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Sites para praticar RPA</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Wed, 08 Nov 2023 01:45:12 +0000</pubDate>
      <link>https://dev.to/botcitydev/sites-para-praticar-rpa-4k2l</link>
      <guid>https://dev.to/botcitydev/sites-para-praticar-rpa-4k2l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Para esse artigo você precisa ter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conhecimento básico de programação&lt;/li&gt;
&lt;li&gt;Conhecimento básico da biblioteca Selenium&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qualquer dúvida, comente! &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Robotic Process Automation&lt;/em&gt; (RPA) visa implementar soluções com automação robótica de processos para livrar pessoas de trabalhos repetitivos, trazendo mais agilidade e segurança para os negócios. Esses processos podem acontecer interagindo com aplicativos de computador como sistemas &lt;em&gt;Customer Relationship Management&lt;/em&gt; (CRM), &lt;em&gt;Enterprise Resource Planning&lt;/em&gt; (ERP) ou mesmo navegadores web, acessando portais comumente utilizados pelas organizações.&lt;/p&gt;

&lt;p&gt;Quando entramos no contexto de RPA, temos diversas ferramentas diferentes para atender nossas demandas, sendo elas plataformas “no-code” ou “low-code” e ainda existe a possibilidade de utilizar código em alguma linguagem de programação para criar sua automação. Nesse artigo eu apresento um site para praticar suas automações do tipo Web, utilizando código Python e interagindo com navegadores diretamente com o &lt;em&gt;Document Object Model&lt;/em&gt; (DOM) das páginas.&lt;/p&gt;

&lt;p&gt;Uma das formas de melhorar a habilidade de programar é praticando. Dentro da área de RPA não é diferente, precisamos aprender sobre como os processos funcionam e assim conseguir desenvolver um programa capaz de executar todos os passos necessários para realizar a tarefa proposta com sucesso.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://practicetestautomation.com/"&gt;Practice Test Automation&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Nesse site temos opções de fazer testes com nossa automação em contextos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test Login Page:  preenchendo o login da página utilizando as credenciais disponíveis, podendo testar casos de login válido ou inválido&lt;/li&gt;
&lt;li&gt;Test Exceptions: tratamento de exceções mais comuns com base na ferramenta Selenium.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abordando o primeiro caso, temos a possibilidade de preencher dois campos de texto, referentes a username e password e clicar um botão submit. Dependendo de como os campos foram preenchidos, teremos como respostas diferentes ao clicar no botão. A partir dessas respostas poderemos avaliar se a automação está passando pelas etapas corretas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como fica em código?
&lt;/h3&gt;

&lt;p&gt;É importante verificar se todas as dependências necessárias estão instaladas na máquina para executar o código.&lt;/p&gt;

&lt;p&gt;Para esse projeto utilizaremos as seguintes bibliotecas, nas versões fixadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selenium==4.10.0
webdriver-manager==3.8.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando de instalação no terminal fica dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;-m&lt;/span&gt; &lt;span class="nf"&gt;pip&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt; &lt;span class="nf"&gt;selenium==4.10.0&lt;/span&gt; &lt;span class="nf"&gt;webdriver-manager==3.8.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criaremos um arquivo python com o nome de bot.py, nele descreveremos os passos para preencher o formulário em forma de instruções.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.common.by&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.firefox.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Define o caminho do WebDriver executável do Firefox
&lt;/span&gt;        &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executable_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;geckodriver.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Cria uma instância do Navegador
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Firefox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Define a URL da página Practice Test Automation na área de login
&lt;/span&gt;        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://practicetestautomation.com/practice-test-login/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="c1"&gt;# Acessa página definida
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento input de nome de usuário
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;student&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento input de senha
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_senha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_senha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Password123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento botão submit
&lt;/span&gt;        &lt;span class="n"&gt;elemento_botao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;submit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de clicar
&lt;/span&gt;        &lt;span class="n"&gt;elemento_botao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Aguarda 3 segundos para garantir
&lt;/span&gt;        &lt;span class="c1"&gt;# que carregou a página com resultado
&lt;/span&gt;        &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pela confirmação de login
&lt;/span&gt;        &lt;span class="n"&gt;elemento_logado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.post-title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Imprime o texto da confirmação
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elemento_logado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento botão log out
&lt;/span&gt;        &lt;span class="n"&gt;elemento_deslogado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.wp-block-button__link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de clicar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_deslogado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Busca pelo elemento de mensagem de erro
&lt;/span&gt;        &lt;span class="n"&gt;error_alert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Imprime a mensagem de erro
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_alert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Finaliza fechando o navegador
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Imprime mensagem de finalização
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finally&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Ao executar esse código, o resultado deve ser a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt; &lt;span class="nf"&gt;C:\practice_test_automation&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;.\bot.py&lt;/span&gt;
&lt;span class="nf"&gt;Logged&lt;/span&gt; &lt;span class="nf"&gt;In&lt;/span&gt; &lt;span class="nf"&gt;Successfully&lt;/span&gt;
&lt;span class="nf"&gt;Finally&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, ocorreu tudo como esperado, a automação preencheu os campos com os valores corretos e clicou no botão de login, acessando a página de confirmação e depois clicou em logout para sair da página.&lt;/p&gt;

&lt;p&gt;Para testar outras validações, vamos alterar inicialmente o preenchimento do campo de nome de usuário, colocando um valor inválido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="c1"&gt;# elemento_campo_usuario.send_keys("student")
&lt;/span&gt;        &lt;span class="c1"&gt;# Valor incorreto para teste de erro
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;estudante&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse será o resultado ao executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt; &lt;span class="nf"&gt;C:\practice_test_automation&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;.\bot.py&lt;/span&gt;
&lt;span class="nf"&gt;Your&lt;/span&gt; &lt;span class="nf"&gt;username&lt;/span&gt; &lt;span class="nf"&gt;is&lt;/span&gt; &lt;span class="nf"&gt;invalid!&lt;/span&gt;
&lt;span class="nf"&gt;Finally&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Podemos notar que o site oferece algumas formas de busca e interação com os elementos da DOM. Como sugestão, tente fazer outras alterações como mudar a senha que retorna outra mensagem de validação, além da possibilidade de procurar por outros elementos e interagir com eles.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>python</category>
      <category>rpa</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Minha experiência na Hacktoberfest 2023</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Fri, 20 Oct 2023 02:41:34 +0000</pubDate>
      <link>https://dev.to/feministech/minha-experiencia-na-hacktoberfest-2023-3p7f</link>
      <guid>https://dev.to/feministech/minha-experiencia-na-hacktoberfest-2023-3p7f</guid>
      <description>&lt;p&gt;No ano de 2023, participei pela terceira vez do evento &lt;a href="https://hacktoberfest.com/"&gt;Hacktoberfest&lt;/a&gt;, fiz algumas ações para ajudar pessoas iniciantes na área de tecnologia que gostariam de participar também.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---ChEGjU5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://hacktoberfest.com/_next/static/media/logo-hacktoberfest--horizontal.ebc5fdc8.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---ChEGjU5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://hacktoberfest.com/_next/static/media/logo-hacktoberfest--horizontal.ebc5fdc8.svg" alt="Hacktoberfest 2023 logo" width="262" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré evento
&lt;/h2&gt;

&lt;p&gt;Alguns dias antes da abertura oficial do evento, houve um momento de preparação e cadastramento, nesse momento ocorreu um evento dentro da comunidade &lt;a href="https://feministech.com.br/"&gt;Feministech&lt;/a&gt; chamado &lt;code&gt;Esquenta Hacktoberfest 2023&lt;/code&gt;, direcionado para pessoas que estavam participando pela primeira vez, principalmente.&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%2Fy4szgo7veolau04cg6yb.gif" 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%2Fy4szgo7veolau04cg6yb.gif" alt="Gif com logo da hacktoberfest de fundo e varias palavras 'hacktoberfest' surgindo como se estivessem sendo digitadas" width="1152" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que apresentei:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Visão geral sobre o evento&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É um evento global anual que tem como objetivo incentivar a contribuição para projetos open source. Este ano marca o 10º aniversário.&lt;/p&gt;

&lt;p&gt;Todas pessoas - codificadoras ou não - são bem vindas à participar, aprender e praticar habilidades que podem melhorar suas carreiras, além de interagir com a comunidade.&lt;/p&gt;

&lt;p&gt;Periodo de participação: 01/10/2023 - 31/10/2023&lt;/p&gt;

&lt;p&gt;Requisitos: ter 4 PR/MR aceitos&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cadastro no site oficial e Github&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma etapa importante para quem quer participar, além de ter uma conta no Github (ou Gitlab), é fazer o cadastro no site oficial da Hacktoberfest para que suas contribuições sejam contabilizadas. Fiz o cadastro juntamente com as pessoas participantes do evento, passando por todas as fases e informações importantes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Como encontrar projetos opensource participantes&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Outro ponto que devemos ter atenção é na busca por projetos participantes, precisamos verificar se possuem o tópico (tag) &lt;code&gt;hacktoberfest&lt;/code&gt; nos detalhes do repositório. Isso indica que o projeto é participante do evento e suas contribuições, sendo aceitas, contabilizarão.&lt;br&gt;
Como o foco foi em pessoas iniciantes, depois de encontrar um projeto também mostrei outra indicação, a pesquisa pela label &lt;code&gt;good first issue&lt;/code&gt;, dentro da aba de issues do Github, essas são marcadas como um bom ponto de partida para começar a contribuir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fluxos básicos do Github&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Depois de entender como buscar pelos projetos, praticamos como enviar uma contribuição. Criei um repositório com um arquivo open-festa.md onde as pessoas deveriam abrir ou escolher uma issue para adicionar o que levariam para a festa, criar um fork do projeto, alterar o código de acordo com o que escolheram e enviar a solicitação de PR.&lt;br&gt;
Esse é um fluxo mais básico para se fazer, muitos repositórios tem uma documentação especifica mostrando o padrão mais adequado para contribuir com o projeto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Evento
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Projetos que participei
&lt;/h3&gt;

&lt;p&gt;Participei contribuindo com alguns projetos pequenos, que envolvem o compartilhamento de conhecimento, divulgação de cursos ou materiais gratuitos e incentivo para pessoas iniciantes na área de tecnologia. Além de projetos que incentivam a criatividade e a diversão.&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%2F1xsei4rlg13q7g94cz65.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%2F1xsei4rlg13q7g94cz65.png" alt="octocat com cabelos roxos, usando casaco preto, calça preta e um tênis all star, segurando um milkshake na mão" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além disso, mantive o respositório que criei no ano passado, apresentando uma lista de outros projetos com nível de dificuldade baixo, para receber contribuições.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/celycodes/materiais-gratuitos"&gt;materiais-gratuitos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/levxyca/diciotech"&gt;diciotech&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/morgannadev/octocats_da_comunidade"&gt;octocats_da_comunidade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bugelseif/projetos-iniciantes"&gt;projetos-iniciantes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desafio concluído
&lt;/h3&gt;

&lt;p&gt;A cada PR aceito, recebemos uma badge do evento, indicando o nivel que estamos no evento. Além de outras premiações descritas no site e a árvore que é plantada em nosso nome. 🖤&lt;/p&gt;

&lt;h3&gt;
  
  
  Painel
&lt;/h3&gt;

&lt;p&gt;Meu painel com algumas das badges que recebi durante o evento:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://holopin.io/@bugelseif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PNhHjUUW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://holopin.me/bugelseif" alt="An image of @bugelseif's Holopin badges, which is a link to view their full Holopin profile" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Markhamia lutea
&lt;/h3&gt;

&lt;p&gt;Por fim, algumas informações sobre a árvore: ela pode chegar em média a 10 metros de altura foi plantada na Conservação da Biodiversidade de Usambara, Tanzânia. O projeto tem objetivo de reverter o desmatamento em torno da reserva natural, educar para conservação ambiental, etc.&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%2F8qrx7d9p0bwvqa958nf8.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%2F8qrx7d9p0bwvqa958nf8.png" alt="Species: Markhamia lutea" width="395" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>hacktoberfest</category>
      <category>hacktoberfest23</category>
    </item>
    <item>
      <title>É tudo sobre pessoas</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Tue, 18 Jul 2023 00:15:33 +0000</pubDate>
      <link>https://dev.to/bug_elseif/e-tudo-sobre-pessoas-4oeh</link>
      <guid>https://dev.to/bug_elseif/e-tudo-sobre-pessoas-4oeh</guid>
      <description>&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Tomar consciência de si mesmo pode trazer mais sentido pra vida.
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olá! Eu sou a Bruna, sou dev e esse ano entendi um pouco mais o motivo de eu agir de forma não convencional, ter dificuldades em atividades consideradas "comuns", sentir de maneira diferente.&lt;/p&gt;

&lt;p&gt;Eu sou uma pessoa que sempre tive problemas de comunicação. Não sabia me expressar em palavras, achava apavorante e paralisante fazer algum tipo de apresentação, entre outras coisas. &lt;/p&gt;

&lt;p&gt;Outro aspecto difícil na minha vida é a socialização, conversas informais ou sem contexto me deixam muito desconfortável, então uma simples conversa com alguém pode me fazer querer sair correndo.&lt;/p&gt;

&lt;p&gt;Com o tempo eu melhorei muito essas habilidades, a ponto de atualmente trabalhar com comunicação. Mas isso não muda quem eu sou e toda dificuldade que enfrento diariamente.&lt;/p&gt;

&lt;p&gt;Ter o diagnóstico de transtorno do espectro autista (TEA) me deu uma visão mais consciente sobre várias situações que passei pela vida, entendendo o quanto que eu me esforçava para me adaptar enquanto precisava apenas de acolhimento.&lt;/p&gt;

&lt;p&gt;A sociedade no geral não quer lidar com o diferente, seguem a vida sem questionar nada, cobram atitudes sem sentido, ainda julgam desnecessário quando alguns grupos tentam trazer informações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você quer conhecer outras vivências ou ignorá-las?&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Os detalhes fazem diferença!</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Fri, 02 Jun 2023 04:05:56 +0000</pubDate>
      <link>https://dev.to/feministech/os-detalhes-fazem-diferenca-41c2</link>
      <guid>https://dev.to/feministech/os-detalhes-fazem-diferenca-41c2</guid>
      <description>&lt;p&gt;Estou em contato com uma turma de introdução a programação, nela a maioria das pessoas entraram sem conhecer como um algoritmo ou uma linguagem de programação funciona.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O lado bom de escrever um programa é que ele vai fazer exatamente o que pedimos, o lado ruim é que ele vai fazer exatamente o que pedimos.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pessoas iniciantes muitas vezes podem confundir símbolos de operadores ao escrever um código, a ordem de escrita de cada bloco ou até mesmo entrar em loop por semântica incorreta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java
&lt;/h2&gt;

&lt;p&gt;A turma está utilizando a linguagem Java no aprendizado de programação, eu notei que alguns detalhes em códigos estão passando sem apontar mensagens de erro ao executar, como se estivessem certos. Vou mostrar dois exemplos aqui.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrutura &lt;em&gt;for&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Alguns alunos ao me mostrar o código que estavam exercitando, disseram que o programa estava entrando em loop. Veja o que está acontecendo:&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="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
   &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando estamos conhecendo como funcionam as estruturas, precisamos ter atenção e aprender o que cada um dos parâmetros faz. No caso do &lt;em&gt;for&lt;/em&gt;, temos no primeiro a atribuição de um valor inicial (i=3), no segundo uma comparação como critério de parada (i&amp;lt;=10) e no terceiro um incremento do valor (i++).&lt;br&gt;
O detalhe errado aqui foi justamente no incremento, por falta de atenção ou entendimento, foi escrita uma atribuição i=i onde o ++ foi ignorado.&lt;br&gt;
Desta forma temos o incremento que não sai do mesmo valor de i=i (substituindo pelos valores 3=3), nunca chegando no critério de parada de um número maior que 10.&lt;br&gt;
A correção pode ser feita assim:&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="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Estrutura &lt;em&gt;while&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Alguns dos códigos que recebi estavam entrando em estruturas quando não eram para entrar e vice-versa. Observe o trecho a seguir:&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;class&lt;/span&gt; &lt;span class="nc"&gt;Main&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;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;flower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
           &lt;span class="c1"&gt;// ...&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flower&lt;/span&gt; &lt;span class="o"&gt;=!&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;flower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O objetivo era entrar na estrutura de repetição &lt;em&gt;while&lt;/em&gt;, porém não entrou. O motivo foi uma simples troca de ordem de símbolos que não acusou nenhum erro ao executar, percebeu?&lt;/p&gt;

&lt;p&gt;Mas por que não acusou nenhum erro? Vejamos, sintaticamente a escrita do código não está incorreta, apesar de não ter o sentido que queríamos. O que está acontecendo na linha do &lt;em&gt;while&lt;/em&gt; é uma atribuição da negação em vez de uma comparação de diferença.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(flower =! true) // atribuição
(flower != true) // comparação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seja, na primeira expressão flower recebe !true (que é false). Na segunda expressão é comparado se o valor de flower é diferente de true.&lt;/p&gt;

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

&lt;p&gt;Entender se torna mais produtivo do que decorar, busque por detalhes quando estiver aprendendo, faça testes em cima de valores conhecidos para ter certeza que está correto e lembre-se que nem sempre estar funcionando significa estar certo.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>java</category>
      <category>learning</category>
    </item>
    <item>
      <title>Conte sua história</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Tue, 21 Mar 2023 02:37:02 +0000</pubDate>
      <link>https://dev.to/feministech/conte-sua-historia-3912</link>
      <guid>https://dev.to/feministech/conte-sua-historia-3912</guid>
      <description>&lt;p&gt;Eu era da área de Arquitetura e Urbanismo, em agosto de 2018 entrei no curso técnico em Informática para Internet pois vi alguns conteúdos sobre casas inteligentes. Eu não tinha ideia do que estava por vir, aos meus 27 anos de idade tive o primeiro contato com código, com a linguagem &lt;em&gt;JavaScript&lt;/em&gt; (a qual não funcionava muitas vezes pois eu escrevia a tag errada).&lt;/p&gt;

&lt;p&gt;A cada aula, aprendendo um pouquinho mais, um passo de cada vez, criando pequenos grandes projetos... foi assim que em um semestre eu troquei a graduação em Arquitetura e Urbanismo por Ciência da Computação.&lt;/p&gt;

&lt;p&gt;Eu me sentia realmente bem conseguindo desenvolver os projetos, aprendendo com os erros (que eram muitos), me envolvendo com projetos de extensão dentro da faculdade, achava tudo tão incrível que queria mostrar para outras pessoas, porém não sabia muito bem como. Apesar de ir bem nas disciplinas, eu ainda não me sentia capaz de compartilhar o que estava aprendendo, junto com a ansiedade e dificuldade de comunicação que sempre tive, tinha mais alguma coisa que eu não sabia descrever.&lt;/p&gt;

&lt;p&gt;Depois de um ano de faculdade, vieram mais mudanças. Pandemia, aulas a distancia, dificuldades, decidi parar um pouco, por um semestre. Foi nesse tempo 'ocioso' que tive a sorte de conhecer &lt;strong&gt;pessoas incríveis&lt;/strong&gt; e consegui entender aquela coisa que me impedia de mostrar para o mundo o que eu queria.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  REPRESENTATIVIDADE
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conhecer pessoas e histórias com as quais eu me identificava, poder contar a minha história e meus medos em um lugar seguro, ter apoio e incentivo, era isso que eu precisava para começar.&lt;/p&gt;

&lt;p&gt;Então comecei, em dezembro de 2020 consegui um notebook, instalei alguns programas, peguei uma lista de exercícios e abri uma live na Twitch. Foi assim o começo da minha jornada com objetivo inicial de melhorar minha comunicação. Além disso, também quis mostrar que se for tua vontade, &lt;strong&gt;tu podes ocupar esse lugar&lt;/strong&gt;, podes compartilhar o que tu aprendeu sem precisar ser expert ou nunca errar, até porque através de erros podemos aprender cada vez mais.&lt;/p&gt;

&lt;p&gt;Por fim, agradeço &lt;strong&gt;imensamente&lt;/strong&gt; à todas que vieram antes de mim, vocês que me deram coragem e possibilitaram que eu trilhasse esse caminho de uma maneira mais segura. Espero muito que eu possa inspirar e encorajar mais pessoas que se identificam com a minha história a darem seus primeiros passos e crescerem ao &lt;em&gt;infinito e além&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;Conheça mais pessoas maravilhosas: &lt;a href="https://feministech.com.br/"&gt;Feministech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enjoy!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Padrão de projeto - Iterator</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Mon, 11 Jul 2022 04:06:40 +0000</pubDate>
      <link>https://dev.to/feministech/padrao-de-projeto-iterator-4a4j</link>
      <guid>https://dev.to/feministech/padrao-de-projeto-iterator-4a4j</guid>
      <description>&lt;p&gt;O &lt;strong&gt;Iterator&lt;/strong&gt; é um padrão de projeto comportamental que permite percorrer em elementos de uma coleção sem precisar saber como isso está acontecendo debaixo dos panos, independente de ser lista, pilha, árvore, etc.&lt;/p&gt;




&lt;h2&gt;
  
  
  Estrutura de dados
&lt;/h2&gt;

&lt;p&gt;Dentre as estruturas citadas acima, vamos utilizar uma árvore como exemplo:&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%2F2h4ytm4xvgml0gqdcxix.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%2F2h4ytm4xvgml0gqdcxix.png" alt="Árvores com setas indicando o tipo de acesso, em profundidade e em largura" width="600" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver na imagem acima, a árvore pode ser acessada de diferentes maneiras, de acordo com o solicitado pelo cliente, podendo ter acesso em &lt;strong&gt;profundidade&lt;/strong&gt; ou em &lt;strong&gt;largura&lt;/strong&gt;, além da possibilidade de implementação de outros tipos de acesso aos elementos.&lt;/p&gt;

&lt;p&gt;O Iterator é um padrão que extrai essas diferentes formas de percorrer uma árvore para um objeto chamado &lt;strong&gt;iterável&lt;/strong&gt;, segue a imagem:&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%2Ftt3zm1c3fm6tcniear5r.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%2Ftt3zm1c3fm6tcniear5r.png" alt="Arvores e UML contendo os métodos de busca em profundidade e em largura" width="400" height="470"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Exemplo simples:&lt;br&gt;
Implementar um mecanismo de busca, onde o cliente vai utilizar o método getBusca() sem saber com qual algoritmo o método foi desenvolvido - Bubble Sort, Merge Sort, Quick Sort...&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Quando usar?
&lt;/h2&gt;

&lt;p&gt;Esse padrão pode ser utilizado quando a complexidade da estrutura de dados não é interessante para o cliente. O acesso aos elementos é fornecido através de métodos simples, encapsulando os detalhes do algoritmo, trazendo mais proteção às coleções, as quais não serão manipuladas diretamente.&lt;/p&gt;

&lt;p&gt;Outra vantagem de definir a &lt;strong&gt;responsabilidade&lt;/strong&gt; de percorrer a estrutura de dados para o iterador, tirando ela de dentro da regra de negócio, se dá no tempo que os algoritmos não triviais levam para buscar um elemento. Também pelo fato de que o objeto iterador tem seu próprio estado de iteração, sendo possível mais de um objeto percorrer a mesma coleção em paralelo. Assim o código do cliente se torna mais limpo e focado em seus objetivos.&lt;/p&gt;


&lt;h2&gt;
  
  
  Iterator no Python
&lt;/h2&gt;

&lt;p&gt;O python possui um módulo Iterator e Iterable, para criar os iteradores e os objetos iteráveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections.abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este módulo implementa os métodos __iter()__ e __next()__, os quais são necessários para um objeto ser iterável no Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RandomIterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__next__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;go&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;go&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;StopIteration&lt;/span&gt;
        &lt;span class="c1"&gt;# Sinaliza o fim da iteração
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando o iterator.py
&lt;/h3&gt;

&lt;p&gt;Em um arquivo chamado iterator.py, criamos a classe InsertOrder, a qual vai definir a ordem que os elementos de uma coleção serão percorridos - implementamos a função __next()__ aqui.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;_position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;_reverse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_reverse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__next__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_position&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_reverse&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;StopIteration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;classe InsertOrder: possui atributos de posição do elemento e indicação se a coleção deve ser iterada na ordem normal ou reversa&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função __init__: construtor da classe&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função __next__: itera o objeto até não ter mais posições de índices, caindo na except, onde finaliza a iteração, aqui também verificamos se a busca vai ser normal ou reversa&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No mesmo arquivo, criamos a classe WordsCollection, essa definirá um objeto iteravel, onde será implementada a segunda função necessária do Iterator, a __iter()__.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WordsCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;outras_formas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# desenvolver outras formas de percorrer a coleção
&lt;/span&gt;        &lt;span class="bp"&gt;...&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;InsertOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colletion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;classe WordsCollection: recebe a estrutura de dados, aqui usamos uma lista para facilitar o entendimento&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função __init__: construtor da classe, ele vai receber a coleção para iterar&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função __iter__: invoca a classe InsertOrder, passa a coleção como parâmetro e retorna um iterador&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função get_reverse: invoca a classe InsertOrder, passa a coleção e a sinalização de ordem reversa como parâmetros e retorna um iterador&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função outras_formas: um exemplo criado sem implementação, podendo criar diferentes regras de busca na mesma coleção, retornando também um iterator&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;função add_item: adiciona elementos à uma coleção&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criando o cliente.py
&lt;/h3&gt;

&lt;p&gt;O cliente é quem vai utilizar o iterador, sem precisar saber sobre suas regras de busca, apenas passando a coleção e indicando o método.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;instance_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;WordsCollection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WordsCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;função instance_collection: instancia um &lt;strong&gt;objeto iterável&lt;/strong&gt;, nesse caso uma lista de strings e retorna essa coleção&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Executando o cliente.py
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IFSC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Programação&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Laboratório&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Professor&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Aluno&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;instance_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;variável elements: definimos uma lista de elementos&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;variável collection: chama a função para instanciar um objeto iterável, passando como parametro &lt;strong&gt;elements&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Iterando pela &lt;strong&gt;collection&lt;/strong&gt; de forma normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IFSC
Programação
Laboratório
Professor
Aluno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iterando pela &lt;strong&gt;collection&lt;/strong&gt; de forma reversa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_reverse&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Aluno
Professor
Laboratório
Programação
IFSC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Com algumas adaptações no &lt;strong&gt;iterator.py&lt;/strong&gt;, podemos fazer a iteração de diversas coleções e estruturas, sem a necessidade de alterar o código &lt;strong&gt;cliente.py&lt;/strong&gt;, pois esse apenas consumirá o iterador.&lt;/p&gt;




&lt;p&gt;Conhecendo mais sobre o módulo &lt;a href="https://docs.python.org/pt-br/3/library/collections.abc.html"&gt;collections.abc&lt;/a&gt; e &lt;a href="https://wiki.python.org/moin/Iterator"&gt;iterator&lt;/a&gt; do Python.&lt;/p&gt;

&lt;p&gt;Pessoas que compartilham conhecimentos na comunidade: &lt;a href="https://www.twitch.tv/videos/1500280222?collection=LjAXvKRbmBY8zw"&gt;vcwild&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/iterator"&gt;Principal referência&lt;/a&gt; para desenvolvimento deste artigo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bugelseif/IteratorPattern"&gt;Repositório&lt;/a&gt; com o código completo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enjoy!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>python</category>
    </item>
  </channel>
</rss>
