<?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: Weiglas</title>
    <description>The latest articles on DEV Community by Weiglas (@mrsaxobeat).</description>
    <link>https://dev.to/mrsaxobeat</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%2F755709%2F12dd9538-1f80-42e9-b8bb-0f404f7e00cb.jpeg</url>
      <title>DEV Community: Weiglas</title>
      <link>https://dev.to/mrsaxobeat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mrsaxobeat"/>
    <language>en</language>
    <item>
      <title>Me livrando das multas da biblioteca usando python</title>
      <dc:creator>Weiglas</dc:creator>
      <pubDate>Tue, 12 Sep 2023 13:09:21 +0000</pubDate>
      <link>https://dev.to/mrsaxobeat/me-livrando-das-multas-da-biblioteca-usando-python-1ocb</link>
      <guid>https://dev.to/mrsaxobeat/me-livrando-das-multas-da-biblioteca-usando-python-1ocb</guid>
      <description>&lt;p&gt;Eu confesso. Tem coisas que esqueço muito facilmente e é por isso que, se eu não configurar alguns lembretes no calendário, as datas passam voando por mim.&lt;/p&gt;

&lt;p&gt;Acontece que certos esquecimentos doem no bolso, então minhas contas ficam no débito automático e assim minha vida funciona.&lt;/p&gt;

&lt;p&gt;Porém, ainda tinha uma conta que toda semana me causava alguns reais a menos e eu ainda não tinha parado pra resolver isso: a conta da biblioteca.&lt;/p&gt;

&lt;p&gt;Embora fosse tão fácil simplesmente entrar no aplicativo, ir na lista de livros emprestados, verificar o que já tinha passado do prazo e clicar no botão "renovar", eu só lembrava de fazer isso lá pelas duas horas da madrugada quando acordava de um sonho em que a bibliotecária confiscava a minha casa e prendia a minha família pois eu esqueci de devolver o livro de Cálculo na semana passada.&lt;/p&gt;

&lt;p&gt;Então, ao invés de gastar alguns minutos configurando lembretes semanais para os livros que peguei, eu resolvi gastar algumas horas fazendo um script que renova todos os livros pra mim :)&lt;/p&gt;

&lt;h2&gt;
  
  
  O algorítmo
&lt;/h2&gt;

&lt;p&gt;Em resumo, são necessários 4 passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fazer o login na api do portal acadêmico&lt;/li&gt;
&lt;li&gt;Armazenar o &lt;code&gt;access_token&lt;/code&gt; para ser usado nas próximas requisições&lt;/li&gt;
&lt;li&gt;Fazer a requisição que lista os livros que peguei emprestados&lt;/li&gt;
&lt;li&gt;Verificar a data de devolução de cada livro, e&lt;/li&gt;
&lt;li&gt;Caso seja a data de devolução, fazer a requisição que renova o livro&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A api
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O login
&lt;/h3&gt;

&lt;p&gt;Para descobrir as urls da api do portal acadêmico, usei o DevTools do meu navegador. Então fiz o login e descobri que a requisição para fazer login é um POST para &lt;code&gt;/apiapp/login2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /apiapp/login2 HTTP/1.1
Host: portal.multivix.edu.br
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No body da requisição são enviados meu login e senha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-pass-123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A lista de livros
&lt;/h4&gt;

&lt;p&gt;Seguindo na descoberta das urls, fui até a página dos livros emprestados da biblioteca e vi que é um POST para &lt;code&gt;/apiapp/api/biblioteca/listaemprestimorenovavel&lt;/code&gt;. O que recebo de resposta é um dicionário contendo os livros em três categorias: renováveis, não renováveis e renovados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"renovaveis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"codigo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3751947&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ttl_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Física I: mecânica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"autor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUNG, Hugh D."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mda_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Livros"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtemprestimo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-03T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtdevolucaoestimada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-11T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"renovado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"codigo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3749846&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ttl_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cálculo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"autor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STEWART, James"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mda_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Livros"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtemprestimo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-08-30T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtdevolucaoestimada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-06T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"renovado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"naorenovaveis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"codigo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ttl_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Variáveis complexas e aplicações 3ed., 2013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"autor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ÁVILA, Geraldo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mda_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Livros"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtemprestimo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-05T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtdevolucaoestimada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-12T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"renovado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"renovados"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"codigo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ttl_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Variáveis complexas e aplicações 3ed., 2013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"autor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ÁVILA, Geraldo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mda_nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Livros"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtemprestimo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-05T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dtdevolucaoestimada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-09-12T00:00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"renovado"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A renovação do livro
&lt;/h4&gt;

