<?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: Suspir0n</title>
    <description>The latest articles on DEV Community by Suspir0n (@suspir0n).</description>
    <link>https://dev.to/suspir0n</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%2F480806%2F2a7530ad-cb44-46d3-b67b-e51d1df99f45.jpeg</url>
      <title>DEV Community: Suspir0n</title>
      <link>https://dev.to/suspir0n</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suspir0n"/>
    <language>en</language>
    <item>
      <title>RPA: Automating a file backup to google drive</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Thu, 28 Sep 2023 15:47:59 +0000</pubDate>
      <link>https://dev.to/suspir0n/rpa-automating-a-file-backup-to-google-drive-mc</link>
      <guid>https://dev.to/suspir0n/rpa-automating-a-file-backup-to-google-drive-mc</guid>
      <description>&lt;p&gt;Hello everyone, today I start another chapter of my Logbook. The subject is about RPA (Robot Process Automation), I will demonstrate how to automate a simple task, but with this knowledge you can automate anything. Let’s look at an example to understand the subject, shall we? OK, let's go guys.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is RPA?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SEX3pjc4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0tle4jc471ggsrkndfar.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SEX3pjc4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0tle4jc471ggsrkndfar.jpg" alt="demonstrates what an RPA can do" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As Automation Anywhere says "With RPA, software users create software robots, or “bots,” that can learn, simulate, and execute rules-based business processes. RPA automation allows users to create bots by observing human digital actions. Show your bots what to do and let them do the work. Robotic process automation software bots can interact with any application or system in the same way as people, except that RPA bots can operate uninterruptedly, without stopping, much faster and with 100% reliability and accuracy."&lt;/p&gt;

&lt;h2&gt;
  
  
  I still don't understand, cloud you explain better?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Ak3i8S1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zanbynbf54jn28g00k84.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Ak3i8S1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zanbynbf54jn28g00k84.jpg" alt="RPA operating model" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With RPA we can carry out various automations, from the most basic to the most advanced. Automations are nothing more than functions that a person does repeatedly, which a robot is capable of doing more easily, quickly and safely. If you edit and post your article in the same way every day, this can be automated, if you are a photographer and always make the same edit, this can be automated, if you are a programmer, and every time you start a project, its structure in the same way, this can be automated. So if you notice, there are several possibilities to automate an action, task and that is RPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  RPA with Python in practice, how do I do it?
&lt;/h2&gt;

&lt;p&gt;To do any automation in Python, you will need three things&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An IDE of your choice&lt;/li&gt;
&lt;li&gt;Python language&lt;/li&gt;
&lt;li&gt;The PyautoGui library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pyautogui is used to manipulate only your keyboard and mouse, so all the actions that a person does, in your automation you can produce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding our task step by step.
&lt;/h3&gt;

&lt;p&gt;Firstly, we need to understand the steps we normally take to back up the file to Google Drive, which are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We open google or a browser of your choice on our computer.&lt;/li&gt;
&lt;li&gt;Secondly, we access Google Drive, writing the link to it.&lt;/li&gt;
&lt;li&gt;We return to the work area.&lt;/li&gt;
&lt;li&gt;We click on the file and drag it.&lt;/li&gt;
&lt;li&gt;We open the browser while dragging the file.&lt;/li&gt;
&lt;li&gt;We release the file to upload.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After listing, let's start, we'll go step by step and at the end of each one I'll explain.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1
&lt;/h4&gt;

&lt;p&gt;We start by importing the pyautogui library as it is the main library that we will use in this entire example, and we also import the time library, later on you will understand why.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pyautogui
from time import sleep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the import, we first have to inform the user that a code will run and that they will not be able to use the computer until it is finished, how do we do this? In the pyautogui library there is a function called &lt;strong&gt;alert&lt;/strong&gt;, with it, we will create an alert to inform the user and click O, then the code will run completely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.alert('The code will start, please do not touch the keyboard while the code is running!')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, how do we open our browser, an easier way is by clicking the &lt;strong&gt;win&lt;/strong&gt; key and writing the name of the browser and then clicking enter. So we will do this, in pyautogui we have the &lt;strong&gt;press&lt;/strong&gt; function that is used to access any key on the keyboard, we could use &lt;strong&gt;win&lt;/strong&gt;, but we will use &lt;strong&gt;winleft&lt;/strong&gt; which means it is the win key on the left, To write, we could use the press function and press key by key, but it would be laborious, wouldn't it? That's why there is a function called &lt;strong&gt;write&lt;/strong&gt;, it can be used to write anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.press('winleft')
pyautogui.write('chrome')
pyautogui.press('enter')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2
&lt;/h4&gt;

&lt;p&gt;In the second step, with Google open as we did in the previous step, we will use the &lt;strong&gt;write&lt;/strong&gt; function that we learned to type the Google Drive link and the &lt;strong&gt;press&lt;/strong&gt; function to press enter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.write('https://drive.google.com/drive/u/0/my-drive')
pyautogui.press('enter')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3
&lt;/h4&gt;

&lt;p&gt;Now in the third step we have to return to the desktop, and an easy way to do this is using the shortcut &lt;strong&gt;win + d&lt;/strong&gt;, but as we use the shortcut in pyautogui, we have a function called &lt;strong&gt;hotkey&lt;/strong&gt; where we pass the keys separating them with commas and that way we can use the shortcut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.hotkey('winleft', 'd')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4
&lt;/h4&gt;

&lt;p&gt;In the fourth step we will learn how to manipulate the mouse, the way I will teach you is a static way, what do you mean? You will learn how to get the position of the mouse, where do you want it to get the file from, how do we get the position? In pyautogui we have a function called &lt;strong&gt;position&lt;/strong&gt;, place the mouse over the file and use a shortcut to execute the line of code and it will return the position.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.position()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this it returns the following values, x and y axis &lt;code&gt;1856, 54&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And now we will learn how to move and click the left mouse button to move the file. To move we use the &lt;strong&gt;moveTo&lt;/strong&gt; function and pass the x and y axis, and to click with the left button we use the &lt;strong&gt;mouseDown()&lt;/strong&gt; function which will hold the file, we need to move the file to a location where always Once we release it, it can be uploaded to Google Drive, so repeat the step of getting the position and using moveTo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.moveTo(1856, 54)
pyautogui.mouseDown()
pyautogui.moveTo(3726, 738)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5
&lt;/h4&gt;

&lt;p&gt;With this we use the shortcut *&lt;em&gt;alt + tab *&lt;/em&gt; to open the browser with Google Drive loaded, we will do it the same way as we did to return to the desktop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.hotkey('alt', 'tab')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 6
&lt;/h4&gt;

&lt;p&gt;And we finish by releasing the file, using the &lt;strong&gt;mouseUp&lt;/strong&gt; function and then using the &lt;strong&gt;alert&lt;/strong&gt; function and sending a message to the user saying that they can use the computer again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyautogui.mouseUp()
pyautogui.alert('The code has just run, you can use your computer again!')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was a simplified way of doing it, I made an example using good practices and to improve it I added a log to know everything documented step by step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2L5SLQe4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4amcg05cnahwxcwrxbm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2L5SLQe4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4amcg05cnahwxcwrxbm4.png" alt="Demonstration of an RPA code with Python using good practices" width="800" height="1120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to copy my example, it is available on &lt;a href="https://github.com/Suspir0n/rpa"&gt;github&lt;/a&gt;.If you want to know all the functions here is the &lt;a href="https://pyautogui.readthedocs.io/en/latest/index.html"&gt;pyautogui&lt;/a&gt; documentation.&lt;/p&gt;

