<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by João Victor Lima on Medium]]></title>
        <description><![CDATA[Stories by João Victor Lima on Medium]]></description>
        <link>https://medium.com/@jvroot?source=rss-4153c18e8fd7------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ALRsyq6lu3X_bFTRBPWB2w.jpeg</url>
            <title>Stories by João Victor Lima on Medium</title>
            <link>https://medium.com/@jvroot?source=rss-4153c18e8fd7------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 23 May 2026 16:30:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@jvroot/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Democratization of Software Performance Testing]]></title>
            <link>https://medium.com/@jvroot/democratization-of-software-performance-testing-4575b4306360?source=rss-4153c18e8fd7------2</link>
            <guid isPermaLink="false">https://medium.com/p/4575b4306360</guid>
            <category><![CDATA[load-testing]]></category>
            <category><![CDATA[jmeter]]></category>
            <category><![CDATA[performance-testing]]></category>
            <category><![CDATA[stress-testing]]></category>
            <category><![CDATA[k6]]></category>
            <dc:creator><![CDATA[João Victor Lima]]></dc:creator>
            <pubDate>Thu, 21 Mar 2024 23:40:45 GMT</pubDate>
            <atom:updated>2024-03-21T23:44:49.256Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/646/0*46eqLlHqf3DQ9abe.png" /></figure><h3>Introduction</h3><p>Hey, guys! I hope everyone is doing well!</p><p>Today, I’ll be starting a new series of articles dedicated to a topic that interests me a lot: Software Performance. It’s a subject that I find few materials about on the internet, but it’s extremely important, especially in the context of large-scale software.</p><p>In this initial article, my goal is to present a more theoretical approach, providing an overview of performance. However, in the upcoming editions, I intend to bring a more practical bias.</p><p>Without further ado, let’s get started! :)</p><h4>1.1 Contextualization</h4><p>Software Performance Testing plays a crucial role in today’s scenario, characterized by speed and intense competition among companies. In this context, organizations face the constant demand to deliver high-quality products and services while simultaneously meeting customer expectations.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fbk8UGCysurqC2gmJ0o%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2Fbk8UGCysurqC2gmJ0o%2Fgiphy.gif&amp;image=https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExcHg3bGJ5MHo2ODlyaWZxbWwxdm9hZDRmaDY0dGcycXM2djg5M3ZnbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fbk8UGCysurqC2gmJ0o%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="333" frameborder="0" scrolling="no"><a href="https://medium.com/media/b9119732fed62713e0f6e18f4ea661ae/href">https://medium.com/media/b9119732fed62713e0f6e18f4ea661ae/href</a></iframe><h4>1.2 Real World Scenario</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A2wPQu0E97Ma5jJnonEW5A.png" /></figure><blockquote><em>“ […] </em><a href="https://www.businessinsider.com/amazon-down-on-prime-day-2018-7">The retailer’s website crashed</a> at the same time its Prime Day deals were scheduled to begin in the United States, on Monday, July 16, at 3 p.m. ET. The site responded with a 404 error. <em>[…] ”</em></blockquote><blockquote>“ <em>[…] </em>Some customers are having difficulty shopping, and we’re working to resolve this issue quickly,” Amazon <a href="https://twitter.com/amazon/status/1018963427392348160">said</a> <em>[…] ”</em></blockquote><h4>1.3 Benefits of Performance Testing</h4><p>By evaluating the speed, scalability, and stability of applications, websites, and other digital products, performance testing plays a fundamental role in identifying and resolving any issues before they impact end-users.</p><p>Analysis of the data resulting from tests reveals improvement opportunities, allowing the implementation of corrective actions and adjustments during development. This prevents downtime, failures, and other performance-related issues.</p><p>This approach not only increases customer satisfaction but also provides essential answers to key questions such as:</p><blockquote>“Is my application operating efficiently?”</blockquote><blockquote>“What is its performance in different scenarios, such as X or Y?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qj8PEPOloTY1Z22_Tm6qMg.png" /></figure><h3>2.0 Performance Testing Scenarios</h3><p>When we think about scenarios for Performance Testing, there are two models:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dBn99WBl6OwYPBbsDVgtsg.png" /></figure><p>Both scenarios are essential to ensure the efficiency and proper functioning of the software. “End to End” testing evaluates the overall performance of the system, while isolated testing allows optimization of specific components.</p><h3>3.0 Types of Performance Testing</h3><p>There are various approaches to performance testing, but generally, they focus on the following types:</p><h4>3.1 Load Testing</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2jke7IdpVj2dyTpLytslQQ.png" /></figure><p>Load testing plays a crucial role in capacity planning, ensuring that a system can handle the growth of simultaneous user traffic.</p><p>Its role lies in the system’s ability to manage an increase in actual load levels, derived from user requests or controlled processes. This approach seeks to anticipate challenges, ensuring the system’s efficiency in the face of growing demands.</p><h3>3.2 Stress Testing</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hhONlCBWCCHLgdZOjTW4cA.png" /></figure><p>Stress testing focuses on a system’s or component’s ability to handle user load spikes that exceed predicted or specified limits. Additionally, it evaluates the system’s ability to cope with reduced infrastructure resources, such as processing capacity, bandwidth, and memory.</p><h4>3.3 Spike Testing</h4><p>Spike testing aims to test the maximum capacity of an application to handle a very high workload in a short period of time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rzcGZNXgTJi448NdZ3-uig.png" /></figure><p>This test helps determine if the system’s performance deteriorates when there is a sudden increase in load. Another goal of this test is to determine the system’s recovery time. Between two consecutive user load peaks, the system needs some time to stabilize. This recovery time should be as low as possible.</p><h4>3.4 Endurance Testing</h4><p>Endurance testing verifies a system’s ability to continue operating stably under a constant workload, usually for an extended period.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4UoK3JkBDeQH0OAA7IYlbA.png" /></figure><p>The goal is to assess the system’s ability to handle a constant load without experiencing resource problems such as memory leaks, database connection overload, or other types of failures that could negatively affect system performance and cause disruptions.</p><h3>4.0 How to Evaluate Performance Testing?</h3><p>During a performance test, it is essential to analyze various metrics to evaluate the system’s performance. Some of the main ones include:</p><h4>4.1 Response Times</h4><p>The total time elapsed from the user’s request to the delivery of a response to a request is a common measure of application performance. This measure is usually expressed in milliseconds, according to market standards.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3IxTkKalIrw6l6T4-DDVzA.png" /></figure><h4>4.2 Throughput</h4><p>Throughput measures the number of requests a system can process within a certain period of time. This metric is usually measured in requests per second (RPS).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n4f8QZWczPeZRny6sZsVPQ.png" /></figure><p>It is important that the throughput graph can keep up with the growth of user load to ensure that the system can handle increased traffic.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZaIsYxlZ-FULjZ8m35VnJA.png" /></figure><p>If throughput does not increase proportionally to user load, it may indicate performance bottlenecks that need to be investigated.</p><h4>4.3 Percentile</h4><p>The percentile is a measure that divides a sample of ordered values into one hundred parts, used to analyze the distribution of response times in ascending order. Different percentiles, such as the<strong> 50th, 90th, and 95th</strong>, can be established to identify specific points of interest.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*TBm2_rPZzZGqFfPi.jpg" /><figcaption><a href="https://www.timescale.com/blog/how-percentile-approximation-works-and-why-its-more-useful-than-averages/">https://www.timescale.com/blog/how-percentile-approximation-works-and-why-its-more-useful-than-averages/</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*7a2Pel1rsApfnQt5.png" /></figure><p>This approach ensures that all previous points are below this value, while subsequent points are above it, providing a detailed understanding of the data distribution.</p><h4>4.4 Error Rate</h4><p>The error rate is the indicator that calculates the percentage of requests with errors relative to the total number of requests.</p><p>When we talk about Web applications, whenever a request is made to the application, the server will return an HTTP code. This code indicates whether the request was successful, if there was any redirection, or if something went wrong. These codes are classified into the following ranges:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*uQcdCLIctSUXmr9J.png" /></figure><p>Returns with error codes 4xx and 5xx increase the error rate and can help identify when the application began to not support the volume of accesses.</p><p>It is important to note that these codes do not inform about the cause of the problem but guide the error investigation.</p><h3>5.0 Sources and References</h3><p>My main reference in creating this article is the Performance Testing certification from the ISTQB (International Software Testing Qualifications Board) institution.</p><p>For more detailed information, I recommend taking a look at the official documentation through the following link:</p><p><a href="https://www.istqb.org/">Welcome to ISTQB®</a></p><p>Additionally, a great site to learn about performance is Blazemeter:</p><p><a href="https://www.blazemeter.com/">BlazeMeter Continuous Testing | BlazeMeter by Perforce</a></p><p>Follow me on social media:</p><p>LinkedIn — (<a href="https://www.linkedin.com/in/jvroot/">https://www.linkedin.com/in/jvroot/</a>)</p><p>Github — (<a href="https://github.com/JV-root">https://github.com/JV-root</a>)</p><p>Corki’s thumbs up:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/0*Lelrtijv7P1Qpq8o.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4575b4306360" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Matemática com Python Noções de Lógica e Tabela Verdade]]></title>
            <link>https://medium.com/@jvroot/aprendendo-matem%C3%A1tica-com-python-no%C3%A7%C3%B5es-de-l%C3%B3gica-e-tabela-verdade-bc97f60030f3?source=rss-4153c18e8fd7------2</link>
            <guid isPermaLink="false">https://medium.com/p/bc97f60030f3</guid>
            <category><![CDATA[logic]]></category>
            <category><![CDATA[sympy]]></category>
            <category><![CDATA[math]]></category>
            <category><![CDATA[latex]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[João Victor Lima]]></dc:creator>
            <pubDate>Mon, 26 Feb 2024 14:40:09 GMT</pubDate>
            <atom:updated>2024-02-26T15:09:22.726Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5_1kB3dyPCWk1KeYJeP2Ug.jpeg" /></figure><h3>1.0 Introdução</h3><p>Fala, pessoal! Sejam muito bem-vindos à mais uma etapa da nossa jornada de aprendizado de Matemática com Python!</p><p>Nesta edição, escrevi bastante sobre a parte histórica do tema, pois confesso que me divirto muito aprendendo sobre. Então para aqueles que desejam ir diretamente à aplicação em Python, pulem para a parte <strong><em>3.0 Noções de Lógica Booliana em Python.</em></strong></p><p>Sem mais enrolação, vamos nessa!</p><h3>2.0 Noções de Lógica</h3><p>A lógica é o alicerce da matemática, proporcionando as regras essenciais do raciocínio e fundamentando as decisões sobre a validade de argumentos e proposições.</p><p>Além do campo da matemática, na Ciência da Computação, a lógica tem um papel crucial. Um raciocínio lógico sólido é essencial para a construção de códigos com desempenho otimizado, melhor legibilidade e dinamicidade.</p><blockquote><em>“Ela [a Lógica] lhe dará clareza de pensamento, a habilidade de ver seu caminho através de um quebra-cabeça, o hábito de arranjar suas ideias numa forma acessível e ordenada e, mais valioso que tudo, o poder de detectar falácias e despedaçar os argumentos ilógicos e inconsistentes que você encontrará tão facilmente nos livros, jornais, na linguagem cotidiana e mesmo nos sermões e que tão facilmente enganam aqueles que nunca tiveram o trabalho de instruir-se nesta fascinante arte” — </em><strong><em>Lewis Carrol</em></strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/740/1*s68ouHWwIaygZD6se59JnQ.png" /><figcaption><a href="https://pt.wikipedia.org/wiki/Alice_no_Pa%C3%ADs_das_Maravilhas">Alice no Pais das Maravilhas — Lewis Carrol</a></figcaption></figure><p>Mas como tudo isso teve início?</p><h3>2.1 A Lógica Aristotélica</h3><p>Na Grécia Clássica, por volta de 350 a,C., o pensador grego Aristóteles desenvolveu a primeira tentativa para estabelecer os princípios fundamentais da lógica.</p><p>Insatisfeito com o método dialético de Sócrates, que se baseava em questionar hipóteses expondo incoerências e contradições, Aristóteles buscou estruturar argumentos lógicos de maneira sistemática. Ele identificou diferentes tipos de proposições e introduziu o conceito de silogismo, uma forma lógica composta por duas premissas que levam a uma conclusão.</p><p>O mais famoso exemplo de silogismo é:</p><blockquote><em>“Todos os homens são mortais.</em></blockquote><blockquote><em>Aristóteles é homem,</em></blockquote><blockquote><em>Logo,</em></blockquote><blockquote><em>Aristóteles é mortal.”</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lP_NjrMUtZgro1jKn4zUjw.png" /><figcaption><a href="https://www.amazon.com.br/Math-Book-DK/dp/1465480242">The Math Book</a></figcaption></figure><h3>2.2 A Álgebra Booliana</h3><p>No século XIX, um momento crucial marcou o início da lógica como uma disciplina da matemática.<strong> George Boole</strong>, um renomado matemático britânico, envolveu-se em uma disputa filosófica com o seu amigo <strong>Augustus De Morgan</strong> (guarde esse nome) sobre a autoria de uma ideia específica.</p><p>Embora Boole não estivesse diretamente envolvido, o evento o inspirou a desenvolver suas ideias sobre a formalização da lógica por meio da matemática, como descrito em seu ensaio de 1847, intitulado <strong>“Análise Matemática da Lógica”</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/259/1*igdaMTKj11x7iWdZVVu5Vg.png" /><figcaption><a href="https://www.gutenberg.org/files/36884/36884-pdf.pdf">Livro de Boole</a></figcaption></figure><p>Boole queria formular <strong>argumentos lógicos </strong>de maneira que pudessem ser manipulados e resolvidos matematicamente. Para alcançar esse objetivo, ele introduziu uma espécie de <strong>álgebra linguística</strong>, substituindo as operações comuns da álgebra, como adição e multiplicação, pelos <strong>conectores</strong> utilizados na lógica.</p><p>Similar à álgebra, o uso de símbolos e conectivos por Boole permitiu a simplificação de expressões lógicas.</p><p>As três principais operações da álgebra booleana são:</p><p><strong>E (AND), OU (OR) e NÃO (NOT)</strong></p><p>Boole acreditava que essas eram as únicas operações necessárias para realizar comparações de conjuntos, assim como funções matemáticas básicas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WlYNe6t1ENkYoTfaVge7yg.png" /><figcaption><a href="https://www.amazon.com.br/Math-Book-DK/dp/1465480242">The Math Book</a></figcaption></figure><p>E onde mais você encontra operações que resultam em 1 (True) ou 0 (False)? ISSO MESMO, NO PYTHON!</p><h3>3.0 Noções de Lógica Booliana em Python</h3><p>Antes de mais nada, gostaria de falar um pouco sobre a biblioteca que iremos utilizar nesta aula e em 99% das aulas aqui pra frente.</p><h4>3.1 Sympy</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*x0hSFni5B9XyrAJT.png" /><figcaption><a href="https://www.sympy.org/en/index.html">Documentação Sympy</a></figcaption></figure><p>O Sympy é uma biblioteca de computação simbólica em Python, amplamente reconhecida por sua eficiência e versatilidade no processamento de expressões matemáticas complexas.</p><p>Com o Sympy, podemos realizar uma variedade de operações matemáticas, desde simplificações algébricas até cálculos de integrais e diferenciação simbólica (Alô pessoal de Calculo, essa é para vocês! 🧙‍♂️).</p><p>Um Exemplo maneiro do Sympy com equação:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/429/1*FB1U-SuJfNVVtz7tj_VKTw.png" /><figcaption>Equação — Sympy</figcaption></figure><p>agora um exemplo mais complexo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/565/1*pYrN22hdBfNyvwPRc2cG4g.png" /><figcaption>Fórmula de Bhaskara — Sympy</figcaption></figure><p>Inicialmente, pode parecer bastante coisa para absorver, porém, o Sympy é uma biblioteca muito maneira para aprender. Quando combinado com o LaTeX, se torna um conjunto poderoso de ferramentas para entender os conceitos matemáticos.</p><p>Abordarei outros aspectos do Sympy em momentos subsequentes.</p><p>Finalmente, vamos aos conceitos:</p><h3>3.2 Preposição</h3><p>Um dos principais conceitos em lógica é o de preposições (ou proposições) que basicamente é uma afirmação que pode ser claramente identificada como <strong>verdadeira</strong> ou <strong>falsa</strong>.</p><p>Por exemplo, a afirmação:</p><p>𝑃: ‘O céu é azul’</p><p>É uma proposição porque pode ser verificada e classificada como <strong>verdadeira</strong> ou<strong> falsa</strong>.</p><p>Além disso, existem outras regras importantes ao se criar uma preposição:</p><ul><li><strong>Simplicidade</strong> — Deve ser simples, contendo apenas uma afirmação básica.</li><li><strong>Clareza na Linguagem</strong> — A linguagem usada deve ser precisa, evitando ambiguidades.</li><li><strong>Consistência Interna</strong> — Não pode conter contradições internas.</li><li><strong>Completude</strong> — Deve ser completa o suficiente para determinar sua veracidade ou falsidade.</li><li><strong>Independência</strong> — Cada proposição deve ser independente de outras.</li></ul><p>Demostrando em Python fica assim:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/345/1*yjm5ri6vd17Decgni7qGEg.png" /><figcaption>Preposição — Sympy</figcaption></figure><p>É importante salientar que nem todas as afirmações ou frases podem ser classificadas como proposições. Aqui estão alguns exemplos de coisas que <strong>não</strong> são proposições:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*CXnEzJYOotuuoT12BMmreg.png" /><figcaption>O que não é Preposição</figcaption></figure><h3>3.3 Negação</h3><p>A negação de uma proposição é a operação lógica que inverte o seu valor de verdade. Se uma proposição ‘p’ é <strong>verdadeira</strong>, a sua <strong>negação</strong>, denotada por ‘~p’ ou ‘<strong>não</strong> p’, é <strong>falsa</strong>, e vice-versa.</p><p>Por exemplo, a afirmação:</p><p><strong>p</strong>: ‘O céu é azul’</p><p>Sua negação é:</p><p><strong>~p</strong>: ‘O céu não é azul’</p><p>a negação de uma preposição tem suas regras também, e são elas:</p><ul><li><strong>Lei da Dupla Negação</strong>: A negação da negação de uma proposição <strong>P</strong> é equivalente a <strong>P</strong>. Ou seja, Matematicamente,<strong> ∼(∼𝑃)=𝑃</strong></li><li><strong>Lei da Contradição</strong>:Uma proposição e sua negação não podem ser ambas verdadeiras ao mesmo tempo.Matematicamente, <strong>𝑃 ∨ ¬ 𝑃 = False</strong></li><li><strong>Lei do Terceiro Excluído</strong>: Para qualquer proposição 𝑃, a proposição <strong>𝑃 ∨¬𝑃</strong> é sempre verdadeira. Matematicamente, <strong>𝑃 ∨¬ 𝑃= True</strong></li></ul><p>Demostrando em Python fica assim:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/1*6bAk_tLI3kRJp4qMrLaMIg.png" /><figcaption>Preposição — Sympy</figcaption></figure><h3>3.4 Proposições Composta</h3><p>Uma proposição composta é formada pela combinação de duas ou mais proposições simples, utilizando conectivos lógicos como ‘e’ (conjunção), ‘ou’ (disjunção), ‘se… então…’ (condicional) e ‘se e somente se’ (bicondicional).</p><p>Antes de irmos para os conectivos lógicos, é importante abordar o conceito de Tabela Verdade.</p><h3>3.4.1 Tabela Verdade</h3><p>A tabela verdade é uma representação tabular que mostra todas as combinações possíveis de valores (Verdadeiro ou Falso) para uma dada proposição composta.</p><p>É um recurso muito útil para analisar argumentos e expressões lógicas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*1WUOlRn8z-OoSoxvqV-dyQ.png" /><figcaption>Tabela Verdade</figcaption></figure><h3>3.4.2 Conjunção</h3><p>A conjunção de proposições, muitas vezes representada pelo operador lógico “E” (∧), é uma operação que combina duas proposições para formar uma nova proposição composta.</p><p>Vamos chamar as duas proposições de <strong>𝑃</strong> e <strong>𝑄</strong>.</p><ul><li>A conjunção <strong>𝑃∧𝑄</strong> é verdadeira somente quando ambas as proposições <strong>𝑃 </strong>e<strong> 𝑄</strong> são verdadeiras.</li><li>Se qualquer uma das partes for falsa, a proposição composta também será falsa.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/532/1*CPhhi82AsvtL74C27Ocflw.png" /></figure><h3>Tabela Verdade Conjunção</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*1WUOlRn8z-OoSoxvqV-dyQ.png" /></figure><h3>3.4.3 Disjunção</h3><p>A disjunção de proposições, frequentemente representada pelo operador lógico “OU” (∨), é uma operação que combina duas proposições para formar uma nova proposição composta.</p><p>Vamos chamar as duas proposições de <strong>𝑃</strong> e <strong>𝑄</strong>.</p><ul><li>A disjunção <strong>𝑃∨𝑄</strong> é verdadeira se <strong>pelo menos uma</strong> das proposições <strong>𝑃</strong> ou 𝑄 for <strong>verdadeira</strong>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/561/1*iMWRclr4jJEAeqpyACpYLA.png" /></figure><h3>Tabela Verdade Disjunção</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*hbzpsnSQZYxhNQHdrosuBA.png" /></figure><h3>3.4.4 Condicionais</h3><p>As condicionais de proposições, frequentemente representadas pelo operador lógico “Se… então…” (→), são uma forma de implicação lógica. Vamos chamar as duas proposições de <strong>𝑃</strong> (antecedente) e <strong>𝑄</strong> (consequente).</p><p>A condicional <strong>𝑃→𝑄</strong> é uma afirmação que estabelece uma relação entre as duas proposições da seguinte maneira: se <strong>𝑃</strong> for verdadeiro, então <strong>𝑄</strong> também é verdadeiro.</p><p><strong>Lei do Modus Ponens</strong>:</p><ul><li>Se <strong>𝑃→𝑄</strong> é verdadeiro e<strong> 𝑃</strong> é verdadeiro, então podemos concluir que <strong>𝑄</strong> também é verdadeiro.</li></ul><p><strong>Lei do Silogismo Hipotético</strong>:</p><ul><li>Se <strong>𝑃→𝑄</strong> e <strong>𝑄→𝑅</strong> são ambos verdadeiros, então podemos concluir que <strong>𝑃→𝑅</strong> é verdadeiro.</li></ul><p><strong>Contrapositiva</strong>:</p><ul><li>A contrapositiva de <strong>𝑃→𝑄</strong> é <strong>¬𝑄→¬𝑃</strong>.Se a contrapositiva é verdadeira, então a condicional original também é verdadeira.</li></ul><p>Vamos a um exemplo de Condicionais em Python:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/712/1*nRNlJIvCUZ9cZdIJpnH61g.png" /></figure><h3>Tabela Verdade Condicionais</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*TgVp67AHCuQ6ZdpHRahvBg.png" /></figure><h3>3.4.5 Bicondicionais</h3><p>Uma proposição bicondicional, frequentemente denotada por <strong>𝑃↔𝑄</strong> expressa uma relação “se e somente se” entre duas proposições <strong>𝑃</strong> e <strong>𝑄</strong>. A proposição bicondicional é verdadeira se ambas 𝑃 e 𝑄 tiverem os mesmos valores de verdade (ambas verdadeiras ou ambas falsas), e falsa em todos os outros casos.</p><p><strong>𝑝↔𝑞 = (𝑝→𝑞)∧(𝑞→𝑝)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/761/1*kFH-ISRaFJgeJ9UXvKRPAQ.png" /></figure><h3>Tabela Verdade Bicondicional</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*DHJ6hVpHc_cMWbv3LJ06Og.png" /></figure><h3>3.5 Tautologias</h3><p>Uma tautologia é uma proposição composta que é sempre verdadeira, independentemente do valor de verdade das proposições que a compõem.</p><p>Em outras palavras, uma tautologia é uma expressão lógica que é verdadeira em todas as situações possíveis.</p><p>Para verificar se uma proposição é uma tautologia, você pode construir a sua tabela verdade correspondente. Se, em todas as linhas da tabela, a proposição resultar em “verdadeiro” (V), então ela é considerada uma tautologia.’</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/476/1*DqZERQKEAc2dZjGSYxO03g.png" /></figure><h3>Tabela Verdade Tautologia</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*H4aFIPQxAB1t8nWXLlI1Eg.png" /></figure><h3>3.6 Leis de Morgan</h3><p>As leis de Morgan são um conjunto de regras na lógica matemática que fornecem uma forma de expressar negações de proposições compostas. As leis de Morgan são duas:</p><ol><li>Primeira Lei de Morgan:A negação de uma conjunção é equivalente à disjunção das negações das proposições individuais.</li></ol><p><strong>¬(𝑝∧𝑞)=(¬𝑝)∨(¬𝑞)</strong></p><ol><li>Segunda Lei de Morgan: A negação de uma disjunção é equivalente à conjunção das negações das proposições individuais.</li></ol><p><strong>¬(𝑝∨𝑞)=(¬𝑝)∧(¬𝑞)</strong></p><h3>3.7 Tabela Verdade em Python</h3><p>Uma forma maneira de criar tabelas verdade utilizando Python é através da biblioteca ‘truth-table-generator’. Ela permite gerar a tabela verdade de uma proposição com apenas algumas linhas de código e uma sintaxe simples.</p><p>Os operações são:</p><p>Operadores e suas representações:</p><ul><li><strong>Negação</strong>: ‘not’, ‘-’, ‘~’</li><li><strong>Disjunção lógica</strong>: ‘or’</li><li><strong>NOR lógico</strong>: ‘nor’</li><li><strong>Disjunção exclusiva</strong>: ‘xor’, ‘!=’</li><li><strong>Conjunção lógica</strong>: ‘and’</li><li><strong>NAND lógico</strong>: ‘nand’</li><li><strong>Implicação material</strong>: ‘=&gt;’, ‘implies’</li><li><strong>Bicondicional lógico</strong>: ‘=’</li></ul><p>Vamos a um exemplo simples, a tabela verdade de 𝑃∧𝑄</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/558/1*Cq1-Wr-KrJyRX_C2nGxLHQ.png" /></figure><p>Outros Exemplo, agora incluindo a disjunção:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/561/1*8eUkGi7W31Cu14rJec4igQ.png" /></figure><p>Podemos unir o Sympy com a Truth Table Generator, como no exemplo abaixo:</p><blockquote>“Se for um dia ensolarado (p) e eu tiver tempo livre (q), então irei à praia (r) ou farei um piquenique (s), mas não farei ambos.”</blockquote><pre># Definindo as variáveis simbólicas<br>p, q, r, s = symbols(&#39;p q r s&#39;)<br><br># Printando sentenças<br>display(f&#39;{p}: Se for um dia ensolarado.&#39;)<br>display(f&#39;{q}: e eu tiver tempo livre&#39;)<br>display(f&#39;{r}: então irei à praia&#39;)<br>display(f&#39;{s}: ou farei um piquenique&#39;)<br><br><br># Realizando Calculo<br>prep = Implies(And(p, q), And(Or(r, s), Not(And(r, s))))<br><br>print(&#39;\n Preposição completa&#39;)<br># Pritando Preposição completa<br>display(prep, &#39;Se for um dia ensolarado e eu tiver tempo livre, então irei à praia ou farei um piquenique, mas não farei ambos.&#39;)<br><br># Tabela Verdade<br>print(&#39;\n Tabela Verdade:&#39;)<br>print(ttg.Truths([&#39;p&#39;, &#39;q&#39;,&#39;r&#39;,&#39;s&#39;], [&#39;(p =&gt; q)&#39;, &#39;r or s&#39;, &#39;r =&gt; s&#39;, &#39;(p and q) implies ((r and s) and not(r or s))&#39;], ints=False))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wwt_dRlYYfX6PAkTw7MIIg.png" /></figure><h3>4.0 Portas Lógicas — O Legado de George Boole</h3><p>O impacto das ideias de Boole não foram compreendidas até cerca de sete décadas após sua morte.</p><p>O engenheiro americano Claude Shannon utilizou a <strong><em>“Análise Matemática da Lógica”</em></strong> de Boole para estabelecer os fundamentos dos circuitos de computadores digitais modernos.</p><p>Ele percebeu que o sistema binário de dois valores de Boole poderia servir como a base para portas lógicas, dispositivos físicos que operam com base em funções booleanas, no circuito.</p><p>Abaixo, a relação entre os Circuítos Lógicas e a Tabela Verdade:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qrptffsgg58_qQa3lmiysA.png" /></figure><h3>5.0 Considerações Finais</h3><p>Com isso, encerramos a segunda parte da série de artigos “Aprendendo Matemática com Python”. Nesta edição, irei deixar uma playlist do Youtube sobre <strong>Raciocínio Lógico Matemático</strong>, que usei como base para a criação do artigo e que recomendo muito!</p><p>Além disso, irei deixar outras fontes relevantes para o estudo de Algebra Booliana.</p><p>A partir dessa edição, irei estar disponibilizando os Notebooks Jupyter de cada artigo no meu Github, acessa lá!</p><h3>Curso de RLM:</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPL83s8LGM84J4Uj7Zylll5LTK26wm-q-7K&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPL83s8LGM84J4Uj7Zylll5LTK26wm-q-7K%26si%3Ddq-ALt-Yq532SCAM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F5ytuYyjOTJk%2Fhqdefault.jpg%3Fsqp%3D-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ%3D%3D%26rs%3DAOn4CLAiFlp1ORnX93iVgTBI7EmutS4vxg%26days_since_epoch%3D19779&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="853" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/1f4dcf1a7d2ecae94ead95ab183134c2/href">https://medium.com/media/1f4dcf1a7d2ecae94ead95ab183134c2/href</a></iframe><h3>Outros Links:</h3><p><a href="https://www.britannica.com/topic/history-of-logic/Aristotle">History of logic - Aristotle, Syllogism, Deduction</a></p><p><a href="https://www.todamateria.com.br/logica-aristotelica/">https://www.todamateria.com.br/logica-aristotelica/</a></p><p><a href="https://www.todamateria.com.br/logica-aristotelica/">https://www.todamateria.com.br/logica-aristotelica/</a></p><p><a href="https://study.com/academy/lesson/aristotelian-logic-aristotles-central-concepts-and-influence.html">https://study.com/academy/lesson/aristotelian-logic-aristotles-central-concepts-and-influence.html</a></p><p><a href="https://docs.sympy.org/latest/tutorials/intro-tutorial/printing.html">https://docs.sympy.org/latest/tutorials/intro-tutorial/printing.html</a></p><p>E por hoje é isso pessoal! Me sigam nas redes:</p><p>Linkedin — (<a href="https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fjvroot%2F">https://www.linkedin.com/in/jvroot/</a>)</p><p>Github — (<a href="https://github.com/JV-root">https://github.com/JV-root</a>)</p><p>Joinha do Corki:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/0*_psdHYYjZrDi2QiS.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bc97f60030f3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Democratização de Testes de Performance de Software]]></title>
            <link>https://medium.com/@jvroot/democratiza%C3%A7%C3%A3o-de-testes-de-performance-de-software-a432e6537fc8?source=rss-4153c18e8fd7------2</link>
            <guid isPermaLink="false">https://medium.com/p/a432e6537fc8</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[performance-testing]]></category>
            <category><![CDATA[software-testing]]></category>
            <dc:creator><![CDATA[João Victor Lima]]></dc:creator>
            <pubDate>Wed, 07 Feb 2024 15:41:43 GMT</pubDate>
            <atom:updated>2025-04-14T12:36:26.904Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/646/1*anGu6ohlyH3CXDo7KRzbQQ.png" /><figcaption>Imagem Gerada com Canva (<strong>Magic Studio™)</strong></figcaption></figure><h3>Introdução</h3><p>Olá, Pessoal! Espero que todos estejam bem!</p><p>Hoje estou começando uma nova série de artigos dedicados a um tema que me interessa muito: <strong>Performance de Software</strong>. É um assunto sobre o qual encontro poucos materiais na internet, mas que é de extrema importância, especialmente no contexto de sistemas de grande escala.</p><p>Neste artigo inicial, meu objetivo é apresentar uma abordagem mais teórica, fornecendo uma visão geral sobre performance. Porém, nas próximas edições, pretendo trazer um viés mais prático.</p><p>Sem mais delongas, vamos começar! :)</p><h3>1.1 Contextualização</h3><p>Os testes de performance de software desempenham um papel fundamental no cenário atual, caracterizado pela <strong>rápida evolução tecnológica</strong> e pela intensa concorrência entre as empresas.</p><p>Nesse contexto, as organizações enfrentam o desafio contínuo de entregar produtos e serviços de alta qualidade, ao mesmo tempo em que buscam atender às expectativas dos clientes.</p><h3>1.2 Cenário Real</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fYSGSvs18l2ZEpm-eavyXw.png" /><figcaption><a href="https://rollingstone.uol.com.br/noticia/publico-enfrenta-dificuldades-para-comprar-ingressos-para-o-lollapalooza-brasil/">Link para a notícia original</a></figcaption></figure><blockquote>“ […] O início das vendas online dos ingressos para o Lollapalooza Brasil foi marcado pela lentidão do site oficial. A partir da 0h, quando teve início o comércio, diversos usuários enfrentaram problemas com o sistema, que caía e data erro na hora de processar a compra. Outros tiveram dificuldade de acessar o site pelo esquema de senhas organizado previamente […] “</blockquote><p>Casos como esse reforçam a relevância dos testes de performance no desenvolvimento de sistemas que precisam lidar com grandes volumes de acesso. A falha enfrentada na venda de ingressos poderia ter sido evitada — ou ao menos mitigada — com a realização de testes adequados que simulassem cenários de carga e estresse.</p><p>A seguir, destacam-se os principais <strong>benefícios proporcionados por uma estratégia eficaz de testes de performance</strong>.</p><h3>1.3 Benefícios de Testes de Performance</h3><p>Ao avaliar <strong>velocidade</strong>, <strong>escalabilidade</strong> e a <strong>estabilidade</strong> de aplicativos, sites e outros produtos digitais, os testes de performance desempenham um papel fundamental na identificação e na resolução de problemas antes que impactem os usuários finais.</p><p>As análises dos dados resultantes dos testes revelam oportunidades de melhoria, permitindo a implementação de ações corretivas e ajustes durante o desenvolvimento. Isso previne <strong>indisponibilidade</strong>, <strong>falhas</strong> e outros problemas relacionados ao desempenho da aplicação.</p><p>Essa abordagem não apenas aumenta a satisfação do cliente, mas também fornece respostas essenciais para perguntas-chave, como:</p><blockquote>“Minha aplicação opera com eficiência?”</blockquote><blockquote>“Qual o seu desempenho em diferentes cenários, como X ou Y?”</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/1*8kLFOiftq47N75lpontDjg.png" /></figure><h3>2. Cenários de Teste de Performance</h3><p>Quando pensamos em cenários para Testes de Performance, existem dois modelos:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pDVbdLG8HK3fQlv9Q1HrqQ.png" /></figure><p>Ambos os cenários são essenciais para garantir a eficiência e o bom funcionamento do software. O teste “End to End” avalia o desempenho geral do sistema, enquanto o teste isolado permite a otimização de componentes específicos.</p><h3>3. Tipos de Teste de Performance</h3><p>Existem diversos tipos de abordagens para testes de desempenho, mas, de modo geral, concentram-se nos seguintes tipos:</p><h4>3.1 Teste de Carga</h4><p>Foca na capacidade de um sistema em lidar com crescentes níveis de carga, decorrentes de transações geradas por um número gradualmente maior de usuários ou processos controlados ou concorrentes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6BI1bShd-7VY6cwbQtVKqA.png" /></figure><p>Esse tipo de teste é frequentemente utilizado no processo de planejamento de capacidade, para garantir que um sistema possa lidar com o crescimento para níveis especificados de tráfego simultâneo.</p><h4>3.2 Teste de Estresse</h4><p>O teste de estresse se concentra na capacidade de um sistema ou componente em lidar com picos de cargas que estão no limite ou além do previsto ou especificado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qQhoTPI2EtAiNhIwPKgpAQ.png" /></figure><p>Além disso, pode ser usado também para avaliar a capacidade do sistema em lidar com recursos de infraestrutura reduzidos, como capacidade de processamento, largura de banda e memória.</p><h4>3.3 Teste de Pico</h4><p>O teste de pico visa testar a capacidade máxima de uma aplicação em lidar com uma carga de trabalho muito alta em um curto período de tempo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lea5s9mm9f2LUabCYEzK7Q.png" /></figure><p>Esse teste ajuda a determinar se o desempenho do sistema se deteriora quando há um aumento súbito da carga. Outro objetivo desse teste é determinar o tempo de recuperação do sistema. Entre dois picos consecutivos de carga do usuário, o sistema precisa de algum tempo para se estabilizar. Esse tempo de recuperação deve ser o mais baixo possível.</p><h4>3.4 Teste de Resistência</h4><p>Verifica a capacidade de um sistema de continuar operando de forma estável sob uma carga de trabalho constante, geralmente por um período prolongado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wsAVBujj1xISMCbgnNuUaQ.png" /></figure><p>O objetivo é avaliar a capacidade do sistema de lidar com uma carga constante (<em>steady load</em>), sem apresentar problemas de recursos, tais como vazamentos de memória (<em>memory leaks</em>), sobrecarga de conexões de banco de dados (<em>database connection overload</em>) ou outros tipos de falhas que possam afetar negativamente a performance (<em>performance</em>) do sistema e causar interrupções (<em>downtime</em>).</p><h4>3.5 Teste de Escalabilidade</h4><p>Determina a capacidade do sistema de expandir para atender a requisitos futuros de eficiência, sem violar os requisitos de performance especificados. Identifica os limites de escalabilidade e possibilita ajustes no ambiente de produção.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3o-3hQnQD8iORfQzjJkR-Q.png" /></figure><p>O teste de escalabilidade envolve a simulação de diferentes cargas de trabalho para avaliar como o sistema se comporta à medida que a demanda aumenta. Este processo permite identificar possíveis gargalos e pontos de falha, garantindo que o sistema possa ser ajustado adequadamente para suportar crescimento sem perda de performance.</p><h3>4.0 Como avaliar um Teste de Performance?</h3><p>Durante um teste de performance, é essencial analisar diversas métricas para avaliar o desempenho do sistema. Algumas das principais incluem:</p><h4>4.1 Tempos de Resposta</h4><p>O tempo total decorrido desde a solicitação do usuário até a entrega da resposta de uma requisição é uma medida comum de desempenho de uma aplicação. Essa medida é geralmente expressa em milissegundos, de acordo com o padrão de mercado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D1Vy00w8FqzZmAt9zaLjqA.png" /></figure><h4>4.2 Vazão (Throughput)</h4><p>A vazão (<em>throughput</em>) mede a quantidade de requisições que um sistema é capaz de processar dentro de um determinado período de tempo. Essa métrica geralmente é representada em requisições por segundo (<em>RPS</em>) ou transações por segundo (<em>TPS</em>).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jV7-O75B8hB1W-ZAESqcSw.png" /></figure><p>É importante que o gráfico de vazão consiga acompanhar o crescimento da carga de usuários para garantir que o sistema seja capaz de lidar com o aumento do tráfego.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FQqjA8kt-S3XmTrgIVc7uQ.png" /></figure><p>Caso a vazão não aumente proporcionalmente à carga de um usuários pode ser um indicativo de gargalo na performance que precisa ser investigado.</p><p>Por exemplo, um aumento repentino na vazão pode parecer uma melhora na performance, mas pode, na verdade, indicar um pico de erros.</p><p>Respostas de erro, por serem processadas mais rapidamente que o fluxo normal da aplicação, podem gerar uma falsa sensação de ganho, mascarando problemas críticos no sistema.</p><h4>4.3 Percentil</h4><p>O <strong>percentil</strong> é uma medida estatística que divide um conjunto de dados ordenados em cem partes iguais, permitindo a análise da distribuição dos valores — como os tempos de resposta — de forma detalhada.</p><p>Por exemplo, o <strong>percentil 50 (P50)</strong> corresponde à mediana, indicando que 50% das observações estão abaixo (ou iguais) a esse valor e os outros 50% estão acima. Já percentis como o <strong>P90</strong> ou <strong>P95</strong> mostram os valores abaixo dos quais estão, respectivamente, 90% e 95% dos dados.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XTP7sp9rIksUNXrO" /><figcaption><a href="https://www.timescale.com/blog/how-percentiles-work-and-why-theyre-better-than-averages">https://www.timescale.com/blog/how-percentiles-work-and-why-theyre-better-than-averages</a></figcaption></figure><p>Essa abordagem é especialmente útil em testes de performance, pois permite identificar <strong>limiares críticos de tempo de resposta</strong> e avaliar a experiência da maioria dos usuários, mesmo em cenários com valores extremos (outliers).</p><h4>4.4 Taxa de Erros</h4><p>A <strong>taxa de erros</strong> é um indicador que representa a porcentagem de requisições que resultaram em falhas em relação ao total de requisições realizadas durante um teste. Esse valor é essencial para avaliar a confiabilidade da aplicação sob carga.</p><p>Em aplicações web, toda requisição enviada ao servidor recebe uma resposta na forma de um <strong>código de status HTTP</strong>, que indica o resultado do processamento.</p><p>Esses códigos são agrupados em categorias conforme o intervalo numérico, permitindo a rápida identificação do tipo de resposta:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*ZkGlVTFZJjlL9K6_" /></figure><p>A taxa de erros geralmente considera os códigos <strong>4xx</strong> e <strong>5xx</strong> como indicadores de falha, sendo especialmente crítica em testes de performance, pois pode apontar gargalos ou instabilidades sob carga elevada.</p><p><strong>É importante ressaltar que esses códigos não informam o causador do problema, mas orientam a investigação do erro.</strong></p><h3>5.0 Fontes e Referências</h3><p>Minha principal referência na criação deste artigo é a certificação de Testes de Performance da instituição ISTQB (International Software Testing Qualifications Board).</p><p>Para obter informações mais detalhadas, recomendo dar uma olhada na documentação oficial por meio do seguinte link:</p><p><a href="https://www.istqb.org/certifications/performance-tester">Certified Tester Performance Testing (CT-PT)</a></p><p>Além disso, um ótimo site para aprender sobre performance é o Blazemeter:</p><p><a href="https://www.blazemeter.com/blog/performance-testing-vs-load-testing-vs-stress-testing">Performance Testing vs. Load Testing vs. Stress Testing | BlazeMeter by Perforce</a></p><p>E por hoje é isso pessoal! Me sigam nas redes:</p><p>Linkedin — (<a href="https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fjvroot%2F">https://www.linkedin.com/in/jvroot/</a>)</p><p>Github — (<a href="https://github.com/JV-root">https://github.com/JV-root</a>)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a432e6537fc8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Matemática com Python: Uma abordagem Prática — Part. 02]]></title>
            <link>https://medium.com/@jvroot/aprendendo-matem%C3%A1tica-com-python-uma-abordagem-pr%C3%A1tica-part-02-e4a501ca6e99?source=rss-4153c18e8fd7------2</link>
            <guid isPermaLink="false">https://medium.com/p/e4a501ca6e99</guid>
            <category><![CDATA[math]]></category>
            <category><![CDATA[latex]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[João Victor Lima]]></dc:creator>
            <pubDate>Sun, 07 Jan 2024 16:39:25 GMT</pubDate>
            <atom:updated>2024-01-07T16:39:25.468Z</atom:updated>
            <content:encoded><![CDATA[<h3>Aprendendo Matemática com Python: Uma abordagem Prática — Part. 02</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*b4-KuA-KF8_prTQK" /><figcaption>Foto de <a href="https://unsplash.com/pt-br/@antoine1003?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Antoine Dautry</a> na <a href="https://unsplash.com/pt-br/fotografias/computacao-matematica-05A-kdOH6Hw?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure><h3>1.0 Introdução</h3><p>Fala, pessoal! Sejam muito bem-vindos à mais uma etapa da nossa jornada de aprendizado de Matemática com Python! Estou empolgadíssimo com os temas que vamos explorar desta vez.</p><p>Sem mais enrolação, vamos nessa!</p><h3>2.0 Potenciação e Radiciação</h3><p>Continuando nossa jornada pelos conceitos fundamentais da matemática, quero começar este capítulo dando uma olhada mais de perto nos temas potenciação e radiciação.</p><p>Potenciação é uma operação matemática que envolve a multiplicação repetida de um número por ele mesmo, elevado a uma certa potência. O número que está sendo multiplicado é chamado de base, e o expoente indica quantas vezes a base deve ser multiplicada por si mesma.</p><p>O resultado dessa operação é chamado de potência. Por exemplo, 2³ significa 2 multiplicado por ele mesmo três vezes (2 * 2 * 2), resultando em 8.</p><p>Já a Radiciação é uma operação matemática que representa a extração de raiz de um número. A raiz é o número que, quando elevado a um certo expoente, produz o número original. O símbolo radical (√) é comumente usado para indicar a operação de radiciação.</p><p>O número que está dentro do símbolo radical é chamado de radicando. Por exemplo, √9 é igual a 3, pois 3 elevado ao quadrado (3²) resulta em 9.</p><p>Vamos a um pouco de história.</p><h3>2.1 Arquimedes e o Sol</h3><p>A ideia de elevar um número a uma potência tem raízes antigas, mas os registros históricos indicam que os babilônios, por volta de 2000 a.C., já utilizavam técnicas de potenciação. Porém, a formalização desses conceitos ocorreu mais tarde, com os gregos antigos.</p><p>Reza a lenda em que Arquimedes em seus estudos empreendeu o desafio de calcular quantos grãos de areia seriam necessários para preencher o Universo. Esta questão, por mais peculiar que pareça, era fundamental para Arquimedes em sua época. Na concepção daquele período, o Universo era considerado um sistema de esferas, todas compartilhando o mesmo centro: o Sol. Os planetas eram fixados na superfície de cada esfera.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/0*eTBAGHH8vB9bvfbm.jpg" /><figcaption>Arquimedes</figcaption></figure><p>Realizando cálculos relacionados aos diâmetros dessas esferas, Arquimedes determinou o volume do Universo, bem como o volume médio de um grão de areia. Ao final da divisão, o resultado obtido era um número imenso. Para lidar com isso, Arquimedes desenvolveu uma tabela e introduziu algarismos especiais chamados “miríades,” que correspondem aos expoentes modernos, simplificando os cálculos com números de grande magnitude.</p><h3>2.2 Potenciação em Python</h3><p>As operações envolvendo potenciação podem ser aplicadas de maneira bem simples no python, no geral sem utilizar nenhuma biblioteca adicional. O operador nesse caso, é o <strong>**.</strong> Dessa forma, para elevar um dado valor <strong>A</strong> a uma potência <strong>B</strong>, basta executar:</p><pre># Definindo valores<br>x = 2<br>y = 5<br><br># Operações com Potências<br>x_quadrado = x ** 2<br>x_cubo = x ** 3<br>x_quarta = x ** 4<br>x_elevado_y = x ** y<br><br>print(f&#39;Resultado da operação ao quadrado = {x_quadrado}&#39;)<br>print(f&#39;Resultado da operação ao cubo = {x_cubo}&#39;)<br>print(f&#39;Resultado da operação a quarta = {x_quarta}&#39;)<br>print(f&#39;Resultado da operação X elevado a Y = {x_elevado_y}&#39;)<br><br>&quot;&quot;&quot;<br>Resultado da operação ao quadrado = 4<br>Resultado da operação ao cubo = 8<br>Resultado da operação a quarta = 16<br>Resultado da operação X elevado a Y = 32<br><br>&quot;&quot;&quot;<br></pre><p>A operação de potenciação pode ser feita também utilizando a função pow da biblioteca Math:</p><pre>from math import pow<br><br># Definindo valores<br>x = 2<br>y = 5<br><br># Operações com Potencias<br>x_quadrado = pow(x, 2)<br>x_cubo = pow(x, 3)<br>x_quarta = pow(x, 4)<br>x_elevado_y = pow(x , y)<br><br>print(f&#39;Resultado da operação ao quadrado = {x_quadrado}&#39;)<br>print(f&#39;Resultado da operação ao cubo = {x_cubo}&#39;)<br>print(f&#39;Resultado da operação a quarta = {x_quarta}&#39;)<br>print(f&#39;Resultado da operação X elevado a Y = {x_elevado_y}&#39;)<br><br><br>&quot;&quot;&quot;<br>Resultado da operação ao quadrado = 4.0<br>Resultado da operação ao cubo = 8.0<br>Resultado da operação a quarta = 16.0<br>Resultado da operação X elevado a Y = 32.0<br><br>&quot;&quot;&quot;<br></pre><h3>2.3 Radiciação</h3><p>A operação de radiciação (ou também conhecida como Raiz) pode ser feita utilizando a própria operação de Potenção. Ou seja, para se obter a Raiz Quadrada de um dado valor X, basta que seja elevado a 1/2.</p><p>Porém é importante ressaltar que, neste caso, a divisão a ser usada na potência não pode ocorrer com valores inteiros. Ou seja, na linguagem Python, <strong>1/2 = 0</strong>. (isso faria qualquer valor diferente de 0 elevado a essa potencia resultar em 1) e <strong>1.0 / 2 = 0.5</strong>.</p><p>Vamos ao exemplo:</p><pre># Definindo valores<br>x = 256<br><br># Operações de Radiciação<br>x_raiz_quadrada = x ** (1 / 2)<br>x_raiz_cubica = x ** (1 / 3)<br>x_raiz_quarta = x ** (1 / 4)<br><br>print(f&#39;Resultado da Raiz Quadrada de X = {x_raiz_quadrada}&#39;)<br>print(f&#39;Resultado da Raiz Cubica de X = {x_raiz_cubica}&#39;)<br>print(f&#39;Resultado da Raiz Quarta de X = {x_raiz_quarta}&#39;)<br><br>&quot;&quot;&quot;<br>Resultado da Raiz Quadrada de X = 16.0<br>Resultado da Raiz Cubica de X = 6.3496042078727974<br>Resultado da Raiz Quarta de X = 4.0<br><br><br>&quot;&quot;&quot;<br></pre><p>Antes de mergulharmos em outro tópico, vale a pena ressaltar de forma clara a lei da Exponenciação.</p><p>Essencialmente, a lei da Exponenciação (ou Potenciação) estipula que, ao multiplicar duas potências com a mesma base, a soma dos expoentes é necessária. Matematicamente, para números reais <strong>A</strong>, <strong>B</strong>, e <strong>C</strong>, a expressão A<strong>^(B + C)</strong> equivale a A<strong>^B * A^C</strong>.</p><p>Essa regra simplifica a multiplicação de potências com a mesma base, adicionando uma maior eficiência à manipulação algébrica.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/352/1*ycJ-Pnkl6Dr7ADzdo9igdQ.png" /></figure><p>Aplicando em Python, temos o seguinte código:</p><pre>print(5 ** 5)<br>print(5 * 5 * 5 * 5 * 5)<br><br>print(&#39;----------------------------------------------------&#39;)<br><br>print(5 ** 2 * 5 ** 5)<br>print(5 ** (2 + 5))<br><br><br>&quot;&quot;&quot;<br>3125<br>3125<br>----------------------------------------------------<br>78125<br>78125<br><br>&quot;&quot;&quot;</pre><h3>3.0 Sequência das Operações em Python</h3><p>Um assunto que considero extremamente importante etneder em Python é a sequência de execução de operações matemáticas. A linguagem segue uma ordem predefinida para realizar várias operações em uma única linha de comando. Essa ordem é a seguinte:</p><ul><li>Parênteses;</li><li>Potenciação;</li><li>Multiplicação;</li><li>Divisão;</li><li>Adição;</li><li>Subtração;</li></ul><p>Ou seja, dada a seguinte equação:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/386/1*wCRYKngqsvPG2SHSLEr2lQ.png" /></figure><p>O Python iria realizá-la da seguinte forma:</p><ul><li>3 * 256 = 768;</li><li>768 / 8 = 96;</li><li>2 + 96 = 98;</li><li>98–2 = 96.</li></ul><p>Se a mesma operação fosse feita com parenteses, sua sequência de execução mudaria, como no exemplo abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/463/1*Ej3tA9zoBI18rVT8FVmHww.png" /></figure><ul><li>2 + 5 = 5;</li><li>8–2 = 6;</li><li>5 * 256 = 1280;</li><li>1280 / 6 = 213.33;</li></ul><p>Uma forma de memorizar a ordem de execução de operações matemáticas em python, é utilizando de uma regra em inglês chamada PEMDAS;</p><ul><li><strong>P</strong>arentheses;</li><li><strong>E</strong>xponents;</li><li><strong>M</strong>ultiplication;</li><li><strong>D</strong>ivision;</li><li><strong>A</strong>ddition;</li><li><strong>S</strong>ubtraction;</li></ul><p>Então, para lembrar da sequência de execução, lembre de um panda fofinho:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/740/0*R-UVAqi0fvV3ZDUt" /></figure><h3>4.0 Equações em Python</h3><p>Como último, gostaria de falar um pouco sobre como representar equações em Python. Uma das ferramentas mais utilizadas no mundo da matemática para representar equações matemáticas no computador é o Latex.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*p2WpOEnyglt6Ys5B.jpg" /><figcaption><a href="https://www.latex-project.org/">https://www.latex-project.org/</a></figcaption></figure><p>O LaTeX, criado por Leslie Lamport na década de 1980, é uma linguagem de marcação amplamente utilizada para representar equações matemáticas em documentos científicos. Diferentemente de processadores de texto convencionais, o LaTeX oferece formatação automática, permitindo que os usuários foquem no conteúdo.</p><p>Essa ferramenta é essencial para acadêmicos e cientistas, proporcionando qualidade tipográfica superior e facilitando a expressão de equações complexas. Além de seu uso em notação matemática, o LaTeX é prevalente na criação de artigos científicos, teses e apresentações em ambientes acadêmicos, proporcionando consistência e clareza na comunicação de ideias e descobertas.</p><h3>4.1 Aplicação em Python</h3><p>Inicialmente, iriei mostrar algumas equações e funcionalidades básicas do Latex em python, e conforme a evolução dos tópicos ao longo dos artigos irei mostrando novas.</p><p>para representar as equações, iremos utlizar o módulo Python chamado IPython.display que faz parte da biblioteca IPython. Além disso, iremos importas as seguintes funções em nosso código: display, Math, Latex.</p><pre># Importando Bibliotecas<br>from IPython.display import display, Math, Latex</pre><p>A partir dessa linha de código, podemos utilizar as funções para plotar equações matemáticas utilizando a função display, como no exemplo:</p><pre># Plotando a primeira equação em Python.<br>display(&#39;5 + 5 = 10&#39;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/893/1*Zi5tFQWDFsqPBw4RyuzHxA.png" /></figure><p>Um outro exemplo interessante, é utilizar o próprio Python para calcular o resultado da operação:</p><pre># Utilizando o Python para calcular o resultado da equação.<br>display(&#39;10 + 5 = &#39; + str(10 + 5) )</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*JAYMAtbpGmOv7I_UYuwnVw.png" /></figure><p>Agora, vamos utilizar variáveis para armazenar valores que serão usados nas equações. Uma forma de fazer isso é semelhante com a funcionalidade <a href="https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fpeps.python.org%2Fpep-0498%2F">f-string</a> utilizada no print:</p><pre># F-string<br>ola = &#39;Olá, Mundo!&#39;<br>print(f&#39;{ola}&#39;)<br><br>&quot;&quot;&quot;<br><br>Olá, Mundo!<br><br>&quot;&quot;&quot;<br></pre><p>Aplicando a função display:</p><pre># Definindo valores<br>x = 10<br>y = 5<br><br># Plotando a equação.<br>display(Math(&#39;%g + %g = %g&#39; %(x, y, x + y)))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/897/1*AdycDtMZup6RIH5X1Sl5oQ.png" /></figure><p>Agora vamos ver como fica fração utilizando o Latex:</p><pre># Definindo valores<br>x = 10<br>y = 5<br><br># Plotando a equação.<br>display(Math(&#39;\\frac{%g}{%g} = %g&#39; %(x, y, x / y)))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/902/1*gk8oBs4APchEYAKAx7wsow.png" /></figure><p>Repare que inicialmente é algo bem intuitivo, passamos a função ‘frac{}{}’ com seus respectivos valores dentro das chaves. Um detalhe importante de mencionar é que no caso do Latex aplicado ao Python, é preciso passar duas \ (barras para a esquerda) antes de utilizar essas funções.</p><p>Por último, vamos ver como podemos representar a potenciação no Latex com python:</p><pre># Definindo valores<br>x = 10<br>y = 5<br><br># Plotando a equação<br>display(Math(&#39;%g ^ %g = %g&#39; %(x, y, x * y)))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/892/1*I6ADrWtTwHJPj_y6vEU6nA.png" /></figure><p>O símbolo ‘^’ (para os mais intimos a casinha hahahaha) é utilizado para representar a potenciação.</p><h3>5.0 Considerações Finais</h3><p>Com isso, encerramos a segunda parte da série de artigos “Aprendendo Matemática com Python”. Como de costume, ao término, apresentarei alguns exercícios e curiosidades para que você possa aprimorar ainda mais seus conhecimentos no assunto.</p><p>Para o desafio de hoje, proponho uma atividade envolvendo LaTeX. A tarefa consiste em plotar as seguintes equações:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/209/1*D7t5ioYJZJCpOygbSsvKug.png" /><figcaption>Desafio #01</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/213/1*OG1jd3lODTmwwKWEPyrVTw.png" /><figcaption>Desafio #02</figcaption></figure><p>A solução para os dois exercícios irei deixar no link do Colab com o conteúdo dessa edição.</p><p>Além dos exercícios, deixo alguns link do Khan Academy sobre os assuntos citados:</p><h3>Khan Academy:</h3><ul><li><a href="https://pt.khanacademy.org/math/pre-algebra/pre-algebra-exponents-radicals">Raízes, potências e notação científica | Pré-álgebra | Khan Academy</a></li><li><a href="https://pt-pt.khanacademy.org/math/pre-algebra/xb4832e56:exponents-intro-and-order-of-operations/xb4832e56:order-of-operations/v/more-complicated-order-of-operations-example">PEMDAS Khan Academy</a></li><li><a href="https://pt.khanacademy.org/math/arithmetic/x18ca194a:exponents-and-powers-of-ten/x18ca194a:intro-to-exponents/v/introduction-to-exponents">Potenciação Khan Academy</a></li></ul><h3>Curiosidades</h3><ul><li><a href="https://impa.br/noticias/o-desafio-de-arquimedes-para-contar-graos-de-areia/">O desafio de Arquimedes para contar grãos de areia — IMPA — Instituto de Matemática Pura e Aplicada</a></li><li><a href="https://educacao.uol.com.br/disciplinas/matematica/potencia-2-historia-da-descoberta-do-conceito.htm?next=0004H541U0L0P">Potência: História da descoberta do conceito</a></li></ul><p>Link para o Colab:</p><p><a href="https://colab.research.google.com/drive/1WrdKRO0TNz6IHvdGklg2xmJJh6354DJP#scrollTo=LwREAlBOmSjX">https://colab.research.google.com/drive/1WrdKRO0TNz6IHvdGklg2xmJJh6354DJP#scrollTo=LwREAlBOmSjX</a></p><p>E por hoje é isso pessoal! Me sigam nas redes:</p><p>Linkedin — (<a href="https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fjvroot%2F">https://www.linkedin.com/in/jvroot/</a>)</p><p>Github — (<a href="https://github.com/JV-root">https://github.com/JV-root</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/670/0*C4NovV-xfgIjXA4v.jpg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e4a501ca6e99" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aprendendo Matemática com Python: Uma abordagem Prática — Part. 01]]></title>
            <link>https://medium.com/@jvroot/aprendendo-matem%C3%A1tica-com-python-uma-abordagem-pr%C3%A1tica-part-01-71ca94029386?source=rss-4153c18e8fd7------2</link>
            <guid isPermaLink="false">https://medium.com/p/71ca94029386</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[math]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[matplotlib]]></category>
            <dc:creator><![CDATA[João Victor Lima]]></dc:creator>
            <pubDate>Wed, 29 Nov 2023 20:29:39 GMT</pubDate>
            <atom:updated>2023-11-29T22:31:58.766Z</atom:updated>
            <content:encoded><![CDATA[<h3>Aprendendo Matemática com Python: Uma abordagem Prática — Part. 01</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l2IuKpK-JMq5UD78YpDQYQ.jpeg" /><figcaption>Foto de <a href="https://unsplash.com/pt-br/@dancristianpaduret?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Dan Cristian Pădureț</a> na <a href="https://unsplash.com/pt-br/fotografias/h3kuhYUCE9A?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><h3>1. Introdução</h3><p>Fala, pessoal! Estou empolgadíssimo em fazer minha primeira publicação no Medium, e para o tópico inaugural, decidi abordar algo que sempre me causou dificuldades: Matemática!</p><p>Resumindo a minha trajetória, desde os primeiros anos da escola, a matemática e eu éramos quase como água e óleo. Cada equação e teorema pareciam o fim do mundo (nada exagerado, não? hahahahaha), e essa dificuldade só crescia com o passar do tempo gerando uma ansiedade só de ter que fazer uma conta de cabeça.</p><p>No entanto, tudo começou a mudar quando me apaixonei pela Estatística e Ciência de Dados e, curiosamente, quando me deparei com um livro que mudaria o jogo para mim: <a href="https://www.amazon.com.br/livro-matem%C3%A1tica-V%C3%A1rios/dp/6555670231"><strong><em>“O Livro da Matemática”</em></strong></a>. Esse livro não é como os livros maçante de matemática; ele é repleto de ilustrações didáticas e com explicações de forma clara e envolvente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/306/1*NGAFLP-SdowIG1qkIsJYWA.jpeg" /></figure><p>E foi aí que começou a mágica: A matemática, antes um gerador de ansiedade, passou a se transformar em um fascinante quebra-cabeça esperando para ser resolvido, quase como um Tetris. A matemática aplicada, especialmente na Estatística e Ciência de Dados, revelou uma nova dimensão para mim, uma em que eu podia ver a beleza das fórmulas e dos números.</p><p>Desde então, venho estudando matemática e pensando em como compartilhar tudo que venho aprendendo, e qual seria a melhor maneira de fazer isso se não demonstrando com Python, uma linguagem de programação incrível, e amplamente utilizada na área de dados?</p><p>Para dar início à nossa série, vamos começar pelo básico: Aritmética!</p><h3>2. Aritmética</h3><p>Basicamente, as operações aritméticas, fundamentais nas equações matemáticas, têm uma história que remonta a tempos antigos, evidenciada pelo Papiro de Rhind, datado por volta de 1550 a.C. Nesse manuscrito egípcio, registram-se as operações básicas como adição, subtração e multiplicação, destacando a importância desses conceitos desde os primórdios da matemática.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/309/0*ZUXUH-8VyXHwwJok.jpg" /><figcaption><a href="https://pt.wikipedia.org/wiki/Papiro_de_Rhind">Papiro de Rhind</a></figcaption></figure><h3>2.1 Operações Aritméticas</h3><h4>2.2 Adição</h4><p>Do mesmo modo que aprendemos na matemática do ensino fundamental, em Python, utilizamos o sinal (+) para realizar a adição de dois números ou mesmo de duas variáveis contendo valores quaisquer. Veja o exemplo abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*3cGowC9_JGxlCH_Vuk1OVQ.png" /><figcaption>Adição em Python</figcaption></figure><h4>2.3 Subtração</h4><p>O procedimento é semelhante para a subtração, empregando o sinal (-) para subtrair um valor de outro. Veja o exemplo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*uYdkwuFWIH-svh2sMCbiaQ.png" /><figcaption>Subtração em Python</figcaption></figure><h4>2.4 Multiplicação</h4><p>A representação da multiplicação em Python é diferente do que aprendemos no ensino fundamental, onde costumamos usar a letra (X) ou, até mesmo em algumas linguagens de programação, onde se usa o símbolo (^). Em vez disso, em Python, a multiplicação é representada pelo asterisco (*). Vejamos os exemplos:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*6YssLp6Riy4PgqYehVXhCA.png" /><figcaption>Multiplicação em Python</figcaption></figure><h4>2.5 Divisão</h4><p>O operador de divisão é representado pela barra inclinada para a direita (/). Exemplo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*khqUNz23k5oLc4rMcLCpPg.png" /><figcaption>Divisão em Python</figcaption></figure><h4>2.5.1 Resto da Divisão</h4><p>O resto da divisão, muitas vezes denotado pelo símbolo %, é o valor que permanece quando um número não é completamente divisível por outro. Em outras palavras, se você dividir um número <em>a</em> por outro número <em>b</em>, o resto da divisão é o que sobra.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*yb0uQXwGbDHsxC6kaVgAfA.png" /><figcaption>Resto da Divisão em Python</figcaption></figure><h3>3.0 Conjuntos Numéricos</h3><p>Um outro tema que considero de suma importância para os fundamentos de matemática são os Conjuntos Numéricos, que basicamente consistem em agrupamentos de números com características em comuns.</p><p>No contexto de Python, encontramos diversos tipos desses conjuntos, com destaque para o conjunto dos números inteiros (representados como “int”) e o conjunto dos números reais (denominados como “float”). Em um outro artigo irei abordar como que o Python lida com números por baixo dos panos.</p><p>Os números inteiros abrangem tanto os positivos quanto os negativos, incluindo o zero. Por outro lado, os números reais englobam aqueles que podem ser expressos como frações, onde tanto o numerador quanto o denominador são números inteiros.</p><p>Existem diversos tipos de conjuntos numéricos, mas neste artigo, meu foco principal será nas operações envolvendo esses conjuntos. No entanto, deixo disponível o <a href="https://brasilescola.uol.com.br/o-que-e/matematica/o-que-sao-conjuntos-numericos.htm"><strong>seguinte link</strong></a> que contém uma explicação detalhada sobre cada um deles.</p><h4>3.1 Sympy</h4><p>Para realizar as principais operações de conjuntos em Python, podemos utilizar a função integrada <strong>Set</strong>. Porém, eu iriei demonstrar uma abordagem alternativa utilizando a biblioteca <strong>Sympy</strong>.</p><p>O Sympy é uma biblioteca em Python voltada para álgebra simbólica. Ao contrário da computação numérica, que lida com valores numéricos, a álgebra simbólica manipula expressões matemáticas de forma simbólica, preservando variáveis como símbolos em vez de substituir por valores específicos.</p><p>Com o Sympy, você pode realizar operações algébricas, resolver equações, simplificar expressões, calcular derivadas e integrais, entre outras tarefas, mantendo os resultados em termos de símbolos matemáticos.</p><p>Antes de tudo, precisamos nos certificar se o Sympy está instalado. Caso não tenha, você pode instalar utilizando o pip em seu terminal:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*9vz78hx-9_EsMMmx1eXMJw.png" /></figure><p>Após a instalação, importe o Sympy em seu script ou ambiente de desenvolvimento favorito, eu recomendo o Jupyter Notebook:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*th08WP3l1z9OTrPDvo_-cw.png" /></figure><p>Pronto! Agora podemos utilizar as principais funcionalidades da biblioteca Sympy!</p><h4>3.2 O Diagrama de Venn</h4><p>Antes de irmos para as operações, assim como com aritmética, lá vai um pouco de história:</p><p>Em 1880, o matemático britânico John Venn apresentou a ideia do diagrama de Venn no artigo “On the Diagrammatic and Mechanical Representation of Propositions and Reasonings” [Sobre a representação diagramática e mecânica de proposições e raciocínios]. O diagrama de Venn é um modo de agrupar coisas em cículos (ou outras formas curvas) sobrepostos para mostrar a relação entre eles.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/194/1*Z3fbV3fIT-E5fiDfkyBjhw.jpeg" /><figcaption><a href="https://www.cis.upenn.edu/~bhusnur4/cit592_fall2014/venn%20diagrams.pdf">On the diagrammatic and mechanical representation of propositions and reasonings</a></figcaption></figure><p>O diagrama de Venn pode ser usado (dentre outras funcionalidades) para representar as operações de conjuntos. Por exemplo, a união de dois conjuntos A e B pode ser representada por um diagrama de Venn com dois círculos, onde cada círculo representa um conjunto.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/362/1*9gr4CkKF8aDl4z1P7q5WCA.png" /><figcaption>Exemplo Diagram de Venn</figcaption></figure><h3>3.3 Operações com Conjuntos</h3><p>Explorando as operações fundamentais de conjuntos, neste artigo irei focar nas quatro principais operações, cuja descrição encontra-se ilustrada na imagem a seguir:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*KCLW7pjlXHjWawjseprOow.png" /><figcaption>Operações com Conjuntos</figcaption></figure><p>O diagrama de Venn é uma ferramenta visual bem interessante que pode ser usada para representar conjuntos numéricos e suas operações.</p><h4>3.4 União</h4><p>A operação de união em conjuntos numéricos é uma forma de combinar todos os elementos distintos de dois conjuntos em um único conjunto. Se tivermos dois conjuntos <strong>A</strong> e <strong>B</strong>, a união deles, denotada por <strong><em>A</em>∪<em>B</em></strong>, consiste em todos os elementos que pertencem a pelo menos um dos conjuntos.</p><p>Aplicando em Python:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*bpjwQaWA6wpt8XEHtqM-Sg.png" /><figcaption>União em Python</figcaption></figure><p>Representação em Diagrama de Venn</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/481/1*ZVAzHwqMq5HKrOckiNvYsQ.png" /></figure><h4><strong>3.5 Intersecção</strong></h4><p>A interseção em conjuntos numéricos é uma operação que envolve encontrar os elementos comuns a dois ou mais conjuntos. Pense nos conjuntos como grupos de números. Se você tem dois conjuntos, <strong>A</strong> e <strong>B</strong>, a interseção deles, denotada por <strong><em>A </em>∩ <em>B</em></strong>, é o conjunto de todos os elementos que pertencem tanto a <strong>A</strong> quanto a <strong>B</strong>.</p><p>Aplicando em Python:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*3mxLGW6-BwutTgfQlt7pqQ.png" /><figcaption>Intersecção em Python</figcaption></figure><p>Representação em Diagrama de Venn:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/1*3-JKRgf5BYlkilQGSZ0GRw.png" /></figure><h4>3.6 Diferença</h4><p>A diferença entre conjuntos numéricos é uma operação que resulta em um conjunto contendo todos os elementos de um conjunto (A) que não estão presentes em outro conjunto (B). Pode ser denotada por <strong><em>A</em>−<em>B</em></strong> ou <strong><em>A</em>\<em>B</em></strong>.</p><p>Aplicando em Python:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*5aRLzq1t8DZWoLgneWWZsQ.png" /><figcaption>Diferença em Python</figcaption></figure><p>Representação em Diagrama de Venn:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/515/1*2p3_GAVdgiEnJjqrTgujPg.png" /></figure><h4>3.6 Diferença Simétrica</h4><p>A diferença simétrica entre dois conjuntos numéricos, denotada por <strong><em>A </em>Δ <em>B</em></strong>, é um conceito que engloba os elementos exclusivos de cada conjunto, excluindo aqueles que são comuns a ambos. Em outras palavras, a diferença simétrica inclui todos os elementos que estão em <strong><em>A</em></strong> e não em <strong><em>B</em></strong>, juntamente com todos os elementos que estão em <strong><em>B</em></strong> e não em<strong> <em>A</em></strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*OFZ3tV9Y9ZD4hNVp7gvzRQ.png" /><figcaption>Diferença Simétrica em Python</figcaption></figure><p>Representação em Diagrama de Venn:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/389/1*GsVcS1jKayWEWU5m2zk8wA.png" /></figure><h3>4.0 Considerações Finais</h3><p>Com isso, concluímos a primeira parte da série de artigos “Aprendendo Matemática com Python”. Como bônus, ao final de cada artigo, apresentarei alguns exercícios e curiosidades para que você possa aprofundar seus conhecimentos no tema. Para este artigo, deixo uma seleção de exercícios na Khan Academy relacionados aos tópicos abordados.</p><ul><li><a href="https://pt.khanacademy.org/math/arithmetic">Khan Academy</a></li><li><a href="https://pt.khanacademy.org/math/statistics-probability/probability-library/basic-set-ops/e/basic_set_notation">Notação básica de conjunto (prática) | Khan Academy</a></li></ul><p>Uma curiosidade maneira, é que os Diagramas de Venn mostrados nesse artigo foram todos feito utilizando Python. Caso queiram saber um pouco mais sobre, recomendo a biblioteca MatplotLib_Venn.</p><p><a href="https://pypi.org/project/matplotlib-venn/">matplotlib-venn</a></p><p>E por hoje é isso pessoal! Me sigam nas redes:</p><p>Linkedin — (<a href="https://www.linkedin.com/in/jvroot/">https://www.linkedin.com/in/jvroot/</a>)</p><p>Github — (<a href="https://github.com/JV-root">https://github.com/JV-root</a>)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=71ca94029386" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>