&lt;p&gt;Tendo um livro disponível para renovação, cliquei em renovar e então vi que a requisição para isso é um POST para &lt;code&gt;/apiapp/api/biblioteca/renovaobra&lt;/code&gt; com o código do livro no body.&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;

&lt;p&gt;Bom, como falei lá em cima, de forma resumida o script deve logar, listar os livros, verificar a data de devolução de cada livro e renovar, caso esteja na data de devolução. O processo principal será 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;# main.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;borrowed_books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list_borrowed_books&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;borrowed_books&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renew_if_is_due_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O primeiro método usado é o que lista os livros renováveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# api/library_apy
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_borrowed_books&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'/api/biblioteca/listaemprestimorenovavel'&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;borrowed_books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&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;'renovaveis'&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;borrowed_books&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então, com os livros em mãos - ou melhor, em códigos -, percorro a lista de livros verificando se é necessário renoválo:&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;# main.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;renew_if_is_due_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;due_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_due_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;due_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;book_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'codigo'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renew_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book_code&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_due_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;unformatted_due_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&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;'dtdevolucaoestimada'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;due_date&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="n"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unformatted_due_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'%Y-%m-%dT%H:%M:%S'&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;due_date&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o método &lt;code&gt;renew_book()&lt;/code&gt; da api faz apenas um POST contendo o código do livro a ser renovado:&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;# api/library_apy
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;renew_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;book_code&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'/api/biblioteca/renovaobra'&lt;/span&gt;

    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;'codigo'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;book_code&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&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;response&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui mostrei os passos principais do script de uma forma superficial. Ao final do post disponibilizo o link do github, caso você queira olhar com mais detalhes toda a estrutura do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  A hospedagem
&lt;/h2&gt;

&lt;p&gt;Para a hospedagem do meu código, resolvi usar o Lambda AWS com um gatilho para todar todo dia às 00:10h, uma vez que as datas de renovação são sempre às 00:00h.&lt;br&gt;
Olhando nos logs, consigo verificar que está tudo rodando corretamente e eu não vou mais receber multas da biblioteca, hehe:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6SUtGByd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://mr-saxobeat.github.io/assets/log-cloug-watch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6SUtGByd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://mr-saxobeat.github.io/assets/log-cloug-watch.png" alt="Logs do script rodando e renovando o livro de Cálculo" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Bom, caso você queira olhar com mais detalhes o funcionamento do script, pode checar o repositório: &lt;a href="https://github.com/Mr-Saxobeat/renew-my-borrowed-books"&gt;https://github.com/Mr-Saxobeat/renew-my-borrowed-books&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiquei muito satisfeito com a solução simples que cheguei e mais ainda por funcionar tão bem! Faz mais ou menos uma semana que este código tem rodado diariamente e eu já nem sei as datas de renovação dos livros hehe.&lt;/p&gt;

&lt;p&gt;Caso você queira tirar alguma dúvida sobre o código pode entrar em cotato comigo por: &lt;a href="mailto:weiglasribeiro@gmail.com"&gt;weiglasribeiro@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publicado primeiro em: &lt;a href="https://mr-saxobeat.github.io/2023/09/12/me-livrando-das-multas-da-biblioteca-usando-python.html"&gt;https://mr-saxobeat.github.io/2023/09/12/me-livrando-das-multas-da-biblioteca-usando-python.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>aws</category>
      <category>awslambda</category>
      <category>programming</category>
    </item>
    <item>
      <title>Automatizando o código da tarefa na mensagem de commit</title>
      <dc:creator>Weiglas</dc:creator>
      <pubDate>Mon, 14 Nov 2022 20:57:58 +0000</pubDate>
      <link>https://dev.to/mrsaxobeat/automatizando-o-codigo-da-tarefa-na-mensagem-de-commit-68n</link>
      <guid>https://dev.to/mrsaxobeat/automatizando-o-codigo-da-tarefa-na-mensagem-de-commit-68n</guid>
      <description>&lt;p&gt;Padrões de commits variam de empresa para empresa, mas todos têm o mesmo objetivo: organizar o histórico de modificações do repositório para que numa auditoria futura seja possível entender de onde veio uma modificação e a qual tarefa ela estava relacionada.&lt;/p&gt;