&lt;p&gt;This was &lt;b&gt;Diary nº 17&lt;/b&gt;. Today I chose to talk about &lt;strong&gt;RPA (Robot Process Automation)&lt;/strong&gt; next week I will bring up another topic that I haven't chosen yet, folks. Let's say goodbye here. We will return in another logbook.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g_iRj1uZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;This article was helpful to you?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Leave a comment below.&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.automationanywhere.com/br/rpa/robotic-process-automation"&gt;O que é automação robótica de processos (RPA)?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MeOUl7ZjJRM"&gt;Automatize Qualquer Sistema ou Programa com Python (RPA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>python</category>
      <category>rpa</category>
    </item>
    <item>
      <title>Elasticsearch, descobrindo!</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 09 May 2022 12:26:36 +0000</pubDate>
      <link>https://dev.to/suspir0n/elasticsearch-descobrindo-60e</link>
      <guid>https://dev.to/suspir0n/elasticsearch-descobrindo-60e</guid>
      <description>&lt;p&gt;Prontos para mais um diário de bordo? Hoje iremos decorrer sobre &lt;a href="https://www.elastic.co/pt/elasticsearch/"&gt;Elasticsearch&lt;/a&gt;, o que é, como é utilizado, por que utilizar e em qual momento deve ser utilizado e alguns exemplos práticos no final. O Elasticsearch é um mecanismo de busca e análise de dados, voltado para grandes volumes de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é ElasticSearch
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HRxfzXgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/onbhdnh6bynhi42j0zxt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HRxfzXgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/onbhdnh6bynhi42j0zxt.png" alt="O que é ElasticSearch" width="259" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo o site oficial do &lt;a href="https://www.elastic.co/pt/what-is/elasticsearch"&gt;Elastic&lt;/a&gt; "O Elasticsearch é um mecanismo de busca e análise de dados distribuído, gratuito e aberto para todos os tipos de dados, incluindo textuais, numéricos, geoespaciais, estruturados e não estruturados."&lt;/p&gt;

&lt;p&gt;A forma de armazenamento que ele utiliza para textos é a estrutura de &lt;a href="https://acervolima.com/indice-invertido/"&gt;&lt;strong&gt;índice invertido&lt;/strong&gt;&lt;/a&gt;, buscando uma palavra que seja única em todos os documentos que você tem salvo no elastic, quando ele já tem isso obtido, quando é realizado uma busca, ele retorna todos os documentos que tem aquela palavra única em todos os documentos que você passou. Entretanto campos numéricos e geográficos são armazenados em &lt;a href="https://stringfixer.com/pt/K-D-B-tree"&gt;&lt;strong&gt;árvore BKD&lt;/strong&gt;&lt;/a&gt; e campos de textos em &lt;a href="https://acervolima.com/indice-invertido/"&gt;&lt;strong&gt;índice invertido&lt;/strong&gt;&lt;/a&gt; como relatei a cima.&lt;/p&gt;

&lt;p&gt;Segundo &lt;a href="https://stringfixer.com/pt/K-D-B-tree"&gt;Stringfixer&lt;/a&gt; "uma &lt;strong&gt;árvore KDB&lt;/strong&gt; ( árvore B k- dimensional ) é uma estrutura de dados em árvore para subdividir um espaço de busca k- dimensional. O objetivo da árvore KDB é fornecer a eficiência de pesquisa de uma árvore kd balanceada , enquanto fornece o armazenamento orientado a blocos de uma árvore B para otimizar os acessos à memória externa."&lt;/p&gt;

&lt;p&gt;A extração de dados, como ele faz é um de seus diferenciais, através do &lt;a href="https://jobmigration.blogspot.com/2022/05/interface-de-programacao-de-aplicacoes.html?m=1"&gt;RestAPI&lt;/a&gt; conseguindo realizar de forma simples e rápido. Sua API suporta &lt;a href="https://www.treinaweb.com.br/blog/o-que-e-sql#:~:text=SQL%20ou%20Structured%20Query%20Language,Firebird%2C%20MySQL%2C%20entre%20outros."&gt;&lt;strong&gt;Queries Estruturadas&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.redspark.io/mongodb-entendendo-full-text-search/"&gt;&lt;strong&gt;Full Text Queries&lt;/strong&gt;&lt;/a&gt; e &lt;strong&gt;Queries Complexas&lt;/strong&gt;. As consultas são criadas usando &lt;strong&gt;Query DSL(Domain Specific Language)&lt;/strong&gt; uma linguagem de consulta baseada em json, temos que pensar em uma Query DSL em uma &lt;strong&gt;AST(Abstract Syntax Tree)&lt;/strong&gt;. Trarei logo abaixo o que é Query DSL e AST, um resumo de ambos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para que o Elasticsearch é usado?
&lt;/h2&gt;

&lt;p&gt;Devido à velocidade, performance, escalabilidade, facilidade e integração com outras ferramentas que o elastic possui, ele pode ser usado para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Busca em aplicação&lt;/li&gt;
&lt;li&gt;Busca em website&lt;/li&gt;
&lt;li&gt;Busca empresarial&lt;/li&gt;
&lt;li&gt;Logging e analítica de log&lt;/li&gt;
&lt;li&gt;Métricas de infraestrutura e monitoramento de container&lt;/li&gt;
&lt;li&gt;APM (Monitoramento de performance de aplicação)&lt;/li&gt;
&lt;li&gt;Análise e visualização de dados geoespaciais&lt;/li&gt;
&lt;li&gt;Analítica de segurança&lt;/li&gt;
&lt;li&gt;Análise de dados empresarial&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é Query DSL?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vBHREZal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/778t54o47gdpbivodfz0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vBHREZal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/778t54o47gdpbivodfz0.jpg" alt="O que é Query DSL?" width="880" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Querydsl é um framework java que permite gerar queries type-safe com sintaxe similar ao JPQL, SQL e outras suportadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é AST?
&lt;/h2&gt;

&lt;p&gt;Segundo &lt;a href="https://www.twilio.com/blog/abstract-syntax-trees"&gt;Twilio&lt;/a&gt; "Abstract Syntax Trees ou ASTs são representações em árvore do código. Eles são uma parte fundamental da maneira como um compilador funciona. Quando um compilador transforma algum código, existem fundamentalmente os seguintes passos:"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Análise Lexical - conhecida como Tokenização&lt;/li&gt;
&lt;li&gt;Análise de sintaxe - Conhecida como analise&lt;/li&gt;
&lt;li&gt;Geração de código&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8lDazBkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvdp30h3s7svow0iqi0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8lDazBkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvdp30h3s7svow0iqi0c.png" alt="O que é AST?" width="880" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais linguagens de programação têm suporte no Elasticsearch?
&lt;/h2&gt;

&lt;p&gt;O Elasticsearch oferece suporte a uma variedade de linguagens, que são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;JavaScript (Node.js)&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;.NET (C#)&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hora da prática
&lt;/h2&gt;

&lt;p&gt;Como ele fornece uma API Rest, com isso recebe requisição HTTP, utilizando os quatros verbos GET, POST, PUT e DELETE&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1| endereco_da_api:porta/indice/tipo_do_documento
2| example- http://localhost:9200/futebol/jogador
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uma requisição POST para uri
&lt;/h3&gt;

&lt;p&gt;Realiza a indexação de um documento cujos dados devem ser passados como um objeto JSON no corpo da requisição, exemplo:&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="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9200&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;futebol&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jogador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Édson Arantes do Nascimento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"apelido"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Pelé"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"titulos_mundiais"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s"&gt;"1958"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"1962"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"1970"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uma requisição GET para uri/_search
&lt;/h3&gt;

&lt;p&gt;Retorna todos os documentos do índice indicado, exemplo:&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="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9200&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;futebol&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jogador&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_search&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"match"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"apelido"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Pelé"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uma requisição PUT para uri/_id
&lt;/h3&gt;

&lt;p&gt;_id deve ser o valor do código de identificação do documento. Caso o _id seja de um documento existente, substitui os campos do documento pelo corpo JSON da requisição. &lt;/p&gt;

&lt;h3&gt;
  
  
  Uma requisição DELETE para uri/_id
&lt;/h3&gt;

&lt;p&gt;_id deve ser o valor do código de identificação do documento. Caso o _id seja de um documento existente, deleta fisicamente o documento do índice em que ele está indexado.&lt;/p&gt;

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

&lt;p&gt;Então, como podemos ver o Elastic search é muito bom, ele é um assunto bem interessante, a forma de uso, as funcionalidades, performance que ele possui, pode te ajudar em diversas situações que esteja passando. Gostaria de ter o conhecido antes, recomendo muito ele.&lt;/p&gt;

&lt;h2&gt;
  
  
  TODO
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O ElasticSearch seria útil para você?&lt;/li&gt;
&lt;li&gt;Já passou por problemas de volume de dados grandes?&lt;/li&gt;
&lt;li&gt;Conhece outra ferramenta melhor que essa?&lt;/li&gt;
&lt;li&gt;Aplicam esta ferramenta no seu trabalho? Porquê?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Respondam às perguntas nos comentários.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #16&lt;/b&gt;. Hoje eu escolhi falar sobre o &lt;strong&gt;Elasticsearch&lt;/strong&gt; na próxima semana irei trazer sobre &lt;strong&gt;Redis&lt;/strong&gt; galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/pt/elasticsearch/"&gt;Site oficial do Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/pt/what-is/elasticsearch"&gt;Documentação do Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/elasticsearch/client/python-api/master/examples.html"&gt;Exemplo em Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/o-que-e-elasticsearch/40207"&gt;O que é Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jobmigration.blogspot.com/2022/05/interface-de-programacao-de-aplicacoes.html?m=1"&gt;O que é RestAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stringfixer.com/pt/K-D-B-tree"&gt;O que é Arvore BKD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://acervolima.com/indice-invertido/"&gt;O que é Indice Invertido&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Avoid Premature Optimization, O que é?</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 10 Jan 2022 12:24:08 +0000</pubDate>
      <link>https://dev.to/suspir0n/avoid-premature-optimization-o-que-e-422j</link>
      <guid>https://dev.to/suspir0n/avoid-premature-optimization-o-que-e-422j</guid>
      <description>&lt;p&gt;Muitos de nós buscamos otimizar o desempenho de um software com alguma tecnologia, princípios, metodologias ou com funcionalidades novas, porém nem tudo que você aprende pode ser aplicado a um software, depende muito do que o software em questão está propondo. É como se você aprendesse uma nova linguagem e quisesse aplicar ela em um software em que está trabalhando, pois é mais eficaz do que a utilizada, entretanto naquele contexto, naquele software não tem essa necessidade de você aplicar tal linguagem, é o que chamamos de &lt;strong&gt;Avoid Premature Optimization&lt;/strong&gt;, otimização prematura, querer otimizar antes da hora ou sem uma necessidade para tal ação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abordando um problema.
&lt;/h2&gt;

&lt;p&gt;Os indivíduos atualmente, tem uma grande necessidade de trocar de celular a cada seis meses ou a cada ano, com o intuito de ter um status elevado, melhorando a autoestima em alguns aspectos e dependendo, se endividando ainda mais.&lt;/p&gt;

&lt;p&gt;O problema maior é o gasto desnecessário, resultando em uma bola de neve, aumentando as dívidas.&lt;/p&gt;

&lt;p&gt;Onde quero chegar com isso? Estou aplicando o conceito que quero abordar no cotidiano de muitos indivíduos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ah! Existe alguma solução?
&lt;/h2&gt;

&lt;p&gt;Estão se perguntando o que educação financeira tem a ver com o objetivo deste artigo, calma, iremos chegar lá.&lt;/p&gt;

&lt;p&gt;Quando você for comprar algo, otimizar algo que você já possui, no caso, um celular novo com mais GB de armazenamento, processador melhor, mAh(milha amperes) maior, deve se fazer 4 perguntas, são elas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quero mesmo comprar isso?&lt;/li&gt;
&lt;li&gt;Preciso disso para alguma coisa?&lt;/li&gt;
&lt;li&gt;Posso comprar isso com o dinheiro que tenho?&lt;/li&gt;
&lt;li&gt;Precisa mesmo ser agora?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Irei adicionar uma quinta pergunta que se complementa com as anteriores, que é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existe uma necessidade grande para isso?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você responder "sim" em todas as perguntas, a compra está liberada, pois o produto realmente é necessário. Mas, se alguma resposta for "não", é importante repensar.&lt;/p&gt;

&lt;p&gt;O que quero dizer com isso? Se o seu celular está funcionando, suprindo suas necessidades, para que irá comprar um tão cedo? Isso é uma otimização prematura, melhorar algo sem existir a tal necessidade para aquela otimização que está pensando em fazê-lo.&lt;/p&gt;

&lt;p&gt;Reparou como ficou melhor? Entendeu a diferença de quando a necessidade de otimizar e quando não há? Está solução se trata do &lt;strong&gt;Avoid Premature Optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Avoid Premature Optimization?
&lt;/h2&gt;

&lt;p&gt;Segundo &lt;a href="https://stackify.com/premature-optimization-evil/"&gt;Matt Watson&lt;/a&gt; "Premature optimization is spending a lot of time on something that you may not actually need.  “Premature optimization is the root of all evil” is a famous saying among software developers."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Matt Watson&lt;/strong&gt; descreve em seu artigo que Otimização prematura é gastar tempo em algo sem necessidade, que você não precisa realmente, ele também faz uma citação do livro do autor &lt;strong&gt;Donald Knuth&lt;/strong&gt;, o &lt;strong&gt;The Art of Computer Programming&lt;/strong&gt;, na citação completa diz:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_oNFCuWs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cxs2pu99j4yob4k7bblg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_oNFCuWs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cxs2pu99j4yob4k7bblg.png" alt="Avoid Premature Optimization, What is it?" width="500" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Abordando uma solução em conjunto com o conceito.
&lt;/h2&gt;

&lt;p&gt;Abordarei uma solução que aconteceu comigo. Solicitaram para documentar um software utilizando UML para fazer toda a documentação do software, até neste momento estava tudo bem, porem tive a ideia de escrever uma documentação em &lt;a href="https://www.linkedin.com/pulse/simplificando-modelagens-com-c4-modeling-ntopus-labs/?trackingId=d7OOClBrojQMYBQ0ypqsyw%3D%3D"&gt;C4 Model&lt;/a&gt;, um modelo de documentação simples e eficaz, chega ser tão simples que até uma pessoa leiga, que não é da área, entenderia completamente o que a documentação estava dizendo.&lt;/p&gt;

&lt;p&gt;Vocês podem pensar, nossa então o &lt;a href="https://www.linkedin.com/pulse/simplificando-modelagens-com-c4-modeling-ntopus-labs/?trackingId=d7OOClBrojQMYBQ0ypqsyw%3D%3D"&gt;C4 Model&lt;/a&gt; é muito bom, de fato, ele é, porem estaria otimizando algo muito cedo, gastando tempo sem ter a necessidade naquele momento. Logo, é uma otimização prematura, não estou dizendo que não poderia fazer, poderia fazer sim, mas não naquele momento.&lt;/p&gt;

&lt;h2&gt;
  
  
  TODO
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Já aconteceu isso com você?&lt;/li&gt;
&lt;li&gt;O que faria na minha situação?&lt;/li&gt;
&lt;li&gt;Já fez alguma otimização prematura antes?&lt;/li&gt;
&lt;li&gt;Aplicam este principio no seu trabalho? Porquê?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Respondam as perguntas nos comentários.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #15&lt;/b&gt;. Hoje eu escolhi falar sobre o &lt;strong&gt;Avoid Premature Optimization&lt;/strong&gt; na próxima semana irei trazer sobre &lt;strong&gt;Testes automatizados no Github&lt;/strong&gt; galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackify.com/premature-optimization-evil/"&gt;Why Premature Optimization Is the Root of All Evil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>developer</category>
      <category>study</category>
      <category>article</category>
      <category>software</category>
    </item>
    <item>
      <title>SoC - Separation of Concerns</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 03 Jan 2022 11:59:21 +0000</pubDate>
      <link>https://dev.to/suspir0n/soc-separation-of-concerns-5ak7</link>
      <guid>https://dev.to/suspir0n/soc-separation-of-concerns-5ak7</guid>
      <description>&lt;p&gt;Hello guys, today I start one more chapter of my Logbook. The subject is about SoC(Separation of concerns), we're bringing many principles, right? Let's see an example to understand this concept, right? OK, let's go guys.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the SoC?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fx9gx8ffd9eg3i0wevcj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fx9gx8ffd9eg3i0wevcj9.png" alt="Separation of concerns - SoC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As cited in &lt;a href="https://www.oreilly.com/library/view/software-architects-handbook/9781788624060/8ff905c2-217a-47f0-85c2-789296d42e8d.xhtml" rel="noopener noreferrer"&gt;O'Reilly&lt;/a&gt; "Separation of Concerns (SoC) is a design principle that manages complexity by partitioning the software system so that each partition is responsible for a separate concern, minimizing the overlap of concerns as much as possible."&lt;/p&gt;

&lt;p&gt;This principle aims at separation of concerns software, taking care of each concern, as &lt;a href="https://garabedyan.wordpress.com/2009/05/14/lecture-on-design-patterns-refactoring-sane-principles-to-make-you-a-better-developer-dino-esposito/" rel="noopener noreferrer"&gt;Garo Garabedyan&lt;/a&gt; said in "Separation of Concerns (since 1974). Concern == feature of system. Taking care of each of the concerns: for each one concern, other concerns are irrelevant. Hiding implementation of behavior."&lt;/p&gt;

&lt;h2&gt;
  
  
  I still don't understand, could you explain better?
&lt;/h2&gt;

&lt;p&gt;So, &lt;strong&gt;Separation of Concerns (SoC)&lt;/strong&gt; is the process of dividing a computer program into distinct resources that overlap in functionality as little as possible. Just like &lt;strong&gt;&lt;a href="https://garabedyan.wordpress.com/2009/05/14/lecture-on-design-patterns-refactoring-sane-principles-to-make-you-a-better-developer-dino-esposito/" rel="noopener noreferrer"&gt;Garo Garabedyan&lt;/a&gt;&lt;/strong&gt; said, he takes care of each one of the concerns, and each concern we can refer to the resources or behaviors of the system.&lt;/p&gt;

&lt;p&gt;You must be wondering what is the difference between SoC and &lt;strong&gt;Single Responsibility Principle (SRP)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single Responsibility Principle (SRP)&lt;/strong&gt; - The SRP aims to separate the responsibilities, in this case, to have a single responsibility. &lt;a href="https://dev.to/suspir0n/o-que-e-srp-de-onde-vem-este-nome-5b68"&gt;Read more&lt;/a&gt;. About the &lt;strong&gt;Separation of Concerns (SoC)&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Separation of Concerns (SoC)&lt;/strong&gt; - The SoC takes care of every concern of the system, being any part of interest or focus in a program.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is, the &lt;strong&gt;SRP&lt;/strong&gt; is concerned with separating the responsibilities that each functionality of the system has, making it unique, and the &lt;strong&gt;SoC&lt;/strong&gt; takes care of the concerns, so the &lt;strong&gt;SRP&lt;/strong&gt; is coupled with the &lt;strong&gt;SoC&lt;/strong&gt; as it is a concern of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoC in practice
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fz41ruls2tiyqxr6k38cr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fz41ruls2tiyqxr6k38cr.jpg" alt="separation of concerns"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example just above you can see one of the uses &lt;strong&gt;Separation of Concerns (SoC)&lt;/strong&gt;, we can see that it separates two concerns of the program, the Report and the Dialog Program, The Report is nothing more than the reports that the program makes available and the Dialog program is the dialog that the system will be doing, this communication with the other computers. It's demonstrates that when we talk about separation of concerns, we only deal with program concerns, it can be with database, external systems, anything that involves a program concern.&lt;/p&gt;

&lt;p&gt;This was the &lt;b&gt;Logbook #14&lt;/b&gt;. Today I chose to speak about &lt;strong&gt;SoC(Separation of Concerns)&lt;/strong&gt; next week I will bring about &lt;strong&gt;Avoid Premature Optimization&lt;/strong&gt; guys. Let's say goodbye for here. We will come back in another logbook.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.dribbble.com%2Fusers%2F1889486%2Fscreenshots%2F5081642%2Fthankyou_.gif"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;This article was helpful to you?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Leave a comment below.&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.oreilly.com/library/view/software-architects-handbook/9781788624060/8ff905c2-217a-47f0-85c2-789296d42e8d.xhtml" rel="noopener noreferrer"&gt;Separation of Concerns (SoC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://garabedyan.wordpress.com/2009/05/14/lecture-on-design-patterns-refactoring-sane-principles-to-make-you-a-better-developer-dino-esposito/" rel="noopener noreferrer"&gt;Lecture on Design Patterns, Refactoring, Sane Principles to make you a better developer by Dino Esposito&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>develop</category>
      <category>study</category>
      <category>software</category>
      <category>programming</category>
    </item>
    <item>
      <title>Complexidade de Algoritmo com Big'O.</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Thu, 23 Dec 2021 03:36:12 +0000</pubDate>
      <link>https://dev.to/suspir0n/complexidade-de-algoritmo-com-bigo-3lmi</link>
      <guid>https://dev.to/suspir0n/complexidade-de-algoritmo-com-bigo-3lmi</guid>
      <description>&lt;p&gt;Olá galera, hoje eu vim falar sobre complexidade de algoritmo, especificamente sobre a notação do O grande, conhecido como &lt;strong&gt;Big'O notation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sabemos que uma complexidade é uma medida da quantidade de recursos que o algoritmo precisa para executar no computador, nele temos a complexidade de tempo e a complexidade de espaço, caso não especificarmos de qual complexidade se trata, significa que estamos falando da complexidade de tempo.&lt;/p&gt;

&lt;p&gt;Para verificamos a eficiência de um código, precisamos analisar a complexidade do mesmo, estarei utilizando um exemplo simples de inversão de lista para poder explicar melhor. Lembrando que cada computador executa no seu tempo, por isso estaremos analisando a entrada e o comportamento da função.&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;inverter_lista&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tamanho&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;limite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tamanho&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limite&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;aux&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tamanho&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analisando o código acima, começaremos a verificar a complexidade de espaço, o mesmo retrata sobre as variáveis, no caso, o espaço na memória que elas estão sendo alocadas, logo ficaria assim:&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;# 4 + N = complexidade de espaço
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porque 4? Porque temos quatro variáveis, a &lt;strong&gt;tamanho&lt;/strong&gt;, &lt;strong&gt;limite&lt;/strong&gt;, &lt;strong&gt;aux&lt;/strong&gt; e &lt;strong&gt;i&lt;/strong&gt;. O &lt;strong&gt;N&lt;/strong&gt; seria a lista, pois não sabemos o tamanho dela, logo pode ser &lt;strong&gt;N&lt;/strong&gt; valores.&lt;/p&gt;

&lt;p&gt;Após termos verificado a complexidade de espaço, agora iremos verificar a de tempo, por cada linha na função que será executada, logo ficaria desta forma:&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;# 2 + 4*(N/2) = complexidade de tempo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nele podemos observar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 - são às duas primeiras linhas que são executadas antes do for&lt;/li&gt;
&lt;li&gt;4 - são as quatro linhas que serão executadas dentro do for&lt;/li&gt;
&lt;li&gt;(N/2) - é o valor limite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos ainda simplificar esta equação, se você analisar, só estamos utilizando a variável &lt;strong&gt;aux&lt;/strong&gt; e a &lt;strong&gt;lista&lt;/strong&gt; e se dividimos N/2 o resultado será N, logo a equação ficaria &lt;strong&gt;2 + 2*N&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Certo, a equação &lt;strong&gt;2 + 2*N&lt;/strong&gt;, o 2 faz diferença quando o tamanho da lista é pequena, por exemplo, se a lista tiver o tamanho de 4 elementos, substituindo o N na equação pelo 4, ficaria &lt;strong&gt;2 + 2*4&lt;/strong&gt; resultando em 2 + 8 -&amp;gt; 10, você percebe que a diferença que ela faz é de 20% na utilização de recursos, mais se com o tempo formos aumentando a quantidade de elementos na lista, por exemplo, 100, na equação ficaria &lt;strong&gt;2 + 2*100&lt;/strong&gt; -&amp;gt; 2 + 200 -&amp;gt; 202, logo você percebe que com este valor o 2 teria uma diferença de 1% na utilização de recursos e assim por diante. Chegamos a conclusão que o dominante na equação que é o &lt;strong&gt;2*N&lt;/strong&gt;, nele que iremos saber o quanto de utilização de recursos estará sendo usado em maior parte.&lt;/p&gt;

&lt;p&gt;Próximo passo para chegarmos na notação que queremos, temos que remover da equação tudo aquilo que não é dominante, o que já fizemos anteriormente.&lt;/p&gt;

&lt;p&gt;Logo este 2*N também chegará a não ser mas irrelevante não é mesmo? Até porque sabemos que, o que define nesta equação é o valor de N logo para definimos isso usaremos a notação do &lt;a href="https://jarednielsen.com/big-o/"&gt;Big'O&lt;/a&gt;, resultando em:&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;# 2*N - complexidade de tempo = O(n)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O O(N), ela expressa um conjunto de funções dominadas pelo termo de grau N.&lt;/p&gt;

&lt;p&gt;Mas fizemos aquela analise e aquela equação toda para ficarmos apenas com este termo, esse N? Sim, para analisar o algoritmo, tivemos que entender como funcionava, como era seu comportamento em si, qual o crescimento dele conforme a entrada, no caso a lista. Logo precisamos saber se ele é um conjunto de função que pertence ao O(n). Entretanto, podemos dizer que o gráfico desta função é linear, pois vai crescendo conforme o tamanho da entrada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zBKNJC4G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/grc06jdt1intd6o73cmr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBKNJC4G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/grc06jdt1intd6o73cmr.jpg" alt="Função linear" width="353" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #13&lt;/b&gt;. Hoje eu escolhi falar sobre o &lt;strong&gt;Big'O Notation&lt;/strong&gt; na próxima semana irei trazer sobre o &lt;strong&gt;SoC&lt;/strong&gt; galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=UQzCFkRbIrE"&gt;Notação do O Grande - Complexidade de Algoritmos II&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://jarednielsen.com/big-o/"&gt;The Superlative Guide to Big O&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>notation</category>
      <category>estude</category>
      <category>dev</category>
      <category>python</category>
    </item>
    <item>
      <title>DRY - Não se repita.</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 13 Dec 2021 19:05:37 +0000</pubDate>
      <link>https://dev.to/suspir0n/dry-nao-se-repita-jnj</link>
      <guid>https://dev.to/suspir0n/dry-nao-se-repita-jnj</guid>
      <description>&lt;h2&gt;
  
  
  O que é DRY?
&lt;/h2&gt;

&lt;p&gt;O DRY(Don't repeat yourself) é um princípio que fala basicamente sobre não se repetir, como assim? Quando ele fala de não se repetir, ele se refere a duplicidade de tarefas, funções, requisitos de negócios, no desenvolvimento de código e na documentação de software. &lt;/p&gt;

&lt;p&gt;Sabemos que às vezes acabamos repetindo algo no desenvolvimento sem a gente perceber, entretanto, é um dos motivos para fazermos também a revisão de código, por exemplo, não só para ver se o código ta funcional, utilizando boas práticas, como também se tem duplicidade nele, sem a duplicidade, acabamos evitando problemas com manutenção do código, diminuição na quantidade de bugs e melhoria no desempenho da aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5t6IRhUd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkxc3xf3n9iz1rvmhdx4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5t6IRhUd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lkxc3xf3n9iz1rvmhdx4.jpg" alt="DRY" width="600" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um dos exemplos bem simples que podemos utilizar é o desenvolvimento de uma API, nela temos tanto envio quanto recebimento de dados em json, logo, precisamos validar, tratar aquele json que recebemos e o que enviamos, pense nisso se fossemos fazer isso para cada requisição. Então, sabe como resolver? Quais formas tem?&lt;/p&gt;

&lt;p&gt;Uma das formas é criar uma função genérica para fazer a validação e o tratamento do json para que ele não se repita em toda requisição a mesma coisa, ou, instalando uma lib que já faça isso. &lt;/p&gt;

&lt;h2&gt;
  
  
  Experiências com o DRY
&lt;/h2&gt;

&lt;p&gt;Já utilizei o &lt;strong&gt;DRY(Don't repeat yourself)&lt;/strong&gt; diversas vezes, em desenvolvimento de APIs, Websites, sistemas, jogos e até na área de designer. Uma das formas que usei foi tanto criando funções genéricas quanto desenvolvendo uma lib para tal ação.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #12&lt;/b&gt;. Seguindo a sequência do que meu amigo &lt;a class="mentioned-user" href="https://dev.to/figur8"&gt;@figur8&lt;/a&gt; me apresentou semana passada, 3 novos princípios o &lt;strong&gt;YAGNI&lt;/strong&gt;, &lt;strong&gt;KISS&lt;/strong&gt; e &lt;strong&gt;DRY&lt;/strong&gt;, hoje eu escolhi falar sobre o &lt;strong&gt;DRY&lt;/strong&gt; na próxima semana irei trazer sobre o &lt;strong&gt;Big'O&lt;/strong&gt; galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkapi.solutions/blog/yagni-kiss-e-dry"&gt;YAGNI, KISS E DRY&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>developer</category>
      <category>estude</category>
      <category>software</category>
      <category>principle</category>
    </item>
    <item>
      <title>YAGNI - Você não vai precisar disso.</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Wed, 08 Dec 2021 01:03:23 +0000</pubDate>
      <link>https://dev.to/suspir0n/yagni-voce-nao-vai-precisar-disso-1kcj</link>
      <guid>https://dev.to/suspir0n/yagni-voce-nao-vai-precisar-disso-1kcj</guid>
      <description>&lt;h2&gt;
  
  
  O que é YAGNI?
&lt;/h2&gt;

&lt;p&gt;O YAGNI(You arin't gonna need it) é um princípio que retrata sobre não usar aquilo que não é necessário. Com isso, quando vamos desenvolver um software, antes de começar a fazer, começamos a planejar o que vamos utilizar nele, como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ferramentas&lt;/li&gt;
&lt;li&gt;Frameworks&lt;/li&gt;
&lt;li&gt;Linguagens de Programação&lt;/li&gt;
&lt;li&gt;SQL ou NoSQL&lt;/li&gt;
&lt;li&gt;Testes&lt;/li&gt;
&lt;li&gt;Princípios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pensamos em colocar em prática muitas coisas não é mesmo? Por isso comecei a escrever primeiro sobre &lt;a href="https://dev.to/suspir0n/kiss-mantenha-a-simplicidade-estupido-24lh"&gt;&lt;strong&gt;KISS&lt;/strong&gt;&lt;/a&gt;, reparou que eles se completam?&lt;/p&gt;

&lt;p&gt;Caso não se lembrem o que é o &lt;strong&gt;KISS&lt;/strong&gt;, resumindo, ele é um princípio que fala sobre manter a simplicidade na sua aplicação. Lembrando simples não é a mesma coisa que ser simplista, falaremos sobre isso em outro artigo.&lt;/p&gt;

&lt;p&gt;Como ambos se completam tanto o &lt;strong&gt;KISS&lt;/strong&gt; como o &lt;strong&gt;YAGNI&lt;/strong&gt;, para manter a simplicidade, apenas usaremos tecnologias necessárias, é neste momento que o YAGNI entra, mas como saber se algo é necessário ou não no momento? &lt;/p&gt;

&lt;p&gt;Vamos para um exemplo, digamos que tenham que desenvolver uma API. Do que eu preciso para criar uma solicitação do tipo GET?&lt;/p&gt;

&lt;p&gt;Primeiro precisará de uma framework para facilitá o desenvolvimento, neste exemplo vou usar o &lt;strong&gt;FastAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Arquivo main.py&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="nn"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Olá Mundo"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reparou? Bem simples não é mesmo?&lt;/p&gt;

&lt;p&gt;No momento não era necessário, eu criar varias pastas ou arquivos, separar a responsabilidade, neste momento isso não é necessário, pois o meu objetivo era fazer uma solicitação do tipo GET simples para validação. Veja que não é necessário de várias ferramentas, isto vai vendo com o decorrer do desenvolvimento, implementando apenas o necessário. &lt;/p&gt;

&lt;p&gt;Resumindo, quando falamos que YAGNI é um princípio que diz "não usar aquilo que não é necessário", nos referimos a sua tarefa, lembre-se, um passo de cada vez, se você precisa apenas da solicitação do tipo GET, para quer você vai criar uma solicitação do tipo POST se não é necessário? Deu para entender?&lt;/p&gt;

&lt;p&gt;Segundo ao &lt;a href="https://www.linkapi.solutions/blog/yagni-kiss-e-dry"&gt;LinkApi&lt;/a&gt; "O conceito do YAGNI é justamente esse, &lt;strong&gt;não usar aquilo que não é necessário!&lt;/strong&gt;" e como ele mesmo diz &lt;strong&gt;complexidade desnecessária é custo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Então o KISS usa o YAGNI, o YAGNI usa o KISS, formando um ciclo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MuFnw9-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlq89xib43g2px4wlvw0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MuFnw9-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlq89xib43g2px4wlvw0.jpg" alt="Os 7 princípios que os desenvolvedores precisam conhecer" width="880" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já falamos de alguns destes princípios, vou deixar o link para vocês.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/suspir0n/o-que-e-srp-de-onde-vem-este-nome-5b68"&gt;&lt;strong&gt;SRP&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/suspir0n/kiss-mantenha-a-simplicidade-estupido-24lh"&gt;&lt;strong&gt;KISS&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No &lt;strong&gt;SRP&lt;/strong&gt; falamos um pouco sobre o &lt;strong&gt;SOLID&lt;/strong&gt;, teremos um artigo explicando do que se trata o SOLID e sobre os outros princípios citados.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #11&lt;/b&gt;. Seguindo a sequência do que meu amigo &lt;a class="mentioned-user" href="https://dev.to/figur8"&gt;@figur8&lt;/a&gt; me apresentou semana passada, 3 novos princípios o &lt;strong&gt;YAGNI&lt;/strong&gt;, &lt;strong&gt;KISS&lt;/strong&gt; e &lt;strong&gt;DRY&lt;/strong&gt;, hoje eu escolhi falar sobre o &lt;strong&gt;YAGNI&lt;/strong&gt; na próxima semana irei trazer sobre o &lt;strong&gt;DRY&lt;/strong&gt; galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkapi.solutions/blog/yagni-kiss-e-dry"&gt;YAGNI, KISS E DRY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>principle</category>
      <category>estude</category>
      <category>dev</category>
    </item>
    <item>
      <title>KISS - Mantenha a simplicidade. Estupido!</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 29 Nov 2021 20:58:21 +0000</pubDate>
      <link>https://dev.to/suspir0n/kiss-mantenha-a-simplicidade-estupido-24lh</link>
      <guid>https://dev.to/suspir0n/kiss-mantenha-a-simplicidade-estupido-24lh</guid>
      <description>&lt;h2&gt;
  
  
  O que é o KISS?
&lt;/h2&gt;

&lt;p&gt;Como no próprio título retrata, &lt;strong&gt;KISS&lt;/strong&gt; significa "Keep It Simple Stupid", ele é um dos princípios mais importantes de desenvolvimento de software. Este princípio descreve que para uma criar um software, UX, etc. Ele não tende a ser algo complicado/complexo, e sim, tornar algo simples, funcional e econômico.&lt;/p&gt;

&lt;p&gt;Devem estar se perguntando como sei se meu software, meu UX, entre outros, são simples, funcional e econômico correto? &lt;/p&gt;

&lt;p&gt;Vejamos, qualquer desenvolvimento independente das camadas de processamento que eles tem, você percebe que ele concorda com o princípio &lt;strong&gt;KISS(Keep It Simple, Stupid)&lt;/strong&gt;, quando você consegue explicar o que aquilo faz até para uma pessoa que não seja da área, ela conseguirá entender, pois, você fez algo tão simples que é funcional, não tendo problemas com níveis de senioridade, um estagiário entenderia, um pleno e assim adiante. Logo você só tende a ganhar, você consegue resolver problemas rápidos, consegue explicar para diferentes níveis, tendo uma economia gradativa no seu desenvolvimento, com isso será fácil de manter o mesmo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fcjljwktjxmr917pt1fav.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fcjljwktjxmr917pt1fav.jpg" alt="KISS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o KISS influenciou na minha vida?
&lt;/h2&gt;

&lt;p&gt;Já teve algumas vezes que implementei, que um amigo chegava para mim, e dizia, "XD, tem que ser simples, faça algo simples e coloque para funcionar", no entanto, não sabia que isso era um princípio e que muito menos se chamava &lt;strong&gt;KISS&lt;/strong&gt;, acabei sabendo através dele &lt;a class="mentioned-user" href="https://dev.to/figur8"&gt;@figur8&lt;/a&gt;. Agora compreendo melhor sobre e pretendo aplicar, mas daqui para frente este principio, enfim, este principio influenciou muito na minha forma de pensar e projetar algum desenvolvimento.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #10&lt;/b&gt;. Não tivemos um artigo semana passada, pois estava sem ideia sobre o que escrever quando meu amigo &lt;a class="mentioned-user" href="https://dev.to/figur8"&gt;@figur8&lt;/a&gt; me apresentou 3 novos princípios o &lt;strong&gt;YAGNI&lt;/strong&gt;, &lt;strong&gt;KISS&lt;/strong&gt; e &lt;strong&gt;DRY&lt;/strong&gt;, hoje eu escolhi falar sobre o KISS nas próximas semanas irei trazer sobre os outros dois galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.dribbble.com%2Fusers%2F1889486%2Fscreenshots%2F5081642%2Fthankyou_.gif"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/figur8/kiss-keep-it-simple-stupid-56ef"&gt;KISS - Keep It Simple, Stupid&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkapi.solutions/blog/yagni-kiss-e-dry" rel="noopener noreferrer"&gt;YAGNI, KISS E DRY&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>software</category>
      <category>ux</category>
    </item>
    <item>
      <title>Introduzindo o “blockchain” com python</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 15 Nov 2021 17:30:24 +0000</pubDate>
      <link>https://dev.to/suspir0n/introduzindo-o-blockchain-com-python-41dc</link>
      <guid>https://dev.to/suspir0n/introduzindo-o-blockchain-com-python-41dc</guid>
      <description>&lt;p&gt;Olá galera, estamos voltando com mais um diário de bordo, hoje o assunto é sobre “blockchain”, o  que é, como funciona e por fim um exemplo prático de como criar um “blockchain”(cadeia de blocos) simples em python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fbjhctku2m4ld7bpu9d1y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbjhctku2m4ld7bpu9d1y.jpg" alt="Ilustrando o funcionamento do blockchain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando falamos de blockchain, você lembra logo de criptomoedas e tem alguns que acaba pensando ser apenas sobre Bitcoin, segundo o &lt;a href="https://medium.com/@felipemfp/entendendo-como-funciona-uma-blockchain-com-python-4e5a66f09e16" rel="noopener noreferrer"&gt;Felipe Pontes&lt;/a&gt; "Blockchain é o conceito base de toda criptomoeda, mas não é limitado a esse escopo e pode ser aplicado de diversas maneiras."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fidphnr2mtff89ujp8sq0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fidphnr2mtff89ujp8sq0.jpg" alt="Ilustrando o funcionamento do blockchain de uma forma, mas descritiva"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona?
&lt;/h2&gt;

&lt;p&gt;A blockchain significa cadeia de blocos, logo ela é feita de vários blocos formando uma cadeia, um bloco normalmente ele é composto por: uma data, um índice, algum dado(pode ser uma mensagem, um array de dados, etc.) e o hash do bloco anterior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnr5afpznch3cdcj74mqf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnr5afpznch3cdcj74mqf.png" alt="modelo do blockchain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entretanto, para que o blockchain fique seguro, temos que criptografa-los, no exemplo que iremos trabalhar, vamos utilizar o sha256 da biblioteca padrão hashlib, com ele criará uma string com 64 caracteres. Por fim, podemos dizer que o blockchain será uma lista de hashes.&lt;/p&gt;

&lt;p&gt;Para isso, como o nosso bloco é feito de hashs, eles precisam ser validos. Neste exemplo, para vemos se o mesmo é valido, vamos dizer que ele tem que começar com quatro "0", no caso, "0000xyz". Está validação é chamada de difficulty(dificuldade), quanto maior a dificuldade, mais tempo terá para encontrar o hash valido. Caso o hash não seja valido de primeira, temos que achar uma forma de mudar, consegui um hash diferente, não é mesmo?&lt;/p&gt;

&lt;p&gt;Sabemos que o hash, ele sempre utiliza o mesmo dado, resultando no mesmo hash, para isso mudar, usamos o nonce, o mesmo nada mais é que um valor arbitrário, um número simples que será incrementado no decorrer do processo sempre que um hash não for valido.&lt;/p&gt;

&lt;p&gt;Como você reparou, todo bloco tem o hash do bloco anterior, mas o primeiro bloco como fica? Chamamos o primeiro bloco de gêneses, pois ele é o primeiro bloco da cadeia, onde não existe o hash anterior, para isso basta criar um valor arbitrário  que irá representar o hash do bloco anterior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blockchain, na prática
&lt;/h2&gt;

&lt;p&gt;Sabe o que vamos precisar? Então, esses são os topicos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Construir a blockchain&lt;/li&gt;
&lt;li&gt;Criptografar os blocos&lt;/li&gt;
&lt;li&gt;Checar a validade de um hash&lt;/li&gt;
&lt;li&gt;Recuperar hash anterior&lt;/li&gt;
&lt;li&gt;Adicionar um novo bloco&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste exemplo, iremos ter dois arquivos: blockchain.py e main.py.&lt;/p&gt;

&lt;p&gt;Vamos primeiro criando o arquivo blockchain.py nele iniciaremos implementando a class e importando as libs que iremos utilizar:&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;hashlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Blockchain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você cria o construtor e nele vamos inicializar uma lista, que será a nossa cadeia de blocos e o nosso bloco gêneses:&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;__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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&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="nf"&gt;set_genesis_block&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, agora iremos implementar a função "self.set_genesis_block()" onde você vai iniciar o seu bloco gênesis, nele vamos precisar: dos dados, o timestamp para ter a data e hora do momento, o hash anterior que iremos implementar um valor arbitrário, o índice(posição do bloco na cadeia) e por fim a criptografia dele.&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;set_genesis_block&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;prev_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para implementar a função "self.hash_block", vamos precisar criar uma estrutura de repetição e implementar o hash do bloco, verificando se ele já é valido antes de adicionar na cadeia de blocos.&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;hash_block&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;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
        &lt;span class="n"&gt;nonce&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;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_hash_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prev_hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
            &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&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;[nonce]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&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;blocks&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="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função "self.is_hash_valid" ela é bem simples a implementação dela:&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;is_hash_valid&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="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0000&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;Contudo, visto que já criamos o bloco gênesis e a função que valida se o bloco é valido, só precisamos agora, criar mais três funções a "get_last_hash" que pega o hash do bloco anterior, o "add_new_block" que serve para adicionar um novo bloco na cadeia e por fim, o "get_all_blocks" para obter a cadeia completa.&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;get_last_hash&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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_new_block&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;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&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;blocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prev_hash&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="nf"&gt;get_last_hash&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;timestamp&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="nf"&gt;hash_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&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_all_blocks&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para finalizamos este exemplo, precisamos criar o arquivo main.py que será o arquivo principal de execução, nele vamos importar o arquivo que acabamos de criar, e adicionar três blocos como teste e por fim mostrar a cadeia de blocos&lt;/p&gt;

&lt;p&gt;main.py&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;blockchain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Blockchain&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="n"&gt;blockchain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Blockchain&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;blockchain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_new_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Block First!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;blockchain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_new_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Blockchain is very nice!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;blockchain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_new_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Speak some languages ?&lt;/span&gt;&lt;span class="sh"&gt;'&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;blockchain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_all_blocks&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, finalizamos o artigo de hoje, com este exemplo incrível, onde aprendemos o que é blockchain, como ele funciona e como criar um exemplo simples e prático. Estou deixando o link do repositório do github sobre este exemplo na referência.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #09&lt;/b&gt; vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.dribbble.com%2Fusers%2F1889486%2Fscreenshots%2F5081642%2Fthankyou_.gif"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Suspir0n/Blockchain" rel="noopener noreferrer"&gt;GitHub: Repositório do exemplo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@felipemfp/entendendo-como-funciona-uma-blockchain-com-python-4e5a66f09e16" rel="noopener noreferrer"&gt;Entendendo como funciona uma Blockchain com Python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>blockchain</category>
      <category>programming</category>
      <category>example</category>
    </item>
    <item>
      <title>Venha expressar regulamente conosco?</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Mon, 08 Nov 2021 12:48:28 +0000</pubDate>
      <link>https://dev.to/suspir0n/venha-expressar-regulamente-conosco-2d2k</link>
      <guid>https://dev.to/suspir0n/venha-expressar-regulamente-conosco-2d2k</guid>
      <description>&lt;p&gt;Olá galera, voltando com mais um diário de bordo, hoje iremos transcrever, explicar e demostrar como funciona um regex, e como em todos os artigos que eu faço, deixarei um exemplo prático em python de como se utilizar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Frd6v3kjdkb8h9ce92k6l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Frd6v3kjdkb8h9ce92k6l.jpg" alt="What is regex?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é uma expressão regular?
&lt;/h2&gt;

&lt;p&gt;De acordo com &lt;a href="https://medium.com/xp-inc/regex-um-guia-pratico-para-express%C3%B5es-regulares-1ac5fa4dd39f" rel="noopener noreferrer"&gt;Alexandre Servian&lt;/a&gt; diz "Uma expressão regular é um método formal de se especificar um padrão de texto.", no artigo dele, ele retrata que com ela pode lidar com algumas situações como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procura&lt;/li&gt;
&lt;li&gt;Substituição&lt;/li&gt;
&lt;li&gt;Validação de formatos&lt;/li&gt;
&lt;li&gt;Filtragem de informações&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Regex, na prática
&lt;/h2&gt;

&lt;p&gt;Vamos criar nosso primeiro exemplo, com isso usaremos algo fácil e padrão, para você poder implementar em qualquer linguagem, o que muda é a forma que você chama a lib ou se é com um construtor ou não entre outros.&lt;/p&gt;

&lt;p&gt;O Regex que vamos criar é para validação de CPF ou CNPJ, irei demostrar o regex pronto e logo em seguida explicarei parte por parte dele.&lt;/p&gt;

&lt;p&gt;Esta solução valida estes formatos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPF - 00000000000
CNPJ - 00000000000000
CPF - 000.000.000-00
CNPJ - 00.000.000/0000-00
CPF - 000000000-00
CNPJ - 00000000/0000-00,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo. Os pontos e traços são opcionais em cada uma das posições.&lt;/p&gt;

&lt;p&gt;O que não é aceito, por exemplo: 000-000-000-00 (mas pode ser alterado conforme nota abaixo)&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explicação:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;[0-9]{2} Faixa de caracteres: 0 a 9, quantidade: 2 caracteres;&lt;/li&gt;
&lt;li&gt;[0-9]{3} Faixa de caracteres: 0 a 9, quantidade: 3 caracteres;&lt;/li&gt;
&lt;li&gt;[0-9]{4} Faixa de caracteres: 0 a 9, quantidade: 4 caracteres;&lt;/li&gt;
&lt;li&gt;[.]?Um ponto, opcional. Foi usado \ no ponto, pois ele sozinho é caractere especial;&lt;/li&gt;
&lt;li&gt;[-]? Um traço, opcional (se acrescentar outros caracteres, comece pelo – sempre);&lt;/li&gt;
&lt;li&gt;[\/]? Uma barra, opcional. Tambem “escapada” com \ pra agradar o PCRE;&lt;/li&gt;
&lt;li&gt;(grupo1)|(grupo2) Se um dos grupos validar, a expressão é válida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso queira aceitar outros separadores, basta acrescentar entre os [ ].&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;/p&gt;

&lt;p&gt;[-.\/]? Vai aceitar tanto - quanto . e / naquela posição (? = ou nada).&lt;/p&gt;

&lt;p&gt;Se quiser saber mais sobre o regex e quais outros caracteres especiais ele aceita, temos a &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Regular_Expressions" rel="noopener noreferrer"&gt;Documentação em JavaScript&lt;/a&gt; e a &lt;a href="https://docs.python.org/3/library/re.html" rel="noopener noreferrer"&gt;Documentação em Python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #08&lt;/b&gt; vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.dribbble.com%2Fusers%2F1889486%2Fscreenshots%2F5081642%2Fthankyou_.gif"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/xp-inc/regex-um-guia-pratico-para-express%C3%B5es-regulares-1ac5fa4dd39f" rel="noopener noreferrer"&gt;Regex: Um guia prático para expressões regulares&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Regular_Expressions" rel="noopener noreferrer"&gt;Expressões Regulares - JavaScript&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.python.org/3/library/re.html" rel="noopener noreferrer"&gt;re - Regular Expression Operations&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>regex</category>
      <category>programming</category>
      <category>codequality</category>
      <category>conceito</category>
    </item>
    <item>
      <title>Do localhost a Internet</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Wed, 03 Nov 2021 13:55:49 +0000</pubDate>
      <link>https://dev.to/suspir0n/do-localhost-a-internet-5en2</link>
      <guid>https://dev.to/suspir0n/do-localhost-a-internet-5en2</guid>
      <description>&lt;p&gt;Neste artigo iremos falar um pouco sobre o famoso ngrok, o túnel de conexão. Para poucos que conhece, de bônus iremos demostrar duas implementações, uma usado o nosso querido Docker e outro implementando direto na sua maquina.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xEH1CUey--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k12oaj0h5fbbv4hsq87t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xEH1CUey--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k12oaj0h5fbbv4hsq87t.png" alt="Ngrok" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Ngrok?
&lt;/h2&gt;

&lt;p&gt;Como eu transcrevi acima, o ngrok é um túnel de conexão, de acordo com a &lt;a href="https://digitalinnovation.one/artigos/baixando-e-instalando-o-apache-ngrok-no-linux"&gt;Digital Innovation One&lt;/a&gt; "O Ngrok é um programa de linha de comando que permite criar um túnel de conexão segura a partir do seu localhost e publicá-lo na internet, o mesmo é multiplataforma, podendo ser usado no Windows, Linux e Mac OS X."&lt;/p&gt;

&lt;p&gt;Entretanto, ele quis dizer que basicamente ele gera um URL publica acessível, utilizando como base o seu localhost, logo, com ele você não irá precisar subir sua aplicação em servidor/hospedagem para poder apresentar no seu trabalho, mostrar seus colegas, seu professor, etc. Ele irá facilitar sua vida, deixando de modo simples, lembrando que o ngrok é recomendado apenas para Desenvolvimento e não para colocar sua aplicação em produção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t2yLmyX1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a567tg0i2kiotm5116ws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t2yLmyX1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a567tg0i2kiotm5116ws.png" alt="Ngrok na pratica" width="707" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementação local
&lt;/h3&gt;

&lt;p&gt;Estaremos usando o windows neste exemplo, agora vamos baixar o ngrok, siga os passos abaixo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Para nós conseguirmos baixar o Ngrok é necessário acessar o site &lt;a href="https://ngrok.com/download"&gt;https://ngrok.com/download&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após baixar o Ngrok basta ir à pasta Downloads e executa o aplicativo do Ngrok&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Por fim vamos iniciar o serviço do Ngrok digitando este comando abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ngrok http 8000&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementação usando o Docker
&lt;/h3&gt;

&lt;p&gt;Neste exemplo, vamos criar apenas o serviço do ngrok, pois, na nossa compreensão você já tem o serviço da sua aplicação criado, no nosso exemplo, a nomenclatura do serviço da aplicação se chamará "app".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MvgEHXld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxqsfo0pbvx6breeesg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MvgEHXld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxqsfo0pbvx6breeesg0.png" alt="Ngrok usando docker" width="840" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nele passamos o nosso, app, a porta que ele vai servir e algumas variáveis de ambiente. Como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DOMAIN = O nome do container da sua aplicação&lt;/li&gt;
&lt;li&gt;PORT = A porta que o container da sua aplicação está sendo executado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existem outras variáveis, irei citar algumas para você:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;PROTOCOL = Protocolo de tunelamento Ngrok, recebe os valores (http, tls e tcp)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REGION = Região onde o cliente ngrok se conectará para hospedar seus túneis, recebe os valores (us, eu, ap, au, sa, jp e em)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HOST_HEADER = Opcional, reescreva as solicitações de HTTP de entrada com um cabeçalho de Host modificado. por exemplo &lt;br&gt;
&lt;b&gt;HOST_HEADER=localdev.test&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BIND_TLS = Opcional, encaminhe apenas o tráfego HTTP ou HTTPS, mas não ambos. Por padrão, quando o ngrok executa um túnel HTTP, ele abre pontos de extremidade para o tráfego HTTP e HTTPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEBUG = Opcional, grave logs em stdout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PARAMS = Passe todos os parâmetros ngrok por uma string. Quando especificado, qualquer outra variável env é ignorada.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #07&lt;/b&gt; vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0CymIAaq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="800" height="600"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://digitalinnovation.one/artigos/baixando-e-instalando-o-apache-ngrok-no-linux"&gt;BAIXANDO E INSTALANDO O APACHE + NGROK NO LINUX&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/shkoliar/docker-ngrok"&gt;GitHub: Shkoliar/docker-ngrok&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ngrok.com/docs"&gt;Ngrok: Documentação&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>localhost</category>
      <category>internet</category>
      <category>tunel</category>
    </item>
    <item>
      <title>Webhook vs APIs</title>
      <dc:creator>Suspir0n</dc:creator>
      <pubDate>Wed, 03 Nov 2021 13:45:33 +0000</pubDate>
      <link>https://dev.to/suspir0n/webhook-vs-apis-50h0</link>
      <guid>https://dev.to/suspir0n/webhook-vs-apis-50h0</guid>
      <description>&lt;h1&gt;
  
  
  Quer saber o que é um webhook e como funciona?
&lt;/h1&gt;

&lt;p&gt;Imagine a facilidade e a praticidade que você terá usando o webhook, neste artigo iremos descrever o que webhook, como funciona e de bônus deixaremos um exemplo simples e prático usando python mas também pode ser utilizado em outras linguagens, deixarei referencias em outras linguagens para poder ajudar no seu estudo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Webhook?
&lt;/h2&gt;

&lt;p&gt;De acordo com o blog do &lt;a href="https://blog.vindi.com.br/o-que-sao-webhooks/" rel="noopener noreferrer"&gt;Vindi&lt;/a&gt; "Webhook é uma forma de recebimento de informações, passadas quando um evento acontece. Dessa forma, o webhook, na prática, é a forma de receber informações entre dois sistemas de uma forma passiva. Além disso, o webhook (também conhecido como retorno de chamada web ou HTTP e, ainda, impulso API) é uma maneira prática para um app ou sistema fornecer outras aplicações com informações em tempo real. Da mesma forma, ele fornece dados para outros aplicativos, e são muito eficientes tanto para o prestador de serviço, como para o consumidor."&lt;/p&gt;

&lt;p&gt;Simplificando, webhooks são eventos que acionam uma ação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fn5c64liu91rcqqha8zgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fn5c64liu91rcqqha8zgk.png" alt="webhook em ação"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona Webhook?
&lt;/h2&gt;

&lt;p&gt;Então, supondo que você esteja criando um bot para o telegram, e você acaba criando uma API para isso, nesta API você tem uma rota que executa uma determinada ação do bot, com isso você precisa fazer o set Webhook na API do telegram para que quando for requisitado aquele Webhook, ele ira acionar a ação daquele determinado evento. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fusghu9bqpam8tp76s8ex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fusghu9bqpam8tp76s8ex.png" alt="webhook vs API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Observando está imagem acima, você percebe que Webhook e APIs são duas comunicações totalmente diferente, enquanto a API ele pega os dados de um servidor, o Webhook puxa os seus dados. APIs estão em constante votação para obter as assinaturas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fmp0x19fu4fx8og64677b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmp0x19fu4fx8og64677b.png" alt="Diferença de votação"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Webhook, na prática
&lt;/h2&gt;

&lt;p&gt;Neste exemplo prático iremos utilizar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flask.palletsprojects.com/en/2.0.x/" rel="noopener noreferrer"&gt;Framework Flask&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos começar criando um servidor para receber o webhook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fsk5t6qhol6xdfs29xubn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fsk5t6qhol6xdfs29xubn.png" alt="Servidor em Flask"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste código, você observa que criamos apenas uma rota chamada '/webhook' do método do tipo 'POST', logo a nossa rota irá permitir requisição com este método. Com isso basta você executar dois comandos, o primeiro para escrever seu server como uma variável de ambiente e o outro para executar o server.&lt;/p&gt;

&lt;p&gt;No windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;set FLASK_APP='nomedoseuarquivo'.py&lt;/li&gt;
&lt;li&gt;flask run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Linux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;export FLASK_APP='nomedoseuarquivo'.py&lt;/li&gt;
&lt;li&gt;flask run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após você ter criado um server, vamos agora criar um arquivo onde você irar enviar o seu webhook, o código ficaria desta forma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fkc0umm97by6y0bs97ef7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fkc0umm97by6y0bs97ef7.png" alt="Send Webhooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste código, fizemos um exemplo de requisição, fazendo o envio do nosso webhook, finalizando nosso exemplo nesta etapa.&lt;/p&gt;

&lt;p&gt;Repare que neste exemplo, usamos localhost, caso você deseje aplicar esses conhecimentos utilizando a API do telegram, por exemplo, você pode usar o &lt;a href="https://ngrok.com/docs" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt;, pois o telegram não aceita localhost, então você pode utilizar o ngrok para isso, sendo que ele serve apenas para testar sua aplicação, não para ir em produção. Decorrerei sobre o ngrok em outro artigo, deixarei o link logo abaixo.&lt;/p&gt;

&lt;p&gt;Este foi o &lt;b&gt;diário de bordo #06&lt;/b&gt; vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.&lt;/p&gt;

&lt;p&gt;
  
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.dribbble.com%2Fusers%2F1889486%2Fscreenshots%2F5081642%2Fthankyou_.gif"&gt;
  
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Este artigo foi útil para você?&lt;/b&gt; &lt;br&gt;
&lt;b&gt;Deixe um comentário abaixo.&lt;/b&gt;&lt;/p&gt;

</description>
      <category>webhook</category>
      <category>python</category>
      <category>ngrok</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