&lt;p&gt;Em um padrão de empresa, por exemplo, pode ser necessário inserir o código da tarefa executada tanto no nome da branch, quanto nas mensagens de commit. Pois bem, imagina você ter que digitar uma mensagem e o código da tarefa toda vez... Ok, é possível copiar e colar este código, mas ainda sim eu pensei se não seria possível melhorar ainda mais. Então conheci uma funcionalidade do git que era justamente o que eu precisava para resolver o problema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git hooks
&lt;/h2&gt;

&lt;p&gt;Git hooks são scripts executados quando certos eventos ocorrem. Existem vários:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pre-commit&lt;/code&gt;: é acionado antes mesmo de você digitar uma mensagem;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prepare-commit-msg&lt;/code&gt;: é acionado antes do editor de mensagem ser iniciado, mas depois da mensagem padrão ser criada;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;commit-msg&lt;/code&gt;: recebe um parâmetro, que é o caminho para um arquivo temporário que contém a mensagem de commit já escrita.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode ver mais sobre git hooks na &lt;a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para nosso problema nós precisamos:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Extrair o código da tarefa a partir do nome da branch, no modelo: &lt;code&gt;feature/COD-123-Uma-tarefa-da-pesada&lt;/code&gt;. Onde vamos extrair &lt;code&gt;COD-123&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Digitar a mensagem de commit: &lt;code&gt;Adiciona botao furta cor&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;O git hook então fará o trabalho de juntar a mensagem com o código, tendo como resultado a seguinte mensagem:
&lt;code&gt;COD-123 - Adiciona botao furta cor&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para isso vamos usar o &lt;code&gt;prepare-commit-msg&lt;/code&gt; hook.&lt;/p&gt;

&lt;p&gt;Então vamos lá:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na sua pasta &lt;code&gt;~/.git/hooks&lt;/code&gt; crie um arquivo com nome &lt;code&gt;prepare-commit-msg&lt;/code&gt; sem extensão&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure o git para usar essa pasta para procurar os scripts a serem executados:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global core.hooksPath ~/.git/hooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abra o arquivo &lt;code&gt;~/.git/hooks/prepare-commit-msg&lt;/code&gt; e adicione o seguinte script bash:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
#
# Inspeciona o nome da branch e verifica se contém um código da tarefa, (i.e COD-123).
# Se sim, a mensagem de commit será concatenada com "COD-123 - " no início.
#
# Útil para organizar o histórico git em grupos de commits junto a uma história do usuário.
#

BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD 2&amp;gt;/dev/null)

# Remove o prefixo da branch (featute/, hotfix/, release/, etc)
BASE_BRANCH_NAME=$(echo $BRANCH_NAME | sed 's/[^\/]*\///')

# Certifica que BASE_BRANCH_NAME começa com um código de tarefa.
# SKIP_PREPARE_COMMIT_MSG pode ser usado para pular este hook, enquanto permite que outros continuem sendo acionados.
if [[ "$BASE_BRANCH_NAME" =~ (^[[:upper:]]{2,}-[[:digit:]]{1,}) ]] &amp;amp;&amp;amp; [ "$SKIP_PREPARE_COMMIT_MSG" != 1 ]; then

  # Divide o resto do nome da branch pelo hífen '-'
  NAME_PARTS=($(echo "$BASE_BRANCH_NAME" | tr '-' '\n'))

  # Pega apenas as duas primeiras partes, que são exatamente "COD" e "123" e enfim os concatenam como "COD-123"
  COMMIT_PREFIX=$(echo "${NAME_PARTS[0]}-${NAME_PARTS[1]}")

  IS_PREFIX_IN_COMMIT=$(grep -c "$COMMIT_PREFIX" $1)

  # Certifica que COMMIT_PREFIX existe em BRANCH_NAME e não está já inserido na mensagem de commit
  if [[ -n "$COMMIT_PREFIX" ]] &amp;amp;&amp;amp; ! [[ $IS_PREFIX_IN_COMMIT -ge 1 ]]; then
    sed -i.bak -e "1s~^~$COMMIT_PREFIX - ~" $1
  fi
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, ao fazer commit temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/COD-123-Uma-tarefa-da-pesada                                             
~\git\meu-projeto
❯ git commit -m "Adiciona botao furta cor"
[feature/COD-123-Uma-tarefa-da-pesada ffc707da] COD-123 - Adiciona botao furta cor
 1 file changed, 1 insertion(+), 1 deletion(-)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este artigo foi adaptado do gist: &lt;a href="https://gist.github.com/johncmunson/ca02a8027a923a7f4b2f662c67d6528c"&gt;https://gist.github.com/johncmunson/ca02a8027a923a7f4b2f662c67d6528c&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>devops</category>
      <category>braziliandevs</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Aprendendo em público: blockchain e criptomoedas</title>
      <dc:creator>Weiglas</dc:creator>
      <pubDate>Mon, 29 Nov 2021 01:12:13 +0000</pubDate>
      <link>https://dev.to/mrsaxobeat/aprendendo-em-publico-blockchain-e-criptomoedas-19ll</link>
      <guid>https://dev.to/mrsaxobeat/aprendendo-em-publico-blockchain-e-criptomoedas-19ll</guid>
      <description>&lt;p&gt;Tenho ouvido em todas minhas bolhas sociais sobre criptomoedas, bitcoin e NFT, mas não entendo nada do assunto. E penso que eu que trabalho com programação deveria ter um bom entendimento. Então já é hora de acabar com isso! Aqui neste primeiro post eu vou registrar minhas perguntas e respostas que for encontrando, tentando documentar a minha linha de raciocínio durante meu aprendizado.&lt;/p&gt;

&lt;p&gt;As perguntas iniciais que tenho em mente são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é e como funciona a blockchain?&lt;/li&gt;
&lt;li&gt;O que é criptomoeda e bitcoin?&lt;/li&gt;
&lt;li&gt;Por que criptomoeda tem valor?&lt;/li&gt;
&lt;li&gt;Por que o valor das criptomoedas variam tanto?&lt;/li&gt;
&lt;li&gt;Por que hoje as criptomoedas estão valendo muito?&lt;/li&gt;
&lt;li&gt;O que é NFT?&lt;/li&gt;
&lt;li&gt;Criptomoeda é realmente a moeda do futuro ou existe outra solução?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então vamos começar entendendo o que é blockchain.&lt;/p&gt;

&lt;p&gt;Bom, depois de ler alguns artigos[1][2] e assistir alguns vídeos[3], o que tenho a dizer com minhas palavras é que blockchain é uma base de dados que registra o histórico de transações e que armazena esses dados de forma descentralizada, ou seja, esses históricos não ficam armazenados em apenas um computador, mas sim em todos os computadores que utilizam esse banco de dados.&lt;/p&gt;

&lt;p&gt;Aqui vai minha primeira epifania: o blockchain é uma tecnologia inicialmente independente do bitcoin ou qualquer criptomoeda.&lt;/p&gt;

&lt;p&gt;Vou dar um exemplo prático: Joana tem um carro e ela vai vendê-lo para Maria. Para isso, após o negócio fechado entre as duas, Joana deve fazer todo o processo de transferência de titularidade do veículo no Departamento Estadual de Trânsito (DETRANs), que detem um banco de dados nacional onde tem o registro de que Joana é a atual proprietária do carro. Ao fazer a transferência, vai ficar registrado no histórico do veículo que “Joana vendeu o carro para Maria”.&lt;/p&gt;

&lt;p&gt;Perceba uma coisa: o banco de dados é de propriedade do DETRAN e só ele pode verificar que seus dados não foram corrompidos. E se Paulo, um hacker muito talentoso, quisesse passar o carro de Joana para seu próprio nome? Ele simplesmente invadiria o sistema do DETRAN e trocaria o registro para seu nome e pronto, ninguém contestaria os dados.&lt;/p&gt;

&lt;p&gt;O blockchain resolve esses dois principais problemas: a centralização e a corrupção dos dados.&lt;/p&gt;

&lt;p&gt;Vamos entender como o blockchain descentraliza o armazenamento dos dados.&lt;/p&gt;

&lt;p&gt;Funcionaria assim: cada pessoa teria uma cópia completa do banco de dados em seu computador e cada mudança que acontecesse seria refletida no computador de todo mundo através da internet. Então no exemplo acima, a Joana, ao invés de ir no DETRAN, simplesmente abriria o seu computador, entraria com sua conta e senha no sistema e alteraria a titularidade do seu carro para Maria e essa transação surtiria efeito no computador de todo mundo.&lt;/p&gt;

&lt;p&gt;Por que a descentralização é uma coisa boa?&lt;br&gt;
Geralmente, a descentralização sempre é bom pois assim o controle não fica na mão de apenas uma instituição ou pessoa. No caso de um banco de dados, também há o fato de que se este fosse armazenado num único servidor do DETRAN ele estaria sujeito a perda de todos os seus registros caso acontecesse algum acidente corrompendo seus dados. Mas tendo uma cópia completa em cada computador, a corrupção dos dados teria que ocorrer em todos os computadores.&lt;/p&gt;

&lt;p&gt;E sobre a corrupção dos dados?&lt;br&gt;
Blockchain significa corrente de blocos e, assim como em uma corrente, a quebra de um único nó compromete a corrente inteira. &lt;/p&gt;

&lt;p&gt;O que são esses blocos de dados?&lt;br&gt;
Cada bloco de dados da blockchain é composto por três fatores:&lt;br&gt;
Os seus dados: as transações, como por exemplo “Joana vendeu o carro para Maria”.&lt;br&gt;
A sua impressão digital, que em computação é chamada de hash.&lt;br&gt;
E a impressão digital (hash) do bloco anterior.&lt;/p&gt;

&lt;p&gt;Sendo assim, a corrente é formada pela ligação que cada bloco tem com o bloco anterior.&lt;br&gt;
Aí você me pergunta: tá, mas o que é esse tal de hash? Pois bem, o hash é uma cadeia de 64 letras e números que é formada a partir de um dado. No nosso caso, estamos usando o dado “Joana vendeu o carro para Maria”. O hash para o nosso dado é o seguinte (gerado aqui):&lt;/p&gt;

&lt;p&gt;1d4140f617daa6fca841970bc05654f99a8e4ff37cda82acfb6331c5d54ae383&lt;/p&gt;

&lt;p&gt;Bem doido, né? O que faz o hash ser tão especial é que existe um único para cada dado, seja ele qual for. Isso é calculado através de um algoritmo chamado SHA256, que eu ainda não sei como funciona, mas qualquer dia vou querer dar uma olhada mais a fundo.&lt;/p&gt;

&lt;p&gt;Então voltando à cadeia: se um bloco tem o seu hash e o do bloco anterior, caso haja alguma alteração no bloco anterior, todos os blocos posteriores vão acusar que tem coisa errada ali. Por isso a segurança contra corrupção.&lt;/p&gt;

&lt;p&gt;Se você for neste &lt;a href="https://andersbrownworth.com/blockchain/hash" rel="noopener noreferrer"&gt;link&lt;/a&gt;, pode ver qual o hash gerado para o dado que escrever.&lt;/p&gt;

&lt;p&gt;Vou experimentar mais um pouco: meu primeiro bloco de dados vai ter as seguintes informações:&lt;br&gt;
O seu dado: “Joana comprou um carro”;&lt;br&gt;
O hash do bloco anterior vai ser “00000” pois não existe bloco anterior.&lt;br&gt;
Seu próprio hash: 6dece74df8d16ac04568a4f6374daa7e0647a25662813d99bd7eb47c7689a1b7&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%2F410py7l0h3a0a7spfge0.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%2F410py7l0h3a0a7spfge0.png" alt="Print do bloco um"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora meu segundo bloco vai ter as seguintes informações:&lt;br&gt;
Joana vendeu seu carro para Maria&lt;br&gt;
Hash anterior: 6dece74df8d16ac04568a4f6374daa7e0647a25662813d99bd7eb47c7689a1b7&lt;br&gt;
Seu Hash: 0a3353754007af8414bfb31ad4aca356120151453686e517fdd2e82d09c3d278&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%2Fu53lljfqpze3f7uj8doe.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%2Fu53lljfqpze3f7uj8doe.png" alt="Print do bloco 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se o primeiro bloco tiver qualquer alteração, o seu hash vai mudar. E como o segundo bloco tem registrado o hash original do primeiro bloco, ele vai comparar com o hash alterado e vai acusar que tem informação alterada ali!&lt;br&gt;
Então dessa forma a cadeia de blocos garante que seus dados não foram corrompidos.&lt;/p&gt;

&lt;p&gt;Navegando por este site de demonstração de blockchain[4], você pode encontrar as páginas que demonstram melhor e também os vídeos de explicação, que eu achei ótimos vale dar uma olhada.&lt;/p&gt;

&lt;p&gt;Ao assistir os vídeos que falei ali em cima, me deparei com alguns outros conceitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A assinatura de bloco&lt;/li&gt;
&lt;li&gt;O número Nonce&lt;/li&gt;
&lt;li&gt;E a mineração de um bloco&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses três conceitos são interligados, então serão explicados juntos.&lt;/p&gt;

&lt;p&gt;Sabemos que uma rede blockchain não depende de um único servidor, sendo assim, qualquer um com acesso a rede pode gravar dados na blockchain. É claro que cada um deve ter sua conta e senha para fazer qualquer operação, mas mesmo assim, usuários maliciosos podem fazer uma coisa chamada ataque de negação de serviço (também conhecido como DoS Attack, um acrônimo em inglês para Denial of Service). Esse tipo de ataque consiste em enviar vários dados para a rede fazendo com que esta se sobrecarregue e então “trave” ou pare de responder. E para prevenir este ataque a blockchain requer que quem quer enviar dados à rede tenha um trabalho computacional. Aqui nos deparamos com o conceito de “Prova de trabalho”.&lt;/p&gt;

&lt;p&gt;Essa prova de trabalho consiste em encontrar um número que, ao ser adicionado ao corpo do bloco a ser criado, gere um hash específico.&lt;/p&gt;

&lt;p&gt;Este “número mágico” é chamado de nonce[5], acrônimo para number once, ou “número único”, pois ele realmente é o único número que pode satisfazer uma condição.&lt;/p&gt;

&lt;p&gt;E o ato de procurar esse número é chamado de mineração.&lt;/p&gt;

&lt;p&gt;Vamos voltar ao exemplo de Joana vendendo seu carro.&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%2Fjtu6m7zzibiiuxasjd2e.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%2Fjtu6m7zzibiiuxasjd2e.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima, que é do site já citado para demonstrações de blockchain, Temos um bloco que tem número 1, tem o nonce 72608, o dado “Joana vendeu seu carro para Maria” e o seu hash. O bloco está vermelho pois o seu hash não satisfaz a condição, que no caso é que “o hash deve começar com quatro dígitos zeros”. Essa condição varia com o tempo para dificultar ou facilitar a prova de trabalho.&lt;br&gt;
Então, para chegar ao hash que satisfaça a condição, o computador vai testando vários números que, junto com o dado e o número do bloco, vão gerar um hash que inicie com quatro zeros.&lt;/p&gt;

&lt;p&gt;Ao clicar no botão “mine”, vamos minerar e chegar ao resultado correto.&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%2Frrpdcxtybbst7y7ndvfc.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%2Frrpdcxtybbst7y7ndvfc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora nosso bloco está verde, indicando que foi validado, ou assinado, e o seu nonce é 62449, fazendo com que o seu hash inicie com 4 dígitos zeros.&lt;/p&gt;

&lt;p&gt;Se você for no site e testar, verá que ao clicar em “Mine” demora pelo menos um segundo para chegar ao resultado correto, ou seja, não é um número fácil de ser calculado e isso impede que alguém com más intenções tente publicar milhares de blocos de uma só vez na rede.&lt;/p&gt;

&lt;p&gt;E aqui me veio um esclarecimento bem grande: a mineração é necessária apenas por causa da camada de segurança. O que eu quero dizer é que, a “lógica base” da blockchain, que é registra dados em cadeia, não precisa encontrar um número que satisfaça uma condição. Isso era uma coisa que me deixava beem confuso esse conceito de minerar bitcoin. Olha só, na real o que é minerado é o nonce!&lt;/p&gt;

&lt;p&gt;Bom, acredito que aqui já cheguei num novo nível de entendimento sobre a blockchain e com novas perguntas que tentarei entender no próximo post:&lt;br&gt;
Se o que é minerado é o nonce, por que existe a confusão de “minerar bitcoin”?&lt;br&gt;
O que acontece se dois computadores descobrirem o noce ao mesmo tempo?&lt;/p&gt;

&lt;p&gt;Fico por aqui e até o próximo post!&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://pt.wikipedia.org/wiki/Blockchain" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/Blockchain&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://blog.nubank.com.br/o-que-e-blockchain/" rel="noopener noreferrer"&gt;https://blog.nubank.com.br/o-que-e-blockchain/&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://www.youtube.com/watch?v=dkElPTevoR4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=dkElPTevoR4&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://andersbrownworth.com/blockchain/" rel="noopener noreferrer"&gt;https://andersbrownworth.com/blockchain/&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://youtu.be/rZaGbEcs7ag" rel="noopener noreferrer"&gt;https://youtu.be/rZaGbEcs7ag&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>criptocurrency</category>
      <category>bitcoin</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
